summaryrefslogtreecommitdiff
path: root/sys/dev/apm/apmbios.h
blob: ea342effeb940d87be3580a436c505d5ad580547 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
/*	$NetBSD: apmbios.h,v 1.5 2008/04/28 20:23:47 martin Exp $	*/
/*-
 * Copyright (c) 1995 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by John Kohl.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
#ifndef _DEV_APM_APMBIOS_H_
#define _DEV_APM_APMBIOS_H_

/* Advanced Power Management (v1.0 and v1.1 specification)
 * functions/defines/etc.
 */
#define APM_BIOS_FNCODE	(0x53)
#define APM_SYSTEM_BIOS	(0x15)
#define APM_BIOS_FN(x)	((APM_BIOS_FNCODE<<8)|(x))

/*
 * APM info bits from BIOS
 */
#define APM_16BIT_SUPPORT	0x01
#define APM_32BIT_SUPPORT	0x02
#define APM_CPUIDLE_SLOW	0x04
#define APM_DISABLED		0x08
#define APM_DISENGAGED		0x10

#define APM_ERR_LIMIT		10

#define	APM_ERR_CODE(regs)	(((regs)->AX & 0xff00) >> 8)
#define	APM_ERR_PM_DISABLED	0x01
#define	APM_ERR_REALALREADY	0x02
#define	APM_ERR_NOTCONN		0x03
#define	APM_ERR_16ALREADY	0x05
#define	APM_ERR_16NOTSUPP	0x06
#define	APM_ERR_32ALREADY	0x07
#define	APM_ERR_32NOTSUPP	0x08
#define	APM_ERR_UNRECOG_DEV	0x09
#define	APM_ERR_ERANGE		0x0A
#define	APM_ERR_NOTENGAGED	0x0B
#define	APM_ERR_EOPNOTSUPP	0x0C
#define	APM_ERR_RTIMER_DISABLED	0x0D
#define APM_ERR_UNABLE		0x60
#define APM_ERR_NOEVENTS	0x80
#define	APM_ERR_NOT_PRESENT	0x86

#define APM_DEV_APM_BIOS	0x0000
#define APM_DEV_ALLDEVS		0x0001
/* device classes are high byte; device IDs go in low byte */
#define		APM_DEV_DISPLAY(x)	(0x0100|((x)&0xff))
#define		APM_DEV_DISK(x)		(0x0200|((x)&0xff))
#define		APM_DEV_PARALLEL(x)	(0x0300|((x)&0xff))
#define		APM_DEV_SERIAL(x)	(0x0400|((x)&0xff))
#define		APM_DEV_NETWORK(x)	(0x0500|((x)&0xff))
#define		APM_DEV_PCMCIA(x)	(0x0600|((x)&0xff))
#define		APM_DEV_BATTERY(x)	(0x8000|((x)&0xff))	/* V1.2 */
#define		APM_DEV_ALLUNITS	0xff

#define	APM_INSTALLATION_CHECK	0x00	/* int15 only */
#define		APM_INSTALL_SIGNATURE	0x504d	/* %bh = 'P', %bl = 'M' */
#define	APM_REALMODE_CONNECT	0x01	/* int15 only */
#define	APM_16BIT_CONNECT	0x02	/* int15 only */
#define	APM_32BIT_CONNECT	0x03	/* int15 only */
#define APM_DISCONNECT		0x04	/* %bx = APM_DEV_APM_BIOS */
#define APM_CPU_IDLE		0x05
#define APM_CPU_BUSY		0x06
#define APM_SET_PWR_STATE	0x07
#define		APM_SYS_READY	0x0000	/* %cx */
#define		APM_SYS_STANDBY	0x0001
#define		APM_SYS_SUSPEND	0x0002
#define		APM_SYS_OFF	0x0003
#define		APM_LASTREQ_INPROG	0x0004
#define		APM_LASTREQ_REJECTED	0x0005

/* system standby is device ID (%bx) 0x0001, APM_SYS_STANDBY */
/* system suspend is device ID (%bx) 0x0001, APM_SYS_SUSPEND */

