xref: /haiku/src/add-ons/kernel/drivers/timer/arch_acpi.h (revision 1e60bdeab63fa7a57bc9a55b032052e95a18bd2c)
1 /*
2  * Copyright 2008, Dustin Howett, dustin.howett@gmail.com. All rights reserved.
3  * Copyright 2007, Michael Lotz, mmlr@mlotz.ch. All rights reserved.
4  * Distributed under the terms of the MIT License.
5  */
6 #ifndef _KERNEL_ARCH_x86_ARCH_ACPI_H
7 #define _KERNEL_ARCH_x86_ARCH_ACPI_H
8 
9 #define ACPI_RSDP_SIGNATURE		"RSD PTR "
10 #define ACPI_RSDT_SIGNATURE		"RSDT"
11 #define ACPI_XSDT_SIGNATURE		"XSDT"
12 #define ACPI_MADT_SIGNATURE		"APIC"
13 
14 #define ACPI_LOCAL_APIC_ENABLED	0x01
15 
16 typedef struct acpi_rsdp_legacy {
17 	char	signature[8];			/* "RSD PTR " including blank */
18 	uint8	checksum;				/* checksum of bytes 0-19 (per ACPI 1.0) */
19 	char	oem_id[6];				/* not null terminated */
20 	uint8	revision;				/* 0 = ACPI 1.0, 2 = ACPI 3.0 */
21 	uint32	rsdt_address;			/* physical memory address of RSDT */
22 } _PACKED acpi_rsdp_legacy;
23 
24 typedef struct acpi_rsdp_extended {
25 	char	signature[8];			/* "RSD PTR " including blank */
26 	uint8	checksum;				/* checksum of bytes 0-19 (per ACPI 1.0) */
27 	char	oem_id[6];				/* not null terminated */
28 	uint8	revision;				/* 0 = ACPI 1.0, 2 = ACPI 3.0 */
29 	uint32	rsdt_address;			/* physical memory address of RSDT */
30 	uint32	xsdt_length;			/* length in bytes including header */
31 	uint64	xsdt_address;			/* 64bit physical memory address of XSDT */
32 	uint8	extended_checksum;		/* including entire table */
33 	uint8	reserved[3];
34 } _PACKED acpi_rsdp_extended;
35 
36 typedef acpi_rsdp_extended acpi_rsdp;
37 
38 typedef struct acpi_descriptor_header {
39 	char	signature[4];			/* table identifier as ASCII string */
40 	uint32	length;					/* length in bytes of the entire table */
41 	uint8	revision;
42 	uint8	checksum;				/* checksum of entire table */
43 	char	oem_id[6];				/* not null terminated */
44 	char	oem_table_id[8];		/* oem supplied table identifier */
45 	uint32	oem_revision;			/* oem supplied revision number */
46 	char	creator_id[4];			/* creator / asl compiler id */
47 	uint32	creator_revision;		/* compiler revision */
48 } _PACKED acpi_descriptor_header;
49 
50 typedef struct acpi_madt {
51 	acpi_descriptor_header	header;		/* "APIC" signature */
52 	uint32	local_apic_address;		/* physical address for local CPUs APICs */
53 	uint32	flags;
54 } _PACKED acpi_madt;
55 
56 enum {
57 	ACPI_MADT_LOCAL_APIC = 0,
58 	ACPI_MADT_IO_APIC = 1,
59 	ACPI_MADT_INTERRUPT_SOURCE_OVERRIDE = 2,
60 	ACPI_MADT_NMI_SOURCE = 3,
61 	ACPI_MADT_LOCAL_APIC_NMI = 4,
62 	ACPI_MADT_LOCAL_APIC_ADDRESS_OVERRIDE = 5,
63 	ACPI_MADT_IO_SAPIC = 6,
64 	ACPI_MADT_LOCAL_SAPIC = 7,
65 	ACPI_MADT_PLATFORM_INTERRUPT_SOURCE = 8,
66 	ACPI_MADT_PROCESSOR_LOCAL_X2_APIC_NMI = 9,
67 	ACPI_MADT_LOCAL_X2_APIC_NMI = 0XA
68 };
69 
70 typedef struct acpi_apic {
71 	uint8	type;
72 	uint8	length;
73 } _PACKED acpi_apic;
74 
75 typedef struct acpi_local_apic {
76 	uint8	type;					/* 0 = processor local APIC */
77 	uint8	length;					/* 8 bytes */
78 	uint8	acpi_processor_id;
79 	uint8	apic_id;				/* the id of this APIC */
80 	uint32	flags;					/* 1 = enabled */
81 } _PACKED acpi_local_apic;
82 
83 typedef struct acpi_io_apic {
84 	uint8	type;					/* 1 = I/O APIC */
85 	uint8	length;					/* 12 bytes */
86 	uint8	io_apic_id;				/* the id of this APIC */
87 	uint8	reserved;
88 	uint32	io_apic_address;		/* physical address of I/O APIC */
89 	uint32	interrupt_base;			/* global system interrupt base */
90 } _PACKED acpi_io_apic;
91 
92 typedef struct acpi_int_source_override {
93 	uint8	type;					/* 2 = Interrupt source override */
94 	uint8	length;					/* 10 bytes */
95 	uint8	bus;					/* 0 = ISA  */
96 	uint8	source;					/* Bus-relative interrupt source (IRQ) */
97 	uint32	interrupt;				/* global system interrupt this
98 									   bus-relative source int will signal */
99 	uint16	flags;					/* MPS INTI flags. See Table 5-25 in
100 									   ACPI Spec 4.0a or similar */
101 } _PACKED acpi_int_source_override;
102 
103 typedef struct acpi_nmi_source {
104 	uint8	type;					/* 3 = NMI */
105 	uint8	length;					/* 8 bytes */
106 	uint16	flags;					/* Same as MPS INTI flags. See Table 5-25 in
107 									   ACPI Spec 4.0a or similar */
108 	uint32  interrupt;				/* global system interrupt this
109 									   non-maskable interrupt will trigger */
110 } _PACKED acpi_nmi_source;
111 
112 typedef struct acpi_local_apic_nmi {
113 	uint8	type;					/* 4 = local APIC NMI */
114 	uint8	length;					/* 6 bytes */
115 	uint8	acpi_processor_id;		/* Processor ID corresponding to processor
116 									   ID in acpi_local_apic. 0xFF means
117 									   it applies to all processors */
118 	uint16	flags;					/* Same as MPS INTI flags. See Table 5-25 in
119 									   ACPI Spec 4.0a or similar */
120 	uint8   local_interrupt;		/* Local APIC interrupt input LINTn to which
121 									   NMI is connected */
122 } _PACKED acpi_local_apic_nmi;
123 
124 typedef struct acpi_local_apic_address_override {
125 	uint8	type;					/* 5 = local APIC address override */
126 	uint8	length;					/* 12 bytes */
127 	uint16	reserved;				/* reserved (must be set to zero) */
128 	uint64	local_apic_address;		/* Physical address of local APIC. See table
129 										5-28 in ACPI Spec 4.0a for more */
130 } _PACKED acpi_local_apic_address_override;
131 
132 typedef struct acpi_io_sapic {
133 	uint8	type;					/* 6 = I/0 SAPIC (should be used if it
134 									   exists instead of I/O APIC if both exists
135 									   for a APIC ID.*/
136 	uint8	length;					/* 16 bytes */
137 	uint8	io_apic_id;				/* the id of this SAPIC */
138 	uint8	reserved;				/* reserved (must be set to zero) */
139 	uint32	interrupt_base;			/* global system interrupt base */
140 	uint64	sapic_address;			/* The physical address to access this I/0
141 									   SAPIC. Each SAPIC resides at a unique
142 									   address */
143 } _PACKED acpi_io_sapic;
144 
145 typedef struct acpi_local_sapic {
146 	uint8	type;					/* 7 = processor local SAPIC */
147 	uint8	length;					/* n bytes */
148 	uint8	acpi_processor_id;
149 	uint8	local_sapic_id;
150 	uint8	local_sapic_eid;
151 	uint8	reserved1;				/* reserved (must be set to zero) */
152 	uint8	reserved2;				/* reserved (must be set to zero) */
153 	uint8	reserved3;				/* reserved (must be set to zero) */
154 	uint32	flags;					/* Local SAPIC flags, see table 5-22 in
155 									   ACPI Spec 4.0a */
156 	uint32	processor_uid_nr;		/* Matches _UID of a processor when it is a
157 									   number */
158 	char	processor_uid_str[];	/* Matches _UID of a processor when it is a
159 									   string. Null-terminated */
160 } _PACKED acpi_local_sapic;
161 
162 typedef struct acpi_platform_interrupt_source {
163 	uint8	type;					/* 8 = platform interrupt source */
164 	uint8	length;					/* 16 bytes */
165 	uint16	flags;					/* Same as MPS INTI flags. See Table 5-25 in
166 									   ACPI Spec 4.0a or similar */
167 	uint8	interrupt_type;			/* 1 PMI, 2 INIT, 3 Corrected Platform
168 									   Error Interrupt */
169 	uint8	processor_id;			/* processor ID of destination */
170 	uint8	processor_eid;			/* processor EID of destination */
171 	uint8	io_sapic_vector;		/* value that must be used to program the
172 									   vector field of the I/O SAPIC redirection
173 									   entry for entries with PMI type. */
174 	uint32	interrupt;				/* global system interrupt this
175 									   platform interrupt will trigger */
176 	uint32	platform_int_flags;		/* Platform Interrupt Source Flags. See
177 									   Table 5-32 of ACPI Spec 4.0a for desc */
178 } _PACKED acpi_platform_interrupt_source;
179 
180 typedef struct acpi_local_x2_apic {
181 	uint8	type;					/* 9 = processor local x2APIC */
182 	uint8	length;					/* 16 bytes */
183 	uint16	reserved;				/* reserved (must be zero) */
184 	uint32	x2apic_id;				/* processor's local x2APIC ID */
185 	uint32	flags;					/* 1 = enabled. */
186 	uint32	processor_uid_nr;		/* Matches _UID of a processor when it is a
187 									   number */
188 } _PACKED acpi_local_x2_apic;
189 
190 typedef struct acpi_local_x2_apic_nmi {
191 	uint8	type;					/* 0xA = local x2APIC NMI */
192 	uint8	length;					/* 12 bytes */
193 	uint16	flags;					/* Same as MPS INTI flags. See Table 5-25 in
194 									   ACPI Spec 4.0a or similar */
195 	uint32	acpi_processor_uid;		/* UID corresponding to ID in processor
196 									   device object. 0xFFFFFFFF means
197 									   it applies to all processors */
198 	uint8   local_interrupt;		/* Local x2APIC interrupt input LINTn to
199 									   which NMI is connected */
200 	uint8	reserved1;				/* reserved (must be set to zero) */
201 	uint8	reserved2;				/* reserved (must be set to zero) */
202 	uint8	reserved3;				/* reserved (must be set to zero) */
203 } _PACKED acpi_local_x2_apic_nmi;
204 
205 
206 #endif	/* _KERNEL_ARCH_x86_ARCH_ACPI_H */
207