From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mx.groups.io with SMTP id smtpd.web09.12143.1647966168313315963 for ; Tue, 22 Mar 2022 09:22:48 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@linux.microsoft.com header.s=default header.b=BB9G7Gzl; spf=pass (domain: linux.microsoft.com, ip: 13.77.154.182, mailfrom: mikuback@linux.microsoft.com) Received: from localhost.localdomain (unknown [47.202.59.224]) by linux.microsoft.com (Postfix) with ESMTPSA id 04CCA20DE481; Tue, 22 Mar 2022 09:22:46 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 04CCA20DE481 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1647966168; bh=vpUUjhqYfXPGzN7Uw1xN/X7mn7NNw7BccfnbvFWfTfY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BB9G7GzlNhnxnXgk6gZPB4afszPdjJ/+MqnpcGCxR8OKEHcb5UBS6NXg7YIu9uX2C rAxzd+XgKEErq3KCIt6d5u5M8rz25yavCaAtUE8uOHg8P/l1/0HTHw8lljkVpPy5L0 iX0Qen3kiyAeRpc9fnIdkqftrNDgImDwFI0yRKwQ= From: "Michael Kubacki" To: devel@edk2.groups.io Cc: Andrew Fish , Kang Gao , Michael D Kinney , Michael Kubacki , Leif Lindholm , Benjamin You , Liu Yun , Ankit Sinha , Nate DeSimone Subject: [PATCH v1 32/41] PrmPkg: Add PlatformGuid Date: Tue, 22 Mar 2022 12:19:38 -0400 Message-Id: <20220322161947.9319-33-mikuback@linux.microsoft.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220322161947.9319-1-mikuback@linux.microsoft.com> References: <20220322161947.9319-1-mikuback@linux.microsoft.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Michael Kubacki 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 Cc: Kang Gao Cc: Michael D Kinney Cc: Michael Kubacki Cc: Leif Lindholm Cc: Benjamin You Cc: Liu Yun Cc: Ankit Sinha Cc: Nate DeSimone Signed-off-by: Michael Kubacki --- PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c | 17 +++++++++++++++++ PrmPkg/PrmLoaderDxe/PrmAcpiTable.h | 3 +++ PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf | 2 ++ PrmPkg/PrmPkg.dec | 10 ++++++++++ PrmPkg/Readme.md | 12 ++++++++++++ 5 files changed, 44 insertions(+) diff --git a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c b/PrmPkg/PrmLoaderDxe/Prm= LoaderDxe.c index aa7aab391e8c..f78c682a654b 100644 --- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c +++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c @@ -11,6 +11,7 @@ =20 #include "PrmAcpiTable.h" =20 +#include #include #include #include @@ -52,6 +53,7 @@ ProcessPrmModules ( OUT PRM_ACPI_DESCRIPTION_TABLE **PrmAcpiDescriptionTable ) { + EFI_GUID *PlatformGuid; EFI_IMAGE_EXPORT_DIRECTORY *CurrentImageExportDirectory; PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT *CurrentExportDescriptorStruct= ; PRM_ACPI_DESCRIPTION_TABLE *PrmAcpiTable; @@ -79,6 +81,20 @@ ProcessPrmModules ( } *PrmAcpiDescriptionTable =3D NULL; =20 + PlatformGuid =3D (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", _DB= GMSGID_, __FUNCTION__, mPrmModuleCount)); DEBUG ((DEBUG_INFO, " %a %a: %d total PRM handlers to process.\n", _D= BGMSGID_, __FUNCTION__, mPrmHandlerCount)); =20 @@ -102,6 +118,7 @@ ProcessPrmModules ( PrmAcpiTable->Header.OemRevision =3D PcdGet32 (PcdAcpiDefaultOemR= evision); PrmAcpiTable->Header.CreatorId =3D PcdGet32 (PcdAcpiDefaultCrea= torId); PrmAcpiTable->Header.CreatorRevision =3D PcdGet32 (PcdAcpiDefaultCrea= torRevision); + CopyGuid (&PrmAcpiTable->PrmPlatformGuid, PlatformGuid); PrmAcpiTable->PrmModuleInfoOffset =3D OFFSET_OF (PRM_ACPI_DESCRIPT= ION_TABLE, PrmModuleInfoStructure); PrmAcpiTable->PrmModuleInfoCount =3D (UINT32) mPrmModuleCount; =20 diff --git a/PrmPkg/PrmLoaderDxe/PrmAcpiTable.h b/PrmPkg/PrmLoaderDxe/Prm= AcpiTable.h index ec3be529d119..6f9ba8f77724 100644 --- a/PrmPkg/PrmLoaderDxe/PrmAcpiTable.h +++ b/PrmPkg/PrmLoaderDxe/PrmAcpiTable.h @@ -56,6 +56,9 @@ typedef struct { =20 typedef struct { EFI_ACPI_DESCRIPTION_HEADER Header; ///< S= tandard ACPI description header + GUID PrmPlatformGuid; ///< A= GUID that uniquely identifies this platform. + ///< U= sed to check for compatibility in PRM module + ///< r= untime updates. UINT32 PrmModuleInfoOffset; ///< O= ffset in bytes from the beginning of this ///< s= tructure to the PRM Module Info array UINT32 PrmModuleInfoCount; ///< N= umber of entries in the PRM Module Info array diff --git a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf b/PrmPkg/PrmLoaderDxe/P= rmLoaderDxe.inf index 554d49685e2a..7efefdae960f 100644 --- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf +++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf @@ -31,6 +31,7 @@ [Packages] =20 [Guids] gEfiEndOfDxeEventGroupGuid + gZeroGuid =20 [LibraryClasses] BaseLib @@ -51,6 +52,7 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemRevision ## CONSU= MES gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId ## CONSU= MES gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision ## CONSU= MES + gPrmPkgTokenSpaceGuid.PcdPrmPlatformGuid ## CONSU= MES =20 [Protocols] gEfiAcpiTableProtocolGuid diff --git a/PrmPkg/PrmPkg.dec b/PrmPkg/PrmPkg.dec index 94888d1c70a4..6753ac624444 100644 --- a/PrmPkg/PrmPkg.dec +++ b/PrmPkg/PrmPkg.dec @@ -65,3 +65,13 @@ [PcdsFixedAtBuild] # report PRM handler execution time in the application. If such a Tim= erLib # instance is not available, set this PCD to FALSE in the package DSC= file. gPrmPkgTokenSpaceGuid.PcdPrmInfoPrintHandlerExecutionTime|TRUE|BOOLEAN= |0x00000003 + + ## PRM Platform GUID + # + # Uniquely identifies a specific platform targeted for PRM module upd= ates. 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 P= RM runtime + # updates are not planned for a given platform, this value should sti= ll 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 diff --git a/PrmPkg/Readme.md b/PrmPkg/Readme.md index 2a8a40c924c0..40df8f00a0c8 100644 --- a/PrmPkg/Readme.md +++ b/PrmPkg/Readme.md @@ -74,6 +74,18 @@ The following list are the currently defined build fla= gs (if any) that may be pa This structure is passed as the context buffer to PRM handlers. The s= tructure actually passed to PRM handlers is allocated and populated by the OS where it gets all the information t= o populate the context buffer from other structures. =20 +### PRM Platform GUID +**IMPORTANT** + +A configuration item that requires user attention is the PRM platform GU= ID. Each platform that uses PRM must be +uniquely identifiable so that various instances of a PRM module can targ= et 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. B= y design, this is an invalid value that will +cause an ASSERT if it is not updated. + ## Overview At a high-level, PRM can be viewed from three levels of granularity: =20 --=20 2.28.0.windows.1