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