aboutsummaryrefslogtreecommitdiff
path: root/sys/i386/include/apm_bios.h
blob: 5f0bafa8f038e636dc1348d53df5005ac99a2a9c (plain) (blame)
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
251
252
253
254
255
256
257
258
259
260
261
262
263
264
/*-
 * APM (Advanced Power Management) BIOS Device Driver
 *
 * Copyright (c) 1994-1995 by HOSOKAWA, Tatsumi <hosokawa@mt.cs.keio.ac.jp>
 *
 * This software may be used, modified, copied, and distributed, in
 * both source and binary form provided that the above copyright and
 * these terms are retained. Under no circumstances is the author
 * responsible for the proper functioning of this software, nor does
 * the author assume any responsibility for damages incurred with its
 * use.
 *
 * Aug, 1994	Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD)
 *
 * $FreeBSD$
 */

#ifndef	_MACHINE_APM_BIOS_H_
#define	_MACHINE_APM_BIOS_H_

#ifndef _KERNEL
#include <sys/types.h>
#endif
#include <sys/ioccom.h>

/* BIOS id */
#define APM_BIOS		0x53
#define APM_INT			0x15

/* APM flags */
#define APM_16BIT_SUPPORT	0x01
#define APM_32BIT_SUPPORT	0x02
#define APM_CPUIDLE_SLOW	0x04
#define APM_DISABLED		0x08
#define APM_DISENGAGED		0x10

/* APM initializer physical address */
#define APM_OURADDR		0x00080000

/* APM functions */
#define APM_INSTCHECK		0x00
#define APM_REALCONNECT		0x01
#define APM_PROT16CONNECT	0x02
#define APM_PROT32CONNECT	0x03
#define APM_DISCONNECT		0x04
#define APM_CPUIDLE		0x05
#define APM_CPUBUSY		0x06
#define APM_SETPWSTATE		0x07
#define APM_ENABLEDISABLEPM	0x08
#define APM_RESTOREDEFAULT	0x09
#define	APM_GETPWSTATUS		0x0a
#define APM_GETPMEVENT		0x0b
#define APM_GETPWSTATE		0x0c
#define APM_ENABLEDISABLEDPM	0x0d
#define APM_DRVVERSION		0x0e
#define APM_ENGAGEDISENGAGEPM	0x0f
#define APM_GETCAPABILITIES	0x10
#define APM_RESUMETIMER		0x11
#define APM_RESUMEONRING	0x12
#define APM_TIMERREQUESTS	0x13
#define APM_OEMFUNC		0x80

/* error code */
#define APME_OK			0x00
#define APME_PMDISABLED		0x01
#define APME_REALESTABLISHED	0x02
#define APME_NOTCONNECTED	0x03
#define APME_PROT16ESTABLISHED	0x05
#define APME_PROT16NOTSUPPORTED	0x06
#define APME_PROT32ESTABLISHED	0x07
#define APME_PROT32NOTDUPPORTED	0x08
#define APME_UNKNOWNDEVICEID	0x09
#define APME_OUTOFRANGE		0x0a
#define APME_NOTENGAGED		0x0b
#define APME_CANTENTERSTATE	0x60
#define APME_NOPMEVENT		0x80
#define APME_NOAPMPRESENT	0x86


/* device code */
#define PMDV_APMBIOS		0x0000
#define PMDV_ALLDEV		0x0001
#define PMDV_DISP0		0x0100
#define PMDV_DISP1		0x0101
#define PMDV_DISPALL		0x01ff
#define PMDV_2NDSTORAGE0	0x0200
#define PMDV_2NDSTORAGE1	0x0201
#define PMDV_2NDSTORAGE2	0x0202
#define PMDV_2NDSTORAGE3	0x0203
#define PMDV_PARALLEL0		0x0300
#define PMDV_PARALLEL1		0x0301
#define PMDV_SERIAL0		0x0400
#define PMDV_SERIAL1		0x0401
#define PMDV_SERIAL2		0x0402
#define PMDV_SERIAL3		0x0403
#define PMDV_SERIAL4		0x0404
#define PMDV_SERIAL5		0x0405
#define PMDV_SERIAL6		0x0406
#define PMDV_SERIAL7		0x0407
#define PMDV_NET0		0x0500
#define PMDV_NET1		0x0501
#define PMDV_NET2		0x0502
#define PMDV_NET3		0x0503
#define PMDV_PCMCIA0		0x0600
#define PMDV_PCMCIA1		0x0601
#define PMDV_PCMCIA2		0x0602
#define PMDV_PCMCIA3		0x0603
/* 0x0700 - 0x7fff	Reserved			*/
#define PMDV_BATT_BASE		0x8000
#define PMDV_BATT0		0x8001
#define PMDV_BATT1		0x8002
#define PMDV_BATT_ALL		0x80ff
/* 0x8100 - 0xdfff	Reserved			*/
/* 0xe000 - 0xefff	OEM-defined power device IDs	*/
/* 0xf000 - 0xffff	Reserved			*/

/* Power state */
#define PMST_APMENABLED		0x0000
#define PMST_STANDBY		0x0001
#define PMST_SUSPEND		0x0002
#define PMST_OFF		0x0003
#define PMST_LASTREQNOTIFY	0x0004
#define PMST_LASTREQREJECT	0x0005
/* 0x0006 - 0x001f	Reserved system states		*/
/* 0x0020 - 0x003f	OEM-defined system states	*/
/* 0x0040 - 0x007f	OEM-defined device states	*/
/* 0x0080 - 0xffff	Reserved device states		*/

#if !defined(ASSEMBLER) && !defined(INITIALIZER)

