]>
Commit | Line | Data |
---|---|---|
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 | 26 | STATIC 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 | 35 | STATIC 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 | 48 | STATIC 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 | 62 | STATIC 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 | 77 | STATIC 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 |
87 | STATIC 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 | |
102 | VOID\r | |
103 | EFIAPI\r | |
104 | ArmSbbrResetTableCounts (\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 | |
124 | BOOLEAN\r | |
125 | EFIAPI\r | |
126 | ArmSbbrIncrementTableCount (\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 | |
154 | EFI_STATUS\r | |
155 | EFIAPI\r | |
156 | ArmSbbrReqsValidate (\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 |