xref: /openbsd/sys/dev/acpi/acpidev.h (revision 09467b48)
1 /* $OpenBSD: acpidev.h,v 1.44 2018/06/29 17:39:18 kettenis 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 #include <dev/acpi/smbus.h>
26 
27 #define DEVNAME(s)  ((s)->sc_dev.dv_xname)
28 
29 #define ACPIDEV_NOPOLL		0
30 #define ACPIDEV_POLL		1
31 
32 /*
33  * _BIF (Battery InFormation)
34  * Arguments: none
35  * Results  : package _BIF (Battery InFormation)
36  * Package {
37  * 	// ASCIIZ is ASCII character string terminated with a 0x00.
38  * 	Power Unit			//DWORD
39  * 	Design Capacity			//DWORD
40  * 	Last Full Charge Capacity	//DWORD
41  * 	Battery Technology		//DWORD
42  * 	Design Voltage			//DWORD
43  * 	Design Capacity of Warning	//DWORD
44  * 	Design Capacity of Low		//DWORD
45  * 	Battery Capacity Granularity 1	//DWORD
46  * 	Battery Capacity Granularity 2	//DWORD
47  * 	Model Number			//ASCIIZ
48  * 	Serial Number			//ASCIIZ
49  * 	Battery Type			//ASCIIZ
50  * 	OEM Information			//ASCIIZ
51  * }
52  *
53  * _BIX (Battery Information Extended)
54  * Arguments: none
55  * Results  : package _BIX (Battery Information Extended)
56  * Package {
57  * 	// ASCIIZ is ASCII character string terminated with a 0x00.
58  *	Revision			//Integer
59  * 	Power Unit			//DWORD
60  * 	Design Capacity			//DWORD
61  * 	Last Full Charge Capacity	//DWORD
62  * 	Battery Technology		//DWORD
63  * 	Design Voltage			//DWORD
64  * 	Design Capacity of Warning	//DWORD
65  * 	Design Capacity of Low		//DWORD
66  * 	Cycle Count			//DWORD
67  * 	Measurement Accuracy		//DWORD
68  * 	Max Sampling Time		//DWORD
69  * 	Min Sampling Time		//DWORD
70  * 	Max Averaging Interval		//DWORD
71  * 	Min Averaging Interval		//DWORD
72  * 	Battery Capacity Granularity 1	//DWORD
73  * 	Battery Capacity Granularity 2	//DWORD
74  * 	Model Number			//ASCIIZ
75  * 	Serial Number			//ASCIIZ
76  * 	Battery Type			//ASCIIZ
77  * 	OEM Information			//ASCIIZ
78  * }
79  */
80 struct acpibat_bix {
81 	uint8_t		bix_revision;
82 	uint32_t	bix_power_unit;
83 #define BIX_POWER_MW		0x00
84 #define BIX_POWER_MA		0x01
85 	uint32_t	bix_capacity;
86 #define BIX_UNKNOWN		0xffffffff
87 	uint32_t	bix_last_capacity;
88 	uint32_t	bix_technology;
89 #define BIX_TECH_PRIMARY	0x00
90 #define BIX_TECH_SECONDARY	0x01
91 	uint32_t	bix_voltage;
92 	uint32_t	bix_warning;
93 	uint32_t	bix_low;
94 	uint32_t	bix_cycle_count;
95 	uint32_t	bix_accuracy;
96 	uint32_t	bix_max_sample;
97 	uint32_t	bix_min_sample;
98 	uint32_t	bix_max_avg;
99 	uint32_t	bix_min_avg;
100 	uint32_t	bix_cap_granu1;
101 	uint32_t	bix_cap_granu2;
102 	char		bix_model[20];
103 	char		bix_serial[20];
104 	char		bix_type[20];
105 	char		bix_oem[20];
106 };
107 
108 /*
109  * _OSC Definition for Control Method Battery
110  * Arguments: none
111  * Results  : DWORD flags
112  */
113 #define CMB_OSC_UUID		"f18fc78b-0f15-4978-b793-53f833a1d35b"
114 #define   CMB_OSC_GRANULARITY	0x01
115 #define   CMB_OSC_WAKE_ON_LOW	0x02
116 
117 /*
118  * _BST (Battery STatus)
119  * Arguments: none
120  * Results  : package _BST (Battery STatus)
121  * Package {
122  * 	Battery State			//DWORD
123  * 	Battery Present Rate		//DWORD
124  * 	Battery Remaining Capacity	//DWORD
125  * 	Battery Present Voltage		//DWORD
126  * }
127  *
128  * Per the spec section 10.2.2.3
129  * Remaining Battery Percentage[%] = (Battery Remaining Capacity [=0 ~ 100] /
130  *     Last Full Charged Capacity[=100]) * 100
131  *
132  * Remaining Battery Life [h] = Battery Remaining Capacity [mAh/mWh] /
133  *     Battery Present Rate [=0xFFFFFFFF] = unknown
134  */
135 struct acpibat_bst {
136 	uint32_t	bst_state;
137 #define BST_DISCHARGE		0x01
138 #define BST_CHARGE		0x02
139 #define BST_CRITICAL		0x04
140 	uint32_t	bst_rate;
141 #define BST_UNKNOWN		0xffffffff
142 	uint32_t	bst_capacity;
143 	uint32_t	bst_voltage;
144 };
145 
146 /*
147  * _BTP (Battery Trip Point)
148  * Arguments: DWORD level
149  * Results  : none
150  */
151 #define BTP_CLEAR_TRIP_POINT	0x00
152 
153 /*
154  * _BTM (Battery TiMe)
155  * Arguments: DWORD rate of discharge
156  * Results  : DWORD time in seconds or error/unknown
157  */
158 #define BTM_CURRENT_RATE	0x00
159 
160 #define BTM_RATE_TOO_LARGE	0x00
161 #define BTM_CRITICAL		0x00
162 #define BTM_UNKNOWN		0xffffffff
163 
164 /*
165  * _BMD (Battery Maintenance Data)
166  * Arguments: none
167  * Results  : package _BMD (Battery Maintenance Data)
168  * Package {
169  * 	Status Flags		//DWORD
170  * 	Capability Flags	//DWORD
171  * 	Recalibrate Count	//DWORD
172  * 	Quick Recalibrate Time	//DWORD
173  * 	Slow Recalibrate Time	//DWORD
174  * }
175  */
176 struct acpibat_bmd {
177 	uint32_t	bmd_status;
178 #define BMD_AML_CALIBRATE_CYCLE	0x01
179 #define BMD_CHARGING_DISABLED	0x02
180 #define BMD_DISCHARGE_WHILE_AC	0x04
181 #define BMD_RECALIBRATE_BAT	0x08
182 #define BMD_GOTO_STANDBY_SPEED	0x10
183 	uint32_t	bmd_capability;
184 #define BMD_CB_AML_CALIBRATION	0x01
185 #define BMD_CB_DISABLE_CHARGER	0x02
186 #define BMD_CB_DISCH_WHILE_AC	0x04
187 #define BMD_CB_AFFECT_ALL_BATT	0x08
188 #define BMD_CB_FULL_CHRG_FIRST	0x10
189 	uint32_t	bmd_recalibrate_count;
190 #define BMD_ONLY_CALIB_IF_ST3	0x00	/* only recal when status bit 3 set */
191 	uint32_t	bmd_quick_recalibrate_time;
192 #define BMD_UNKNOWN		0xffffffff
193 	uint32_t	bmd_slow_recalibrate_time;
194 };
195 
196 /*
197  * _BMC (Battery Maintenance Control)
198  * Arguments: DWORD flags
199  * Results  : none
200  */
201 #define BMC_AML_CALIBRATE	0x01
202 #define BMC_DISABLE_CHARGING	0x02
203 #define BMC_ALLOW_AC_DISCHARGE	0x04
204 
205 /* AC device */
206 /*
207  * _PSR (Power Source)
208  * Arguments: none
209  * Results  : DWORD status
210  */
211 #define PSR_OFFLINE		0x00
212 #define PSR_ONLINE		0x01
213 
214 /*
215  * _PCL (Power Consumer List)
216  * Arguments: none
217  * Results  : LIST of Power Class pointers
218  */
219 
220 /* hpet device */
221 #define	HPET_REG_SIZE		1024
222 
223 #define	HPET_CAPABILITIES	0x000
224 #define	HPET_CONFIGURATION	0x010
225 #define	HPET_INTERRUPT_STATUS	0x020
226 #define	HPET_MAIN_COUNTER	0x0F0
227 #define	HPET_TIMER0_CONFIG	0x100
228 #define	HPET_TIMER0_COMPARE	0x108
229 #define	HPET_TIMER0_INTERRUPT	0x110
230 #define	HPET_TIMER1_CONFIG	((0x20 * 1) + HPET_TIMER0_CONFIG)
231 #define	HPET_TIMER1_COMPARE	((0x20 * 1) + HPET_TIMER0_COMPARE)
232 #define	HPET_TIMER1_INTERRUPT	((0x20 * 1) + HPET_TIMER0_INTERRUPT)
233 #define	HPET_TIMER2_CONFIG	((0x20 * 2) + HPET_TIMER0_CONFIG)
234 #define	HPET_TIMER2_COMPARE	((0x20 * 2) + HPET_TIMER0_COMPARE)
235 #define	HPET_TIMER2_INTERRUPT	((0x20 * 2) + HPET_TIMER0_INTERRUPT)
236 
237 /* Max period is 10^8 fs (100 ns) == 0x5F5E100 as per the HPET SDM */
238 #define HPET_MAX_PERIOD		0x5F5E100
239 
240 #define STA_PRESENT   (1L << 0)
241 #define STA_ENABLED   (1L << 1)
242 #define STA_SHOW_UI   (1L << 2)
243 #define STA_DEV_OK    (1L << 3)
244 #define STA_BATTERY   (1L << 4)
245 
246 /*
247  * _PSS (Performance Supported States)
248  * Arguments: none
249  * Results  : package _PSS (Performance Supported States)
250  * Package {
251  *	CoreFreq		//DWORD
252  *	Power			//DWORD
253  *	TransitionLatency	//DWORD
254  *	BusMasterLatency	//DWORD
255  *	Control			//DWORD
256  * 	Status			//DWORD
257  * }
258  */
259 struct acpicpu_pss {
260 	uint32_t	pss_core_freq;
261 	uint32_t	pss_power;
262 	uint32_t	pss_trans_latency;
263 	uint32_t	pss_bus_latency;
264 	uint32_t	pss_ctrl;
265 	uint32_t	pss_status;
266 };
267 
268 int acpicpu_fetch_pss(struct acpicpu_pss **);
269 void acpicpu_set_notify(void (*)(struct acpicpu_pss *, int));
270 /*
271  * XXX this is returned in a buffer and is not a "natural" type.
272  *
273  * GRD (Generic Register Descriptor )
274  *
275  */
276 struct acpi_grd {
277 	uint8_t		grd_descriptor;
278 	uint16_t	grd_length;
279 	struct acpi_gas	grd_gas;
280 } __packed;
281 
282 /*
283  * _PCT (Performance Control )
284  * Arguments: none
285  * Results  : package _PCT (Performance Control)
286  * Package {
287  *	Perf_Ctrl_register	//Register
288  *	Perf_Status_register	//Register
289  * }
290  */
291 struct acpicpu_pct {
292 	struct acpi_grd	pct_ctrl;
293 	struct acpi_grd	pct_status;
294 };
295 
296 /* softc for fake apm devices */
297 struct acpiac_softc {
298 	struct device		sc_dev;
299 
300 	struct acpi_softc	*sc_acpi;
301 	struct aml_node		*sc_devnode;
302 
303 	int			sc_ac_stat;
304 
305 	struct ksensor		sc_sens[1];
306 	struct ksensordev	sc_sensdev;
307 };
308 
309 struct acpibat_softc {
310 	struct device		sc_dev;
311 
312 	struct acpi_softc	*sc_acpi;
313 	struct aml_node		*sc_devnode;
314 
315 	struct acpibat_bix	sc_bix;
316 	int			sc_use_bif;
317 	struct acpibat_bst	sc_bst;
318 	volatile int		sc_bat_present;
319 
320 	struct ksensor		sc_sens[10];
321 	struct ksensordev	sc_sensdev;
322 };
323 
324 TAILQ_HEAD(aml_nodelisth, aml_nodelist);
325 
326 struct acpidock_softc {
327 	struct device		sc_dev;
328 
329 	struct acpi_softc	*sc_acpi;
330 	struct aml_node		*sc_devnode;
331 
332 	struct aml_nodelisth	sc_deps_h;
333 	struct aml_nodelist	*sc_deps;
334 
335 	struct ksensor		sc_sens;
336 	struct ksensordev	sc_sensdev;
337 
338 	int			sc_docked;
339 	int			sc_sta;
340 
341 #define ACPIDOCK_STATUS_UNKNOWN		-1
342 #define ACPIDOCK_STATUS_UNDOCKED	0
343 #define ACPIDOCK_STATUS_DOCKED		1
344 };
345 
346 #define ACPIDOCK_EVENT_INSERT	0
347 #define ACPIDOCK_EVENT_DEVCHECK 1
348 #define	ACPIDOCK_EVENT_EJECT	3
349 
350 #define ACPIEC_MAX_EVENTS	256
351 
352 struct acpiec_event {
353 	struct aml_node *event;
354 };
355 
356 struct acpiec_softc {
357 	struct device		sc_dev;
358 
359 	int			sc_ecbusy;
360 
361 	/* command/status register */
362 	bus_size_t		sc_ec_sc;
363 	bus_space_tag_t		sc_cmd_bt;
364 	bus_space_handle_t	sc_cmd_bh;
365 
366 	/* data register */
367 	bus_size_t		sc_ec_data;
368 	bus_space_tag_t		sc_data_bt;
369 	bus_space_handle_t	sc_data_bh;
370 
371 	struct acpi_softc	*sc_acpi;
372 	struct aml_node		*sc_devnode;
373 	uint32_t		sc_gpe;
374 	struct acpiec_event	sc_events[ACPIEC_MAX_EVENTS];
375 	int			sc_gotsci;
376 	int			sc_glk;
377 	int			sc_cantburst;
378 };
379 
380 void		acpibtn_disable_psw(void);
381 void		acpibtn_enable_psw(void);
382 int		acpibtn_numopenlids(void);
383 
384 struct acpisbs_battery {
385 	uint16_t mode;			/* bit flags */
386 	int	 units;
387 #define	ACPISBS_UNITS_MW		0
388 #define	ACPISBS_UNITS_MA		1
389 	uint16_t at_rate;		/* mAh or mWh */
390 	uint16_t temperature;		/* 0.1 degK */
391 	uint16_t voltage;		/* mV */
392 	uint16_t current;		/* mA */
393 	uint16_t avg_current;		/* mA */
394 	uint16_t rel_charge;		/* percent of last_capacity */
395 	uint16_t abs_charge;		/* percent of design_capacity */
396 	uint16_t capacity;		/* mAh */
397 	uint16_t full_capacity;		/* mAh, when fully charged */
398 	uint16_t run_time;		/* minutes */
399 	uint16_t avg_empty_time;	/* minutes */
400 	uint16_t avg_full_time;		/* minutes until full */
401 	uint16_t charge_current;	/* mA */
402 	uint16_t charge_voltage;	/* mV */
403 	uint16_t status;		/* bit flags */
404 	uint16_t cycle_count;		/* cycles */
405 	uint16_t design_capacity;	/* mAh */
406 	uint16_t design_voltage;	/* mV */
407 	uint16_t spec;			/* formatted */
408 	uint16_t manufacture_date;	/* formatted */
409 	uint16_t serial;		/* number */
410 
411 #define	ACPISBS_VALUE_UNKNOWN		65535
412 
413 	char	 manufacturer[SMBUS_DATA_SIZE];
414 	char	 device_name[SMBUS_DATA_SIZE];
415 	char	 device_chemistry[SMBUS_DATA_SIZE];
416 	char	 oem_data[SMBUS_DATA_SIZE];
417 };
418 
419 struct acpisbs_softc {
420 	struct device		sc_dev;
421 
422 	struct acpi_softc	*sc_acpi;
423 	struct aml_node		*sc_devnode;
424 	struct acpiec_softc     *sc_ec;
425 	uint8_t			sc_ec_base;
426 
427 	struct acpisbs_battery	sc_battery;
428 	int			sc_batteries_present;
429 
430 	struct ksensor		*sc_sensors;
431 	struct ksensordev	sc_sensordev;
432 	struct sensor_task	*sc_sensor_task;
433 	struct timeval		sc_lastpoll;
434 };
435 
436 #endif /* __DEV_ACPI_ACPIDEV_H__ */
437