]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/AutoGen.py
BaseTools: Fixed the issue of Multiple Skus are always disables
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / AutoGen.py
index be6fecd9f34c52eb67c0b555bd9cf3cd20ebada0..28e575d2196ed659c0019c7d16a8aae145eb181a 100644 (file)
@@ -1262,6 +1262,9 @@ class PlatformAutoGen(AutoGen):
         self._BuildCommand = None\r
         self._AsBuildInfList = []\r
         self._AsBuildModuleList = []\r
+\r
+        self.VariableInfo = None\r
+\r
         if GlobalData.gFdfParser != None:\r
             self._AsBuildInfList = GlobalData.gFdfParser.Profile.InfList\r
             for Inf in self._AsBuildInfList:\r
@@ -1273,6 +1276,7 @@ class PlatformAutoGen(AutoGen):
         # get library/modules for build\r
         self.LibraryBuildDirectoryList = []\r
         self.ModuleBuildDirectoryList = []\r
+\r
         return True\r
 \r
     def __repr__(self):\r
@@ -1355,7 +1359,22 @@ class PlatformAutoGen(AutoGen):
                     LibAuto.ConstPcd[key] = Pcd.DefaultValue\r
 \r
     def CollectVariables(self, DynamicPcdSet):\r
+\r
+        VpdRegionSize = 0\r
+        VpdRegionBase = 0\r
+        if self.Workspace.FdfFile:\r
+            FdDict = self.Workspace.FdfProfile.FdDict[GlobalData.gFdfParser.CurrentFdName]\r
+            for FdRegion in FdDict.RegionList:\r
+                for item in FdRegion.RegionDataList:\r
+                    if self.Platform.VpdToolGuid.strip() and self.Platform.VpdToolGuid in item:\r
+                        VpdRegionSize = FdRegion.Size\r
+                        VpdRegionBase = FdRegion.Offset\r
+                        break\r
+\r
+\r
         VariableInfo = VariableMgr(self.DscBuildDataObj._GetDefaultStores(),self.DscBuildDataObj._GetSkuIds())\r
+        VariableInfo.SetVpdRegionMaxSize(VpdRegionSize)\r
+        VariableInfo.SetVpdRegionOffset(VpdRegionBase)\r
         Index = 0\r
         for Pcd in DynamicPcdSet:\r
             pcdname = ".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName))\r
@@ -1369,9 +1388,37 @@ class PlatformAutoGen(AutoGen):
                     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
+                            VariableInfo.append_variable(var_info(Index,pcdname,StorageName,SkuName, StringToArray(Sku.VariableName),VariableGuid, Sku.VariableAttribute , Sku.HiiDefaultValue,Sku.DefaultStoreDict[StorageName],Pcd.DatumType))\r
             Index += 1\r
         return VariableInfo\r
+\r
+    def UpdateNVStoreMaxSize(self,OrgVpdFile):\r
+        VpdMapFilePath = os.path.join(self.BuildDir, "FV", "%s.map" % self.Platform.VpdToolGuid)\r
+#         VpdFile = VpdInfoFile.VpdInfoFile()\r
+        PcdNvStoreDfBuffer = [item for item in self._DynamicPcdList if item.TokenCName == "PcdNvStoreDefaultValueBuffer" and item.TokenSpaceGuidCName == "gEfiMdeModulePkgTokenSpaceGuid"]\r
+\r
+        if PcdNvStoreDfBuffer:\r
+            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
+            else:\r
+                EdkLogger.error("build", FILE_READ_FAILURE, "Can not find VPD map file %s to fix up VPD offset." % VpdMapFilePath)\r
+\r
+            NvStoreOffset = int(NvStoreOffset,16) if NvStoreOffset.upper().startswith("0X") else int(NvStoreOffset)\r
+            maxsize = self.VariableInfo.VpdRegionSize  - NvStoreOffset\r
+            var_data = self.VariableInfo.PatchNVStoreDefaultMaxSize(maxsize)\r
+            default_skuobj = PcdNvStoreDfBuffer[0].SkuInfoList.get("DEFAULT")\r
+\r
+            if var_data and default_skuobj:\r
+                default_skuobj.DefaultValue = var_data\r
+                PcdNvStoreDfBuffer[0].DefaultValue = var_data\r
+                PcdNvStoreDfBuffer[0].SkuInfoList.clear()\r
+                PcdNvStoreDfBuffer[0].SkuInfoList['DEFAULT'] = default_skuobj\r
+                PcdNvStoreDfBuffer[0].MaxDatumSize = str(len(default_skuobj.DefaultValue.split(",")))\r
+\r
+        return OrgVpdFile\r
+\r
     ## Collect dynamic PCDs\r
     #\r
     #  Gather dynamic PCDs list from each module and their settings from platform\r
