BaseTools: Fix VPD data optimization issue
authorLiming Gao <liming.gao@intel.com>
Tue, 19 Dec 2017 08:26:16 +0000 (16:26 +0800)
committerLiming Gao <liming.gao@intel.com>
Mon, 25 Dec 2017 03:05:54 +0000 (11:05 +0800)
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Feng Bob C <bob.c.feng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/Python/AutoGen/AutoGen.py
BaseTools/Source/Python/Common/VpdInfoFile.py
BaseTools/Source/Python/Workspace/DscBuildData.py

index 67de173..cacd009 100644 (file)
@@ -1401,7 +1401,7 @@ class PlatformAutoGen(AutoGen):
                 if os.path.exists(VpdMapFilePath):\r
                     OrgVpdFile.Read(VpdMapFilePath)\r
                     PcdItems = OrgVpdFile.GetOffset(PcdNvStoreDfBuffer[0])\r
-                    NvStoreOffset = PcdItems[0].strip() if PcdItems else '0'\r
+                    NvStoreOffset = PcdItems.values()[0].strip() if PcdItems else '0'\r
                 else:\r
                     EdkLogger.error("build", FILE_READ_FAILURE, "Can not find VPD map file %s to fix up VPD offset." % VpdMapFilePath)\r
 \r
@@ -1665,6 +1665,14 @@ class PlatformAutoGen(AutoGen):
                    PcdKey in VpdPcdDict:\r
                     Pcd = VpdPcdDict[PcdKey]\r
                     SkuValueMap = {}\r
+                    DefaultSku = Pcd.SkuInfoList.get('DEFAULT')\r
+                    if DefaultSku:\r
+                        PcdValue = DefaultSku.DefaultValue\r
+                        if PcdValue not in SkuValueMap:\r
+                            SkuValueMap[PcdValue] = []\r
+                            VpdFile.Add(Pcd, 'DEFAULT',DefaultSku.VpdOffset)\r
+                        SkuValueMap[PcdValue].append(DefaultSku)\r
+\r
                     for (SkuName,Sku) in Pcd.SkuInfoList.items():\r
                         Sku.VpdOffset = Sku.VpdOffset.strip()\r
                         PcdValue = Sku.DefaultValue\r
@@ -1691,7 +1699,7 @@ class PlatformAutoGen(AutoGen):
                                     EdkLogger.error("build", FORMAT_INVALID, 'The offset value of PCD %s.%s should be %s-byte aligned.' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Alignment))\r
                         if PcdValue not in SkuValueMap:\r
                             SkuValueMap[PcdValue] = []\r
-                            VpdFile.Add(Pcd, Sku.VpdOffset)\r
+                            VpdFile.Add(Pcd, SkuName,Sku.VpdOffset)\r
                         SkuValueMap[PcdValue].append(Sku)\r
                         # if the offset of a VPD is *, then it need to be fixed up by third party tool.\r
                         if not NeedProcessVpdMapFile and Sku.VpdOffset == "*":\r
@@ -1720,6 +1728,13 @@ class PlatformAutoGen(AutoGen):
                         if not FoundFlag :\r
                             # just pick the a value to determine whether is unicode string type\r
                             SkuValueMap = {}\r
+                            DefaultSku = DscPcdEntry.SkuInfoList.get('DEFAULT')\r
+                            if DefaultSku:\r
+                                PcdValue = DefaultSku.DefaultValue\r
+                                if PcdValue not in SkuValueMap:\r
+                                    SkuValueMap[PcdValue] = []\r
+                                    VpdFile.Add(DscPcdEntry, 'DEFAULT',Sku.VpdOffset)\r
+                                SkuValueMap[PcdValue].append(Sku)\r
                             for (SkuName,Sku) in DscPcdEntry.SkuInfoList.items():\r
                                 Sku.VpdOffset = Sku.VpdOffset.strip() \r
                                 \r
@@ -1770,7 +1785,7 @@ class PlatformAutoGen(AutoGen):
                                             EdkLogger.error("build", FORMAT_INVALID, 'The offset value of PCD %s.%s should be %s-byte aligned.' % (DscPcdEntry.TokenSpaceGuidCName, DscPcdEntry.TokenCName, Alignment))\r
                                 if PcdValue not in SkuValueMap:\r
                                     SkuValueMap[PcdValue] = []\r
-                                    VpdFile.Add(DscPcdEntry, Sku.VpdOffset)\r
+                                    VpdFile.Add(DscPcdEntry, SkuName,Sku.VpdOffset)\r
                                 SkuValueMap[PcdValue].append(Sku)\r
                                 if not NeedProcessVpdMapFile and Sku.VpdOffset == "*":\r
                                     NeedProcessVpdMapFile = True \r
