From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mx.groups.io with SMTP id smtpd.web08.12151.1647966085659472007 for ; Tue, 22 Mar 2022 09:21:25 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@linux.microsoft.com header.s=default header.b=WWrnRXmi; spf=pass (domain: linux.microsoft.com, ip: 13.77.154.182, mailfrom: mikuback@linux.microsoft.com) Received: from localhost.localdomain (unknown [47.202.59.224]) by linux.microsoft.com (Postfix) with ESMTPSA id 4D68220B4783; Tue, 22 Mar 2022 09:21:24 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 4D68220B4783 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1647966085; bh=fL9+vaHWBzfCiKz0c7YiFTkUXmya5zCTxcwmsLKFTrM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WWrnRXmiY7Y51cAe02rv3CiVIOI3whSn/66XTJGL3FaJiP8WkPAFc11KEXFrkLlnl uajTwaJgjqM4QlomL4SWXdxMNTnsAq2UjmcMwHPa46zcNSIUP90QqmPAeF3lkll+F2 QTDaJ2EQfqa45ewSaxs2bmvr7qWBKqqFjwifReIg= From: "Michael Kubacki" To: devel@edk2.groups.io Cc: Andrew Fish , Kang Gao , Michael D Kinney , Michael Kubacki , Leif Lindholm , Benjamin You , Liu Yun , Ankit Sinha , Nate DeSimone Subject: [PATCH v1 15/41] PrmPkg: Add initial PrmSsdtInstallDxe module Date: Tue, 22 Mar 2022 12:19:21 -0400 Message-Id: <20220322161947.9319-16-mikuback@linux.microsoft.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220322161947.9319-1-mikuback@linux.microsoft.com> References: <20220322161947.9319-1-mikuback@linux.microsoft.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Michael Kubacki Adds a new module that installs a PRM SSDT. Note: A library class would allow a high degree of flexibility for platforms that choose: 1. To not install a PRM SSDT at all (using a NULL library instance) 2. To install a specific PRM SSDT implementation However, it is implemented as a driver since build tools are not linking ACPI tables to drivers from linked library classes. Cc: Andrew Fish Cc: Kang Gao Cc: Michael D Kinney Cc: Michael Kubacki Cc: Leif Lindholm Cc: Benjamin You Cc: Liu Yun Cc: Ankit Sinha Cc: Nate DeSimone Signed-off-by: Michael Kubacki --- PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c | 33 ------ PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c | 110 +++++++++++++++= +++++ PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf | 4 +- PrmPkg/PrmPkg.dsc | 5 + PrmPkg/{PrmLoaderDxe =3D> PrmSsdtInstallDxe}/Prm.asl | 18 +--- PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf | 52 +++++++++ 6 files changed, 171 insertions(+), 51 deletions(-) diff --git a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c b/PrmPkg/PrmLoaderDxe/Prm= LoaderDxe.c index 5e14b8e09dd0..e45f8685e81f 100644 --- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c +++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -811,8 +810,6 @@ PublishPrmAcpiTable ( EFI_STATUS Status; EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; UINTN TableKey; - EFI_ACPI_DESCRIPTION_HEADER *Ssdt; - UINTN SsdtSize; =20 if (PrmAcpiDescriptionTable =3D=3D NULL || PrmAcpiDescriptionTable->He= ader.Signature !=3D PRM_TABLE_SIGNATURE) { return EFI_INVALID_PARAMETER; @@ -836,36 +833,6 @@ PublishPrmAcpiTable ( } ASSERT_EFI_ERROR (Status); =20 - // - // Load SSDT - // - Status =3D GetSectionFromFv ( - &gEfiCallerIdGuid, - EFI_SECTION_RAW, - 0, - (VOID **) &Ssdt, - &SsdtSize - ); - ASSERT_EFI_ERROR (Status); - DEBUG ((DEBUG_INFO, "%a %a: SSDT loaded ...\n", _DBGMSGID_, __FUNCTION= __)); - - // - // Update OEM ID - // - CopyMem (&Ssdt->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (Ssdt->= OemId)); - - // - // Publish the SSDT. Table is re-checksumed. - // - TableKey =3D 0; - Status =3D AcpiTableProtocol->InstallAcpiTable ( - AcpiTableProtocol, - Ssdt, - SsdtSize, - &TableKey - ); - ASSERT_EFI_ERROR (Status); - return Status; } =20 diff --git a/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c b/PrmPkg/PrmSsd= tInstallDxe/PrmSsdtInstallDxe.c new file mode 100644 index 000000000000..bd9ce2c6fa02 --- /dev/null +++ b/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c @@ -0,0 +1,110 @@ +/** @file + + This file contains a sample implementation of the Platform Runtime Mec= hanism (PRM) + SSDT Install library. + + Copyright (c) Microsoft Corporation + Copyright (c) 2020, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include + +#define _DBGMSGID_ "[PRMSSDTINSTALL]" + +/** + Installs the PRM SSDT. + + @param[in] OemId OEM ID to be used in the SSDT = installation. + + @retval EFI_SUCCESS The PRM SSDT was installed suc= cessfully. + @retval EFI_INVALID_PARAMETER The OemId pointer argument is = NULL. + @retval EFI_NOT_FOUND An instance of gEfiAcpiTablePr= otocolGuid was not found installed or + the SSDT (AML RAW section) cou= ld not be found in the current FV. + @retval EFI_OUT_OF_RESOURCES Insufficient memory resources = to install the PRM SSDT. + +**/ +EFI_STATUS +InstallPrmSsdt ( + IN CONST UINT8 *OemId + ) +{ + EFI_STATUS Status; + UINTN SsdtSize; + UINTN TableKey; + EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; + EFI_ACPI_DESCRIPTION_HEADER *Ssdt; + + DEBUG ((DEBUG_INFO, "%a %a - Entry.\n", _DBGMSGID_, __FUNCTION__)); + + if (OemId =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + Status =3D gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOI= D **) &AcpiTableProtocol); + if (!EFI_ERROR (Status)) { + // + // Discover the SSDT + // + Status =3D GetSectionFromFv ( + &gEfiCallerIdGuid, + EFI_SECTION_RAW, + 0, + (VOID **) &Ssdt, + &SsdtSize + ); + ASSERT_EFI_ERROR (Status); + DEBUG ((DEBUG_INFO, "%a %a: SSDT loaded...\n", _DBGMSGID_, __FUNCTIO= N__)); + + // + // Update OEM ID in the SSDT + // + CopyMem (&Ssdt->OemId, OemId, sizeof (Ssdt->OemId)); + + // + // Publish the SSDT. Table is re-checksummed. + // + TableKey =3D 0; + Status =3D AcpiTableProtocol->InstallAcpiTable ( + AcpiTableProtocol, + Ssdt, + SsdtSize, + &TableKey + ); + ASSERT_EFI_ERROR (Status); + } + + return Status; +} + +/** + The entry point for this module. + + @param[in] ImageHandle The firmware allocated handle for the EFI i= mage. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + @retval Others An error occurred when executing this entry poi= nt. + +**/ +EFI_STATUS +EFIAPI +PrmSsdtInstallEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status =3D InstallPrmSsdt ((UINT8 *) PcdGetPtr (PcdAcpiDefaultOemId)); + ASSERT_EFI_ERROR (Status); + + return Status; +} diff --git a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf b/PrmPkg/PrmLoaderDxe/P= rmLoaderDxe.inf index 016ced4b3732..4d959ccd35a3 100644 --- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf +++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf @@ -24,7 +24,6 @@ [Sources] PrmAcpiTable.h PrmLoader.h PrmLoaderDxe.c - Prm.asl =20 [Packages] MdePkg/MdePkg.dec @@ -39,13 +38,12 @@ [LibraryClasses] BaseMemoryLib DebugLib MemoryAllocationLib + PcdLib PeCoffLib PrmContextBufferLib UefiBootServicesTableLib UefiDriverEntryPoint UefiLib - DxeServicesLib - PcdLib =20 [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId ## CONSU= MES diff --git a/PrmPkg/PrmPkg.dsc b/PrmPkg/PrmPkg.dsc index 1a0ddc6ac181..d3aeffa152e0 100644 --- a/PrmPkg/PrmPkg.dsc +++ b/PrmPkg/PrmPkg.dsc @@ -84,6 +84,11 @@ [Components] # $(PLATFORM_PACKAGE)/PrmLoaderDxe/PrmLoaderDxe.inf =20 + # + # PRM SSDT Installation Driver + # + $(PLATFORM_PACKAGE)/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf + # # PRM Sample Modules # diff --git a/PrmPkg/PrmLoaderDxe/Prm.asl b/PrmPkg/PrmSsdtInstallDxe/Prm.a= sl similarity index 82% rename from PrmPkg/PrmLoaderDxe/Prm.asl rename to PrmPkg/PrmSsdtInstallDxe/Prm.asl index 76b56de732da..0457d09e6954 100644 --- a/PrmPkg/PrmLoaderDxe/Prm.asl +++ b/PrmPkg/PrmSsdtInstallDxe/Prm.asl @@ -8,10 +8,10 @@ DefinitionBlock ( "Prm.aml", "SSDT", - 0x01, - "OEMID", + 2, + "OEMID ", "PRMOPREG", - 0x3000 + 0x1000 ) { Scope (\_SB) @@ -66,18 +66,6 @@ DefinitionBlock ( { \_SB.PRMB.SETV (BUF1) } - Method (TST1) - { - \_SB.PRMB.SETV (BUF1) - } - Method (TST2) - { - \_SB.PRMB.SETV (BUF2) - } - Method (TST3) - { - \_SB.PRMB.SETV (BUF3) - } } } =20 diff --git a/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf b/PrmPkg/PrmS= sdtInstallDxe/PrmSsdtInstallDxe.inf new file mode 100644 index 000000000000..e68e9460ddc5 --- /dev/null +++ b/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf @@ -0,0 +1,52 @@ +## @file +# PRM SSDT Installation Driver +# +# This driver installs the PRM SSDT. +# * Not all PRM implementations may need this support and if it is not = needed, the driver +# can simply be removed from the platform build. +# * The platform may also choose to use this driver but modify the ASL = file. +# +# Copyright (c) Microsoft Corporation +# Copyright (c) 2020, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D PrmSsdtInstallDxe + FILE_GUID =3D B0423E2F-3B2C-4A36-BF98-3EB3B4B7CB0= E + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D PrmSsdtInstallEntryPoint + +# +# VALID_ARCHITECTURES =3D IA32 X64 EBC +# + +[Sources] + PrmSsdtInstallDxe.c + Prm.asl + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + PrmPkg/PrmPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + DxeServicesLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId ## CONSU= MES + +[Protocols] + gEfiAcpiTableProtocolGuid + +[Depex] + gEfiAcpiTableProtocolGuid --=20 2.28.0.windows.1