@@ -1590,39 +1637,34 @@ class PlatformAutoGen(AutoGen):
                 if Pcd.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
                     Pcd.DatumType = "VOID*"\r
 \r
-                PcdValue = Sku.DefaultValue\r
-                if Pcd.DatumType == 'VOID*' and PcdValue.startswith("L"):\r
                     # if found PCD which datum value is unicode string the insert to left size of UnicodeIndex\r
-                    UnicodePcdArray.append(Pcd)\r
-                elif len(Sku.VariableName) > 0:\r
                     # if found HII type PCD then insert to right of UnicodeIndex\r
-                    HiiPcdArray.append(Pcd)\r
-                else:\r
-                    OtherPcdArray.append(Pcd)\r
                 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
-                default_skuobj.DefaultValue = var_info.dump()\r
-                if default_skuobj:\r
-                    PcdNvStoreDfBuffer.SkuInfoList.clear()\r
-                    PcdNvStoreDfBuffer.SkuInfoList['DEFAULT'] = default_skuobj\r
-                    PcdNvStoreDfBuffer.MaxDatumSize = len(default_skuobj.DefaultValue.split(","))\r
+                self.VariableInfo = self.CollectVariables(self._DynamicPcdList)\r
+                vardump = self.VariableInfo.dump()\r
+                if vardump:\r
+                    PcdNvStoreDfBuffer.DefaultValue = vardump\r
+                    for skuname in PcdNvStoreDfBuffer.SkuInfoList:\r
+                        PcdNvStoreDfBuffer.SkuInfoList[skuname].DefaultValue = vardump\r
+                        PcdNvStoreDfBuffer.MaxDatumSize = str(len(vardump.split(",")))\r
 \r
             PlatformPcds = self._PlatformPcds.keys()\r
             PlatformPcds.sort()\r
             #\r
             # Add VPD type PCD into VpdFile and determine whether the VPD PCD need to be fixed up.\r
             #\r
+            VpdSkuMap = {}\r
             for PcdKey in PlatformPcds:\r
                 Pcd = self._PlatformPcds[PcdKey]\r
                 if Pcd.Type in [TAB_PCDS_DYNAMIC_VPD, TAB_PCDS_DYNAMIC_EX_VPD] and \\r
                    PcdKey in VpdPcdDict:\r
                     Pcd = VpdPcdDict[PcdKey]\r
+                    SkuValueMap = {}\r
                     for (SkuName,Sku) in Pcd.SkuInfoList.items():\r
                         Sku.VpdOffset = Sku.VpdOffset.strip()\r
                         PcdValue = Sku.DefaultValue\r
@@ -1647,7 +1689,10 @@ class PlatformAutoGen(AutoGen):
                                     EdkLogger.warn("build", "The offset value of PCD %s.%s is not 8-byte aligned!" %(Pcd.TokenSpaceGuidCName, Pcd.TokenCName), File=self.MetaFile)\r
                                 else:\r
                                     EdkLogger.error("build", FORMAT_INVALID, 'The offset value of PCD %s.%s should be %s-byte aligned.' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Alignment))\r
