diff options
author | Maurice Ma <maurice.ma@intel.com> | 2016-05-25 11:21:18 -0700 |
---|---|---|
committer | Hao Wu <hao.a.wu@intel.com> | 2016-07-05 11:18:02 +0800 |
commit | f951a465ef7d8e10ba555f7a62783c64dba9ecc3 (patch) | |
tree | ec23e420e637a8f3558ee8bc342022c7133d26dd | |
parent | e2d3b9436c0d30f96b6fd3d59258c279693684e5 (diff) | |
download | edk2-platforms-f951a465ef7d8e10ba555f7a62783c64dba9ecc3.tar.xz |
IntelFsp2Pkg/Tools: Add BSF bit field support in GenCfgOpt tool
The current GenCfgOpt tool does not generate bit fields in BSF.
This change will allow bit fields to be created in BSF for a specific
FSP UPD item. The argument for the tool is also updated to be in sync
with the old usage model in IntelFspPkg.
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Giri P Mudusuru <giri.p.mudusuru@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Maurice Ma <maurice.ma@intel.com>
Reviewed-by: Jiewen Yao <Jiewen.yao@intel.com>
Reviewed-by: Giri P Mudusuru <giri.p.mudusuru@intel.com>
(cherry picked from commit 62997d5ede78c0d719548e4ecd9b9c717ce593cf)
-rw-r--r-- | IntelFsp2Pkg/Tools/GenCfgOpt.py | 224 |
1 files changed, 113 insertions, 111 deletions
diff --git a/IntelFsp2Pkg/Tools/GenCfgOpt.py b/IntelFsp2Pkg/Tools/GenCfgOpt.py index 4fd0562e75..e8cec95aa7 100644 --- a/IntelFsp2Pkg/Tools/GenCfgOpt.py +++ b/IntelFsp2Pkg/Tools/GenCfgOpt.py @@ -310,6 +310,7 @@ EndList self._BuidinOption = {'$EN_DIS' : 'EN_DIS'}
self._MacroDict = {}
+ self._PcdsDict = {}
self._CfgBlkDict = {}
self._CfgPageDict = {}
self._CfgItemList = []
@@ -374,8 +375,21 @@ EndList Line = Line.replace(Each, Each[2:-1])
return Line
+ def ExpandPcds (self, Input):
+ Line = Input
+ Match = re.findall("(\w+\.\w+)", Input)
+ if Match:
+ for PcdName in Match:
+ if PcdName in self._PcdsDict:
+ Line = Line.replace(PcdName, self._PcdsDict[PcdName])
+ else:
+ if self.Debug:
+ print "WARN : %s is not defined" % PcdName
+ return Line
+
def EvaluateExpress (self, Expr):
- ExpExpr = self.ExpandMacros(Expr)
+ ExpExpr = self.ExpandPcds(Expr)
+ ExpExpr = self.ExpandMacros(ExpExpr)
LogExpr = CLogicalExpression()
Result = LogExpr.evaluateExpress (ExpExpr)
if self.Debug:
@@ -411,7 +425,7 @@ EndList ConfigDict['value'] = newvalue
return ""
- def ParseDscFile (self, DscFile, FvDir, ConfigDscFile, ExtConfigDscFile):
+ def ParseDscFile (self, DscFile, FvDir):
self._CfgItemList = []
self._CfgPageDict = {}
self._CfgBlkDict = {}
@@ -419,9 +433,9 @@ EndList self._FvDir = FvDir
IsDefSect = False
+ IsPcdSect = False
IsUpdSect = False
IsVpdSect = False
- Found = False
IfStack = []
ElifStack = []
@@ -437,10 +451,14 @@ EndList Handle = False
Match = re.match("^\[(.+)\]", DscLine)
if Match is not None:
+ IsDefSect = False
+ IsPcdSect = False
+ IsVpdSect = False
+ IsUpdSect = False
if Match.group(1).lower() == "Defines".lower():
IsDefSect = True
- IsVpdSect = False
- IsUpdSect = False
+ if Match.group(1).lower() == "PcdsFeatureFlag".lower():
+ IsPcdSect = True
elif Match.group(1).lower() == "PcdsDynamicVpd.Upd".lower():
ConfigDict = {}
ConfigDict['header'] = 'ON'
@@ -453,16 +471,9 @@ EndList ConfigDict['embed'] = ''
ConfigDict['comment'] = ''
ConfigDict['subreg'] = []
- IsDefSect = False
IsUpdSect = True
- IsVpdSect = False
- Found = True
- else:
- IsDefSect = False
- IsUpdSect = False
- IsVpdSect = False
else:
- if IsDefSect or IsUpdSect or IsVpdSect:
+ if IsDefSect or IsPcdSect or IsUpdSect or IsVpdSect:
if re.match("^!else($|\s+#.+)", DscLine):
if IfStack:
IfStack[-1] = not IfStack[-1]
@@ -490,41 +501,7 @@ EndList else:
Match = re.match("!(if|elseif)\s+(.+)", DscLine)
if Match:
- IsFoundInFile = False
- MatchPcdFormat = re.match("^\s*(.+)\.(.+)\s*==\s*(.+)", Match.group(2))
- if MatchPcdFormat:
- ExtConfigDsc = open(ExtConfigDscFile, "r")
- ExtConfigDscLines = ExtConfigDsc.readlines()
- ExtConfigDsc.close()
-
- while len(ExtConfigDscLines):
- ExtConfigDscLine = ExtConfigDscLines.pop(0).strip()
- MatchExtConfigPcd = re.match("^\s*(.+)\s*\|\s*(.+)", ExtConfigDscLine)
- if MatchExtConfigPcd and IsFoundInFile == False:
- PcdFormatStr = str(str(MatchPcdFormat.group(1)) + "." + str(MatchPcdFormat.group(2)))
- ExtConfigPcd = str(MatchExtConfigPcd.group(1))
- Result = False
- if PcdFormatStr.strip() == ExtConfigPcd.strip():
- Result = self.EvaluateExpress(str(str(MatchExtConfigPcd.group(2)) + " == " + str(MatchPcdFormat.group(3))))
- IsFoundInFile = True
- break
- if IsFoundInFile == False:
- ConfigDsc = open(ConfigDscFile, "r")
- ConfigDscLines = ConfigDsc.readlines()
- ConfigDsc.close()
- while len(ConfigDscLines):
- ConfigDscLine = ConfigDscLines.pop(0).strip()
- MatchConfigPcd = re.match("^\s*(.+)\s*\|\s*(.+)", ConfigDscLine)
- if MatchConfigPcd:
- PcdFormatStr = str(str(MatchPcdFormat.group(1)) + "." + str(MatchPcdFormat.group(2)))
- ConfigPcd = str(MatchConfigPcd.group(1))
- Result = False
- if PcdFormatStr.strip() == ConfigPcd.strip():
- Result = self.EvaluateExpress(str(str(MatchConfigPcd.group(2)) + " == " + str(MatchPcdFormat.group(3))))
- IsFoundInFile = True
- break
- else:
- Result = self.EvaluateExpress(Match.group(2))
+ Result = self.EvaluateExpress(Match.group(2))
if Match.group(1) == "if":
ElifStack.append(0)
IfStack.append(Result)
@@ -571,6 +548,14 @@ EndList self._MacroDict[Match.group(1)] = Match.group(2)
if self.Debug:
print "INFO : DEFINE %s = [ %s ]" % (Match.group(1), Match.group(2))
+ elif IsPcdSect:
+ #gSiPkgTokenSpaceGuid.PcdTxtEnable|FALSE
+ #gSiPkgTokenSpaceGuid.PcdOverclockEnable|TRUE
+ Match = re.match("^\s*([\w\.]+)\s*\|\s*(\w+)", DscLine)
+ if Match:
+ self._PcdsDict[Match.group(1)] = Match.group(2)
+ if self.Debug:
+ print "INFO : PCD %s = [ %s ]" % (Match.group(1), Match.group(2))
else:
Match = re.match("^\s*#\s+(!BSF|@Bsf|!HDR)\s+(.+)", DscLine)
if Match:
@@ -693,25 +678,43 @@ EndList ConfigDict['option'] = ''
else:
# It could be a virtual item as below
- # !BSF FIELD:{1:SerialDebugPortAddress0}
+ # !BSF FIELD:{SerialDebugPortAddress0:1}
# or
- # @Bsf FIELD:{1:SerialDebugPortAddress0}
- Match = re.match("^\s*#\s+(!BSF|@Bsf)\s+FIELD:{(.+):(\d+)}", DscLine)
+ # @Bsf FIELD:{SerialDebugPortAddress0:1b}
+ Match = re.match("^\s*#\s+(!BSF|@Bsf)\s+FIELD:{(.+):(\d+)([Bb])?}", DscLine)
if Match:
- SubCfgDict = ConfigDict
+ SubCfgDict = ConfigDict.copy()
+ if (Match.group(4) == None) or (Match.group(4) == 'B'):
+ UnitBitLen = 8
+ elif Match.group(4) == 'b':
+ UnitBitLen = 1
+ else:
+ print("ERROR: Invalide BSF FIELD length for line '%s'" % DscLine)
+ raise SystemExit
SubCfgDict['cname'] = Match.group(2)
- SubCfgDict['length'] = int (Match.group(3))
- if SubCfgDict['length'] > 0:
+ SubCfgDict['bitlength'] = int (Match.group(3)) * UnitBitLen
+ if SubCfgDict['bitlength'] > 0:
LastItem = self._CfgItemList[-1]
if len(LastItem['subreg']) == 0:
SubOffset = 0
else:
- SubOffset += LastItem['subreg'][-1]['length']
- SubCfgDict['offset'] = SubOffset
+ SubOffset = LastItem['subreg'][-1]['bitoffset'] + LastItem['subreg'][-1]['bitlength']
+ SubCfgDict['bitoffset'] = SubOffset
LastItem['subreg'].append (SubCfgDict.copy())
ConfigDict['name'] = ''
return Error
+ def GetBsfBitFields (self, subitem, bytes):
+ start = subitem['bitoffset']
+ end = start + subitem['bitlength']
+ bitsvalue = ''.join('{0:08b}'.format(i) for i in bytes[::-1])
+ bitsvalue = bitsvalue[::-1]
+ bitslen = len(bitsvalue)
+ if start > bitslen or end > bitslen:
+ print "Invalid bits offset [%d,%d] for %s" % (start, end, subitem['name'])
+ raise SystemExit
+ return hex(int(bitsvalue[start:end][::-1], 2))
+
def UpdateSubRegionDefaultValue (self):
Error = 0
for Item in self._CfgItemList:
@@ -732,20 +735,14 @@ EndList value = int(Item['value'], 16)
else:
value = int(Item['value'])
- idx = 0;
+ idx = 0
while idx < Item['length']:
bytearray.append(value & 0xFF)
value = value >> 8
idx = idx + 1
for SubItem in Item['subreg']:
- if SubItem['length'] in (1,2,4,8):
- valuelist = [b for b in bytearray[SubItem['offset']:SubItem['offset']+SubItem['length']]]
- valuelist.reverse()
- valuestr = "".join('%02X' % b for b in valuelist)
- SubItem['value'] = '0x%s' % valuestr
- else:
- valuestr = ",".join('0x%02X' % b for b in bytearray[SubItem['offset']:SubItem['offset']+SubItem['length']])
- SubItem['value'] = '{%s}' % valuestr
+ valuestr = self.GetBsfBitFields(SubItem, bytearray)
+ SubItem['value'] = valuestr
return Error
def CreateSplitUpdTxt (self, UpdTxtFile):
@@ -969,7 +966,7 @@ EndList else:
OldTextBody.append (Line)
- if Match and Match.group(3) == 'END':
+ if Match and Match.group(3) == 'END':
if (StructName != Match.group(1)) or (VariableName != Match.group(2)):
print "Unmatched struct name '%s' and '%s' !" % (StructName, Match.group(1))
else:
@@ -1086,7 +1083,7 @@ EndList Marker = '/* EMBED_STRUCT:%s */ ' % Item["embed"]
else:
if Embed == '':
- Marker = '';
+ Marker = ''
else:
self.Error = "Invalid embedded structure format '%s'!\n" % Item["embed"]
return 4
@@ -1095,7 +1092,7 @@ EndList if Item['cname'] == 'UpdTerminator':
break
TxtBody.append("} " + UpdStructure[UpdIdx] + ";\n\n")
-
+
# Handle the embedded data structure
TxtBody = self.PostProcessBody (TxtBody)
@@ -1242,7 +1239,10 @@ EndList DefaultValue = Match.group(1).strip()
else:
DefaultValue = Item['value'].strip()
- BsfFd.write(" %s%s%4d bytes $_DEFAULT_ = %s\n" % (Line, ' ' * (64 - len(Line)), Item['length'], DefaultValue))
+ if 'bitlength' in Item:
+ BsfFd.write(" %s%s%4d bits $_DEFAULT_ = %s\n" % (Line, ' ' * (64 - len(Line)), Item['bitlength'], DefaultValue))
+ else:
+ BsfFd.write(" %s%s%4d bytes $_DEFAULT_ = %s\n" % (Line, ' ' * (64 - len(Line)), Item['length'], DefaultValue))
TmpList = []
if Item['type'] == "Combo":
if not Item['option'] in self._BuidinOption:
@@ -1261,20 +1261,20 @@ EndList Options = self._BuidinOption[Item['option']]
else:
Options = PcdName
- BsfFd.write(' %s $%s, "%s", &%s,\n' % (Item['type'], PcdName, Item['name'], Options));
+ BsfFd.write(' %s $%s, "%s", &%s,\n' % (Item['type'], PcdName, Item['name'], Options))
WriteHelp = 1
elif Item['type'].startswith("EditNum"):
Match = re.match("EditNum\s*,\s*(HEX|DEC)\s*,\s*\((\d+|0x[0-9A-Fa-f]+)\s*,\s*(\d+|0x[0-9A-Fa-f]+)\)", Item['type'])
if Match:
- BsfFd.write(' EditNum $%s, "%s", %s,\n' % (PcdName, Item['name'], Match.group(1)));
+ BsfFd.write(' EditNum $%s, "%s", %s,\n' % (PcdName, Item['name'], Match.group(1)))
WriteHelp = 2
elif Item['type'].startswith("EditText"):
- BsfFd.write(' %s $%s, "%s",\n' % (Item['type'], PcdName, Item['name']));
+ BsfFd.write(' %s $%s, "%s",\n' % (Item['type'], PcdName, Item['name']))
WriteHelp = 1
elif Item['type'] == "Table":
Columns = Item['option'].split(',')
if len(Columns) != 0:
- BsfFd.write(' %s $%s "%s",' % (Item['type'], PcdName, Item['name']));
+ BsfFd.write(' %s $%s "%s",' % (Item['type'], PcdName, Item['name']))
for Col in Columns:
Fmt = Col.split(':')
if len(Fmt) != 3:
@@ -1286,18 +1286,18 @@ EndList BsfFd.write('\n Column "%s", %d bytes, %s' % (Fmt[0].strip(), Dtype, Fmt[2].strip()))
BsfFd.write(',\n')
WriteHelp = 1
-
+
if WriteHelp > 0:
HelpLines = Item['help'].split('\\n\\r')
FirstLine = True
for HelpLine in HelpLines:
if FirstLine:
FirstLine = False
- BsfFd.write(' Help "%s"\n' % (HelpLine));
+ BsfFd.write(' Help "%s"\n' % (HelpLine))
else:
- BsfFd.write(' "%s"\n' % (HelpLine));
+ BsfFd.write(' "%s"\n' % (HelpLine))
if WriteHelp == 2:
- BsfFd.write(' "Valid range: %s ~ %s"\n' % (Match.group(2), Match.group(3)));
+ BsfFd.write(' "Valid range: %s ~ %s"\n' % (Match.group(2), Match.group(3)))
def GenerateBsfFile (self, BsfFile):
@@ -1309,7 +1309,7 @@ EndList OptionDict = {}
BsfFd = open(BsfFile, "w")
BsfFd.write("%s\n" % (__copyright_bsf__ % date.today().year))
- BsfFd.write("%s\n" % self._GlobalDataDef);
+ BsfFd.write("%s\n" % self._GlobalDataDef)
BsfFd.write("StructDef\n")
NextOffset = -1
for Item in self._CfgItemList:
@@ -1321,17 +1321,30 @@ EndList BsfFd.write(" Skip %d bytes\n" % (Item['offset'] - NextOffset))
if len(Item['subreg']) > 0:
NextOffset = Item['offset']
+ BitsOffset = NextOffset * 8
for SubItem in Item['subreg']:
- NextOffset += SubItem['length']
+ BitsOffset += SubItem['bitlength']
if SubItem['name'] == '':
- BsfFd.write(" Skip %d bytes\n" % (SubItem['length']))
+ if 'bitlength' in SubItem:
+ BsfFd.write(" Skip %d bits\n" % (SubItem['bitlength']))
+ else:
+ BsfFd.write(" Skip %d bytes\n" % (SubItem['length']))
else:
Options = self.WriteBsfStruct(BsfFd, SubItem)
if len(Options) > 0:
OptionDict[SubItem['space']+'_'+SubItem['cname']] = Options
- if (Item['offset'] + Item['length']) < NextOffset:
- self.Error = "BSF sub region '%s' length does not match" % (Item['space']+'.'+Item['cname'])
- return 2
+
+ NextBitsOffset = (Item['offset'] + Item['length']) * 8
+ if NextBitsOffset > BitsOffset:
+ BitsGap = NextBitsOffset - BitsOffset
+ BitsRemain = BitsGap % 8
+ if BitsRemain:
+ BsfFd.write(" Skip %d bits\n" % BitsRemain)
+ BitsGap -= BitsRemain
+ BytesRemain = BitsGap / 8
+ if BytesRemain:
+ BsfFd.write(" Skip %d bytes\n" % BytesRemain)
+ NextOffset = Item['offset'] + Item['length']
else:
NextOffset = Item['offset'] + Item['length']
Options = self.WriteBsfStruct(BsfFd, Item)
@@ -1339,21 +1352,21 @@ EndList OptionDict[Item['space']+'_'+Item['cname']] = Options
BsfFd.write("\nEndStruct\n\n")
- BsfFd.write("%s" % self._BuidinOptionTxt);
+ BsfFd.write("%s" % self._BuidinOptionTxt)
for Each in OptionDict:
- BsfFd.write("List &%s\n" % Each);
+ BsfFd.write("List &%s\n" % Each)
for Item in OptionDict[Each]:
- BsfFd.write(' Selection %s , "%s"\n' % (Item[0], Item[1]));
- BsfFd.write("EndList\n\n");
+ BsfFd.write(' Selection %s , "%s"\n' % (Item[0], Item[1]))
+ BsfFd.write("EndList\n\n")
- BsfFd.write("BeginInfoBlock\n");
- BsfFd.write(' PPVer "%s"\n' % (self._CfgBlkDict['ver']));
- BsfFd.write(' Description "%s"\n' % (self._CfgBlkDict['name']));
- BsfFd.write("EndInfoBlock\n\n");
+ BsfFd.write("BeginInfoBlock\n")
+ BsfFd.write(' PPVer "%s"\n' % (self._CfgBlkDict['ver']))
+ BsfFd.write(' Description "%s"\n' % (self._CfgBlkDict['name']))
+ BsfFd.write("EndInfoBlock\n\n")
for Each in self._CfgPageDict:
- BsfFd.write('Page "%s"\n' % self._CfgPageDict[Each]);
+ BsfFd.write('Page "%s"\n' % self._CfgPageDict[Each])
BsfItems = []
for Item in self._CfgItemList:
if Item['name'] != '':
@@ -1370,21 +1383,18 @@ EndList for Item in BsfItems:
self.WriteBsfOption (BsfFd, Item)
- BsfFd.write("EndPage\n\n");
+ BsfFd.write("EndPage\n\n")
BsfFd.close()
return Error
def Usage():
- print "GenCfgOpt Version 0.51"
+ print "GenCfgOpt Version 0.52"
print "Usage:"
- print " GenCfgOpt UPDTXT PlatformDscFile BuildFvDir ConfigDscFile ExtConfigDscFile"
- print " [-D Macros]"
- print " GenCfgOpt HEADER PlatformDscFile BuildFvDir ConfigDscFile ExtConfigDscFile"
- print " InputHFile [-D Macros]"
- print " GenCfgOpt GENBSF PlatformDscFile BuildFvDir ConfigDscFile ExtConfigDscFile"
- print " BsfOutFile [-D Macros]"
+ print " GenCfgOpt UPDTXT PlatformDscFile BuildFvDir [-D Macros]"
+ print " GenCfgOpt HEADER PlatformDscFile BuildFvDir InputHFile [-D Macros]"
+ print " GenCfgOpt GENBSF PlatformDscFile BuildFvDir BsfOutFile [-D Macros]"
def Main():
#
@@ -1400,21 +1410,13 @@ def Main(): if not os.path.exists(DscFile):
print "ERROR: Cannot open DSC file '%s' !" % DscFile
return 2
- ConfigDscFile = sys.argv[4]
- if not os.path.exists(ConfigDscFile):
- print "ERROR: Cannot open Config DSC file '%s' !" % ConfigDscFile
- return 2
- ExtConfigDscFile = sys.argv[5]
- if not os.path.exists(ExtConfigDscFile):
- print "ERROR: Cannot open Ext Config DSC file '%s' !" % ExtConfigDscFile
- return 2
OutFile = ''
if argc > 4:
- if sys.argv[6][0] == '-':
+ if sys.argv[4][0] == '-':
Start = 4
else:
- OutFile = sys.argv[6]
+ OutFile = sys.argv[4]
Start = 5
GenCfgOpt.ParseBuildMode(sys.argv[3])
if GenCfgOpt.ParseMacros(sys.argv[Start:]) != 0:
@@ -1425,7 +1427,7 @@ def Main(): if not os.path.exists(FvDir):
os.makedirs(FvDir)
- if GenCfgOpt.ParseDscFile(DscFile, FvDir, ConfigDscFile, ExtConfigDscFile) != 0:
+ if GenCfgOpt.ParseDscFile(DscFile, FvDir) != 0:
print "ERROR: %s !" % GenCfgOpt.Error
return 5
|