acpidump.h revision 136165
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 *	$FreeBSD: head/usr.sbin/acpi/acpidump/acpidump.h 136165 2004-10-05 20:45:05Z njl $
28 */
29
30#ifndef _ACPIDUMP_H_
31#define _ACPIDUMP_H_
32
33/* Generic Address structure */
34struct ACPIgas {
35	u_int8_t	address_space_id;
36#define ACPI_GAS_MEMORY		0
37#define ACPI_GAS_IO		1
38#define ACPI_GAS_PCI		2
39#define ACPI_GAS_EMBEDDED	3
40#define ACPI_GAS_SMBUS		4
41#define ACPI_GAS_FIXED		0x7f
42	u_int8_t	bit_width;
43	u_int8_t	bit_offset;
44	u_int8_t	_reserved;
45	u_int64_t	address;
46} __packed;
47
48/* Root System Description Pointer */
49struct ACPIrsdp {
50	u_char		signature[8];
51	u_char		sum;
52	u_char		oem[6];
53	u_char		revision;
54	u_int32_t	rsdt_addr;
55	u_int32_t	length;
56	u_int64_t	xsdt_addr;
57	u_char		xsum;
58	u_char		_reserved_[3];
59} __packed;
60
61/* System Description Table */
62struct ACPIsdt {
63	u_char		signature[4];
64	u_int32_t	len;
65	u_char		rev;
66	u_char		check;
67	u_char		oemid[6];
68	u_char		oemtblid[8];
69	u_int32_t	oemrev;
70	u_char		creator[4];
71	u_int32_t	crerev;
72#define SIZEOF_SDT_HDR 36	/* struct size except body */
73	u_int32_t	body[1];/* This member should be casted */
74} __packed;
75
76/* Fixed ACPI Description Table (body) */
77struct FADTbody {
78	u_int32_t	facs_ptr;
79	u_int32_t	dsdt_ptr;
80	u_int8_t	int_model;
81#define ACPI_FADT_INTMODEL_PIC	0	/* Standard PC-AT PIC */
82#define ACPI_FADT_INTMODEL_APIC	1	/* Multiple APIC */
83	u_int8_t	pm_profile;
84	u_int16_t	sci_int;
85	u_int32_t	smi_cmd;
86	u_int8_t	acpi_enable;
87	u_int8_t	acpi_disable;
88	u_int8_t	s4biosreq;
89	u_int8_t	pstate_cnt;
90	u_int32_t	pm1a_evt_blk;
91	u_int32_t	pm1b_evt_blk;
92	u_int32_t	pm1a_cnt_blk;
93	u_int32_t	pm1b_cnt_blk;
94	u_int32_t	pm2_cnt_blk;
95	u_int32_t	pm_tmr_blk;
96	u_int32_t	gpe0_blk;
97	u_int32_t	gpe1_blk;
98	u_int8_t	pm1_evt_len;
99	u_int8_t	pm1_cnt_len;
100	u_int8_t	pm2_cnt_len;
101	u_int8_t	pm_tmr_len;
102	u_int8_t	gpe0_len;
103	u_int8_t	gpe1_len;
104	u_int8_t	gpe1_base;
105	u_int8_t	cst_cnt;
106	u_int16_t	p_lvl2_lat;
107	u_int16_t	p_lvl3_lat;
108	u_int16_t	flush_size;
109	u_int16_t	flush_stride;
110	u_int8_t	duty_off;
111	u_int8_t	duty_width;
112	u_int8_t	day_alrm;
113	u_int8_t	mon_alrm;
114	u_int8_t	century;
115	u_int16_t	iapc_boot_arch;
116#define FADT_FLAG_LEGACY_DEV	1	/* System has legacy devices */
117#define FADT_FLAG_8042		2	/* 8042 keyboard controller */
118	u_char		reserved4[1];
119	u_int32_t	flags;
120#define FADT_FLAG_WBINVD	1	/* WBINVD is correctly supported */
121#define FADT_FLAG_WBINVD_FLUSH	2	/* WBINVD flushes caches */
122#define FADT_FLAG_PROC_C1	4	/* C1 power state supported */
123#define FADT_FLAG_P_LVL2_UP	8	/* C2 power state works on SMP */
124#define FADT_FLAG_PWR_BUTTON	16	/* Power button uses control method */
125#define FADT_FLAG_SLP_BUTTON	32	/* Sleep button uses control method */
126#define FADT_FLAG_FIX_RTC	64	/* RTC wakeup not supported */
127#define FADT_FLAG_RTC_S4	128	/* RTC can wakeup from S4 state */
128#define FADT_FLAG_TMR_VAL_EXT	256	/* TMR_VAL is 32bit */
129#define FADT_FLAG_DCK_CAP	512	/* Can support docking */
130#define FADT_FLAG_RESET_REG	1024	/* Supports RESET_REG */
131#define FADT_FLAG_SEALED_CASE	2048	/* Case cannot be opened */
132#define FADT_FLAG_HEADLESS	4096	/* No monitor */
133#define FADT_FLAG_CPU_SW_SLP	8192	/* Supports CPU software sleep */
134	struct ACPIgas	reset_reg;
135	u_int8_t	reset_value;
136	u_int8_t	reserved5[3];
137	u_int64_t	x_facs_ptr;
138	u_int64_t	x_dsdt_ptr;
139	struct ACPIgas	x_pm1a_evt_blk;
140	struct ACPIgas	x_pm1b_evt_blk;
141	struct ACPIgas	x_pm1a_cnt_blk;
142	struct ACPIgas	x_pm1b_cnt_blk;
143	struct ACPIgas	x_pm2_cnt_blk;
144	struct ACPIgas	x_pm_tmr_blk;
145	struct ACPIgas	x_gpe0_blk;
146	struct ACPIgas	x_gpe1_blk;
147} __packed;
148
149/* Firmware ACPI Control Structure */
150struct FACSbody {
151	u_char		signature[4];
152	u_int32_t	len;
153	u_int32_t	hw_sig;
154	/*
155	 * NOTE This should be filled with physical address below 1MB!!
156	 * sigh....
157	 */
158	u_int32_t	firm_wake_vec;
159	u_int32_t	global_lock;
160#define FACS_FLAG_LOCK_PENDING	1	/* 5.2.6.1 Global Lock */
161#define FACS_FLAG_LOCK_OWNED	2
162	u_int32_t	flags;
163#define FACS_FLAG_S4BIOS_F	1	/* Supports S4BIOS_SEQ */
164	u_int64_t	x_firm_wake_vec;
165	u_int8_t	version;
166	char		reserved[31];
167} __packed;
168
169struct MADT_local_apic {
170	u_char		cpu_id;
171	u_char		apic_id;
172	u_int32_t	flags;
173#define	ACPI_MADT_APIC_LOCAL_FLAG_ENABLED	1
174} __packed;
175
176struct MADT_io_apic {
177	u_char		apic_id;
178	u_char		reserved;
179	u_int32_t	apic_addr;
180	u_int32_t	int_base;
181} __packed;
182
183struct MADT_int_override {
184	u_char		bus;
185	u_char		source;
186	u_int32_t	intr;
187	u_int16_t	mps_flags;
188#define	MPS_INT_FLAG_POLARITY_MASK	0x3
189#define	MPS_INT_FLAG_POLARITY_CONFORM	0x0
190#define	MPS_INT_FLAG_POLARITY_HIGH	0x1
191#define	MPS_INT_FLAG_POLARITY_LOW	0x3
192#define	MPS_INT_FLAG_TRIGGER_MASK	0xc
193#define	MPS_INT_FLAG_TRIGGER_CONFORM	0x0
194#define	MPS_INT_FLAG_TRIGGER_EDGE	0x4
195#define	MPS_INT_FLAG_TRIGGER_LEVEL	0xc
196} __packed;
197
198struct MADT_nmi {
199	u_int16_t	mps_flags;
200	u_int32_t	intr;
201} __packed;
202
203struct MADT_local_nmi {
204	u_char		cpu_id;
205	u_int16_t	mps_flags;
206	u_char		lintpin;
207} __packed;
208
209struct MADT_local_apic_override {
210	u_char		reserved[2];
211	u_int64_t	apic_addr;
212} __packed;
213
214struct MADT_io_sapic {
215	u_char		apic_id;
216	u_char		reserved;
217	u_int32_t	int_base;
218	u_int64_t	apic_addr;
219} __packed;
220
221struct MADT_local_sapic {
222	u_char		cpu_id;
223	u_char		apic_id;
224	u_char		apic_eid;
225	u_char		reserved[3];
226	u_int32_t	flags;
227} __packed;
228
229struct MADT_int_src {
230	u_int16_t	mps_flags;
231	u_char		type;
232#define	ACPI_MADT_APIC_INT_SOURCE_PMI	1
233#define	ACPI_MADT_APIC_INT_SOURCE_INIT	2
234#define	ACPI_MADT_APIC_INT_SOURCE_CPEI	3	/* Corrected Platform Error */
235	u_char		cpu_id;
236	u_char		cpu_eid;
237	u_char		sapic_vector;
238	u_int32_t	intr;
239	u_char		reserved[4];
240} __packed;
241
242struct MADT_APIC {
243	u_char		type;
244#define	ACPI_MADT_APIC_TYPE_LOCAL_APIC	0
245#define	ACPI_MADT_APIC_TYPE_IO_APIC	1
246#define	ACPI_MADT_APIC_TYPE_INT_OVERRIDE 2
247#define	ACPI_MADT_APIC_TYPE_NMI		3
248#define	ACPI_MADT_APIC_TYPE_LOCAL_NMI	4
249#define	ACPI_MADT_APIC_TYPE_LOCAL_OVERRIDE 5
250#define	ACPI_MADT_APIC_TYPE_IO_SAPIC	6
251#define	ACPI_MADT_APIC_TYPE_LOCAL_SAPIC	7
252#define	ACPI_MADT_APIC_TYPE_INT_SRC	8
253	u_char		len;
254	union {
255		struct MADT_local_apic local_apic;
256		struct MADT_io_apic io_apic;
257		struct MADT_int_override int_override;
258		struct MADT_nmi nmi;
259		struct MADT_local_nmi local_nmi;
260		struct MADT_local_apic_override local_apic_override;
261		struct MADT_io_sapic io_sapic;
262		struct MADT_local_sapic local_sapic;
263		struct MADT_int_src int_src;
264	} body;
265} __packed;
266
267struct MADTbody {
268	u_int32_t	lapic_addr;
269	u_int32_t	flags;
270#define	ACPI_APIC_FLAG_PCAT_COMPAT 1	/* System has dual-8259 setup. */
271	u_char		body[1];
272} __packed;
273
274struct HPETbody {
275	u_int32_t	block_hwrev:8,
276			block_comparitors:5,
277			block_counter_size:1,
278			:1,
279			block_legacy_capable:1,
280			block_pcivendor:16;
281	u_int32_t	base_addr;
282	u_int64_t	reserved1;
283	u_int8_t	hpet_number;
284	u_int16_t	clock_tick __packed;
285} __packed;
286
287/* Embedded Controller Description Table */
288struct ECDTbody {
289	struct ACPIgas	ec_control;	/* Control register */
290	struct ACPIgas	ec_data;	/* Data register */
291	uint32_t	uid;		/* Same value as _UID in namespace */
292	uint8_t		gpe_bit;	/* GPE bit for the EC */
293	u_char		ec_id[1];	/* Variable length name string */
294} __packed;
295
296/*
297 * Addresses to scan on ia32 for the RSD PTR.  According to section 5.2.2
298 * of the ACPI spec, we only consider two regions for the base address:
299 * 1. EBDA (1 KB area addressed to by 16 bit pointer at 0x40E)
300 * 2. High memory (0xE0000 - 0xFFFFF)
301 */
302#define RSDP_EBDA_PTR	0x40E
303#define RSDP_EBDA_SIZE	0x400
304#define RSDP_HI_START	0xE0000
305#define RSDP_HI_SIZE	0x20000
306
307/* Find and map the RSD PTR structure and return it for parsing */
308struct ACPIsdt  *sdt_load_devmem(void);
309
310/*
311 * Load the DSDT from a previous save file.  Note that other tables are
312 * not saved (i.e. FADT)
313 */
314struct ACPIsdt  *dsdt_load_file(char *);
315
316/* Save the DSDT to a file */
317void		 dsdt_save_file(char *, struct ACPIsdt *, struct ACPIsdt *);
318
319/* Print out as many fixed tables as possible, given the RSD PTR */
320void		 sdt_print_all(struct ACPIsdt *);
321
322/* Disassemble the AML in the DSDT */
323void		 aml_disassemble(struct ACPIsdt *, struct ACPIsdt *);
324
325/* Routines for accessing tables in physical memory */
326struct ACPIrsdp	*acpi_find_rsd_ptr(void);
327void		*acpi_map_physical(vm_offset_t, size_t);
328struct ACPIsdt	*sdt_from_rsdt(struct ACPIsdt *, const char *,
329    struct ACPIsdt *);
330struct ACPIsdt	*dsdt_from_fadt(struct FADTbody *);
331int		 acpi_checksum(void *, size_t);
332
333/* Command line flags */
334extern int	dflag;
335extern int	tflag;
336extern int	vflag;
337
338#endif	/* !_ACPIDUMP_H_ */
339