]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellAcpiViewCommandLib/Arm/SbbrValidator.c
ShellPkg: Apply uncrustify changes
[mirror_edk2.git] / ShellPkg / Library / UefiShellAcpiViewCommandLib / Arm / SbbrValidator.c
CommitLineData
f793bfca
KK
1/** @file\r
2 Arm Server Base Boot Requirements ACPI table requirement validator.\r
3\r
4 Copyright (c) 2020, ARM Limited. All rights reserved.\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
7 @par Glossary:\r
8 - Sbbr or SBBR - Server Base Boot Requirements\r
9 - Sbsa or SBSA - Server Base System Architecture\r
10\r
11 @par Reference(s):\r
12 - Arm Server Base Boot Requirements 1.2, September 2019\r
13 - Arm Server Base Boot Requirements 1.1, May 2018\r
14 - Arm Server Base Boot Requirements 1.0, March 2016\r
15 - Arm Server Base System Architecture 6.0\r
16**/\r
17\r
18#include <Library/DebugLib.h>\r
19#include <Library/UefiLib.h>\r
20#include "AcpiParser.h"\r
21#include "Arm/SbbrValidator.h"\r
22\r
23/**\r
24 SBBR specification version strings\r
25**/\r
47d20b54 26STATIC CONST CHAR8 *ArmSbbrVersions[ArmSbbrVersionMax] = {\r
f793bfca
KK
27 "1.0", // ArmSbbrVersion_1_0\r
28 "1.1", // ArmSbbrVersion_1_1\r
29 "1.2" // ArmSbbrVersion_1_2\r
30};\r
31\r
32/**\r
33 SBBR 1.0 mandatory ACPI tables\r
34**/\r
47d20b54 35STATIC CONST UINT32 ArmSbbr10Mandatory[] = {\r
f793bfca
KK
36 EFI_ACPI_6_3_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,\r
37 EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,\r
38 EFI_ACPI_6_3_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,\r
39 EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,\r
40 EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,\r
41 EFI_ACPI_6_3_DEBUG_PORT_2_TABLE_SIGNATURE,\r
42 EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE\r
43};\r
44\r
45/**\r
46 SBBR 1.1 mandatory ACPI tables\r
47**/\r
47d20b54 48STATIC CONST UINT32 ArmSbbr11Mandatory[] = {\r
f793bfca
KK
49 EFI_ACPI_6_3_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,\r
50 EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,\r
51 EFI_ACPI_6_3_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,\r
52 EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,\r
53 EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,\r
54 EFI_ACPI_6_3_DEBUG_PORT_2_TABLE_SIGNATURE,\r
55 EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,\r
56 EFI_ACPI_6_3_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE\r
57};\r
58\r
59/**\r
60 SBBR 1.2 mandatory ACPI tables\r
61**/\r
47d20b54 62STATIC CONST UINT32 ArmSbbr12Mandatory[] = {\r
f793bfca
KK
63 EFI_ACPI_6_3_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,\r
64 EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,\r
65 EFI_ACPI_6_3_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,\r
66 EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,\r
67 EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,\r
68 EFI_ACPI_6_3_DEBUG_PORT_2_TABLE_SIGNATURE,\r
69 EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,\r
70 EFI_ACPI_6_3_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE,\r
71 EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE\r
72};\r
73\r
74/**\r
75 Mandatory ACPI tables for every SBBR specification version.\r
76**/\r
47d20b54 77STATIC CONST ACPI_SBBR_REQ ArmSbbrReqs[ArmSbbrVersionMax] = {\r
f793bfca
KK
78 { ArmSbbr10Mandatory, ARRAY_SIZE (ArmSbbr10Mandatory) }, // SBBR v1.0\r
79 { ArmSbbr11Mandatory, ARRAY_SIZE (ArmSbbr11Mandatory) }, // SBBR v1.1\r
80 { ArmSbbr12Mandatory, ARRAY_SIZE (ArmSbbr12Mandatory) } // SBBR v1.2\r
81};\r
82\r
83/**\r
84 Data structure to track instance counts for all ACPI tables which are\r
85 defined as 'mandatory' in any SBBR version.\r
86**/\r
47d20b54
MK
87STATIC ACPI_TABLE_COUNTER ArmSbbrTableCounts[] = {\r
88 { EFI_ACPI_6_3_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, 0 },\r
89 { EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, 0 },\r
90 { EFI_ACPI_6_3_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, 0 },\r
91 { EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, 0 },\r
92 { EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, 0 },\r
93 { EFI_ACPI_6_3_DEBUG_PORT_2_TABLE_SIGNATURE, 0 },\r
94 { EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, 0 },\r
95 { EFI_ACPI_6_3_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE, 0 },\r
96 { EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE, 0 }\r
f793bfca
KK
97};\r
98\r
99/**\r
100 Reset the platform ACPI table instance count for all SBBR-mandatory tables.\r
101**/\r
102VOID\r
103EFIAPI\r
104ArmSbbrResetTableCounts (\r
105 VOID\r
106 )\r
107{\r
47d20b54 108 UINT32 Table;\r
f793bfca
KK
109\r
110 for (Table = 0; Table < ARRAY_SIZE (ArmSbbrTableCounts); Table++) {\r
111 ArmSbbrTableCounts[Table].Count = 0;\r
112 }\r
113}\r
114\r
115/**\r
116 Increment instance count for SBBR-mandatory ACPI table with the given\r
117 signature.\r
118\r
119 @param [in] Signature ACPI table signature.\r
120\r
121 @retval TRUE Count incremented successfully.\r
122 @retval FALSE Table with the input signature not found.\r
123**/\r
124BOOLEAN\r
125EFIAPI\r
126ArmSbbrIncrementTableCount (\r
47d20b54 127 UINT32 Signature\r
f793bfca
KK
128 )\r
129{\r
47d20b54 130 UINT32 Table;\r
f793bfca
KK
131\r
132 for (Table = 0; Table < ARRAY_SIZE (ArmSbbrTableCounts); Table++) {\r
133 if (Signature == ArmSbbrTableCounts[Table].Signature) {\r
134 ArmSbbrTableCounts[Table].Count++;\r
135 return TRUE;\r
136 }\r
137 }\r
138\r
139 return FALSE;\r
140}\r
141\r
142/**\r
143 Validate that all ACPI tables required by the given SBBR specification\r
144 version are installed on the platform.\r
145\r
146 @param [in] Version SBBR spec version to validate against.\r
147\r
148 @retval EFI_SUCCESS All required tables are present.\r
149 @retval EFI_INVALID_PARAMETER Invalid SBBR version.\r
150 @retval EFI_NOT_FOUND One or more mandatory tables are missing.\r
151 @retval EFI_UNSUPPORTED Mandatory ACPI table does not have its\r
152 instance count tracked.\r
153**/\r
154EFI_STATUS\r
155EFIAPI\r
156ArmSbbrReqsValidate (\r
47d20b54 157 ARM_SBBR_VERSION Version\r
f793bfca
KK
158 )\r
159{\r
47d20b54
MK
160 UINT32 Table;\r
161 UINT32 Index;\r
162 UINT32 MandatoryTable;\r
163 CONST UINT8 *SignaturePtr;\r
164 BOOLEAN IsArmSbbrViolated;\r
f793bfca
KK
165\r
166 if (Version >= ArmSbbrVersionMax) {\r
167 return EFI_INVALID_PARAMETER;\r
168 }\r
169\r
170 IsArmSbbrViolated = FALSE;\r
171\r
172 // Go through the list of mandatory tables for the input SBBR version\r
173 for (Table = 0; Table < ArmSbbrReqs[Version].TableCount; Table++) {\r
174 MandatoryTable = ArmSbbrReqs[Version].Tables[Table];\r
47d20b54 175 SignaturePtr = (CONST UINT8 *)(UINTN)&MandatoryTable;\r
f793bfca
KK
176\r
177 // Locate the instance count for the table with the given signature\r
178 Index = 0;\r
179 while ((Index < ARRAY_SIZE (ArmSbbrTableCounts)) &&\r
47d20b54
MK
180 (ArmSbbrTableCounts[Index].Signature != MandatoryTable))\r
181 {\r
f793bfca
KK
182 Index++;\r
183 }\r
184\r
185 if (Index >= ARRAY_SIZE (ArmSbbrTableCounts)) {\r
186 IncrementErrorCount ();\r
187 Print (\r
188 L"\nERROR: SBBR v%a: Mandatory %c%c%c%c table's instance count not " \\r
47d20b54 189 L"found\n",\r
f793bfca
KK
190 ArmSbbrVersions[Version],\r
191 SignaturePtr[0],\r
192 SignaturePtr[1],\r
193 SignaturePtr[2],\r
194 SignaturePtr[3]\r
195 );\r
196 return EFI_UNSUPPORTED;\r
197 }\r
198\r
199 if (ArmSbbrTableCounts[Index].Count == 0) {\r
200 IsArmSbbrViolated = TRUE;\r
201 IncrementErrorCount ();\r
202 Print (\r
203 L"\nERROR: SBBR v%a: Mandatory %c%c%c%c table is missing",\r
204 ArmSbbrVersions[Version],\r
205 SignaturePtr[0],\r
206 SignaturePtr[1],\r
207 SignaturePtr[2],\r
208 SignaturePtr[3]\r
209 );\r
210 }\r
211 }\r
212\r
213 if (!IsArmSbbrViolated) {\r
214 Print (\r
215 L"\nINFO: SBBR v%a: All mandatory ACPI tables are installed",\r
216 ArmSbbrVersions[Version]\r
217 );\r
218 }\r
219\r
220 Print (L"\n");\r
221\r
222 return IsArmSbbrViolated ? EFI_NOT_FOUND : EFI_SUCCESS;\r
223}\r