acpidev.h revision 1.31
1/* $OpenBSD: acpidev.h,v 1.31 2010/08/03 16:55:06 marco 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 */
52struct 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 */
100struct 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 */
141struct 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 */
221struct 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
230int acpicpu_fetch_pss(struct acpicpu_pss **);
231void 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 */
238struct 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 */
253struct acpicpu_pct {
254	struct acpi_grd	pct_ctrl;
255	struct acpi_grd	pct_status;
256};
257
258/* softc for fake apm devices */
259struct acpiac_softc {
260	struct device		sc_dev;
261
262	struct acpi_softc	*sc_acpi;
263	struct aml_node		*sc_devnode;
264
265	int			sc_ac_stat;
266
267	struct ksensor		sc_sens[1];
268	struct ksensordev	sc_sensdev;
269};
270
271struct acpibat_softc {
272	struct device		sc_dev;
273
274	struct acpi_softc	*sc_acpi;
275	struct aml_node		*sc_devnode;
276
277	struct acpibat_bif	sc_bif;
278	struct acpibat_bst	sc_bst;
279	volatile int		sc_bat_present;
280
281	struct ksensor		sc_sens[8];
282	struct ksensordev	sc_sensdev;
283};
284
285TAILQ_HEAD(aml_nodelisth, aml_nodelist);
286
287struct acpidock_softc {
288	struct device		sc_dev;
289
290	struct acpi_softc	*sc_acpi;
291	struct aml_node		*sc_devnode;
292
293	struct aml_nodelisth	sc_deps_h;
294	struct aml_nodelist	*sc_deps;
295
296	struct ksensor		sc_sens;
297	struct ksensordev	sc_sensdev;
298
299	int			sc_docked;
300	int			sc_sta;
301
302#define ACPIDOCK_STATUS_UNKNOWN		-1
303#define ACPIDOCK_STATUS_UNDOCKED	0
304#define ACPIDOCK_STATUS_DOCKED		1
305};
306
307#define ACPIDOCK_EVENT_INSERT	0
308#define ACPIDOCK_EVENT_DEVCHECK 1
309#define	ACPIDOCK_EVENT_EJECT	3
310
311#define ACPIEC_MAX_EVENTS	256
312
313struct acpiec_event {
314	struct aml_node *event;
315};
316
317struct acpiec_softc {
318	struct device		sc_dev;
319
320	int			sc_ecbusy;
321
322	/* command/status register */
323	bus_space_tag_t		sc_cmd_bt;
324	bus_space_handle_t	sc_cmd_bh;
325
326	/* data register */
327	bus_space_tag_t		sc_data_bt;
328	bus_space_handle_t	sc_data_bh;
329
330	struct acpi_softc	*sc_acpi;
331	struct aml_node		*sc_devnode;
332	u_int32_t		sc_gpe;
333	struct acpiec_event	sc_events[ACPIEC_MAX_EVENTS];
334	int			sc_gotsci;
335};
336
337#endif /* __DEV_ACPI_ACPIDEV_H__ */
338