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