2 Arm Server Base Boot Requirements ACPI table requirement validator.
4 Copyright (c) 2020, ARM Limited. All rights reserved.
5 SPDX-License-Identifier: BSD-2-Clause-Patent
8 - Sbbr or SBBR - Server Base Boot Requirements
9 - Sbsa or SBSA - Server Base System Architecture
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
18 #include <Library/DebugLib.h>
19 #include <Library/UefiLib.h>
20 #include "AcpiParser.h"
21 #include "Arm/SbbrValidator.h"
24 SBBR specification version strings
26 STATIC CONST CHAR8
*ArmSbbrVersions
[ArmSbbrVersionMax
] = {
27 "1.0", // ArmSbbrVersion_1_0
28 "1.1", // ArmSbbrVersion_1_1
29 "1.2" // ArmSbbrVersion_1_2
33 SBBR 1.0 mandatory ACPI tables
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
46 SBBR 1.1 mandatory ACPI tables
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
60 SBBR 1.2 mandatory ACPI tables
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
75 Mandatory ACPI tables for every SBBR specification version.
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
84 Data structure to track instance counts for all ACPI tables which are
85 defined as 'mandatory' in any SBBR version.
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 }
100 Reset the platform ACPI table instance count for all SBBR-mandatory tables.
104 ArmSbbrResetTableCounts (
110 for (Table
= 0; Table
< ARRAY_SIZE (ArmSbbrTableCounts
); Table
++) {
111 ArmSbbrTableCounts
[Table
].Count
= 0;
116 Increment instance count for SBBR-mandatory ACPI table with the given
119 @param [in] Signature ACPI table signature.
121 @retval TRUE Count incremented successfully.
122 @retval FALSE Table with the input signature not found.
126 ArmSbbrIncrementTableCount (
132 for (Table
= 0; Table
< ARRAY_SIZE (ArmSbbrTableCounts
); Table
++) {
133 if (Signature
== ArmSbbrTableCounts
[Table
].Signature
) {
134 ArmSbbrTableCounts
[Table
].Count
++;
143 Validate that all ACPI tables required by the given SBBR specification
144 version are installed on the platform.
146 @param [in] Version SBBR spec version to validate against.
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.
156 ArmSbbrReqsValidate (
157 ARM_SBBR_VERSION Version
162 UINT32 MandatoryTable
;
163 CONST UINT8
*SignaturePtr
;
164 BOOLEAN IsArmSbbrViolated
;
166 if (Version
>= ArmSbbrVersionMax
) {
167 return EFI_INVALID_PARAMETER
;
170 IsArmSbbrViolated
= FALSE
;
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
;
177 // Locate the instance count for the table with the given signature
179 while ((Index
< ARRAY_SIZE (ArmSbbrTableCounts
)) &&
180 (ArmSbbrTableCounts
[Index
].Signature
!= MandatoryTable
))
185 if (Index
>= ARRAY_SIZE (ArmSbbrTableCounts
)) {
186 IncrementErrorCount ();
188 L
"\nERROR: SBBR v%a: Mandatory %c%c%c%c table's instance count not " \
190 ArmSbbrVersions
[Version
],
196 return EFI_UNSUPPORTED
;
199 if (ArmSbbrTableCounts
[Index
].Count
== 0) {
200 IsArmSbbrViolated
= TRUE
;
201 IncrementErrorCount ();
203 L
"\nERROR: SBBR v%a: Mandatory %c%c%c%c table is missing",
204 ArmSbbrVersions
[Version
],
213 if (!IsArmSbbrViolated
) {
215 L
"\nINFO: SBBR v%a: All mandatory ACPI tables are installed",
216 ArmSbbrVersions
[Version
]
222 return IsArmSbbrViolated
? EFI_NOT_FOUND
: EFI_SUCCESS
;