summaryrefslogtreecommitdiffstats
path: root/PrmPkg
diff options
context:
space:
mode:
authorMichael Kubacki <michael.kubacki@microsoft.com>2020-05-20 10:56:03 -0700
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2022-04-05 00:42:38 +0000
commit50e1432a40ef82d862c4939bf8cbab361895b114 (patch)
tree314e4a1040822b855ef8ff922e7eddd9a83eb3f0 /PrmPkg
parentf96517f4d04e9edf7705966b4e7c759998cc1144 (diff)
downloadedk2-50e1432a40ef82d862c4939bf8cbab361895b114.tar.gz
edk2-50e1432a40ef82d862c4939bf8cbab361895b114.tar.bz2
edk2-50e1432a40ef82d862c4939bf8cbab361895b114.zip
PrmPkg: Add initial PrmSsdtInstallDxe module
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 <afish@apple.com> Cc: Kang Gao <kang.gao@intel.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Michael Kubacki <michael.kubacki@microsoft.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Benjamin You <benjamin.you@intel.com> Cc: Liu Yun <yun.y.liu@intel.com> Cc: Ankit Sinha <ankit.sinha@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Acked-by: Michael D Kinney <michael.d.kinney@intel.com> Acked-by: Liming Gao <gaoliming@byosoft.com.cn> Acked-by: Leif Lindholm <quic_llindhol@quicinc.com> Reviewed-by: Ankit Sinha <ankit.sinha@intel.com>
Diffstat (limited to 'PrmPkg')
-rw-r--r--PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c33
-rw-r--r--PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf4
-rw-r--r--PrmPkg/PrmPkg.dsc5
-rw-r--r--PrmPkg/PrmSsdtInstallDxe/Prm.asl (renamed from PrmPkg/PrmLoaderDxe/Prm.asl)18
-rw-r--r--PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c110
-rw-r--r--PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf52
6 files changed, 171 insertions, 51 deletions
diff --git a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c
index 5e14b8e09d..e45f8685e8 100644
--- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c
+++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c
@@ -20,7 +20,6 @@
#include <Library/PrmContextBufferLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
-#include <Library/DxeServicesLib.h>
#include <Protocol/AcpiTable.h>
#include <Protocol/LoadedImage.h>
#include <Protocol/PrmConfig.h>
@@ -811,8 +810,6 @@ PublishPrmAcpiTable (
EFI_STATUS Status;
EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol;
UINTN TableKey;
- EFI_ACPI_DESCRIPTION_HEADER *Ssdt;
- UINTN SsdtSize;
if (PrmAcpiDescriptionTable == NULL || PrmAcpiDescriptionTable->Header.Signature != PRM_TABLE_SIGNATURE) {
return EFI_INVALID_PARAMETER;
@@ -836,36 +833,6 @@ PublishPrmAcpiTable (
}
ASSERT_EFI_ERROR (Status);
- //
- // Load SSDT
- //
- Status = 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 = 0;
- Status = AcpiTableProtocol->InstallAcpiTable (
- AcpiTableProtocol,
- Ssdt,
- SsdtSize,
- &TableKey
- );
- ASSERT_EFI_ERROR (Status);
-
return Status;
}
diff --git a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf
index 016ced4b37..4d959ccd35 100644
--- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf
+++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf
@@ -24,7 +24,6 @@
PrmAcpiTable.h
PrmLoader.h
PrmLoaderDxe.c
- Prm.asl
[Packages]
MdePkg/MdePkg.dec
@@ -39,13 +38,12 @@
BaseMemoryLib
DebugLib
MemoryAllocationLib
+ PcdLib
PeCoffLib
PrmContextBufferLib
UefiBootServicesTableLib
UefiDriverEntryPoint
UefiLib
- DxeServicesLib
- PcdLib
[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId ## CONSUMES
diff --git a/PrmPkg/PrmPkg.dsc b/PrmPkg/PrmPkg.dsc
index 1a0ddc6ac1..d3aeffa152 100644
--- a/PrmPkg/PrmPkg.dsc
+++ b/PrmPkg/PrmPkg.dsc
@@ -85,6 +85,11 @@
$(PLATFORM_PACKAGE)/PrmLoaderDxe/PrmLoaderDxe.inf
#
+ # PRM SSDT Installation Driver
+ #
+ $(PLATFORM_PACKAGE)/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf
+
+ #
# PRM Sample Modules
#
$(PLATFORM_PACKAGE)/Samples/PrmSamplePrintModule/PrmSamplePrintModule.inf
diff --git a/PrmPkg/PrmLoaderDxe/Prm.asl b/PrmPkg/PrmSsdtInstallDxe/Prm.asl
index 76b56de732..0457d09e69 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)
- }
}
}
diff --git a/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c b/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c
new file mode 100644
index 0000000000..bd9ce2c6fa
--- /dev/null
+++ b/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c
@@ -0,0 +1,110 @@
+/** @file
+
+ This file contains a sample implementation of the Platform Runtime Mechanism (PRM)
+ SSDT Install library.
+
+ Copyright (c) Microsoft Corporation
+ Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <IndustryStandard/Acpi.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/DxeServicesLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Protocol/AcpiTable.h>
+
+#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 successfully.
+ @retval EFI_INVALID_PARAMETER The OemId pointer argument is NULL.
+ @retval EFI_NOT_FOUND An instance of gEfiAcpiTableProtocolGuid was not found installed or
+ the SSDT (AML RAW section) could 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 == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **) &AcpiTableProtocol);
+ if (!EFI_ERROR (Status)) {
+ //
+ // Discover the SSDT
+ //
+ Status = 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 in the SSDT
+ //
+ CopyMem (&Ssdt->OemId, OemId, sizeof (Ssdt->OemId));
+
+ //
+ // Publish the SSDT. Table is re-checksummed.
+ //
+ TableKey = 0;
+ Status = 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 image.
+ @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 point.
+
+**/
+EFI_STATUS
+EFIAPI
+PrmSsdtInstallEntryPoint (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+
+ Status = InstallPrmSsdt ((UINT8 *) PcdGetPtr (PcdAcpiDefaultOemId));
+ ASSERT_EFI_ERROR (Status);
+
+ return Status;
+}
diff --git a/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf b/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf
new file mode 100644
index 0000000000..e68e9460dd
--- /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.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = PrmSsdtInstallDxe
+ FILE_GUID = B0423E2F-3B2C-4A36-BF98-3EB3B4B7CB0E
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ ENTRY_POINT = PrmSsdtInstallEntryPoint
+
+#
+# VALID_ARCHITECTURES = 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 ## CONSUMES
+
+[Protocols]
+ gEfiAcpiTableProtocolGuid
+
+[Depex]
+ gEfiAcpiTableProtocolGuid