]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/GenPcdDb.py
BaseTools: Support Structure PCD value assignment in DEC/DSC
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenPcdDb.py
index 23865254d791b2c6531ca46aa79d68bf65f3a8ac..ddbfe281b857cf5604619fdf952561173ac2007a 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Routines for generating Pcd Database\r
 #\r
-# Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved.<BR>\r
 # This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # which accompanies this distribution.  The full text of the license may be found at\r
@@ -19,7 +19,7 @@ from ValidCheckingInfoObject import VAR_CHECK_PCD_VARIABLE_TAB
 from ValidCheckingInfoObject import VAR_VALID_OBJECT_FACTORY\r
 from Common.VariableAttributes import VariableAttributes\r
 \r
-DATABASE_VERSION = 5\r
+DATABASE_VERSION = 6\r
 \r
 gPcdDatabaseAutoGenC = TemplateString("""\r
 //\r
@@ -27,6 +27,8 @@ gPcdDatabaseAutoGenC = TemplateString("""
 //\r
 #if 0\r
 ${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {\r
+  /* SkuIdTable */\r
+  { ${BEGIN}${SKUID_VALUE}, ${END} },\r
 ${BEGIN}  { ${INIT_VALUE_UINT64} }, /*  ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}] */\r
 ${END}\r
 ${BEGIN}  ${VARDEF_VALUE_UINT64}, /* ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64} */\r
@@ -86,8 +88,6 @@ ${BEGIN}  { ${INIT_VALUE_BOOLEAN} }, /*  ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_
 ${END}\r
 ${BEGIN}  ${VARDEF_VALUE_BOOLEAN}, /* ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN} */\r
 ${END}\r
-  /* SkuIdTable */\r
-  { ${BEGIN}${SKUID_VALUE}, ${END} },\r
   ${SYSTEM_SKU_ID_VALUE}\r
 };\r
 #endif\r
@@ -122,6 +122,7 @@ gPcdDatabaseAutoGenH = TemplateString("""
 #define ${PHASE}_EXMAP_TABLE_EMPTY              ${EXMAP_TABLE_EMPTY}\r
 \r
 typedef struct {\r
+  UINT64             SkuIdTable[${PHASE}_SKUID_TABLE_SIZE];\r
 ${BEGIN}  UINT64             ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}];\r
 ${END}\r
 ${BEGIN}  UINT64             ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64};\r
@@ -156,7 +157,6 @@ ${BEGIN}  BOOLEAN            ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_DECL_BOOLEAN
 ${END}\r
 ${BEGIN}  BOOLEAN            ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN};\r
 ${END}\r
-  UINT8              SkuIdTable[${PHASE}_SKUID_TABLE_SIZE];\r
 ${SYSTEM_SKU_ID}\r
 } ${PHASE}_PCD_DATABASE_INIT;\r
 \r
@@ -176,7 +176,9 @@ ${END}
 \r
 typedef struct {\r
   //GUID                  Signature;  // PcdDataBaseGuid\r
+  //UINT32                BuildVersion;\r
   //UINT32                Length;\r
+  //SKU_ID                SystemSkuId;      // Current SkuId value.\r
   //UINT32                UninitDataBaseSize;// Total size for PCD those default value with 0.\r
   //TABLE_OFFSET          LocalTokenNumberTableOffset;\r
   //TABLE_OFFSET          ExMapTableOffset;\r
@@ -184,11 +186,11 @@ typedef struct {
   //TABLE_OFFSET          StringTableOffset;\r
   //TABLE_OFFSET          SizeTableOffset;\r
   //TABLE_OFFSET          SkuIdTableOffset; \r
+  //TABLE_OFFSET          PcdNameTableOffset;\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
-  //SKU_ID                SystemSkuId;      // Current SkuId value.\r
-  //UINT8                 Pad;\r
+  //UINT8                 Pad[2];\r
   ${PHASE}_PCD_DATABASE_INIT    Init;\r
   ${PHASE}_PCD_DATABASE_UNINIT  Uninit;\r
 } ${PHASE}_PCD_DATABASE;\r
@@ -204,6 +206,8 @@ gEmptyPcdDatabaseAutoGenC = TemplateString("""
 //\r
 #if 0\r
 ${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {\r
+  /* SkuIdTable */\r
+  { 0 },\r
   /* ExMapTable */\r
   {\r
     {0, 0, 0}\r
@@ -226,8 +230,6 @@ ${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {
   {\r
     0, 0\r
   },\r
-  /* SkuIdTable */\r
-  { 0 },\r
   ${SYSTEM_SKU_ID_VALUE}\r
 };\r
 #endif\r
@@ -760,9 +762,9 @@ def BuildExDataBase(Dict):
     VardefValueBoolean = Dict['VARDEF_DB_VALUE_BOOLEAN']\r
     DbVardefValueBoolean = DbItemList(1, RawDataList = VardefValueBoolean)\r
     SkuidValue = Dict['SKUID_VALUE']\r
-    DbSkuidValue = DbItemList(1, RawDataList = SkuidValue)\r
+    DbSkuidValue = DbItemList(8, RawDataList = SkuidValue)\r
     SkuIndexValue = Dict['SKU_INDEX_VALUE']\r
-    DbSkuIndexValue = DbItemList(0,RawDataList = SkuIndexValue)\r
+    DbSkuIndexValue = DbItemList(8,RawDataList = SkuIndexValue)\r
     \r
     # Unit Db Items\r
     UnInitValueUint64 = Dict['UNINIT_GUID_DECL_UINT64']\r
@@ -777,24 +779,24 @@ def BuildExDataBase(Dict):
     DbUnInitValueBoolean = DbItemList(1, RawDataList = UnInitValueBoolean)\r
     PcdTokenNumberMap = Dict['PCD_ORDER_TOKEN_NUMBER_MAP']\r
  \r
-    DbNameTotle = ["InitValueUint64", "VardefValueUint64", "InitValueUint32", "VardefValueUint32", "VpdHeadValue", "ExMapTable", \r
+    DbNameTotle = ["SkuidValue", "SkuIndexValue", "InitValueUint64", "VardefValueUint64", "InitValueUint32", "VardefValueUint32", "VpdHeadValue", "ExMapTable",\r
                "LocalTokenNumberTable", "GuidTable", "StringHeadValue",  "PcdNameOffsetTable","VariableTable","SkuTable", "StringTableLen", "PcdTokenTable", "PcdCNameTable", \r
                "SizeTableValue", "InitValueUint16", "VardefValueUint16", "InitValueUint8", "VardefValueUint8", "InitValueBoolean",\r
-               "VardefValueBoolean", "SkuidValue", "SkuIndexValue","UnInitValueUint64", "UnInitValueUint32", "UnInitValueUint16", "UnInitValueUint8", "UnInitValueBoolean"]\r
+               "VardefValueBoolean", "UnInitValueUint64", "UnInitValueUint32", "UnInitValueUint16", "UnInitValueUint8", "UnInitValueBoolean"]\r
  \r
-    DbTotal = [InitValueUint64, VardefValueUint64, InitValueUint32, VardefValueUint32, VpdHeadValue, ExMapTable, \r
+    DbTotal = [SkuidValue, SkuIndexValue, InitValueUint64, VardefValueUint64, InitValueUint32, VardefValueUint32, VpdHeadValue, ExMapTable,\r
                LocalTokenNumberTable, GuidTable, StringHeadValue,  PcdNameOffsetTable,VariableTable,SkuTable, StringTableLen, PcdTokenTable,PcdCNameTable, \r
                SizeTableValue, InitValueUint16, VardefValueUint16, InitValueUint8, VardefValueUint8, InitValueBoolean,\r
-               VardefValueBoolean, SkuidValue, SkuIndexValue, UnInitValueUint64, UnInitValueUint32, UnInitValueUint16, UnInitValueUint8, UnInitValueBoolean]\r
-    DbItemTotal = [DbInitValueUint64, DbVardefValueUint64, DbInitValueUint32, DbVardefValueUint32, DbVpdHeadValue, DbExMapTable, \r
+               VardefValueBoolean, UnInitValueUint64, UnInitValueUint32, UnInitValueUint16, UnInitValueUint8, UnInitValueBoolean]\r
+    DbItemTotal = [DbSkuidValue, DbSkuIndexValue, DbInitValueUint64, DbVardefValueUint64, DbInitValueUint32, DbVardefValueUint32, DbVpdHeadValue, DbExMapTable,\r
                DbLocalTokenNumberTable, DbGuidTable, DbStringHeadValue,  DbPcdNameOffsetTable,DbVariableTable,DbSkuTable, DbStringTableLen, DbPcdTokenTable, DbPcdCNameTable, \r
                DbSizeTableValue, DbInitValueUint16, DbVardefValueUint16, DbInitValueUint8, DbVardefValueUint8, DbInitValueBoolean,\r
-               DbVardefValueBoolean, DbSkuidValue, DbSkuIndexValue, DbUnInitValueUint64, DbUnInitValueUint32, DbUnInitValueUint16, DbUnInitValueUint8, DbUnInitValueBoolean]\r
+               DbVardefValueBoolean, DbUnInitValueUint64, DbUnInitValueUint32, DbUnInitValueUint16, DbUnInitValueUint8, DbUnInitValueBoolean]\r
     \r
-    # SkuidValue is the last table in the init table items\r
-    InitTableNum = DbTotal.index(SkuidValue) + 1 + 1 # +1 is for SkuIndexValue table\r
+    # VardefValueBoolean is the last table in the init table items\r
+    InitTableNum = DbNameTotle.index("VardefValueBoolean") + 1\r
     # The FixedHeader length of the PCD_DATABASE_INIT, from Signature to Pad\r
-    FixedHeaderLen = 64\r
+    FixedHeaderLen = 72\r
 \r
     # Get offset of SkuId table in the database \r
     SkuIdTableOffset = FixedHeaderLen\r
@@ -809,18 +811,15 @@ def BuildExDataBase(Dict):
     for DbIndex in xrange(len(DbTotal)):\r
         if DbTotal[DbIndex] is SkuTable:\r
             break\r
+        elif DbItemTotal[DbIndex] is DbSkuIndexValue:\r
+            if DbItemTotal[DbIndex].RawDataList:\r
+                Count = 0\r
+                for item in DbItemTotal[DbIndex].RawDataList:\r
+                    Count += len(item)\r
+                SkuTableOffset += DbItemTotal[DbIndex].ItemSize * Count\r
+                continue\r
         SkuTableOffset += DbItemTotal[DbIndex].GetListSize()\r
-    PcdTokenTableDbOffset = FixedHeaderLen\r
-    for DbIndex in xrange(len(DbTotal)):\r
-        if DbTotal[DbIndex] is PcdTokenTable:\r
-            break\r
-        PcdTokenTableDbOffset += DbItemTotal[DbIndex].GetListSize()\r
-    \r
-    PcdCNameTableDbOffset = FixedHeaderLen\r
-    for DbIndex in xrange(len(DbTotal)):\r
-        if DbTotal[DbIndex] is PcdCNameTable:\r
-            break\r
-        PcdCNameTableDbOffset += DbItemTotal[DbIndex].GetListSize()\r
+\r
     # Fix up the LocalTokenNumberTable, SkuHeader table\r
     SkuHeaderIndex = 0\r
     if len(Dict['SKU_INDEX_VALUE']) > 0:\r
@@ -835,6 +834,13 @@ def BuildExDataBase(Dict):
             if DbTotal[DbIndex] is Table:\r
                 DbOffset += DbItemTotal[DbIndex].GetInterOffset(Offset)\r
                 break\r
+            elif DbItemTotal[DbIndex] is DbSkuIndexValue:\r
+                if DbItemTotal[DbIndex].RawDataList:\r
+                    Count = 0\r
+                    for item in DbItemTotal[DbIndex].RawDataList:\r
+                        Count += len(item)\r
+                    DbOffset += DbItemTotal[DbIndex].ItemSize * Count\r
+                    continue\r
             DbOffset += DbItemTotal[DbIndex].GetListSize()\r
             if DbIndex + 1 == InitTableNum:\r
                 if DbOffset % 8:\r
@@ -847,9 +853,9 @@ def BuildExDataBase(Dict):
         LocalTokenNumberTable[LocalTokenNumberTableIndex] = DbOffset|int(TokenTypeValue)\r
         # if PCD_TYPE_SKU_ENABLED, then we need to fix up the SkuTable\r
         \r
-        SkuIndexTabalOffset = SkuIdTableOffset + Dict['SKUID_VALUE'][0] + 1\r
+        SkuIndexTabalOffset = SkuIdTableOffset + len(Dict['SKUID_VALUE']) * 8\r
         if (TokenTypeValue & (0x2 << 28)):\r
-            SkuTable[SkuHeaderIndex] = (DbOffset|int(TokenTypeValue & ~(0x2<<28)), SkuIndexTabalOffset + SkuIndexIndexTable[PcdTokenNumberMap[LocalTokenNumberTableIndex]])\r
+            SkuTable[SkuHeaderIndex] = (DbOffset|int(TokenTypeValue & ~(0x2<<28)), SkuIndexTabalOffset + SkuIndexIndexTable[PcdTokenNumberMap[LocalTokenNumberTableIndex]] * 8)\r
             LocalTokenNumberTable[LocalTokenNumberTableIndex] = (SkuTableOffset + SkuHeaderIndex * 8) | int(TokenTypeValue)\r
             SkuHeaderIndex += 1\r
         \r
@@ -869,6 +875,13 @@ def BuildExDataBase(Dict):
                 if DbTotal[DbIndex] is VariableRefTable:\r
                     DbOffset += DbItemTotal[DbIndex].GetInterOffset(VariableOffset)\r
                     break\r
+                elif DbItemTotal[DbIndex] is DbSkuIndexValue:\r
+                    if DbItemTotal[DbIndex].RawDataList:\r
+                        Count = 0\r
+                        for item in DbItemTotal[DbIndex].RawDataList:\r
+                            Count += len(item)\r
+                        DbOffset += DbItemTotal[DbIndex].ItemSize * Count\r
+                        continue\r
                 DbOffset += DbItemTotal[DbIndex].GetListSize()\r
                 if DbIndex + 1 == InitTableNum:\r
                     if DbOffset % 8:\r
@@ -900,6 +913,13 @@ def BuildExDataBase(Dict):
             SkuIdTableOffset = DbTotalLength\r
         elif DbItemTotal[DbIndex] is DbPcdNameOffsetTable:\r
             DbPcdNameOffset = DbTotalLength\r
+        elif DbItemTotal[DbIndex] is DbSkuIndexValue:\r
+            if DbItemTotal[DbIndex].RawDataList:\r
+                Count = 0\r
+                for item in DbItemTotal[DbIndex].RawDataList:\r
+                    Count += len(item)\r
+                DbTotalLength += DbItemTotal[DbIndex].ItemSize * Count\r
+                continue\r
 \r
         DbTotalLength += DbItemTotal[DbIndex].GetListSize()\r
     if not Dict['PCD_INFO_FLAG']:\r
@@ -938,6 +958,9 @@ def BuildExDataBase(Dict):
 \r
     b = pack('=L', DbTotalLength - UninitDataBaseSize)\r
 \r
+    Buffer += b\r
+    b = pack('=Q', SystemSkuId)\r
+\r
     Buffer += b\r
     b = pack('=L', UninitDataBaseSize)\r
 \r
@@ -972,8 +995,8 @@ def BuildExDataBase(Dict):
     b = pack('=H', GuidTableCount)\r
  \r
     Buffer += b\r
-    b = pack('=B', SystemSkuId)\r
\r
+    b = pack('=B', Pad)\r
+\r
     Buffer += b\r
     b = pack('=B', Pad)\r
  \r
@@ -1135,12 +1158,25 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     VarCheckTab = VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER()\r
     i = 0\r
     ReorderedDynPcdList = GetOrderedDynamicPcdList(Platform.DynamicPcdList, Platform.PcdTokenNumber)\r
+    for item in ReorderedDynPcdList:\r
+        if item.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
+            item.DatumType = "VOID*"\r
     for Pcd in ReorderedDynPcdList:\r
         VoidStarTypeCurrSize = []\r
         i += 1\r
         CName = Pcd.TokenCName\r
         TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
 \r
+        for PcdItem in GlobalData.MixedPcd:\r
+            if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
+                CName = PcdItem[0]\r
+\r
+        if GlobalData.BuildOptionPcd:\r
+            for PcdItem in GlobalData.BuildOptionPcd:\r
+                if (Pcd.TokenSpaceGuidCName, CName) == (PcdItem[0], PcdItem[1]):\r
+                    Pcd.DefaultValue = PcdItem[2]\r
+                    break\r
+\r
         EdkLogger.debug(EdkLogger.DEBUG_3, "PCD: %s %s (%s : %s)" % (CName, TokenSpaceGuidCName, Pcd.Phase, Phase))\r
 \r
         if Pcd.Phase == 'PEI':\r
@@ -1464,6 +1500,17 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         if len(Pcd.SkuInfoList) > 1:\r
             Dict['PCD_ORDER_TOKEN_NUMBER_MAP'][GeneratedTokenNumber] = SkuEnablePcdIndex\r
             SkuEnablePcdIndex += 1\r
+\r
+        for PcdItem in GlobalData.MixedPcd:\r
+            if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
+                CName = PcdItem[0]\r
+\r
+        if GlobalData.BuildOptionPcd:\r
+            for PcdItem in GlobalData.BuildOptionPcd:\r
+                if (Pcd.TokenSpaceGuidCName, CName) == (PcdItem[0], PcdItem[1]):\r
+                    Pcd.DefaultValue = PcdItem[2]\r
+                    break\r
+\r
         EdkLogger.debug(EdkLogger.DEBUG_1, "PCD = %s.%s" % (CName, TokenSpaceGuidCName))\r
         EdkLogger.debug(EdkLogger.DEBUG_1, "phase = %s" % Phase)\r
         EdkLogger.debug(EdkLogger.DEBUG_1, "GeneratedTokenNumber = %s" % str(GeneratedTokenNumber))\r