-                        VpdFile.Add(Pcd, Sku.VpdOffset)\r
+                        if PcdValue not in SkuValueMap:\r
+                            SkuValueMap[PcdValue] = []\r
+                            VpdFile.Add(Pcd, 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
                             NeedProcessVpdMapFile = True\r
@@ -1655,7 +1700,7 @@ class PlatformAutoGen(AutoGen):
                                 EdkLogger.error("Build", FILE_NOT_FOUND, \\r
                                                 "Fail to find third-party BPDG tool to process VPD PCDs. BPDG Guid tool need to be defined in tools_def.txt and VPD_TOOL_GUID need to be provided in DSC file.")\r
 \r
-\r
+                    VpdSkuMap[PcdKey] = SkuValueMap\r
             #\r
             # Fix the PCDs define in VPD PCD section that never referenced by module.\r
             # An example is PCD for signature usage.\r
@@ -1674,6 +1719,7 @@ class PlatformAutoGen(AutoGen):
                         # Not found, it should be signature\r
                         if not FoundFlag :\r
                             # just pick the a value to determine whether is unicode string type\r
+                            SkuValueMap = {}\r
                             for (SkuName,Sku) in DscPcdEntry.SkuInfoList.items():\r
                                 Sku.VpdOffset = Sku.VpdOffset.strip() \r
                                 \r
@@ -1699,7 +1745,6 @@ class PlatformAutoGen(AutoGen):
                                                                                                                     \r
                                 if DscPcdEntry not in self._DynamicPcdList:\r
                                     self._DynamicPcdList.append(DscPcdEntry)\r
-#                                Sku = DscPcdEntry.SkuInfoList[DscPcdEntry.SkuInfoList.keys()[0]]\r
                                 Sku.VpdOffset = Sku.VpdOffset.strip()\r
                                 PcdValue = Sku.DefaultValue\r
                                 if PcdValue == "":\r
@@ -1723,7 +1768,10 @@ class PlatformAutoGen(AutoGen):
                                             EdkLogger.warn("build", "The offset value of PCD %s.%s is not 8-byte aligned!" %(DscPcdEntry.TokenSpaceGuidCName, DscPcdEntry.TokenCName), File=self.MetaFile)\r
                                         else:\r
                                             EdkLogger.error("build", FORMAT_INVALID, 'The offset value of PCD %s.%s should be %s-byte aligned.' % (DscPcdEntry.TokenSpaceGuidCName, DscPcdEntry.TokenCName, Alignment))\r
-                                VpdFile.Add(DscPcdEntry, Sku.VpdOffset)\r
+                                if PcdValue not in SkuValueMap:\r
+                                    SkuValueMap[PcdValue] = []\r
+                                    VpdFile.Add(DscPcdEntry, Sku.VpdOffset)\r
+                                SkuValueMap[PcdValue].append(Sku)\r
                                 if not NeedProcessVpdMapFile and Sku.VpdOffset == "*":\r
                                     NeedProcessVpdMapFile = True \r
                             if DscPcdEntry.DatumType == 'VOID*' and PcdValue.startswith("L"):\r
@@ -1734,38 +1782,17 @@ class PlatformAutoGen(AutoGen):
                                 OtherPcdArray.append(DscPcdEntry)\r
                                 \r
                                 # if the offset of a VPD is *, then it need to be fixed up by third party tool.\r
-                                                       \r
-                    \r
-                    \r
+                            VpdSkuMap[DscPcd] = SkuValueMap\r
             if (self.Platform.FlashDefinition == None or self.Platform.FlashDefinition == '') and \\r
                VpdFile.GetCount() != 0:\r
                 EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE, \r
                                 "Fail to get FLASH_DEFINITION definition in DSC file %s which is required when DSC contains VPD PCD." % str(self.Platform.MetaFile))\r
 \r
             if VpdFile.GetCount() != 0:\r
-                FvPath = os.path.join(self.BuildDir, "FV")\r
-                if not os.path.exists(FvPath):\r
-                    try:\r
-                        os.makedirs(FvPath)\r
-                    except:\r
-                        EdkLogger.error("build", FILE_WRITE_FAILURE, "Fail to create FV folder under %s" % self.BuildDir)\r
-\r
-                VpdFilePath = os.path.join(FvPath, "%s.txt" % self.Platform.VpdToolGuid)\r
-\r
-                if VpdFile.Write(VpdFilePath):\r
-                    # retrieve BPDG tool's path from tool_def.txt according to VPD_TOOL_GUID defined in DSC file.\r
-                    BPDGToolName = None\r
-                    for ToolDef in self.ToolDefinition.values():\r
-                        if ToolDef.has_key("GUID") and ToolDef["GUID"] == self.Platform.VpdToolGuid:\r
-                            if not ToolDef.has_key("PATH"):\r
-                                EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE, "PATH attribute was not provided for BPDG guid tool %s in tools_def.txt" % self.Platform.VpdToolGuid)\r
-                            BPDGToolName = ToolDef["PATH"]\r
-                            break\r
-                    # Call third party GUID BPDG tool.\r
-                    if BPDGToolName != None:\r
-                        VpdInfoFile.CallExtenalBPDGTool(BPDGToolName, VpdFilePath)\r
-                    else:\r
-                        EdkLogger.error("Build", FILE_NOT_FOUND, "Fail to find third-party BPDG tool to process VPD PCDs. BPDG Guid tool need to be defined in tools_def.txt and VPD_TOOL_GUID need to be provided in DSC file.")\r
+\r
+                self.FixVpdOffset(VpdFile)\r
+\r
+                self.FixVpdOffset(self.UpdateNVStoreMaxSize(VpdFile))\r
 \r
                 # Process VPD map file generated by third party BPDG tool\r
                 if NeedProcessVpdMapFile:\r
