xref: /openbsd-src/sys/dev/acpi/acpidev.h (revision a28daedfc357b214be5c701aa8ba8adb29a7f1c2)
1 /* $OpenBSD: acpidev.h,v 1.27 2009/03/10 20:36:10 jordan Exp $ */
2 /*
3  * Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
4  * Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef __DEV_ACPI_ACPIDEV_H__
20 #define __DEV_ACPI_ACPIDEV_H__
21 
22 #include <sys/sensors.h>
23 #include <sys/rwlock.h>
24 #include <dev/acpi/acpireg.h>
25 
26 #define DEVNAME(s)  ((s)->sc_dev.dv_xname)
27 
28 #define ACPIDEV_NOPOLL		0
29 #define ACPIDEV_POLL		1
30 
31 /*
32  * _BIF (Battery InFormation)
33  * Arguments: none
34  * Results  : package _BIF (Battery InFormation)
35  * Package {
36  * 	// ASCIIZ is ASCII character string terminated with a 0x00.
37  * 	Power Unit			//DWORD
38  * 	Design Capacity			//DWORD
39  * 	Last Full Charge Capacity	//DWORD
40  * 	Battery Technology		//DWORD
41  * 	Design Voltage			//DWORD
42  * 	Design Capacity of Warning	//DWORD
43  * 	Design Capacity of Low		//DWORD
44  * 	Battery Capacity Granularity 1	//DWORD
45  * 	Battery Capacity Granularity 2	//DWORD
46  * 	Model Number			//ASCIIZ
47  * 	Serial Number			//ASCIIZ
48  * 	Battery Type			//ASCIIZ
49  * 	OEM Information			//ASCIIZ
50  * }
51  */
52 struct acpibat_bif {
53 	u_int32_t	bif_power_unit;
54 #define BIF_POWER_MW		0x00
55 #define BIF_POWER_MA		0x01
56 	u_int32_t	bif_capacity;
57 #define BIF_UNKNOWN		0xffffffff
58 	u_int32_t	bif_last_capacity;
59 	u_int32_t	bif_technology;
60 #define BIF_TECH_PRIMARY	0x00
61 #define BIF_TECH_SECONDARY	0x01
62 	u_int32_t	bif_voltage;
63 	u_int32_t	bif_warning;
64 	u_int32_t	bif_low;
65 	u_int32_t	bif_cap_granu1;
66 	u_int32_t	bif_cap_granu2;
67 	char		bif_model[20];
68 	char		bif_serial[20];
69 	char		bif_type[20];
70 	char		bif_oem[20];
71 };
72 
73 /*
74  * _OSC Definition for Control Method Battery
75  * Arguments: none
76  * Results  : DWORD flags
77  */
78 #define CMB_OSC_UUID		"f18fc78b-0f15-4978-b793-53f833a1d35b"
79 #define   CMB_OSC_GRANULARITY	0x01
80 #define   CMB_OSC_WAKE_ON_LOW	0x02
81 
82 /*
83  * _BST (Battery STatus)
84  * Arguments: none
85  * Results  : package _BST (Battery STatus)
86  * Package {
87  * 	Battery State			//DWORD
88  * 	Battery Present Rate		//DWORD
89  * 	Battery Remaining Capacity	//DWORD
90  * 	Battery Present Voltage		//DWORD
91  * }
92  *
93  * Per the spec section 10.2.2.3
94  * Remaining Battery Percentage[%] = (Battery Remaining Capacity [=0 ~ 100] /
95  *     Last Full Charged Capacity[=100]) * 100
96  *
97  * Remaining Battery Life [h] = Battery Remaining Capacity [mAh/mWh] /
98  *     Battery Present Rate [=0xFFFFFFFF] = unknown
99  */
100 struct acpibat_bst {
101 	u_int32_t	bst_state;
102 #define BST_DISCHARGE		0x01
103 #define BST_CHARGE		0x02
104 #define BST_CRITICAL		0x04
105 	u_int32_t	bst_rate;
106 #define BST_UNKNOWN		0xffffffff
107 	u_int32_t	bst_capacity;
108 	u_int32_t	bst_voltage;
109 };
110 
111 /*
112  * _BTP (Battery Trip Point)
113  * Arguments: DWORD level
114  * Results  : none
115  */
116 #define BTP_CLEAR_TRIP_POINT	0x00
117 
118 /*
119  * _BTM (Battery TiMe)
120  * Arguments: DWORD rate of discharge
121  * Results  : DWORD time in seconds or error/unknown
122  */
123 #define BTM_CURRENT_RATE	0x00
124 
125 #define BTM_RATE_TOO_LARGE	0x00
126 #define BTM_CRITICAL		0x00
127 #define BTM_UNKNOWN		0xffffffff
128 
129 /*
130  * _BMD (Battery Maintenance Data)
131  * Arguments: none
132  * Results  : package _BMD (Battery Maintenance Data)
133  * Package {
134  * 	Status Flags		//DWORD
135  * 	Capability Flags	//DWORD
136  * 	Recalibrate Count	//DWORD
137  * 	Quick Recalibrate Time	//DWORD
138  * 	Slow Recalibrate Time	//DWORD
139  * }
140  */
141 struct acpibat_bmd {
142 	u_int32_t	bmd_status;
143 #define BMD_AML_CALIBRATE_CYCLE	0x01
144 #define BMD_CHARGING_DISABLED	0x02
145 #define BMD_DISCHARGE_WHILE_AC	0x04
146 #define BMD_RECALIBRATE_BAT	0x08
147 #define BMD_GOTO_STANDBY_SPEED	0x10
148 	u_int32_t	bmd_capability;
149 #define BMD_CB_AML_CALIBRATION	0x01
150 #define BMD_CB_DISABLE_CHARGER	0x02
151 #define BMD_CB_DISCH_WHILE_AC	0x04
152 #define BMD_CB_AFFECT_ALL_BATT	0x08
153 #define BMD_CB_FULL_CHRG_FIRST	0x10
154 	u_int32_t	bmd_recalibrate_count;
155 #define BMD_ONLY_CALIB_IF_ST3	0x00	/* only recal when status bit 3 set */
156 	u_int32_t	bmd_quick_recalibrate_time;
157 #define BMD_UNKNOWN		0xffffffff
158 	u_int32_t	bmd_slow_recalibrate_time;
159 };
160 
161 /*
162  * _BMC (Battery Maintenance Control)
163  * Arguments: DWORD flags
164  * Results  : none
165  */
166 #define BMC_AML_CALIBRATE	0x01
167 #define BMC_DISABLE_CHARGING	0x02
168 #define BMC_ALLOW_AC_DISCHARGE	0x04
169 
170 /* AC device */
171 /*
172  * _PSR (Power Source)
173  * Arguments: none
174  * Results  : DWORD status
175  */
176 #define PSR_OFFLINE		0x00
177 #define PSR_ONLINE		0x01
178 
179 /*
180  * _PCL (Power Consumer List)
181  * Arguments: none
182  * Results  : LIST of Power Class pointers
183  */
184 
185 /* hpet device */
186 #define	HPET_REG_SIZE		1024
187 
188 #define	HPET_CAPABILITIES	0x000
189 #define	HPET_CONFIGURATION	0x010
190 #define	HPET_INTERRUPT_STATUS	0x020
191 #define	HPET_MAIN_COUNTER	0x0F0
192 #define	HPET_TIMER0_CONFIG	0x100
193 #define	HPET_TIMER0_COMPARE	0x108
194 #define	HPET_TIMER0_INTERRUPT	0x110
195 #define	HPET_TIMER1_CONFIG	0x200
196 #define	HPET_TIMER1_COMPARE	0x208
197 #define	HPET_TIMER1_INTERRUPT	0x310
198 #define	HPET_TIMER2_CONFIG	0x400
199 #define	HPET_TIMER2_COMPARE	0x408
200 #define	HPET_TIMER2_INTERRUPT	0x510
201 
202 #define STA_PRESENT   (1L << 0)
203 #define STA_ENABLED   (1L << 1)
204 #define STA_SHOW_UI   (1L << 2)
205 #define STA_DEV_OK    (1L << 3)
206 #define STA_BATTERY   (1L << 4)
207 
208 /*
209  * _PSS (Performance Supported States)
210  * Arguments: none
211  * Results  : package _PSS (Performance Supported States)
212  * Package {
213  *	CoreFreq		//DWORD
214  *	Power			//DWORD
215  *	TransitionLatency	//DWORD
216  *	BusMasterLatency	//DWORD
217  *	Control			//DWORD
218  * 	Status			//DWORD
219  * }
220  */
221 struct acpicpu_pss {
222 	u_int32_t	pss_core_freq;
223 	u_int32_t	pss_power;
224 	u_int32_t	pss_trans_latency;
225 	u_int32_t	pss_bus_latency;
226 	u_int32_t	pss_ctrl;
227 	u_int32_t	pss_status;
228 };
229 
230 int acpicpu_fetch_pss(struct acpicpu_pss **);
231 void acpicpu_set_notify(void (*)(struct acpicpu_pss *, int));
232 /*
233  * XXX this is returned in a buffer and is not a "natural" type.
234  *
235  * GRD (Generic Register Descriptor )
236  *
237  */
238 struct acpi_grd {
239 	u_int8_t	grd_descriptor;
240 	u_int16_t	grd_length;
241 	struct acpi_gas	grd_gas;
242 } __packed;
243 
244 /*
245  * _PCT (Performance Control )
246  * Arguments: none
247  * Results  : package _PCT (Performance Control)
248  * Package {
249  *	Perf_Ctrl_register	//Register
250  *	Perf_Status_register	//Register
251  * }
252  */
253 struct acpicpu_pct {
254 	struct acpi_grd	pct_ctrl;
255 	struct acpi_grd	pct_status;
256 };
257 
258 /* softc for fake apm devices */
259 struct acpiac_softc {
260 	struct device		sc_dev;
261 
262 	bus_space_tag_t		sc_iot;
263 	bus_space_handle_t	sc_ioh;
264 
265 	struct acpi_softc	*sc_acpi;
266 	struct aml_node		*sc_devnode;
267 
268 	int			sc_ac_stat;
269 
270 	struct ksensor		sc_sens[1];
271 	struct ksensordev	sc_sensdev;
272 };
273 
274 struct acpibat_softc {
275 	struct device		sc_dev;
276 
277 	bus_space_tag_t		sc_iot;
278 	bus_space_handle_t	sc_ioh;
279 
280 	struct acpi_softc	*sc_acpi;
281 	struct aml_node		*sc_devnode;
282 
283 	struct acpibat_bif	sc_bif;
284 	struct acpibat_bst	sc_bst;
285 	volatile int		sc_bat_present;
286 
287 	struct ksensor		sc_sens[8];
288 	struct ksensordev	sc_sensdev;
289 };
290 
291 struct acpidock_softc {
292 	struct device		sc_dev;
293 
294 	bus_space_tag_t		sc_iot;
295 	bus_space_handle_t	sc_ioh;
296 
297 	struct acpi_softc	*sc_acpi;
298 	struct aml_node		*sc_devnode;
299 
300 	TAILQ_HEAD(, aml_nodelist)	sc_deps_h;
301 	struct aml_nodelist	*sc_deps;
302 
303 	struct ksensor		sc_sens;
304 	struct ksensordev	sc_sensdev;
305 
306 	int			sc_docked;
307 	int			sc_sta;
308 
309 #define ACPIDOCK_STATUS_UNKNOWN		-1
310 #define ACPIDOCK_STATUS_UNDOCKED	0
311 #define ACPIDOCK_STATUS_DOCKED		1
312 };
313 
314 #define ACPIDOCK_EVENT_INSERT	0
315 #define	ACPIDOCK_EVENT_EJECT	3
316 
317 #define ACPIEC_MAX_EVENTS	256
318 
319 struct acpiec_event {
320 	struct aml_node *event;
321 };
322 
323 struct acpiec_softc {
324 	struct device		sc_dev;
325 
326 	/* command/status register */
327 	bus_space_tag_t		sc_cmd_bt;
328 	bus_space_handle_t	sc_cmd_bh;
329 
330 	/* data register */
331 	bus_space_tag_t		sc_data_bt;
332 	bus_space_handle_t	sc_data_bh;
333 
334 	struct acpi_softc	*sc_acpi;
335 	struct aml_node		*sc_devnode;
336 	u_int32_t		sc_gpe;
337 	struct acpiec_event	sc_events[ACPIEC_MAX_EVENTS];
338 	int			sc_gotsci;
339 };
340 
341 #endif /* __DEV_ACPI_ACPIDEV_H__ */
342