Reviewed-by: Liming Gao <liming....@intel.com>
> -----Original Message----- > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of > Yonghong Zhu > Sent: Tuesday, October 23, 2018 7:10 PM > To: edk2-devel@lists.01.org > Subject: [edk2] [Patch] BaseTools: Fix VPD PCD Sub-section display bug > > 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....@intel.com> > --- > BaseTools/Source/Python/build/BuildReport.py | 46 > ++++++++++------------------ > 1 file changed, 17 insertions(+), 29 deletions(-) > > diff --git a/BaseTools/Source/Python/build/BuildReport.py > b/BaseTools/Source/Python/build/BuildReport.py > index de8f0fb..ea98ef7 100644 > --- a/BaseTools/Source/Python/build/BuildReport.py > +++ b/BaseTools/Source/Python/build/BuildReport.py > @@ -124,10 +124,13 @@ gDriverTypeMap = { > } > > ## The look up table of the supported opcode in the dependency expression > binaries > gOpCodeList = ["BEFORE", "AFTER", "PUSH", "AND", "OR", "NOT", "TRUE", > "FALSE", "END", "SOR"] > > +## Save VPD Pcd > +VPDPcdList = [] > + > ## > # Writes a string to the file object. > # > # This function writes a string to the file object and a new line is appended > # afterwards. It may optionally wraps the string for better readability. > @@ -1399,10 +1402,13 @@ class PcdReport(object): > FileWrite(File, ' %-*s : %6s %10s = %s' % > (self.MaxLen, ' ', TypeName, '(' + Pcd.DatumType + > ')', Value)) > else: > FileWrite(File, ' %-*s : %6s %10s %10s = > %s' % (self.MaxLen, ' ', TypeName, '(' + > Pcd.DatumType + ')', '(' + SkuIdName + ')', Value)) > if TypeName in ('DYNVPD', 'DEXVPD'): > FileWrite(File, '%*s' % (self.MaxLen + 4, > SkuInfo.VpdOffset)) > + VPDPcdItem = (Pcd.TokenSpaceGuidCName + '.' + > PcdTokenCName, SkuIdName, SkuInfo.VpdOffset, > Pcd.MaxDatumSize, SkuInfo.DefaultValue) > + if VPDPcdItem not in VPDPcdList: > + VPDPcdList.append(VPDPcdItem) > if IsStructure: > FiledOverrideFlag = False > OverrideValues = Pcd.SkuOverrideValues[Sku] > if OverrideValues: > Keys = OverrideValues.keys() > @@ -2015,39 +2021,18 @@ class FdReport(object): > self.FdName = Fd.FdUiName > self.BaseAddress = Fd.BaseAddress > self.Size = Fd.Size > self.FdRegionList = [FdRegionReport(FdRegion, Wa) for FdRegion in > Fd.RegionList] > self.FvPath = os.path.join(Wa.BuildDir, TAB_FV_DIRECTORY) > - self.VpdFilePath = os.path.join(self.FvPath, "%s.map" % > Wa.Platform.VpdToolGuid) > self.VPDBaseAddress = 0 > self.VPDSize = 0 > - self.VPDInfoList = [] > for index, FdRegion in enumerate(Fd.RegionList): > if str(FdRegion.RegionType) is 'FILE' and > Wa.Platform.VpdToolGuid in str(FdRegion.RegionDataList): > self.VPDBaseAddress = self.FdRegionList[index].BaseAddress > self.VPDSize = self.FdRegionList[index].Size > break > > - if os.path.isfile(self.VpdFilePath): > - fd = open(self.VpdFilePath, "r") > - Lines = fd.readlines() > - for Line in Lines: > - Line = Line.strip() > - if len(Line) == 0 or Line.startswith("#"): > - continue > - try: > - PcdName, SkuId, Offset, Size, Value = > Line.split("#")[0].split("|") > - PcdName, SkuId, Offset, Size, Value = PcdName.strip(), > SkuId.strip(), Offset.strip(), Size.strip(), Value.strip() > - if Offset.lower().startswith('0x'): > - Offset = '0x%08X' % (int(Offset, 16) + > self.VPDBaseAddress) > - else: > - Offset = '0x%08X' % (int(Offset, 10) + > self.VPDBaseAddress) > - self.VPDInfoList.append("%s | %s | %s | %s | %s" % > (PcdName, SkuId, Offset, Size, Value)) > - except: > - EdkLogger.error("BuildReport", CODE_ERROR, "Fail to > parse VPD information file %s" % self.VpdFilePath) > - fd.close() > - > ## > # Generate report for the firmware device. > # > # This function generates report for the firmware device. > # > @@ -2063,27 +2048,30 @@ class FdReport(object): > if len(self.FdRegionList) > 0: > FileWrite(File, gSectionSep) > for FdRegionItem in self.FdRegionList: > FdRegionItem.GenerateReport(File) > > - if len(self.VPDInfoList) > 0: > + if VPDPcdList: > + VPDPcdList.sort(key=lambda x: int(x[2], 0)) > FileWrite(File, gSubSectionStart) > FileWrite(File, "FD VPD Region") > FileWrite(File, "Base Address: 0x%X" % self.VPDBaseAddress) > FileWrite(File, "Size: 0x%X (%.0fK)" % > (self.VPDSize, self.VPDSize / 1024.0)) > FileWrite(File, gSubSectionSep) > - for item in self.VPDInfoList: > - ValueList = item.split('|') > - Value = ValueList[-1].strip() > - IsByteArray, ArrayList = ByteArrayForamt(Value) > + for item in VPDPcdList: > + # Add BaseAddress for offset > + Offset = '0x%08X' % (int(item[2], 16) + self.VPDBaseAddress) > + IsByteArray, ArrayList = ByteArrayForamt(item[-1]) > + Skuinfo = item[1] > + if len(GlobalData.gSkuids) == 1 : > + Skuinfo = GlobalData.gSkuids[0] > if IsByteArray: > - ValueList[-1] = ' {' > - FileWrite(File, '|'.join(ValueList)) > + FileWrite(File, "%s | %s | %s | %s | %s" % (item[0], > Skuinfo, Offset, item[3], '{')) > for Array in ArrayList: > FileWrite(File, Array) > else: > - FileWrite(File, item) > + FileWrite(File, "%s | %s | %s | %s | %s" % (item[0], > Skuinfo, Offset, item[3], item[-1])) > FileWrite(File, gSubSectionEnd) > FileWrite(File, gSectionEnd) > > > > -- > 2.6.1.windows.1 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel