mirror of https://github.com/acidanthera/audk.git
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:
parent
68ee42c991
commit
c040831cf9
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue