xref: /minix3/minix/kernel/arch/i386/acpi.h (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1 #ifndef __ACPI_H__
2 #define __ACPI_H__
3 
4 #include "kernel/kernel.h"
5 
6 /* ACPI root system description pointer */
7 struct acpi_rsdp {
8 	char	signature[8]; /* must be "RSD PTR " */
9 	u8_t	checksum;
10 	char	oemid[6];
11 	u8_t	revision;
12 	u32_t	rsdt_addr;
13 	u32_t	length;
14 };
15 
16 #define ACPI_SDT_SIGNATURE_LEN	4
17 
18 #define ACPI_SDT_SIGNATURE(name)	#name
19 
20 /* header common to all system description tables */
21 struct acpi_sdt_header {
22 	char	signature[ACPI_SDT_SIGNATURE_LEN];
23 	u32_t	length;
24 	u8_t	revision;
25 	u8_t	checksum;
26 	char	oemid[6];
27 	char	oem_table_id[8];
28 	u32_t	oem_revision;
29 	u32_t	creator_id;
30 	u32_t	creator_revision;
31 };
32 
33 struct acpi_generic_address {
34 	u8_t address_space_id;
35 	u8_t register_bit_width;
36 	u8_t register_bit_offset;
37 	u8_t access_size;
38 	u64_t address;
39 };
40 
41 struct acpi_fadt_header
42 {
43 	struct acpi_sdt_header hdr;
44 	u32_t facs;
45 	u32_t dsdt;
46 	u8_t model;
47 	u8_t preferred_pm_profile;
48 	u16_t sci_int;
49 	u32_t smi_cmd;
50 	u8_t acpi_enable;
51 	u8_t acpi_disable;
52 	u8_t s4bios_req;
53 	u8_t pstate_cnt;
54 	u32_t pm1a_evt_blk;
55 	u32_t pm1b_evt_blk;
56 	u32_t pm1a_cnt_blk;
57 	u32_t pm1b_cnt_blk;
58 	u32_t pm2_cnt_blk;
59 	u32_t pm_tmr_blk;
60 	u32_t gpe0_blk;
61 	u32_t gpe1_blk;
62 	u8_t pm1_evt_len;
63 	u8_t pm1_cnt_len;
64 	u8_t pm2_cnt_len;
65 	u8_t pm_tmr_len;
66 	u8_t gpe0_blk_len;
67 	u8_t gpe1_blk_len;
68 	u8_t gpe1_base;
69 	u8_t cst_cnt;
70 	u16_t p_lvl2_lat;
71 	u16_t p_lvl3_lat;
72 	u16_t flush_size;
73 	u16_t flush_stride;
74 	u8_t duty_offset;
75 	u8_t duty_width;
76 	u8_t day_alrm;
77 	u8_t mon_alrm;
78 	u8_t century;
79 	u16_t iapc_boot_arch;
80 	u8_t reserved1;
81 	u32_t flags;
82 	struct acpi_generic_address reset_reg;
83 	u8_t reset_value;
84 	u8_t reserved2[3];
85 	u64_t xfacs;
86 	u64_t xdsdt;
87 	struct acpi_generic_address xpm1a_evt_blk;
88 	struct acpi_generic_address xpm1b_evt_blk;
89 	struct acpi_generic_address xpm1a_cnt_blk;
90 	struct acpi_generic_address xpm1b_cnt_blk;
91 	struct acpi_generic_address xpm2_cnt_blk;
92 	struct acpi_generic_address xpm_tmr_blk;
93 	struct acpi_generic_address xgpe0_blk;
94 	struct acpi_generic_address xgpe1_blk;
95 };
96 
97 struct acpi_madt_hdr {
98 	struct acpi_sdt_header	hdr;
99 	u32_t			local_apic_address;
100 	u32_t			flags;
101 };
102 
103 #define ACPI_MADT_TYPE_LAPIC		0
104 #define ACPI_MADT_TYPE_IOAPIC		1
105 #define ACPI_MADT_TYPE_INT_SRC		2
106 #define ACPI_MADT_TYPE_NMI_SRC		3
107 #define ACPI_MADT_TYPE_LAPIC_NMI	4
108 #define ACPI_MADT_TYPE_LAPIC_ADRESS	5
109 #define ACPI_MADT_TYPE_IOSAPIC		6
110 #define ACPI_MADT_TYPE_LSAPIC		7
111 #define ACPI_MADT_TYPE_PLATFORM_INT_SRC	8
112 #define ACPI_MADT_TYPE_Lx2APIC		9
113 #define ACPI_MADT_TYPE_Lx2APIC_NMI	10
114 
115 struct acpi_madt_item_hdr{
116 	u8_t	type;
117 	u8_t	length;
118 };
119 
120 struct acpi_madt_lapic {
121 	struct acpi_madt_item_hdr hdr;
122 	u8_t	acpi_cpu_id;
123 	u8_t	apic_id;
124 	u32_t	flags;
125 };
126 
127 struct acpi_madt_ioapic {
128 	struct acpi_madt_item_hdr hdr;
129 	u8_t	id;
130 	u8_t	__reserved;
131 	u32_t	address;
132 	u32_t	global_int_base;
133 };
134 
135 struct acpi_madt_int_src {
136 	struct acpi_madt_item_hdr hdr;
137 	u8_t	bus;
138 	u8_t	bus_int;
139 	u32_t	global_int;
140 	u16_t	mps_flags;
141 };
142 
143 struct acpi_madt_nmi {
144 	struct acpi_madt_item_hdr hdr;
145 	u16_t	flags;
146 	u32_t	global_int;
147 };
148 
149 void acpi_init(void);
150 
151 void acpi_poweroff(void);
152 
153 /*
154  * Returns a pointer to the io acpi structure in the MADT table in ACPI. The
155  * pointer is valid only until paging is turned off. No memory is allocated in
156  * this function thus no memory needs to be freed
157  */
158 struct acpi_madt_ioapic * acpi_get_ioapic_next(void);
159 /* same as above for local APICs */
160 struct acpi_madt_lapic * acpi_get_lapic_next(void);
161 
162 #endif /* __ACPI_H__ */
163