index 130d5c7..716155e 100644 (file)
@@ -88,7 +88,7 @@ class VpdInfoFile:
     #\r
     #  @param offset integer value for VPD's offset in specific SKU.\r
     #\r
-    def Add(self, Vpd, Offset):\r
+    def Add(self, Vpd, skuname,Offset):\r
         if (Vpd == None):\r
             EdkLogger.error("VpdInfoFile", BuildToolError.ATTRIBUTE_UNKNOWN_ERROR, "Invalid VPD PCD entry.")\r
         \r
@@ -111,12 +111,9 @@ class VpdInfoFile:
             #\r
             # If there is no Vpd instance in dict, that imply this offset for a given SKU is a new one \r
             #\r
-            self._VpdArray[Vpd] = [Offset]\r
-        else:\r
-            #\r
-            # If there is an offset for a specific SKU in dict, then append this offset for other sku to array.\r
-            #\r
-            self._VpdArray[Vpd].append(Offset)\r
+            self._VpdArray[Vpd] = {}\r
+\r
+        self._VpdArray[Vpd].update({skuname:Offset})\r
             \r
         \r
     ## Generate VPD PCD information into a text file\r
@@ -138,12 +135,12 @@ class VpdInfoFile:
             for PcdItem in GlobalData.MixedPcd:\r
                 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
                     PcdTokenCName = PcdItem[0]\r
-            for Offset in self._VpdArray[Pcd]:\r
-                PcdValue = str(Pcd.SkuInfoList[Pcd.SkuInfoList.keys()[i]].DefaultValue).strip()\r
+            for skuname in self._VpdArray[Pcd]:\r
+                PcdValue = str(Pcd.SkuInfoList[skuname].DefaultValue).strip()\r
                 if PcdValue == "" :\r
                     PcdValue  = Pcd.DefaultValue\r
 \r
-                Content += "%s.%s|%s|%s|%s|%s  \n" % (Pcd.TokenSpaceGuidCName, PcdTokenCName, str(Pcd.SkuInfoList.keys()[i]),str(Offset).strip(), str(Pcd.MaxDatumSize).strip(),PcdValue)\r
+                Content += "%s.%s|%s|%s|%s|%s  \n" % (Pcd.TokenSpaceGuidCName, PcdTokenCName, skuname,str(self._VpdArray[Pcd][skuname]).strip(), str(Pcd.MaxDatumSize).strip(),PcdValue)\r
                 i += 1\r
 \r
         return SaveFileOnChange(FilePath, Content, False)\r
@@ -190,10 +187,10 @@ class VpdInfoFile:
                         VpdObjectTokenCName = PcdItem[0]\r
                 for sku in VpdObject.SkuInfoList.keys():\r
                     if VpdObject.TokenSpaceGuidCName == TokenSpaceName and VpdObjectTokenCName == PcdTokenName.strip() and sku == SkuId:\r
-                        if self._VpdArray[VpdObject][VpdObject.SkuInfoList.keys().index(sku)] == "*":\r
+                        if self._VpdArray[VpdObject][sku] == "*":\r
                             if Offset == "*":\r
                                 EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID, "The offset of %s has not been fixed up by third-party BPDG tool." % PcdName)                              \r
-                            self._VpdArray[VpdObject][VpdObject.SkuInfoList.keys().index(sku)] = Offset\r
+                            self._VpdArray[VpdObject][sku] = Offset\r
                         Found = True\r
             if not Found:\r
                 EdkLogger.error("BPDG", BuildToolError.PARSER_ERROR, "Can not find PCD defined in VPD guid file.")\r
index 4642e76..66f1faf 100644 (file)
@@ -1653,6 +1653,7 @@ class DscBuildData(PlatformBuildClassObject):
         Pcds = {}\r
         DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
         SkuIds = set([(skuid,skuobj.SkuId) for pcdobj in PcdSet.values() for skuid,skuobj in pcdobj.SkuInfoList.items()])\r
+        SkuIds = self.SkuIdMgr.AvailableSkuIdSet\r
         DefaultStores = set([storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])\r
         for PcdCName, TokenSpaceGuid in PcdSet:\r
             PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]\r
@@ -1673,7 +1674,7 @@ class DscBuildData(PlatformBuildClassObject):
                         if defaultstorename not in skuobj.DefaultStoreDict:\r
                             skuobj.DefaultStoreDict[defaultstorename] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
                     skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]\r
-            for skuname,skuid in SkuIds:\r
+            for skuname,skuid in SkuIds.items():\r
                 if skuname not in PcdObj.SkuInfoList:\r
                     nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
                     while nextskuid not in PcdObj.SkuInfoList:\r