acpidev.h revision 1.41
1/* $OpenBSD: acpidev.h,v 1.41 2017/07/22 21:06:17 jcs 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 */
80struct acpibat_bix {
81	u_int8_t	bix_revision;
82	u_int32_t	bix_power_unit;
83#define BIX_POWER_MW		0x00
84#define BIX_POWER_MA		0x01
85	u_int32_t	bix_capacity;
86#define BIX_UNKNOWN		0xffffffff
87	u_int32_t	bix_last_capacity;
88	u_int32_t	bix_technology;
89#define BIX_TECH_PRIMARY	0x00
90#define BIX_TECH_SECONDARY	0x01
91	u_int32_t	bix_voltage;
92	u_int32_t	bix_warning;
93	u_int32_t	bix_low;
94	u_int32_t	bix_cycle_count;
95	u_int32_t	bix_accuracy;
96	u_int32_t	bix_max_sample;
97	u_int32_t	bix_min_sample;
98	u_int32_t	bix_max_avg;
99	u_int32_t	bix_min_avg;
100	u_int32_t	bix_cap_granu1;
101	u_int32_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 */
135struct acpibat_bst {
136	u_int32_t	bst_state;
137#define BST_DISCHARGE		0x01
138#define BST_CHARGE		0x02
139#define BST_CRITICAL		0x04
140	u_int32_t	bst_rate;
141#define BST_UNKNOWN		0xffffffff
142	u_int32_t	bst_capacity;
143	u_int32_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 */
176struct acpibat_bmd {
177	u_int32_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	u_int32_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	u_int32_t	bmd_recalibrate_count;
190#define BMD_ONLY_CALIB_IF_ST3	0x00	/* only recal when status bit 3 set */
191	u_int32_t	bmd_quick_recalibrate_time;
192#define BMD_UNKNOWN		0xffffffff
193	u_int32_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 */
259struct acpicpu_pss {
260	u_int32_t	pss_core_freq;
261	u_int32_t	pss_power;
262	u_int32_t	pss_trans_latency;
263	u_int32_t	pss_bus_latency;
264	u_int32_t	pss_ctrl;
265	u_int32_t	pss_status;
266};
267
268int acpicpu_fetch_pss(struct acpicpu_pss **);
269void 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 */
276struct acpi_grd {
277	u_int8_t	grd_descriptor;
278	u_int16_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 */
291struct acpicpu_pct {
292	struct acpi_grd	pct_ctrl;
293	struct acpi_grd	pct_status;
294};
295
296/* softc for fake apm devices */
297struct 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
309struct 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
324TAILQ_HEAD(aml_nodelisth, aml_nodelist);
325
326struct 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
352struct acpiec_event {
353	struct aml_node *event;
354};
355
356struct 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	u_int32_t		sc_gpe;
374	struct acpiec_event	sc_events[ACPIEC_MAX_EVENTS];
375	int			sc_gotsci;
376	int			sc_glk;
377};
378
379void		acpibtn_disable_psw(void);
380void		acpibtn_enable_psw(void);
381int		acpibtn_numopenlids(void);
382
383struct acpisbs_battery {
384	uint16_t mode;			/* bit flags */
385	int	 units;
386#define	ACPISBS_UNITS_MW		0
387#define	ACPISBS_UNITS_MA		1
388	uint16_t at_rate;		/* mAh or mWh */
389	uint16_t temperature;		/* 0.1 degK */
390	uint16_t voltage;		/* mV */
391	uint16_t current;		/* mA */
392	uint16_t avg_current;		/* mA */
393	uint16_t rel_charge;		/* percent of last_capacity */
394	uint16_t abs_charge;		/* percent of design_capacity */
395	uint16_t capacity;		/* mAh */
396	uint16_t full_capacity;		/* mAh, when fully charged */
397	uint16_t run_time;		/* minutes */
398	uint16_t avg_empty_time;	/* minutes */
399	uint16_t avg_full_time;		/* minutes until full */
400	uint16_t charge_current;	/* mA */
401	uint16_t charge_voltage;	/* mV */
402	uint16_t status;		/* bit flags */
403	uint16_t cycle_count;		/* cycles */
404	uint16_t design_capacity;	/* mAh */
405	uint16_t design_voltage;	/* mV */
406	uint16_t spec;			/* formatted */
407	uint16_t manufacture_date;	/* formatted */
408	uint16_t serial;		/* number */
409
410#define	ACPISBS_VALUE_UNKNOWN		65535
411
412	char	 manufacturer[SMBUS_DATA_SIZE];
413	char	 device_name[SMBUS_DATA_SIZE];
414	char	 device_chemistry[SMBUS_DATA_SIZE];
415	char	 oem_data[SMBUS_DATA_SIZE];
416};
417
418struct acpisbs_softc {
419	struct device		sc_dev;
420
421	struct acpi_softc	*sc_acpi;
422	struct aml_node		*sc_devnode;
423	struct acpiec_softc     *sc_ec;
424	uint8_t			sc_ec_base;
425
426	struct acpisbs_battery	sc_battery;
427	int			sc_batteries_present;
428
429	struct ksensor		*sc_sensors;
430	struct ksensordev	sc_sensordev;
431	struct sensor_task	*sc_sensor_task;
432	struct timeval		sc_lastpoll;
433};
434
435#endif /* __DEV_ACPI_ACPIDEV_H__ */
436