REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1525

Add PCD PcdFmpDeviceImageTypeIdGuid that contains an Image
Type ID GUID value that is used if one is not provided by
FmpDeviceLib. If this PCD is not a valid GUID value,  then
gEfiCallerIdGuid is used.

Update FmpDevicePkg DSC to use PcdFmpDeviceImageTypeIdGuid
as a PatchableInModule PCD.

This content is based on the following commit.

https://github.com/microsoft/mu_tiano_plus/commit/a2c7da88d3a73dbe9b6b75952d6866179c905f28#diff-025d4889f6d3a482b49638a25e432d6d

Cc: Sean Brogan <sean.bro...@microsoft.com>
Cc: Michael Turner <michael.tur...@microsoft.com>
Cc: Bret Barkelew <bret.barke...@microsoft.com>
Cc: Liming Gao <liming....@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kin...@intel.com>
Reviewed-by: Eric Jin <eric....@intel.com>
---
 FmpDevicePkg/FmpDevicePkg.dec     |  5 +++++
 FmpDevicePkg/FmpDevicePkg.dsc     | 25 +++++++++++++++++++++++++
 FmpDevicePkg/FmpDevicePkg.uni     |  6 +++++-
 FmpDevicePkg/FmpDxe/FmpDxe.c      | 20 +++++++++++++++-----
 FmpDevicePkg/FmpDxe/FmpDxe.inf    |  1 +
 FmpDevicePkg/FmpDxe/FmpDxeLib.inf |  1 +
 6 files changed, 52 insertions(+), 6 deletions(-)

diff --git a/FmpDevicePkg/FmpDevicePkg.dec b/FmpDevicePkg/FmpDevicePkg.dec
index c68dbb7153..56ed5fbb4a 100644
--- a/FmpDevicePkg/FmpDevicePkg.dec
+++ b/FmpDevicePkg/FmpDevicePkg.dec
@@ -96,6 +96,11 @@
   # @Prompt Firmware Device Watchdog Time in Seconds.
   
gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceProgressWatchdogTimeInSeconds|0x0|UINT8|0x4000000D
 
