]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/BuildReport.py
BaseTools: Add a VPD report subsection of FLASH to the Report
[mirror_edk2.git] / BaseTools / Source / Python / build / BuildReport.py
index 327d5a53479cf0369316ff3d46042c2cb75759d9..38e55f3e07f6b67606838e3c13823ab04903fe42 100644 (file)
@@ -41,6 +41,7 @@ from Common.DataType import TAB_BRG_PCD
 from Common.DataType import TAB_BRG_LIBRARY\r
 from Common.DataType import TAB_BACK_SLASH\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
+from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 \r
 ## Pattern to extract contents in EDK DXS files\r
 gDxsDependencyPattern = re.compile(r"DEPENDENCY_START(.+)DEPENDENCY_END", re.DOTALL)\r
@@ -1235,9 +1236,10 @@ class FdRegionReport(object):
                     DecDefaultValue = Package.Pcds[TokenCName, TokenSpaceGuidCName, DecType].DefaultValue\r
                     PlatformPcds[(TokenCName, TokenSpaceGuidCName)] = DecDefaultValue\r
         #\r
-        # Collect PCDs defined in DSC common section\r
+        # Collect PCDs defined in DSC file\r
         #\r
-        for Platform in Wa.BuildDatabase.WorkspaceDb.PlatformList:\r
+        for arch in Wa.ArchList:\r
+            Platform = Wa.BuildDatabase[Wa.MetaFile, arch]\r
             for (TokenCName, TokenSpaceGuidCName) in Platform.Pcds:\r
                 DscDefaultValue = Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DefaultValue\r
                 PlatformPcds[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
@@ -1255,7 +1257,7 @@ class FdRegionReport(object):
         for Pa in Wa.AutoGenObjectList:\r
             for ModuleKey in Pa.Platform.Modules:\r
                 M = Pa.Platform.Modules[ModuleKey].M\r
-                InfPath = os.path.join(Wa.WorkspaceDir, M.MetaFile.File)\r
+                InfPath = mws.join(Wa.WorkspaceDir, M.MetaFile.File)\r
                 self._GuidsDb[M.Guid.upper()] = "%s (%s)" % (M.Module.BaseName, InfPath)\r
 \r
         #\r
@@ -1277,7 +1279,7 @@ class FdRegionReport(object):
                             Guid = GuidStructureByteArrayToGuidString(GuidValue).upper()\r
                     for Section in Ffs.SectionList:\r
                         try:\r
-                            ModuleSectFile = os.path.join(Wa.WorkspaceDir, Section.SectFileName)\r
+                            ModuleSectFile = mws.join(Wa.WorkspaceDir, Section.SectFileName)\r
                             self._GuidsDb[Guid] = ModuleSectFile\r
                         except AttributeError:\r
                             pass\r
@@ -1385,6 +1387,32 @@ class FdReport(object):
         self.BaseAddress = Fd.BaseAddress\r
         self.Size = Fd.Size\r
         self.FdRegionList = [FdRegionReport(FdRegion, Wa) for FdRegion in Fd.RegionList]\r
+        self.FvPath = os.path.join(Wa.BuildDir, "FV")\r
+        self.VpdFilePath = os.path.join(self.FvPath, "%s.map" % Wa.Platform.VpdToolGuid)\r
+        VpdPcdToken = 'gEfiMdeModulePkgTokenSpaceGuid'\r
+        VpdPcdName = 'PcdVpdBaseAddress'\r
+        self.VPDInfoList = []\r
+        for index, FdRegion in enumerate(Fd.RegionList):\r
+            if (VpdPcdName, VpdPcdToken) == FdRegion.PcdOffset:\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
+                    Offset = '0x%08X' % (int(Offset, 16) + 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
@@ -1405,6 +1433,15 @@ class FdReport(object):
             for FdRegionItem in self.FdRegionList:\r
                 FdRegionItem.GenerateReport(File)\r
 \r
+        if len(self.VPDInfoList) > 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
+                FileWrite(File, item)\r
+            FileWrite(File, gSubSectionEnd)\r
         FileWrite(File, gSectionEnd)\r
 \r
 \r