PrmPkg: Add PlatformGuid

Adds a "platform GUID" field to the PRM ACPI table. This field
is used by a platform to uniquely identify itself such that it
can be targeted by runtime PRM module updates for that platform.

Platforms using PRM are currently required to set a unique value
for gPrmPkgTokenSpaceGuid.PcdPrmPlatformGuid in their platform
DSC.

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>
This commit is contained in:
Michael Kubacki 2020-06-29 15:54:01 -07:00 committed by mergify[bot]
parent 68ee42c991
commit c040831cf9
5 changed files with 44 additions and 0 deletions

View File

@ -56,6 +56,9 @@ typedef struct {
typedef struct { typedef struct {
EFI_ACPI_DESCRIPTION_HEADER Header; ///< Standard ACPI description header EFI_ACPI_DESCRIPTION_HEADER Header; ///< Standard ACPI description header
GUID PrmPlatformGuid; ///< A GUID that uniquely identifies this platform.
///< Used to check for compatibility in PRM module
///< runtime updates.
UINT32 PrmModuleInfoOffset; ///< Offset in bytes from the beginning of this UINT32 PrmModuleInfoOffset; ///< Offset in bytes from the beginning of this
///< structure to the PRM Module Info array ///< structure to the PRM Module Info array
UINT32 PrmModuleInfoCount; ///< Number of entries in the PRM Module Info array UINT32 PrmModuleInfoCount; ///< Number of entries in the PRM Module Info array

View File

@ -11,6 +11,7 @@
#include "PrmAcpiTable.h" #include "PrmAcpiTable.h"
#include <Guid/ZeroGuid.h>
#include <IndustryStandard/Acpi.h> #include <IndustryStandard/Acpi.h>
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h> #include <Library/BaseMemoryLib.h>
@ -52,6 +53,7 @@ ProcessPrmModules (
OUT PRM_ACPI_DESCRIPTION_TABLE **PrmAcpiDescriptionTable OUT PRM_ACPI_DESCRIPTION_TABLE **PrmAcpiDescriptionTable
) )
{ {
EFI_GUID *PlatformGuid;
EFI_IMAGE_EXPORT_DIRECTORY *CurrentImageExportDirectory; EFI_IMAGE_EXPORT_DIRECTORY *CurrentImageExportDirectory;
PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT *CurrentExportDescriptorStruct; PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT *CurrentExportDescriptorStruct;
PRM_ACPI_DESCRIPTION_TABLE *PrmAcpiTable; PRM_ACPI_DESCRIPTION_TABLE *PrmAcpiTable;
@ -79,6 +81,20 @@ ProcessPrmModules (
} }
*PrmAcpiDescriptionTable = NULL; *PrmAcpiDescriptionTable = NULL;
PlatformGuid = (EFI_GUID *) PcdGetPtr (PcdPrmPlatformGuid);
//
// The platform should set PcdPrmPlatformGuid to a non-zero value
//
if (CompareGuid (PlatformGuid, &gZeroGuid)) {
DEBUG ((
DEBUG_ERROR,
" %a %a: PcdPrmPlatformGuid must be set to a unique value in the platform DSC file.\n",
_DBGMSGID_,
__FUNCTION__
));
ASSERT (!CompareGuid (PlatformGuid, &gZeroGuid));
}
DEBUG ((DEBUG_INFO, " %a %a: %d total PRM modules to process.\n", _DBGMSGID_, __FUNCTION__, mPrmModuleCount)); DEBUG ((DEBUG_INFO, " %a %a: %d total PRM modules to process.\n", _DBGMSGID_, __FUNCTION__, mPrmModuleCount));
DEBUG ((DEBUG_INFO, " %a %a: %d total PRM handlers to process.\n", _DBGMSGID_, __FUNCTION__, mPrmHandlerCount)); DEBUG ((DEBUG_INFO, " %a %a: %d total PRM handlers to process.\n", _DBGMSGID_, __FUNCTION__, mPrmHandlerCount));
@ -102,6 +118,7 @@ ProcessPrmModules (
PrmAcpiTable->Header.OemRevision = PcdGet32 (PcdAcpiDefaultOemRevision); PrmAcpiTable->Header.OemRevision = PcdGet32 (PcdAcpiDefaultOemRevision);
PrmAcpiTable->Header.CreatorId = PcdGet32 (PcdAcpiDefaultCreatorId); PrmAcpiTable->Header.CreatorId = PcdGet32 (PcdAcpiDefaultCreatorId);
PrmAcpiTable->Header.CreatorRevision = PcdGet32 (PcdAcpiDefaultCreatorRevision); PrmAcpiTable->Header.CreatorRevision = PcdGet32 (PcdAcpiDefaultCreatorRevision);
CopyGuid (&PrmAcpiTable->PrmPlatformGuid, PlatformGuid);
PrmAcpiTable->PrmModuleInfoOffset = OFFSET_OF (PRM_ACPI_DESCRIPTION_TABLE, PrmModuleInfoStructure); PrmAcpiTable->PrmModuleInfoOffset = OFFSET_OF (PRM_ACPI_DESCRIPTION_TABLE, PrmModuleInfoStructure);
PrmAcpiTable->PrmModuleInfoCount = (UINT32) mPrmModuleCount; PrmAcpiTable->PrmModuleInfoCount = (UINT32) mPrmModuleCount;

View File

@ -31,6 +31,7 @@
[Guids] [Guids]
gEfiEndOfDxeEventGroupGuid gEfiEndOfDxeEventGroupGuid
gZeroGuid
[LibraryClasses] [LibraryClasses]
BaseLib BaseLib
@ -51,6 +52,7 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemRevision ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemRevision ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision ## CONSUMES
gPrmPkgTokenSpaceGuid.PcdPrmPlatformGuid ## CONSUMES
[Protocols] [Protocols]
gEfiAcpiTableProtocolGuid gEfiAcpiTableProtocolGuid

View File

@ -65,3 +65,13 @@
# report PRM handler execution time in the application. If such a TimerLib # report PRM handler execution time in the application. If such a TimerLib
# instance is not available, set this PCD to FALSE in the package DSC file. # instance is not available, set this PCD to FALSE in the package DSC file.
gPrmPkgTokenSpaceGuid.PcdPrmInfoPrintHandlerExecutionTime|TRUE|BOOLEAN|0x00000003 gPrmPkgTokenSpaceGuid.PcdPrmInfoPrintHandlerExecutionTime|TRUE|BOOLEAN|0x00000003
## PRM Platform GUID
#
# Uniquely identifies a specific platform targeted for PRM module updates. Each
# platform MUST provide a new GUID. This GUID is checked against the platform
# GUID in the PRM module export descriptor during PRM runtime updates to determine
# if a given PRM module update is valid for a given system. Even if PRM runtime
# updates are not planned for a given platform, this value should still be given
# a unique value in the platform DSC.
gPrmPkgTokenSpaceGuid.PcdPrmPlatformGuid|{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}|VOID*|0x00000004

View File

@ -74,6 +74,18 @@ The following list are the currently defined build flags (if any) that may be pa
This structure is passed as the context buffer to PRM handlers. The structure actually passed to PRM handlers is This structure is passed as the context buffer to PRM handlers. The structure actually passed to PRM handlers is
allocated and populated by the OS where it gets all the information to populate the context buffer from other structures. allocated and populated by the OS where it gets all the information to populate the context buffer from other structures.
### PRM Platform GUID
**IMPORTANT**
A configuration item that requires user attention is the PRM platform GUID. Each platform that uses PRM must be
uniquely identifiable so that various instances of a PRM module can target the correct platform in PRM module updates.
To apply a unique platform GUID set the following PCD to a unique value in your platform DSC file.
``gPrmPkgTokenSpaceGuid.PcdPrmPlatformGuid``
The default value assigned in [PrmPkg.dec](PrmPkg/PrmPkg.dec) is zero. By design, this is an invalid value that will
cause an ASSERT if it is not updated.
## Overview ## Overview
At a high-level, PRM can be viewed from three levels of granularity: At a high-level, PRM can be viewed from three levels of granularity: