acpidump.h revision 118334
1/*-
2 * Copyright (c) 1999 Doug Rabson
3 * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 *	$Id: acpidump.h,v 1.3 2000/08/09 14:47:52 iwasaki Exp $
28 *	$FreeBSD: head/usr.sbin/acpi/acpidump/acpidump.h 118334 2003-08-02 01:55:03Z peter $
29 */
30
31#ifndef _ACPIDUMP_H_
32#define _ACPIDUMP_H_
33
34/* Generic Address structure */
35struct ACPIgas {
36	u_int8_t	address_space_id;
37#define ACPI_GAS_MEMORY		0
38#define ACPI_GAS_IO		1
39#define ACPI_GAS_PCI		2
40#define ACPI_GAS_EMBEDDED	3
41#define ACPI_GAS_SMBUS		4
42#define ACPI_GAS_FIXED		0x7f
43	u_int8_t	register_bit_width;
44	u_int8_t	register_bit_offset;
45	u_int8_t	res;
46	u_int64_t	address;
47} __packed;
48
49/* Root System Description Pointer */
50struct ACPIrsdp {
51	u_char		signature[8];
52	u_char		sum;
53	u_char		oem[6];
54	u_char		revision;
55	u_int32_t	rsdt_addr;
56	u_int32_t	length;
57	u_int64_t	xsdt_addr;
58	u_char		xsum;
59	u_char		_reserved_[3];
60} __packed;
61
62/* System Description Table */
63struct ACPIsdt {
64	u_char		signature[4];
65	u_int32_t	len;
66	u_char		rev;
67	u_char		check;
68	u_char		oemid[6];
69	u_char		oemtblid[8];
70	u_int32_t	oemrev;
71	u_char		creator[4];
72	u_int32_t	crerev;
73#define SIZEOF_SDT_HDR 36	/* struct size except body */
74	u_int32_t	body[1];/* This member should be casted */
75} __packed;
76
77/* Fixed ACPI Description Table (body) */
78struct FACPbody {
79	u_int32_t	facs_ptr;
80	u_int32_t	dsdt_ptr;
81	u_int8_t	int_model;
82#define ACPI_FACP_INTMODEL_PIC	0	/* Standard PC-AT PIC */
83#define ACPI_FACP_INTMODEL_APIC	1	/* Multiple APIC */
84	u_char		reserved1;
85	u_int16_t	sci_int;
86	u_int32_t	smi_cmd;
87	u_int8_t	acpi_enable;
88	u_int8_t	acpi_disable;
89	u_int8_t	s4biosreq;
90	u_int8_t	reserved2;
91	u_int32_t	pm1a_evt_blk;
92	u_int32_t	pm1b_evt_blk;
93	u_int32_t	pm1a_cnt_blk;
94	u_int32_t	pm1b_cnt_blk;
95	u_int32_t	pm2_cnt_blk;
96	u_int32_t	pm_tmr_blk;
97	u_int32_t	gpe0_blk;
98	u_int32_t	gpe1_blk;
99	u_int8_t	pm1_evt_len;
100	u_int8_t	pm1_cnt_len;
101	u_int8_t	pm2_cnt_len;
102	u_int8_t	pm_tmr_len;
103	u_int8_t	gpe0_len;
104	u_int8_t	gpe1_len;
105	u_int8_t	gpe1_base;
106	u_int8_t	reserved3;
107	u_int16_t	p_lvl2_lat;
108	u_int16_t	p_lvl3_lat;
109	u_int16_t	flush_size;
110	u_int16_t	flush_stride;
111	u_int8_t	duty_off;
112	u_int8_t	duty_width;
113	u_int8_t	day_alrm;
114	u_int8_t	mon_alrm;
115	u_int8_t	century;
116	u_int16_t	iapc_boot_arch;
117	u_char		reserved4[1];
118	u_int32_t	flags;
119#define ACPI_FACP_FLAG_WBINVD	1	/* WBINVD is correctly supported */
120#define ACPI_FACP_FLAG_WBINVD_FLUSH 2	/* WBINVD flushes caches */
121#define ACPI_FACP_FLAG_PROC_C1	4	/* C1 power state supported */
122#define ACPI_FACP_FLAG_P_LVL2_UP 8	/* C2 power state works on SMP */
123#define ACPI_FACP_FLAG_PWR_BUTTON 16	/* Power button uses control method */
124#define ACPI_FACP_FLAG_SLP_BUTTON 32	/* Sleep button uses control method */
125#define ACPI_FACP_FLAG_FIX_RTC	64	/* RTC wakeup not supported */
126#define ACPI_FACP_FLAG_RTC_S4	128	/* RTC can wakeup from S4 state */
127#define ACPI_FACP_FLAG_TMR_VAL_EXT 256	/* TMR_VAL is 32bit */
128#define ACPI_FACP_FLAG_DCK_CAP	512	/* Can support docking */
129	struct ACPIgas	reset_reg;
130	u_int8_t	reset_value;
131	u_int8_t	reserved5[3];
132	u_int64_t	x_firmware_ctrl;
133	u_int64_t	x_dsdt;
134	struct ACPIgas	x_pm1a_evt_blk;
135	struct ACPIgas	x_pm1b_evt_blk;
136	struct ACPIgas	x_pm1a_cnt_blk;
137	struct ACPIgas	x_pm1b_cnt_blk;
138	struct ACPIgas	x_pm2_cnt_blk;
139	struct ACPIgas	x_pm_tmr_blk;
140	struct ACPIgas	x_gpe0_blk;
141	struct ACPIgas	x_gpe1_blk;
142} __packed;
143
144/* Firmware ACPI Control Structure */
145struct FACS {
146	u_char		signature[4];
147	u_int32_t	len;
148	u_char		hard_sig[4];
149	/*
150	 * NOTE This should be filled with physical address below 1MB!!
151	 * sigh....
152	 */
153	u_int32_t	firm_wake_vec;
154	u_int32_t	g_lock;		/* bit field */
155	/* 5.2.6.1 Global Lock */
156#define ACPI_GLOBAL_LOCK_PENDING 1
157#define ACPI_GLOBAL_LOCK_OWNED 2
158	u_int32_t	flags;		/* bit field */
159#define ACPI_FACS_FLAG_S4BIOS_F	1	/* Supports S4BIOS_SEQ */
160	char		reserved[40];
161} __packed;
162
163struct MADT_local_apic {
164	u_char		cpu_id;
165	u_char		apic_id;
166	u_int32_t	flags;
167#define	ACPI_MADT_APIC_LOCAL_FLAG_ENABLED	1
168} __packed;
169
170struct MADT_io_apic {
171	u_char		apic_id;
172	u_char		reserved;
173	u_int32_t	apic_addr;
174	u_int32_t	int_base;
175} __packed;
176
177struct MADT_int_override {
178	u_char		bus;
179	u_char		source;
180	u_int32_t	intr;
181	u_int16_t	mps_flags;
182#define	MPS_INT_FLAG_POLARITY_MASK	0x3
183#define	MPS_INT_FLAG_POLARITY_CONFORM	0x0
184#define	MPS_INT_FLAG_POLARITY_HIGH	0x1
185#define	MPS_INT_FLAG_POLARITY_LOW	0x3
186#define	MPS_INT_FLAG_TRIGGER_MASK	0xc
187#define	MPS_INT_FLAG_TRIGGER_CONFORM	0x0
188#define	MPS_INT_FLAG_TRIGGER_EDGE	0x4
189#define	MPS_INT_FLAG_TRIGGER_LEVEL	0xc
190} __packed;
191
192struct MADT_nmi {
193	u_int16_t	mps_flags;
194	u_int32_t	intr;
195} __packed;
196
197struct MADT_local_nmi {
198	u_char		cpu_id;
199	u_int16_t	mps_flags;
200	u_char		lintpin;
201} __packed;
202
203struct MADT_local_apic_override {
204	u_char		reserved[2];
205	u_int64_t	apic_addr;
206} __packed;
207
208struct MADT_io_sapic {
209	u_char		apic_id;
210	u_char		reserved;
211	u_int32_t	int_base;
212	u_int64_t	apic_addr;
213} __packed;
214
215struct MADT_local_sapic {
216	u_char		cpu_id;
217	u_char		apic_id;
218	u_char		apic_eid;
219	u_char		reserved[3];
220	u_int32_t	flags;
221} __packed;
222
223struct MADT_int_src {
224	u_int16_t	mps_flags;
225	u_char		type;
226#define	ACPI_MADT_APIC_INT_SOURCE_PMI	1
227#define	ACPI_MADT_APIC_INT_SOURCE_INIT	2
228#define	ACPI_MADT_APIC_INT_SOURCE_CPEI	3	/* Corrected Platform Error */
229	u_char		cpu_id;
230	u_char		cpu_eid;
231	u_char		sapic_vector;
232	u_int32_t	intr;
233	u_char		reserved[4];
234} __packed;
235
236struct MADT_APIC {
237	u_char		type;
238#define	ACPI_MADT_APIC_TYPE_LOCAL_APIC	0
239#define	ACPI_MADT_APIC_TYPE_IO_APIC	1
240#define	ACPI_MADT_APIC_TYPE_INT_OVERRIDE 2
241#define	ACPI_MADT_APIC_TYPE_NMI		3
242#define	ACPI_MADT_APIC_TYPE_LOCAL_NMI	4
243#define	ACPI_MADT_APIC_TYPE_LOCAL_OVERRIDE 5
244#define	ACPI_MADT_APIC_TYPE_IO_SAPIC	6
245#define	ACPI_MADT_APIC_TYPE_LOCAL_SAPIC	7
246#define	ACPI_MADT_APIC_TYPE_INT_SRC	8
247	u_char		len;
248	union {
249		struct MADT_local_apic local_apic;
250		struct MADT_io_apic io_apic;
251		struct MADT_int_override int_override;
252		struct MADT_nmi nmi;
253		struct MADT_local_nmi local_nmi;
254		struct MADT_local_apic_override local_apic_override;
255		struct MADT_io_sapic io_sapic;
256		struct MADT_local_sapic local_sapic;
257		struct MADT_int_src int_src;
258	} body;
259} __packed;
260
261struct MADTbody {
262	u_int32_t	lapic_addr;
263	u_int32_t	flags;
264#define	ACPI_APIC_FLAG_PCAT_COMPAT 1	/* Syetem has dual-8259 setup. */
265	u_char		body[1];
266} __packed;
267
268struct HPETbody {
269	u_int32_t	block_hwrev:8,
270			block_comparitors:5,
271			block_counter_size:1,
272			:1,
273			block_legacy_capable:1,
274			block_pcivendor:16;
275	u_int32_t	base_addr;
276	u_int64_t	reserved1;
277	u_int8_t	hpet_number;
278	u_int16_t	clock_tick __packed;
279} __packed;
280
281void		*acpi_map_physical(vm_offset_t, size_t);
282struct ACPIrsdp	*acpi_find_rsd_ptr(void);
283int		 acpi_checksum(void *, size_t);
284struct ACPIsdt	*acpi_map_sdt(vm_offset_t);
285void		 acpi_print_rsd_ptr(struct ACPIrsdp *);
286void		 acpi_print_sdt(struct ACPIsdt *);
287void		 acpi_print_rsdt(struct ACPIsdt *);
288void		 acpi_print_facp(struct FACPbody *);
289void		 acpi_print_dsdt(struct ACPIsdt *);
290
291void		 asl_dump_termobj(u_int8_t **, int);
292void		 asl_dump_objectlist(u_int8_t **, u_int8_t *, int);
293
294void		 aml_dump(struct ACPIsdt *);
295
296void    	 acpi_handle_rsdt(struct ACPIsdt *);
297void		 acpi_load_dsdt(char *, u_int8_t **, u_int8_t **);
298void		 acpi_dump_dsdt(u_int8_t *, u_int8_t *);
299extern char	*aml_dumpfile;
300extern struct	ACPIsdt dsdt_header;
301extern int	rflag;
302
303#endif	/* !_ACPIDUMP_H_ */
304