/* C definitions */
struct apmhook {
	struct apmhook	*ah_next;
	int		(*ah_fun)(void *ah_arg);
	void		*ah_arg;
	const char	*ah_name;
	int		ah_order;
};
#define APM_HOOK_NONE		(-1)
#define APM_HOOK_SUSPEND        0
#define APM_HOOK_RESUME         1
#define NAPM_HOOK               2

#ifdef _KERNEL

void apm_suspend(int state);
struct apmhook *apm_hook_establish (int apmh, struct apmhook *);
void apm_hook_disestablish (int apmh, struct apmhook *);
void apm_cpu_idle(void);
void apm_cpu_busy(void);

#endif

#endif /* !ASSEMBLER && !INITIALIZER */

#define APM_MIN_ORDER		0x00
#define APM_MID_ORDER		0x80
#define APM_MAX_ORDER		0xff

/* power management event code */
#define PMEV_NOEVENT		0x0000
#define PMEV_STANDBYREQ		0x0001
#define PMEV_SUSPENDREQ		0x0002
#define PMEV_NORMRESUME		0x0003
#define PMEV_CRITRESUME		0x0004
#define PMEV_BATTERYLOW		0x0005
#define PMEV_POWERSTATECHANGE	0x0006
#define PMEV_UPDATETIME		0x0007
#define PMEV_CRITSUSPEND	0x0008
#define PMEV_USERSTANDBYREQ	0x0009
#define PMEV_USERSUSPENDREQ	0x000a
#define PMEV_STANDBYRESUME	0x000b
#define PMEV_CAPABILITIESCHANGE 0x000c
/* 0x000d - 0x00ff	Reserved system events	*/
/* 0x0100 - 0x01ff	Reserved device events	*/
/* 0x0200 - 0x02ff	OEM-defined APM events	*/
/* 0x0300 - 0xffff	Reserved		*/
#define PMEV_DEFAULT		0xffffffff	/* used for customization */

#if !defined(ASSEMBLER) && !defined(INITIALIZER)

/*
 * Old apm_info structure, returned by the APMIO_GETINFO_OLD ioctl.  This
 * is for backward compatibility with old executables.
 */
typedef struct apm_info_old {
	u_int	ai_major;	/* APM major version */
	u_int	ai_minor;	/* APM minor version */
	u_int	ai_acline;	/* AC line status */
	u_int	ai_batt_stat;	/* Battery status */
	u_int	ai_batt_life;	/* Remaining battery life */
	u_int	ai_status;	/* Status of APM support (enabled/disabled) */
} *apm_info_old_t;

/*
 * Structure returned by the APMIO_GETINFO ioctl.
 *
 * In the comments below, the parenthesized numbers indicate the minimum
 * value of ai_infoversion for which each field is valid.
 */
typedef struct apm_info {
	u_int	ai_infoversion;	/* Indicates which fields are valid */
	u_int	ai_major;	/* APM major version (0) */
	u_int	ai_minor;	/* APM minor version (0) */
	u_int	ai_acline;	/* AC line status (0) */
	u_int	ai_batt_stat;	/* Battery status (0) */
	u_int	ai_batt_life;	/* Remaining battery life in percent (0) */
	int	ai_batt_time;	/* Remaining battery time in seconds (0) */
	u_int	ai_status;	/* True if enabled (0) */
	u_int	ai_batteries;	/* Number of batteries (1) */
	u_int	ai_capabilities;/* APM Capabilities (1) */
	u_int	ai_spare[6];	/* For future expansion */
} *apm_info_t;

/* Battery flag */
#define APM_BATT_HIGH		0x01
#define APM_BATT_LOW		0x02
#define APM_BATT_CRITICAL	0x04
#define APM_BATT_CHARGING	0x08
#define APM_BATT_NOT_PRESENT	0x10
#define APM_BATT_NO_SYSTEM	0x80

typedef struct apm_pwstatus {
	u_int	ap_device;	/* Device code of battery */
	u_int	ap_acline;	/* AC line status (0) */
	u_int	ap_batt_stat;	/* Battery status (0) */
	u_int	ap_batt_flag;	/* Battery flag (0) */
	u_int	ap_batt_life;	/* Remaining battery life in percent (0) */
	int	ap_batt_time;	/* Remaining battery time in seconds (0) */
} *apm_pwstatus_t;

struct apm_bios_arg {
        u_long eax;
        u_long ebx;
        u_long ecx;
        u_long edx;
        u_long esi;
        u_long edi;
};

struct apm_event_info {
	u_int type;
	u_int index;
	u_int spare[8];
};

#define APMIO_SUSPEND		_IO('P', 1)
#define APMIO_GETINFO_OLD	_IOR('P', 2, struct apm_info_old)
#define APMIO_ENABLE		_IO('P', 5)
#define APMIO_DISABLE		_IO('P', 6)
#define APMIO_HALTCPU		_IO('P', 7)
#define APMIO_NOTHALTCPU	_IO('P', 8)
#define APMIO_DISPLAY		_IOW('P', 9, int)
#define APMIO_BIOS		_IOWR('P', 10, struct apm_bios_arg)
#define APMIO_GETINFO		_IOR('P', 11, struct apm_info)
#define APMIO_STANDBY		_IO('P', 12)
#define APMIO_GETPWSTATUS	_IOWR('P', 13, struct apm_pwstatus)
/* for /dev/apmctl */
#define APMIO_NEXTEVENT		_IOR('A', 100, struct apm_event_info)
#define APMIO_REJECTLASTREQ	_IO('P', 101)

#endif /* !ASSEMBLER && !INITIALIZER */

#endif /* !_MACHINE_APM_BIOS_H_ */