1155928Ssam/*-
2155928Ssam * Copyright (c) 1999 Doug Rabson
3155928Ssam * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
4155928Ssam * All rights reserved.
5155928Ssam *
6155928Ssam * Redistribution and use in source and binary forms, with or without
7155928Ssam * modification, are permitted provided that the following conditions
8155928Ssam * are met:
9155928Ssam * 1. Redistributions of source code must retain the above copyright
10155928Ssam *    notice, this list of conditions and the following disclaimer.
11155928Ssam * 2. Redistributions in binary form must reproduce the above copyright
12155928Ssam *    notice, this list of conditions and the following disclaimer in the
13155928Ssam *    documentation and/or other materials provided with the distribution.
14155928Ssam *
15155928Ssam * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16155928Ssam * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17155928Ssam * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18155928Ssam * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19155928Ssam * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20155928Ssam * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21155928Ssam * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22155928Ssam * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23155928Ssam * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24155928Ssam * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25155928Ssam * SUCH DAMAGE.
26155928Ssam *
27155928Ssam *	$FreeBSD$
28155928Ssam */
29155928Ssam
30155928Ssam#ifndef _ACPIDUMP_H_
31155928Ssam#define _ACPIDUMP_H_
32155928Ssam
33155928Ssam/* Root System Description Pointer */
34155928Ssamstruct ACPIrsdp {
35155928Ssam	u_char		signature[8];
36155928Ssam	u_char		sum;
37155928Ssam	u_char		oem[6];
38155928Ssam	u_char		revision;
39155928Ssam	u_int32_t	rsdt_addr;
40155928Ssam	u_int32_t	length;
41155928Ssam	u_int64_t	xsdt_addr;
42155928Ssam	u_char		xsum;
43155928Ssam	u_char		_reserved_[3];
44155928Ssam} __packed;
45155928Ssam
46155928Ssam/* System Description Table */
47155928Ssamstruct ACPIsdt {
48155928Ssam	u_char		signature[4];
49155928Ssam	u_int32_t	len;
50155928Ssam	u_char		rev;
51155928Ssam	u_char		check;
52155928Ssam	u_char		oemid[6];
53155928Ssam	u_char		oemtblid[8];
54155928Ssam	u_int32_t	oemrev;
55155928Ssam	u_char		creator[4];
56155928Ssam	u_int32_t	crerev;
57155928Ssam#define SIZEOF_SDT_HDR 36	/* struct size except body */
58155928Ssam	u_int32_t	body[1];/* This member should be casted */
59155928Ssam} __packed;
60155928Ssam
61155928Ssamstruct MADT_local_apic {
62155928Ssam	u_char		cpu_id;
63155928Ssam	u_char		apic_id;
64155928Ssam	u_int32_t	flags;
65155928Ssam#define	ACPI_MADT_APIC_LOCAL_FLAG_ENABLED	1
66155928Ssam} __packed;
67155928Ssam
68155928Ssamstruct MADT_io_apic {
69155928Ssam	u_char		apic_id;
70155928Ssam	u_char		reserved;
71155928Ssam	u_int32_t	apic_addr;
72155928Ssam	u_int32_t	int_base;
73155928Ssam} __packed;
74155928Ssam
75155928Ssamstruct MADT_int_override {
76155928Ssam	u_char		bus;
77155928Ssam	u_char		source;
78155928Ssam	u_int32_t	intr;
79155928Ssam	u_int16_t	mps_flags;
80155928Ssam#define	MPS_INT_FLAG_POLARITY_MASK	0x3
81155928Ssam#define	MPS_INT_FLAG_POLARITY_CONFORM	0x0
82155928Ssam#define	MPS_INT_FLAG_POLARITY_HIGH	0x1
83155928Ssam#define	MPS_INT_FLAG_POLARITY_LOW	0x3
84155928Ssam#define	MPS_INT_FLAG_TRIGGER_MASK	0xc
85155928Ssam#define	MPS_INT_FLAG_TRIGGER_CONFORM	0x0
86155928Ssam#define	MPS_INT_FLAG_TRIGGER_EDGE	0x4
87155928Ssam#define	MPS_INT_FLAG_TRIGGER_LEVEL	0xc
88155928Ssam} __packed;
89155928Ssam
90155928Ssamstruct MADT_nmi {
91155928Ssam	u_int16_t	mps_flags;
92155928Ssam	u_int32_t	intr;
93155928Ssam} __packed;
94155928Ssam
95155928Ssamstruct MADT_local_nmi {
96155928Ssam	u_char		cpu_id;
97155928Ssam	u_int16_t	mps_flags;
98155928Ssam	u_char		lintpin;
99155928Ssam} __packed;
100155928Ssam
101155928Ssamstruct MADT_local_apic_override {
102155928Ssam	u_char		reserved[2];
103155928Ssam	u_int64_t	apic_addr;
104155928Ssam} __packed;
105155928Ssam
106155928Ssamstruct MADT_io_sapic {
107155928Ssam	u_char		apic_id;
108155928Ssam	u_char		reserved;
109155928Ssam	u_int32_t	int_base;
110155928Ssam	u_int64_t	apic_addr;
111155928Ssam} __packed;
112155928Ssam
113155928Ssamstruct MADT_local_sapic {
114155928Ssam	u_char		cpu_id;
115155928Ssam	u_char		apic_id;
116155928Ssam	u_char		apic_eid;
117155928Ssam	u_char		reserved[3];
118155928Ssam	u_int32_t	flags;
119155928Ssam} __packed;
120155928Ssam
121155928Ssamstruct MADT_int_src {
122155928Ssam	u_int16_t	mps_flags;
123155928Ssam	u_char		type;
124155928Ssam#define	ACPI_MADT_APIC_INT_SOURCE_PMI	1
125155928Ssam#define	ACPI_MADT_APIC_INT_SOURCE_INIT	2
126155928Ssam#define	ACPI_MADT_APIC_INT_SOURCE_CPEI	3	/* Corrected Platform Error */
127155928Ssam	u_char		cpu_id;
128155928Ssam	u_char		cpu_eid;
129155928Ssam	u_char		sapic_vector;
130155928Ssam	u_int32_t	intr;
131155928Ssam	u_char		reserved[4];
132155928Ssam} __packed;
133155928Ssam
134155928Ssamstruct MADT_APIC {
135155928Ssam	u_char		type;
136155928Ssam#define	ACPI_MADT_APIC_TYPE_LOCAL_APIC	0
137155928Ssam#define	ACPI_MADT_APIC_TYPE_IO_APIC	1
138155928Ssam#define	ACPI_MADT_APIC_TYPE_INT_OVERRIDE 2
139155928Ssam#define	ACPI_MADT_APIC_TYPE_NMI		3
140155928Ssam#define	ACPI_MADT_APIC_TYPE_LOCAL_NMI	4
141155928Ssam#define	ACPI_MADT_APIC_TYPE_LOCAL_OVERRIDE 5
142155928Ssam#define	ACPI_MADT_APIC_TYPE_IO_SAPIC	6
143155928Ssam#define	ACPI_MADT_APIC_TYPE_LOCAL_SAPIC	7
144155928Ssam#define	ACPI_MADT_APIC_TYPE_INT_SRC	8
145155928Ssam	u_char		len;
146155928Ssam	union {
147155928Ssam		struct MADT_local_apic local_apic;
148155928Ssam		struct MADT_io_apic io_apic;
149155928Ssam		struct MADT_int_override int_override;
150155928Ssam		struct MADT_nmi nmi;
151155928Ssam		struct MADT_local_nmi local_nmi;
152155928Ssam		struct MADT_local_apic_override local_apic_override;
153155928Ssam		struct MADT_io_sapic io_sapic;
154155928Ssam		struct MADT_local_sapic local_sapic;
155155928Ssam		struct MADT_int_src int_src;
156155928Ssam	} body;
157155928Ssam} __packed;
158155928Ssam
159155928Ssamstruct MADTbody {
160155928Ssam	u_int32_t	lapic_addr;
161155928Ssam	u_int32_t	flags;
162155928Ssam#define	ACPI_APIC_FLAG_PCAT_COMPAT 1	/* System has dual-8259 setup. */
163155928Ssam	u_char		body[1];
164155928Ssam} __packed;
165155928Ssam
166155928Ssam/*
167155928Ssam * Addresses to scan on ia32 for the RSD PTR.  According to section 5.2.2
168155928Ssam * of the ACPI spec, we only consider two regions for the base address:
169155928Ssam * 1. EBDA (1 KB area addressed to by 16 bit pointer at 0x40E)
170155928Ssam * 2. High memory (0xE0000 - 0xFFFFF)
171155928Ssam */
172155928Ssam#define RSDP_EBDA_PTR	0x40E
173155928Ssam#define RSDP_EBDA_SIZE	0x400
174155928Ssam#define RSDP_HI_START	0xE0000
175155928Ssam#define RSDP_HI_SIZE	0x20000
176155928Ssam
177155928Ssam#endif	/* !_ACPIDUMP_H_ */
178