[PATCH v1 4/6] DynamicTablesPkg: DynamicTableManagerDxe: Added check for installed tables


Kun Qin
 

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3997

This change added an extra step to allow check for installed ACPI tables.

For FADT, MADT, GTDT, DSDT and DBG2 tables, either pre-installed or
supplied through AcpiTableInfo can be accepted.

An extra check for FADT ACPI table existence during installation step is
also added.

Cc: Sami Mujawar <Sami.Mujawar@...>
Cc: Alexei Fedorov <Alexei.Fedorov@...>

Co-authored-by: Joe Lopez <joelopez@...>
Signed-off-by: Kun Qin <kuqin12@...>
---
DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c =
| 200 ++++++++++++++++----
DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf=
| 1 +
2 files changed, 167 insertions(+), 34 deletions(-)

diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableMa=
nagerDxe.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableMa=
nagerDxe.c
index ed62299f9bbd..ac5fe0bed91b 100644
--- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDx=
e.c
+++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDx=
e.c
@@ -11,6 +11,7 @@
#include <Library/PcdLib.h>=0D
#include <Library/UefiBootServicesTableLib.h>=0D
#include <Protocol/AcpiTable.h>=0D
+#include <Protocol/AcpiSystemDescriptionTable.h>=0D
=0D
// Module specific include files.=0D
#include <AcpiTableGenerator.h>=0D
@@ -387,6 +388,57 @@ BuildAndInstallAcpiTable (
return Status;=0D
}=0D
=0D
+/**=0D
+ This function uses the ACPI SDT protocol to locate an ACPI table.=0D
+ It is really only useful for finding tables that only have a single inst=
ance,=0D
+ e.g. FADT, FACS, MADT, etc. It is not good for locating SSDT, etc.=0D
+=0D
+ @param[in] Signature - Pointer to an ASCII string containing t=
he OEM Table ID from the ACPI table header=0D
+ @param[in, out] Table - Updated with a pointer to the table=0D
+ @param[in, out] Handle - AcpiSupport protocol table handle for t=
he table found=0D
+=0D
+ @retval EFI_SUCCESS - The function completed successfully.=0D
+**/=0D
+STATIC=0D
+EFI_STATUS=0D
+LocateAcpiTableBySignature (=0D
+ IN UINT32 Signature,=0D
+ IN OUT EFI_ACPI_DESCRIPTION_HEADER **Table,=0D
+ IN OUT UINTN *Handle=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+ INTN Index;=0D
+ EFI_ACPI_TABLE_VERSION Version;=0D
+ EFI_ACPI_SDT_PROTOCOL *AcpiSdt;=0D
+=0D
+ AcpiSdt =3D NULL;=0D
+ Status =3D gBS->LocateProtocol (&gEfiAcpiSdtProtocolGuid, NULL, (VOID *=
*)&AcpiSdt);=0D
+=0D
+ if (EFI_ERROR (Status) || (AcpiSdt =3D=3D NULL)) {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ //=0D
+ // Locate table with matching ID=0D
+ //=0D
+ Version =3D 0;=0D
+ Index =3D 0;=0D
+ do {=0D
+ Status =3D AcpiSdt->GetAcpiTable (Index, (EFI_ACPI_SDT_HEADER **)Table=
, &Version, Handle);=0D
+ if (EFI_ERROR (Status)) {=0D
+ break;=0D
+ }=0D
+=0D
+ Index++;=0D
+ } while ((*Table)->Signature !=3D Signature);=0D
+=0D
+ //=0D
+ // If we found the table, there will be no error.=0D
+ //=0D
+ return Status;=0D
+}=0D
+=0D
/** The function checks if the Configuration Manager has provided the=0D
mandatory ACPI tables for installation.=0D
=0D
@@ -411,6 +463,9 @@ VerifyMandatoryTablesArePresent (
BOOLEAN DsdtFound;=0D
BOOLEAN Dbg2Found;=0D
BOOLEAN SpcrFound;=0D
+ UINTN Handle;=0D
+=0D
+ EFI_ACPI_DESCRIPTION_HEADER *DummyHeader;=0D
=0D
Status =3D EFI_SUCCESS;=0D
FadtFound =3D FALSE;=0D
@@ -447,32 +502,99 @@ VerifyMandatoryTablesArePresent (
}=0D
=0D
// We need at least the FADT, MADT, GTDT and the DSDT tables to boot=0D
- if (!FadtFound) {=0D
- DEBUG ((DEBUG_ERROR, "ERROR: FADT Table not found\n"));=0D
+ // But they also might be published already, so we can search from there=
=0D
+ Handle =3D 0;=0D
+ Status =3D LocateAcpiTableBySignature (=0D
+ EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,=0D
+ &DummyHeader,=0D
+ &Handle=0D
+ );=0D
+ if (EFI_ERROR (Status) && !FadtFound) {=0D
+ DEBUG ((DEBUG_ERROR, "ERROR: FADT Table not found.\n"));=0D
Status =3D EFI_NOT_FOUND;=0D
+ } else if (!EFI_ERROR (Status) && FadtFound) {=0D
+ DEBUG ((DEBUG_ERROR, "ERROR: FADT Table found while already published.=
\n"));=0D
+ Status =3D EFI_ALREADY_STARTED;=0D
+ } else {=0D
+ FadtFound =3D TRUE;=0D
}=0D
=0D
- if (!MadtFound) {=0D
+ Handle =3D 0;=0D
+ Status =3D LocateAcpiTableBySignature (=0D
+ EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,=0D
+ &DummyHeader,=0D
+ &Handle=0D
+ );=0D
+ if (EFI_ERROR (Status) && !MadtFound) {=0D
DEBUG ((DEBUG_ERROR, "ERROR: MADT Table not found.\n"));=0D
Status =3D EFI_NOT_FOUND;=0D
+ } else if (!EFI_ERROR (Status) && MadtFound) {=0D
+ DEBUG ((DEBUG_ERROR, "ERROR: MADT Table found while already published.=
\n"));=0D
+ Status =3D EFI_ALREADY_STARTED;=0D
+ } else {=0D
+ MadtFound =3D TRUE;=0D
}=0D
=0D
- if (!GtdtFound) {=0D
+ Handle =3D 0;=0D
+ Status =3D LocateAcpiTableBySignature (=0D
+ EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,=0D
+ &DummyHeader,=0D
+ &Handle=0D
+ );=0D
+ if (EFI_ERROR (Status) && !GtdtFound) {=0D
DEBUG ((DEBUG_ERROR, "ERROR: GTDT Table not found.\n"));=0D
Status =3D EFI_NOT_FOUND;=0D
+ } else if (!EFI_ERROR (Status) && GtdtFound) {=0D
+ DEBUG ((DEBUG_ERROR, "ERROR: GTDT Table found while already published.=
\n"));=0D
+ Status =3D EFI_ALREADY_STARTED;=0D
+ } else {=0D
+ GtdtFound =3D TRUE;=0D
}=0D
=0D
- if (!DsdtFound) {=0D
+ Handle =3D 0;=0D
+ Status =3D LocateAcpiTableBySignature (=0D
+ EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATUR=
E,=0D
+ &DummyHeader,=0D
+ &Handle=0D
+ );=0D
+ if (EFI_ERROR (Status) && !DsdtFound) {=0D
DEBUG ((DEBUG_ERROR, "ERROR: DSDT Table not found.\n"));=0D
Status =3D EFI_NOT_FOUND;=0D
+ } else if (!EFI_ERROR (Status) && DsdtFound) {=0D
+ DEBUG ((DEBUG_ERROR, "ERROR: DSDT Table found while already published.=
\n"));=0D
+ Status =3D EFI_ALREADY_STARTED;=0D
+ } else {=0D
+ DsdtFound =3D TRUE;=0D
}=0D
=0D
- if (!Dbg2Found) {=0D
+ Handle =3D 0;=0D
+ Status =3D LocateAcpiTableBySignature (=0D
+ EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE,=0D
+ &DummyHeader,=0D
+ &Handle=0D
+ );=0D
+ if (EFI_ERROR (Status) && !Dbg2Found) {=0D
DEBUG ((DEBUG_WARN, "WARNING: DBG2 Table not found.\n"));=0D
+ } else if (!EFI_ERROR (Status) && Dbg2Found) {=0D
+ DEBUG ((DEBUG_ERROR, "ERROR: DBG2 Table found while already published.=
\n"));=0D
+ Status =3D EFI_ALREADY_STARTED;=0D
+ } else {=0D
+ Dbg2Found =3D TRUE;=0D
}=0D
=0D
- if (!SpcrFound) {=0D
+ Handle =3D 0;=0D
+ Status =3D LocateAcpiTableBySignature (=0D
+ EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,=
=0D
+ &DummyHeader,=0D
+ &Handle=0D
+ );=0D
+ if (EFI_ERROR (Status) && !SpcrFound) {=0D
DEBUG ((DEBUG_WARN, "WARNING: SPCR Table not found.\n"));=0D
+ } else if (!EFI_ERROR (Status) && SpcrFound) {=0D
+ DEBUG ((DEBUG_ERROR, "ERROR: SPCR Table found while already published.=
\n"));=0D
+ Status =3D EFI_ALREADY_STARTED;=0D
+ } else {=0D
+ SpcrFound =3D TRUE;=0D
}=0D
=0D
return Status;=0D
@@ -500,11 +622,13 @@ ProcessAcpiTables (
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol=0D
)=0D
{=0D
- EFI_STATUS Status;=0D
- EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol;=0D
- CM_STD_OBJ_ACPI_TABLE_INFO *AcpiTableInfo;=0D
- UINT32 AcpiTableCount;=0D
- UINT32 Idx;=0D
+ EFI_STATUS Status;=0D
+ EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol;=0D
+ CM_STD_OBJ_ACPI_TABLE_INFO *AcpiTableInfo;=0D
+ UINT32 AcpiTableCount;=0D
+ UINT32 Idx;=0D
+ UINTN Handle;=0D
+ EFI_ACPI_DESCRIPTION_HEADER *DummyHeader;=0D
=0D
ASSERT (TableFactoryProtocol !=3D NULL);=0D
ASSERT (CfgMgrProtocol !=3D NULL);=0D
@@ -570,29 +694,37 @@ ProcessAcpiTables (
}=0D
=0D
// Add the FADT Table first.=0D
- for (Idx =3D 0; Idx < AcpiTableCount; Idx++) {=0D
- if (CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt) =3D=3D=0D
- AcpiTableInfo[Idx].TableGeneratorId)=0D
- {=0D
- Status =3D BuildAndInstallAcpiTable (=0D
- TableFactoryProtocol,=0D
- CfgMgrProtocol,=0D
- AcpiTableProtocol,=0D
- &AcpiTableInfo[Idx]=0D
- );=0D
- if (EFI_ERROR (Status)) {=0D
- DEBUG ((=0D
- DEBUG_ERROR,=0D
- "ERROR: Failed to find build and install ACPI FADT Table." \=0D
- " Status =3D %r\n",=0D
- Status=0D
- ));=0D
- return Status;=0D
+ Status =3D LocateAcpiTableBySignature (=0D
+ EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,=0D
+ &DummyHeader,=0D
+ &Handle=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ // FADT is not yet installed=0D
+ for (Idx =3D 0; Idx < AcpiTableCount; Idx++) {=0D
+ if (CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt) =3D=3D=0D
+ AcpiTableInfo[Idx].TableGeneratorId)=0D
+ {=0D
+ Status =3D BuildAndInstallAcpiTable (=0D
+ TableFactoryProtocol,=0D
+ CfgMgrProtocol,=0D
+ AcpiTableProtocol,=0D
+ &AcpiTableInfo[Idx]=0D
+ );=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((=0D
+ DEBUG_ERROR,=0D
+ "ERROR: Failed to find build and install ACPI FADT Table." \=0D
+ " Status =3D %r\n",=0D
+ Status=0D
+ ));=0D
+ return Status;=0D
+ }=0D
+=0D
+ break;=0D
}=0D
-=0D
- break;=0D
- }=0D
- } // for=0D
+ } // for=0D
+ }=0D
=0D
// Add remaining ACPI Tables=0D
for (Idx =3D 0; Idx < AcpiTableCount; Idx++) {=0D
diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableMa=
nagerDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTable=
ManagerDxe.inf
index 028c3d413cf8..5ca98c8b4895 100644
--- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDx=
e.inf
+++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDx=
e.inf
@@ -36,6 +36,7 @@ [LibraryClasses]
=0D
[Protocols]=0D
gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED=
=0D
+ gEfiAcpiSdtProtocolGuid # PROTOCOL ALWAYS_CONSUMED=
=0D
=0D
gEdkiiConfigurationManagerProtocolGuid # PROTOCOL ALWAYS_CONSUMED=
=0D
gEdkiiDynamicTableFactoryProtocolGuid # PROTOCOL ALWAYS_CONSUMED=
=0D
--=20
2.36.0.windows.1

Join devel@edk2.groups.io to automatically receive all group messages.