#define APM_PWR_MGT_ENABLE	0x08
#define		APM_MGT_ALL	0xffff	/* %bx */
#define		APM_MGT_DISABLE	0x0	/* %cx */
#define		APM_MGT_ENABLE	0x1

#define APM_SYSTEM_DEFAULTS	0x09
#define		APM_DEFAULTS_ALL	0xffff	/* %bx */
#define		APM_DEFAULTS_ALL_V12	0x0001	/* %bx */

#define APM_POWER_STATUS	0x0a
#define		APM_AC_OFF		0x00
#define		APM_AC_ON		0x01
#define		APM_AC_BACKUP		0x02
#define		APM_AC_UNKNOWN		0xff
/* the first set of battery constants is 1.0 style values;
   the second set is 1.1 style bit definitions */
#define		APM_BATT_HIGH		0x00
#define		APM_BATT_LOW		0x01
#define		APM_BATT_CRITICAL	0x02
#define		APM_BATT_CHARGING	0x03
#define		APM_BATT_ABSENT		0x04 /* Software only--not in spec! */
#define		APM_BATT_UNKNOWN	0xff

#define		APM_BATT_FLAG_HIGH	0x01
#define		APM_BATT_FLAG_LOW	0x02
#define		APM_BATT_FLAG_CRITICAL	0x04
#define		APM_BATT_FLAG_CHARGING	0x08
#define		APM_BATT_FLAG_NOBATTERY	0x10
#define		APM_BATT_FLAG_NO_SYSTEM_BATTERY	0x80
#define		APM_BATT_FLAG_UNKNOWN	0xff

#define		APM_BATT_LIFE_UNKNOWN	0xff
#define		APM_BATT_STATE(regp) ((regp)->BX & 0xff)
#define		APM_BATT_FLAGS(regp) (((regp)->CX & 0xff00) >> 8)
#define		APM_AC_STATE(regp) (((regp)->BX & 0xff00) >> 8)
#define		APM_BATT_LIFE(regp) ((regp)->CX & 0xff) /* in % */
/* BATT_REMAINING returns minutes remaining */
#define		APM_BATT_REMAINING(regp) (((regp)->DX & 0x8000) ? \
					  ((regp)->DX & 0x7fff) : \
					  ((regp)->DX & 0x7fff)/60)
#define		APM_BATT_REM_VALID(regp) (((regp)->DX & 0xffff) != 0xffff)
#define		APM_BATTERY_COUNT(regp) ((regp)->SI)

#define	APM_GET_PM_EVENT	0x0b
#define		APM_STANDBY_REQ		0x0001 /* %bx on return */
#define		APM_SUSPEND_REQ		0x0002
#define		APM_NORMAL_RESUME	0x0003
#define		APM_CRIT_RESUME		0x0004 /* suspend/resume happened
						  without us */
     /* If set, the pccard sockets were powered off in the
	suspend/standby state (V1.2 only) */
#define		APM_PCCARD_POWEREDOFF(regp) ((regp)->CX & 0x0001)

#define		APM_BATTERY_LOW		0x0005
#define		APM_POWER_CHANGE	0x0006
#define		APM_UPDATE_TIME		0x0007
#define		APM_CRIT_SUSPEND_REQ	0x0008
#define		APM_USER_STANDBY_REQ	0x0009
#define		APM_USER_SUSPEND_REQ	0x000A
#define		APM_SYS_STANDBY_RESUME	0x000B
#define		APM_CAP_CHANGE		0x000C	/* V1.2 */

#define	APM_GET_POWER_STATE	0x0c
     /* device to query in %bx */
     /* returns power states in %cx */
#define	APM_DEVICE_MGMT_ENABLE	0x0d
     /* device to enable/disable in %bx */

#define	APM_DRIVER_VERSION	0x0e
/* %bx should be DEV value (APM_DEV_APM_BIOS)
   %ch = driver major vno
   %cl = driver minor vno
   return: %ah = conn major; %al = conn minor
   */
