]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/AutoGen.py
BaseTools: PcdDataBase Optimization for multiple SkuIds
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / AutoGen.py
index 12861399ac8623e8f05ed06f970f56695da8257b..5d6cce0dbb535a20050ee7c93d048fff7676f1b6 100644 (file)
@@ -44,6 +44,7 @@ from Common.MultipleWorkspace import MultipleWorkspace as mws
 import InfSectionParser\r
 import datetime\r
 import hashlib\r
+from GenVar import VariableMgr,var_info\r
 \r
 ## Regular expression for splitting Dependency Expression string into tokens\r
 gDepexTokenPattern = re.compile("(\(|\)|\w+| \S+\.inf)")\r
@@ -1224,6 +1225,7 @@ class PlatformAutoGen(AutoGen):
         self.AllPcdList = []\r
         # get the original module/package/platform objects\r
         self.BuildDatabase = Workspace.BuildDatabase\r
+        self.DscBuildDataObj = Workspace.Platform\r
 \r
         # flag indicating if the makefile/C-code file has been created or not\r
         self.IsMakeFileCreated  = False\r
@@ -1352,6 +1354,24 @@ class PlatformAutoGen(AutoGen):
                 if key in ShareFixedAtBuildPcdsSameValue and ShareFixedAtBuildPcdsSameValue[key]:                    \r
                     LibAuto.ConstPcd[key] = Pcd.DefaultValue\r
 \r
+    def CollectVariables(self, DynamicPcdSet):\r
+        VariableInfo = VariableMgr(self.DscBuildDataObj._GetDefaultStores(),self.DscBuildDataObj._GetSkuIds())\r
+        Index = 0\r
+        for Pcd in DynamicPcdSet:\r
+            pcdname = ".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName))\r
+            for SkuName in Pcd.SkuInfoList:\r
+                Sku = Pcd.SkuInfoList[SkuName]\r
+                SkuId = Sku.SkuId\r
+                if SkuId == None or SkuId == '':\r
+                    continue\r
+                if len(Sku.VariableName) > 0:\r
+                    VariableGuidStructure = Sku.VariableGuidValue\r
+                    VariableGuid = GuidStructureStringToGuidString(VariableGuidStructure)\r
+                    if Pcd.Phase == "DXE":\r
+                        for StorageName in Sku.DefaultStoreDict:\r
+                            VariableInfo.append_variable(var_info(Index,pcdname,StorageName,SkuName, StringToArray(Sku.VariableName),VariableGuid, Sku.VariableAttribute , Pcd.DefaultValue,Sku.DefaultStoreDict[StorageName],Pcd.DatumType))\r
+            Index += 1\r
+        return VariableInfo\r
     ## Collect dynamic PCDs\r
     #\r
     #  Gather dynamic PCDs list from each module and their settings from platform\r
@@ -1582,6 +1602,20 @@ class PlatformAutoGen(AutoGen):
                 if Pcd.Type in [TAB_PCDS_DYNAMIC_VPD, TAB_PCDS_DYNAMIC_EX_VPD]:\r
                     VpdPcdDict[(Pcd.TokenCName, Pcd.TokenSpaceGuidCName)] = Pcd\r
 \r
+            #Collect DynamicHii PCD values and assign it to DynamicExVpd PCD gEfiMdeModulePkgTokenSpaceGuid.PcdNvStoreDefaultValueBuffer\r
+            PcdNvStoreDfBuffer = VpdPcdDict.get(("PcdNvStoreDefaultValueBuffer","gEfiMdeModulePkgTokenSpaceGuid"))\r
+            if PcdNvStoreDfBuffer:\r
+                var_info = self.CollectVariables(self._DynamicPcdList)\r
+                default_skuobj = PcdNvStoreDfBuffer.SkuInfoList.get("DEFAULT")\r
+                vardump = var_info.dump()\r
+                if vardump:\r
+                    default_skuobj.DefaultValue = vardump\r
+                    PcdNvStoreDfBuffer.DefaultValue = vardump\r
+                if default_skuobj:\r
+                    PcdNvStoreDfBuffer.SkuInfoList.clear()\r
+                    PcdNvStoreDfBuffer.SkuInfoList['DEFAULT'] = default_skuobj\r
+                    PcdNvStoreDfBuffer.MaxDatumSize = str(len(default_skuobj.DefaultValue.split(",")))\r
+\r
             PlatformPcds = self._PlatformPcds.keys()\r
             PlatformPcds.sort()\r
             #\r
@@ -1758,6 +1792,13 @@ class PlatformAutoGen(AutoGen):
         self._DynamicPcdList.extend(UnicodePcdArray)\r
         self._DynamicPcdList.extend(HiiPcdArray)\r
         self._DynamicPcdList.extend(OtherPcdArray)\r
+        allskuset = [(SkuName,Sku.SkuId) for pcd in self._DynamicPcdList for (SkuName,Sku) in pcd.SkuInfoList.items()]\r
+        for pcd in self._DynamicPcdList:\r
+            if len(pcd.SkuInfoList) == 1:\r
+                for (SkuName,SkuId) in allskuset:\r
+                    if type(SkuId) in (str,unicode) and eval(SkuId) == 0 or SkuId == 0:\r
+                        continue\r
+                    pcd.SkuInfoList[SkuName] = pcd.SkuInfoList['DEFAULT']\r
         self.AllPcdList = self._NonDynamicPcdList + self._DynamicPcdList\r
         \r
     ## Return the platform build data object\r
@@ -2351,7 +2392,7 @@ class PlatformAutoGen(AutoGen):
             else:\r
                 SkuName = 'DEFAULT'\r
             ToPcd.SkuInfoList = {\r
-                SkuName : SkuInfoClass(SkuName, self.Platform.SkuIds[SkuName], '', '', '', '', '', ToPcd.DefaultValue)\r
+                SkuName : SkuInfoClass(SkuName, self.Platform.SkuIds[SkuName][0], '', '', '', '', '', ToPcd.DefaultValue)\r
             }\r
 \r
     ## Apply PCD setting defined platform to a module\r