]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg: Update PCD driver to support the optimized PcdDataBase
authorLiming Gao <liming.gao@intel.com>
Fri, 22 Dec 2017 05:41:54 +0000 (13:41 +0800)
committerLiming Gao <liming.gao@intel.com>
Mon, 25 Dec 2017 03:05:57 +0000 (11:05 +0800)
https://bugzilla.tianocore.org/show_bug.cgi?id=546
BaseTools will generate the optimized PCD database to save the image size
at build time for multiple SKUs. The optimized PCD database layout will be like
below, the PCD database will be composed of the full default SKU data
(PCD_DATABASE_INIT) and the non-default SKU delta data(PCD_DATABASE_SKU_DELTA).
PCD driver will build HOB to store the full default SKU data, and patch HOB
data based on non-default SKU delta data for the SKU set by SetSku(),
it can save memory resource at boot time.

//
// PCD database layout:
// +---------------------------------+
// | PCD_DATABASE_INIT (DEFAULT SKU) |
// +---------------------------------+
// | PCD_DATABASE_SKU_DELTA (SKU A)  |
// +---------------------------------+
// | PCD_DATABASE_SKU_DELTA (SKU B)  |
// +---------------------------------+
// | ......                          |
// +---------------------------------+
//

BaseTools, PCD database and driver updates are needed for this proposal.
For single SKU (default) case, this proposal is expected to have no impact.
For multi-SKU case, PCD database format will be changed.
So, PcdDataBase Version is also updated from 6 to 7.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
MdeModulePkg/Include/Guid/PcdDataBaseSignatureGuid.h
MdeModulePkg/Universal/PCD/Dxe/Pcd.c
MdeModulePkg/Universal/PCD/Dxe/Service.c
MdeModulePkg/Universal/PCD/Dxe/Service.h
MdeModulePkg/Universal/PCD/Pei/Pcd.c
MdeModulePkg/Universal/PCD/Pei/Pcd.inf
MdeModulePkg/Universal/PCD/Pei/Service.c
MdeModulePkg/Universal/PCD/Pei/Service.h

index 9b1cb22bbbd481a40542de1e247935a9b680fac5..d670af14e909c3859a58a223f5db80c50e7e73d2 100644 (file)
@@ -61,11 +61,6 @@ typedef struct  {
   UINT16  ExGuidIndex;          // Index of GuidTable in units of GUID.\r
 } DYNAMICEX_MAPPING;\r
 \r
   UINT16  ExGuidIndex;          // Index of GuidTable in units of GUID.\r
 } DYNAMICEX_MAPPING;\r
 \r