#define		APM_CONN_MINOR(regp) ((regp)->AX & 0xff)
#define		APM_CONN_MAJOR(regp) (((regp)->AX & 0xff00) >> 8)

#define APM_PWR_MGT_ENGAGE	0x0F
     /* device in %bx */
#define		APM_MGT_DISENGAGE	0x0	/* %cx */
#define		APM_MGT_ENGAGE		0x1

#define APM_GET_CAPABILITIES	0x10
     /* device in %bx (APM_DEV_APM_BIOS) */
     /* %bl: number of batteries */
#define		APM_NBATTERIES(regp) ((regp)->BX & 0xff)
     /* %cx capabilities */
#define		APM_GLOBAL_STANDBY	0x0001
#define		APM_GLOBAL_SUSPEND	0x0002
#define		APM_RTIMER_STANDBY	0x0004 /* resume timer wakes standby */
#define		APM_RTIMER_SUSPEND	0x0008 /* resume timer wakes suspend */
#define		APM_IRRING_SUSPEND	0x0010 /* internal ring wakes suspend */
#define		APM_IRRING_STANDBY	0x0020 /* internal ring wakes standby */
#define		APM_PCRING_SUSPEND	0x0040 /* pccard ring wakes suspend */
#define		APM_PCRING_STANDBY	0x0080 /* pccard ring wakes standby */

#define	APM_RESUME_TIMER_CTL	0x11	/* get/set/disable resume timer */
     /* device in %bx (APM_DEV_APM_BIOS) */
     /* function code in %cl */
#define		APM_RTIMER_DISABLE	0x00
#define		APM_RTIMER_GET		0x01
#define		APM_RTIMER_SET		0x02
     /* if %cl = set, or %cl = get, then: */
     /* %ch: seconds */
     /* %dh: hours */
     /* %dl: minutes */
     /* %sih: month (bcd), %sil: day (bcd) */
     /* %di: year (bcd, 4 digits) */
#define APM_RESUME_RING_CTL		0x12
     /* device in %bx (APM_DEV_APM_BIOS) */
     /* %cx: function code */
#define		APM_RRING_DISABLE	0x0000
#define		APM_RRING_ENABLE	0x0001
#define		APM_RRING_GET		0x0002
     /* returns state in %cx */
#define		APM_RRING_DISABLED	0x0000
#define		APM_RRING_ENABLED	0x0001

#define APM_TIMER_REQS_CTL	0x13
     /* device in %bx (APM_DEV_APM_BIOS) */
     /* %cx: function code */
#define		APM_TIMER_REQS_DISABLE	0x0000
#define		APM_TIMER_REQS_ENABLE	0x0001
#define		APM_TIMER_REQS_GET	0x0002
     /* returns state in %cx */
#define		APM_TIMER_REQS_DISABLED	0x0000
#define		APM_TIMER_REQS_ENABLED	0x0001

#define APM_OEM			0x80

/*
 * APM info word from the real-mode handler is adjusted to put
 * major/minor version in low half and support bits in upper half.
 */
#define	APM_MAJOR_VERS(info) (((info)&0xff00)>>8)
#define	APM_MINOR_VERS(info) ((info)&0xff)

#define APM_16BIT_SUPPORTED	(APM_16BIT_SUPPORT << 16)
#define APM_32BIT_SUPPORTED	(APM_32BIT_SUPPORT << 16)
#define APM_IDLE_SLOWS		(APM_CPUIDLE_SLOW << 16)
#define APM_BIOS_PM_DISABLED	(APM_DISABLED << 16)
#define APM_BIOS_PM_DISENGAGED	(APM_DISENGAGED << 16)

#define	APMDEBUG_INFO		0x01
#define	APMDEBUG_APMCALLS	0x02
#define	APMDEBUG_EVENTS		0x04
#define	APMDEBUG_PROBE		0x10
#define	APMDEBUG_ATTACH		0x40
#define	APMDEBUG_DEVICE		0x20
#define	APMDEBUG_ANOM		0x40

#endif /* _DEV_APM_APMBIOS_H_ */