@@ -1774,23 +1801,76 @@ class PlatformAutoGen(AutoGen):
                         VpdFile.Read(VpdMapFilePath)\r
 \r
                         # Fixup "*" offset\r
-                        for Pcd in self._DynamicPcdList:\r
+                        for pcd in VpdSkuMap:\r
+                            vpdinfo = VpdFile.GetVpdInfo(pcd)\r
+                            if vpdinfo is None:\r
                             # just pick the a value to determine whether is unicode string type\r
-                            i = 0\r
-                            for (SkuName,Sku) in Pcd.SkuInfoList.items():                        \r
-                                if Sku.VpdOffset == "*":\r
-                                    Sku.VpdOffset = VpdFile.GetOffset(Pcd)[i].strip()\r
-                                i += 1\r
+                                continue\r
+                            for pcdvalue in VpdSkuMap[pcd]:\r
+                                for sku in VpdSkuMap[pcd][pcdvalue]:\r
+                                    for item in vpdinfo:\r
+                                        if item[2] == pcdvalue:\r
+                                            sku.VpdOffset = item[1]\r
                     else:\r
                         EdkLogger.error("build", FILE_READ_FAILURE, "Can not find VPD map file %s to fix up VPD offset." % VpdMapFilePath)\r
 \r
-            # Delete the DynamicPcdList At the last time enter into this function \r
+            # Delete the DynamicPcdList At the last time enter into this function\r
+            for Pcd in self._DynamicPcdList:\r
+                # just pick the a value to determine whether is unicode string type\r
+                Sku = Pcd.SkuInfoList[Pcd.SkuInfoList.keys()[0]]\r
+                Sku.VpdOffset = Sku.VpdOffset.strip()\r
+\r
+                if Pcd.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
+                    Pcd.DatumType = "VOID*"\r
+\r
+                PcdValue = Sku.DefaultValue\r
+                if Pcd.DatumType == 'VOID*' and PcdValue.startswith("L"):\r
+                    # if found PCD which datum value is unicode string the insert to left size of UnicodeIndex\r
+                    UnicodePcdArray.append(Pcd)\r
+                elif len(Sku.VariableName) > 0:\r
+                    # if found HII type PCD then insert to right of UnicodeIndex\r
+                    HiiPcdArray.append(Pcd)\r
+                else:\r
+                    OtherPcdArray.append(Pcd)\r
             del self._DynamicPcdList[:]\r
         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] = copy.deepcopy(pcd.SkuInfoList['DEFAULT'])\r
+                    pcd.SkuInfoList[SkuName].SkuId = SkuId\r
         self.AllPcdList = self._NonDynamicPcdList + self._DynamicPcdList\r
-        \r
+\r
+    def FixVpdOffset(self,VpdFile ):\r
+        FvPath = os.path.join(self.BuildDir, "FV")\r
+        if not os.path.exists(FvPath):\r
+            try:\r
+                os.makedirs(FvPath)\r
+            except:\r
+                EdkLogger.error("build", FILE_WRITE_FAILURE, "Fail to create FV folder under %s" % self.BuildDir)\r
+\r
+        VpdFilePath = os.path.join(FvPath, "%s.txt" % self.Platform.VpdToolGuid)\r
+\r
+        if VpdFile.Write(VpdFilePath):\r
+            # retrieve BPDG tool's path from tool_def.txt according to VPD_TOOL_GUID defined in DSC file.\r
+            BPDGToolName = None\r
+            for ToolDef in self.ToolDefinition.values():\r
+                if ToolDef.has_key("GUID") and ToolDef["GUID"] == self.Platform.VpdToolGuid:\r
+                    if not ToolDef.has_key("PATH"):\r
+                        EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE, "PATH attribute was not provided for BPDG guid tool %s in tools_def.txt" % self.Platform.VpdToolGuid)\r
+                    BPDGToolName = ToolDef["PATH"]\r
+                    break\r
+            # Call third party GUID BPDG tool.\r
+            if BPDGToolName != None:\r
+                VpdInfoFile.CallExtenalBPDGTool(BPDGToolName, VpdFilePath)\r
+            else:\r
+                EdkLogger.error("Build", FILE_NOT_FOUND, "Fail to find third-party BPDG tool to process VPD PCDs. BPDG Guid tool need to be defined in tools_def.txt and VPD_TOOL_GUID need to be provided in DSC file.")\r
+\r
     ## Return the platform build data object\r
     def _GetPlatform(self):\r
         if self._Platform == None:\r