1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
|
/*
* Copyright (c) 2004, Intel Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place - Suite 330, Boston, MA 02111-1307 USA.
*
*/
#ifndef _ACPI_2_0_H_
#define _ACPI_2_0_H_
#include "xc.h" // for u8, u16, u32, u64 definition
#pragma pack (1)
//
// common ACPI header.
//
typedef struct {
u32 Signature;
u32 Length;
u8 Revision;
u8 Checksum;
u8 OemId[6];
u64 OemTableId;
u32 OemRevision;
u32 CreatorId;
u32 CreatorRevision;
} ACPI_TABLE_HEADER;
#define ACPI_OEM_ID {'I','N','T','E','L',' '}
#define ACPI_OEM_TABLE_ID 0x544244 // "TBD"
#define ACPI_OEM_REVISION 0x00000002
#define ACPI_CREATOR_ID 0x00 // TBD
#define ACPI_CREATOR_REVISION 0x00000002
//
// ACPI 2.0 Generic Address Space definition
//
typedef struct {
u8 AddressSpaceId;
u8 RegisterBitWidth;
u8 RegisterBitOffset;
u8 Reserved;
u64 Address;
} ACPI_GENERIC_ADDRESS_STRUCTURE;
//
// Generic Address Space Address IDs
//
#define ACPI_SYSTEM_MEMORY 0
#define ACPI_SYSTEM_IO 1
#define ACPI_PCI_CONFIGURATION_SPACE 2
#define ACPI_EMBEDDED_CONTROLLER 3
#define ACPI_SMBUS 4
#define ACPI_FUNCTIONAL_FIXED_HARDWARE 0x7F
//
// Root System Description Pointer Structure in ACPI 1.0
//
typedef struct {
u64 Signature;
u8 Checksum;
u8 OemId[6];
u8 Reserved;
u32 RsdtAddress;
} ACPI_1_0_RSDP;
//
// Root System Description Pointer Structure
//
typedef struct {
u64 Signature;
u8 Checksum;
u8 OemId[6];
u8 Revision;
u32 RsdtAddress;
u32 Length;
u64 XsdtAddress;
u8 ExtendedChecksum;
u8 Reserved[3];
} ACPI_2_0_RSDP;
//
// The maximum number of entrys in RSDT or XSDT
//
#define ACPI_MAX_NUM_TABLES 2
//
// Root System Description Table (RSDT)
//
typedef struct {
ACPI_TABLE_HEADER Header;
u32 Entry[ACPI_MAX_NUM_TABLES];
}ACPI_2_0_RSDT;
//
// RSDT Revision (as defined in ACPI 2.0 spec.)
//
#define ACPI_2_0_RSDT_REVISION 0x01
//
// Extended System Description Table (XSDT)
//
typedef struct _ACPI_2_0_XSDT{
ACPI_TABLE_HEADER Header;
u64 Entry[ACPI_MAX_NUM_TABLES];
}ACPI_2_0_XSDT;
#define ACPI_2_0_XSDT_REVISION 0x01
//
// Fixed ACPI Description Table Structure (FADT)
//
typedef struct {
ACPI_TABLE_HEADER Header;
u32 FirmwareCtrl;
u32 Dsdt;
u8 Reserved0;
u8 PreferredPmProfile;
u16 SciInt;
u32 SmiCmd;
u8 AcpiEnable;
u8 AcpiDisable;
u8 S4BiosReq;
u8 PstateCnt;
u32 Pm1aEvtBlk;
u32 Pm1bEvtBlk;
u32 Pm1aCntBlk;
u32 Pm1bCntBlk;
u32 Pm2CntBlk;
u32 PmTmrBlk;
u32 Gpe0Blk;
u32 Gpe1Blk;
u8 Pm1EvtLen;
u8 Pm1CntLen;
u8 Pm2CntLen;
u8 PmTmrLen;
u8 Gpe0BlkLen;
u8 Gpe1BlkLen;
u8 Gpe1Base;
u8 CstCnt;
u16 PLvl2Lat;
u16 PLvl3Lat;
u16 FlushSize;
u16 FlushStride;
u8 DutyOffset;
u8 DutyWidth;
u8 DayAlrm;
u8 MonAlrm;
u8 Century;
u16 IaPcBootArch;
u8 Reserved1;
u32 Flags;
ACPI_GENERIC_ADDRESS_STRUCTURE ResetReg;
u8 ResetValue;
u8 Reserved2[3];
u64 XFirmwareCtrl;
u64 XDsdt;
ACPI_GENERIC_ADDRESS_STRUCTURE XPm1aEvtBlk;
ACPI_GENERIC_ADDRESS_STRUCTURE XPm1bEvtBlk;
ACPI_GENERIC_ADDRESS_STRUCTURE XPm1aCntBlk;
ACPI_GENERIC_ADDRESS_STRUCTURE XPm1bCntBlk;
ACPI_GENERIC_ADDRESS_STRUCTURE XPm2CntBlk;
ACPI_GENERIC_ADDRESS_STRUCTURE XPmTmrBlk;
ACPI_GENERIC_ADDRESS_STRUCTURE XGpe0Blk;
ACPI_GENERIC_ADDRESS_STRUCTURE XGpe1Blk;
} ACPI_2_0_FADT;
#define ACPI_2_0_FADT_REVISION 0x03
//
// FADT Boot Architecture Flags
//
#define ACPI_LEGACY_DEVICES (1 << 0)
#define ACPI_8042 (1 << 1)
//
// FADT Fixed Feature Flags
//
#define ACPI_WBINVD (1 << 0)
#define ACPI_WBINVD_FLUSH (1 << 1)
#define ACPI_PROC_C1 (1 << 2)
#define ACPI_P_LVL2_UP (1 << 3)
#define ACPI_PWR_BUTTON (1 << 4)
#define ACPI_SLP_BUTTON (1 << 5)
#define ACPI_FIX_RTC (1 << 6)
#define ACPI_RTC_S4 (1 << 7)
#define ACPI_TMR_VAL_EXT (1 << 8)
#define ACPI_DCK_CAP (1 << 9)
#define ACPI_RESET_REG_SUP (1 << 10)
#define ACPI_SEALED_CASE (1 << 11)
#define ACPI_HEADLESS (1 << 12)
#define ACPI_CPU_SW_SLP (1 << 13)
//
// Firmware ACPI Control Structure (FACS)
//
typedef struct {
u32 Signature;
u32 Length;
u32 HardwareSignature;
u32 FirmwareWakingVector;
u32 GlobalLock;
u32 Flags;
u64 XFirmwareWakingVector;
u8 Version;
u8 Reserved[31];
} ACPI_2_0_FACS;
#define ACPI_2_0_FACS_VERSION 0x01
//
// Multiple APIC Description Table header definition (MADT)
//
typedef struct {
ACPI_TABLE_HEADER Header;
u32 LocalApicAddress;
u32 Flags;
} ACPI_2_0_MADT;
#define ACPI_2_0_MADT_REVISION 0x01
//
// Multiple APIC Flags
//
#define ACPI_PCAT_COMPAT (1 << 0)
//
// Multiple APIC Description Table APIC structure types
//
#define ACPI_PROCESSOR_LOCAL_APIC 0x00
#define ACPI_IO_APIC 0x01
#define ACPI_INTERRUPT_SOURCE_OVERRIDE 0x02
#define ACPI_NON_MASKABLE_INTERRUPT_SOURCE 0x03
#define ACPI_LOCAL_APIC_NMI 0x04
#define ACPI_LOCAL_APIC_ADDRESS_OVERRIDE 0x05
#define ACPI_IO_SAPIC 0x06
#define ACPI_PROCESSOR_LOCAL_SAPIC 0x07
#define ACPI_PLATFORM_INTERRUPT_SOURCES 0x08
//
// APIC Structure Definitions
//
//
// Processor Local APIC Structure Definition
//
typedef struct {
u8 Type;
u8 Length;
u8 AcpiProcessorId;
u8 ApicId;
u32 Flags;
} ACPI_LOCAL_APIC_STRUCTURE;
//
// Local APIC Flags. All other bits are reserved and must be 0.
//
#define ACPI_LOCAL_APIC_ENABLED (1 << 0)
//
// IO APIC Structure
//
typedef struct {
u8 Type;
u8 Length;
u8 IoApicId;
u8 Reserved;
u32 IoApicAddress;
u32 GlobalSystemInterruptBase;
} ACPI_IO_APIC_STRUCTURE;
// Tabel Signature
#define ACPI_2_0_RSDP_SIGNATURE 0x2052545020445352LL // "RSD PTR "
#define ACPI_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE 0x54445344 //"DSDT"
#define ACPI_2_0_FACS_SIGNATURE 0x53434146 // "FACS"
#define ACPI_2_0_FADT_SIGNATURE 0x50434146 // "FADT"
#define ACPI_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE 0x43495041 // "APIC"
#define ACPI_2_0_RSDT_SIGNATURE 0x54445352 // "RSDT"
#define ACPI_2_0_XSDT_SIGNATURE 0x54445358 // "XSDT"
#pragma pack ()
// The physical that acpi table reside in the guest BIOS
//#define ACPI_PHYSICAL_ADDRESS 0xE2000
#define ACPI_PHYSICAL_ADDRESS 0xEA000
#define ACPI_TABLE_SIZE (2*1024) //Currently 2K is enough
void
AcpiBuildTable(u8* buf);
#endif
|