diff options
author | Michael Kubacki <michael.kubacki@microsoft.com> | 2020-05-20 10:56:03 -0700 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2022-04-05 00:42:38 +0000 |
commit | 50e1432a40ef82d862c4939bf8cbab361895b114 (patch) | |
tree | 314e4a1040822b855ef8ff922e7eddd9a83eb3f0 /PrmPkg | |
parent | f96517f4d04e9edf7705966b4e7c759998cc1144 (diff) | |
download | edk2-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.c | 33 | ||||
-rw-r--r-- | PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf | 4 | ||||
-rw-r--r-- | PrmPkg/PrmPkg.dsc | 5 | ||||
-rw-r--r-- | PrmPkg/PrmSsdtInstallDxe/Prm.asl (renamed from PrmPkg/PrmLoaderDxe/Prm.asl) | 18 | ||||
-rw-r--r-- | PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c | 110 | ||||
-rw-r--r-- | PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf | 52 |
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
|