From mboxrd@z Thu Jan 1 00:00:00 1970 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 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20210112 header.b=pFXAY5Yf; spf=pass (domain: gmail.com, ip: 209.85.210.176, mailfrom: kuqin12@gmail.com) Received: by mail-pf1-f176.google.com with SMTP id g126so12116313pfb.3 for ; Mon, 18 Jul 2022 17:25:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FsezWB3ApMXg7cWRFJKQBYs0j4jzdUBrP6/ORHcM8RM=; b=pFXAY5Yf4Y3UgPiMgjcYjmuJ4tJMEJZ6blL6u5e1VU4aKb8oddWCevgkz3r1CYWgDt Kjats43u3yc+vDVeziupM5iD0tqF28YSqmQh34/N35A1IPTysSG5atU4wGBU2VnOvypN uJEvHT1jDXjW/UukGiH2gYzjNBLFda1uARjkzYEHlV2NKbITo9tRsApKHAJ2KNVkmCyh R0HkSv3vALqmYBqPaJSjlpfQC2kymv9aPlN+8nmLurbqAmLUq4cpuWdZi4V5ZkkWhHS2 qGbKqnFI+L01ItMsHCnb7ce4UKNp/FNGBfaoBuW+I+WdnXxt9RZiQi2yzECBxZgadynl J0DQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FsezWB3ApMXg7cWRFJKQBYs0j4jzdUBrP6/ORHcM8RM=; b=x0x77YV9Yz8DvtvL5GVABb96VkxTAW+Iex6xdCaSWqp7toDsRg0+CVLJgwfVdKBIF5 t9KbzwUNUar1Do/7qqX27YLcBklvbeW38qy3AqAnP+HNm/EqxCT5EClFye39PgSaUgzy WzlceknK2u7ZARyyL4lxmwBtEnwwyqzvCfoV1G7EioeNo9RLBb0UApxCHxlqT/kPeN+W 91GQ8QE84L6Hhe0kKlvSlJ/AqnhMXCPiETwr83TOsSk3D0PFmVYa0evsntjzuq8SlQwm wdHgRxD9wKZ/m1Pt4a0Y91cfQIa3Jl9XdWllwNbuNjU781G/mpNYt89yTQgrVhweySFW bPbQ== X-Gm-Message-State: AJIora+Rn0GVMrXKzOxK4x28MsaWNFKTO0IbSmo6SUWH95Pw3xTkBWZ+ 9RhXdU3QpRhwMNa6Ry45rBNALVuL/x0= 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) Return-Path: 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: [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> X-Mailer: git-send-email 2.36.0.windows.1 In-Reply-To: <20220719002254.1891-1-kuqin12@gmail.com> References: <20220719002254.1891-1-kuqin12@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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 --- 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 =0D #include =0D #include =0D +#include =0D =0D // Module specific include files.=0D #include =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