+  ## The Image Type ID to use if one is not provided by FmpDeviceLib. If this
+  #  PCD is not a valid GUID value, then gEfiCallerIdGuid is used.
+  # @Prompt Firmware Device Image Type ID
+  gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceImageTypeIdGuid|{0}|VOID*|0x40000010
+
 [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
   ## One or more PKCS7 certificates used to verify a firmware device capsule
   #  update image.  Encoded using the Variable-Length Opaque Data format of RFC
diff --git a/FmpDevicePkg/FmpDevicePkg.dsc b/FmpDevicePkg/FmpDevicePkg.dsc
index 3356571fff..4e2bd8de3d 100644
--- a/FmpDevicePkg/FmpDevicePkg.dsc
+++ b/FmpDevicePkg/FmpDevicePkg.dsc
@@ -66,6 +66,9 @@
 [LibraryClasses.ARM]
   ArmSoftFloatLib|ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf
 
+[PcdsPatchableInModule]
+  gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceImageTypeIdGuid|{0}
+
 [Components]
   #
   # Libraries
@@ -89,6 +92,17 @@
       # FILE_GUID is used as ESRT GUID
       #
       FILE_GUID = $(SYSTEM_FMP_ESRT_GUID)
+    <PcdsFixedAtBuild>
+      #
+      # Unicode name string that is used to populate FMP Image Descriptor for 
this capsule update module
+      #
+      gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceImageIdName|L"Sample Firmware 
Device"
+      #
+      # Certificates used to authenticate capsule update image
+      #
+      !include 
BaseTools/Source/Python/Pkcs7Sign/TestRoot.cer.gFmpDevicePkgTokenSpaceGuid.PcdFmpDevicePkcs7CertBufferXdr.inc
+    <PcdsPatchableInModule>
+      
gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceImageTypeIdGuid|{GUID("$(SYSTEM_FMP_ESRT_GUID)")}
     <LibraryClasses>
       #
       # Use CapsuleUpdatePolicyLib that calls the Capsule Update Policy 
Protocol.
@@ -104,6 +118,17 @@
       # FILE_GUID is used as ESRT GUID
       #
       FILE_GUID = $(DEVICE_FMP_ESRT_GUID)
+    <PcdsFixedAtBuild>
+      #
+      # Unicode name string that is used to populate FMP Image Descriptor for 
this capsule update module
+      #
+      gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceImageIdName|L"Sample Firmware 
Device"
+      #
+      # Certificates used to authenticate capsule update image
+      #
+      !include 
BaseTools/Source/Python/Pkcs7Sign/TestRoot.cer.gFmpDevicePkgTokenSpaceGuid.PcdFmpDevicePkcs7CertBufferXdr.inc
+    <PcdsPatchableInModule>
+      
gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceImageTypeIdGuid|{GUID("$(DEVICE_FMP_ESRT_GUID)")}
     <LibraryClasses>
       #
       # Directly use a platform specific CapsuleUpdatePolicyLib instance.
diff --git a/FmpDevicePkg/FmpDevicePkg.uni b/FmpDevicePkg/FmpDevicePkg.uni
index cf27ed5316..b7fe643186 100644
--- a/FmpDevicePkg/FmpDevicePkg.uni
+++ b/FmpDevicePkg/FmpDevicePkg.uni
@@ -6,7 +6,7 @@
 // Capsules.  The behavior of the Firmware Management Protocol instance is
 // customized using libraries and PCDs.
 //
-// Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
+// Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
 //
 // SPDX-License-Identifier: BSD-2-Clause-Patent
 //
@@ -53,6 +53,10 @@
                                                                                
                           "value of 0 disables the watchdog timer.  The 
default value is 0 (watchdog"
                                                                                
                           "disabled)."
 
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceImageTypeIdGuid_PROMPT  
#language en-US "Firmware Device Image Type ID."
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceImageTypeIdGuid_HELP    
#language en-US "The Image Type ID to use if one is not provided by 
FmpDeviceLib. If this"
+                                                                               
             "PCD is not a valid GUID value, then gEfiCallerIdGuid is used."
+
 #string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDevicePkcs7CertBufferXdr_PROMPT  
#language en-US "One or more XDR encoded PKCS7 certificates used to verify 
firmware device capsule update images"
 #string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDevicePkcs7CertBufferXdr_HELP    
#language en-US "Provides one or more PKCS7 certificates used to verify a 
firmware device"
                                                                                
                "capsule update image.  This PCD is encoded using the 
Variable-Length Opaque"
diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.c b/FmpDevicePkg/FmpDxe/FmpDxe.c
index b160e0f542..7f3b6100cb 100644
--- a/FmpDevicePkg/FmpDxe/FmpDxe.c
+++ b/FmpDevicePkg/FmpDxe/FmpDxe.c
@@ -147,7 +147,9 @@ FmpDxeProgress (
 /**
   Returns a pointer to the ImageTypeId GUID value.  An attempt is made to get
   the GUID value from the FmpDeviceLib. If the FmpDeviceLib does not provide
-  a GUID value, then gEfiCallerIdGuid is returned.
+  a GUID value, then PcdFmpDeviceImageTypeIdGuid is used.  If the size of
+  PcdFmpDeviceImageTypeIdGuid is not the size of EFI_GUID, then 
gEfiCallerIdGuid
+  is returned.
 
   @return  The ImageTypeId GUID
 
@@ -159,6 +161,7 @@ GetImageTypeIdGuid (
 {
   EFI_STATUS  Status;
   EFI_GUID    *FmpDeviceLibGuid;
+  UINTN       ImageTypeIdGuidSize;
 
   FmpDeviceLibGuid = NULL;
   Status = FmpDeviceGetImageTypeIdGuidPtr (&FmpDeviceLibGuid);
@@ -166,11 +169,18 @@ GetImageTypeIdGuid (
     if (Status != EFI_UNSUPPORTED) {
       DEBUG ((DEBUG_ERROR, "FmpDxe(%s): FmpDeviceLib GetImageTypeIdGuidPtr() 
returned invalid error %r\n", mImageIdName, Status));
     }
-    return &gEfiCallerIdGuid;
-  }
-  if (FmpDeviceLibGuid == NULL) {
+  } else if (FmpDeviceLibGuid == NULL) {
     DEBUG ((DEBUG_ERROR, "FmpDxe(%s): FmpDeviceLib GetImageTypeIdGuidPtr() 
returned invalid GUID\n", mImageIdName));
-    return &gEfiCallerIdGuid;
+    Status = EFI_NOT_FOUND;
+  }
+  if (EFI_ERROR (Status)) {
+    ImageTypeIdGuidSize = PcdGetSize (PcdFmpDeviceImageTypeIdGuid);
+    if (ImageTypeIdGuidSize == sizeof (EFI_GUID)) {
+      FmpDeviceLibGuid = (EFI_GUID *)PcdGetPtr (PcdFmpDeviceImageTypeIdGuid);
+    } else {
+      DEBUG ((DEBUG_INFO, "FmpDxe(%s): Fall back to ImageTypeIdGuid of 
gEfiCallerIdGuid\n", mImageIdName));
+      FmpDeviceLibGuid = &gEfiCallerIdGuid;
+    }
   }
   return FmpDeviceLibGuid;
 }
diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.inf b/FmpDevicePkg/FmpDxe/FmpDxe.inf
index e3f9d174ef..65535a7f43 100644
--- a/FmpDevicePkg/FmpDxe/FmpDxe.inf
+++ b/FmpDevicePkg/FmpDxe/FmpDxe.inf
@@ -68,6 +68,7 @@
   gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceProgressColor                    ## 
CONSUMES
   gFmpDevicePkgTokenSpaceGuid.PcdFmpDevicePkcs7CertBufferXdr               ## 
CONSUMES
   gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceTestKeySha256Digest              ## 
CONSUMES
+  gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceImageTypeIdGuid                  ## 
CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed                            ## 
SOMETIMES_PRODUCES
 
 [Depex]
diff --git a/FmpDevicePkg/FmpDxe/FmpDxeLib.inf 
b/FmpDevicePkg/FmpDxe/FmpDxeLib.inf
index 3b639fa74d..3b10b57377 100644
--- a/FmpDevicePkg/FmpDxe/FmpDxeLib.inf
+++ b/FmpDevicePkg/FmpDxe/FmpDxeLib.inf
@@ -68,6 +68,7 @@
   gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceProgressColor                    ## 
CONSUMES
   gFmpDevicePkgTokenSpaceGuid.PcdFmpDevicePkcs7CertBufferXdr               ## 
CONSUMES
   gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceTestKeySha256Digest              ## 
CONSUMES
+  gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceImageTypeIdGuid                  ## 
CONSUMES
   gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed                            ## 
SOMETIMES_PRODUCES
 
 [Depex]
-- 
2.20.1.windows.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#45339): https://edk2.groups.io/g/devel/message/45339
Mute This Topic: https://groups.io/mt/32836434/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to