]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Fix VPD PCD Sub-section display bug
authorYonghong Zhu <yonghong.zhu@intel.com>
Tue, 23 Oct 2018 08:14:28 +0000 (16:14 +0800)
committerYonghong Zhu <yonghong.zhu@intel.com>
Thu, 25 Oct 2018 08:40:18 +0000 (16:40 +0800)
original we get the VPD PCD items from the VPDGuid.map file in the FV
output folder. but this logic doesn't work when 1) there only have
single non Default SKU, 2) there have multiple SKU with same value.
Now we change it to get the really VPD Pcd items that already display
in the PCD section of the report.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/Python/build/BuildReport.py

index de8f0fb087d948d1d7764f8e3f62299ea427aeca..ea98ef7ed55c2386d866f390124a8c42d8641dd4 100644 (file)
@@ -126,6 +126,9 @@ gDriverTypeMap = {
 ## The look up table of the supported opcode in the dependency expression binaries\r
 gOpCodeList = ["BEFORE", "AFTER", "PUSH", "AND", "OR", "NOT", "TRUE", "FALSE", "END", "SOR"]\r
 \r
+## Save VPD Pcd\r
+VPDPcdList = []\r
+\r
 ##\r
 # Writes a string to the file object.\r
 #\r
@@ -1401,6 +1404,9 @@ class PcdReport(object):
                                 FileWrite(File, ' %-*s   : %6s %10s %10s = %s' % (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + ')', '(' + SkuIdName + ')', Value))\r
                     if TypeName in ('DYNVPD', 'DEXVPD'):\r
                         FileWrite(File, '%*s' % (self.MaxLen + 4, SkuInfo.VpdOffset))\r
+                        VPDPcdItem = (Pcd.TokenSpaceGuidCName + '.' + PcdTokenCName, SkuIdName, SkuInfo.VpdOffset, Pcd.MaxDatumSize, SkuInfo.DefaultValue)\r
+                        if VPDPcdItem not in VPDPcdList:\r
+                            VPDPcdList.append(VPDPcdItem)\r
                     if IsStructure:\r
                         FiledOverrideFlag = False\r
                         OverrideValues = Pcd.SkuOverrideValues[Sku]\r
@@ -2017,35 +2023,14 @@ class FdReport(object):
         self.Size = Fd.Size\r
         self.FdRegionList = [FdRegionReport(FdRegion, Wa) for FdRegion in Fd.RegionList]\r
         self.FvPath = os.path.join(Wa.BuildDir, TAB_FV_DIRECTORY)\r
-        self.VpdFilePath = os.path.join(self.FvPath, "%s.map" % Wa.Platform.VpdToolGuid)\r
         self.VPDBaseAddress = 0\r
         self.VPDSize = 0\r
-        self.VPDInfoList = []\r
         for index, FdRegion in enumerate(Fd.RegionList):\r
             if str(FdRegion.RegionType) is 'FILE' and Wa.Platform.VpdToolGuid in str(FdRegion.RegionDataList):\r
                 self.VPDBaseAddress = self.FdRegionList[index].BaseAddress\r
                 self.VPDSize = self.FdRegionList[index].Size\r
                 break\r
 \r
-        if os.path.isfile(self.VpdFilePath):\r
-            fd = open(self.VpdFilePath, "r")\r
-            Lines = fd.readlines()\r
-            for Line in Lines:\r
-                Line = Line.strip()\r
-                if len(Line) == 0 or Line.startswith("#"):\r
-                    continue\r
-                try:\r
-                    PcdName, SkuId, Offset, Size, Value = Line.split("#")[0].split("|")\r
-                    PcdName, SkuId, Offset, Size, Value = PcdName.strip(), SkuId.strip(), Offset.strip(), Size.strip(), Value.strip()\r
-                    if Offset.lower().startswith('0x'):\r
-                        Offset = '0x%08X' % (int(Offset, 16) + self.VPDBaseAddress)\r
-                    else:\r
-                        Offset = '0x%08X' % (int(Offset, 10) + self.VPDBaseAddress)\r
-                    self.VPDInfoList.append("%s | %s | %s | %s | %s" % (PcdName, SkuId, Offset, Size, Value))\r
-                except:\r
-                    EdkLogger.error("BuildReport", CODE_ERROR, "Fail to parse VPD information file %s" % self.VpdFilePath)\r
-            fd.close()\r
-\r
     ##\r
     # Generate report for the firmware device.\r
     #\r
@@ -2065,23 +2050,26 @@ class FdReport(object):
             for FdRegionItem in self.FdRegionList:\r
                 FdRegionItem.GenerateReport(File)\r
 \r
-        if len(self.VPDInfoList) > 0:\r
+        if VPDPcdList:\r
+            VPDPcdList.sort(key=lambda x: int(x[2], 0))\r
             FileWrite(File, gSubSectionStart)\r
             FileWrite(File, "FD VPD Region")\r
             FileWrite(File, "Base Address:       0x%X" % self.VPDBaseAddress)\r
             FileWrite(File, "Size:               0x%X (%.0fK)" % (self.VPDSize, self.VPDSize / 1024.0))\r
             FileWrite(File, gSubSectionSep)\r
-            for item in self.VPDInfoList:\r
-                ValueList = item.split('|')\r
-                Value = ValueList[-1].strip()\r
-                IsByteArray, ArrayList = ByteArrayForamt(Value)\r
+            for item in VPDPcdList:\r
+                # Add BaseAddress for offset\r
+                Offset = '0x%08X' % (int(item[2], 16) + self.VPDBaseAddress)\r
+                IsByteArray, ArrayList = ByteArrayForamt(item[-1])\r
+                Skuinfo = item[1]\r
+                if len(GlobalData.gSkuids) == 1 :\r
+                    Skuinfo = GlobalData.gSkuids[0]\r
                 if IsByteArray:\r
-                    ValueList[-1] = ' {'\r
-                    FileWrite(File, '|'.join(ValueList))\r
+                    FileWrite(File, "%s | %s | %s | %s | %s" % (item[0], Skuinfo, Offset, item[3], '{'))\r
                     for Array in ArrayList:\r
                         FileWrite(File, Array)\r
                 else:\r
-                    FileWrite(File, item)\r
+                    FileWrite(File, "%s | %s | %s | %s | %s" % (item[0], Skuinfo, Offset, item[3], item[-1]))\r
             FileWrite(File, gSubSectionEnd)\r
         FileWrite(File, gSectionEnd)\r
 \r