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>
+++ /dev/null
-/** @file\r
- The definition block in ACPI table for PRM Operation Region\r
-\r
- Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
- SPDX-License-Identifier: BSD-2-Clause-Patent\r
-**/\r
-\r
-DefinitionBlock (\r
- "Prm.aml",\r
- "SSDT",\r
- 0x01,\r
- "OEMID",\r
- "PRMOPREG",\r
- 0x3000\r
- )\r
-{\r
- Scope (\_SB)\r
- {\r
- //\r
- // PRM Bridge Device\r
- //\r
-\r
- Device (PRMB)\r
- {\r
- Name (_HID, "80860222")\r
- Name (_CID, "80860222")\r
- Name (_DDN, "PRM Bridge Device")\r
- Name (_STA, 0xF)\r
- OperationRegion (OPR1, 0x80, 0, 16)\r
- Field (OPR1, DWordAcc, NoLock, Preserve) //Make it ByteAcc for parameter validation\r
- {\r
- Var0, 128\r
- }\r
- Method (SETV, 1, Serialized)\r
- {\r
- CopyObject (Arg0, \_SB.PRMB.Var0)\r
- }\r
- }\r
-\r
- //\r
- // PRM Test Device\r
- //\r
-\r
- Device (PRMT)\r
- {\r
- Name (_HID, "80860223")\r
- Name (_CID, "80860223")\r
- Name (_DDN, "PRM Test Device")\r
- Name (_STA, 0xF)\r
- Name (BUF1, Buffer(16)\r
- {\r
- 0x5F, 0xAD, 0xF2, 0xD5, 0x47, 0xA3, 0x3E, 0x4D, //Guid_0\r
- 0x87, 0xBC, 0xC2, 0xCE, 0x63, 0x02, 0x9C, 0xC8, //Guid_1\r
- })\r
- Name (BUF2, Buffer(16)\r
- {\r
- 0xC3, 0xAD, 0xE7, 0xA9, 0xD0, 0x8C, 0x9A, 0x42, //Guid_0\r
- 0x89, 0x15, 0x10, 0x94, 0x6E, 0xBD, 0xE3, 0x18, //Guid_1\r
- })\r
- Name (BUF3, Buffer(16)\r
- {\r
- 0x14, 0xC2, 0x88, 0xB6, 0x81, 0x40, 0xEB, 0x4E, //Guid_0\r
- 0x8D, 0x26, 0x1E, 0xB5, 0xA3, 0xBC, 0xF1, 0x1A, //Guid_1\r
- })\r
- Method (NTST)\r
- {\r
- \_SB.PRMB.SETV (BUF1)\r
- }\r
- Method (TST1)\r
- {\r
- \_SB.PRMB.SETV (BUF1)\r
- }\r
- Method (TST2)\r
- {\r
- \_SB.PRMB.SETV (BUF2)\r
- }\r
- Method (TST3)\r
- {\r
- \_SB.PRMB.SETV (BUF3)\r
- }\r
- }\r
- }\r
-\r
-} // End of Definition Block\r
-\r
-\r
-\r
#include <Library/PrmContextBufferLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
#include <Library/UefiLib.h>\r
-#include <Library/DxeServicesLib.h>\r
#include <Protocol/AcpiTable.h>\r
#include <Protocol/LoadedImage.h>\r
#include <Protocol/PrmConfig.h>\r
EFI_STATUS Status;\r
EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol;\r
UINTN TableKey;\r
- EFI_ACPI_DESCRIPTION_HEADER *Ssdt;\r
- UINTN SsdtSize;\r
\r
if (PrmAcpiDescriptionTable == NULL || PrmAcpiDescriptionTable->Header.Signature != PRM_TABLE_SIGNATURE) {\r
return EFI_INVALID_PARAMETER;\r
}\r
ASSERT_EFI_ERROR (Status);\r
\r
- //\r
- // Load SSDT\r
- //\r
- Status = GetSectionFromFv (\r
- &gEfiCallerIdGuid,\r
- EFI_SECTION_RAW,\r
- 0,\r
- (VOID **) &Ssdt,\r
- &SsdtSize\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- DEBUG ((DEBUG_INFO, "%a %a: SSDT loaded ...\n", _DBGMSGID_, __FUNCTION__));\r
-\r
- //\r
- // Update OEM ID\r
- //\r
- CopyMem (&Ssdt->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (Ssdt->OemId));\r
-\r
- //\r
- // Publish the SSDT. Table is re-checksumed.\r
- //\r
- TableKey = 0;\r
- Status = AcpiTableProtocol->InstallAcpiTable (\r
- AcpiTableProtocol,\r
- Ssdt,\r
- SsdtSize,\r
- &TableKey\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
return Status;\r
}\r
\r
PrmAcpiTable.h\r
PrmLoader.h\r
PrmLoaderDxe.c\r
- Prm.asl\r
\r
[Packages]\r
MdePkg/MdePkg.dec\r
BaseMemoryLib\r
DebugLib\r
MemoryAllocationLib\r
+ PcdLib\r
PeCoffLib\r
PrmContextBufferLib\r
UefiBootServicesTableLib\r
UefiDriverEntryPoint\r
UefiLib\r
- DxeServicesLib\r
- PcdLib\r
\r
[Pcd]\r
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId ## CONSUMES\r
#\r
$(PLATFORM_PACKAGE)/PrmLoaderDxe/PrmLoaderDxe.inf\r
\r
+ #\r
+ # PRM SSDT Installation Driver\r
+ #\r
+ $(PLATFORM_PACKAGE)/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf\r
+\r
#\r
# PRM Sample Modules\r
#\r
--- /dev/null
+/** @file\r
+ The definition block in ACPI table for PRM Operation Region\r
+\r
+ Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+**/\r
+\r
+DefinitionBlock (\r
+ "Prm.aml",\r
+ "SSDT",\r
+ 2,\r
+ "OEMID ",\r
+ "PRMOPREG",\r
+ 0x1000\r
+ )\r
+{\r
+ Scope (\_SB)\r
+ {\r
+ //\r
+ // PRM Bridge Device\r
+ //\r
+\r
+ Device (PRMB)\r
+ {\r
+ Name (_HID, "80860222")\r
+ Name (_CID, "80860222")\r
+ Name (_DDN, "PRM Bridge Device")\r
+ Name (_STA, 0xF)\r
+ OperationRegion (OPR1, 0x80, 0, 16)\r
+ Field (OPR1, DWordAcc, NoLock, Preserve) //Make it ByteAcc for parameter validation\r
+ {\r
+ Var0, 128\r
+ }\r
+ Method (SETV, 1, Serialized)\r
+ {\r
+ CopyObject (Arg0, \_SB.PRMB.Var0)\r
+ }\r
+ }\r
+\r
+ //\r
+ // PRM Test Device\r
+ //\r
+\r
+ Device (PRMT)\r
+ {\r
+ Name (_HID, "80860223")\r
+ Name (_CID, "80860223")\r
+ Name (_DDN, "PRM Test Device")\r
+ Name (_STA, 0xF)\r
+ Name (BUF1, Buffer(16)\r
+ {\r
+ 0x5F, 0xAD, 0xF2, 0xD5, 0x47, 0xA3, 0x3E, 0x4D, //Guid_0\r
+ 0x87, 0xBC, 0xC2, 0xCE, 0x63, 0x02, 0x9C, 0xC8, //Guid_1\r
+ })\r
+ Name (BUF2, Buffer(16)\r
+ {\r
+ 0xC3, 0xAD, 0xE7, 0xA9, 0xD0, 0x8C, 0x9A, 0x42, //Guid_0\r
+ 0x89, 0x15, 0x10, 0x94, 0x6E, 0xBD, 0xE3, 0x18, //Guid_1\r
+ })\r
+ Name (BUF3, Buffer(16)\r
+ {\r
+ 0x14, 0xC2, 0x88, 0xB6, 0x81, 0x40, 0xEB, 0x4E, //Guid_0\r
+ 0x8D, 0x26, 0x1E, 0xB5, 0xA3, 0xBC, 0xF1, 0x1A, //Guid_1\r
+ })\r
+ Method (NTST)\r
+ {\r
+ \_SB.PRMB.SETV (BUF1)\r
+ }\r
+ }\r
+ }\r
+\r
+} // End of Definition Block\r
+\r
+\r
+\r
--- /dev/null
+/** @file\r
+\r
+ This file contains a sample implementation of the Platform Runtime Mechanism (PRM)\r
+ SSDT Install library.\r
+\r
+ Copyright (c) Microsoft Corporation\r
+ Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <IndustryStandard/Acpi.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/DxeServicesLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Protocol/AcpiTable.h>\r
+\r
+#define _DBGMSGID_ "[PRMSSDTINSTALL]"\r
+\r
+/**\r
+ Installs the PRM SSDT.\r
+\r
+ @param[in] OemId OEM ID to be used in the SSDT installation.\r
+\r
+ @retval EFI_SUCCESS The PRM SSDT was installed successfully.\r
+ @retval EFI_INVALID_PARAMETER The OemId pointer argument is NULL.\r
+ @retval EFI_NOT_FOUND An instance of gEfiAcpiTableProtocolGuid was not found installed or\r
+ the SSDT (AML RAW section) could not be found in the current FV.\r
+ @retval EFI_OUT_OF_RESOURCES Insufficient memory resources to install the PRM SSDT.\r
+\r
+**/\r
+EFI_STATUS\r
+InstallPrmSsdt (\r
+ IN CONST UINT8 *OemId\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN SsdtSize;\r
+ UINTN TableKey;\r
+ EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol;\r
+ EFI_ACPI_DESCRIPTION_HEADER *Ssdt;\r
+\r
+ DEBUG ((DEBUG_INFO, "%a %a - Entry.\n", _DBGMSGID_, __FUNCTION__));\r
+\r
+ if (OemId == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **) &AcpiTableProtocol);\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Discover the SSDT\r
+ //\r
+ Status = GetSectionFromFv (\r
+ &gEfiCallerIdGuid,\r
+ EFI_SECTION_RAW,\r
+ 0,\r
+ (VOID **) &Ssdt,\r
+ &SsdtSize\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ DEBUG ((DEBUG_INFO, "%a %a: SSDT loaded...\n", _DBGMSGID_, __FUNCTION__));\r
+\r
+ //\r
+ // Update OEM ID in the SSDT\r
+ //\r
+ CopyMem (&Ssdt->OemId, OemId, sizeof (Ssdt->OemId));\r
+\r
+ //\r
+ // Publish the SSDT. Table is re-checksummed.\r
+ //\r
+ TableKey = 0;\r
+ Status = AcpiTableProtocol->InstallAcpiTable (\r
+ AcpiTableProtocol,\r
+ Ssdt,\r
+ SsdtSize,\r
+ &TableKey\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ The entry point for this module.\r
+\r
+ @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
+ @param[in] SystemTable A pointer to the EFI System Table.\r
+\r
+ @retval EFI_SUCCESS The entry point is executed successfully.\r
+ @retval Others An error occurred when executing this entry point.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PrmSsdtInstallEntryPoint (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ Status = InstallPrmSsdt ((UINT8 *) PcdGetPtr (PcdAcpiDefaultOemId));\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ return Status;\r
+}\r
--- /dev/null
+## @file\r
+# PRM SSDT Installation Driver\r
+#\r
+# This driver installs the PRM SSDT.\r
+# * Not all PRM implementations may need this support and if it is not needed, the driver\r
+# can simply be removed from the platform build.\r
+# * The platform may also choose to use this driver but modify the ASL file.\r
+#\r
+# Copyright (c) Microsoft Corporation\r
+# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+#\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = PrmSsdtInstallDxe\r
+ FILE_GUID = B0423E2F-3B2C-4A36-BF98-3EB3B4B7CB0E\r
+ MODULE_TYPE = DXE_DRIVER\r
+ VERSION_STRING = 1.0\r
+ ENTRY_POINT = PrmSsdtInstallEntryPoint\r
+\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 EBC\r
+#\r
+\r
+[Sources]\r
+ PrmSsdtInstallDxe.c\r
+ Prm.asl\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
+ PrmPkg/PrmPkg.dec\r
+\r
+[LibraryClasses]\r
+ BaseLib\r
+ BaseMemoryLib\r
+ DebugLib\r
+ DxeServicesLib\r
+ UefiBootServicesTableLib\r
+ UefiDriverEntryPoint\r
+\r
+[Pcd]\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId ## CONSUMES\r
+\r
+[Protocols]\r
+ gEfiAcpiTableProtocolGuid\r
+\r
+[Depex]\r
+ gEfiAcpiTableProtocolGuid\r