-typedef struct {\r
-  UINT32  SkuDataStartOffset;   // Offset(with DATUM TYPE info) from the PCD_DB.\r
-  UINT32  SkuIdTableOffset;     // Offset from the PCD_DB.\r
-} SKU_HEAD;\r
-\r
 typedef struct {\r
   UINT32  StringIndex;          // Offset in String Table in units of UINT8.\r
   UINT32  DefaultValueOffset;   // Offset of the Default Value.\r
 typedef struct {\r
   UINT32  StringIndex;          // Offset in String Table in units of UINT8.\r
   UINT32  DefaultValueOffset;   // Offset of the Default Value.\r
@@ -94,8 +89,9 @@ typedef UINT32 TABLE_OFFSET;
 typedef struct {\r
     GUID                  Signature;            // PcdDataBaseGuid.\r
     UINT32                BuildVersion;\r
 typedef struct {\r
     GUID                  Signature;            // PcdDataBaseGuid.\r
     UINT32                BuildVersion;\r
-    UINT32                Length;\r
+    UINT32                Length;               // Length of DEFAULT SKU PCD DB\r
     SKU_ID                SystemSkuId;          // Current SkuId value.\r
     SKU_ID                SystemSkuId;          // Current SkuId value.\r
+    UINT32                LengthForAllSkus;     // Length of all SKU PCD DB\r
     UINT32                UninitDataBaseSize;   // Total size for PCD those default value with 0.\r
     TABLE_OFFSET          LocalTokenNumberTableOffset;\r
     TABLE_OFFSET          ExMapTableOffset;\r
     UINT32                UninitDataBaseSize;   // Total size for PCD those default value with 0.\r
     TABLE_OFFSET          LocalTokenNumberTableOffset;\r
     TABLE_OFFSET          ExMapTableOffset;\r
@@ -107,7 +103,7 @@ typedef struct {
     UINT16                LocalTokenCount;      // LOCAL_TOKEN_NUMBER for all.\r
     UINT16                ExTokenCount;         // EX_TOKEN_NUMBER for DynamicEx.\r
     UINT16                GuidTableCount;       // The Number of Guid in GuidTable.\r
     UINT16                LocalTokenCount;      // LOCAL_TOKEN_NUMBER for all.\r
     UINT16                ExTokenCount;         // EX_TOKEN_NUMBER for DynamicEx.\r
     UINT16                GuidTableCount;       // The Number of Guid in GuidTable.\r
-    UINT8                 Pad[2];               // Pad bytes to satisfy the alignment.\r
+    UINT8                 Pad[6];               // Pad bytes to satisfy the alignment.\r
 \r
     //\r
     // Default initialized external PCD database binary structure\r
 \r
     //\r
     // Default initialized external PCD database binary structure\r
@@ -115,7 +111,6 @@ typedef struct {
     // Padding is needed to keep necessary alignment\r
     //\r
     //SKU_ID                         SkuIdTable[];            // SkuIds system supports.\r
     // Padding is needed to keep necessary alignment\r
     //\r
     //SKU_ID                         SkuIdTable[];            // SkuIds system supports.\r
-    //SKU_ID                         SkuIndexTable[];         // SkuIds for each PCD with SKU enable.\r
     //UINT64                         ValueUint64[];\r
     //UINT32                         ValueUint32[];\r
     //VPD_HEAD                       VpdHead[];               // VPD Offset\r
     //UINT64                         ValueUint64[];\r
     //UINT32                         ValueUint32[];\r
     //VPD_HEAD                       VpdHead[];               // VPD Offset\r
@@ -125,7 +120,6 @@ typedef struct {
     //STRING_HEAD                    StringHead[];            // String PCD\r
     //PCD_NAME_INDEX                 PcdNameTable[];          // PCD name index info. It can be accessed by the PcdNameTableOffset.\r
     //VARIABLE_HEAD                  VariableHead[];          // HII PCD\r
     //STRING_HEAD                    StringHead[];            // String PCD\r
     //PCD_NAME_INDEX                 PcdNameTable[];          // PCD name index info. It can be accessed by the PcdNameTableOffset.\r
     //VARIABLE_HEAD                  VariableHead[];          // HII PCD\r
-    //SKU_HEAD                       SkuHead[];               // Store SKU info for each PCD with SKU enable.\r
     //UINT8                          StringTable[];           // String for String PCD value and HII PCD Variable Name. It can be accessed by StringTableOffset.\r
     //SIZE_INFO                      SizeTable[];             // MaxSize and CurSize for String PCD. It can be accessed by SizeTableOffset.\r
     //UINT16                         ValueUint16[];\r
     //UINT8                          StringTable[];           // String for String PCD value and HII PCD Variable Name. It can be accessed by StringTableOffset.\r
     //SIZE_INFO                      SizeTable[];             // MaxSize and CurSize for String PCD. It can be accessed by SizeTableOffset.\r
     //UINT16                         ValueUint16[];\r
@@ -216,4 +210,26 @@ typedef struct {
 // +-------------------------------------+\r
 //\r
 \r
 // +-------------------------------------+\r
 //\r
 \r
+#pragma pack(1)\r
+typedef struct {\r
+  SKU_ID    SkuId;\r
+  SKU_ID    SkuIdCompared;\r
+  UINT32    Length;\r
+  // PCD_DATA_DELTA   DeltaData[]\r
+} PCD_DATABASE_SKU_DELTA;\r
+\r
+//\r
+// PCD database layout:\r
+// +---------------------------------+\r
+// | PCD_DATABASE_INIT (DEFAULT SKU) |\r
+// +---------------------------------+\r
+// | PCD_DATABASE_SKU_DELTA (SKU A)  |\r
+// +---------------------------------+\r
+// | PCD_DATABASE_SKU_DELTA (SKU B)  |\r
+// +---------------------------------+\r
+// | ......                          |\r
+// +---------------------------------+\r
+//\r
+#pragma pack()\r
+\r
 #endif\r
 #endif\r
index 326644c53105cb312fa28455af3218c11c70d688..ee53ae332b5702dcc12e5f7b5096e45356fede4e 100644 (file)
@@ -269,8 +269,9 @@ DxePcdSetSku (
   IN  UINTN         SkuId\r
   )\r
 {\r
   IN  UINTN         SkuId\r
   )\r
 {\r
-  SKU_ID    *SkuIdTable;\r
-  UINTN     Index;\r
+  SKU_ID     *SkuIdTable;\r
+  UINTN      Index;\r
+  EFI_STATUS Status;\r
 \r
   if (SkuId == mPcdDatabase.DxeDb->SystemSkuId) {\r
     //\r
 \r
   if (SkuId == mPcdDatabase.DxeDb->SystemSkuId) {\r
     //\r
@@ -294,16 +295,19 @@ DxePcdSetSku (
   SkuIdTable = (SKU_ID *) ((UINT8 *) mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->SkuIdTableOffset);\r
   for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
     if (SkuId == SkuIdTable[Index + 1]) {\r
   SkuIdTable = (SKU_ID *) ((UINT8 *) mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->SkuIdTableOffset);\r
   for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
     if (SkuId == SkuIdTable[Index + 1]) {\r
-      DEBUG ((EFI_D_INFO, "PcdDxe - Set current SKU Id to 0x%lx.\n", (SKU_ID) SkuId));\r
-      mPcdDatabase.DxeDb->SystemSkuId = (SKU_ID) SkuId;\r
-      return;\r
+      Status = UpdatePcdDatabase (SkuId, TRUE);\r
+      if (!EFI_ERROR (Status)) {\r
+        mPcdDatabase.DxeDb->SystemSkuId = (SKU_ID) SkuId;\r
+        DEBUG ((DEBUG_INFO, "PcdDxe - Set current SKU Id to 0x%lx.\n", (SKU_ID) SkuId));\r
+        return;\r
+      }\r
     }\r
   }\r
 \r
   //\r
   // Invalid input SkuId, the default SKU Id will be still used for the system.\r
   //\r
     }\r
   }\r
 \r
   //\r
   // Invalid input SkuId, the default SKU Id will be still used for the system.\r
   //\r
-  DEBUG ((EFI_D_INFO, "PcdDxe - Invalid input SkuId, the default SKU Id will be still used.\n"));\r
+  DEBUG ((DEBUG_INFO, "PcdDxe - Invalid input SkuId, the default SKU Id will be still used.\n"));\r
   return;\r
 }\r
 \r
   return;\r
 }\r
 \r
index efe72483c5e65be554f7cfb99fb7ee10b1d57ec0..2745cf54d6becffe0af6a994b822707fe8769b2d 100644 (file)
@@ -37,6 +37,11 @@ LIST_ENTRY    *mCallbackFnTable;
 EFI_GUID     **TmpTokenSpaceBuffer;\r
 UINTN          TmpTokenSpaceBufferCount; \r
 \r
 EFI_GUID     **TmpTokenSpaceBuffer;\r
 UINTN          TmpTokenSpaceBufferCount; \r
 \r
+UINTN                 mPeiPcdDbSize    = 0;\r
+PEI_PCD_DATABASE      *mPeiPcdDbBinary = NULL;\r
+UINTN                 mDxePcdDbSize    = 0;\r
+DXE_PCD_DATABASE      *mDxePcdDbBinary = NULL;\r
+\r
 /**\r
   Get Local Token Number by Token Number.\r
 \r
 /**\r
   Get Local Token Number by Token Number.\r
 \r
@@ -52,11 +57,7 @@ GetLocalTokenNumber (
   IN UINTN              TokenNumber\r
   )\r
 {\r
   IN UINTN              TokenNumber\r
   )\r
 {\r
-  UINTN                 TmpTokenNumber;\r
   UINT32                *LocalTokenNumberTable;\r
   UINT32                *LocalTokenNumberTable;\r
-  UINT32                LocalTokenNumber;\r
-  UINTN                 Size;\r
-  UINTN                 MaxSize;\r
 \r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
 \r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
@@ -65,29 +66,11 @@ GetLocalTokenNumber (
   //\r
   TokenNumber--;\r
 \r
   //\r
   TokenNumber--;\r
 \r
-  //\r
-  // Backup the TokenNumber passed in as GetPtrTypeSize need the original TokenNumber\r
-  // \r
-  TmpTokenNumber = TokenNumber;\r
-\r
   LocalTokenNumberTable  = IsPeiDb ? (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) : \r
                                      (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);\r
   TokenNumber            = IsPeiDb ? TokenNumber : TokenNumber - mPeiLocalTokenCount;\r
 \r
   LocalTokenNumberTable  = IsPeiDb ? (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) : \r
                                      (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);\r
   TokenNumber            = IsPeiDb ? TokenNumber : TokenNumber - mPeiLocalTokenCount;\r
 \r
-  LocalTokenNumber = LocalTokenNumberTable[TokenNumber];\r
-\r
-  Size = (LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
-\r
-  if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
-    if (Size == 0) {\r
-      GetPtrTypeSize (TmpTokenNumber, &MaxSize);\r
-    } else {\r
-      MaxSize = Size;\r
-    }\r
-    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, MaxSize, IsPeiDb);\r
-  }\r
-\r
-  return LocalTokenNumber;\r
+  return LocalTokenNumberTable[TokenNumber];\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
@@ -753,11 +736,8 @@ LocateExPcdBinary (
   VOID\r
 ) \r
 {\r
   VOID\r
 ) \r
 {\r
-  DXE_PCD_DATABASE      *DxePcdDbBinary;\r
-  UINTN                 DxePcdDbSize;\r
   EFI_STATUS            Status;\r
  \r
   EFI_STATUS            Status;\r
  \r
-  DxePcdDbBinary = NULL;\r
   //\r
   // Search the External Pcd database from one section of current FFS, \r
   // and read it to memory\r
   //\r
   // Search the External Pcd database from one section of current FFS, \r
   // and read it to memory\r
@@ -765,20 +745,95 @@ LocateExPcdBinary (
   Status = GetSectionFromFfs (\r
              EFI_SECTION_RAW,\r
              0,\r
   Status = GetSectionFromFfs (\r
              EFI_SECTION_RAW,\r
              0,\r
-             (VOID **) &DxePcdDbBinary,\r
-             &DxePcdDbSize\r
+             (VOID **) &mDxePcdDbBinary,\r
+             &mDxePcdDbSize\r
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
   // Check the first bytes (Header Signature Guid) and build version.\r
   //\r
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
   // Check the first bytes (Header Signature Guid) and build version.\r
   //\r
-  if (!CompareGuid ((VOID *)DxePcdDbBinary, &gPcdDataBaseSignatureGuid) ||\r
-      (DxePcdDbBinary->BuildVersion != PCD_SERVICE_DXE_VERSION)) {\r
+  if (!CompareGuid ((VOID *)mDxePcdDbBinary, &gPcdDataBaseSignatureGuid) ||\r
+      (mDxePcdDbBinary->BuildVersion != PCD_SERVICE_DXE_VERSION)) {\r
     ASSERT (FALSE);\r
   }\r
 \r
     ASSERT (FALSE);\r
   }\r
 \r
-  return DxePcdDbBinary;\r
+  return mDxePcdDbBinary;\r
+}\r
+\r
+/**\r
+  Update PCD database base on current SkuId\r
+\r
+  @param   SkuId     Current SkuId\r
+  @param   IsPeiDb   Whether to update PEI PCD database.\r
+\r
+  @retval EFI_SUCCESS    Update PCD database successfully.\r
+  @retval EFI_NOT_FOUND  Not found PCD database for current SkuId.\r
+**/\r
+EFI_STATUS\r
+UpdatePcdDatabase (\r
+  IN SKU_ID        SkuId,\r
+  IN BOOLEAN       IsPeiDb\r
+  )\r
+{\r
+  UINTN                       Index;\r
+  PCD_DATABASE_SKU_DELTA      *SkuDelta;\r
+  PCD_DATA_DELTA              *SkuDeltaData;\r
+\r
+  if (IsPeiDb && mPeiPcdDbBinary != NULL) {\r
+    //\r
+    // Find the delta data for PEI DB\r
+    //\r
+    Index    = (mPcdDatabase.PeiDb->Length + 7) & (~7);\r
+    SkuDelta = NULL;\r
+    while (Index < mPeiPcdDbSize) {\r
+      SkuDelta = (PCD_DATABASE_SKU_DELTA *) ((UINT8 *) mPeiPcdDbBinary + Index);\r
+      if (SkuDelta->SkuId == (UINT16) SkuId && SkuDelta->SkuIdCompared == 0) {\r
+        break;\r
+      }\r
+      Index = (Index + SkuDelta->Length + 7) & (~7);\r
+    }\r
+\r
+    //\r
+    // Patch the delta data into current PCD database\r
+    //\r
+    if (Index < mPeiPcdDbSize && SkuDelta != NULL) {\r
+      SkuDeltaData = (PCD_DATA_DELTA *) (SkuDelta + 1);\r
+      while ((UINT8 *) SkuDeltaData < (UINT8 *) SkuDelta + SkuDelta->Length) {\r
+        *((UINT8 *) mPcdDatabase.PeiDb + SkuDeltaData->Offset) = (UINT8) SkuDeltaData->Value;\r
+        SkuDeltaData ++;\r
+      }\r
+    } else {\r
+      return EFI_NOT_FOUND;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Find the delta data for DXE DB\r
+  //\r
+  Index    = (mPcdDatabase.DxeDb->Length + 7) & (~7);\r
+  SkuDelta = NULL;\r
+  while (Index < mDxePcdDbSize) {\r
+    SkuDelta = (PCD_DATABASE_SKU_DELTA *) ((UINT8 *) mDxePcdDbBinary + Index);\r
+    if (SkuDelta->SkuId == SkuId && SkuDelta->SkuIdCompared == 0) {\r
+      break;\r
+    }\r
+    Index = (Index + SkuDelta->Length + 7) & (~7);\r
+  }\r
+\r
+  //\r
+  // Patch the delta data into current PCD database\r
+  //\r
+  if (Index < mDxePcdDbSize && SkuDelta != NULL) {\r
+    SkuDeltaData = (PCD_DATA_DELTA *) (SkuDelta + 1);\r
+    while ((UINT8 *) SkuDeltaData < (UINT8 *) SkuDelta + SkuDelta->Length) {\r
+      *((UINT8 *) mPcdDatabase.DxeDb + SkuDeltaData->Offset) = (UINT8) SkuDeltaData->Value;\r
+      SkuDeltaData ++;\r
+    }\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
@@ -798,6 +853,7 @@ BuildPcdDxeDataBase (
   UINTN               Index;\r
   UINT32              PcdDxeDbLen;\r
   VOID                *PcdDxeDb;\r
   UINTN               Index;\r
   UINT32              PcdDxeDbLen;\r
   VOID                *PcdDxeDb;\r
+  EFI_STATUS          Status;\r
 \r
   //\r
   // Assign PCD Entries with default value to PCD DATABASE\r
 \r
   //\r
   // Assign PCD Entries with default value to PCD DATABASE\r
@@ -808,7 +864,6 @@ BuildPcdDxeDataBase (
   PcdDxeDb = AllocateZeroPool (PcdDxeDbLen);\r
   ASSERT (PcdDxeDb != NULL);\r
   CopyMem (PcdDxeDb, mPcdDatabase.DxeDb, mPcdDatabase.DxeDb->Length);\r
   PcdDxeDb = AllocateZeroPool (PcdDxeDbLen);\r
   ASSERT (PcdDxeDb != NULL);\r
   CopyMem (PcdDxeDb, mPcdDatabase.DxeDb, mPcdDatabase.DxeDb->Length);\r
-  FreePool (mPcdDatabase.DxeDb);\r
   mPcdDatabase.DxeDb = PcdDxeDb;\r
 \r
   GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
   mPcdDatabase.DxeDb = PcdDxeDb;\r
 \r
   GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
@@ -820,8 +875,17 @@ BuildPcdDxeDataBase (
     // be NULL. If it is NULL, we just copy over the DXE Default\r
     // Value to PCD Database.\r
     //\r
     // be NULL. If it is NULL, we just copy over the DXE Default\r
     // Value to PCD Database.\r
     //\r
-    \r
     PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
     PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
+\r
+    //\r
+    // Get next one that stores full PEI data\r
+    //\r
+    GuidHob = GetNextGuidHob (&gPcdDataBaseHobGuid, GET_NEXT_HOB (GuidHob));\r
+    if (GuidHob != NULL) {\r
+      mPeiPcdDbBinary = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
+      mPeiPcdDbSize   = (UINTN) GET_GUID_HOB_DATA_SIZE (GuidHob);\r
+    }\r
+\r
     //\r
     // Assign PCD Entries refereneced in PEI phase to PCD DATABASE\r
     //\r
     //\r
     // Assign PCD Entries refereneced in PEI phase to PCD DATABASE\r
     //\r
@@ -829,6 +893,10 @@ BuildPcdDxeDataBase (
     //\r
     // Inherit the SystemSkuId from PEI phase.\r
     //\r
     //\r
     // Inherit the SystemSkuId from PEI phase.\r
     //\r
+    if (mPcdDatabase.PeiDb->SystemSkuId != 0) {\r
+      Status = UpdatePcdDatabase (mPcdDatabase.PeiDb->SystemSkuId, FALSE);\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
     mPcdDatabase.DxeDb->SystemSkuId = mPcdDatabase.PeiDb->SystemSkuId;\r
   } else {\r
     mPcdDatabase.PeiDb = AllocateZeroPool (sizeof (PEI_PCD_DATABASE));\r
     mPcdDatabase.DxeDb->SystemSkuId = mPcdDatabase.PeiDb->SystemSkuId;\r
   } else {\r
     mPcdDatabase.PeiDb = AllocateZeroPool (sizeof (PEI_PCD_DATABASE));\r
@@ -939,94 +1007,6 @@ GetHiiVariable (
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
-/**\r
-  Find the local token number according to system SKU ID.\r
-\r
-  @param LocalTokenNumber PCD token number\r
-  @param Size             The size of PCD entry.\r
-  @param IsPeiDb          If TRUE, the PCD entry is initialized in PEI phase.\r
-                          If False, the PCD entry is initialized in DXE phase.\r
-\r
-  @return Token number according to system SKU ID.\r
-\r
-**/\r
-UINT32\r
-GetSkuEnabledTokenNumber (\r
-  UINT32    LocalTokenNumber,\r
-  UINTN     Size,\r
-  BOOLEAN   IsPeiDb\r
-  ) \r
-{\r
-  SKU_HEAD              *SkuHead;\r
-  SKU_ID                *SkuIdTable;\r
-  UINTN                 Index;\r
-  UINT8                 *Value;\r
-  UINT8                 *PcdDb;\r
-  BOOLEAN               FoundSku;\r
-\r
-  ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
-\r
-  PcdDb = IsPeiDb ? (UINT8 *) mPcdDatabase.PeiDb : (UINT8 *) mPcdDatabase.DxeDb;\r
-\r
-  SkuHead     = (SKU_HEAD *) (PcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
-  Value       = (UINT8 *) (PcdDb + SkuHead->SkuDataStartOffset); \r
-\r
-  SkuIdTable =  (SKU_ID *)(PcdDb + SkuHead->SkuIdTableOffset);\r
-  //\r
-  // Find the current system's SKU ID entry in SKU ID table.\r
-  //\r
-  FoundSku = FALSE;\r
-  for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-    if (mPcdDatabase.DxeDb->SystemSkuId == SkuIdTable[Index + 1]) {\r
-      FoundSku = TRUE;\r
-      break;\r
-    }\r
-  }\r
-  \r
-  //\r
-  // Find the default SKU ID entry in SKU ID table.\r
-  //\r
-  \r
-  if(!FoundSku) {\r
-    for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-      if (0 == SkuIdTable[Index + 1]) {\r
-        break;\r
-      }\r
-    }\r
-  }\r
-  ASSERT (Index < SkuIdTable[0]);\r
-\r
-  switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
-    case PCD_TYPE_VPD:\r
-      Value = (UINT8 *) &(((VPD_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - PcdDb) | PCD_TYPE_VPD);\r
-\r
-    case PCD_TYPE_HII:\r
-      Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII);\r
-\r
-    case PCD_TYPE_HII|PCD_TYPE_STRING:\r
-      Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII | PCD_TYPE_STRING);\r
-\r
-    case PCD_TYPE_STRING:\r
-      Value = (UINT8 *) &(((STRING_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - PcdDb) | PCD_TYPE_STRING);\r
-      \r
-    case PCD_TYPE_DATA:\r
-      Value += Size * Index;\r
-      return (UINT32) ((Value - PcdDb) | PCD_TYPE_DATA);\r
-\r
-    default:\r
-      ASSERT (FALSE);\r
-  }\r
-\r
-  ASSERT (FALSE);\r
-\r
-  return 0;\r
-  \r
-}\r
-\r
 /**\r
   Invoke the callback function when dynamic PCD entry was set, if this PCD entry \r
   has registered callback function.\r
 /**\r
   Invoke the callback function when dynamic PCD entry was set, if this PCD entry \r
   has registered callback function.\r
@@ -1640,41 +1620,6 @@ GetExPcdTokenNumber (
   return 0;\r
 }\r
 \r
   return 0;\r
 }\r
 \r
-/**\r
-  Get SKU ID table from PCD database.\r
-\r
-  @param LocalTokenNumberTableIdx Index of local token number in token number table.\r
-  @param IsPeiDb                  If TRUE, the pcd entry is initialized in PEI phase,\r
-                                  If FALSE, the pcd entry is initialized in DXE phase.\r
-  @return Pointer to SKU ID array table\r
-\r
-**/\r
-SKU_ID *\r
-GetSkuIdArray (\r
-  IN    UINTN             LocalTokenNumberTableIdx,\r
-  IN    BOOLEAN           IsPeiDb\r
-  )\r
-{\r
-  SKU_HEAD  *SkuHead;\r
-  UINTN     LocalTokenNumber;\r
-  UINT8     *Database;\r
-\r
-  if (IsPeiDb) {\r
-    LocalTokenNumber = *((UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) + LocalTokenNumberTableIdx);\r
-    Database         = (UINT8 *) mPcdDatabase.PeiDb;\r
-  } else {\r
-    LocalTokenNumber = *((UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset) + LocalTokenNumberTableIdx);\r
-    Database         = (UINT8 *) mPcdDatabase.DxeDb;\r
-  }\r
-\r
-  ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) != 0);\r
-\r
-  SkuHead = (SKU_HEAD *) ((UINT8 *)Database + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
-\r
-  return (SKU_ID *) (Database + SkuHead->SkuIdTableOffset);\r
-  \r
-}\r
-\r
 /**\r
   Wrapper function of getting index of PCD entry in size table.\r
   \r
 /**\r
   Wrapper function of getting index of PCD entry in size table.\r
   \r
@@ -1694,7 +1639,6 @@ GetSizeTableIndex (
   UINTN  LocalTokenNumber;\r
   UINTN  Index;\r
   UINTN  SizeTableIdx;\r
   UINTN  LocalTokenNumber;\r
   UINTN  Index;\r
   UINTN  SizeTableIdx;\r
-  SKU_ID *SkuIdTable;\r
   \r
   if (IsPeiDb) {\r
     LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset);\r
   \r
   if (IsPeiDb) {\r
     LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset);\r
@@ -1721,22 +1665,12 @@ GetSizeTableIndex (
           //\r
           SizeTableIdx += 2;\r
       } else {\r
           //\r
           SizeTableIdx += 2;\r
       } else {\r
-        if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
           //\r
           // We have only two entry for Non-Sku enabled PCD entry:\r
           // 1) MAX SIZE\r
           // 2) Current Size\r
           //\r
           SizeTableIdx += 2;\r
           //\r
           // We have only two entry for Non-Sku enabled PCD entry:\r
           // 1) MAX SIZE\r
           // 2) Current Size\r
           //\r
           SizeTableIdx += 2;\r
-        } else {\r
-          //\r
-          // We have these entry for SKU enabled PCD entry\r
-          // 1) MAX SIZE\r
-          // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
-          //\r
-          SkuIdTable = GetSkuIdArray (Index, IsPeiDb);\r
-          SizeTableIdx += (UINTN)*SkuIdTable + 1;\r
-        }\r
       }\r
     }\r
 \r
       }\r
     }\r
 \r
@@ -1762,9 +1696,7 @@ GetPtrTypeSize (
 {\r
   INTN        SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
 {\r
   INTN        SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
-  SKU_ID      *SkuIdTable;\r
   SIZE_INFO   *SizeTable;\r
   SIZE_INFO   *SizeTable;\r
-  UINTN       Index;\r
   BOOLEAN     IsPeiDb;\r
   UINT32      *LocalTokenNumberTable;\r
 \r
   BOOLEAN     IsPeiDb;\r
   UINT32      *LocalTokenNumberTable;\r
 \r
@@ -1803,27 +1735,12 @@ GetPtrTypeSize (
       //\r
       return *MaxSize;\r
   } else {\r
       //\r
       return *MaxSize;\r
   } else {\r
-    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
       //\r
       // We have only two entry for Non-Sku enabled PCD entry:\r
       // 1) MAX SIZE\r
       // 2) Current Size\r
       //\r
       return SizeTable[SizeTableIdx + 1];\r
       //\r
       // We have only two entry for Non-Sku enabled PCD entry:\r
       // 1) MAX SIZE\r
       // 2) Current Size\r
       //\r
       return SizeTable[SizeTableIdx + 1];\r
-    } else {\r
-      //\r
-      // We have these entry for SKU enabled PCD entry\r
-      // 1) MAX SIZE\r
-      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
-      //\r
-      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);\r
-      for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-        if (SkuIdTable[1 + Index] == mPcdDatabase.DxeDb->SystemSkuId) {\r
-          return SizeTable[SizeTableIdx + 1 + Index];\r
-        }\r
-      }\r
-      return SizeTable[SizeTableIdx + 1];\r
-    }\r
   }\r
 }\r
 \r
   }\r
 }\r
 \r
@@ -1845,9 +1762,7 @@ SetPtrTypeSize (
 {\r
   INTN        SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
 {\r
   INTN        SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
-  SKU_ID      *SkuIdTable;\r
   SIZE_INFO   *SizeTable;\r
   SIZE_INFO   *SizeTable;\r
-  UINTN       Index;\r
   UINTN       MaxSize;\r
   BOOLEAN     IsPeiDb;\r
   UINT32      *LocalTokenNumberTable;\r
   UINTN       MaxSize;\r
   BOOLEAN     IsPeiDb;\r
   UINT32      *LocalTokenNumberTable;\r
@@ -1892,30 +1807,13 @@ SetPtrTypeSize (
        return FALSE;\r
     } \r
     \r
        return FALSE;\r
     } \r
     \r
-    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
-      //\r
-      // We have only two entry for Non-Sku enabled PCD entry:\r
-      // 1) MAX SIZE\r
-      // 2) Current Size\r
-      //\r
-      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
-      return TRUE;\r
-    } else {\r
-      //\r
-      // We have these entry for SKU enabled PCD entry\r
-      // 1) MAX SIZE\r
-      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
-      //\r
-      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);\r
-      for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-        if (SkuIdTable[1 + Index] == mPcdDatabase.DxeDb->SystemSkuId) {\r
-          SizeTable[SizeTableIdx + 1 + Index] = (SIZE_INFO) *CurrentSize;\r
-          return TRUE;\r
-        }\r
-      }\r
-      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
-      return TRUE;\r
-    }\r
+    //\r
+    // We have only two entry for Non-Sku enabled PCD entry:\r
+    // 1) MAX SIZE\r
+    // 2) Current Size\r
+    //\r
+    SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
+    return TRUE;\r
   }\r
 }\r
 \r
   }\r
 }\r
 \r
index 0257a3487cc4c7d904c9b08dc8bdaecb54866193..cd0e227705166429f79dd8d1b8a35456d96ad7ad 100644 (file)
@@ -39,7 +39,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 // Please make sure the PCD Serivce DXE Version is consistent with\r
 // the version of the generated DXE PCD Database by build tool.\r
 //\r
 // Please make sure the PCD Serivce DXE Version is consistent with\r
 // the version of the generated DXE PCD Database by build tool.\r
 //\r
-#define PCD_SERVICE_DXE_VERSION      6\r
+#define PCD_SERVICE_DXE_VERSION      7\r
 \r
 //\r
 // PCD_DXE_SERVICE_DRIVER_VERSION is defined in Autogen.h.\r
 \r
 //\r
 // PCD_DXE_SERVICE_DRIVER_VERSION is defined in Autogen.h.\r
@@ -961,24 +961,6 @@ ExGetWorker (
   IN UINTN                  GetSize\r
   );\r
 \r
   IN UINTN                  GetSize\r
   );\r
 \r
-/**\r
-  Find the local token number according to system SKU ID.\r
-\r
-  @param LocalTokenNumber PCD token number\r
-  @param Size             The size of PCD entry.\r
-  @param IsPeiDb          If TRUE, the PCD entry is initialized in PEI phase.\r
-                          If False, the PCD entry is initialized in DXE phase.\r
-\r
-  @return Token number according to system SKU ID.\r
-\r
-**/\r
-UINT32\r
-GetSkuEnabledTokenNumber (\r
-  UINT32 LocalTokenNumber,\r
-  UINTN  Size,\r
-  BOOLEAN IsPeiDb\r
-  );\r
-\r
 /**\r
   Get Variable which contains HII type PCD entry.\r
 \r
 /**\r
   Get Variable which contains HII type PCD entry.\r
 \r
@@ -1177,6 +1159,21 @@ VariableLockCallBack (
   IN VOID               *Context\r
   );\r
 \r
   IN VOID               *Context\r
   );\r
 \r
+/**\r
+  Update PCD database base on current SkuId\r
+\r
+  @param   SkuId     Current SkuId\r
+  @param   IsPeiDb   Whether to update PEI PCD database.\r
+\r
+  @retval EFI_SUCCESS    Update PCD database successfully.\r
+  @retval EFI_NOT_FOUND  Not found PCD database for current SkuId.\r
+**/\r
+EFI_STATUS\r
+UpdatePcdDatabase (\r
+  IN SKU_ID        SkuId,\r
+  IN BOOLEAN       IsPeiDb\r
+  );\r
+\r
 extern  PCD_DATABASE   mPcdDatabase;\r
 \r
 extern  UINT32         mPcdTotalTokenCount; \r
 extern  PCD_DATABASE   mPcdDatabase;\r
 \r
 extern  UINT32         mPcdTotalTokenCount; \r
index 91eb9d6ccf4c67d319d71d71313ce3eb3e63a4ab..f8213953fa2b4fa7600a72335376a0324533d4cd 100644 (file)
@@ -228,6 +228,103 @@ PcdSetNvStoreDefaultIdCallBack (
   ASSERT_EFI_ERROR (Status);\r
 }\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 }\r
 \r
+/**\r
+  Report Pei PCD database of all SKUs as Guid HOB so that DxePcd can access it.\r
+\r
+  @param PeiServices       An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation\r
+  @param NotifyDescriptor  Address of the notification descriptor data structure.\r
+  @param Ppi               Address of the PPI that was installed.\r
+\r
+  @retval EFI_SUCCESS      Successfully update the Boot records.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EndOfPeiSignalPpiNotifyCallback (\r
+  IN EFI_PEI_SERVICES           **PeiServices,\r
+  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,\r
+  IN VOID                       *Ppi\r
+  )\r
+{\r
+  PEI_PCD_DATABASE       *Database;\r
+  EFI_BOOT_MODE          BootMode;\r
+  EFI_STATUS             Status;\r
+  UINTN                  Instance;\r
+  EFI_PEI_FV_HANDLE      VolumeHandle;\r
+  EFI_PEI_FILE_HANDLE    FileHandle;\r
+  VOID                   *PcdDb;\r
+  UINT32                 Length;\r
+  PEI_PCD_DATABASE       *PeiPcdDb;\r
+\r
+  Status = PeiServicesGetBootMode(&BootMode);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Don't need to report it on S3 boot.\r
+  //\r
+  if (BootMode == BOOT_ON_S3_RESUME) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  PeiPcdDb = GetPcdDatabase();\r
+  if (PeiPcdDb->SystemSkuId != (SKU_ID) 0) {\r
+    //\r
+    // SkuId has been set. Don't need to report it to DXE phase.\r
+    //\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  //\r
+  // Get full PCD database from PcdPeim FileHandle\r
+  //\r
+  Instance    = 0;\r
+  FileHandle  = NULL;\r
+  while (TRUE) {\r
+    //\r
+    // Traverse all firmware volume instances\r
+    //\r
+    Status = PeiServicesFfsFindNextVolume (Instance, &VolumeHandle);\r
+    //\r
+    // Error should not happen\r
+    //\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    //\r
+    // Find PcdDb file from the beginning in this firmware volume.\r
+    //\r
+    FileHandle = NULL;\r
+    Status = PeiServicesFfsFindFileByName (&gEfiCallerIdGuid, VolumeHandle, &FileHandle);\r
+    if (!EFI_ERROR (Status)) {\r
+      //\r
+      // Find PcdPeim FileHandle in this volume\r
+      //\r
+      break;\r
+    }\r
+    //\r
+    // We cannot find PcdPeim in this firmware volume, then search the next volume.\r
+    //\r
+    Instance++;\r
+  }\r
+\r
+  //\r
+  // Find PEI PcdDb and Build second PcdDB GuidHob\r
+  //\r
+  Status = PeiServicesFfsFindSectionData (EFI_SECTION_RAW, FileHandle, &PcdDb);\r
+  ASSERT_EFI_ERROR (Status);\r
+  Length = PeiPcdDb->LengthForAllSkus;\r
+  Database = BuildGuidHob (&gPcdDataBaseHobGuid, Length);\r
+  CopyMem (Database, PcdDb, Length);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_PEI_NOTIFY_DESCRIPTOR mEndOfPeiSignalPpiNotifyList[] = {\r
+  {\r
+    (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+    &gEfiEndOfPeiSignalPpiGuid,\r
+    EndOfPeiSignalPpiNotifyCallback\r
+  }\r
+};\r
+\r
 /**\r
   Main entry for PCD PEIM driver.\r
   \r
 /**\r
   Main entry for PCD PEIM driver.\r
   \r
@@ -262,6 +359,9 @@ PcdPeimInit (
   Status = PeiServicesInstallPpi (&mPpiList2[0]);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   Status = PeiServicesInstallPpi (&mPpiList2[0]);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  Status = PeiServicesNotifyPpi (&mEndOfPeiSignalPpiNotifyList[0]);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   Status = PeiRegisterCallBackOnSet (\r
              &gEfiMdeModulePkgTokenSpaceGuid,\r
              PcdToken(PcdSetNvStoreDefaultId),\r
   Status = PeiRegisterCallBackOnSet (\r
              &gEfiMdeModulePkgTokenSpaceGuid,\r
              PcdToken(PcdSetNvStoreDefaultId),\r
@@ -366,6 +466,14 @@ PeiPcdSetSku (
   PEI_PCD_DATABASE  *PeiPcdDb;\r
   SKU_ID            *SkuIdTable;\r
   UINTN             Index;\r
   PEI_PCD_DATABASE  *PeiPcdDb;\r
   SKU_ID            *SkuIdTable;\r
   UINTN             Index;\r
+  EFI_STATUS            Status;\r
+  UINTN                 Instance;\r
+  EFI_PEI_FV_HANDLE     VolumeHandle;\r
+  EFI_PEI_FILE_HANDLE   FileHandle;\r
+  VOID                  *PcdDb;\r
+  UINT32                Length;\r
+  PCD_DATABASE_SKU_DELTA *SkuDelta;\r
+  PCD_DATA_DELTA         *SkuDeltaData;\r
 \r
   PeiPcdDb = GetPcdDatabase();\r
 \r
 \r
   PeiPcdDb = GetPcdDatabase();\r
 \r
@@ -391,8 +499,70 @@ PeiPcdSetSku (
   SkuIdTable = (SKU_ID *) ((UINT8 *) PeiPcdDb + PeiPcdDb->SkuIdTableOffset);\r
   for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
     if (SkuId == SkuIdTable[Index + 1]) {\r
   SkuIdTable = (SKU_ID *) ((UINT8 *) PeiPcdDb + PeiPcdDb->SkuIdTableOffset);\r
   for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
     if (SkuId == SkuIdTable[Index + 1]) {\r
-      DEBUG ((EFI_D_INFO, "PcdPei - Set current SKU Id to 0x%lx.\n", (SKU_ID) SkuId));\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (Index < SkuIdTable[0]) {\r
+    //\r
+    // Get full PCD database from PcdPeim FileHandle\r
+    //\r
+    Instance    = 0;\r
+    FileHandle  = NULL;\r
+    while (TRUE) {\r
+      //\r
+      // Traverse all firmware volume instances\r
+      //\r
+      Status = PeiServicesFfsFindNextVolume (Instance, &VolumeHandle);\r
+      //\r
+      // Error should not happen\r
+      //\r
+      ASSERT_EFI_ERROR (Status);\r
+\r
+      //\r
+      // Find PcdDb file from the beginning in this firmware volume.\r
+      //\r
+      FileHandle = NULL;\r
+      Status = PeiServicesFfsFindFileByName (&gEfiCallerIdGuid, VolumeHandle, &FileHandle);\r
+      if (!EFI_ERROR (Status)) {\r
+        //\r
+        // Find PcdPeim FileHandle in this volume\r
+        //\r
+        break;\r
+      }\r
+      //\r
+      // We cannot find PcdPeim in this firmware volume, then search the next volume.\r
+      //\r
+      Instance++;\r
+    }\r
+\r
+    //\r
+    // Find the delta data between the different Skus\r
+    //\r
+    Status = PeiServicesFfsFindSectionData (EFI_SECTION_RAW, FileHandle, &PcdDb);\r
+    ASSERT_EFI_ERROR (Status);\r
+    Length = PeiPcdDb->LengthForAllSkus;\r
+    Index  = (PeiPcdDb->Length + 7) & (~7);\r
+    SkuDelta = NULL;\r
+    while (Index < Length) {\r
+      SkuDelta = (PCD_DATABASE_SKU_DELTA *) ((UINT8 *) PcdDb + Index);\r
+      if (SkuDelta->SkuId == SkuId && SkuDelta->SkuIdCompared == 0) {\r
+        break;\r
+      }\r
+      Index = (Index + SkuDelta->Length + 7) & (~7);\r
+    }\r
+\r
+    //\r
+    // Patch the delta data into current PCD database\r
+    //\r
+    if (Index < Length && SkuDelta != NULL) {\r
+      SkuDeltaData = (PCD_DATA_DELTA *) (SkuDelta + 1);\r
+      while ((UINT8 *) SkuDeltaData < (UINT8 *) SkuDelta + SkuDelta->Length) {\r
+        *((UINT8 *) PeiPcdDb + SkuDeltaData->Offset) = (UINT8) SkuDeltaData->Value;\r
+        SkuDeltaData ++;\r
+      }\r
       PeiPcdDb->SystemSkuId = (SKU_ID) SkuId;\r
       PeiPcdDb->SystemSkuId = (SKU_ID) SkuId;\r
+      DEBUG ((DEBUG_INFO, "PcdPei - Set current SKU Id to 0x%lx.\n", (SKU_ID) SkuId));\r
       return;\r
     }\r
   }\r
       return;\r
     }\r
   }\r
@@ -401,6 +571,7 @@ PeiPcdSetSku (
   // Invalid input SkuId, the default SKU Id will be still used for the system.\r
   //\r
   DEBUG ((EFI_D_INFO, "PcdPei - Invalid input SkuId, the default SKU Id will be still used.\n"));\r
   // Invalid input SkuId, the default SKU Id will be still used for the system.\r
   //\r
   DEBUG ((EFI_D_INFO, "PcdPei - Invalid input SkuId, the default SKU Id will be still used.\n"));\r
+\r
   return;\r
 }\r
 \r
   return;\r
 }\r
 \r
@@ -1406,9 +1577,7 @@ GetPtrTypeSize (
 {\r
   INTN        SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
 {\r
   INTN        SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
-  SKU_ID      *SkuIdTable;\r
   SIZE_INFO   *SizeTable;\r
   SIZE_INFO   *SizeTable;\r
-  UINTN       Index;\r
 \r
   SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
 \r
 \r
   SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
 \r
@@ -1432,27 +1601,12 @@ GetPtrTypeSize (
       //\r
       return *MaxSize;\r
   } else {\r
       //\r
       return *MaxSize;\r
   } else {\r
-    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
-      //\r
-      // We have only two entry for Non-Sku enabled PCD entry:\r
-      // 1) MAX SIZE\r
-      // 2) Current Size\r
-      //\r
-      return SizeTable[SizeTableIdx + 1];\r
-    } else {\r
-      //\r
-      // We have these entry for SKU enabled PCD entry\r
-      // 1) MAX SIZE\r
-      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
-      //\r
-      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
-      for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-        if (SkuIdTable[1 + Index] == Database->SystemSkuId) {\r
-          return SizeTable[SizeTableIdx + 1 + Index];\r
-        }\r
-      }\r
-      return SizeTable[SizeTableIdx + 1];\r
-    }\r
+    //\r
+    // We have only two entry for Non-Sku enabled PCD entry:\r
+    // 1) MAX SIZE\r
+    // 2) Current Size\r
+    //\r
+    return SizeTable[SizeTableIdx + 1];\r
   }\r
 }\r
 \r
   }\r
 }\r
 \r
@@ -1479,9 +1633,7 @@ SetPtrTypeSize (
 {\r
   INTN        SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
 {\r
   INTN        SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
-  SKU_ID      *SkuIdTable;\r
   SIZE_INFO   *SizeTable;\r
   SIZE_INFO   *SizeTable;\r
-  UINTN       Index;\r
   UINTN       MaxSize;\r
   \r
   SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
   UINTN       MaxSize;\r
   \r
   SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
@@ -1510,30 +1662,13 @@ SetPtrTypeSize (
        return FALSE;\r
     }\r
     \r
        return FALSE;\r
     }\r
     \r
-    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
-      //\r
-      // We have only two entry for Non-Sku enabled PCD entry:\r
-      // 1) MAX SIZE\r
-      // 2) Current Size\r
-      //\r
-      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
-      return TRUE;\r
-    } else {\r
-      //\r
-      // We have these entry for SKU enabled PCD entry\r
-      // 1) MAX SIZE\r
-      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
-      //\r
-      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
-      for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-        if (SkuIdTable[1 + Index] == Database->SystemSkuId) {\r
-          SizeTable[SizeTableIdx + 1 + Index] = (SIZE_INFO) *CurrentSize;\r
-          return TRUE;\r
-        }\r
-      }\r
-      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
-      return TRUE;\r
-    }\r
+    //\r
+    // We have only two entry for Non-Sku enabled PCD entry:\r
+    // 1) MAX SIZE\r
+    // 2) Current Size\r
+    //\r
+    SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
+    return TRUE;\r
   }\r
 \r
 }\r
   }\r
 \r
 }\r
index 8f778e1927372b733cb990c0a17002d35b06b92e..e1ea5be17f0620606645c010d4b376232ea3ef74 100644 (file)
   gEfiPeiPcdPpiGuid                             ## PRODUCES\r
   gGetPcdInfoPpiGuid                            ## SOMETIMES_PRODUCES\r
   gEfiGetPcdInfoPpiGuid                         ## SOMETIMES_PRODUCES\r
   gEfiPeiPcdPpiGuid                             ## PRODUCES\r
   gGetPcdInfoPpiGuid                            ## SOMETIMES_PRODUCES\r
   gEfiGetPcdInfoPpiGuid                         ## SOMETIMES_PRODUCES\r
+  gEfiEndOfPeiSignalPpiGuid                     ## NOTIFY\r
 \r
 [FeaturePcd]\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiFullPcdDatabaseEnable  ## CONSUMES\r
 \r
 [FeaturePcd]\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiFullPcdDatabaseEnable  ## CONSUMES\r
index 5e1cb72ba5d5936ced5e393fef8998454391e542..e8a0b6ca10f90441e88f9e1bdafa2927610606c1 100644 (file)
@@ -30,8 +30,6 @@ GetLocalTokenNumber (
   )\r
 {\r
   UINT32                LocalTokenNumber;\r
   )\r
 {\r
   UINT32                LocalTokenNumber;\r
-  UINTN                 Size;\r
-  UINTN                 MaxSize;\r
 \r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
 \r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
@@ -42,17 +40,6 @@ GetLocalTokenNumber (
 \r
   LocalTokenNumber = *((UINT32 *)((UINT8 *)Database + Database->LocalTokenNumberTableOffset) + TokenNumber);\r
 \r
 \r
   LocalTokenNumber = *((UINT32 *)((UINT8 *)Database + Database->LocalTokenNumberTableOffset) + TokenNumber);\r
 \r
-  Size = (LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
-\r
-  if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
-    if (Size == 0) {\r
-      GetPtrTypeSize (TokenNumber, &MaxSize, Database);\r
-    } else {\r
-      MaxSize = Size;\r
-    }\r
-    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, MaxSize);\r
-  }\r
-\r
   return LocalTokenNumber;\r
 }\r
 \r
   return LocalTokenNumber;\r
 }\r
 \r
@@ -532,89 +519,6 @@ GetHiiVariable (
   return EFI_NOT_FOUND;\r
 }\r
 \r
   return EFI_NOT_FOUND;\r
 }\r
 \r
-/**\r
-  Find the local token number according to system SKU ID.\r
-\r
-  @param LocalTokenNumber PCD token number\r
-  @param Size             The size of PCD entry.\r
-\r
-  @return Token number according to system SKU ID.\r
-\r
-**/\r
-UINT32\r
-GetSkuEnabledTokenNumber (\r
-  UINT32 LocalTokenNumber,\r
-  UINTN  Size\r
-  ) \r
-{\r
-  PEI_PCD_DATABASE      *PeiPcdDb;\r
-  SKU_HEAD              *SkuHead;\r
-  SKU_ID                *SkuIdTable;\r
-  UINTN                 Index;\r
-  UINT8                 *Value;\r
-  BOOLEAN               FoundSku;\r
-\r
-  PeiPcdDb = GetPcdDatabase ();\r
-\r
-  ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
-\r
-  SkuHead     = (SKU_HEAD *) ((UINT8 *)PeiPcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
-  Value       = (UINT8 *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuDataStartOffset));\r
-  SkuIdTable  = (SKU_ID *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuIdTableOffset));\r
-\r
-  //\r
-  // Find the current system's SKU ID entry in SKU ID table.\r
-  //\r
-  FoundSku = FALSE;\r
-  for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-    if (PeiPcdDb->SystemSkuId == SkuIdTable[Index + 1]) {\r
-      FoundSku = TRUE;\r
-      break;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Find the default SKU ID entry in SKU ID table.\r
-  //\r
-  if(!FoundSku) {\r
-    for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-      if (0 == SkuIdTable[Index + 1]) {\r
-        break;\r
-      }\r
-    }\r
-  }\r
-  ASSERT (Index < SkuIdTable[0]);\r
-\r
-  switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
-    case PCD_TYPE_VPD:\r
-      Value = (UINT8 *) &(((VPD_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_VPD);\r
-\r
-    case PCD_TYPE_HII:\r
-      Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII);\r
-\r
-    case PCD_TYPE_HII|PCD_TYPE_STRING:\r
-      Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII | PCD_TYPE_STRING);\r
-\r
-    case PCD_TYPE_STRING:\r
-      Value = (UINT8 *) &(((STRING_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_STRING);\r
-\r
-    case PCD_TYPE_DATA:\r
-      Value += Size * Index;\r
-      return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_DATA);\r
-\r
-    default:\r
-      ASSERT (FALSE);\r
-  }\r
-\r
-  ASSERT (FALSE);\r
-\r
-  return 0;\r
-}\r
-\r
 /**\r
   Invoke the callback function when dynamic PCD entry was set, if this PCD entry \r
   has registered callback function.\r
 /**\r
   Invoke the callback function when dynamic PCD entry was set, if this PCD entry \r
   has registered callback function.\r
@@ -1117,34 +1021,6 @@ GetPcdDatabase (
   return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
 }\r
 \r
   return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
 }\r
 \r
-/**\r
-  Get SKU ID table from PCD database.\r
-\r
-  @param LocalTokenNumberTableIdx Index of local token number in token number table.\r
-  @param Database                 PCD database.\r
-\r
-  @return Pointer to SKU ID array table\r
-\r
-**/\r
-SKU_ID *\r
-GetSkuIdArray (\r
-  IN    UINTN             LocalTokenNumberTableIdx,\r
-  IN    PEI_PCD_DATABASE  *Database\r
-  )\r
-{\r
-  SKU_HEAD *SkuHead;\r
-  UINTN     LocalTokenNumber;\r
-\r
-  LocalTokenNumber = *((UINT32 *)((UINT8 *)Database + Database->LocalTokenNumberTableOffset) + LocalTokenNumberTableIdx);\r
-\r
-  ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) != 0);\r
-\r
-  SkuHead = (SKU_HEAD *) ((UINT8 *)Database + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
-\r
-  return (SKU_ID *) ((UINT8 *)Database + SkuHead->SkuIdTableOffset);\r
-  \r
-}\r
-\r
 /**\r
   Get index of PCD entry in size table.\r
 \r
 /**\r
   Get index of PCD entry in size table.\r
 \r
@@ -1163,8 +1039,7 @@ GetSizeTableIndex (
   UINTN       Index;\r
   UINTN       SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
   UINTN       Index;\r
   UINTN       SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
-  SKU_ID      *SkuIdTable;\r
-  \r
+\r
   SizeTableIdx = 0;\r
 \r
   for (Index = 0; Index < LocalTokenNumberTableIdx; Index++) {\r
   SizeTableIdx = 0;\r
 \r
   for (Index = 0; Index < LocalTokenNumberTableIdx; Index++) {\r
@@ -1184,22 +1059,12 @@ GetSizeTableIndex (
           //\r
           SizeTableIdx += 2;\r
       } else {\r
           //\r
           SizeTableIdx += 2;\r
       } else {\r
-        if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
           //\r
           // We have only two entry for Non-Sku enabled PCD entry:\r
           // 1) MAX SIZE\r
           // 2) Current Size\r
           //\r
           SizeTableIdx += 2;\r
           //\r
           // We have only two entry for Non-Sku enabled PCD entry:\r
           // 1) MAX SIZE\r
           // 2) Current Size\r
           //\r
           SizeTableIdx += 2;\r
-        } else {\r
-          //\r
-          // We have these entry for SKU enabled PCD entry\r
-          // 1) MAX SIZE\r
-          // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
-          //\r
-          SkuIdTable = GetSkuIdArray (Index, Database);\r
-          SizeTableIdx += (UINTN)*SkuIdTable + 1;\r
-        }\r
       }\r
     }\r
 \r
       }\r
     }\r
 \r
index e3b68aabc470ad17d5caee91a451b1189a43bc14..3a7910a900c8261ccbc2bf428b953e516acf8865 100644 (file)
@@ -993,21 +993,6 @@ GetExPcdTokenNumber (
   IN UINTN                      ExTokenNumber\r
   );\r
 \r
   IN UINTN                      ExTokenNumber\r
   );\r
 \r
-/**\r
-  Find the local token number according to system SKU ID.\r
-\r
-  @param LocalTokenNumber PCD token number\r
-  @param Size             The size of PCD entry.\r
-\r
-  @return Token number according to system SKU ID.\r
-\r
-**/\r
-UINT32\r
-GetSkuEnabledTokenNumber (\r
-  UINT32 LocalTokenNumber,\r
-  UINTN  Size\r
-  );\r
-\r
 /**\r
   The function registers the CallBackOnSet fucntion\r
   according to TokenNumber and EFI_GUID space.\r
 /**\r
   The function registers the CallBackOnSet fucntion\r
   according to TokenNumber and EFI_GUID space.\r
@@ -1043,21 +1028,6 @@ BuildPcdDatabase (
   IN EFI_PEI_FILE_HANDLE    FileHandle\r
   );\r
 \r
   IN EFI_PEI_FILE_HANDLE    FileHandle\r
   );\r
 \r
-/**\r
-  Get SKU ID tabble from PCD database.\r
-\r
-  @param LocalTokenNumberTableIdx Index of local token number in token number table.\r
-  @param Database                 PCD Database in PEI phase\r
-\r
-  @return Pointer to SKU ID array table\r
-\r
-**/\r
-SKU_ID *\r
-GetSkuIdArray (\r
-  IN    UINTN             LocalTokenNumberTableIdx,\r
-  IN    PEI_PCD_DATABASE  *Database\r
-  );\r
-\r
 /**\r
   Get index of PCD entry in size table.\r
 \r
 /**\r
   Get index of PCD entry in size table.\r
 \r