From nobody Sat Feb 7 07:11:57 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+91501+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+91501+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1658190348; cv=none; d=zohomail.com; s=zohoarc; b=MqZjLh0uHu+zmS7NccbaxHSPJjRA4+ADeuM6mr+o1aMKJh7h/nnknVevwgf9GZr8dtEgFaYLtpeX2rlW/caVWP4T3cb/pNTM005m/cBTwJVJGISrIeIyaGeBsAI/V+f30xgiB4vrCj5x1/4kemnh4DHlLb33wtGaTTCM1DeHNUY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1658190348; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=NIt3Ik/Sh6SwOPvy2GsYuUAgBg70XqF9Hn2b2mw1aSg=; b=gWVrxHBHYRvTVhILNg99xcv62qWk4Eq2qw2UKFXwoFoR05zF3ZW9+Zdft6rRREjGR84P1x6ZNHYblMU8Nksh8726DuH+K5+4MpOQUmlVX9OcOB/m2wpl9I3o/agJDidguDsvyzdn3MtV18AyATclSlSX2OMRlCsfjw5D96shFvU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+91501+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1658190348989765.2742781710114; Mon, 18 Jul 2022 17:25:48 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id NRarYY1788612xMmqKGzkCYF; Mon, 18 Jul 2022 17:25:48 -0700 X-Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) by mx.groups.io with SMTP id smtpd.web12.35076.1658190348020729694 for ; Mon, 18 Jul 2022 17:25:48 -0700 X-Received: by mail-pf1-f176.google.com with SMTP id g126so12116313pfb.3 for ; Mon, 18 Jul 2022 17:25:47 -0700 (PDT) X-Gm-Message-State: AWff46VAA4GgeanoEcxnIaIyx1787277AA= X-Google-Smtp-Source: AGRyM1tsZ8XlnL1YJXMu9jAJzDwD38pMBHRN+9/0g3Th8LX6nOEYE4bcOHfXixU9IcLygf6xvwx/bQ== X-Received: by 2002:a05:6a00:188e:b0:52a:af7f:e715 with SMTP id x14-20020a056a00188e00b0052aaf7fe715mr30622482pfh.2.1658190347304; Mon, 18 Jul 2022 17:25:47 -0700 (PDT) X-Received: from MININT-0U7P5GU.redmond.corp.microsoft.com ([2001:4898:80e8:9:6532:8264:ce7d:ced]) by smtp.gmail.com with ESMTPSA id n10-20020aa7984a000000b005251c6fbd0csm9941521pfq.29.2022.07.18.17.25.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Jul 2022 17:25:47 -0700 (PDT) From: "Kun Qin" To: devel@edk2.groups.io Cc: Sami Mujawar , Alexei Fedorov , Joe Lopez Subject: [edk2-devel] [PATCH v1 4/6] DynamicTablesPkg: DynamicTableManagerDxe: Added check for installed tables Date: Mon, 18 Jul 2022 17:22:52 -0700 Message-Id: <20220719002254.1891-5-kuqin12@gmail.com> In-Reply-To: <20220719002254.1891-1-kuqin12@gmail.com> References: <20220719002254.1891-1-kuqin12@gmail.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,kuqin12@gmail.com Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1658190348; bh=cOh5uMEByIa2Ykemtvbf1h+YVU1Lctc8I3cQKvdNy0w=; h=Cc:Date:From:Reply-To:Subject:To; b=wFZ5nehKXQTME5VyAwOMYLFEq9RDSk7gJzgNFgEDU10JoIYd4Z+GZhb43J5Ibwk9+on GvlE1/DVUoxNlB1+hAlOPGtwYvOENA1Fi7EvA21mSiL0SivGRpabRg9CwzILidaaq0KDl GeFTbLTeLDCkkGR8MVmdt7rcEko2cOEjeJM= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1658190349253100014 Content-Type: text/plain; charset="utf-8" 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 Cc: Alexei Fedorov Co-authored-by: Joe Lopez Signed-off-by: Kun Qin Reviewed-by: Sami Mujawar --- 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 #include #include +#include =20 // Module specific include files. #include @@ -387,6 +388,57 @@ BuildAndInstallAcpiTable ( return Status; } =20 +/** + This function uses the ACPI SDT protocol to locate an ACPI table. + It is really only useful for finding tables that only have a single inst= ance, + e.g. FADT, FACS, MADT, etc. It is not good for locating SSDT, etc. + + @param[in] Signature - Pointer to an ASCII string containing t= he OEM Table ID from the ACPI table header + @param[in, out] Table - Updated with a pointer to the table + @param[in, out] Handle - AcpiSupport protocol table handle for t= he table found + + @retval EFI_SUCCESS - The function completed successfully. +**/ +STATIC +EFI_STATUS +LocateAcpiTableBySignature ( + IN UINT32 Signature, + IN OUT EFI_ACPI_DESCRIPTION_HEADER **Table, + IN OUT UINTN *Handle + ) +{ + EFI_STATUS Status; + INTN Index; + EFI_ACPI_TABLE_VERSION Version; + EFI_ACPI_SDT_PROTOCOL *AcpiSdt; + + AcpiSdt =3D NULL; + Status =3D gBS->LocateProtocol (&gEfiAcpiSdtProtocolGuid, NULL, (VOID *= *)&AcpiSdt); + + if (EFI_ERROR (Status) || (AcpiSdt =3D=3D NULL)) { + return EFI_NOT_FOUND; + } + + // + // Locate table with matching ID + // + Version =3D 0; + Index =3D 0; + do { + Status =3D AcpiSdt->GetAcpiTable (Index, (EFI_ACPI_SDT_HEADER **)Table= , &Version, Handle); + if (EFI_ERROR (Status)) { + break; + } + + Index++; + } while ((*Table)->Signature !=3D Signature); + + // + // If we found the table, there will be no error. + // + return Status; +} + /** The function checks if the Configuration Manager has provided the mandatory ACPI tables for installation. =20 @@ -411,6 +463,9 @@ VerifyMandatoryTablesArePresent ( BOOLEAN DsdtFound; BOOLEAN Dbg2Found; BOOLEAN SpcrFound; + UINTN Handle; + + EFI_ACPI_DESCRIPTION_HEADER *DummyHeader; =20 Status =3D EFI_SUCCESS; FadtFound =3D FALSE; @@ -447,32 +502,99 @@ VerifyMandatoryTablesArePresent ( } =20 // We need at least the FADT, MADT, GTDT and the DSDT tables to boot - if (!FadtFound) { - DEBUG ((DEBUG_ERROR, "ERROR: FADT Table not found\n")); + // But they also might be published already, so we can search from there + Handle =3D 0; + Status =3D LocateAcpiTableBySignature ( + EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, + &DummyHeader, + &Handle + ); + if (EFI_ERROR (Status) && !FadtFound) { + DEBUG ((DEBUG_ERROR, "ERROR: FADT Table not found.\n")); Status =3D EFI_NOT_FOUND; + } else if (!EFI_ERROR (Status) && FadtFound) { + DEBUG ((DEBUG_ERROR, "ERROR: FADT Table found while already published.= \n")); + Status =3D EFI_ALREADY_STARTED; + } else { + FadtFound =3D TRUE; } =20 - if (!MadtFound) { + Handle =3D 0; + Status =3D LocateAcpiTableBySignature ( + EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, + &DummyHeader, + &Handle + ); + if (EFI_ERROR (Status) && !MadtFound) { DEBUG ((DEBUG_ERROR, "ERROR: MADT Table not found.\n")); Status =3D EFI_NOT_FOUND; + } else if (!EFI_ERROR (Status) && MadtFound) { + DEBUG ((DEBUG_ERROR, "ERROR: MADT Table found while already published.= \n")); + Status =3D EFI_ALREADY_STARTED; + } else { + MadtFound =3D TRUE; } =20 - if (!GtdtFound) { + Handle =3D 0; + Status =3D LocateAcpiTableBySignature ( + EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, + &DummyHeader, + &Handle + ); + if (EFI_ERROR (Status) && !GtdtFound) { DEBUG ((DEBUG_ERROR, "ERROR: GTDT Table not found.\n")); Status =3D EFI_NOT_FOUND; + } else if (!EFI_ERROR (Status) && GtdtFound) { + DEBUG ((DEBUG_ERROR, "ERROR: GTDT Table found while already published.= \n")); + Status =3D EFI_ALREADY_STARTED; + } else { + GtdtFound =3D TRUE; } =20 - if (!DsdtFound) { + Handle =3D 0; + Status =3D LocateAcpiTableBySignature ( + EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATUR= E, + &DummyHeader, + &Handle + ); + if (EFI_ERROR (Status) && !DsdtFound) { DEBUG ((DEBUG_ERROR, "ERROR: DSDT Table not found.\n")); Status =3D EFI_NOT_FOUND; + } else if (!EFI_ERROR (Status) && DsdtFound) { + DEBUG ((DEBUG_ERROR, "ERROR: DSDT Table found while already published.= \n")); + Status =3D EFI_ALREADY_STARTED; + } else { + DsdtFound =3D TRUE; } =20 - if (!Dbg2Found) { + Handle =3D 0; + Status =3D LocateAcpiTableBySignature ( + EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE, + &DummyHeader, + &Handle + ); + if (EFI_ERROR (Status) && !Dbg2Found) { DEBUG ((DEBUG_WARN, "WARNING: DBG2 Table not found.\n")); + } else if (!EFI_ERROR (Status) && Dbg2Found) { + DEBUG ((DEBUG_ERROR, "ERROR: DBG2 Table found while already published.= \n")); + Status =3D EFI_ALREADY_STARTED; + } else { + Dbg2Found =3D TRUE; } =20 - if (!SpcrFound) { + Handle =3D 0; + Status =3D LocateAcpiTableBySignature ( + EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, + &DummyHeader, + &Handle + ); + if (EFI_ERROR (Status) && !SpcrFound) { DEBUG ((DEBUG_WARN, "WARNING: SPCR Table not found.\n")); + } else if (!EFI_ERROR (Status) && SpcrFound) { + DEBUG ((DEBUG_ERROR, "ERROR: SPCR Table found while already published.= \n")); + Status =3D EFI_ALREADY_STARTED; + } else { + SpcrFound =3D TRUE; } =20 return Status; @@ -500,11 +622,13 @@ ProcessAcpiTables ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol ) { - EFI_STATUS Status; - EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; - CM_STD_OBJ_ACPI_TABLE_INFO *AcpiTableInfo; - UINT32 AcpiTableCount; - UINT32 Idx; + EFI_STATUS Status; + EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; + CM_STD_OBJ_ACPI_TABLE_INFO *AcpiTableInfo; + UINT32 AcpiTableCount; + UINT32 Idx; + UINTN Handle; + EFI_ACPI_DESCRIPTION_HEADER *DummyHeader; =20 ASSERT (TableFactoryProtocol !=3D NULL); ASSERT (CfgMgrProtocol !=3D NULL); @@ -570,29 +694,37 @@ ProcessAcpiTables ( } =20 // Add the FADT Table first. - for (Idx =3D 0; Idx < AcpiTableCount; Idx++) { - if (CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt) =3D=3D - AcpiTableInfo[Idx].TableGeneratorId) - { - Status =3D BuildAndInstallAcpiTable ( - TableFactoryProtocol, - CfgMgrProtocol, - AcpiTableProtocol, - &AcpiTableInfo[Idx] - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to find build and install ACPI FADT Table." \ - " Status =3D %r\n", - Status - )); - return Status; + Status =3D LocateAcpiTableBySignature ( + EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, + &DummyHeader, + &Handle + ); + if (EFI_ERROR (Status)) { + // FADT is not yet installed + for (Idx =3D 0; Idx < AcpiTableCount; Idx++) { + if (CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt) =3D=3D + AcpiTableInfo[Idx].TableGeneratorId) + { + Status =3D BuildAndInstallAcpiTable ( + TableFactoryProtocol, + CfgMgrProtocol, + AcpiTableProtocol, + &AcpiTableInfo[Idx] + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find build and install ACPI FADT Table." \ + " Status =3D %r\n", + Status + )); + return Status; + } + + break; } - - break; - } - } // for + } // for + } =20 // Add remaining ACPI Tables for (Idx =3D 0; Idx < AcpiTableCount; Idx++) { 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] =20 [Protocols] gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED + gEfiAcpiSdtProtocolGuid # PROTOCOL ALWAYS_CONSUMED =20 gEdkiiConfigurationManagerProtocolGuid # PROTOCOL ALWAYS_CONSUMED gEdkiiDynamicTableFactoryProtocolGuid # PROTOCOL ALWAYS_CONSUMED --=20 2.36.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#91501): https://edk2.groups.io/g/devel/message/91501 Mute This Topic: https://groups.io/mt/92473114/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-