]>
git.proxmox.com Git - mirror_edk2.git/blob - IntelFsp2Pkg/Tools/GenCfgOpt.py
3 # Copyright (c) 2014 - 2017, Intel Corporation. All rights reserved.<BR>
4 # This program and the accompanying materials are licensed and made available under
5 # the terms and conditions of the BSD License that accompanies this distribution.
6 # The full text of the license may be found at
7 # http://opensource.org/licenses/bsd-license.php.
9 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 from datetime
import date
20 # Generated file copyright header
22 __copyright_txt__
= """## @file
24 # THIS IS AUTO-GENERATED FILE BY BUILD TOOLS AND PLEASE DO NOT MAKE MODIFICATION.
26 # This file lists all VPD informations for a platform collected by build.exe.
28 # Copyright (c) %4d, Intel Corporation. All rights reserved.<BR>
29 # This program and the accompanying materials
30 # are licensed and made available under the terms and conditions of the BSD License
31 # which accompanies this distribution. The full text of the license may be found at
32 # http://opensource.org/licenses/bsd-license.php
34 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
35 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
39 __copyright_bsf__
= """/** @file
41 Boot Setting File for Platform Configuration.
43 Copyright (c) %4d, Intel Corporation. All rights reserved.<BR>
44 This program and the accompanying materials
45 are licensed and made available under the terms and conditions of the BSD License
46 which accompanies this distribution. The full text of the license may be found at
47 http://opensource.org/licenses/bsd-license.php
49 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
50 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
52 This file is automatically generated. Please do NOT modify !!!
58 __copyright_h__
= """/** @file
60 Copyright (c) %4d, Intel Corporation. All rights reserved.<BR>
62 Redistribution and use in source and binary forms, with or without modification,
63 are permitted provided that the following conditions are met:
65 * Redistributions of source code must retain the above copyright notice, this
66 list of conditions and the following disclaimer.
67 * Redistributions in binary form must reproduce the above copyright notice, this
68 list of conditions and the following disclaimer in the documentation and/or
69 other materials provided with the distribution.
70 * Neither the name of Intel Corporation nor the names of its contributors may
71 be used to endorse or promote products derived from this software without
72 specific prior written permission.
74 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
75 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
76 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
77 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
78 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
79 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
80 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
81 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
82 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
83 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
84 THE POSSIBILITY OF SUCH DAMAGE.
86 This file is automatically generated. Please do NOT modify !!!
91 class CLogicalExpression
:
96 def errExit(self
, err
= ''):
97 print "ERROR: Express parsing for:"
98 print " %s" % self
.string
99 print " %s^" % (' ' * self
.index
)
101 print "INFO : %s" % err
104 def getNonNumber (self
, n1
, n2
):
111 def getCurr(self
, lens
= 1):
114 return self
.string
[self
.index
:]
116 if self
.index
+ lens
> len(self
.string
):
117 lens
= len(self
.string
) - self
.index
118 return self
.string
[self
.index
: self
.index
+ lens
]
123 return self
.index
== len(self
.string
)
125 def moveNext(self
, len = 1):
129 while not self
.isLast():
130 if self
.getCurr() in ' \t':
135 def normNumber (self
, val
):
136 return True if val
else False
138 def getNumber(self
, var
):
140 if re
.match('^0x[a-fA-F0-9]+$', var
):
142 elif re
.match('^[+-]?\d+$', var
):
148 def parseValue(self
):
151 while not self
.isLast():
152 char
= self
.getCurr()
153 if re
.match('^[\w.]', char
):
158 val
= self
.getNumber(var
)
165 def parseSingleOp(self
):
167 if re
.match('^NOT\W', self
.getCurr(-1)):
169 op
= self
.parseBrace()
170 val
= self
.getNumber (op
)
172 self
.errExit ("'%s' is not a number" % op
)
173 return "%d" % (not self
.normNumber(int(op
)))
175 return self
.parseValue()
177 def parseBrace(self
):
179 char
= self
.getCurr()
182 value
= self
.parseExpr()
184 if self
.getCurr() != ')':
185 self
.errExit ("Expecting closing brace or operator")
189 value
= self
.parseSingleOp()
192 def parseCompare(self
):
193 value
= self
.parseBrace()
196 char
= self
.getCurr()
197 if char
in ['<', '>']:
199 next
= self
.getCurr()
205 result
= self
.parseBrace()
206 test
= self
.getNonNumber(result
, value
)
208 value
= "%d" % self
.normNumber(eval (value
+ op
+ result
))
210 self
.errExit ("'%s' is not a valid number for comparision" % test
)
211 elif char
in ['=', '!']:
213 if op
in ['==', '!=']:
215 result
= self
.parseBrace()
216 test
= self
.getNonNumber(result
, value
)
218 value
= "%d" % self
.normNumber((eval (value
+ op
+ result
)))
220 value
= "%d" % self
.normNumber(eval ("'" + value
+ "'" + op
+ "'" + result
+ "'"))
228 value
= self
.parseCompare()
231 if re
.match('^AND\W', self
.getCurr(-1)):
233 result
= self
.parseCompare()
234 test
= self
.getNonNumber(result
, value
)
236 value
= "%d" % self
.normNumber(int(value
) & int(result
))
238 self
.errExit ("'%s' is not a valid op number for AND" % test
)
243 def parseOrXor(self
):
244 value
= self
.parseAnd()
249 if re
.match('^XOR\W', self
.getCurr(-1)):
252 elif re
.match('^OR\W', self
.getCurr(-1)):
258 result
= self
.parseAnd()
259 test
= self
.getNonNumber(result
, value
)
261 value
= "%d" % self
.normNumber(eval (value
+ op
+ result
))
263 self
.errExit ("'%s' is not a valid op number for XOR/OR" % test
)
267 return self
.parseOrXor()
270 value
= self
.parseExpr()
272 if not self
.isLast():
273 self
.errExit ("Unexpected character found '%s'" % self
.getCurr())
274 test
= self
.getNumber(value
)
276 self
.errExit ("Result '%s' is not a number" % value
)
279 def evaluateExpress (self
, Expr
):
293 self
._GlobalDataDef
= """
299 self
._BuidinOptionTxt
= """
301 Selection 0x1 , "Enabled"
302 Selection 0x0 , "Disabled"
307 self
._BsfKeyList
= ['FIND','NAME','HELP','TYPE','PAGE','OPTION','ORDER']
308 self
._HdrKeyList
= ['HEADER','STRUCT', 'EMBED', 'COMMENT']
309 self
._BuidinOption
= {'$EN_DIS' : 'EN_DIS'}
313 self
._CfgBlkDict
= {}
314 self
._CfgPageDict
= {}
315 self
._CfgItemList
= []
320 def ParseMacros (self
, MacroDefStr
):
321 # ['-DABC=1', '-D', 'CFG_DEBUG=1', '-D', 'CFG_OUTDIR=Build']
324 for Macro
in MacroDefStr
:
325 if Macro
.startswith('-D'):
333 Match
= re
.match("(\w+)=(.+)", Macro
)
335 self
._MacroDict
[Match
.group(1)] = Match
.group(2)
337 Match
= re
.match("(\w+)", Macro
)
339 self
._MacroDict
[Match
.group(1)] = ''
340 if len(self
._MacroDict
) == 0:
345 print "INFO : Macro dictionary:"
346 for Each
in self
._MacroDict
:
347 print " $(%s) = [ %s ]" % (Each
, self
._MacroDict
[Each
])
350 def EvaulateIfdef (self
, Macro
):
351 Result
= Macro
in self
._MacroDict
353 print "INFO : Eval Ifdef [%s] : %s" % (Macro
, Result
)
356 def ExpandMacros (self
, Input
):
358 Match
= re
.findall("\$\(\w+\)", Input
)
361 Variable
= Each
[2:-1]
362 if Variable
in self
._MacroDict
:
363 Line
= Line
.replace(Each
, self
._MacroDict
[Variable
])
366 print "WARN : %s is not defined" % Each
367 Line
= Line
.replace(Each
, Each
[2:-1])
370 def ExpandPcds (self
, Input
):
372 Match
= re
.findall("(\w+\.\w+)", Input
)
374 for PcdName
in Match
:
375 if PcdName
in self
._PcdsDict
:
376 Line
= Line
.replace(PcdName
, self
._PcdsDict
[PcdName
])
379 print "WARN : %s is not defined" % PcdName
382 def EvaluateExpress (self
, Expr
):
383 ExpExpr
= self
.ExpandPcds(Expr
)
384 ExpExpr
= self
.ExpandMacros(ExpExpr
)
385 LogExpr
= CLogicalExpression()
386 Result
= LogExpr
.evaluateExpress (ExpExpr
)
388 print "INFO : Eval Express [%s] : %s" % (Expr
, Result
)
391 def FormatListValue(self
, ConfigDict
):
392 Struct
= ConfigDict
['struct']
393 if Struct
not in ['UINT8','UINT16','UINT32','UINT64']:
397 binlist
= ConfigDict
['value'][1:-1].split(',')
400 if each
.startswith('0x'):
401 value
= int(each
, 16)
404 dataarray
.append(value
)
406 unit
= int(Struct
[4:]) / 8
407 if int(ConfigDict
['length']) != unit
* len(dataarray
):
408 raise Exception("Array size is not proper for '%s' !" % ConfigDict
['cname'])
411 for each
in dataarray
:
413 for loop
in xrange(unit
):
414 bytearray
.append("0x%02X" % (value
& 0xFF))
416 newvalue
= '{' + ','.join(bytearray
) + '}'
417 ConfigDict
['value'] = newvalue
420 def ParseDscFile (self
, DscFile
, FvDir
):
421 self
._CfgItemList
= []
422 self
._CfgPageDict
= {}
423 self
._CfgBlkDict
= {}
424 self
._DscFile
= DscFile
437 DscFd
= open(DscFile
, "r")
438 DscLines
= DscFd
.readlines()
442 DscLine
= DscLines
.pop(0).strip()
444 Match
= re
.match("^\[(.+)\]", DscLine
)
445 if Match
is not None:
450 if Match
.group(1).lower() == "Defines".lower():
452 if Match
.group(1).lower() == "PcdsFeatureFlag".lower():
454 elif Match
.group(1).lower() == "PcdsDynamicVpd.Upd".lower():
456 ConfigDict
['header'] = 'ON'
457 ConfigDict
['region'] = 'UPD'
458 ConfigDict
['order'] = -1
459 ConfigDict
['page'] = ''
460 ConfigDict
['name'] = ''
461 ConfigDict
['find'] = ''
462 ConfigDict
['struct'] = ''
463 ConfigDict
['embed'] = ''
464 ConfigDict
['comment'] = ''
465 ConfigDict
['subreg'] = []
468 if IsDefSect
or IsPcdSect
or IsUpdSect
or IsVpdSect
:
469 if re
.match("^!else($|\s+#.+)", DscLine
):
471 IfStack
[-1] = not IfStack
[-1]
473 print("ERROR: No paired '!if' found for '!else' for line '%s'" % DscLine
)
475 elif re
.match("^!endif($|\s+#.+)", DscLine
):
478 Level
= ElifStack
.pop()
482 print("ERROR: No paired '!if' found for '!endif' for line '%s'" % DscLine
)
486 Match
= re
.match("!(ifdef|ifndef)\s+(.+)", DscLine
)
488 Result
= self
.EvaulateIfdef (Match
.group(2))
489 if Match
.group(1) == 'ifndef':
491 IfStack
.append(Result
)
494 Match
= re
.match("!(if|elseif)\s+(.+)", DscLine
)
496 Result
= self
.EvaluateExpress(Match
.group(2))
497 if Match
.group(1) == "if":
499 IfStack
.append(Result
)
502 IfStack
[-1] = not IfStack
[-1]
503 IfStack
.append(Result
)
504 ElifStack
[-1] = ElifStack
[-1] + 1
506 print("ERROR: No paired '!if' found for '!elif' for line '%s'" % DscLine
)
510 Handle
= reduce(lambda x
,y
: x
and y
, IfStack
)
514 Match
= re
.match("!include\s+(.+)", DscLine
)
516 IncludeFilePath
= Match
.group(1)
517 IncludeFilePath
= self
.ExpandMacros(IncludeFilePath
)
518 PackagesPath
= os
.getenv("PACKAGES_PATH")
520 for PackagePath
in PackagesPath
.split(os
.pathsep
):
521 IncludeFilePathAbs
= os
.path
.join(os
.path
.normpath(PackagePath
), os
.path
.normpath(IncludeFilePath
))
522 if os
.path
.exists(IncludeFilePathAbs
):
523 IncludeDsc
= open(IncludeFilePathAbs
, "r")
526 IncludeDsc
= open(IncludeFilePath
, "r")
527 if IncludeDsc
== None:
528 print("ERROR: Cannot open file '%s'" % IncludeFilePath
)
530 NewDscLines
= IncludeDsc
.readlines()
532 DscLines
= NewDscLines
+ DscLines
534 if DscLine
.startswith('!'):
535 print("ERROR: Unrecoginized directive for line '%s'" % DscLine
)
541 #DEFINE UPD_TOOL_GUID = 8C3D856A-9BE6-468E-850A-24F7A8D38E09
542 #DEFINE FSP_T_UPD_TOOL_GUID = 34686CA3-34F9-4901-B82A-BA630F0714C6
543 #DEFINE FSP_M_UPD_TOOL_GUID = 39A250DB-E465-4DD1-A2AC-E2BD3C0E2385
544 #DEFINE FSP_S_UPD_TOOL_GUID = CAE3605B-5B34-4C85-B3D7-27D54273C40F
545 Match
= re
.match("^\s*(?:DEFINE\s+)*(\w+)\s*=\s*([-.\w]+)", DscLine
)
547 self
._MacroDict
[Match
.group(1)] = Match
.group(2)
549 print "INFO : DEFINE %s = [ %s ]" % (Match
.group(1), Match
.group(2))
551 #gSiPkgTokenSpaceGuid.PcdTxtEnable|FALSE
552 #gSiPkgTokenSpaceGuid.PcdOverclockEnable|TRUE
553 Match
= re
.match("^\s*([\w\.]+)\s*\|\s*(\w+)", DscLine
)
555 self
._PcdsDict
[Match
.group(1)] = Match
.group(2)
557 print "INFO : PCD %s = [ %s ]" % (Match
.group(1), Match
.group(2))
559 Match
= re
.match("^\s*#\s+(!BSF|@Bsf|!HDR)\s+(.+)", DscLine
)
561 Remaining
= Match
.group(2)
562 if Match
.group(1) == '!BSF' or Match
.group(1) == '@Bsf':
563 Match
= re
.match("(?:^|.+\s+)PAGES:{(.+?)}", Remaining
)
565 # !BSF PAGES:{HSW:"Haswell System Agent", LPT:"Lynx Point PCH"}
566 PageList
= Match
.group(1).split(',')
567 for Page
in PageList
:
569 Match
= re
.match("(\w+):\"(.+)\"", Page
)
570 self
._CfgPageDict
[Match
.group(1)] = Match
.group(2)
572 Match
= re
.match("(?:^|.+\s+)BLOCK:{NAME:\"(.+)\"\s*,\s*VER:\"(.+)\"\s*}", Remaining
)
574 self
._CfgBlkDict
['name'] = Match
.group(1)
575 self
._CfgBlkDict
['ver'] = Match
.group(2)
577 for Key
in self
._BsfKeyList
:
578 Match
= re
.match("(?:^|.+\s+)%s:{(.+?)}" % Key
, Remaining
)
580 if Key
in ['NAME', 'HELP', 'OPTION'] and Match
.group(1).startswith('+'):
581 ConfigDict
[Key
.lower()] += Match
.group(1)[1:]
583 ConfigDict
[Key
.lower()] = Match
.group(1)
585 for Key
in self
._HdrKeyList
:
586 Match
= re
.match("(?:^|.+\s+)%s:{(.+?)}" % Key
, Remaining
)
588 ConfigDict
[Key
.lower()] = Match
.group(1)
590 Match
= re
.match("^\s*#\s+@Prompt\s+(.+)", DscLine
)
592 ConfigDict
['name'] = Match
.group(1)
594 Match
= re
.match("^\s*#\s*@ValidList\s*(.+)\s*\|\s*(.+)\s*\|\s*(.+)\s*", DscLine
)
596 if Match
.group(2).strip() in self
._BuidinOption
:
597 ConfigDict
['option'] = Match
.group(2).strip()
599 OptionValueList
= Match
.group(2).split(',')
600 OptionStringList
= Match
.group(3).split(',')
602 for Option
in OptionValueList
:
603 Option
= Option
.strip()
604 ConfigDict
['option'] = ConfigDict
['option'] + str(Option
) + ':' + OptionStringList
[Index
].strip()
606 if Index
in range(len(OptionValueList
)):
607 ConfigDict
['option'] += ', '
608 ConfigDict
['type'] = "Combo"
610 Match
= re
.match("^\s*#\s*@ValidRange\s*(.+)\s*\|\s*(.+)\s*-\s*(.+)\s*", DscLine
)
612 if "0x" in Match
.group(2) or "0x" in Match
.group(3):
613 ConfigDict
['type'] = "EditNum, HEX, (%s,%s)" % (Match
.group(2), Match
.group(3))
615 ConfigDict
['type'] = "EditNum, DEC, (%s,%s)" % (Match
.group(2), Match
.group(3))
617 Match
= re
.match("^\s*##\s+(.+)", DscLine
)
619 ConfigDict
['help'] = Match
.group(1)
623 Match
= re
.match("^([_a-zA-Z0-9]+).([_a-zA-Z0-9]+)\s*\|\s*(0x[0-9A-F]+)\s*\|\s*(\d+|0x[0-9a-fA-F]+)\s*\|\s*(.+)",DscLine
)
625 Match
= re
.match("^([_a-zA-Z0-9]+).([_a-zA-Z0-9]+)\s*\|\s*(0x[0-9A-F]+)(?:\s*\|\s*(.+))?", DscLine
)
627 ConfigDict
['space'] = Match
.group(1)
628 ConfigDict
['cname'] = Match
.group(2)
629 ConfigDict
['offset'] = int (Match
.group(3), 16)
630 if ConfigDict
['order'] == -1:
631 ConfigDict
['order'] = ConfigDict
['offset'] << 8
633 (Major
, Minor
) = ConfigDict
['order'].split('.')
634 ConfigDict
['order'] = (int (Major
, 16) << 8 ) + int (Minor
, 16)
636 Value
= Match
.group(5).strip()
637 if Match
.group(4).startswith("0x"):
638 Length
= int (Match
.group(4), 16)
640 Length
= int (Match
.group(4))
642 Value
= Match
.group(4)
645 Value
= Value
.strip()
647 Match
= re
.match("^.+\s*\|\s*(.+)", Value
)
649 Value
= Match
.group(1)
652 ConfigDict
['length'] = Length
653 Match
= re
.match("\$\((\w+)\)", Value
)
655 if Match
.group(1) in self
._MacroDict
:
656 Value
= self
._MacroDict
[Match
.group(1)]
658 ConfigDict
['value'] = Value
659 if (len(Value
) > 0) and (Value
[0] == '{'):
660 Value
= self
.FormatListValue(ConfigDict
)
662 if ConfigDict
['name'] == '':
663 # Clear BSF specific items
664 ConfigDict
['bsfname'] = ''
665 ConfigDict
['help'] = ''
666 ConfigDict
['type'] = ''
667 ConfigDict
['option'] = ''
669 self
._CfgItemList
.append(ConfigDict
.copy())
670 ConfigDict
['name'] = ''
671 ConfigDict
['find'] = ''
672 ConfigDict
['struct'] = ''
673 ConfigDict
['embed'] = ''
674 ConfigDict
['comment'] = ''
675 ConfigDict
['order'] = -1
676 ConfigDict
['subreg'] = []
677 ConfigDict
['option'] = ''
679 # It could be a virtual item as below
680 # !BSF FIELD:{SerialDebugPortAddress0:1}
682 # @Bsf FIELD:{SerialDebugPortAddress0:1b}
683 Match
= re
.match("^\s*#\s+(!BSF|@Bsf)\s+FIELD:{(.+):(\d+)([Bb])?}", DscLine
)
685 SubCfgDict
= ConfigDict
.copy()
686 if (Match
.group(4) == None) or (Match
.group(4) == 'B'):
688 elif Match
.group(4) == 'b':
691 print("ERROR: Invalide BSF FIELD length for line '%s'" % DscLine
)
693 SubCfgDict
['cname'] = Match
.group(2)
694 SubCfgDict
['bitlength'] = int (Match
.group(3)) * UnitBitLen
695 if SubCfgDict
['bitlength'] > 0:
696 LastItem
= self
._CfgItemList
[-1]
697 if len(LastItem
['subreg']) == 0:
700 SubOffset
= LastItem
['subreg'][-1]['bitoffset'] + LastItem
['subreg'][-1]['bitlength']
701 SubCfgDict
['bitoffset'] = SubOffset
702 LastItem
['subreg'].append (SubCfgDict
.copy())
703 ConfigDict
['name'] = ''
706 def GetBsfBitFields (self
, subitem
, bytes
):
707 start
= subitem
['bitoffset']
708 end
= start
+ subitem
['bitlength']
709 bitsvalue
= ''.join('{0:08b}'.format(i
) for i
in bytes
[::-1])
710 bitsvalue
= bitsvalue
[::-1]
711 bitslen
= len(bitsvalue
)
712 if start
> bitslen
or end
> bitslen
:
713 print "Invalid bits offset [%d,%d] for %s" % (start
, end
, subitem
['name'])
715 return hex(int(bitsvalue
[start
:end
][::-1], 2))
717 def UpdateSubRegionDefaultValue (self
):
719 for Item
in self
._CfgItemList
:
720 if len(Item
['subreg']) == 0:
723 if Item
['value'][0] == '{':
724 binlist
= Item
['value'][1:-1].split(',')
727 if each
.startswith('0x'):
728 value
= int(each
, 16)
731 bytearray
.append(value
)
733 if Item
['value'].startswith('0x'):
734 value
= int(Item
['value'], 16)
736 value
= int(Item
['value'])
738 while idx
< Item
['length']:
739 bytearray
.append(value
& 0xFF)
742 for SubItem
in Item
['subreg']:
743 valuestr
= self
.GetBsfBitFields(SubItem
, bytearray
)
744 SubItem
['value'] = valuestr
747 def CreateSplitUpdTxt (self
, UpdTxtFile
):
748 GuidList
= ['FSP_T_UPD_TOOL_GUID','FSP_M_UPD_TOOL_GUID','FSP_S_UPD_TOOL_GUID']
749 SignatureList
= ['0x545F', '0x4D5F','0x535F'] # _T, _M, and _S signature for FSPT, FSPM, FSPS
750 for Index
in range(len(GuidList
)):
753 if GuidList
[Index
] not in self
._MacroDict
:
754 self
.Error
= "%s definition is missing in DSC file" % (GuidList
[Index
])
758 UpdTxtFile
= os
.path
.join(FvDir
, self
._MacroDict
[GuidList
[Index
]] + '.txt')
761 if not os
.path
.exists(UpdTxtFile
):
764 DscTime
= os
.path
.getmtime(self
._DscFile
)
765 TxtTime
= os
.path
.getmtime(UpdTxtFile
)
766 if DscTime
> TxtTime
:
770 # DSC has not been modified yet
771 # So don't have to re-generate other files
772 self
.Error
= 'No DSC file change, skip to create UPD TXT file'
775 TxtFd
= open(UpdTxtFile
, "w")
776 TxtFd
.write("%s\n" % (__copyright_txt__
% date
.today().year
))
784 for Item
in self
._CfgItemList
:
785 if Item
['cname'] == 'Signature' and str(Item
['value'])[0:6] == SignatureList
[Index
]:
786 StartAddr
= Item
['offset']
787 NextOffset
= StartAddr
789 if Item
['cname'] == 'UpdTerminator' and InRange
== True:
790 EndAddr
= Item
['offset']
793 for Item
in self
._CfgItemList
:
794 if Item
['cname'] == 'Signature' and str(Item
['value'])[0:6] == SignatureList
[Index
]:
798 if Item
['cname'] == 'UpdTerminator':
800 if Item
['region'] != 'UPD':
802 Offset
= Item
['offset']
803 if StartAddr
> Offset
or EndAddr
< Offset
:
805 if NextOffset
< Offset
:
807 TxtFd
.write("%s.UnusedUpdSpace%d|%s0x%04X|0x%04X|{0}\n" % (Item
['space'], SpaceIdx
, Default
, NextOffset
- StartAddr
, Offset
- NextOffset
))
808 SpaceIdx
= SpaceIdx
+ 1
809 NextOffset
= Offset
+ Item
['length']
810 TxtFd
.write("%s.%s|%s0x%04X|%s|%s\n" % (Item
['space'],Item
['cname'],Default
,Item
['offset'] - StartAddr
,Item
['length'],Item
['value']))
814 def ProcessMultilines (self
, String
, MaxCharLength
):
816 StringLength
= len(String
)
817 CurrentStringStart
= 0
820 if len(String
) <= MaxCharLength
:
821 while (StringOffset
< StringLength
):
822 if StringOffset
>= 1:
823 if String
[StringOffset
- 1] == '\\' and String
[StringOffset
] == 'n':
824 BreakLineDict
.append (StringOffset
+ 1)
826 if BreakLineDict
!= []:
827 for Each
in BreakLineDict
:
828 Multilines
+= " %s\n" % String
[CurrentStringStart
:Each
].lstrip()
829 CurrentStringStart
= Each
830 if StringLength
- CurrentStringStart
> 0:
831 Multilines
+= " %s\n" % String
[CurrentStringStart
:].lstrip()
833 Multilines
= " %s\n" % String
837 FoundSpaceChar
= False
838 while (StringOffset
< StringLength
):
839 if StringOffset
>= 1:
840 if NewLineCount
>= MaxCharLength
- 1:
841 if String
[StringOffset
] == ' ' and StringLength
- StringOffset
> 10:
842 BreakLineDict
.append (NewLineStart
+ NewLineCount
)
843 NewLineStart
= NewLineStart
+ NewLineCount
845 FoundSpaceChar
= True
846 elif StringOffset
== StringLength
- 1 and FoundSpaceChar
== False:
847 BreakLineDict
.append (0)
848 if String
[StringOffset
- 1] == '\\' and String
[StringOffset
] == 'n':
849 BreakLineDict
.append (StringOffset
+ 1)
850 NewLineStart
= StringOffset
+ 1
854 if BreakLineDict
!= []:
855 BreakLineDict
.sort ()
856 for Each
in BreakLineDict
:
858 Multilines
+= " %s\n" % String
[CurrentStringStart
:Each
].lstrip()
859 CurrentStringStart
= Each
860 if StringLength
- CurrentStringStart
> 0:
861 Multilines
+= " %s\n" % String
[CurrentStringStart
:].lstrip()
864 def CreateField (self
, Item
, Name
, Length
, Offset
, Struct
, BsfName
, Help
, Option
):
872 if Length
in [1,2,4,8]:
873 Type
= "UINT%d" % (Length
* 8)
874 if Name
.startswith("UnusedUpdSpace") and Length
!= 1:
881 if Item
and Item
['value'].startswith('{'):
887 if Struct
in ['UINT8','UINT16','UINT32','UINT64']:
889 Unit
= int(Type
[4:]) / 8
890 Length
= Length
/ Unit
895 Name
= Name
+ '[%d]' % Length
897 if len(Type
) < PosName
:
898 Space1
= PosName
- len(Type
)
903 NameLine
=" - %s\n" % BsfName
908 HelpLine
= self
.ProcessMultilines (Help
, 80)
911 OptionLine
= self
.ProcessMultilines (Option
, 80)
916 OffsetStr
= '0x%04X' % Offset
918 return "\n/** Offset %s%s%s%s**/\n %s%s%s;\n" % (OffsetStr
, NameLine
, HelpLine
, OptionLine
, Type
, ' ' * Space1
, Name
,)
920 def PostProcessBody (self
, TextBody
):
926 IsUpdHdrDefined
= False
928 for Line
in TextBody
:
929 SplitToLines
= Line
.splitlines()
930 MatchComment
= re
.match("^/\*\sCOMMENT:(\w+):([\w|\W|\s]+)\s\*/\s([\s\S]*)", SplitToLines
[0])
932 if MatchComment
.group(1) == 'FSP_UPD_HEADER':
936 if IsUpdHdrDefined
!= True or IsUpdHeader
!= True:
937 CommentLine
= " " + MatchComment
.group(2) + "\n"
938 NewTextBody
.append("/**" + CommentLine
+ "**/\n")
939 Line
= Line
[(len(SplitToLines
[0]) + 1):]
941 Match
= re
.match("^/\*\sEMBED_STRUCT:(\w+):(\w+):(START|END)\s\*/\s([\s\S]*)", Line
)
943 Line
= Match
.group(4)
944 if Match
.group(1) == 'FSP_UPD_HEADER':
949 if Match
and Match
.group(3) == 'START':
950 if IsUpdHdrDefined
!= True or IsUpdHeader
!= True:
951 NewTextBody
.append ('typedef struct {\n')
952 StructName
= Match
.group(1)
953 VariableName
= Match
.group(2)
954 MatchOffset
= re
.search('/\*\*\sOffset\s0x([a-fA-F0-9]+)', Line
)
956 Offset
= int(MatchOffset
.group(1), 16)
961 OldTextBody
.append (self
.CreateField (None, VariableName
, 0, Offset
, StructName
, '', '', ''))
963 if IsUpdHdrDefined
!= True or IsUpdHeader
!= True:
964 NewTextBody
.append (Line
)
966 OldTextBody
.append (Line
)
968 if Match
and Match
.group(3) == 'END':
969 if (StructName
!= Match
.group(1)) or (VariableName
!= Match
.group(2)):
970 print "Unmatched struct name '%s' and '%s' !" % (StructName
, Match
.group(1))
972 if IsUpdHdrDefined
!= True or IsUpdHeader
!= True:
973 NewTextBody
.append ('} %s;\n\n' % StructName
)
974 IsUpdHdrDefined
= True
976 NewTextBody
.extend(OldTextBody
)
979 def CreateHeaderFile (self
, InputHeaderFile
):
982 HeaderFileName
= 'FspUpd.h'
983 HeaderFile
= os
.path
.join(FvDir
, HeaderFileName
)
985 # Check if header needs to be recreated
989 for Item
in self
._CfgItemList
:
990 if str(Item
['cname']) == 'Signature' and Item
['length'] == 8:
991 Value
= int(Item
['value'], 16)
994 Chars
.append(chr(Value
& 0xFF))
996 SignatureStr
= ''.join(Chars
)
997 # Signature will be _T / _M / _S for FSPT / FSPM / FSPS accordingly
998 if '_T' in SignatureStr
[6:6+2]:
999 TxtBody
.append("#define FSPT_UPD_SIGNATURE %s /* '%s' */\n\n" % (Item
['value'], SignatureStr
))
1000 elif '_M' in SignatureStr
[6:6+2]:
1001 TxtBody
.append("#define FSPM_UPD_SIGNATURE %s /* '%s' */\n\n" % (Item
['value'], SignatureStr
))
1002 elif '_S' in SignatureStr
[6:6+2]:
1003 TxtBody
.append("#define FSPS_UPD_SIGNATURE %s /* '%s' */\n\n" % (Item
['value'], SignatureStr
))
1004 TxtBody
.append("\n")
1006 for Region
in ['UPD']:
1008 UpdSignature
= ['0x545F', '0x4D5F', '0x535F'] #['_T', '_M', '_S'] signature for FSPT, FSPM, FSPS
1009 UpdStructure
= ['FSPT_UPD', 'FSPM_UPD', 'FSPS_UPD']
1010 for Item
in self
._CfgItemList
:
1011 if Item
["cname"] == 'Signature' and Item
["value"][0:6] in UpdSignature
:
1012 UpdOffsetTable
.append (Item
["offset"])
1014 for UpdIdx
in range(len(UpdOffsetTable
)):
1016 for Item
in self
._CfgItemList
:
1017 if Item
["comment"] != '' and Item
["offset"] >= UpdOffsetTable
[UpdIdx
]:
1018 MatchComment
= re
.match("^(U|V)PD_DATA_REGION:([\w|\W|\s]+)", Item
["comment"])
1019 if MatchComment
and MatchComment
.group(1) == Region
[0]:
1020 CommentLine
= " " + MatchComment
.group(2) + "\n"
1021 TxtBody
.append("/**" + CommentLine
+ "**/\n")
1022 elif Item
["offset"] >= UpdOffsetTable
[UpdIdx
] and Item
["comment"] == '':
1023 Match
= re
.match("^FSP([\w|\W|\s])_UPD", UpdStructure
[UpdIdx
])
1025 TxtBody
.append("/** Fsp " + Match
.group(1) + " UPD Configuration\n**/\n")
1026 TxtBody
.append("typedef struct {\n")
1036 for Item
in self
._CfgItemList
:
1037 if Item
['cname'] == 'Signature' and str(Item
['value'])[0:6] == UpdSignature
[UpdIdx
] or Region
[0] == 'V':
1041 if Item
['cname'] == 'UpdTerminator':
1044 if Item
['region'] != Region
:
1047 if Item
["offset"] < UpdOffsetTable
[UpdIdx
]:
1050 NextVisible
= LastVisible
1052 if LastVisible
and (Item
['header'] == 'OFF'):
1054 ResvOffset
= Item
['offset']
1055 elif (not LastVisible
) and Item
['header'] == 'ON':
1057 Name
= "Reserved" + Region
[0] + "pdSpace%d" % ResvIdx
1058 ResvIdx
= ResvIdx
+ 1
1059 TxtBody
.append(self
.CreateField (Item
, Name
, Item
["offset"] - ResvOffset
, ResvOffset
, '', '', '', ''))
1061 if Offset
< Item
["offset"]:
1063 Name
= "Unused" + Region
[0] + "pdSpace%d" % SpaceIdx
1064 LineBuffer
.append(self
.CreateField (Item
, Name
, Item
["offset"] - Offset
, Offset
, '', '', '', ''))
1065 SpaceIdx
= SpaceIdx
+ 1
1066 Offset
= Item
["offset"]
1068 LastVisible
= NextVisible
1070 Offset
= Offset
+ Item
["length"]
1072 for Each
in LineBuffer
:
1073 TxtBody
.append (Each
)
1075 Comment
= Item
["comment"]
1076 Embed
= Item
["embed"].upper()
1077 if Embed
.endswith(':START') or Embed
.endswith(':END'):
1078 if not Comment
== '' and Embed
.endswith(':START'):
1079 Marker
= '/* COMMENT:%s */ \n' % Item
["comment"]
1080 Marker
= Marker
+ '/* EMBED_STRUCT:%s */ ' % Item
["embed"]
1082 Marker
= '/* EMBED_STRUCT:%s */ ' % Item
["embed"]
1087 self
.Error
= "Invalid embedded structure format '%s'!\n" % Item
["embed"]
1089 Line
= Marker
+ self
.CreateField (Item
, Item
["cname"], Item
["length"], Item
["offset"], Item
['struct'], Item
['name'], Item
['help'], Item
['option'])
1090 TxtBody
.append(Line
)
1091 if Item
['cname'] == 'UpdTerminator':
1093 TxtBody
.append("} " + UpdStructure
[UpdIdx
] + ";\n\n")
1095 # Handle the embedded data structure
1096 TxtBody
= self
.PostProcessBody (TxtBody
)
1098 HeaderTFileName
= 'FsptUpd.h'
1099 HeaderMFileName
= 'FspmUpd.h'
1100 HeaderSFileName
= 'FspsUpd.h'
1102 UpdRegionCheck
= ['FSPT', 'FSPM', 'FSPS'] # FSPX_UPD_REGION
1103 UpdConfigCheck
= ['FSP_T', 'FSP_M', 'FSP_S'] # FSP_X_CONFIG, FSP_X_TEST_CONFIG, FSP_X_RESTRICTED_CONFIG
1104 UpdSignatureCheck
= ['FSPT_UPD_SIGNATURE', 'FSPM_UPD_SIGNATURE', 'FSPS_UPD_SIGNATURE']
1105 ExcludedSpecificUpd
= 'FSPM_ARCH_UPD'
1107 if InputHeaderFile
!= '':
1108 if not os
.path
.exists(InputHeaderFile
):
1109 self
.Error
= "Input header file '%s' does not exist" % InputHeaderFile
1112 InFd
= open(InputHeaderFile
, "r")
1113 IncLines
= InFd
.readlines()
1116 for item
in range(len(UpdRegionCheck
)):
1117 if UpdRegionCheck
[item
] == 'FSPT':
1118 HeaderFd
= open(os
.path
.join(FvDir
, HeaderTFileName
), "w")
1119 FileBase
= os
.path
.basename(os
.path
.join(FvDir
, HeaderTFileName
))
1120 elif UpdRegionCheck
[item
] == 'FSPM':
1121 HeaderFd
= open(os
.path
.join(FvDir
, HeaderMFileName
), "w")
1122 FileBase
= os
.path
.basename(os
.path
.join(FvDir
, HeaderMFileName
))
1123 elif UpdRegionCheck
[item
] == 'FSPS':
1124 HeaderFd
= open(os
.path
.join(FvDir
, HeaderSFileName
), "w")
1125 FileBase
= os
.path
.basename(os
.path
.join(FvDir
, HeaderSFileName
))
1126 FileName
= FileBase
.replace(".", "_").upper()
1127 HeaderFd
.write("%s\n" % (__copyright_h__
% date
.today().year
))
1128 HeaderFd
.write("#ifndef __%s__\n" % FileName
)
1129 HeaderFd
.write("#define __%s__\n\n" % FileName
)
1130 HeaderFd
.write("#include <%s>\n\n" % HeaderFileName
)
1131 HeaderFd
.write("#pragma pack(1)\n\n")
1134 for Line
in IncLines
:
1135 Match
= re
.search ("!EXPORT\s+([A-Z]+)\s+EXTERNAL_BOOTLOADER_STRUCT_(BEGIN|END)\s+", Line
)
1137 if Match
.group(2) == "BEGIN" and Match
.group(1) == UpdRegionCheck
[item
]:
1144 HeaderFd
.write(Line
)
1145 HeaderFd
.write("\n")
1151 StructStartWithComment
= []
1153 for Line
in TxtBody
:
1155 Match
= re
.match("(typedef struct {)", Line
)
1157 StartIndex
= Index
- 1
1158 Match
= re
.match("}\s([_A-Z0-9]+);", Line
)
1159 if Match
and (UpdRegionCheck
[item
] in Match
.group(1) or UpdConfigCheck
[item
] in Match
.group(1)) and (ExcludedSpecificUpd
not in Match
.group(1)):
1161 StructStart
.append(StartIndex
)
1162 StructEnd
.append(EndIndex
)
1164 for Line
in TxtBody
:
1166 for Item
in range(len(StructStart
)):
1167 if Index
== StructStart
[Item
]:
1168 Match
= re
.match("^(/\*\*\s*)", Line
)
1170 StructStartWithComment
.append(StructStart
[Item
])
1172 StructStartWithComment
.append(StructStart
[Item
] + 1)
1174 for Line
in TxtBody
:
1176 for Item
in range(len(StructStart
)):
1177 if Index
>= StructStartWithComment
[Item
] and Index
<= StructEnd
[Item
]:
1178 HeaderFd
.write (Line
)
1179 HeaderFd
.write("#pragma pack()\n\n")
1180 HeaderFd
.write("#endif\n")
1183 HeaderFd
= open(HeaderFile
, "w")
1184 FileBase
= os
.path
.basename(HeaderFile
)
1185 FileName
= FileBase
.replace(".", "_").upper()
1186 HeaderFd
.write("%s\n" % (__copyright_h__
% date
.today().year
))
1187 HeaderFd
.write("#ifndef __%s__\n" % FileName
)
1188 HeaderFd
.write("#define __%s__\n\n" % FileName
)
1189 HeaderFd
.write("#include <FspEas.h>\n\n")
1190 HeaderFd
.write("#pragma pack(1)\n\n")
1192 for item
in range(len(UpdRegionCheck
)):
1197 StructStartWithComment
= []
1199 for Line
in TxtBody
:
1201 Match
= re
.match("(typedef struct {)", Line
)
1203 StartIndex
= Index
- 1
1204 Match
= re
.match("#define\s([_A-Z0-9]+)\s*", Line
)
1205 if Match
and (UpdSignatureCheck
[item
] in Match
.group(1) or UpdSignatureCheck
[item
] in Match
.group(1)):
1206 StructStart
.append(Index
- 1)
1207 StructEnd
.append(Index
)
1209 for Line
in TxtBody
:
1211 for Item
in range(len(StructStart
)):
1212 if Index
== StructStart
[Item
]:
1213 Match
= re
.match("^(/\*\*\s*)", Line
)
1215 StructStartWithComment
.append(StructStart
[Item
])
1217 StructStartWithComment
.append(StructStart
[Item
] + 1)
1219 for Line
in TxtBody
:
1221 for Item
in range(len(StructStart
)):
1222 if Index
>= StructStartWithComment
[Item
] and Index
<= StructEnd
[Item
]:
1223 HeaderFd
.write (Line
)
1224 HeaderFd
.write("#pragma pack()\n\n")
1225 HeaderFd
.write("#endif\n")
1230 def WriteBsfStruct (self
, BsfFd
, Item
):
1231 LogExpr
= CLogicalExpression()
1232 if Item
['type'] == "None":
1233 Space
= "gPlatformFspPkgTokenSpaceGuid"
1235 Space
= Item
['space']
1236 Line
= " $%s_%s" % (Space
, Item
['cname'])
1237 Match
= re
.match("\s*\{([x0-9a-fA-F,\s]+)\}\s*", Item
['value'])
1239 DefaultValue
= Match
.group(1).strip()
1241 DefaultValue
= Item
['value'].strip()
1242 if 'bitlength' in Item
:
1243 BsfFd
.write(" %s%s%4d bits $_DEFAULT_ = %s\n" % (Line
, ' ' * (64 - len(Line
)), Item
['bitlength'], DefaultValue
))
1245 BsfFd
.write(" %s%s%4d bytes $_DEFAULT_ = %s\n" % (Line
, ' ' * (64 - len(Line
)), Item
['length'], DefaultValue
))
1247 if Item
['type'] == "Combo":
1248 if not Item
['option'] in self
._BuidinOption
:
1249 OptList
= Item
['option'].split(',')
1250 for Option
in OptList
:
1251 Option
= Option
.strip()
1252 (OpVal
, OpStr
) = Option
.split(':')
1253 test
= LogExpr
.getNumber (OpVal
)
1255 raise Exception("Selection Index '%s' is not a number" % OpVal
)
1256 TmpList
.append((OpVal
, OpStr
))
1259 def WriteBsfOption (self
, BsfFd
, Item
):
1260 PcdName
= Item
['space'] + '_' + Item
['cname']
1262 if Item
['type'] == "Combo":
1263 if Item
['option'] in self
._BuidinOption
:
1264 Options
= self
._BuidinOption
[Item
['option']]
1267 BsfFd
.write(' %s $%s, "%s", &%s,\n' % (Item
['type'], PcdName
, Item
['name'], Options
))
1269 elif Item
['type'].startswith("EditNum"):
1270 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'])
1272 BsfFd
.write(' EditNum $%s, "%s", %s,\n' % (PcdName
, Item
['name'], Match
.group(1)))
1274 elif Item
['type'].startswith("EditText"):
1275 BsfFd
.write(' %s $%s, "%s",\n' % (Item
['type'], PcdName
, Item
['name']))
1277 elif Item
['type'] == "Table":
1278 Columns
= Item
['option'].split(',')
1279 if len(Columns
) != 0:
1280 BsfFd
.write(' %s $%s "%s",' % (Item
['type'], PcdName
, Item
['name']))
1282 Fmt
= Col
.split(':')
1284 raise Exception("Column format '%s' is invalid !" % Fmt
)
1286 Dtype
= int(Fmt
[1].strip())
1288 raise Exception("Column size '%s' is invalid !" % Fmt
[1])
1289 BsfFd
.write('\n Column "%s", %d bytes, %s' % (Fmt
[0].strip(), Dtype
, Fmt
[2].strip()))
1294 HelpLines
= Item
['help'].split('\\n\\r')
1296 for HelpLine
in HelpLines
:
1299 BsfFd
.write(' Help "%s"\n' % (HelpLine
))
1301 BsfFd
.write(' "%s"\n' % (HelpLine
))
1303 BsfFd
.write(' "Valid range: %s ~ %s"\n' % (Match
.group(2), Match
.group(3)))
1305 def GenerateBsfFile (self
, BsfFile
):
1308 self
.Error
= "BSF output file '%s' is invalid" % BsfFile
1313 BsfFd
= open(BsfFile
, "w")
1314 BsfFd
.write("%s\n" % (__copyright_bsf__
% date
.today().year
))
1315 BsfFd
.write("%s\n" % self
._GlobalDataDef
)
1316 BsfFd
.write("StructDef\n")
1318 for Item
in self
._CfgItemList
:
1319 if Item
['find'] != '':
1320 BsfFd
.write('\n Find "%s"\n' % Item
['find'])
1321 NextOffset
= Item
['offset'] + Item
['length']
1322 if Item
['name'] != '':
1323 if NextOffset
!= Item
['offset']:
1324 BsfFd
.write(" Skip %d bytes\n" % (Item
['offset'] - NextOffset
))
1325 if len(Item
['subreg']) > 0:
1326 NextOffset
= Item
['offset']
1327 BitsOffset
= NextOffset
* 8
1328 for SubItem
in Item
['subreg']:
1329 BitsOffset
+= SubItem
['bitlength']
1330 if SubItem
['name'] == '':
1331 if 'bitlength' in SubItem
:
1332 BsfFd
.write(" Skip %d bits\n" % (SubItem
['bitlength']))
1334 BsfFd
.write(" Skip %d bytes\n" % (SubItem
['length']))
1336 Options
= self
.WriteBsfStruct(BsfFd
, SubItem
)
1337 if len(Options
) > 0:
1338 OptionDict
[SubItem
['space']+'_'+SubItem
['cname']] = Options
1340 NextBitsOffset
= (Item
['offset'] + Item
['length']) * 8
1341 if NextBitsOffset
> BitsOffset
:
1342 BitsGap
= NextBitsOffset
- BitsOffset
1343 BitsRemain
= BitsGap
% 8
1345 BsfFd
.write(" Skip %d bits\n" % BitsRemain
)
1346 BitsGap
-= BitsRemain
1347 BytesRemain
= BitsGap
/ 8
1349 BsfFd
.write(" Skip %d bytes\n" % BytesRemain
)
1350 NextOffset
= Item
['offset'] + Item
['length']
1352 NextOffset
= Item
['offset'] + Item
['length']
1353 Options
= self
.WriteBsfStruct(BsfFd
, Item
)
1354 if len(Options
) > 0:
1355 OptionDict
[Item
['space']+'_'+Item
['cname']] = Options
1356 BsfFd
.write("\nEndStruct\n\n")
1358 BsfFd
.write("%s" % self
._BuidinOptionTxt
)
1360 for Each
in OptionDict
:
1361 BsfFd
.write("List &%s\n" % Each
)
1362 for Item
in OptionDict
[Each
]:
1363 BsfFd
.write(' Selection %s , "%s"\n' % (Item
[0], Item
[1]))
1364 BsfFd
.write("EndList\n\n")
1366 BsfFd
.write("BeginInfoBlock\n")
1367 BsfFd
.write(' PPVer "%s"\n' % (self
._CfgBlkDict
['ver']))
1368 BsfFd
.write(' Description "%s"\n' % (self
._CfgBlkDict
['name']))
1369 BsfFd
.write("EndInfoBlock\n\n")
1371 for Each
in self
._CfgPageDict
:
1372 BsfFd
.write('Page "%s"\n' % self
._CfgPageDict
[Each
])
1374 for Item
in self
._CfgItemList
:
1375 if Item
['name'] != '':
1376 if Item
['page'] != Each
:
1378 if len(Item
['subreg']) > 0:
1379 for SubItem
in Item
['subreg']:
1380 if SubItem
['name'] != '':
1381 BsfItems
.append(SubItem
)
1383 BsfItems
.append(Item
)
1385 BsfItems
.sort(key
=lambda x
: x
['order'])
1387 for Item
in BsfItems
:
1388 self
.WriteBsfOption (BsfFd
, Item
)
1389 BsfFd
.write("EndPage\n\n")
1396 print "GenCfgOpt Version 0.52"
1398 print " GenCfgOpt UPDTXT PlatformDscFile BuildFvDir [-D Macros]"
1399 print " GenCfgOpt HEADER PlatformDscFile BuildFvDir InputHFile [-D Macros]"
1400 print " GenCfgOpt GENBSF PlatformDscFile BuildFvDir BsfOutFile [-D Macros]"
1404 # Parse the options and args
1406 GenCfgOpt
= CGenCfgOpt()
1407 argc
= len(sys
.argv
)
1412 DscFile
= sys
.argv
[2]
1413 if not os
.path
.exists(DscFile
):
1414 print "ERROR: Cannot open DSC file '%s' !" % DscFile
1419 if sys
.argv
[4][0] == '-':
1422 OutFile
= sys
.argv
[4]
1425 if GenCfgOpt
.ParseMacros(sys
.argv
[Start
:]) != 0:
1426 print "ERROR: Macro parsing failed !"
1430 if not os
.path
.exists(FvDir
):
1433 if GenCfgOpt
.ParseDscFile(DscFile
, FvDir
) != 0:
1434 print "ERROR: %s !" % GenCfgOpt
.Error
1437 if GenCfgOpt
.UpdateSubRegionDefaultValue() != 0:
1438 print "ERROR: %s !" % GenCfgOpt
.Error
1441 if sys
.argv
[1] == "UPDTXT":
1442 Ret
= GenCfgOpt
.CreateSplitUpdTxt(OutFile
)
1444 # No change is detected
1446 print "INFO: %s !" % (GenCfgOpt
.Error
)
1448 print "ERROR: %s !" % (GenCfgOpt
.Error
)
1450 elif sys
.argv
[1] == "HEADER":
1451 if GenCfgOpt
.CreateHeaderFile(OutFile
) != 0:
1452 print "ERROR: %s !" % GenCfgOpt
.Error
1454 elif sys
.argv
[1] == "GENBSF":
1455 if GenCfgOpt
.GenerateBsfFile(OutFile
) != 0:
1456 print "ERROR: %s !" % GenCfgOpt
.Error
1462 print "ERROR: Unknown command '%s' !" % sys
.argv
[1]
1469 if __name__
== '__main__':