]>
Commit | Line | Data |
---|---|---|
a6eaba4d | 1 | /** @file\r |
ee4dc24f RN |
2 | FADT table parser\r |
3 | \r | |
86da432a | 4 | Copyright (c) 2016 - 2019, ARM Limited. All rights reserved.\r |
56ba3746 | 5 | SPDX-License-Identifier: BSD-2-Clause-Patent\r |
ee4dc24f RN |
6 | \r |
7 | @par Reference(s):\r | |
8 | - ACPI 6.2 Specification - Errata A, September 2017\r | |
9 | **/\r | |
10 | \r | |
11 | #include <IndustryStandard/Acpi.h>\r | |
12 | #include <Library/UefiLib.h>\r | |
13 | #include "AcpiParser.h"\r | |
14 | #include "AcpiTableParser.h"\r | |
15 | \r | |
16 | // Local variables\r | |
17 | STATIC CONST UINT32* DsdtAddress;\r | |
18 | STATIC CONST UINT64* X_DsdtAddress;\r | |
19 | STATIC CONST UINT8* FadtMinorRevision;\r | |
20 | STATIC ACPI_DESCRIPTION_HEADER_INFO AcpiHdrInfo;\r | |
21 | \r | |
a6eaba4d DB |
22 | /**\r |
23 | A macro defining the Hardware reduced ACPI flag\r | |
24 | **/\r | |
ee4dc24f RN |
25 | #define HW_REDUCED_ACPI BIT20\r |
26 | \r | |
a6eaba4d DB |
27 | /**\r |
28 | Get the ACPI XSDT header info.\r | |
29 | **/\r | |
b6e48ec6 | 30 | CONST ACPI_DESCRIPTION_HEADER_INFO *\r |
ee4dc24f RN |
31 | EFIAPI\r |
32 | GetAcpiXsdtHeaderInfo (\r | |
33 | VOID\r | |
a6eaba4d | 34 | );\r |
ee4dc24f | 35 | \r |
a6eaba4d DB |
36 | /**\r |
37 | This function validates the Firmware Control Field.\r | |
38 | \r | |
39 | @param [in] Ptr Pointer to the start of the field data.\r | |
40 | @param [in] Context Pointer to context specific information e.g. this\r | |
41 | could be a pointer to the ACPI table header.\r | |
42 | **/\r | |
ee4dc24f RN |
43 | STATIC\r |
44 | VOID\r | |
45 | EFIAPI\r | |
46 | ValidateFirmwareCtrl (\r | |
47 | IN UINT8* Ptr,\r | |
48 | IN VOID* Context\r | |
86da432a KK |
49 | )\r |
50 | {\r | |
51 | #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)\r | |
52 | if (*(UINT32*)Ptr != 0) {\r | |
53 | IncrementErrorCount ();\r | |
54 | Print (\r | |
55 | L"\nERROR: Firmware Control must be zero for ARM platforms."\r | |
56 | );\r | |
57 | }\r | |
58 | #endif\r | |
59 | }\r | |
a6eaba4d DB |
60 | \r |
61 | /**\r | |
62 | This function validates the X_Firmware Control Field.\r | |
ee4dc24f | 63 | \r |
a6eaba4d DB |
64 | @param [in] Ptr Pointer to the start of the field data.\r |
65 | @param [in] Context Pointer to context specific information e.g. this\r | |
66 | could be a pointer to the ACPI table header.\r | |
67 | **/\r | |
ee4dc24f RN |
68 | STATIC\r |
69 | VOID\r | |
70 | EFIAPI\r | |
71 | ValidateXFirmwareCtrl (\r | |
72 | IN UINT8* Ptr,\r | |
73 | IN VOID* Context\r | |
86da432a KK |
74 | )\r |
75 | {\r | |
76 | #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)\r | |
77 | if (*(UINT64*)Ptr != 0) {\r | |
78 | IncrementErrorCount ();\r | |
79 | Print (\r | |
80 | L"\nERROR: X Firmware Control must be zero for ARM platforms."\r | |
81 | );\r | |
82 | }\r | |
83 | #endif\r | |
84 | }\r | |
ee4dc24f | 85 | \r |
a6eaba4d DB |
86 | /**\r |
87 | This function validates the flags.\r | |
88 | \r | |
89 | @param [in] Ptr Pointer to the start of the field data.\r | |
90 | @param [in] Context Pointer to context specific information e.g. this\r | |
91 | could be a pointer to the ACPI table header.\r | |
92 | **/\r | |
ee4dc24f RN |
93 | STATIC\r |
94 | VOID\r | |
95 | EFIAPI\r | |
96 | ValidateFlags (\r | |
97 | IN UINT8* Ptr,\r | |
98 | IN VOID* Context\r | |
86da432a KK |
99 | )\r |
100 | {\r | |
101 | #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)\r | |
102 | if (((*(UINT32*)Ptr) & HW_REDUCED_ACPI) == 0) {\r | |
103 | IncrementErrorCount ();\r | |
104 | Print (\r | |
105 | L"\nERROR: HW_REDUCED_ACPI flag must be set for ARM platforms."\r | |
106 | );\r | |
107 | }\r | |
108 | #endif\r | |
109 | }\r | |
ee4dc24f | 110 | \r |
a6eaba4d DB |
111 | /**\r |
112 | An ACPI_PARSER array describing the ACPI FADT Table.\r | |
113 | **/\r | |
ee4dc24f RN |
114 | STATIC CONST ACPI_PARSER FadtParser[] = {\r |
115 | PARSE_ACPI_HEADER (&AcpiHdrInfo),\r | |
116 | {L"FIRMWARE_CTRL", 4, 36, L"0x%x", NULL, NULL, ValidateFirmwareCtrl, NULL},\r | |
117 | {L"DSDT", 4, 40, L"0x%x", NULL, (VOID**)&DsdtAddress, NULL, NULL},\r | |
118 | {L"Reserved", 1, 44, L"%x", NULL, NULL, NULL, NULL},\r | |
119 | {L"Preferred_PM_Profile", 1, 45, L"0x%x", NULL, NULL, NULL, NULL},\r | |
120 | {L"SCI_INT", 2, 46, L"0x%x", NULL, NULL, NULL, NULL},\r | |
121 | {L"SMI_CMD", 4, 48, L"0x%x", NULL, NULL, NULL, NULL},\r | |
122 | {L"ACPI_ENABLE", 1, 52, L"0x%x", NULL, NULL, NULL, NULL},\r | |
123 | {L"ACPI_DISABLE", 1, 53, L"0x%x", NULL, NULL, NULL, NULL},\r | |
124 | {L"S4BIOS_REQ", 1, 54, L"0x%x", NULL, NULL, NULL, NULL},\r | |
125 | {L"PSTATE_CNT", 1, 55, L"0x%x", NULL, NULL, NULL, NULL},\r | |
126 | {L"PM1a_EVT_BLK", 4, 56, L"0x%x", NULL, NULL, NULL, NULL},\r | |
127 | {L"PM1b_EVT_BLK", 4, 60, L"0x%x", NULL, NULL, NULL, NULL},\r | |
128 | {L"PM1a_CNT_BLK", 4, 64, L"0x%x", NULL, NULL, NULL, NULL},\r | |
129 | {L"PM1b_CNT_BLK", 4, 68, L"0x%x", NULL, NULL, NULL, NULL},\r | |
130 | {L"PM2_CNT_BLK", 4, 72, L"0x%x", NULL, NULL, NULL, NULL},\r | |
131 | {L"PM_TMR_BLK", 4, 76, L"0x%x", NULL, NULL, NULL, NULL},\r | |
132 | {L"GPE0_BLK", 4, 80, L"0x%x", NULL, NULL, NULL, NULL},\r | |
133 | {L"GPE1_BLK", 4, 84, L"0x%x", NULL, NULL, NULL, NULL},\r | |
134 | {L"PM1_EVT_LEN", 1, 88, L"0x%x", NULL, NULL, NULL, NULL},\r | |
135 | {L"PM1_CNT_LEN", 1, 89, L"0x%x", NULL, NULL, NULL, NULL},\r | |
136 | {L"PM2_CNT_LEN", 1, 90, L"0x%x", NULL, NULL, NULL, NULL},\r | |
137 | {L"PM_TMR_LEN", 1, 91, L"0x%x", NULL, NULL, NULL, NULL},\r | |
138 | {L"GPE0_BLK_LEN", 1, 92, L"0x%x", NULL, NULL, NULL, NULL},\r | |
139 | {L"GPE1_BLK_LEN", 1, 93, L"0x%x", NULL, NULL, NULL, NULL},\r | |
140 | {L"GPE1_BASE", 1, 94, L"0x%x", NULL, NULL, NULL, NULL},\r | |
141 | {L"CST_CNT", 1, 95, L"0x%x", NULL, NULL, NULL, NULL},\r | |
142 | {L"P_LVL2_LAT", 2, 96, L"0x%x", NULL, NULL, NULL, NULL},\r | |
143 | {L"P_LVL3_LAT", 2, 98, L"0x%x", NULL, NULL, NULL, NULL},\r | |
144 | {L"FLUSH_SIZE", 2, 100, L"0x%x", NULL, NULL, NULL, NULL},\r | |
145 | {L"FLUSH_STRIDE", 2, 102, L"0x%x", NULL, NULL, NULL, NULL},\r | |
146 | {L"DUTY_OFFSET", 1, 104, L"0x%x", NULL, NULL, NULL, NULL},\r | |
147 | {L"DUTY_WIDTH", 1, 105, L"0x%x", NULL, NULL, NULL, NULL},\r | |
148 | {L"DAY_ALRM", 1, 106, L"0x%x", NULL, NULL, NULL, NULL},\r | |
149 | {L"MON_ALRM", 1, 107, L"0x%x", NULL, NULL, NULL, NULL},\r | |
150 | {L"CENTURY", 1, 108, L"0x%x", NULL, NULL, NULL, NULL},\r | |
151 | {L"IAPC_BOOT_ARCH", 2, 109, L"0x%x", NULL, NULL, NULL, NULL},\r | |
152 | {L"Reserved", 1, 111, L"0x%x", NULL, NULL, NULL, NULL},\r | |
153 | {L"Flags", 4, 112, L"0x%x", NULL, NULL, ValidateFlags, NULL},\r | |
154 | {L"RESET_REG", 12, 116, NULL, DumpGas, NULL, NULL, NULL},\r | |
155 | {L"RESET_VALUE", 1, 128, L"0x%x", NULL, NULL, NULL, NULL},\r | |
156 | {L"ARM_BOOT_ARCH", 2, 129, L"0x%x", NULL, NULL, NULL, NULL},\r | |
157 | {L"FADT Minor Version", 1, 131, L"0x%x", NULL, (VOID**)&FadtMinorRevision,\r | |
158 | NULL, NULL},\r | |
159 | {L"X_FIRMWARE_CTRL", 8, 132, L"0x%lx", NULL, NULL,\r | |
160 | ValidateXFirmwareCtrl, NULL},\r | |
161 | {L"X_DSDT", 8, 140, L"0x%lx", NULL, (VOID**)&X_DsdtAddress, NULL, NULL},\r | |
162 | {L"X_PM1a_EVT_BLK", 12, 148, NULL, DumpGas, NULL, NULL, NULL},\r | |
163 | {L"X_PM1b_EVT_BLK", 12, 160, NULL, DumpGas, NULL, NULL, NULL},\r | |
164 | {L"X_PM1a_CNT_BLK", 12, 172, NULL, DumpGas, NULL, NULL, NULL},\r | |
165 | {L"X_PM1b_CNT_BLK", 12, 184, NULL, DumpGas, NULL, NULL, NULL},\r | |
166 | {L"X_PM2_CNT_BLK", 12, 196, NULL, DumpGas, NULL, NULL, NULL},\r | |
167 | {L"X_PM_TMR_BLK", 12, 208, NULL, DumpGas, NULL, NULL, NULL},\r | |
168 | {L"X_GPE0_BLK", 12, 220, NULL, DumpGas, NULL, NULL, NULL},\r | |
169 | {L"X_GPE1_BLK", 12, 232, NULL, DumpGas, NULL, NULL, NULL},\r | |
170 | {L"SLEEP_CONTROL_REG", 12, 244, NULL, DumpGas, NULL, NULL, NULL},\r | |
171 | {L"SLEEP_STATUS_REG", 12, 256, NULL, DumpGas, NULL, NULL, NULL},\r | |
172 | {L"Hypervisor VendorIdentity", 8, 268, L"%lx", NULL, NULL, NULL, NULL}\r | |
173 | };\r | |
174 | \r | |
a6eaba4d DB |
175 | /**\r |
176 | This function parses the ACPI FADT table.\r | |
177 | This function parses the FADT table and optionally traces the ACPI table fields.\r | |
ee4dc24f RN |
178 | \r |
179 | This function also performs validation of the ACPI table fields.\r | |
180 | \r | |
181 | @param [in] Trace If TRUE, trace the ACPI fields.\r | |
182 | @param [in] Ptr Pointer to the start of the buffer.\r | |
183 | @param [in] AcpiTableLength Length of the ACPI table.\r | |
184 | @param [in] AcpiTableRevision Revision of the ACPI table.\r | |
a6eaba4d | 185 | **/\r |
ee4dc24f RN |
186 | VOID\r |
187 | EFIAPI\r | |
188 | ParseAcpiFadt (\r | |
189 | IN BOOLEAN Trace,\r | |
190 | IN UINT8* Ptr,\r | |
191 | IN UINT32 AcpiTableLength,\r | |
192 | IN UINT8 AcpiTableRevision\r | |
193 | )\r | |
194 | {\r | |
195 | UINT8* DsdtPtr;\r | |
196 | \r | |
197 | ParseAcpi (\r | |
198 | Trace,\r | |
199 | 0,\r | |
200 | "FADT",\r | |
201 | Ptr,\r | |
202 | AcpiTableLength,\r | |
203 | PARSER_PARAMS (FadtParser)\r | |
204 | );\r | |
205 | \r | |
206 | if (Trace) {\r | |
207 | Print (L"\nSummary:\n");\r | |
208 | PrintFieldName (2, L"FADT Version");\r | |
209 | Print (L"%d.%d\n", *AcpiHdrInfo.Revision, *FadtMinorRevision);\r | |
210 | \r | |
211 | if (*GetAcpiXsdtHeaderInfo ()->OemTableId != *AcpiHdrInfo.OemTableId) {\r | |
212 | IncrementErrorCount ();\r | |
213 | Print (L"ERROR: OEM Table Id does not match with RSDT/XSDT.\n");\r | |
214 | }\r | |
215 | }\r | |
216 | \r | |
217 | // If X_DSDT is not zero then use X_DSDT and ignore DSDT,\r | |
218 | // else use DSDT.\r | |
219 | if (*X_DsdtAddress != 0) {\r | |
220 | DsdtPtr = (UINT8*)(UINTN)(*X_DsdtAddress);\r | |
221 | } else if (*DsdtAddress != 0) {\r | |
222 | DsdtPtr = (UINT8*)(UINTN)(*DsdtAddress);\r | |
223 | } else {\r | |
224 | // Both DSDT and X_DSDT cannot be zero.\r | |
225 | #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)\r | |
226 | if (Trace) {\r | |
227 | // The DSDT Table is mandatory for ARM systems\r | |
228 | // as the CPU information MUST be presented in\r | |
229 | // the DSDT.\r | |
230 | IncrementErrorCount ();\r | |
231 | Print (L"ERROR: Both X_DSDT and DSDT are NULL.\n");\r | |
232 | }\r | |
233 | #endif\r | |
234 | return;\r | |
235 | }\r | |
236 | \r | |
237 | ProcessAcpiTable (DsdtPtr);\r | |
238 | }\r |