]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFspPkg/Tools/GenCfgOpt.py
IntelFspPkg/Tool rename generated FspUpdVpd header file.
[mirror_edk2.git] / IntelFspPkg / Tools / GenCfgOpt.py
CommitLineData
c8ec22a2
JY
1## @ GenCfgOpt.py\r
2#\r
d5fb1edf 3# Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
c8ec22a2
JY
4# This program and the accompanying materials are licensed and made available under\r
5# the terms and conditions of the BSD License that accompanies this distribution.\r
6# The full text of the license may be found at\r
7# http://opensource.org/licenses/bsd-license.php.\r
8#\r
9# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11#\r
12##\r
13\r
14import os\r
15import re\r
16import sys\r
17import struct\r
18from datetime import date\r
19\r
20# Generated file copyright header\r
21\r
22__copyright_txt__ = """## @file\r
23#\r
24# THIS IS AUTO-GENERATED FILE BY BUILD TOOLS AND PLEASE DO NOT MAKE MODIFICATION.\r
25#\r
26# This file lists all VPD informations for a platform collected by build.exe.\r
27#\r
28# Copyright (c) %4d, Intel Corporation. All rights reserved.<BR>\r
29# This program and the accompanying materials\r
30# are licensed and made available under the terms and conditions of the BSD License\r
31# which accompanies this distribution. The full text of the license may be found at\r
32# http://opensource.org/licenses/bsd-license.php\r
33#\r
34# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
35# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
36#\r
37"""\r
38\r
39__copyright_bsf__ = """/** @file\r
40\r
41 Boot Setting File for Platform Configuration.\r
42\r
43 Copyright (c) %4d, Intel Corporation. All rights reserved.<BR>\r
44 This program and the accompanying materials\r
45 are licensed and made available under the terms and conditions of the BSD License\r
46 which accompanies this distribution. The full text of the license may be found at\r
47 http://opensource.org/licenses/bsd-license.php\r
48\r
49 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
50 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
51\r
52 This file is automatically generated. Please do NOT modify !!!\r
53\r
54**/\r
55\r
56"""\r
57\r
58__copyright_h__ = """/** @file\r
59\r
60Copyright (c) %4d, Intel Corporation. All rights reserved.<BR>\r
61\r
62Redistribution and use in source and binary forms, with or without modification,\r
63are permitted provided that the following conditions are met:\r
64\r
65* Redistributions of source code must retain the above copyright notice, this\r
66 list of conditions and the following disclaimer.\r
67* Redistributions in binary form must reproduce the above copyright notice, this\r
68 list of conditions and the following disclaimer in the documentation and/or\r
69 other materials provided with the distribution.\r
70* Neither the name of Intel Corporation nor the names of its contributors may\r
71 be used to endorse or promote products derived from this software without\r
72 specific prior written permission.\r
73\r
74 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
75 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
76 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
77 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
78 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
79 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
80 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
81 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
82 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
83 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r
84 THE POSSIBILITY OF SUCH DAMAGE.\r
85\r
86 This file is automatically generated. Please do NOT modify !!!\r
87\r
88**/\r
89"""\r
90\r
4c9ed23e
MM
91class CLogicalExpression:\r
92 def __init__(self):\r
93 self.index = 0\r
94 self.string = ''\r
95\r
96 def errExit(self, err = ''):\r
97 print "ERROR: Express parsing for:"\r
98 print " %s" % self.string\r
99 print " %s^" % (' ' * self.index)\r
100 if err:\r
101 print "INFO : %s" % err\r
102 raise SystemExit\r
103\r
104 def getNonNumber (self, n1, n2):\r
105 if not n1.isdigit():\r
106 return n1\r
107 if not n2.isdigit():\r
108 return n2\r
109 return None\r
110\r
111 def getCurr(self, lens = 1):\r
112 try:\r
113 if lens == -1:\r
114 return self.string[self.index :]\r
115 else:\r
116 if self.index + lens > len(self.string):\r
117 lens = len(self.string) - self.index\r
118 return self.string[self.index : self.index + lens]\r
119 except Exception:\r
120 return ''\r
121\r
122 def isLast(self):\r
123 return self.index == len(self.string)\r
124\r
125 def moveNext(self, len = 1):\r
126 self.index += len\r
127\r
128 def skipSpace(self):\r
129 while not self.isLast():\r
130 if self.getCurr() in ' \t':\r
131 self.moveNext()\r
132 else:\r
133 return\r
134\r
135 def normNumber (self, val):\r
136 return True if val else False\r
137\r
138 def getNumber(self, var):\r
139 var = var.strip()\r
140 if re.match('^0x[a-fA-F0-9]+$', var):\r
141 value = int(var, 16)\r
142 elif re.match('^[+-]?\d+$', var):\r
143 value = int(var, 10)\r
144 else:\r
145 value = None\r
146 return value\r
147\r
148 def parseValue(self):\r
149 self.skipSpace()\r
150 var = ''\r
151 while not self.isLast():\r
152 char = self.getCurr()\r
153 if re.match('^[\w.]', char):\r
154 var += char\r
155 self.moveNext()\r
156 else:\r
157 break\r
158 val = self.getNumber(var)\r
159 if val is None:\r
160 value = var\r
161 else:\r
162 value = "%d" % val\r
163 return value\r
164\r
165 def parseSingleOp(self):\r
166 self.skipSpace()\r
167 if re.match('^NOT\W', self.getCurr(-1)):\r
168 self.moveNext(3)\r
169 op = self.parseBrace()\r
170 val = self.getNumber (op)\r
171 if val is None:\r
172 self.errExit ("'%s' is not a number" % op)\r
173 return "%d" % (not self.normNumber(int(op)))\r
174 else:\r
175 return self.parseValue()\r
176\r
177 def parseBrace(self):\r
178 self.skipSpace()\r
179 char = self.getCurr()\r
180 if char == '(':\r
181 self.moveNext()\r
182 value = self.parseExpr()\r
183 self.skipSpace()\r
184 if self.getCurr() != ')':\r
185 self.errExit ("Expecting closing brace or operator")\r
186 self.moveNext()\r
187 return value\r
188 else:\r
189 value = self.parseSingleOp()\r
190 return value\r
191\r
192 def parseCompare(self):\r
193 value = self.parseBrace()\r
194 while True:\r
195 self.skipSpace()\r
196 char = self.getCurr()\r
197 if char in ['<', '>']:\r
198 self.moveNext()\r
199 next = self.getCurr()\r
200 if next == '=':\r
201 op = char + next\r
202 self.moveNext()\r
203 else:\r
204 op = char\r
205 result = self.parseBrace()\r
206 test = self.getNonNumber(result, value)\r
207 if test is None:\r
208 value = "%d" % self.normNumber(eval (value + op + result))\r
209 else:\r
210 self.errExit ("'%s' is not a valid number for comparision" % test)\r
211 elif char in ['=', '!']:\r
212 op = self.getCurr(2)\r
213 if op in ['==', '!=']:\r
214 self.moveNext(2)\r
215 result = self.parseBrace()\r
216 test = self.getNonNumber(result, value)\r
217 if test is None:\r
218 value = "%d" % self.normNumber((eval (value + op + result)))\r
219 else:\r
220 value = "%d" % self.normNumber(eval ("'" + value + "'" + op + "'" + result + "'"))\r
221 else:\r
222 break\r
223 else:\r
224 break\r
225 return value\r
226\r
227 def parseAnd(self):\r
228 value = self.parseCompare()\r
229 while True:\r
230 self.skipSpace()\r
231 if re.match('^AND\W', self.getCurr(-1)):\r
232 self.moveNext(3)\r
233 result = self.parseCompare()\r
234 test = self.getNonNumber(result, value)\r
235 if test is None:\r
236 value = "%d" % self.normNumber(int(value) & int(result))\r
237 else:\r
238 self.errExit ("'%s' is not a valid op number for AND" % test)\r
239 else:\r
240 break\r
241 return value\r
242\r
243 def parseOrXor(self):\r
244 value = self.parseAnd()\r
245 op = None\r
246 while True:\r
247 self.skipSpace()\r
248 op = None\r
249 if re.match('^XOR\W', self.getCurr(-1)):\r
250 self.moveNext(3)\r
251 op = '^'\r
252 elif re.match('^OR\W', self.getCurr(-1)):\r
253 self.moveNext(2)\r
254 op = '|'\r
255 else:\r
256 break\r
257 if op:\r
258 result = self.parseAnd()\r
259 test = self.getNonNumber(result, value)\r
260 if test is None:\r
261 value = "%d" % self.normNumber(eval (value + op + result))\r
262 else:\r
263 self.errExit ("'%s' is not a valid op number for XOR/OR" % test)\r
264 return value\r
265\r
266 def parseExpr(self):\r
267 return self.parseOrXor()\r
268\r
269 def getResult(self):\r
270 value = self.parseExpr()\r
271 self.skipSpace()\r
272 if not self.isLast():\r
273 self.errExit ("Unexpected character found '%s'" % self.getCurr())\r
274 test = self.getNumber(value)\r
275 if test is None:\r
276 self.errExit ("Result '%s' is not a number" % value)\r
277 return int(value)\r
278\r
279 def evaluateExpress (self, Expr):\r
280 self.index = 0\r
281 self.string = Expr\r
282 if self.getResult():\r
283 Result = True\r
284 else:\r
285 Result = False\r
286 return Result\r
287\r
c8ec22a2
JY
288class CGenCfgOpt:\r
289 def __init__(self):\r
4c9ed23e 290 self.Debug = False\r
c8ec22a2
JY
291 self.Error = ''\r
292\r
293 self._GlobalDataDef = """\r
294GlobalDataDef\r
295 SKUID = 0, "DEFAULT"\r
296EndGlobalData\r
297\r
298"""\r
299 self._BuidinOptionTxt = """\r
300List &EN_DIS\r
301 Selection 0x1 , "Enabled"\r
302 Selection 0x0 , "Disabled"\r
303EndList\r
304\r
305"""\r
306\r
307 self._BsfKeyList = ['FIND','NAME','HELP','TYPE','PAGE','OPTION','ORDER']\r
308 self._HdrKeyList = ['HEADER','STRUCT']\r
309 self._BuidinOption = {'$EN_DIS' : 'EN_DIS'}\r
310\r
311 self._MacroDict = {}\r
312 self._CfgBlkDict = {}\r
313 self._CfgPageDict = {}\r
314 self._CfgItemList = []\r
315 self._DscFile = ''\r
316 self._FvDir = ''\r
317 self._MapVer = 0\r
318\r
319 def ParseMacros (self, MacroDefStr):\r
320 # ['-DABC=1', '-D', 'CFG_DEBUG=1', '-D', 'CFG_OUTDIR=Build']\r
321 self._MacroDict = {}\r
322 IsExpression = False\r
323 for Macro in MacroDefStr:\r
324 if Macro.startswith('-D'):\r
325 IsExpression = True\r
326 if len(Macro) > 2:\r
327 Macro = Macro[2:]\r
328 else :\r
329 continue\r
330 if IsExpression:\r
331 IsExpression = False\r
332 Match = re.match("(\w+)=(.+)", Macro)\r
333 if Match:\r
334 self._MacroDict[Match.group(1)] = Match.group(2)\r
335 else:\r
336 Match = re.match("(\w+)", Macro)\r
337 if Match:\r
338 self._MacroDict[Match.group(1)] = ''\r
339 if len(self._MacroDict) == 0:\r
c8ec22a2
JY
340 Error = 1\r
341 else:\r
342 Error = 0\r
4c9ed23e
MM
343 if self.Debug:\r
344 print "INFO : Macro dictionary:"\r
345 for Each in self._MacroDict:\r
346 print " $(%s) = [ %s ]" % (Each , self._MacroDict[Each])\r
c8ec22a2
JY
347 return Error\r
348\r
4c9ed23e
MM
349 def EvaulateIfdef (self, Macro):\r
350 Result = Macro in self._MacroDict\r
351 if self.Debug:\r
352 print "INFO : Eval Ifdef [%s] : %s" % (Macro, Result)\r
353 return Result\r
354\r
355 def ExpandMacros (self, Input):\r
356 Line = Input\r
357 Match = re.findall("\$\(\w+\)", Input)\r
358 if Match:\r
359 for Each in Match:\r
360 Variable = Each[2:-1]\r
361 if Variable in self._MacroDict:\r
362 Line = Line.replace(Each, self._MacroDict[Variable])\r
363 else:\r
364 if self.Debug:\r
365 print "WARN : %s is not defined" % Each\r
366 Line = Line.replace(Each, Each[2:-1])\r
367 return Line\r
368\r
369 def EvaluateExpress (self, Expr):\r
370 ExpExpr = self.ExpandMacros(Expr)\r
371 LogExpr = CLogicalExpression()\r
372 Result = LogExpr.evaluateExpress (ExpExpr)\r
373 if self.Debug:\r
374 print "INFO : Eval Express [%s] : %s" % (Expr, Result)\r
375 return Result\r
376\r
377 def FormatListValue(self, ConfigDict):\r
378 Struct = ConfigDict['struct']\r
379 if Struct not in ['UINT8','UINT16','UINT32','UINT64']:\r
380 return\r
381\r
382 dataarray = []\r
383 binlist = ConfigDict['value'][1:-1].split(',')\r
384 for each in binlist:\r
385 each = each.strip()\r
386 if each.startswith('0x'):\r
387 value = int(each, 16)\r
388 else:\r
389 value = int(each)\r
390 dataarray.append(value)\r
391\r
392 unit = int(Struct[4:]) / 8\r
393 if int(ConfigDict['length']) != unit * len(dataarray):\r
394 raise Exception("Array size is not proper for '%s' !" % ConfigDict['cname'])\r
395\r
396 bytearray = []\r
397 for each in dataarray:\r
398 value = each\r
399 for loop in xrange(unit):\r
400 bytearray.append("0x%02X" % (value & 0xFF))\r
401 value = value >> 8\r
402 newvalue = '{' + ','.join(bytearray) + '}'\r
403 ConfigDict['value'] = newvalue\r
404 return ""\r
c8ec22a2
JY
405\r
406 def ParseDscFile (self, DscFile, FvDir):\r
407 self._CfgItemList = []\r
408 self._CfgPageDict = {}\r
409 self._CfgBlkDict = {}\r
410 self._DscFile = DscFile\r
411 self._FvDir = FvDir\r
412\r
413 IsDefSect = False\r
414 IsUpdSect = False\r
415 IsVpdSect = False\r
416 Found = False\r
417\r
4c9ed23e 418 IfStack = []\r
c8ec22a2
JY
419 ElifStack = []\r
420 Error = 0\r
4c9ed23e 421 ConfigDict = {}\r
c8ec22a2
JY
422\r
423 DscFd = open(DscFile, "r")\r
424 DscLines = DscFd.readlines()\r
425 DscFd.close()\r
426\r
4c9ed23e
MM
427 while len(DscLines):\r
428 DscLine = DscLines.pop(0).strip() \r
429 Handle = False\r
430 Match = re.match("^\[(.+)\]", DscLine)\r
c8ec22a2
JY
431 if Match is not None:\r
432 if Match.group(1).lower() == "Defines".lower():\r
433 IsDefSect = True\r
434 IsVpdSect = False\r
435 IsUpdSect = False\r
436 elif Match.group(1).lower() == "PcdsDynamicVpd".lower():\r
437 ConfigDict = {}\r
438 ConfigDict['header'] = 'ON'\r
439 ConfigDict['region'] = 'VPD'\r
440 ConfigDict['order'] = -1\r
441 ConfigDict['page'] = ''\r
442 ConfigDict['name'] = ''\r
443 ConfigDict['find'] = ''\r
444 ConfigDict['struct'] = ''\r
445 ConfigDict['subreg'] = []\r
446 IsDefSect = False\r
447 IsVpdSect = True\r
448 IsUpdSect = False\r
449 elif Match.group(1).lower() == "PcdsDynamicVpd.Upd".lower():\r
450 ConfigDict = {}\r
451 ConfigDict['header'] = 'ON'\r
452 ConfigDict['region'] = 'UPD'\r
453 ConfigDict['order'] = -1\r
454 ConfigDict['page'] = ''\r
455 ConfigDict['name'] = ''\r
456 ConfigDict['find'] = ''\r
457 ConfigDict['struct'] = ''\r
458 ConfigDict['subreg'] = []\r
459 IsDefSect = False\r
460 IsUpdSect = True\r
461 IsVpdSect = False\r
462 Found = True\r
463 else:\r
464 IsDefSect = False\r
465 IsUpdSect = False\r
466 IsVpdSect = False\r
467 else:\r
468 if IsDefSect or IsUpdSect or IsVpdSect:\r
4c9ed23e
MM
469 if re.match("^!else($|\s+#.+)", DscLine):\r
470 if IfStack:\r
471 IfStack[-1] = not IfStack[-1]\r
472 else:\r
473 print("ERROR: No paired '!if' found for '!else' for line '%s'" % DscLine)\r
474 raise SystemExit\r
475 elif re.match("^!endif($|\s+#.+)", DscLine):\r
476 if IfStack:\r
c8ec22a2 477 IfStack.pop()\r
4c9ed23e
MM
478 Level = ElifStack.pop()\r
479 if Level > 0:\r
480 del IfStack[-Level:]\r
481 else:\r
482 print("ERROR: No paired '!if' found for '!endif' for line '%s'" % DscLine)\r
483 raise SystemExit\r
c8ec22a2
JY
484 else:\r
485 Result = False\r
4c9ed23e
MM
486 Match = re.match("!(ifdef|ifndef)\s+(.+)", DscLine)\r
487 if Match:\r
488 Result = self.EvaulateIfdef (Match.group(2))\r
489 if Match.group(1) == 'ifndef':\r
490 Result = not Result\r
c8ec22a2 491 IfStack.append(Result)\r
4c9ed23e 492 ElifStack.append(0)\r
c8ec22a2 493 else:\r
4c9ed23e
MM
494 Match = re.match("!(if|elseif)\s+(.+)", DscLine)\r
495 if Match:\r
496 Result = self.EvaluateExpress(Match.group(2))\r
c8ec22a2
JY
497 if Match.group(1) == "if":\r
498 ElifStack.append(0)\r
499 IfStack.append(Result)\r
500 else: #elseif\r
4c9ed23e
MM
501 if IfStack:\r
502 IfStack[-1] = not IfStack[-1]\r
503 IfStack.append(Result)\r
504 ElifStack[-1] = ElifStack[-1] + 1\r
505 else:\r
506 print("ERROR: No paired '!if' found for '!elif' for line '%s'" % DscLine)\r
507 raise SystemExit\r
c8ec22a2 508 else:\r
4c9ed23e
MM
509 if IfStack:\r
510 Handle = reduce(lambda x,y: x and y, IfStack)\r
c8ec22a2 511 else:\r
4c9ed23e
MM
512 Handle = True\r
513 if Handle:\r
514 Match = re.match("!include\s+(.+)", DscLine)\r
515 if Match:\r
516 IncludeFilePath = Match.group(1)\r
517 IncludeFilePath = self.ExpandMacros(IncludeFilePath)\r
518 try:\r
519 IncludeDsc = open(IncludeFilePath, "r")\r
520 except:\r
521 print("ERROR: Cannot open file '%s'" % IncludeFilePath)\r
522 raise SystemExit\r
523 NewDscLines = IncludeDsc.readlines()\r
524 IncludeDsc.close()\r
525 DscLines = NewDscLines + DscLines\r
526 else:\r
527 if DscLine.startswith('!'):\r
528 print("ERROR: Unrecoginized directive for line '%s'" % DscLine)\r
529 raise SystemExit\r
530 \r
c8ec22a2
JY
531 if not Handle:\r
532 continue\r
533\r
534 if IsDefSect:\r
535 #DEFINE UPD_TOOL_GUID = 8C3D856A-9BE6-468E-850A-24F7A8D38E09\r
4c9ed23e 536 Match = re.match("^\s*(?:DEFINE\s+)*(\w+)\s*=\s*([-.\w]+)", DscLine)\r
c8ec22a2
JY
537 if Match:\r
538 self._MacroDict[Match.group(1)] = Match.group(2)\r
4c9ed23e
MM
539 if self.Debug:\r
540 print "INFO : DEFINE %s = [ %s ]" % (Match.group(1), Match.group(2))\r
c8ec22a2
JY
541 else:\r
542 Match = re.match("^\s*#\s+!(BSF|HDR)\s+(.+)", DscLine)\r
543 if Match:\r
544 Remaining = Match.group(2)\r
545 if Match.group(1) == 'BSF':\r
546 Match = re.match("(?:^|.+\s+)PAGES:{(.+?)}", Remaining)\r
547 if Match:\r
548 # !BSF PAGES:{HSW:"Haswell System Agent", LPT:"Lynx Point PCH"}\r
549 PageList = Match.group(1).split(',')\r
550 for Page in PageList:\r
551 Page = Page.strip()\r
552 Match = re.match("(\w+):\"(.+)\"", Page)\r
553 self._CfgPageDict[Match.group(1)] = Match.group(2)\r
554\r
555 Match = re.match("(?:^|.+\s+)BLOCK:{NAME:\"(.+)\"\s*,\s*VER:\"(.+)\"\s*}", Remaining)\r
556 if Match:\r
557 self._CfgBlkDict['name'] = Match.group(1)\r
558 self._CfgBlkDict['ver'] = Match.group(2)\r
559\r
560 for Key in self._BsfKeyList:\r
561 Match = re.match("(?:^|.+\s+)%s:{(.+?)}" % Key, Remaining)\r
562 if Match:\r
563 if Key in ['HELP', 'OPTION'] and Match.group(1).startswith('+'):\r
564 ConfigDict[Key.lower()] += Match.group(1)[1:]\r
565 else:\r
566 ConfigDict[Key.lower()] = Match.group(1)\r
567 else:\r
568 for Key in self._HdrKeyList:\r
569 Match = re.match("(?:^|.+\s+)%s:{(.+?)}" % Key, Remaining)\r
570 if Match:\r
571 ConfigDict[Key.lower()] = Match.group(1)\r
572\r
573 # Check VPD/UPD\r
574 if IsUpdSect:\r
575 Match = re.match("^([_a-zA-Z0-9]+).([_a-zA-Z0-9]+)\s*\|\s*(0x[0-9A-F]{4})\s*\|\s*(\d+|0x[0-9a-fA-F]+)\s*\|\s*(.+)",DscLine)\r
576 else:\r
577 Match = re.match("^([_a-zA-Z0-9]+).([_a-zA-Z0-9]+)\s*\|\s*(0x[0-9A-F]+)(?:\s*\|\s*(.+))?", DscLine)\r
578 if Match:\r
579 ConfigDict['space'] = Match.group(1)\r
580 ConfigDict['cname'] = Match.group(2)\r
581 ConfigDict['offset'] = int (Match.group(3), 16)\r
582 if ConfigDict['order'] == -1:\r
583 ConfigDict['order'] = ConfigDict['offset'] << 8\r
584 else:\r
585 (Major, Minor) = ConfigDict['order'].split('.')\r
586 ConfigDict['order'] = (int (Major, 16) << 8 ) + int (Minor, 16)\r
587 if IsUpdSect:\r
588 Value = Match.group(5).strip()\r
589 if Match.group(4).startswith("0x"):\r
590 Length = int (Match.group(4), 16)\r
591 else :\r
592 Length = int (Match.group(4))\r
593 else:\r
594 Value = Match.group(4)\r
595 if Value is None:\r
596 Value = ''\r
597 Value = Value.strip()\r
598 if '|' in Value:\r
599 Match = re.match("^.+\s*\|\s*(.+)", Value)\r
600 if Match:\r
601 Value = Match.group(1)\r
602 Length = -1\r
603\r
604 ConfigDict['length'] = Length\r
605 Match = re.match("\$\((\w+)\)", Value)\r
606 if Match:\r
607 if Match.group(1) in self._MacroDict:\r
608 Value = self._MacroDict[Match.group(1)]\r
4c9ed23e 609\r
c8ec22a2 610 ConfigDict['value'] = Value\r
4c9ed23e
MM
611 if (len(Value) > 0) and (Value[0] == '{'):\r
612 Value = self.FormatListValue(ConfigDict)\r
613\r
c8ec22a2
JY
614 if ConfigDict['name'] == '':\r
615 # Clear BSF specific items\r
616 ConfigDict['help'] = ''\r
617 ConfigDict['type'] = ''\r
618 ConfigDict['option'] = ''\r
619\r
620 self._CfgItemList.append(ConfigDict.copy())\r
621 ConfigDict['name'] = ''\r
622 ConfigDict['find'] = ''\r
623 ConfigDict['struct'] = ''\r
624 ConfigDict['order'] = -1\r
625 ConfigDict['subreg'] = []\r
626 else:\r
627 # It could be a virtual item as below\r
628 # !BSF FIELD:{1:SerialDebugPortAddress0}\r
629 Match = re.match("^\s*#\s+!BSF\s+FIELD:{(.+):(\d+)}", DscLine)\r
630 if Match:\r
631 SubCfgDict = ConfigDict\r
632 SubCfgDict['cname'] = Match.group(1)\r
633 SubCfgDict['length'] = int (Match.group(2))\r
634 if SubCfgDict['length'] > 0:\r
635 LastItem = self._CfgItemList[-1]\r
636 if len(LastItem['subreg']) == 0:\r
637 SubOffset = 0\r
638 else:\r
639 SubOffset += LastItem['subreg'][-1]['length']\r
640 SubCfgDict['offset'] = SubOffset\r
641 LastItem['subreg'].append (SubCfgDict.copy())\r
642 ConfigDict['name'] = ''\r
643 return Error\r
644\r
645 def UpdateSubRegionDefaultValue (self):\r
646 Error = 0\r
647 for Item in self._CfgItemList:\r
648 if len(Item['subreg']) == 0:\r
649 continue\r
650 bytearray = []\r
651 if Item['value'][0] == '{':\r
652 binlist = Item['value'][1:-1].split(',')\r
653 for each in binlist:\r
654 each = each.strip()\r
655 if each.startswith('0x'):\r
656 value = int(each, 16)\r
657 else:\r
658 value = int(each)\r
659 bytearray.append(value)\r
660 else:\r
661 if Item['value'].startswith('0x'):\r
662 value = int(Item['value'], 16)\r
663 else:\r
664 value = int(Item['value'])\r
665 idx = 0;\r
666 while idx < Item['length']:\r
667 bytearray.append(value & 0xFF)\r
668 value = value >> 8\r
669 idx = idx + 1\r
670 for SubItem in Item['subreg']:\r
671 if SubItem['length'] in (1,2,4,8):\r
672 valuelist = [b for b in bytearray[SubItem['offset']:SubItem['offset']+SubItem['length']]]\r
673 valuelist.reverse()\r
674 valuestr = "".join('%02X' % b for b in valuelist)\r
675 SubItem['value'] = '0x%s' % valuestr\r
676 else:\r
677 valuestr = ",".join('0x%02X' % b for b in bytearray[SubItem['offset']:SubItem['offset']+SubItem['length']])\r
678 SubItem['value'] = '{%s}' % valuestr\r
679 return Error\r
680\r
681 def UpdateVpdSizeField (self):\r
682 FvDir = self._FvDir;\r
683\r
684 if 'VPD_TOOL_GUID' not in self._MacroDict:\r
685 self.Error = "VPD_TOOL_GUID definition is missing in DSC file"\r
686 return 1\r
687\r
688 VpdMapFile = os.path.join(FvDir, self._MacroDict['VPD_TOOL_GUID'] + '.map')\r
689 if not os.path.exists(VpdMapFile):\r
690 self.Error = "VPD MAP file '%s' does not exist" % VpdMapFile\r
691 return 2\r
692\r
693 MapFd = open(VpdMapFile, "r")\r
694 MapLines = MapFd.readlines()\r
695 MapFd.close()\r
696\r
697 VpdDict = {}\r
698 PcdDict = {}\r
699 for MapLine in MapLines:\r
700 #gPlatformFspPkgTokenSpaceGuid.PcdVpdRegionSign | DEFAULT | 0x0000 | 8 | 0x534450565F425346\r
701 #gPlatformFspPkgTokenSpaceGuid.PcdVpdRegionSign | 0x0000 | 8 | 0x534450565F425346\r
702 #gPlatformFspPkgTokenSpaceGuid.PcdTest | 0x0008 | 5 | {0x01,0x02,0x03,0x04,0x05}\r
703 Match = re.match("([_a-zA-Z0-9]+).([_a-zA-Z0-9]+)(\s\|\sDEFAULT)?\s\|\s(0x[0-9A-F]{4})\s\|\s(\d+|0x[0-9a-fA-F]+)\s\|\s(\{?[x0-9a-fA-F,\s]+\}?)", MapLine)\r
704 if Match:\r
705 Space = Match.group(1)\r
706 Name = Match.group(2)\r
707 if (self._MapVer == 0) and (Match.group(3) != None):\r
708 self._MapVer = 1\r
709 Offset = int (Match.group(4), 16)\r
710 if Match.group(5).startswith("0x"):\r
711 Length = int (Match.group(5), 16)\r
712 else :\r
713 Length = int (Match.group(5))\r
714 PcdDict["len"] = Length\r
715 PcdDict["value"] = Match.group(6)\r
716 VpdDict[Space+'.'+Name] = dict(PcdDict)\r
717\r
718 for Item in self._CfgItemList:\r
719 if Item['value'] == '':\r
720 Item['value'] = VpdDict[Item['space']+'.'+Item['cname']]['value']\r
721 if Item['length'] == -1:\r
722 Item['length'] = VpdDict[Item['space']+'.'+Item['cname']]['len']\r
723 if Item['struct'] != '':\r
724 Type = Item['struct'].strip()\r
725 if Type.endswith('*') and (Item['length'] != 4):\r
726 self.Error = "Struct pointer '%s' has invalid size" % Type\r
727 return 3\r
728\r
729 return 0\r
730\r
731 def CreateUpdTxtFile (self, UpdTxtFile):\r
732 FvDir = self._FvDir\r
733 if 'UPD_TOOL_GUID' not in self._MacroDict:\r
734 self.Error = "UPD_TOOL_GUID definition is missing in DSC file"\r
735 return 1\r
736\r
737 if UpdTxtFile == '':\r
738 UpdTxtFile = os.path.join(FvDir, self._MacroDict['UPD_TOOL_GUID'] + '.txt')\r
739\r
740 ReCreate = False\r
741 if not os.path.exists(UpdTxtFile):\r
742 ReCreate = True\r
743 else:\r
744 DscTime = os.path.getmtime(self._DscFile)\r
745 TxtTime = os.path.getmtime(UpdTxtFile)\r
746 if DscTime > TxtTime:\r
747 ReCreate = True\r
748\r
749 if not ReCreate:\r
750 # DSC has not been modified yet\r
751 # So don't have to re-generate other files\r
752 self.Error = 'No DSC file change, skip to create UPD TXT file'\r
753 return 256\r
754\r
755 TxtFd = open(UpdTxtFile, "w")\r
756 TxtFd.write("%s\n" % (__copyright_txt__ % date.today().year))\r
757\r
758 NextOffset = 0\r
759 SpaceIdx = 0\r
760 if self._MapVer == 1:\r
761 Default = 'DEFAULT|'\r
762 else:\r
763 Default = ''\r
764 for Item in self._CfgItemList:\r
765 if Item['region'] != 'UPD':\r
766 continue\r
767 Offset = Item['offset']\r
768 if NextOffset < Offset:\r
769 # insert one line\r
770 TxtFd.write("%s.UnusedUpdSpace%d|%s0x%04X|0x%04X|{0}\n" % (Item['space'], SpaceIdx, Default, NextOffset, Offset - NextOffset))\r
771 SpaceIdx = SpaceIdx + 1\r
772 NextOffset = Offset + Item['length']\r
773 TxtFd.write("%s.%s|%s0x%04X|%s|%s\n" % (Item['space'],Item['cname'],Default,Item['offset'],Item['length'],Item['value']))\r
774 TxtFd.close()\r
775 return 0\r
776\r
61267952 777 def CreateField (self, Item, Name, Length, Offset, Struct, Help):\r
c8ec22a2
JY
778 PosName = 28\r
779 PosComment = 30\r
61267952 780 HelpLine=''\r
c8ec22a2
JY
781\r
782 IsArray = False\r
4c9ed23e
MM
783 if Length in [1,2,4,8]:\r
784 Type = "UINT%d" % (Length * 8)\r
c8ec22a2 785 else:\r
4c9ed23e
MM
786 IsArray = True\r
787 Type = "UINT8"\r
788\r
789 if Item['value'].startswith('{'):\r
c8ec22a2
JY
790 Type = "UINT8"\r
791 IsArray = True\r
792\r
793 if Struct != '':\r
c8ec22a2 794 Type = Struct\r
4c9ed23e
MM
795 if Struct in ['UINT8','UINT16','UINT32','UINT64']:\r
796 IsArray = True\r
797 Unit = int(Type[4:]) / 8\r
798 Length = Length / Unit\r
799 else:\r
800 IsArray = False\r
c8ec22a2
JY
801\r
802 if IsArray:\r
803 Name = Name + '[%d]' % Length\r
804\r
805 if len(Type) < PosName:\r
806 Space1 = PosName - len(Type)\r
807 else:\r
808 Space1 = 1\r
809\r
810 if len(Name) < PosComment:\r
811 Space2 = PosComment - len(Name)\r
812 else:\r
813 Space2 = 1\r
61267952
MG
814 if Help != '':\r
815 HelpLine=" %s \n" % Help\r
c8ec22a2 816\r
61267952 817 return "/**Offset 0x%04X \n%s**/\n %s%s%s;%s\n" % (Offset, HelpLine, Type, ' ' * Space1, Name, ' ' * Space2)\r
c8ec22a2
JY
818\r
819\r
820 def CreateHeaderFile (self, InputHeaderFile, IsInternal):\r
821 Error = 0\r
822 FvDir = self._FvDir\r
823\r
824 if IsInternal:\r
9774fe6e 825 HeaderFile = os.path.join(FvDir, 'FspUpdVpdInternal.h')\r
c8ec22a2 826 else:\r
9774fe6e 827 HeaderFile = os.path.join(FvDir, 'FspUpdVpd.h')\r
c8ec22a2
JY
828\r
829 # Check if header needs to be recreated\r
830 ReCreate = False\r
831 if IsInternal:\r
832 if not os.path.exists(HeaderFile):\r
833 ReCreate = True\r
834 else:\r
835 DscTime = os.path.getmtime(self._DscFile)\r
836 HeadTime = os.path.getmtime(HeaderFile)\r
837 if not os.path.exists(InputHeaderFile):\r
838 InpTime = HeadTime\r
839 else:\r
840 InpTime = os.path.getmtime(InputHeaderFile)\r
841 if DscTime > HeadTime or InpTime > HeadTime:\r
842 ReCreate = True\r
843\r
844 if not ReCreate:\r
845 self.Error = "No DSC or input header file is changed, skip the header file generating"\r
846 return 256\r
847\r
848 HeaderFd = open(HeaderFile, "w")\r
849 FileBase = os.path.basename(HeaderFile)\r
850 FileName = FileBase.replace(".", "_").upper()\r
851 HeaderFd.write("%s\n" % (__copyright_h__ % date.today().year))\r
852 HeaderFd.write("#ifndef __%s__\n" % FileName)\r
853 HeaderFd.write("#define __%s__\n\n" % FileName)\r
854 HeaderFd.write("#pragma pack(1)\n\n")\r
855\r
856 if InputHeaderFile != '':\r
857 if not os.path.exists(InputHeaderFile):\r
858 self.Error = "Input header file '%s' does not exist" % InputHeaderFile\r
859 return 2\r
860\r
861 InFd = open(InputHeaderFile, "r")\r
862 IncLines = InFd.readlines()\r
863 InFd.close()\r
864\r
865 Export = False\r
866 for Line in IncLines:\r
867 Match = re.search ("!EXPORT\s+EXTERNAL_BOOTLOADER_STRUCT_(BEGIN|END)\s+", Line)\r
868 if Match:\r
869 if Match.group(1) == "BEGIN":\r
870 Export = True\r
871 continue\r
872 else:\r
873 Export = False\r
874 continue\r
875 if Export:\r
876 HeaderFd.write(Line)\r
877 HeaderFd.write("\n\n")\r
878\r
879 for Region in ['UPD', 'VPD']:\r
880\r
881 # Write PcdVpdRegionSign and PcdImageRevision\r
882 if Region[0] == 'V':\r
883 if 'VPD_TOOL_GUID' not in self._MacroDict:\r
884 self.Error = "VPD_TOOL_GUID definition is missing in DSC file"\r
885 Error = 1\r
886 break\r
887\r
888 BinFile = os.path.join(FvDir, self._MacroDict['VPD_TOOL_GUID'] + ".bin")\r
889 if not os.path.exists(BinFile):\r
890 self.Error = "VPD binary file '%s' does not exist" % BinFile\r
891 Error = 2\r
892 break\r
893\r
894 BinFd = open(BinFile, "rb")\r
895 IdStr = BinFd.read(0x08)\r
63c05743
JY
896 ImageId = struct.unpack('<Q', IdStr)\r
897 ImageRev = struct.unpack('<I', BinFd.read(0x04))\r
c8ec22a2
JY
898 BinFd.close()\r
899\r
95c95ac0
JY
900 HeaderFd.write("#define FSP_IMAGE_ID 0x%016X /* '%s' */\n" % (ImageId[0], IdStr))\r
901 HeaderFd.write("#define FSP_IMAGE_REV 0x%08X \n\n" % ImageRev[0])\r
c8ec22a2
JY
902\r
903 HeaderFd.write("typedef struct _" + Region[0] + "PD_DATA_REGION {\n")\r
904 NextOffset = 0\r
905 SpaceIdx = 0\r
906 Offset = 0\r
907\r
908 LastVisible = True\r
909 ResvOffset = 0\r
910 ResvIdx = 0\r
911 LineBuffer = []\r
912 for Item in self._CfgItemList:\r
913 if Item['region'] != Region:\r
914 continue\r
915\r
916 NextVisible = LastVisible\r
917 if not IsInternal:\r
918 if LastVisible and (Item['header'] == 'OFF'):\r
919 NextVisible = False\r
920 ResvOffset = Item['offset']\r
921 elif (not LastVisible) and Item['header'] == 'ON':\r
922 NextVisible = True\r
923 Name = "Reserved" + Region[0] + "pdSpace%d" % ResvIdx\r
924 ResvIdx = ResvIdx + 1\r
61267952 925 HeaderFd.write(self.CreateField (Item, Name, Item["offset"] - ResvOffset, ResvOffset, '', ''))\r
c8ec22a2
JY
926\r
927 if Offset < Item["offset"]:\r
928 if IsInternal or LastVisible:\r
929 Name = "Unused" + Region[0] + "pdSpace%d" % SpaceIdx\r
61267952 930 LineBuffer.append(self.CreateField (Item, Name, Item["offset"] - Offset, Offset, '',''))\r
c8ec22a2
JY
931 SpaceIdx = SpaceIdx + 1\r
932 Offset = Item["offset"]\r
933\r
934 if Offset != Item["offset"]:\r
935 print "Unsorted offset 0x%04X\n" % Item["offset"]\r
936 error = 2\r
937 break;\r
938\r
939 LastVisible = NextVisible\r
940\r
941 Offset = Offset + Item["length"]\r
942 if IsInternal or LastVisible:\r
943 for Each in LineBuffer:\r
944 HeaderFd.write (Each)\r
945 LineBuffer = []\r
61267952 946 HeaderFd.write(self.CreateField (Item, Item["cname"], Item["length"], Item["offset"], Item['struct'], Item['help']))\r
c8ec22a2
JY
947\r
948 HeaderFd.write("} " + Region[0] + "PD_DATA_REGION;\n\n")\r
949 HeaderFd.write("#pragma pack()\n\n")\r
950 HeaderFd.write("#endif\n")\r
951 HeaderFd.close()\r
952\r
953 return Error\r
954\r
955 def WriteBsfStruct (self, BsfFd, Item):\r
956 if Item['type'] == "None":\r
957 Space = "gPlatformFspPkgTokenSpaceGuid"\r
958 else:\r
959 Space = Item['space']\r
960 Line = " $%s_%s" % (Space, Item['cname'])\r
961 Match = re.match("\s*\{([x0-9a-fA-F,\s]+)\}\s*", Item['value'])\r
962 if Match:\r
963 DefaultValue = Match.group(1).strip()\r
964 else:\r
965 DefaultValue = Item['value'].strip()\r
966 BsfFd.write(" %s%s%4d bytes $_DEFAULT_ = %s\n" % (Line, ' ' * (64 - len(Line)), Item['length'], DefaultValue))\r
967 TmpList = []\r
968 if Item['type'] == "Combo":\r
969 if not Item['option'] in self._BuidinOption:\r
970 OptList = Item['option'].split(',')\r
971 for Option in OptList:\r
972 Option = Option.strip()\r
973 (OpVal, OpStr) = Option.split(':')\r
974 TmpList.append((OpVal, OpStr))\r
975 return TmpList\r
976\r
977 def WriteBsfOption (self, BsfFd, Item):\r
978 PcdName = Item['space'] + '_' + Item['cname']\r
979 WriteHelp = 0\r
980 if Item['type'] == "Combo":\r
981 if Item['option'] in self._BuidinOption:\r
982 Options = self._BuidinOption[Item['option']]\r
983 else:\r
984 Options = PcdName\r
985 BsfFd.write(' %s $%s, "%s", &%s,\n' % (Item['type'], PcdName, Item['name'], Options));\r
986 WriteHelp = 1\r
987 elif Item['type'].startswith("EditNum"):\r
988 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'])\r
989 if Match:\r
990 BsfFd.write(' EditNum $%s, "%s", %s,\n' % (PcdName, Item['name'], Match.group(1)));\r
991 WriteHelp = 2\r
992 elif Item['type'].startswith("EditText"):\r
993 BsfFd.write(' %s $%s, "%s",\n' % (Item['type'], PcdName, Item['name']));\r
994 WriteHelp = 1\r
995\r
996 if WriteHelp > 0:\r
997 HelpLines = Item['help'].split('\\n\\r')\r
998 FirstLine = True\r
999 for HelpLine in HelpLines:\r
1000 if FirstLine:\r
1001 FirstLine = False\r
1002 BsfFd.write(' Help "%s"\n' % (HelpLine));\r
1003 else:\r
1004 BsfFd.write(' "%s"\n' % (HelpLine));\r
1005 if WriteHelp == 2:\r
1006 BsfFd.write(' "Valid range: %s ~ %s"\n' % (Match.group(2), Match.group(3)));\r
1007\r
1008 def GenerateBsfFile (self, BsfFile):\r
1009\r
1010 if BsfFile == '':\r
1011 self.Error = "BSF output file '%s' is invalid" % BsfFile\r
1012 return 1\r
1013\r
1014 Error = 0\r
1015 OptionDict = {}\r
1016 BsfFd = open(BsfFile, "w")\r
1017 BsfFd.write("%s\n" % (__copyright_bsf__ % date.today().year))\r
1018 BsfFd.write("%s\n" % self._GlobalDataDef);\r
1019 BsfFd.write("StructDef\n")\r
1020 NextOffset = -1\r
1021 for Item in self._CfgItemList:\r
1022 if Item['find'] != '':\r
1023 BsfFd.write('\n Find "%s"\n' % Item['find'])\r
1024 NextOffset = Item['offset'] + Item['length']\r
1025 if Item['name'] != '':\r
1026 if NextOffset != Item['offset']:\r
1027 BsfFd.write(" Skip %d bytes\n" % (Item['offset'] - NextOffset))\r
1028 if len(Item['subreg']) > 0:\r
1029 NextOffset = Item['offset']\r
1030 for SubItem in Item['subreg']:\r
1031 NextOffset += SubItem['length']\r
1032 if SubItem['name'] == '':\r
1033 BsfFd.write(" Skip %d bytes\n" % (SubItem['length']))\r
1034 else:\r
1035 Options = self.WriteBsfStruct(BsfFd, SubItem)\r
1036 if len(Options) > 0:\r
1037 OptionDict[SubItem['space']+'_'+SubItem['cname']] = Options\r
1038 if (Item['offset'] + Item['length']) < NextOffset:\r
1039 self.Error = "BSF sub region '%s' length does not match" % (Item['space']+'.'+Item['cname'])\r
1040 return 2\r
1041 else:\r
1042 NextOffset = Item['offset'] + Item['length']\r
1043 Options = self.WriteBsfStruct(BsfFd, Item)\r
1044 if len(Options) > 0:\r
1045 OptionDict[Item['space']+'_'+Item['cname']] = Options\r
1046 BsfFd.write("\nEndStruct\n\n")\r
1047\r
1048 BsfFd.write("%s" % self._BuidinOptionTxt);\r
1049\r
1050 for Each in OptionDict:\r
1051 BsfFd.write("List &%s\n" % Each);\r
1052 for Item in OptionDict[Each]:\r
1053 BsfFd.write(' Selection %s , "%s"\n' % (Item[0], Item[1]));\r
1054 BsfFd.write("EndList\n\n");\r
1055\r
1056 BsfFd.write("BeginInfoBlock\n");\r
1057 BsfFd.write(' PPVer "%s"\n' % (self._CfgBlkDict['ver']));\r
1058 BsfFd.write(' Description "%s"\n' % (self._CfgBlkDict['name']));\r
1059 BsfFd.write("EndInfoBlock\n\n");\r
1060\r
1061 for Each in self._CfgPageDict:\r
1062 BsfFd.write('Page "%s"\n' % self._CfgPageDict[Each]);\r
1063 BsfItems = []\r
1064 for Item in self._CfgItemList:\r
1065 if Item['name'] != '':\r
1066 if Item['page'] != Each:\r
1067 continue\r
1068 if len(Item['subreg']) > 0:\r
1069 for SubItem in Item['subreg']:\r
1070 if SubItem['name'] != '':\r
1071 BsfItems.append(SubItem)\r
1072 else:\r
1073 BsfItems.append(Item)\r
1074\r
1075 BsfItems.sort(key=lambda x: x['order'])\r
1076\r
1077 for Item in BsfItems:\r
1078 self.WriteBsfOption (BsfFd, Item)\r
1079 BsfFd.write("EndPage\n\n");\r
1080\r
1081 BsfFd.close()\r
1082 return Error\r
1083\r
1084\r
1085def Usage():\r
1086 print "GenCfgOpt Version 0.50"\r
1087 print "Usage:"\r
1088 print " GenCfgOpt UPDTXT PlatformDscFile BuildFvDir [TxtOutFile] [-D Macros]"\r
1089 print " GenCfgOpt HEADER PlatformDscFile BuildFvDir [InputHFile] [-D Macros]"\r
1090 print " GenCfgOpt GENBSF PlatformDscFile BuildFvDir BsfOutFile [-D Macros]"\r
1091\r
1092def Main():\r
1093 #\r
1094 # Parse the options and args\r
1095 #\r
1096 GenCfgOpt = CGenCfgOpt()\r
1097 argc = len(sys.argv)\r
1098 if argc < 4:\r
1099 Usage()\r
1100 return 1\r
1101 else:\r
1102 DscFile = sys.argv[2]\r
1103 if not os.path.exists(DscFile):\r
1104 print "ERROR: Cannot open DSC file '%s' !" % DscFile\r
1105 return 2\r
1106\r
1107 OutFile = ''\r
1108 if argc > 4:\r
1109 if sys.argv[4][0] == '-':\r
1110 Start = 4\r
1111 else:\r
1112 OutFile = sys.argv[4]\r
1113 Start = 5\r
1114 if GenCfgOpt.ParseMacros(sys.argv[Start:]) != 0:\r
1115 print "ERROR: %s !" % GenCfgOpt.Error\r
1116 return 3\r
1117\r
1118 FvDir = sys.argv[3]\r
1119 if not os.path.isdir(FvDir):\r
1120 print "ERROR: FV folder '%s' is invalid !" % FvDir\r
1121 return 4\r
1122\r
1123 if GenCfgOpt.ParseDscFile(DscFile, FvDir) != 0:\r
1124 print "ERROR: %s !" % GenCfgOpt.Error\r
1125 return 5\r
1126\r
c8ec22a2
JY
1127 if GenCfgOpt.UpdateVpdSizeField() != 0:\r
1128 print "ERROR: %s !" % GenCfgOpt.Error\r
1129 return 6\r
1130\r
1131 if GenCfgOpt.UpdateSubRegionDefaultValue() != 0:\r
1132 print "ERROR: %s !" % GenCfgOpt.Error\r
1133 return 7\r
1134\r
1135 if sys.argv[1] == "UPDTXT":\r
1136 Ret = GenCfgOpt.CreateUpdTxtFile(OutFile)\r
1137 if Ret != 0:\r
1138 # No change is detected\r
1139 if Ret == 256:\r
1140 print "INFO: %s !" % (GenCfgOpt.Error)\r
1141 else :\r
1142 print "ERROR: %s !" % (GenCfgOpt.Error)\r
1143 return Ret\r
1144 elif sys.argv[1] == "HEADER":\r
1145 Ret = GenCfgOpt.CreateHeaderFile(OutFile, True)\r
1146 if Ret != 0:\r
1147 # No change is detected\r
1148 if Ret == 256:\r
1149 print "INFO: %s !" % (GenCfgOpt.Error)\r
1150 else :\r
1151 print "ERROR: %s !" % (GenCfgOpt.Error)\r
1152 return Ret\r
1153 if GenCfgOpt.CreateHeaderFile(OutFile, False) != 0:\r
1154 print "ERROR: %s !" % GenCfgOpt.Error\r
1155 return 8\r
1156 elif sys.argv[1] == "GENBSF":\r
1157 if GenCfgOpt.GenerateBsfFile(OutFile) != 0:\r
1158 print "ERROR: %s !" % GenCfgOpt.Error\r
1159 return 9\r
1160 else:\r
1161 if argc < 5:\r
1162 Usage()\r
1163 return 1\r
1164 print "ERROR: Unknown command '%s' !" % sys.argv[1]\r
1165 Usage()\r
1166 return 1\r
1167 return 0\r
1168 return 0\r
1169\r
1170\r
1171if __name__ == '__main__':\r
1172 sys.exit(Main())\r