SbbrValidator.c 7.4 KB

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