]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Fadt/FadtParser.c
ShellPkg: acpiview: FADT: Remove redundant forward declarations
[mirror_edk2.git] / ShellPkg / Library / UefiShellAcpiViewCommandLib / Parsers / Fadt / FadtParser.c
CommitLineData
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
17STATIC CONST UINT32* DsdtAddress;\r
18STATIC CONST UINT64* X_DsdtAddress;\r
19STATIC CONST UINT8* FadtMinorRevision;\r
20STATIC 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 30CONST ACPI_DESCRIPTION_HEADER_INFO *\r
ee4dc24f
RN
31EFIAPI\r
32GetAcpiXsdtHeaderInfo (\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
43STATIC\r
44VOID\r
45EFIAPI\r
46ValidateFirmwareCtrl (\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
68STATIC\r
69VOID\r
70EFIAPI\r
71ValidateXFirmwareCtrl (\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
93STATIC\r
94VOID\r
95EFIAPI\r
96ValidateFlags (\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
114STATIC 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
186VOID\r
187EFIAPI\r
188ParseAcpiFadt (\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