2004-10-16 04:48:37 +02:00
|
|
|
# -*- python -*-
|
2003-06-14 17:07:02 +02:00
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
import re
|
|
|
|
import string
|
2003-08-05 18:35:34 +02:00
|
|
|
import types
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-09-02 01:17:58 +02:00
|
|
|
import traceback
|
|
|
|
|
2003-06-24 19:26:45 +02:00
|
|
|
warnings = 0
|
|
|
|
errors = 0
|
2003-06-14 17:07:02 +02:00
|
|
|
|
|
|
|
target_dir = ''
|
2003-07-18 00:25:53 +02:00
|
|
|
target_name = ''
|
|
|
|
treetop = ''
|
2004-10-14 23:40:58 +02:00
|
|
|
full_mainboard_path = ''
|
2004-10-15 17:09:30 +02:00
|
|
|
mainboard_path = ''
|
2003-07-18 00:25:53 +02:00
|
|
|
global_options = {}
|
|
|
|
global_options_by_order = []
|
|
|
|
global_option_values = {}
|
|
|
|
global_uses_options = {}
|
2004-02-04 10:11:51 +01:00
|
|
|
global_exported_options = []
|
2003-07-18 00:25:53 +02:00
|
|
|
romimages = {}
|
|
|
|
buildroms = []
|
2009-04-03 14:52:43 +02:00
|
|
|
rommapping = {}
|
2003-07-18 00:25:53 +02:00
|
|
|
curimage = 0
|
2009-04-03 14:52:43 +02:00
|
|
|
bootblocksize = 0
|
2003-07-18 00:25:53 +02:00
|
|
|
alloptions = 0 # override uses at top level
|
2003-06-14 17:07:02 +02:00
|
|
|
|
|
|
|
local_path = re.compile(r'^\.')
|
2003-07-14 20:00:10 +02:00
|
|
|
include_pattern = re.compile(r'%%([^%]+)%%')
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-08-04 23:05:19 +02:00
|
|
|
# the cpu type for this mainboard
|
|
|
|
cpu_type = 0
|
|
|
|
|
2003-07-19 06:07:07 +02:00
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
# Utility Classes
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
class stack:
|
2003-07-19 06:19:48 +02:00
|
|
|
"""Used to keep track of the current part or dir"""
|
2003-07-19 06:07:07 +02:00
|
|
|
class __stack_iter:
|
|
|
|
def __init__ (self, stack):
|
|
|
|
self.index = 0
|
|
|
|
self.len = len(stack)
|
|
|
|
self.stack = stack
|
|
|
|
|
|
|
|
def __iter__ (self):
|
|
|
|
return self
|
|
|
|
|
|
|
|
def next (self):
|
|
|
|
if (self.index < self.len):
|
|
|
|
s = self.stack[self.index]
|
|
|
|
self.index = self.index + 1
|
|
|
|
return s
|
|
|
|
raise StopIteration
|
|
|
|
|
|
|
|
def __init__ (self):
|
|
|
|
self.stack = []
|
|
|
|
|
|
|
|
def __len__ (self):
|
|
|
|
return len(self.stack)
|
|
|
|
|
|
|
|
def __getitem__ (self, i):
|
2003-09-02 01:17:58 +02:00
|
|
|
return self.stack[i]
|
2003-07-19 06:07:07 +02:00
|
|
|
|
|
|
|
def __iter__ (self):
|
|
|
|
return self.__stack_iter(self.stack)
|
|
|
|
|
|
|
|
def push(self, part):
|
|
|
|
self.stack.append(part)
|
|
|
|
|
|
|
|
def pop(self):
|
|
|
|
try:
|
|
|
|
return self.stack.pop()
|
|
|
|
except IndexError:
|
|
|
|
return 0
|
|
|
|
|
|
|
|
def tos(self):
|
|
|
|
try:
|
|
|
|
return self.stack[-1]
|
|
|
|
except IndexError:
|
|
|
|
return 0
|
|
|
|
|
|
|
|
def empty(self):
|
|
|
|
return (len(self.stack) == 0)
|
|
|
|
partstack = stack()
|
|
|
|
dirstack = stack()
|
|
|
|
|
2003-07-21 01:28:01 +02:00
|
|
|
class debug_info:
|
|
|
|
none = 0
|
|
|
|
gencode = 1
|
|
|
|
dumptree = 2
|
|
|
|
object = 3
|
|
|
|
dict = 4
|
|
|
|
statement = 5
|
|
|
|
dump = 6
|
2009-02-28 21:10:20 +01:00
|
|
|
gengraph = 7
|
2003-07-21 01:28:01 +02:00
|
|
|
|
|
|
|
def __init__(self, *level):
|
|
|
|
self.__level = level
|
|
|
|
|
|
|
|
def setdebug(self, *level):
|
|
|
|
self.__level = level
|
|
|
|
|
|
|
|
def level(self, level):
|
|
|
|
return level in self.__level
|
|
|
|
|
|
|
|
def info(self, level, str):
|
|
|
|
if level in self.__level:
|
|
|
|
print str
|
|
|
|
|
|
|
|
global debug
|
2009-02-28 21:10:20 +01:00
|
|
|
debug = debug_info(debug_info.dumptree)
|
|
|
|
debug = debug_info(debug_info.object)
|
2003-07-21 01:28:01 +02:00
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
# Error Handling
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
class location:
|
2003-07-19 06:19:48 +02:00
|
|
|
"""Used to keep track of our current location while parsing
|
|
|
|
configuration files"""
|
2003-07-19 06:07:07 +02:00
|
|
|
class __place:
|
2003-06-14 17:07:02 +02:00
|
|
|
def __init__(self, file, line, command):
|
|
|
|
self.file = file
|
|
|
|
self.line = line
|
|
|
|
self.command = command
|
|
|
|
def next_line(self, command):
|
|
|
|
self.line = self.line + 1
|
|
|
|
self.command = command
|
|
|
|
def at(self):
|
|
|
|
return "%s:%d" % (self.file, self.line)
|
|
|
|
|
|
|
|
def __init__ (self):
|
2003-07-19 06:07:07 +02:00
|
|
|
self.stack = stack()
|
|
|
|
|
|
|
|
def __str__ (self):
|
|
|
|
s = ''
|
|
|
|
for p in self.stack:
|
|
|
|
if (s == ''):
|
|
|
|
s = p.at()
|
|
|
|
else:
|
|
|
|
s = s + '\n' + p.at()
|
|
|
|
return s
|
2003-06-14 17:07:02 +02:00
|
|
|
|
|
|
|
def file(self):
|
2003-07-19 06:07:07 +02:00
|
|
|
return self.stack.tos().file
|
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
def line(self):
|
2003-07-19 06:07:07 +02:00
|
|
|
return self.stack.tos().line
|
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
def command(self):
|
2003-07-19 06:07:07 +02:00
|
|
|
return self.stack.tos().command
|
|
|
|
|
|
|
|
def push(self, file):
|
|
|
|
self.stack.push(self.__place(os.path.normpath(file), 0, ""))
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-07-19 06:07:07 +02:00
|
|
|
def pop(self):
|
2003-06-14 17:07:02 +02:00
|
|
|
self.stack.pop()
|
2003-07-19 06:07:07 +02:00
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
def next_line(self, command):
|
2003-07-19 06:07:07 +02:00
|
|
|
self.stack.tos().next_line(command)
|
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
def at(self):
|
2003-07-19 06:07:07 +02:00
|
|
|
return self.stack.tos().at()
|
2003-06-14 17:07:02 +02:00
|
|
|
loc = location()
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def error(string):
|
2003-07-19 06:19:48 +02:00
|
|
|
"""Print error message"""
|
2003-07-18 00:25:53 +02:00
|
|
|
global errors, loc
|
|
|
|
errors = errors + 1
|
2003-07-19 06:07:07 +02:00
|
|
|
print "===> ERROR: %s" % string
|
2004-10-14 18:25:01 +02:00
|
|
|
print "%s" % loc
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
def fatal(string):
|
2003-07-19 06:19:48 +02:00
|
|
|
"""Print error message and exit"""
|
2003-07-18 00:25:53 +02:00
|
|
|
error(string)
|
|
|
|
exitiferrors()
|
|
|
|
|
|
|
|
def warning(string):
|
2003-07-19 06:19:48 +02:00
|
|
|
"""Print warning message"""
|
2003-07-18 00:25:53 +02:00
|
|
|
global warnings, loc
|
|
|
|
warnings = warnings + 1
|
2003-08-05 18:35:34 +02:00
|
|
|
print "===> WARNING: %s" % string
|
2003-11-05 19:55:44 +01:00
|
|
|
|
|
|
|
def notice(string):
|
|
|
|
"""Print notice message"""
|
2006-05-02 14:05:13 +02:00
|
|
|
#print "===> NOTE: %s" % string
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
def exitiferrors():
|
2003-07-19 06:19:48 +02:00
|
|
|
"""Exit parser if an error has been encountered"""
|
2003-07-18 00:25:53 +02:00
|
|
|
if (errors != 0):
|
|
|
|
sys.exit(1)
|
|
|
|
|
2003-07-25 19:29:13 +02:00
|
|
|
def safe_open(file, mode):
|
|
|
|
try:
|
|
|
|
return open(file, mode)
|
|
|
|
except IOError:
|
|
|
|
fatal("Could not open file \"%s\"" % file)
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
# Main classes
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
class romimage:
|
2008-01-18 16:08:58 +01:00
|
|
|
"""A rom image is the ultimate goal of coreboot"""
|
2003-07-18 00:25:53 +02:00
|
|
|
def __init__ (self, name):
|
2003-07-28 23:35:14 +02:00
|
|
|
# name of this rom image
|
2003-07-18 00:25:53 +02:00
|
|
|
self.name = name
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# set by 'arch' directive
|
2003-07-18 00:25:53 +02:00
|
|
|
self.arch = ''
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# set by 'payload' directive
|
2003-07-18 00:25:53 +02:00
|
|
|
self.payload = ''
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# set by 'init' directive
|
2003-07-18 00:25:53 +02:00
|
|
|
self.initfile = ''
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# make rules added by 'makerule' directive
|
2003-07-18 00:25:53 +02:00
|
|
|
self.makebaserules = {}
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# object files added by 'object' directive
|
2003-07-18 00:25:53 +02:00
|
|
|
self.objectrules = {}
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# init object files added by 'initobject' directive
|
2003-07-18 00:25:53 +02:00
|
|
|
self.initobjectrules = {}
|
2003-07-28 23:35:14 +02:00
|
|
|
|
2008-08-01 13:20:09 +02:00
|
|
|
# driver files added by 'driver' directive
|
2003-07-18 00:25:53 +02:00
|
|
|
self.driverrules = {}
|
2003-07-28 23:35:14 +02:00
|
|
|
|
2009-01-19 22:20:22 +01:00
|
|
|
# smm object files added by 'smmobject' directive
|
|
|
|
self.smmobjectrules = {}
|
|
|
|
|
2003-07-28 23:35:14 +02:00
|
|
|
# loader scripts added by 'ldscript' directive
|
2003-07-18 00:25:53 +02:00
|
|
|
self.ldscripts = []
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# user defines added by 'makedefine' directive
|
2003-07-18 00:25:53 +02:00
|
|
|
self.userdefines = []
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# files to be included in crt0.S
|
2003-07-18 00:25:53 +02:00
|
|
|
self.initincludes = {}
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# as above, but order is preserved
|
|
|
|
self.initincludesorder = []
|
|
|
|
|
|
|
|
# transitional flag to support old crtinclude format
|
|
|
|
self.useinitincludes = 0
|
|
|
|
|
|
|
|
# instance counter for parts
|
2003-07-18 00:25:53 +02:00
|
|
|
self.partinstance = 0
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# chip config files included by the 'config' directive
|
|
|
|
self.configincludes = {}
|
|
|
|
|
|
|
|
# root of part tree
|
2003-07-18 00:25:53 +02:00
|
|
|
self.root = 0
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# name of target directory specified by 'target' directive
|
2003-07-18 00:25:53 +02:00
|
|
|
self.target_dir = ''
|
2003-07-28 23:35:14 +02:00
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
# option values used in rom image
|
2003-07-28 23:35:14 +02:00
|
|
|
self.values = {}
|
2003-07-18 00:25:53 +02:00
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
# exported options
|
|
|
|
self.exported_options = []
|
|
|
|
|
2004-10-16 08:20:29 +02:00
|
|
|
# Last device built
|
|
|
|
self.last_device = 0
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def getname(self):
|
|
|
|
return self.name
|
|
|
|
|
2003-07-18 03:06:15 +02:00
|
|
|
def getvalues(self):
|
|
|
|
return self.values
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def setarch(self, arch):
|
|
|
|
self.arch = arch
|
|
|
|
|
|
|
|
def setpayload(self, payload):
|
2009-04-03 14:52:43 +02:00
|
|
|
global rommapping
|
2003-07-18 00:25:53 +02:00
|
|
|
self.payload = payload
|
|
|
|
|
2009-04-03 14:52:43 +02:00
|
|
|
rommapping[self.name] = payload
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def setinitfile(self, initfile):
|
|
|
|
self.initfile = initfile
|
|
|
|
|
|
|
|
def getinitfile(self):
|
|
|
|
return self.initfile
|
|
|
|
|
|
|
|
def addmakerule(self, id):
|
|
|
|
o = getdict(self.makebaserules, id)
|
|
|
|
if (o):
|
2003-08-05 18:35:34 +02:00
|
|
|
warning("rule %s previously defined" % id)
|
2003-07-18 00:25:53 +02:00
|
|
|
o = makerule(id)
|
|
|
|
setdict(self.makebaserules, id, o)
|
|
|
|
|
|
|
|
def getmakerules(self):
|
|
|
|
return self.makebaserules
|
|
|
|
|
|
|
|
def getmakerule(self, id):
|
|
|
|
o = getdict(self.makebaserules, id)
|
|
|
|
if (o):
|
|
|
|
return o
|
2004-03-23 18:37:02 +01:00
|
|
|
fatal("No such make rule \"%s\"" % id)
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
def addmakeaction(self, id, str):
|
|
|
|
o = getdict(self.makebaserules, id)
|
|
|
|
if (o):
|
|
|
|
a = dequote(str)
|
|
|
|
o.addaction(a)
|
|
|
|
return
|
2004-03-23 18:37:02 +01:00
|
|
|
fatal("No such rule \"%s\" for addmakeaction" % id)
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
def addmakedepend(self, id, str):
|
|
|
|
o = getdict(self.makebaserules, id)
|
|
|
|
if (o):
|
|
|
|
a = dequote(str)
|
|
|
|
o.adddependency(a)
|
|
|
|
return
|
2004-03-23 18:37:02 +01:00
|
|
|
fatal("No such rule \"%s\" for addmakedepend" % id)
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
# this is called with an an object name.
|
|
|
|
# the easiest thing to do is add this object to the current
|
|
|
|
# component.
|
|
|
|
# such kludgery. If the name starts with '.' then make the
|
|
|
|
# dependency be on ./thing.x gag me.
|
|
|
|
def addobjectdriver(self, dict, object_name):
|
2003-07-19 06:07:07 +02:00
|
|
|
global dirstack
|
2003-07-18 00:25:53 +02:00
|
|
|
suffix = object_name[-2:]
|
|
|
|
if (suffix == '.o'):
|
|
|
|
suffix = '.c'
|
|
|
|
base = object_name[:-2]
|
2003-07-23 05:11:40 +02:00
|
|
|
type = object_name[-1:]
|
2003-07-18 00:25:53 +02:00
|
|
|
if (object_name[0] == '.'):
|
|
|
|
source = base + suffix
|
2009-02-28 13:50:32 +01:00
|
|
|
object = base + '.o'
|
2009-02-28 18:09:29 +01:00
|
|
|
rel_base = base
|
2003-07-18 00:25:53 +02:00
|
|
|
else:
|
2009-02-28 13:50:32 +01:00
|
|
|
rel_base = re.sub(treetop, "", os.path.join(dirstack.tos(), base))
|
|
|
|
source = "$(TOP)/" + rel_base + suffix
|
|
|
|
if (rel_base[0] == '/'):
|
|
|
|
rel_base = re.sub("^/", "", rel_base)
|
|
|
|
object = rel_base + '.o'
|
|
|
|
|
2009-02-28 18:09:29 +01:00
|
|
|
debug.info(debug.object, "add object %s source %s" % (object, source))
|
|
|
|
l = getdict(dict, rel_base)
|
2003-07-18 00:25:53 +02:00
|
|
|
if (l):
|
2009-02-28 18:09:29 +01:00
|
|
|
warning("object/driver %s previously defined" % rel_base)
|
|
|
|
setdict(dict, rel_base, [object, source, type, rel_base])
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
def addinitobjectrule(self, name):
|
|
|
|
self.addobjectdriver(self.initobjectrules, name)
|
|
|
|
|
|
|
|
def addobjectrule(self, name):
|
|
|
|
self.addobjectdriver(self.objectrules, name)
|
|
|
|
|
|
|
|
def adddriverrule(self, name):
|
|
|
|
self.addobjectdriver(self.driverrules, name)
|
|
|
|
|
2009-01-19 22:20:22 +01:00
|
|
|
def addsmmobjectrule(self, name):
|
|
|
|
self.addobjectdriver(self.smmobjectrules, name)
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def getinitobjectrules(self):
|
|
|
|
return self.initobjectrules
|
|
|
|
|
|
|
|
def getinitobjectrule(self, name):
|
|
|
|
o = getdict(self.initobjectrules, name)
|
|
|
|
if (o):
|
|
|
|
return o
|
2004-03-23 18:37:02 +01:00
|
|
|
fatal("No such init object rule \"%s\"" % name)
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
def getobjectrules(self):
|
|
|
|
return self.objectrules
|
|
|
|
|
|
|
|
def getobjectrule(self, name):
|
|
|
|
o = getdict(self.objectrules, name)
|
|
|
|
if (o):
|
|
|
|
return o
|
2004-03-23 18:37:02 +01:00
|
|
|
fatal("No such object rule \"%s\"" % name)
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
def getdriverrules(self):
|
|
|
|
return self.driverrules
|
|
|
|
|
|
|
|
def getdriverrule(self, name):
|
|
|
|
o = getdict(self.driverrules, name)
|
|
|
|
if (o):
|
|
|
|
return o
|
2004-03-23 18:37:02 +01:00
|
|
|
fatal("No such driver rule \"%s\"" % name)
|
2003-07-18 00:25:53 +02:00
|
|
|
|
2009-01-19 22:20:22 +01:00
|
|
|
def getsmmobjectrules(self):
|
|
|
|
return self.smmobjectrules
|
|
|
|
|
|
|
|
def getsmmobjectrule(self, name):
|
|
|
|
o = getdict(self.smmobjectrules, name)
|
|
|
|
if (o):
|
|
|
|
return o
|
|
|
|
fatal("No such smm object rule \"%s\"" % name)
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def addldscript(self, path):
|
|
|
|
self.ldscripts.append(path)
|
|
|
|
|
|
|
|
def getldscripts(self):
|
|
|
|
return self.ldscripts
|
|
|
|
|
|
|
|
def adduserdefine(self, str):
|
|
|
|
self.userdefines.append(str)
|
|
|
|
|
|
|
|
def getuserdefines(self):
|
|
|
|
return self.userdefines
|
|
|
|
|
|
|
|
def addinitinclude(self, str, path):
|
|
|
|
if (str != 0):
|
|
|
|
self.useinitincludes = 1
|
|
|
|
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.object, "ADDCRT0: %s -> %s" % (str, path))
|
2003-07-18 00:25:53 +02:00
|
|
|
o = getdict(self.initincludes, path)
|
|
|
|
if (o):
|
2003-11-05 19:55:44 +01:00
|
|
|
warning("init include for %s previously defined" % path)
|
2003-07-18 00:25:53 +02:00
|
|
|
o = initinclude(str, path)
|
|
|
|
setdict(self.initincludes, path, o)
|
2003-07-21 18:51:40 +02:00
|
|
|
self.initincludesorder.append(path)
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
def getinitincludes(self):
|
2003-07-21 18:51:40 +02:00
|
|
|
return self.initincludesorder
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
def getinitinclude(self, path):
|
|
|
|
o = getdict(self.initincludes, path)
|
|
|
|
if (o):
|
|
|
|
return o
|
2004-03-23 18:37:02 +01:00
|
|
|
fatal("No such init include \"%s\"" % path)
|
2003-07-18 00:25:53 +02:00
|
|
|
|
2003-07-28 23:35:14 +02:00
|
|
|
def addconfiginclude(self, part, path):
|
|
|
|
setdict(self.configincludes, part, path)
|
|
|
|
|
|
|
|
def getconfigincludes(self):
|
|
|
|
return self.configincludes
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def getincludefilename(self):
|
|
|
|
if (self.useinitincludes):
|
|
|
|
return "crt0.S"
|
|
|
|
else:
|
2003-07-21 18:22:17 +02:00
|
|
|
return "crt0_includes.h"
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
def newformat(self):
|
|
|
|
return self.useinitincludes
|
|
|
|
|
2003-07-19 06:07:07 +02:00
|
|
|
def numparts(self):
|
2003-07-18 00:25:53 +02:00
|
|
|
return self.partinstance
|
|
|
|
|
2003-07-19 06:07:07 +02:00
|
|
|
def newpartinstance(self):
|
|
|
|
i = self.partinstance
|
|
|
|
self.partinstance = self.partinstance + 1
|
|
|
|
return i
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def setroot(self, part):
|
|
|
|
self.root = part
|
|
|
|
|
|
|
|
def getroot(self):
|
|
|
|
return self.root
|
|
|
|
|
|
|
|
def settargetdir(self, path):
|
|
|
|
self.targetdir = path
|
|
|
|
|
|
|
|
def gettargetdir(self):
|
|
|
|
return self.targetdir
|
|
|
|
|
|
|
|
class buildrom:
|
2003-07-19 06:19:48 +02:00
|
|
|
"""A buildrom statement"""
|
2003-09-17 14:17:58 +02:00
|
|
|
def __init__ (self, filename, size, roms):
|
|
|
|
self.name = filename
|
2003-07-18 00:25:53 +02:00
|
|
|
self.size = size
|
|
|
|
self.roms = roms
|
2003-09-17 14:17:58 +02:00
|
|
|
|
|
|
|
def __len__ (self):
|
|
|
|
return len(self.roms)
|
|
|
|
|
|
|
|
def __getitem__(self,i):
|
|
|
|
return self.roms[i]
|
2003-07-18 00:25:53 +02:00
|
|
|
|
2003-07-14 20:00:10 +02:00
|
|
|
class initinclude:
|
2003-07-19 06:19:48 +02:00
|
|
|
"""include file for initialization code"""
|
2003-07-14 20:00:10 +02:00
|
|
|
def __init__ (self, str, path):
|
|
|
|
self.string = str
|
|
|
|
self.path = path
|
|
|
|
|
|
|
|
def getstring(self):
|
|
|
|
return self.string
|
|
|
|
|
|
|
|
def getpath(self):
|
|
|
|
return self.path
|
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
class makerule:
|
2003-07-19 06:19:48 +02:00
|
|
|
"""Rule to be included in Makefile"""
|
2003-06-14 17:07:02 +02:00
|
|
|
def __init__ (self, target):
|
|
|
|
self.target = target
|
|
|
|
self.dependency = []
|
|
|
|
self.actions = []
|
|
|
|
|
|
|
|
def addaction(self, action):
|
|
|
|
self.actions.append(action)
|
|
|
|
|
|
|
|
def adddependency(self, dependency):
|
|
|
|
self.dependency.append(dependency)
|
|
|
|
|
|
|
|
def gtarget(self):
|
|
|
|
return self.target
|
|
|
|
|
|
|
|
def gdependency(self):
|
|
|
|
return self.dependency
|
|
|
|
|
|
|
|
def gaction(self):
|
|
|
|
return self.actions
|
|
|
|
|
|
|
|
class option:
|
2003-07-19 06:19:48 +02:00
|
|
|
"""Configuration option"""
|
2003-06-14 17:07:02 +02:00
|
|
|
def __init__ (self, name):
|
2003-06-23 18:54:12 +02:00
|
|
|
self.name = name # name of option
|
|
|
|
self.loc = 0 # current location
|
2004-02-04 10:11:51 +01:00
|
|
|
self.used = 0 # option has been used
|
2003-06-23 18:54:12 +02:00
|
|
|
# it is undefined)
|
|
|
|
self.comment = '' # description of option
|
2003-06-24 01:52:15 +02:00
|
|
|
self.exportable = 0 # option is able to be exported
|
2003-06-23 18:54:12 +02:00
|
|
|
self.format = '%s' # option print format
|
2003-11-05 19:55:44 +01:00
|
|
|
self.write = [] # parts that can set this option
|
2003-06-14 17:07:02 +02:00
|
|
|
|
|
|
|
def where(self):
|
|
|
|
return self.loc
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def setcomment(self, comment, loc):
|
2003-06-23 18:54:12 +02:00
|
|
|
if (self.comment != ''):
|
|
|
|
print "%s: " % self.name
|
|
|
|
print "Attempt to modify comment at %s" % loc
|
|
|
|
return
|
2003-07-18 00:25:53 +02:00
|
|
|
self.comment = comment
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-06-24 01:52:15 +02:00
|
|
|
def setexportable(self):
|
|
|
|
self.exportable = 1
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
def setnoexport(self):
|
2003-06-24 01:52:15 +02:00
|
|
|
self.exportable = 0
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
def setformat(self, fmt):
|
|
|
|
self.format = fmt
|
|
|
|
|
|
|
|
def getformat(self):
|
|
|
|
return self.format
|
|
|
|
|
2004-10-14 18:25:01 +02:00
|
|
|
def setused(self):
|
|
|
|
if (self.exportable):
|
|
|
|
self.exported = 1
|
|
|
|
self.used = 1
|
|
|
|
|
2003-11-05 19:55:44 +01:00
|
|
|
def setwrite(self, part):
|
|
|
|
self.write.append(part)
|
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
def isexportable(self):
|
|
|
|
return self.exportable
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-11-05 19:55:44 +01:00
|
|
|
def iswritable(self, part):
|
|
|
|
return (part in self.write)
|
2003-06-24 01:52:15 +02:00
|
|
|
|
2003-07-18 03:06:15 +02:00
|
|
|
class option_value:
|
2004-02-04 10:11:51 +01:00
|
|
|
"""Value of a configuration option. The option has a default
|
|
|
|
value which can be changed at any time. Once an option has been
|
|
|
|
set the default value is no longer used."""
|
|
|
|
def __init__(self, name, prev):
|
|
|
|
self.name = name
|
|
|
|
self.value = ''
|
|
|
|
self.set = 0
|
|
|
|
if (prev):
|
|
|
|
self.value = prev.value
|
|
|
|
self.set = prev.set
|
|
|
|
|
|
|
|
|
|
|
|
def setvalue(self, value):
|
|
|
|
if ((self.set & 2) == 2):
|
|
|
|
warning("Changing option %s" % self.name)
|
|
|
|
else:
|
|
|
|
self.set |= 2
|
2003-07-18 03:06:15 +02:00
|
|
|
self.value = value
|
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
def setdefault(self, value):
|
|
|
|
if ((self.set & 1) == 1):
|
|
|
|
notice("Changing default value of %s" % self.name)
|
|
|
|
|
|
|
|
if ((self.set & 2) == 0):
|
|
|
|
self.value = value
|
|
|
|
self.set |= 1
|
|
|
|
|
2003-07-18 03:06:15 +02:00
|
|
|
def contents(self):
|
|
|
|
return self.value
|
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
def isset(self):
|
|
|
|
return (self.set & 2) == 2
|
|
|
|
|
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
class partobj:
|
2003-07-19 06:19:48 +02:00
|
|
|
"""A configuration part"""
|
2004-10-16 21:58:35 +02:00
|
|
|
def __init__ (self, image, dir, parent, part, type_name, instance_name, chip_or_device):
|
2003-07-28 23:35:14 +02:00
|
|
|
debug.info(debug.object, "partobj dir %s parent %s part %s" \
|
|
|
|
% (dir, parent, part))
|
|
|
|
|
|
|
|
# romimage that is configuring this part
|
2003-07-18 00:25:53 +02:00
|
|
|
self.image = image
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# links for static device tree
|
2003-07-10 14:38:39 +02:00
|
|
|
self.children = 0
|
2004-10-16 21:58:35 +02:00
|
|
|
self.prev_sibling = 0
|
|
|
|
self.next_sibling = 0
|
|
|
|
self.prev_device = 0
|
2004-10-16 08:20:29 +02:00
|
|
|
self.next_device = 0
|
2004-10-14 23:57:29 +02:00
|
|
|
self.chip_or_device = chip_or_device
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# list of init code files
|
2003-06-14 17:07:02 +02:00
|
|
|
self.initcode = []
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# initializers for static device tree
|
2003-07-23 20:13:19 +02:00
|
|
|
self.registercode = {}
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# part name
|
|
|
|
self.part = part
|
|
|
|
|
|
|
|
# type name of this part
|
|
|
|
self.type_name = type_name
|
|
|
|
|
|
|
|
# object files needed to build this part
|
2003-06-14 17:07:02 +02:00
|
|
|
self.objects = []
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# directory containg part files
|
2003-06-14 17:07:02 +02:00
|
|
|
self.dir = dir
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# instance number, used to distinguish anonymous
|
|
|
|
# instances of this part
|
2003-07-19 06:07:07 +02:00
|
|
|
self.instance = image.newpartinstance()
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.object, "INSTANCE %d" % self.instance)
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# Options used by this part
|
2003-07-18 00:25:53 +02:00
|
|
|
self.uses_options = {}
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# Name of chip config file (0 if not needed)
|
2003-07-23 20:13:19 +02:00
|
|
|
self.chipconfig = 0
|
2003-07-28 23:35:14 +02:00
|
|
|
|
|
|
|
# Flag to indicate that we have generated type
|
|
|
|
# definitions for this part (only want to do it once)
|
|
|
|
self.done_types = 0
|
|
|
|
|
2003-09-02 01:17:58 +02:00
|
|
|
# Path to the device
|
|
|
|
self.path = ""
|
2003-10-11 08:20:25 +02:00
|
|
|
|
2004-10-16 04:48:37 +02:00
|
|
|
# Resources of the device
|
|
|
|
self.resoruce = ""
|
|
|
|
self.resources = 0
|
|
|
|
|
|
|
|
# Enabled state of the device
|
|
|
|
self.enabled = 1
|
|
|
|
|
2004-10-16 21:58:35 +02:00
|
|
|
# Flag if I am a dumplicate device
|
|
|
|
self.dup = 0
|
|
|
|
|
2003-07-28 23:35:14 +02:00
|
|
|
# If no instance name is supplied then generate
|
|
|
|
# a unique name
|
|
|
|
if (instance_name == 0):
|
|
|
|
self.instance_name = self.type_name + \
|
|
|
|
"_dev%d" % self.instance
|
2004-10-15 21:17:43 +02:00
|
|
|
self.chipinfo_name = "%s_info_%d" \
|
2003-07-28 23:35:14 +02:00
|
|
|
% (self.type_name, self.instance)
|
|
|
|
else:
|
|
|
|
self.instance_name = instance_name
|
2004-10-16 04:48:37 +02:00
|
|
|
self.chipinfo_name = "%s_info_%d" % (self.instance_name, self.instance)
|
2004-10-16 21:58:35 +02:00
|
|
|
|
2004-10-16 08:20:29 +02:00
|
|
|
# Link this part into the device list
|
|
|
|
if (self.chip_or_device == 'device'):
|
|
|
|
if (image.last_device):
|
|
|
|
image.last_device.next_device = self
|
2004-10-16 21:58:35 +02:00
|
|
|
self.prev_device = image.last_device
|
2004-10-16 08:20:29 +02:00
|
|
|
image.last_device = self
|
|
|
|
|
2003-07-28 23:35:14 +02:00
|
|
|
# Link this part into the tree
|
2004-10-14 18:25:01 +02:00
|
|
|
if (parent and (part != 'arch')):
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.gencode, "add to parent")
|
2003-06-14 17:07:02 +02:00
|
|
|
self.parent = parent
|
2003-07-10 14:38:39 +02:00
|
|
|
# add current child as my sibling,
|
|
|
|
# me as the child.
|
2003-07-19 06:07:07 +02:00
|
|
|
if (parent.children):
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.gencode, "add %s (%d) as sibling" % (parent.children.dir, parent.children.instance))
|
2004-03-23 18:37:02 +01:00
|
|
|
youngest = parent.children
|
2004-10-16 21:58:35 +02:00
|
|
|
while(youngest.next_sibling):
|
|
|
|
youngest = youngest.next_sibling
|
|
|
|
youngest.next_sibling = self
|
|
|
|
self.prev_sibling = youngest
|
2003-09-02 01:17:58 +02:00
|
|
|
else:
|
|
|
|
parent.children = self
|
2003-06-14 17:07:02 +02:00
|
|
|
else:
|
|
|
|
self.parent = self
|
|
|
|
|
2004-10-16 21:58:35 +02:00
|
|
|
|
2004-10-14 23:57:29 +02:00
|
|
|
def info(self):
|
|
|
|
return "%s: %s" % (self.part, self.type)
|
|
|
|
def type(self):
|
|
|
|
return self.chip_or_device
|
|
|
|
|
2004-10-16 21:58:35 +02:00
|
|
|
def readable_name(self):
|
|
|
|
name = ""
|
|
|
|
name = "%s_%d" % (self.type_name, self.instance)
|
|
|
|
if (self.chip_or_device == 'chip'):
|
|
|
|
name = "%s %s %s" % (name, self.part, self.dir)
|
|
|
|
else:
|
|
|
|
name = "%s %s" % (name, self.path)
|
|
|
|
return name
|
2009-02-28 21:10:20 +01:00
|
|
|
|
|
|
|
def graph_name(self):
|
|
|
|
name = "{ {_dev%d|" % self.instance
|
|
|
|
if (self.part):
|
|
|
|
name = "%s%s" % (name, self.part)
|
|
|
|
else:
|
|
|
|
name = "%s%s" % (name, self.chip_or_device)
|
|
|
|
if (self.type_name):
|
|
|
|
name = "%s}|%s}" % (name, self.type_name)
|
|
|
|
else:
|
|
|
|
name = "%s}|%s}" % (name, self.parent.type_name)
|
|
|
|
return name
|
2004-10-16 21:58:35 +02:00
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
def dumpme(self, lvl):
|
2003-07-28 23:35:14 +02:00
|
|
|
"""Dump information about this part for debugging"""
|
2004-10-16 21:58:35 +02:00
|
|
|
print "%d: %s" % (lvl, self.readable_name())
|
2003-07-28 23:35:14 +02:00
|
|
|
print "%d: part %s" % (lvl, self.part)
|
2003-07-10 16:46:59 +02:00
|
|
|
print "%d: instance %d" % (lvl, self.instance)
|
2004-10-16 21:58:35 +02:00
|
|
|
print "%d: chip_or_device %s" % (lvl, self.chip_or_device)
|
2003-06-14 17:07:02 +02:00
|
|
|
print "%d: dir %s" % (lvl,self.dir)
|
2004-10-15 21:17:43 +02:00
|
|
|
print "%d: type_name %s" % (lvl,self.type_name)
|
2004-10-16 21:58:35 +02:00
|
|
|
print "%d: parent: %s" % (lvl, self.parent.readable_name())
|
2003-07-10 16:46:59 +02:00
|
|
|
if (self.children):
|
2004-10-16 21:58:35 +02:00
|
|
|
print "%d: child %s" % (lvl, self.children.readable_name())
|
|
|
|
if (self.next_sibling):
|
|
|
|
print "%d: siblings %s" % (lvl, self.next_sibling.readable_name())
|
2003-06-14 17:07:02 +02:00
|
|
|
print "%d: initcode " % lvl
|
|
|
|
for i in self.initcode:
|
2003-09-02 01:17:58 +02:00
|
|
|
print "\t%s" % i
|
2003-06-14 17:07:02 +02:00
|
|
|
print "%d: registercode " % lvl
|
2003-07-23 20:13:19 +02:00
|
|
|
for f, v in self.registercode.items():
|
2003-09-02 01:17:58 +02:00
|
|
|
print "\t%s = %s" % (f, v)
|
2003-07-10 16:46:59 +02:00
|
|
|
print "\n"
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2004-10-15 21:17:43 +02:00
|
|
|
def firstchilddevice(self):
|
|
|
|
"""Find the first device in the children link."""
|
|
|
|
kid = self.children
|
|
|
|
while (kid):
|
|
|
|
if (kid.chip_or_device == 'device'):
|
|
|
|
return kid
|
|
|
|
else:
|
|
|
|
kid = kid.children
|
|
|
|
return 0
|
|
|
|
|
|
|
|
def firstparentdevice(self):
|
|
|
|
"""Find the first device in the parent link."""
|
|
|
|
parent = self.parent
|
2004-10-16 21:58:35 +02:00
|
|
|
while (parent and (parent.parent != parent) and (parent.chip_or_device != 'device')):
|
|
|
|
parent = parent.parent
|
|
|
|
if ((parent.parent != parent) and (parent.chip_or_device != 'device')):
|
|
|
|
parent = 0
|
|
|
|
while(parent and (parent.dup == 1)):
|
|
|
|
parent = parent.prev_sibling
|
|
|
|
if (not parent):
|
|
|
|
fatal("Device %s has no device parent; this is a config file error" % self.readable_name())
|
|
|
|
return parent
|
2004-10-15 21:17:43 +02:00
|
|
|
|
2004-10-18 23:21:06 +02:00
|
|
|
def firstparentdevicelink(self):
|
|
|
|
"""Find the first device in the parent link and record which link it is."""
|
|
|
|
link = 0
|
|
|
|
parent = self.parent
|
|
|
|
while (parent and (parent.parent != parent) and (parent.chip_or_device != 'device')):
|
|
|
|
parent = parent.parent
|
|
|
|
if ((parent.parent != parent) and (parent.chip_or_device != 'device')):
|
|
|
|
parent = 0
|
|
|
|
while(parent and (parent.dup == 1)):
|
|
|
|
parent = parent.prev_sibling
|
|
|
|
link = link + 1
|
|
|
|
if (not parent):
|
|
|
|
fatal("Device %s has no device parent; this is a config file error" % self.readable_name())
|
|
|
|
return link
|
|
|
|
|
|
|
|
|
2004-10-15 21:17:43 +02:00
|
|
|
def firstparentchip(self):
|
|
|
|
"""Find the first chip in the parent link."""
|
|
|
|
parent = self.parent
|
|
|
|
while (parent):
|
|
|
|
if ((parent.parent == parent) or (parent.chip_or_device == 'chip')):
|
|
|
|
return parent
|
|
|
|
else:
|
|
|
|
parent = parent.parent
|
2004-10-16 21:58:35 +02:00
|
|
|
fatal("Device %s has no chip parent; this is a config file error" % self.readable_name())
|
2004-10-15 21:17:43 +02:00
|
|
|
|
2004-10-16 04:48:37 +02:00
|
|
|
def firstsiblingdevice(self):
|
|
|
|
"""Find the first device in the sibling link."""
|
2004-10-16 21:58:35 +02:00
|
|
|
sibling = self.next_sibling
|
|
|
|
while(sibling and (sibling.path == self.path)):
|
|
|
|
sibling = sibling.next_sibling
|
2004-10-16 10:38:58 +02:00
|
|
|
if ((not sibling) and (self.parent.chip_or_device == 'chip')):
|
2004-10-16 21:58:35 +02:00
|
|
|
sibling = self.parent.next_sibling
|
2004-10-16 04:48:37 +02:00
|
|
|
while(sibling):
|
|
|
|
if (sibling.chip_or_device == 'device'):
|
|
|
|
return sibling
|
|
|
|
else:
|
|
|
|
sibling = sibling.children
|
2004-10-16 21:58:35 +02:00
|
|
|
return 0
|
2004-10-15 21:17:43 +02:00
|
|
|
|
2003-07-28 23:35:14 +02:00
|
|
|
def gencode(self, file, pass_num):
|
|
|
|
"""Generate static initalizer code for this part. Two passes
|
|
|
|
are used - the first generates type information, and the second
|
|
|
|
generates instance information"""
|
|
|
|
if (pass_num == 0):
|
2004-10-15 21:17:43 +02:00
|
|
|
if (self.chip_or_device == 'chip'):
|
|
|
|
return;
|
2003-07-28 23:35:14 +02:00
|
|
|
else:
|
2004-10-15 21:17:43 +02:00
|
|
|
if (self.instance):
|
|
|
|
file.write("struct device %s;\n" \
|
|
|
|
% self.instance_name)
|
|
|
|
else:
|
|
|
|
file.write("struct device dev_root;\n")
|
2003-07-28 23:35:14 +02:00
|
|
|
return
|
2004-10-15 21:17:43 +02:00
|
|
|
# This is pass the second, which is pass number 1
|
|
|
|
# this is really just a case statement ...
|
2004-10-16 21:58:35 +02:00
|
|
|
|
|
|
|
if (self.chip_or_device == 'chip'):
|
|
|
|
if (self.chipconfig):
|
|
|
|
debug.info(debug.gencode, "gencode: chipconfig(%d)" % \
|
2004-10-15 21:17:43 +02:00
|
|
|
self.instance)
|
2004-10-16 21:58:35 +02:00
|
|
|
file.write("struct %s_config %s" % (self.type_name ,\
|
2004-10-15 21:17:43 +02:00
|
|
|
self.chipinfo_name))
|
2004-10-16 21:58:35 +02:00
|
|
|
if (self.registercode):
|
|
|
|
file.write("\t= {\n")
|
|
|
|
for f, v in self.registercode.items():
|
|
|
|
file.write( "\t.%s = %s,\n" % (f, v))
|
|
|
|
file.write("};\n")
|
|
|
|
else:
|
|
|
|
file.write(";")
|
|
|
|
file.write("\n")
|
|
|
|
|
|
|
|
if (self.instance == 0):
|
|
|
|
self.instance_name = "dev_root"
|
|
|
|
file.write("struct device **last_dev_p = &%s.next;\n" % (self.image.last_device.instance_name))
|
|
|
|
file.write("struct device dev_root = {\n")
|
|
|
|
file.write("\t.ops = &default_dev_ops_root,\n")
|
|
|
|
file.write("\t.bus = &dev_root.link[0],\n")
|
|
|
|
file.write("\t.path = { .type = DEVICE_PATH_ROOT },\n")
|
|
|
|
file.write("\t.enabled = 1,\n\t.links = 1,\n")
|
2004-10-21 12:44:08 +02:00
|
|
|
file.write("\t.on_mainboard = 1,\n")
|
2004-10-16 21:58:35 +02:00
|
|
|
file.write("\t.link = {\n\t\t[0] = {\n")
|
|
|
|
file.write("\t\t\t.dev=&dev_root,\n\t\t\t.link = 0,\n")
|
|
|
|
file.write("\t\t\t.children = &%s,\n" % self.firstchilddevice().instance_name)
|
|
|
|
file.write("\t\t},\n")
|
|
|
|
file.write("\t},\n")
|
|
|
|
if (self.chipconfig):
|
|
|
|
file.write("\t.chip_ops = &%s_ops,\n" % self.type_name)
|
|
|
|
file.write("\t.chip_info = &%s_info_%s,\n" % (self.type_name, self.instance))
|
|
|
|
file.write("\t.next = &%s,\n" % self.firstchilddevice().instance_name)
|
2004-10-15 21:17:43 +02:00
|
|
|
file.write("};\n")
|
|
|
|
return
|
2004-10-16 21:58:35 +02:00
|
|
|
|
|
|
|
# Don't print duplicate devices, just print their children
|
|
|
|
if (self.dup):
|
2004-10-15 21:17:43 +02:00
|
|
|
return
|
|
|
|
|
|
|
|
file.write("struct device %s = {\n" % self.instance_name)
|
|
|
|
file.write("\t.ops = 0,\n")
|
2004-10-18 23:21:06 +02:00
|
|
|
file.write("\t.bus = &%s.link[%d],\n" % \
|
|
|
|
(self.firstparentdevice().instance_name, \
|
|
|
|
self.firstparentdevicelink()))
|
2004-10-16 04:48:37 +02:00
|
|
|
file.write("\t.path = {%s},\n" % self.path)
|
|
|
|
file.write("\t.enabled = %d,\n" % self.enabled)
|
2004-10-21 12:44:08 +02:00
|
|
|
file.write("\t.on_mainboard = 1,\n")
|
2004-10-16 04:48:37 +02:00
|
|
|
if (self.resources):
|
|
|
|
file.write("\t.resources = %d,\n" % self.resources)
|
|
|
|
file.write("\t.resource = {%s\n\t },\n" % self.resource)
|
2004-10-16 21:58:35 +02:00
|
|
|
file.write("\t.link = {\n");
|
|
|
|
links = 0
|
|
|
|
bus = self
|
|
|
|
while(bus and (bus.path == self.path)):
|
|
|
|
child = bus.firstchilddevice()
|
|
|
|
if (child or (bus != self) or (bus.next_sibling and (bus.next_sibling.path == self.path))):
|
|
|
|
file.write("\t\t[%d] = {\n" % links)
|
|
|
|
file.write("\t\t\t.link = %d,\n" % links)
|
|
|
|
file.write("\t\t\t.dev = &%s,\n" % self.instance_name)
|
|
|
|
if (child):
|
|
|
|
file.write("\t\t\t.children = &%s,\n" %child.instance_name)
|
|
|
|
file.write("\t\t},\n")
|
|
|
|
links = links + 1
|
|
|
|
if (1):
|
|
|
|
bus = bus.next_sibling
|
|
|
|
else:
|
|
|
|
bus = 0
|
2004-10-15 21:17:43 +02:00
|
|
|
file.write("\t},\n")
|
2004-10-16 21:58:35 +02:00
|
|
|
file.write("\t.links = %d,\n" % (links))
|
|
|
|
sibling = self.firstsiblingdevice();
|
2004-10-16 04:48:37 +02:00
|
|
|
if (sibling):
|
|
|
|
file.write("\t.sibling = &%s,\n" % sibling.instance_name)
|
2004-10-16 08:20:29 +02:00
|
|
|
chip = self.firstparentchip()
|
|
|
|
if (chip and chip.chipconfig):
|
|
|
|
file.write("\t.chip_ops = &%s_ops,\n" % chip.type_name)
|
|
|
|
file.write("\t.chip_info = &%s_info_%s,\n" % (chip.type_name, chip.instance))
|
|
|
|
if (self.next_device):
|
|
|
|
file.write("\t.next=&%s\n" % self.next_device.instance_name)
|
2004-10-15 21:17:43 +02:00
|
|
|
file.write("};\n")
|
|
|
|
return
|
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
def addinit(self, code):
|
2003-07-28 23:35:14 +02:00
|
|
|
"""Add init file to this part"""
|
2003-06-14 17:07:02 +02:00
|
|
|
self.initcode.append(code)
|
|
|
|
|
2003-07-23 20:13:19 +02:00
|
|
|
def addconfig(self, path):
|
2003-07-28 23:35:14 +02:00
|
|
|
"""Add chip config file to this part"""
|
|
|
|
self.chipconfig = os.path.join(self.dir, path)
|
|
|
|
self.image.addconfiginclude(self.type_name, self.chipconfig)
|
2003-07-23 20:13:19 +02:00
|
|
|
|
|
|
|
def addregister(self, field, value):
|
2003-07-28 23:35:14 +02:00
|
|
|
"""Register static initialization information"""
|
2004-10-16 21:58:35 +02:00
|
|
|
if (self.chip_or_device != 'chip'):
|
|
|
|
fatal("Only chips can have register values")
|
2003-07-23 20:13:19 +02:00
|
|
|
field = dequote(field)
|
|
|
|
value = dequote(value)
|
|
|
|
setdict(self.registercode, field, value)
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2004-10-16 04:48:37 +02:00
|
|
|
def set_enabled(self, enabled):
|
|
|
|
self.enabled = enabled
|
|
|
|
|
2004-03-11 16:01:31 +01:00
|
|
|
def start_resources(self):
|
2004-10-16 04:48:37 +02:00
|
|
|
self.resource = ""
|
|
|
|
self.resources = 0
|
2004-03-11 16:01:31 +01:00
|
|
|
|
|
|
|
def end_resources(self):
|
2004-10-16 04:48:37 +02:00
|
|
|
self.resource = "%s" % (self.resource)
|
2004-03-11 16:01:31 +01:00
|
|
|
|
|
|
|
def add_resource(self, type, index, value):
|
|
|
|
""" Add a resource to a device """
|
2004-10-16 04:48:37 +02:00
|
|
|
self.resource = "%s\n\t\t{ .flags=%s, .index=0x%x, .base=0x%x}," % (self.resource, type, index, value)
|
|
|
|
self.resources = self.resources + 1
|
2004-10-16 21:58:35 +02:00
|
|
|
|
|
|
|
def set_path(self, path):
|
|
|
|
self.path = path
|
|
|
|
if (self.prev_sibling and (self.prev_sibling.path == self.path)):
|
|
|
|
self.dup = 1
|
|
|
|
if (self.prev_device):
|
|
|
|
self.prev_device.next_device = self.next_device
|
|
|
|
if (self.next_device):
|
|
|
|
self.next_device.prev_device = self.prev_device
|
|
|
|
if (self.image.last_device == self):
|
|
|
|
self.image.last_device = self.prev_device
|
|
|
|
self.prev_device = 0
|
|
|
|
self.next_device = 0
|
2004-03-11 16:01:31 +01:00
|
|
|
|
2004-10-16 04:48:37 +02:00
|
|
|
def addpcipath(self, slot, function):
|
2003-09-02 01:17:58 +02:00
|
|
|
""" Add a relative pci style path from our parent to this device """
|
|
|
|
if ((slot < 0) or (slot > 0x1f)):
|
|
|
|
fatal("Invalid device id")
|
|
|
|
if ((function < 0) or (function > 7)):
|
2005-12-02 22:52:30 +01:00
|
|
|
fatal("Invalid pci function %s" % function )
|
2009-02-28 21:10:20 +01:00
|
|
|
self.set_path(".type=DEVICE_PATH_PCI,{.pci={ .devfn = PCI_DEVFN(0x%x,%d)}}" % (slot, function))
|
2003-09-02 01:17:58 +02:00
|
|
|
|
2004-10-16 04:48:37 +02:00
|
|
|
def addpnppath(self, port, device):
|
2003-09-02 01:17:58 +02:00
|
|
|
""" Add a relative path to a pnp device hanging off our parent """
|
|
|
|
if ((port < 0) or (port > 65536)):
|
|
|
|
fatal("Invalid port")
|
2008-02-18 21:43:09 +01:00
|
|
|
if ((device < 0) or (device > 0xffff)):
|
2003-09-02 01:17:58 +02:00
|
|
|
fatal("Invalid device")
|
2009-02-28 21:10:20 +01:00
|
|
|
self.set_path(".type=DEVICE_PATH_PNP,{.pnp={ .port = 0x%x, .device = 0x%x }}" % (port, device))
|
2004-03-11 16:01:31 +01:00
|
|
|
|
2004-10-16 04:48:37 +02:00
|
|
|
def addi2cpath(self, device):
|
2003-09-02 01:17:58 +02:00
|
|
|
""" Add a relative path to a i2c device hanging off our parent """
|
|
|
|
if ((device < 0) or (device > 0x7f)):
|
|
|
|
fatal("Invalid device")
|
2009-02-28 21:10:20 +01:00
|
|
|
self.set_path(".type=DEVICE_PATH_I2C,{.i2c={ .device = 0x%x }}" % (device))
|
2004-10-15 21:17:43 +02:00
|
|
|
|
2004-10-16 04:48:37 +02:00
|
|
|
def addapicpath(self, apic_id):
|
2004-10-14 18:25:01 +02:00
|
|
|
""" Add a relative path to a cpu device hanging off our parent """
|
|
|
|
if ((apic_id < 0) or (apic_id > 255)):
|
|
|
|
fatal("Invalid device")
|
2009-02-28 21:10:20 +01:00
|
|
|
self.set_path(".type=DEVICE_PATH_APIC,{.apic={ .apic_id = 0x%x }}" % (apic_id))
|
2004-10-15 21:17:43 +02:00
|
|
|
|
2004-10-16 04:48:37 +02:00
|
|
|
def addpci_domainpath(self, pci_domain):
|
2004-10-15 21:17:43 +02:00
|
|
|
""" Add a pci_domain number to a chip """
|
|
|
|
if ((pci_domain < 0) or (pci_domain > 0xffff)):
|
|
|
|
fatal("Invalid pci_domain: 0x%x is out of the range 0 to 0xffff" % pci_domain)
|
2009-02-28 21:10:20 +01:00
|
|
|
self.set_path(".type=DEVICE_PATH_PCI_DOMAIN,{.pci_domain={ .domain = 0x%x }}" % (pci_domain))
|
2004-10-16 04:48:37 +02:00
|
|
|
|
2004-10-16 10:38:58 +02:00
|
|
|
def addapic_clusterpath(self, cluster):
|
2004-11-22 22:45:24 +01:00
|
|
|
""" Add an apic cluster to a chip """
|
2004-10-16 04:48:37 +02:00
|
|
|
if ((cluster < 0) or (cluster > 15)):
|
|
|
|
fatal("Invalid apic cluster: %d is out of the range 0 to ff" % cluster)
|
2009-02-28 21:10:20 +01:00
|
|
|
self.set_path(".type=DEVICE_PATH_APIC_CLUSTER,{.apic_cluster={ .cluster = 0x%x }}" % (cluster))
|
2004-10-14 18:25:01 +02:00
|
|
|
|
2005-12-02 22:52:30 +01:00
|
|
|
def addcpupath(self, cpu_id):
|
2004-11-22 22:45:24 +01:00
|
|
|
""" Add a relative path to a cpu device hanging off our parent """
|
2005-12-02 22:52:30 +01:00
|
|
|
if ((cpu_id < 0) or (cpu_id > 255)):
|
2004-11-22 22:45:24 +01:00
|
|
|
fatal("Invalid device")
|
2009-02-28 21:10:20 +01:00
|
|
|
self.set_path(".type=DEVICE_PATH_CPU,{.cpu={ .id = 0x%x }}" % (cpu_id))
|
2004-11-22 22:45:24 +01:00
|
|
|
|
|
|
|
|
|
|
|
def addcpu_buspath(self, id):
|
|
|
|
""" Add a cpu_bus to a chip """
|
|
|
|
if ((id < 0) or (id > 255)):
|
|
|
|
fatal("Invalid device")
|
2009-02-28 21:10:20 +01:00
|
|
|
self.set_path(".type=DEVICE_PATH_CPU_BUS,{.cpu_bus={ .id = 0x%x }}" % (id))
|
2004-11-20 22:20:40 +01:00
|
|
|
|
2003-06-23 18:54:12 +02:00
|
|
|
def usesoption(self, name):
|
2003-07-28 23:35:14 +02:00
|
|
|
"""Declare option that can be used by this part"""
|
2003-07-18 00:25:53 +02:00
|
|
|
global global_options
|
|
|
|
o = getdict(global_options, name)
|
2003-06-23 18:54:12 +02:00
|
|
|
if (o == 0):
|
2003-08-05 18:35:34 +02:00
|
|
|
fatal("can't use undefined option %s" % name)
|
2003-07-18 00:25:53 +02:00
|
|
|
o1 = getdict(self.uses_options, name)
|
2003-07-14 20:00:10 +02:00
|
|
|
if (o1):
|
|
|
|
return
|
2003-07-18 00:25:53 +02:00
|
|
|
setdict(self.uses_options, name, o)
|
2004-10-14 18:25:01 +02:00
|
|
|
exportoption(o, self.image.exported_options)
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
# statements
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def getdict(dict, name):
|
2003-06-23 18:54:12 +02:00
|
|
|
if name not in dict.keys():
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.dict, "Undefined: %s" % name)
|
2003-06-23 18:54:12 +02:00
|
|
|
return 0
|
|
|
|
v = dict.get(name, 0)
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.dict, "getdict %s returning %s" % (name, v))
|
2003-06-23 18:54:12 +02:00
|
|
|
return v
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def setdict(dict, name, value):
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.dict, "setdict sets %s to %s" % (name, value))
|
2009-02-28 21:10:20 +01:00
|
|
|
if name in dict.keys():
|
|
|
|
print "Duplicate in dict: %s" % name
|
2003-06-14 17:07:02 +02:00
|
|
|
dict[name] = value
|
|
|
|
|
|
|
|
# options.
|
2003-06-23 18:54:12 +02:00
|
|
|
# to create an option, it has to not exist.
|
2003-06-14 17:07:02 +02:00
|
|
|
# When an option value is fetched, the fact that it was used is
|
|
|
|
# remembered.
|
|
|
|
# Legal things to do:
|
|
|
|
# set a default value, then set a real value before the option is used.
|
|
|
|
# set a value, try to set a default, default silently fails.
|
|
|
|
# Illegal:
|
|
|
|
# use the value, then try to set the value
|
|
|
|
|
2003-06-23 18:54:12 +02:00
|
|
|
def newoption(name):
|
2003-07-18 00:25:53 +02:00
|
|
|
global global_options, global_options_by_order
|
|
|
|
o = getdict(global_options, name)
|
2003-06-23 18:54:12 +02:00
|
|
|
if (o):
|
2004-02-04 10:11:51 +01:00
|
|
|
fatal("option %s already defined" % name)
|
2003-06-23 18:54:12 +02:00
|
|
|
o = option(name)
|
2003-07-18 00:25:53 +02:00
|
|
|
setdict(global_options, name, o)
|
|
|
|
global_options_by_order.append(name)
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
def newoptionvalue(name, image):
|
|
|
|
g = getdict(global_option_values, name)
|
|
|
|
v = option_value(name, g)
|
|
|
|
if (image):
|
|
|
|
setdict(image.getvalues(), name, v)
|
|
|
|
else:
|
|
|
|
setdict(global_option_values, name, v)
|
|
|
|
return v
|
|
|
|
|
|
|
|
def getoptionvalue(name, op, image):
|
|
|
|
global global_option_values
|
2004-10-14 23:40:58 +02:00
|
|
|
#print "getoptionvalue name %s op %s image %s\n" % (name, op,image)
|
2004-02-04 10:11:51 +01:00
|
|
|
if (op == 0):
|
2006-05-02 14:05:13 +02:00
|
|
|
# we want to debug config files, not the config tool, so no:
|
|
|
|
# print_stack()
|
2004-02-04 10:11:51 +01:00
|
|
|
fatal("Option %s undefined (missing use command?)" % name)
|
|
|
|
if (image):
|
|
|
|
v = getdict(image.getvalues(), name)
|
|
|
|
else:
|
|
|
|
v = getdict(global_option_values, name)
|
|
|
|
return v
|
|
|
|
|
2003-07-18 03:06:15 +02:00
|
|
|
def getoption(name, image):
|
2003-07-19 06:19:48 +02:00
|
|
|
"""option must be declared before being used in a part
|
|
|
|
if we're not processing a part, then we must
|
2004-02-04 10:11:51 +01:00
|
|
|
be at the top level where all options are available"""
|
|
|
|
|
|
|
|
global global_uses_options, alloptions, curimage
|
|
|
|
|
2004-10-14 23:40:58 +02:00
|
|
|
#print "getoption: name %s image %s alloptions %s curimage %s\n\n" % (name, image, alloptions, curimage)
|
2003-07-19 06:07:07 +02:00
|
|
|
curpart = partstack.tos()
|
2004-02-04 10:11:51 +01:00
|
|
|
if (alloptions):
|
2003-07-18 00:25:53 +02:00
|
|
|
o = getdict(global_options, name)
|
2004-02-04 10:11:51 +01:00
|
|
|
elif (curpart):
|
|
|
|
o = getdict(curpart.uses_options, name)
|
2004-10-15 17:09:30 +02:00
|
|
|
if (o == 0):
|
2004-11-22 22:45:24 +01:00
|
|
|
print "curpart.uses_options is %s\n" % curpart.uses_options
|
2003-06-23 18:54:12 +02:00
|
|
|
else:
|
2003-07-18 00:25:53 +02:00
|
|
|
o = getdict(global_uses_options, name)
|
2004-02-04 10:11:51 +01:00
|
|
|
v = getoptionvalue(name, o, image)
|
|
|
|
if (v == 0):
|
|
|
|
v = getoptionvalue(name, o, 0)
|
2003-07-18 00:25:53 +02:00
|
|
|
if (v == 0):
|
2004-02-04 10:11:51 +01:00
|
|
|
fatal("No value for option %s" % name)
|
|
|
|
val = v.contents()
|
|
|
|
if (not (type(val) is types.StringType)):
|
|
|
|
return v.contents()
|
|
|
|
if (val == '' or val[0] != '{'):
|
|
|
|
return v.contents()
|
|
|
|
s = curimage
|
|
|
|
curimage = image
|
|
|
|
val = parse('delexpr', val)
|
|
|
|
curimage = s
|
|
|
|
exitiferrors()
|
|
|
|
return val
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-11-05 19:55:44 +01:00
|
|
|
def setoption(name, value, imp):
|
|
|
|
"""Set an option from within a configuration file. Normally this
|
|
|
|
is only permitted in the target (top level) configuration file.
|
|
|
|
If 'imp' is true, then set an option implicitly (e.g. 'arch'
|
|
|
|
and 'mainboard' statements). Implicit options can be set anywhere
|
|
|
|
the statements are legal, but also performs an implicit 'uses'
|
|
|
|
for the option"""
|
|
|
|
|
2003-07-19 06:07:07 +02:00
|
|
|
global loc, global_options, global_option_values, curimage
|
2003-11-05 19:55:44 +01:00
|
|
|
|
2003-07-19 06:07:07 +02:00
|
|
|
curpart = partstack.tos()
|
2003-11-05 19:55:44 +01:00
|
|
|
if (not imp and curpart):
|
|
|
|
fatal("Options may only be set in target configuration file")
|
|
|
|
if (imp):
|
|
|
|
usesoption(name)
|
|
|
|
if (curpart):
|
|
|
|
o = getdict(curpart.uses_options, name)
|
|
|
|
else:
|
|
|
|
o = getdict(global_uses_options, name)
|
|
|
|
if (not o):
|
|
|
|
fatal("Attempt to set nonexistent option %s (missing USES?)" % name)
|
2004-02-04 10:11:51 +01:00
|
|
|
v = getoptionvalue(name, o, curimage)
|
|
|
|
if (v == 0):
|
|
|
|
v = newoptionvalue(name, curimage)
|
|
|
|
v.setvalue(value)
|
2004-10-14 18:25:01 +02:00
|
|
|
|
|
|
|
def exportoption(op, exported_options):
|
|
|
|
if (not op.isexportable()):
|
|
|
|
return
|
|
|
|
if (not op in exported_options):
|
|
|
|
exported_options.append(op)
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-11-05 19:55:44 +01:00
|
|
|
def setdefault(name, value, isdef):
|
|
|
|
"""Set the default value of an option from within a configuration
|
|
|
|
file. This is permitted from any configuration file, but will
|
|
|
|
result in a warning if the default is set more than once.
|
|
|
|
If 'isdef' is set, we're defining the option in Options.lb so
|
2004-10-14 18:25:01 +02:00
|
|
|
there is no need for 'uses'."""
|
2003-11-05 19:55:44 +01:00
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
global loc, global_options, curimage
|
2003-11-05 19:55:44 +01:00
|
|
|
|
|
|
|
if (isdef):
|
|
|
|
o = getdict(global_options, name)
|
|
|
|
if (not o):
|
|
|
|
return
|
2004-02-04 10:11:51 +01:00
|
|
|
image = 0
|
2003-11-05 19:55:44 +01:00
|
|
|
else:
|
|
|
|
curpart = partstack.tos()
|
|
|
|
if (curpart):
|
|
|
|
o = getdict(curpart.uses_options, name)
|
|
|
|
else:
|
|
|
|
o = getdict(global_uses_options, name)
|
|
|
|
if (not o):
|
|
|
|
fatal("Attempt to set default for nonexistent option %s (missing USES?)" % name)
|
2004-02-04 10:11:51 +01:00
|
|
|
image = curimage
|
2003-11-05 19:55:44 +01:00
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
v = getoptionvalue(name, o, image)
|
|
|
|
if (v == 0):
|
|
|
|
v = newoptionvalue(name, image)
|
|
|
|
v.setdefault(value)
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
def setnodefault(name):
|
2003-07-18 00:25:53 +02:00
|
|
|
global loc, global_options
|
|
|
|
o = getdict(global_options, name)
|
2003-06-23 18:54:12 +02:00
|
|
|
if (not o):
|
|
|
|
return
|
2004-02-04 10:11:51 +01:00
|
|
|
v = getdict(global_option_values, name)
|
|
|
|
if (v != 0):
|
|
|
|
warning("removing default for %s" % name)
|
|
|
|
del global_option_values[name]
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
def setcomment(name, value):
|
2003-07-18 00:25:53 +02:00
|
|
|
global loc, global_options
|
|
|
|
o = getdict(global_options, name)
|
2003-06-23 18:54:12 +02:00
|
|
|
if (not o):
|
|
|
|
fatal("setcomment: %s not here" % name)
|
|
|
|
o.setcomment(value, loc)
|
|
|
|
|
|
|
|
def setexported(name):
|
2003-07-18 00:25:53 +02:00
|
|
|
global global_options
|
|
|
|
o = getdict(global_options, name)
|
2003-06-23 18:54:12 +02:00
|
|
|
if (not o):
|
|
|
|
fatal("setexported: %s not here" % name)
|
2004-02-04 10:11:51 +01:00
|
|
|
o.setexportable()
|
|
|
|
global_exported_options.append(o)
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
def setnoexport(name):
|
2003-07-18 00:25:53 +02:00
|
|
|
global global_options
|
|
|
|
o = getdict(global_options, name)
|
2003-06-23 18:54:12 +02:00
|
|
|
if (not o):
|
|
|
|
fatal("setnoexport: %s not here" % name)
|
|
|
|
o.setnoexport()
|
2004-02-04 10:11:51 +01:00
|
|
|
if (o in global_exported_options):
|
|
|
|
global_exported_options.remove(o)
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-06-24 01:52:15 +02:00
|
|
|
def setexportable(name):
|
2003-07-18 00:25:53 +02:00
|
|
|
global global_options
|
|
|
|
o = getdict(global_options, name)
|
2003-06-23 18:54:12 +02:00
|
|
|
if (not o):
|
2003-06-24 01:52:15 +02:00
|
|
|
fatal("setexportable: %s not here" % name)
|
|
|
|
o.setexportable()
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
def setformat(name, fmt):
|
2003-07-18 00:25:53 +02:00
|
|
|
global global_options
|
|
|
|
o = getdict(global_options, name)
|
2003-06-23 18:54:12 +02:00
|
|
|
if (not o):
|
2003-06-24 01:52:15 +02:00
|
|
|
fatal("setformat: %s not here" % name)
|
2003-06-23 18:54:12 +02:00
|
|
|
o.setformat(fmt)
|
|
|
|
|
2003-07-18 03:06:15 +02:00
|
|
|
def getformated(name, image):
|
2003-07-18 00:25:53 +02:00
|
|
|
global global_options, global_option_values
|
|
|
|
o = getdict(global_options, name)
|
2004-02-04 10:11:51 +01:00
|
|
|
v = getoption(name, image)
|
2003-06-23 18:54:12 +02:00
|
|
|
f = o.getformat()
|
2004-02-04 10:11:51 +01:00
|
|
|
return (f % v)
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-11-05 19:55:44 +01:00
|
|
|
def setwrite(name, part):
|
|
|
|
global global_options
|
|
|
|
o = getdict(global_options, name)
|
|
|
|
if (not o):
|
|
|
|
fatal("setwrite: %s not here" % name)
|
|
|
|
o.setwrite(part)
|
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
def hasvalue(name, image):
|
2003-07-18 00:25:53 +02:00
|
|
|
global global_options
|
|
|
|
o = getdict(global_options, name)
|
2004-02-04 10:11:51 +01:00
|
|
|
if (o == 0):
|
|
|
|
return 0
|
|
|
|
v = 0
|
|
|
|
if (image):
|
|
|
|
v = getdict(image.getvalues(), name)
|
|
|
|
if (v == 0):
|
|
|
|
v = getdict(global_option_values, name)
|
|
|
|
return (v != 0)
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
def isset(name, part):
|
2004-02-04 10:11:51 +01:00
|
|
|
global global_uses_options, global_option_values, curimage
|
2003-06-23 18:54:12 +02:00
|
|
|
if (part):
|
2003-07-18 00:25:53 +02:00
|
|
|
o = getdict(part.uses_options, name)
|
2003-06-23 18:54:12 +02:00
|
|
|
else:
|
2003-07-18 00:25:53 +02:00
|
|
|
o = getdict(global_uses_options, name)
|
2004-02-04 10:11:51 +01:00
|
|
|
if (o == 0):
|
|
|
|
return 0
|
|
|
|
v = 0
|
|
|
|
if (curimage):
|
|
|
|
v = getdict(curimage.getvalues(), name)
|
|
|
|
if (v == 0):
|
|
|
|
v = getdict(global_option_values, name)
|
|
|
|
return (v != 0 and v.isset())
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
def usesoption(name):
|
2003-07-19 06:07:07 +02:00
|
|
|
global global_options, global_uses_options
|
|
|
|
curpart = partstack.tos()
|
2003-07-18 00:25:53 +02:00
|
|
|
if (curpart):
|
|
|
|
curpart.usesoption(name)
|
|
|
|
return
|
|
|
|
o = getdict(global_options, name)
|
|
|
|
if (o == 0):
|
2003-07-19 06:07:07 +02:00
|
|
|
fatal("Can't use undefined option %s" % name)
|
2003-07-18 00:25:53 +02:00
|
|
|
o1 = getdict(global_uses_options, name)
|
|
|
|
if (o1):
|
|
|
|
return
|
|
|
|
setdict(global_uses_options, name, o)
|
2004-10-14 18:25:01 +02:00
|
|
|
exportoption(o, global_exported_options)
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
def validdef(name, defval):
|
2003-07-18 00:25:53 +02:00
|
|
|
global global_options
|
|
|
|
o = getdict(global_options, name)
|
2003-06-23 18:54:12 +02:00
|
|
|
if (not o):
|
|
|
|
fatal("validdef: %s not here" % name)
|
|
|
|
if ((defval & 1) != 1):
|
2003-07-19 06:07:07 +02:00
|
|
|
fatal("Must specify default value for option %s" % name)
|
2003-06-23 18:54:12 +02:00
|
|
|
if ((defval & 2) != 2):
|
2003-07-19 06:07:07 +02:00
|
|
|
fatal("Must specify export for option %s" % name)
|
2003-06-23 18:54:12 +02:00
|
|
|
if ((defval & 4) != 4):
|
2003-07-19 06:07:07 +02:00
|
|
|
fatal("Must specify comment for option %s" % name)
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2004-10-14 23:40:58 +02:00
|
|
|
def loadoptions(path, file, rule):
|
|
|
|
file = os.path.join('src', path, file)
|
2003-07-19 06:07:07 +02:00
|
|
|
optionsfile = os.path.join(treetop, file)
|
2003-07-25 19:29:13 +02:00
|
|
|
fp = safe_open(optionsfile, 'r')
|
2003-07-19 06:07:07 +02:00
|
|
|
loc.push(file)
|
2004-10-14 23:40:58 +02:00
|
|
|
if (not parse(rule, fp.read())):
|
2003-07-19 06:07:07 +02:00
|
|
|
fatal("Could not parse file")
|
|
|
|
loc.pop()
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-07-14 20:00:10 +02:00
|
|
|
def addinit(path):
|
2003-07-19 06:07:07 +02:00
|
|
|
global curimage, dirstack
|
2003-07-14 20:00:10 +02:00
|
|
|
if (path[0] == '/'):
|
2003-07-18 00:25:53 +02:00
|
|
|
curimage.setinitfile(treetop + '/src/' + path)
|
2003-07-14 20:00:10 +02:00
|
|
|
else:
|
2003-07-19 06:07:07 +02:00
|
|
|
curimage.setinitfile(dirstack.tos() + '/' + path)
|
2003-07-14 20:00:10 +02:00
|
|
|
print "Adding init file: %s" % path
|
|
|
|
|
2003-07-23 20:13:19 +02:00
|
|
|
def addconfig(path):
|
|
|
|
global partstack
|
|
|
|
curpart = partstack.tos()
|
|
|
|
curpart.addconfig(path)
|
|
|
|
|
|
|
|
def addregister(field, value):
|
2003-07-19 06:07:07 +02:00
|
|
|
global partstack
|
|
|
|
curpart = partstack.tos()
|
2003-07-23 20:13:19 +02:00
|
|
|
curpart.addregister(field, value)
|
2003-07-19 06:07:07 +02:00
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
def addcrt0include(path):
|
2003-07-19 06:19:48 +02:00
|
|
|
"""we do the crt0include as a dictionary, so that if needed we
|
|
|
|
can trace who added what when. Also it makes the keys
|
|
|
|
nice and unique."""
|
2003-07-18 00:25:53 +02:00
|
|
|
global curimage
|
|
|
|
curimage.addinitinclude(0, path)
|
2003-07-14 20:00:10 +02:00
|
|
|
|
|
|
|
def addinitinclude(str, path):
|
2003-07-18 00:25:53 +02:00
|
|
|
global curimage
|
|
|
|
curimage.addinitinclude(dequote(str), path)
|
2003-06-14 17:07:02 +02:00
|
|
|
|
|
|
|
def addldscript(path):
|
2003-07-19 06:07:07 +02:00
|
|
|
global curimage, dirstack
|
|
|
|
curdir = dirstack.tos()
|
2003-06-14 17:07:02 +02:00
|
|
|
if (path[0] == '/'):
|
|
|
|
fullpath = treetop + '/src/' + path
|
|
|
|
else:
|
|
|
|
fullpath = curdir + '/' + path
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.statement, "fullpath :%s: curdir :%s: path :%s:" % (fullpath, curdir, path))
|
2003-07-18 00:25:53 +02:00
|
|
|
curimage.addldscript(fullpath)
|
2003-06-14 17:07:02 +02:00
|
|
|
|
|
|
|
def payload(path):
|
2003-07-18 19:05:10 +02:00
|
|
|
global curimage
|
|
|
|
curimage.setpayload(path)
|
2003-07-21 19:28:35 +02:00
|
|
|
adduserdefine("PAYLOAD:=%s"%path)
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-07-18 03:06:15 +02:00
|
|
|
def startromimage(name):
|
2003-07-19 06:07:07 +02:00
|
|
|
global romimages, curimage, target_dir, target_name
|
2004-10-15 17:09:30 +02:00
|
|
|
curpart = partstack.tos()
|
2004-10-14 23:40:58 +02:00
|
|
|
print "Configuring ROMIMAGE %s Curimage %s" % (name, curimage)
|
2004-10-15 17:09:30 +02:00
|
|
|
print "Curpart is %s\n" % curpart
|
2003-07-18 00:25:53 +02:00
|
|
|
o = getdict(romimages, name)
|
|
|
|
if (o):
|
|
|
|
fatal("romimage %s previously defined" % name)
|
2003-07-19 06:07:07 +02:00
|
|
|
curimage = romimage(name)
|
|
|
|
curimage.settargetdir(os.path.join(target_dir, name))
|
|
|
|
#o = partobj(curimage, target_dir, 0, 'board', target_name)
|
|
|
|
#curimage.setroot(o)
|
2003-07-18 00:25:53 +02:00
|
|
|
setdict(romimages, name, curimage)
|
2004-10-16 04:48:37 +02:00
|
|
|
dodir('/config', 'Config.lb')
|
2003-07-18 00:25:53 +02:00
|
|
|
|
2003-07-18 03:06:15 +02:00
|
|
|
def endromimage():
|
|
|
|
global curimage
|
2009-04-03 14:52:43 +02:00
|
|
|
global bootblocksize
|
2004-10-14 23:40:58 +02:00
|
|
|
mainboard()
|
2009-04-03 14:52:43 +02:00
|
|
|
imagesize = getoption("ROM_IMAGE_SIZE", curimage)
|
|
|
|
bootblocksize += imagesize
|
2003-07-18 03:06:15 +02:00
|
|
|
print "End ROMIMAGE"
|
|
|
|
curimage = 0
|
2003-07-19 06:07:07 +02:00
|
|
|
#curpart = 0
|
|
|
|
|
2004-10-14 23:40:58 +02:00
|
|
|
def mainboardsetup(path):
|
2004-10-15 17:09:30 +02:00
|
|
|
global full_mainboard_path, mainboard_path
|
2004-10-14 23:40:58 +02:00
|
|
|
mainboard_path = os.path.join('mainboard', path)
|
|
|
|
loadoptions(mainboard_path, 'Options.lb', 'mainboardvariables')
|
|
|
|
full_mainboard_path = os.path.join(treetop, 'src', 'mainboard', path)
|
2004-03-11 16:01:31 +01:00
|
|
|
vendor = re.sub("/.*", "", path)
|
2003-07-19 06:07:07 +02:00
|
|
|
part_number = re.sub("[^/]*/", "", path)
|
2004-10-14 23:40:58 +02:00
|
|
|
setdefault('MAINBOARD', full_mainboard_path, 0)
|
2004-10-14 18:25:01 +02:00
|
|
|
setdefault('MAINBOARD_VENDOR', vendor, 0)
|
|
|
|
setdefault('MAINBOARD_PART_NUMBER', part_number, 0)
|
2004-10-14 23:40:58 +02:00
|
|
|
|
|
|
|
def mainboard():
|
2004-10-15 17:09:30 +02:00
|
|
|
global curimage, dirstack, partstack
|
|
|
|
file = 'Config.lb'
|
|
|
|
partdir = mainboard_path
|
|
|
|
srcdir = os.path.join(treetop, 'src')
|
|
|
|
fulldir = os.path.join(srcdir, partdir)
|
|
|
|
type_name = flatten_name(partdir)
|
|
|
|
newpart = partobj(curimage, fulldir, partstack.tos(), 'mainboard', \
|
2009-02-18 21:41:57 +01:00
|
|
|
'mainboard', 0, 'chip')
|
2004-10-16 08:20:29 +02:00
|
|
|
#print "Configuring PART %s" % (type)
|
2004-10-15 17:09:30 +02:00
|
|
|
partstack.push(newpart)
|
2004-10-15 22:47:41 +02:00
|
|
|
#print " new PART tos is now %s\n" %partstack.tos().info()
|
2004-10-15 17:09:30 +02:00
|
|
|
dirstack.push(fulldir)
|
|
|
|
loadoptions(mainboard_path, 'Options.lb', 'mainboardvariables')
|
|
|
|
# special case for 'cpu' parts.
|
|
|
|
# we could add a new function too, but this is rather trivial.
|
|
|
|
# if the part is a cpu, and we haven't seen it before,
|
|
|
|
# arrange to source the directory /cpu/'type'
|
|
|
|
doconfigfile(srcdir, partdir, file, 'cfgfile')
|
2003-07-19 06:07:07 +02:00
|
|
|
curimage.setroot(partstack.tos())
|
|
|
|
partpop()
|
2003-07-18 03:06:15 +02:00
|
|
|
|
2003-09-17 14:17:58 +02:00
|
|
|
def addbuildrom(filename, size, roms):
|
2003-07-18 00:25:53 +02:00
|
|
|
global buildroms
|
2003-07-18 19:05:10 +02:00
|
|
|
print "Build ROM size %d" % size
|
2003-09-17 14:17:58 +02:00
|
|
|
b = buildrom(filename, size, roms)
|
2003-07-18 00:25:53 +02:00
|
|
|
buildroms.append(b)
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-07-14 20:00:10 +02:00
|
|
|
def addinitobject(object_name):
|
2003-07-18 00:25:53 +02:00
|
|
|
global curimage
|
|
|
|
curimage.addinitobjectrule(object_name)
|
2003-07-14 20:00:10 +02:00
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
def addobject(object_name):
|
2003-07-18 00:25:53 +02:00
|
|
|
global curimage
|
|
|
|
curimage.addobjectrule(object_name)
|
2003-06-14 17:07:02 +02:00
|
|
|
|
|
|
|
def adddriver(driver_name):
|
2003-07-18 00:25:53 +02:00
|
|
|
global curimage
|
|
|
|
curimage.adddriverrule(driver_name)
|
|
|
|
|
2009-01-19 22:20:22 +01:00
|
|
|
def addsmmobject(object_name):
|
|
|
|
global curimage
|
|
|
|
curimage.addsmmobjectrule(object_name)
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def target(name):
|
|
|
|
global target_dir, target_name
|
|
|
|
print "Configuring TARGET %s" % name
|
|
|
|
target_name = name
|
|
|
|
target_dir = os.path.join(os.path.dirname(loc.file()), name)
|
|
|
|
if not os.path.isdir(target_dir):
|
|
|
|
print "Creating directory %s" % target_dir
|
|
|
|
os.makedirs(target_dir)
|
|
|
|
print "Will place Makefile, crt0.S, etc. in %s" % target_dir
|
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-08-04 23:05:19 +02:00
|
|
|
def cpudir(path):
|
|
|
|
global cpu_type
|
|
|
|
if (cpu_type and (cpu_type != path)):
|
|
|
|
fatal("Two different CPU types: %s and %s" % (cpu_type, path))
|
2003-09-02 01:17:58 +02:00
|
|
|
srcdir = "/cpu/%s" % path
|
|
|
|
dodir(srcdir, "Config.lb")
|
|
|
|
cpu_type = path
|
2003-08-04 23:05:19 +02:00
|
|
|
|
2004-10-14 23:57:29 +02:00
|
|
|
def devicepart(type):
|
2004-10-14 23:40:58 +02:00
|
|
|
global curimage, dirstack, partstack
|
|
|
|
newpart = partobj(curimage, 0, partstack.tos(), type, \
|
2004-10-16 21:58:35 +02:00
|
|
|
'', 0, 'device')
|
2004-10-16 08:20:29 +02:00
|
|
|
#print "Configuring PART %s" % (type)
|
2004-10-14 23:40:58 +02:00
|
|
|
partstack.push(newpart)
|
2004-10-15 22:47:41 +02:00
|
|
|
#print " new PART tos is now %s\n" %partstack.tos().info()
|
2004-10-14 23:40:58 +02:00
|
|
|
# just push TOS, so that we can pop later.
|
|
|
|
dirstack.push(dirstack.tos())
|
|
|
|
|
2004-10-16 21:58:35 +02:00
|
|
|
def part(type, path, file, name):
|
2003-07-19 06:07:07 +02:00
|
|
|
global curimage, dirstack, partstack
|
2004-10-14 18:25:01 +02:00
|
|
|
partdir = os.path.join(type, path)
|
2003-07-19 06:07:07 +02:00
|
|
|
srcdir = os.path.join(treetop, 'src')
|
|
|
|
fulldir = os.path.join(srcdir, partdir)
|
2004-10-14 18:25:01 +02:00
|
|
|
type_name = flatten_name(partdir)
|
2003-07-28 23:35:14 +02:00
|
|
|
newpart = partobj(curimage, fulldir, partstack.tos(), type, \
|
2004-10-16 21:58:35 +02:00
|
|
|
type_name, name, 'chip')
|
2004-10-15 22:47:41 +02:00
|
|
|
#print "Configuring PART %s, path %s" % (type, path)
|
2003-07-19 06:07:07 +02:00
|
|
|
partstack.push(newpart)
|
2004-10-15 22:47:41 +02:00
|
|
|
#print " new PART tos is now %s\n" %partstack.tos().info()
|
2003-07-19 06:07:07 +02:00
|
|
|
dirstack.push(fulldir)
|
2003-08-06 17:06:27 +02:00
|
|
|
# special case for 'cpu' parts.
|
|
|
|
# we could add a new function too, but this is rather trivial.
|
|
|
|
# if the part is a cpu, and we haven't seen it before,
|
|
|
|
# arrange to source the directory /cpu/'type'
|
|
|
|
if (type == 'cpu'):
|
|
|
|
cpudir(path)
|
|
|
|
else:
|
2003-11-05 19:55:44 +01:00
|
|
|
doconfigfile(srcdir, partdir, file, 'cfgfile')
|
2003-06-14 17:07:02 +02:00
|
|
|
|
|
|
|
def partpop():
|
2003-07-19 06:07:07 +02:00
|
|
|
global dirstack, partstack
|
2004-02-04 10:11:51 +01:00
|
|
|
curpart = partstack.tos()
|
2003-07-19 06:07:07 +02:00
|
|
|
if (curpart == 0):
|
|
|
|
fatal("Trying to pop non-existent part")
|
2004-10-16 08:20:29 +02:00
|
|
|
#print "End PART %s" % curpart.part
|
2003-06-24 01:52:15 +02:00
|
|
|
# Warn if options are used without being set in this part
|
2004-02-04 10:11:51 +01:00
|
|
|
for op in curpart.uses_options.keys():
|
|
|
|
if (not isset(op, curpart)):
|
|
|
|
notice("Option %s using default value %s" % (op, getformated(op, curpart.image)))
|
2004-10-14 23:57:29 +02:00
|
|
|
oldpart = partstack.pop()
|
2003-07-19 06:07:07 +02:00
|
|
|
dirstack.pop()
|
2004-10-15 22:47:41 +02:00
|
|
|
#print "partstack.pop, TOS is now %s\n" % oldpart.info()
|
2003-06-14 17:07:02 +02:00
|
|
|
|
|
|
|
def dodir(path, file):
|
2003-07-19 06:19:48 +02:00
|
|
|
"""dodir is like part but there is no new part"""
|
2003-07-19 06:07:07 +02:00
|
|
|
global dirstack
|
2003-06-14 17:07:02 +02:00
|
|
|
# if the first char is '/', it is relative to treetop,
|
|
|
|
# else relative to curdir
|
|
|
|
# os.path.join screws up if the name starts with '/', sigh.
|
2003-07-19 06:07:07 +02:00
|
|
|
print "Configuring DIR %s" % os.path.join(path, file)
|
2003-06-14 17:07:02 +02:00
|
|
|
if (path[0] == '/'):
|
2003-07-19 06:07:07 +02:00
|
|
|
fullpath = os.path.join(treetop, 'src')
|
|
|
|
path = re.sub('^/*', '', path)
|
2003-06-14 17:07:02 +02:00
|
|
|
else:
|
2003-07-19 06:07:07 +02:00
|
|
|
fullpath = dirstack.tos()
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.statement, "DODIR: path %s, fullpath %s" % (path, fullpath))
|
2003-07-19 06:07:07 +02:00
|
|
|
dirstack.push(os.path.join(fullpath, path))
|
2003-09-26 01:03:18 +02:00
|
|
|
doconfigfile(fullpath, path, file, 'cfgfile')
|
2003-07-19 06:07:07 +02:00
|
|
|
dirstack.pop()
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-06-24 19:26:45 +02:00
|
|
|
def lookup(name):
|
2003-07-18 03:06:15 +02:00
|
|
|
global curimage
|
2004-02-04 10:11:51 +01:00
|
|
|
return getoption(name, curimage)
|
2003-06-24 19:26:45 +02:00
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
def addrule(id):
|
|
|
|
global curimage
|
|
|
|
curimage.addmakerule(id)
|
|
|
|
|
|
|
|
def adduserdefine(str):
|
|
|
|
global curimage
|
|
|
|
curimage.adduserdefine(str)
|
|
|
|
|
|
|
|
def addaction(id, str):
|
|
|
|
global curimage
|
|
|
|
curimage.addmakeaction(id, str)
|
|
|
|
|
|
|
|
def adddep(id, str):
|
|
|
|
global curimage
|
|
|
|
curimage.addmakedepend(id, str)
|
|
|
|
|
2003-07-28 23:35:14 +02:00
|
|
|
def setarch(my_arch):
|
2003-07-19 06:19:48 +02:00
|
|
|
"""arch is 'different' ... darn it."""
|
2003-07-18 00:25:53 +02:00
|
|
|
global curimage
|
2004-10-15 22:47:41 +02:00
|
|
|
print "SETTING ARCH %s\n" % my_arch
|
2003-07-18 00:25:53 +02:00
|
|
|
curimage.setarch(my_arch)
|
2004-02-04 10:11:51 +01:00
|
|
|
setdefault('ARCH', my_arch, 1)
|
2004-10-16 21:58:35 +02:00
|
|
|
part('arch', my_arch, 'Config.lb', 0)
|
2003-07-18 00:25:53 +02:00
|
|
|
|
2003-09-26 01:03:18 +02:00
|
|
|
def doconfigfile(path, confdir, file, rule):
|
2003-07-19 06:07:07 +02:00
|
|
|
rname = os.path.join(confdir, file)
|
|
|
|
loc.push(rname)
|
|
|
|
fullpath = os.path.join(path, rname)
|
2003-07-25 19:29:13 +02:00
|
|
|
fp = safe_open(fullpath, 'r')
|
2003-09-26 01:03:18 +02:00
|
|
|
if (not parse(rule, fp.read())):
|
2003-07-19 06:07:07 +02:00
|
|
|
fatal("Could not parse file")
|
2003-07-18 00:25:53 +02:00
|
|
|
exitiferrors()
|
2003-07-19 06:07:07 +02:00
|
|
|
loc.pop()
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
#=============================================================================
|
|
|
|
# MISC FUNCTIONS
|
|
|
|
#=============================================================================
|
2003-06-24 19:26:45 +02:00
|
|
|
def ternary(val, yes, no):
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.statement, "ternary %s" % expr)
|
|
|
|
debug.info(debug.statement, "expr %s a %d yes %d no %d"% (expr, a, yes, no))
|
2003-06-24 19:26:45 +02:00
|
|
|
if (val == 0):
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.statement, "Ternary returns %d" % yes)
|
2003-06-23 18:54:12 +02:00
|
|
|
return yes
|
2003-06-14 17:07:02 +02:00
|
|
|
else:
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.statement, "Ternary returns %d" % no)
|
2003-06-23 18:54:12 +02:00
|
|
|
return no
|
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
def tohex(name):
|
2003-07-19 06:19:48 +02:00
|
|
|
"""atoi is in the python library, but not strtol? Weird!"""
|
2003-06-14 17:07:02 +02:00
|
|
|
return eval('int(%s)' % name)
|
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
def IsInt(str):
|
2003-06-14 17:07:02 +02:00
|
|
|
""" Is the given string an integer?"""
|
|
|
|
try:
|
2003-09-02 01:17:58 +02:00
|
|
|
num = long(str)
|
2003-06-14 17:07:02 +02:00
|
|
|
return 1
|
|
|
|
except ValueError:
|
|
|
|
return 0
|
|
|
|
|
|
|
|
def dequote(str):
|
|
|
|
a = re.sub("^\"", "", str)
|
|
|
|
a = re.sub("\"$", "", a)
|
|
|
|
# highly un-intuitive, need four \!
|
|
|
|
a = re.sub("\\\\\"", "\"", a)
|
|
|
|
return a
|
|
|
|
|
2003-07-11 16:51:29 +02:00
|
|
|
def flatten_name(str):
|
2004-03-11 16:01:31 +01:00
|
|
|
a = re.sub("[/-]", "_", str)
|
2003-07-11 16:51:29 +02:00
|
|
|
return a
|
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
def topify(path):
|
2003-07-19 06:19:48 +02:00
|
|
|
"""If the first part of <path> matches treetop, replace
|
|
|
|
that part with $(TOP)"""
|
2003-06-14 17:07:02 +02:00
|
|
|
if path[0:len(treetop)] == treetop:
|
|
|
|
path = path[len(treetop):len(path)]
|
|
|
|
if (path[0:1] == "/"):
|
|
|
|
path = path[1:len(path)]
|
|
|
|
path = "$(TOP)/" + path
|
|
|
|
return path
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
%%
|
2003-07-18 19:05:10 +02:00
|
|
|
# to make if work without 2 passses, we use an old hack from SIMD, the
|
|
|
|
# context bit. If the bit is 1, then ops get done, otherwise
|
|
|
|
# ops don't get done. From the top level, context is always
|
|
|
|
# 1. In an if, context depends on eval of the if condition
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
parser Config:
|
|
|
|
ignore: r'\s+'
|
|
|
|
ignore: "#.*?\r?\n"
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
# less general tokens should come first, otherwise they get matched
|
|
|
|
# by the re's
|
|
|
|
token ACTION: 'action'
|
|
|
|
token ADDACTION: 'addaction'
|
|
|
|
token ALWAYS: 'always'
|
|
|
|
token ARCH: 'arch'
|
|
|
|
token BUILDROM: 'buildrom'
|
|
|
|
token COMMENT: 'comment'
|
2003-07-23 20:13:19 +02:00
|
|
|
token CONFIG: 'config'
|
2003-07-18 00:25:53 +02:00
|
|
|
token CPU: 'cpu'
|
2004-11-22 22:45:24 +01:00
|
|
|
token CPU_BUS: 'cpu_bus'
|
2004-10-14 18:25:01 +02:00
|
|
|
token CHIP: 'chip'
|
2003-07-18 00:25:53 +02:00
|
|
|
token DEFAULT: 'default'
|
|
|
|
token DEFINE: 'define'
|
|
|
|
token DEPENDS: 'depends'
|
2004-10-14 23:40:58 +02:00
|
|
|
token DEVICE: 'device'
|
2003-07-18 00:25:53 +02:00
|
|
|
token DIR: 'dir'
|
|
|
|
token DRIVER: 'driver'
|
2004-03-11 16:01:31 +01:00
|
|
|
token DRQ: 'drq'
|
2003-07-18 00:25:53 +02:00
|
|
|
token ELSE: 'else'
|
|
|
|
token END: 'end'
|
|
|
|
token EOF: '$'
|
|
|
|
token EQ: '='
|
|
|
|
token EXPORT: 'export'
|
|
|
|
token FORMAT: 'format'
|
|
|
|
token IF: 'if'
|
|
|
|
token INIT: 'init'
|
|
|
|
token INITOBJECT: 'initobject'
|
|
|
|
token INITINCLUDE: 'initinclude'
|
2004-03-11 16:01:31 +01:00
|
|
|
token IO: 'io'
|
|
|
|
token IRQ: 'irq'
|
2003-07-18 00:25:53 +02:00
|
|
|
token LDSCRIPT: 'ldscript'
|
|
|
|
token LOADOPTIONS: 'loadoptions'
|
|
|
|
token MAINBOARD: 'mainboard'
|
|
|
|
token MAINBOARDINIT: 'mainboardinit'
|
|
|
|
token MAKEDEFINE: 'makedefine'
|
|
|
|
token MAKERULE: 'makerule'
|
2004-03-11 16:01:31 +01:00
|
|
|
token MEM: 'mem'
|
2003-07-18 00:25:53 +02:00
|
|
|
token NEVER: 'never'
|
|
|
|
token NONE: 'none'
|
|
|
|
token NORTHBRIDGE: 'northbridge'
|
|
|
|
token OBJECT: 'object'
|
|
|
|
token OPTION: 'option'
|
|
|
|
token PAYLOAD: 'payload'
|
|
|
|
token PMC: 'pmc'
|
|
|
|
token PRINT: 'print'
|
|
|
|
token REGISTER: 'register'
|
|
|
|
token ROMIMAGE: 'romimage'
|
2009-01-19 22:20:22 +01:00
|
|
|
token SMMOBJECT: 'smmobject'
|
2003-07-18 00:25:53 +02:00
|
|
|
token SOUTHBRIDGE: 'southbridge'
|
|
|
|
token SUPERIO: 'superio'
|
|
|
|
token TARGET: 'target'
|
|
|
|
token USED: 'used'
|
|
|
|
token USES: 'uses'
|
2003-11-05 19:55:44 +01:00
|
|
|
token WRITE: 'write'
|
2003-09-02 01:17:58 +02:00
|
|
|
token NUM: '[0-9]+'
|
|
|
|
token HEX_NUM: '[0-9a-fA-F]+'
|
|
|
|
token HEX_PREFIX: '0x'
|
2003-07-18 00:25:53 +02:00
|
|
|
# Why is path separate? Because paths to resources have to at least
|
|
|
|
# have a slash, we thinks
|
2004-03-11 16:01:31 +01:00
|
|
|
token PATH: r'[-a-zA-Z0-9_.][-a-zA-Z0-9/_.]+[-a-zA-Z0-9_.]+'
|
2003-07-18 00:25:53 +02:00
|
|
|
# Dir's on the other hand are abitrary
|
|
|
|
# this may all be stupid.
|
2008-11-28 12:56:27 +01:00
|
|
|
token RULE: r'[-a-zA-Z0-9_$()./]+[-a-zA-Z0-9_ $()./]+[-a-zA-Z0-9_$()./]+'
|
2003-07-18 00:25:53 +02:00
|
|
|
token DIRPATH: r'[-a-zA-Z0-9_$()./]+'
|
|
|
|
token ID: r'[a-zA-Z_.]+[a-zA-Z0-9_.]*'
|
|
|
|
token DELEXPR: r'{([^}]+|\\.)*}'
|
|
|
|
token STR: r'"([^\\"]+|\\.)*"'
|
|
|
|
token RAWTEXT: r'.*'
|
2003-09-02 01:17:58 +02:00
|
|
|
token ON: 'on'
|
|
|
|
token OFF: 'off'
|
|
|
|
token PCI: 'pci'
|
|
|
|
token PNP: 'pnp'
|
|
|
|
token I2C: 'i2c'
|
2004-10-14 18:25:01 +02:00
|
|
|
token APIC: 'apic'
|
2004-10-16 04:48:37 +02:00
|
|
|
token APIC_CLUSTER: 'apic_cluster'
|
2004-11-20 22:20:40 +01:00
|
|
|
token CPU: 'cpu'
|
|
|
|
token CPU_BUS: 'cpu_bus'
|
2004-10-15 21:17:43 +02:00
|
|
|
token PCI_DOMAIN: 'pci_domain'
|
2003-09-02 01:17:58 +02:00
|
|
|
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-06-24 19:26:45 +02:00
|
|
|
rule expr: logical {{ l = logical }}
|
|
|
|
( "&&" logical {{ l = l and logical }}
|
|
|
|
| "||" logical {{ l = l or logical }}
|
2003-06-23 18:54:12 +02:00
|
|
|
)* {{ return l }}
|
|
|
|
|
2003-06-24 19:26:45 +02:00
|
|
|
rule logical: factor {{ n = factor }}
|
|
|
|
( "[+]" factor {{ n = n+factor }}
|
|
|
|
| "-" factor {{ n = n-factor }}
|
2003-06-23 18:54:12 +02:00
|
|
|
)* {{ return n }}
|
|
|
|
|
2003-06-24 19:26:45 +02:00
|
|
|
rule factor: term {{ v = term }}
|
|
|
|
( "[*]" term {{ v = v*term }}
|
|
|
|
| "/" term {{ v = v/term }}
|
|
|
|
| "<<" term {{ v = v << term }}
|
|
|
|
| ">=" term {{ v = (v < term)}}
|
2003-06-23 18:54:12 +02:00
|
|
|
)* {{ return v }}
|
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
# A term is a number, variable, or an expression surrounded by parentheses
|
2003-09-02 01:17:58 +02:00
|
|
|
rule term: NUM {{ return long(NUM, 10) }}
|
|
|
|
| HEX_PREFIX HEX_NUM {{ return long(HEX_NUM, 16) }}
|
2003-06-24 19:26:45 +02:00
|
|
|
| ID {{ return lookup(ID) }}
|
|
|
|
| unop {{ return unop }}
|
|
|
|
| "\\(" expr "\\)" {{ return expr }}
|
|
|
|
|
|
|
|
rule unop: "!" expr {{ return not(expr) }}
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
rule partend<<C>>: (stmt<<C>>)* END {{ if (C): partpop()}}
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-07-24 23:19:19 +02:00
|
|
|
# This is needed because the legacy cpu command could not distinguish
|
|
|
|
# between cpu vendors. It should just be PATH, but getting this change
|
2003-07-28 23:35:14 +02:00
|
|
|
# into the source tree will be tricky...
|
|
|
|
# DO NOT USE ID AS IT MAY GO AWAY IN THE FUTURE
|
|
|
|
rule partid: ID {{ return ID }}
|
2003-07-24 23:19:19 +02:00
|
|
|
| PATH {{ return PATH }}
|
|
|
|
|
2004-10-16 21:58:35 +02:00
|
|
|
# rule parttype: NORTHBRIDGE {{ return 'northbridge' }}
|
|
|
|
# | SUPERIO {{ return 'superio' }}
|
|
|
|
# | PMC {{ return 'pmc' }}
|
|
|
|
# | SOUTHBRIDGE {{ return 'southbridge' }}
|
|
|
|
# | CPU {{ return 'cpu' }}
|
|
|
|
# | CHIP {{ return '' }}
|
|
|
|
#
|
|
|
|
rule parttype: CHIP {{ return '' }}
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2004-10-16 21:58:35 +02:00
|
|
|
rule partdef<<C>>: {{ name = 0 }}
|
|
|
|
parttype partid
|
2003-07-28 23:35:14 +02:00
|
|
|
[ STR {{ name = dequote(STR) }}
|
2004-10-16 21:58:35 +02:00
|
|
|
] {{ if (C): part(parttype, partid, 'Config.lb', name) }}
|
2003-10-11 08:20:25 +02:00
|
|
|
partend<<C>>
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-07-28 23:35:14 +02:00
|
|
|
rule arch<<C>>: ARCH ID {{ if (C): setarch(ID) }}
|
2003-06-23 18:54:12 +02:00
|
|
|
partend<<C>>
|
2003-07-28 23:35:14 +02:00
|
|
|
|
2003-07-14 20:00:10 +02:00
|
|
|
rule mainboardinit<<C>>:
|
2003-06-23 18:54:12 +02:00
|
|
|
MAINBOARDINIT DIRPATH {{ if (C): addcrt0include(DIRPATH)}}
|
|
|
|
|
2003-07-14 20:00:10 +02:00
|
|
|
rule initinclude<<C>>:
|
|
|
|
INITINCLUDE
|
|
|
|
STR
|
|
|
|
DIRPATH {{ if (C): addinitinclude(STR, DIRPATH)}}
|
|
|
|
|
|
|
|
rule initobject<<C>>:
|
|
|
|
INITOBJECT DIRPATH {{ if (C): addinitobject(DIRPATH)}}
|
|
|
|
|
2003-06-23 18:54:12 +02:00
|
|
|
rule object<<C>>: OBJECT DIRPATH {{ if (C): addobject(DIRPATH)}}
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-06-23 18:54:12 +02:00
|
|
|
rule driver<<C>>: DRIVER DIRPATH {{ if (C): adddriver(DIRPATH)}}
|
|
|
|
|
2009-01-19 22:20:22 +01:00
|
|
|
rule smmobject<<C>>:
|
|
|
|
SMMOBJECT DIRPATH {{ if (C): addsmmobject(DIRPATH)}}
|
|
|
|
|
|
|
|
|
2003-06-23 18:54:12 +02:00
|
|
|
rule dir<<C>>: DIR DIRPATH {{ if (C): dodir(DIRPATH, 'Config.lb') }}
|
|
|
|
|
2003-11-05 19:55:44 +01:00
|
|
|
rule default<<C>>: DEFAULT ID EQ value {{ if (C): setdefault(ID, value, 0) }}
|
|
|
|
|
2003-06-23 18:54:12 +02:00
|
|
|
rule ldscript<<C>>: LDSCRIPT DIRPATH {{ if (C): addldscript(DIRPATH) }}
|
|
|
|
|
2003-06-24 19:26:45 +02:00
|
|
|
rule iif<<C>>: IF ID {{ c = lookup(ID) }}
|
2003-07-18 00:25:53 +02:00
|
|
|
(stmt<<C and c>>)*
|
|
|
|
[ ELSE (stmt<<C and not c>>)* ]
|
|
|
|
END
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2008-11-28 12:56:27 +01:00
|
|
|
rule makerule<<C>>: MAKERULE RULE {{ if (C): addrule(RULE) }}
|
|
|
|
( DEPENDS STR {{ if (C): adddep(RULE, STR) }}
|
|
|
|
| ACTION STR {{ if (C): addaction(RULE, STR) }}
|
2003-06-14 17:07:02 +02:00
|
|
|
)*
|
2003-07-14 20:00:10 +02:00
|
|
|
END
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
rule makedefine<<C>>:
|
|
|
|
MAKEDEFINE RAWTEXT {{ if (C): adduserdefine(RAWTEXT) }}
|
|
|
|
|
|
|
|
rule addaction<<C>>:
|
|
|
|
ADDACTION ID STR {{ if (C): addaction(ID, STR) }}
|
|
|
|
|
2003-07-14 20:00:10 +02:00
|
|
|
rule init<<C>>: INIT DIRPATH {{ if (C): addinit(DIRPATH) }}
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-07-23 20:13:19 +02:00
|
|
|
rule field: STR {{ return STR }}
|
|
|
|
|
|
|
|
rule register<<C>>: REGISTER field '=' STR {{ if (C): addregister(field, STR) }}
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2004-10-16 04:48:37 +02:00
|
|
|
rule enable<<C>>: {{ val = 1 }}
|
|
|
|
( ON {{ val = 1 }}
|
2003-09-02 01:17:58 +02:00
|
|
|
| OFF {{ val = 0 }}
|
2004-10-16 04:48:37 +02:00
|
|
|
) {{ if(C): partstack.tos().set_enabled(val) }}
|
2004-03-11 16:01:31 +01:00
|
|
|
|
|
|
|
rule resource<<C>>: {{ type = "" }}
|
2004-10-19 01:24:25 +02:00
|
|
|
( IO {{ type = "IORESOURCE_FIXED | IORESOURCE_ASSIGNED | IORESOURCE_IO" }}
|
|
|
|
| MEM {{ type = "IORESOURCE_FIXED | IORESOURCE_ASSIGNED | IORESOURCE_MEM" }}
|
|
|
|
| IRQ {{ type = "IORESOURCE_FIXED | IORESOURCE_ASSIGNED | IORESOURCE_IRQ" }}
|
|
|
|
| DRQ {{ type = "IORESOURCE_FIXED | IORESOURCE_ASSIGNED | IORESOURCE_DRQ" }}
|
2004-03-11 16:01:31 +01:00
|
|
|
)
|
|
|
|
term '=' {{ index = term }}
|
|
|
|
term {{ value = term }}
|
|
|
|
{{ if (C): partstack.tos().add_resource(type, index, value) }}
|
|
|
|
|
|
|
|
|
|
|
|
rule resources<<C>>: {{ if (C): partstack.tos().start_resources() }}
|
|
|
|
( resource<<C>> )*
|
|
|
|
{{ if (C): partstack.tos().end_resources() }}
|
|
|
|
|
2003-09-02 01:17:58 +02:00
|
|
|
|
2004-10-14 23:57:29 +02:00
|
|
|
rule pci<<C>>: PCI {{ if (C): devicepart('pci') }}
|
2004-10-14 23:40:58 +02:00
|
|
|
|
|
|
|
HEX_NUM {{ slot = int(HEX_NUM,16) }}
|
2003-09-02 01:17:58 +02:00
|
|
|
'.' HEX_NUM {{ function = int(HEX_NUM, 16) }}
|
2004-10-16 04:48:37 +02:00
|
|
|
{{ if (C): partstack.tos().addpcipath(slot, function) }}
|
|
|
|
rule pci_domain<<C>>:
|
|
|
|
PCI_DOMAIN {{ if (C): devicepart('pci_domain') }}
|
|
|
|
HEX_NUM {{ pci_domain = int(HEX_NUM, 16) }}
|
|
|
|
{{ if (C): partstack.tos().addpci_domainpath(pci_domain) }}
|
2003-09-02 01:17:58 +02:00
|
|
|
|
2004-10-14 23:57:29 +02:00
|
|
|
rule pnp<<C>>: PNP {{ if (C): devicepart('pnp') }}
|
2004-10-14 23:40:58 +02:00
|
|
|
HEX_NUM {{ port = int(HEX_NUM,16) }}
|
2003-09-02 01:17:58 +02:00
|
|
|
'.' HEX_NUM {{ device = int(HEX_NUM, 16) }}
|
2004-10-16 04:48:37 +02:00
|
|
|
{{ if (C): partstack.tos().addpnppath(port, device) }}
|
|
|
|
|
2004-10-14 23:57:29 +02:00
|
|
|
rule i2c<<C>>: I2C {{ if (C): devicepart('i2c') }}
|
2004-10-14 23:40:58 +02:00
|
|
|
HEX_NUM {{ device = int(HEX_NUM, 16) }}
|
2004-10-16 04:48:37 +02:00
|
|
|
{{ if (C): partstack.tos().addi2cpath(device) }}
|
2004-10-14 18:25:01 +02:00
|
|
|
|
2004-10-14 23:57:29 +02:00
|
|
|
rule apic<<C>>: APIC {{ if (C): devicepart('apic') }}
|
2004-10-14 23:40:58 +02:00
|
|
|
HEX_NUM {{ apic_id = int(HEX_NUM, 16) }}
|
2004-10-16 04:48:37 +02:00
|
|
|
{{ if (C): partstack.tos().addapicpath(apic_id) }}
|
2004-10-15 21:17:43 +02:00
|
|
|
|
2004-10-16 04:48:37 +02:00
|
|
|
rule apic_cluster<<C>>: APIC_CLUSTER {{ if (C): devicepart('apic_cluster') }}
|
|
|
|
HEX_NUM {{ cluster = int(HEX_NUM, 16) }}
|
2004-10-16 10:38:58 +02:00
|
|
|
{{ if (C): partstack.tos().addapic_clusterpath(cluster) }}
|
2004-10-14 18:25:01 +02:00
|
|
|
|
2004-11-22 22:45:24 +01:00
|
|
|
rule cpu<<C>>: CPU {{ if (C): devicepart('cpu') }}
|
|
|
|
HEX_NUM {{ id = int(HEX_NUM, 16) }}
|
2004-11-20 22:20:40 +01:00
|
|
|
{{ if (C): partstack.tos().addcpupath(id) }}
|
|
|
|
|
2004-11-22 22:45:24 +01:00
|
|
|
rule cpu_bus<<C>>: CPU_BUS {{ if (C): devicepart('cpu_bus') }}
|
|
|
|
HEX_NUM {{ id = int(HEX_NUM, 16) }}
|
|
|
|
{{ if (C): partstack.tos().addcpu_buspath(id) }}
|
2004-11-20 22:20:40 +01:00
|
|
|
|
2004-11-22 22:45:24 +01:00
|
|
|
rule dev_path<<C>>:
|
2004-10-14 18:25:01 +02:00
|
|
|
pci<<C>> {{ return pci }}
|
2004-10-16 04:48:37 +02:00
|
|
|
| pci_domain<<C>> {{ return pci_domain }}
|
2004-10-14 18:25:01 +02:00
|
|
|
| pnp<<C>> {{ return pnp }}
|
|
|
|
| i2c<<C>> {{ return i2c }}
|
|
|
|
| apic<<C>> {{ return apic }}
|
2004-10-16 04:48:37 +02:00
|
|
|
| apic_cluster<<C>> {{ return apic_cluster }}
|
2004-11-20 22:20:40 +01:00
|
|
|
| cpu<<C>> {{ return cpu }}
|
|
|
|
| cpu_bus<<C>> {{ return cpu_bus }}
|
2004-10-14 18:25:01 +02:00
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
rule prtval: expr {{ return str(expr) }}
|
|
|
|
| STR {{ return STR }}
|
|
|
|
|
|
|
|
rule prtlist: prtval {{ el = "%(" + prtval }}
|
|
|
|
( "," prtval {{ el = el + "," + prtval }}
|
|
|
|
)* {{ return el + ")" }}
|
|
|
|
|
|
|
|
rule prtstmt<<C>>: PRINT STR {{ val = STR }}
|
|
|
|
[ "," prtlist {{ val = val + prtlist }}
|
|
|
|
] {{ if (C): print eval(val) }}
|
|
|
|
|
2003-07-23 20:13:19 +02:00
|
|
|
rule config<<C>>: CONFIG PATH {{ if (C): addconfig(PATH) }}
|
|
|
|
|
2004-10-16 04:48:37 +02:00
|
|
|
rule device<<C>>: DEVICE dev_path<<C>>
|
|
|
|
enable<<C>>
|
|
|
|
resources<<C>>
|
|
|
|
partend<<C>>
|
2004-10-14 23:40:58 +02:00
|
|
|
|
2003-07-18 19:05:10 +02:00
|
|
|
rule stmt<<C>>: arch<<C>> {{ return arch}}
|
|
|
|
| addaction<<C>> {{ return addaction }}
|
2003-07-23 20:13:19 +02:00
|
|
|
| config<<C>> {{ return config}}
|
2003-11-05 19:55:44 +01:00
|
|
|
| default<<C>> {{ return default}}
|
2003-07-18 00:25:53 +02:00
|
|
|
| dir<<C>> {{ return dir}}
|
2003-06-23 18:54:12 +02:00
|
|
|
| driver<<C>> {{ return driver }}
|
2003-07-18 19:05:10 +02:00
|
|
|
| iif<<C>> {{ return iif }}
|
2003-07-18 00:25:53 +02:00
|
|
|
| init<<C>> {{ return init }}
|
|
|
|
| initinclude<<C>> {{ return initinclude }}
|
|
|
|
| initobject<<C>> {{ return initobject }}
|
2003-06-23 18:54:12 +02:00
|
|
|
| ldscript<<C>> {{ return ldscript}}
|
2003-07-18 00:25:53 +02:00
|
|
|
| mainboardinit<<C>> {{ return mainboardinit }}
|
|
|
|
| makedefine<<C>> {{ return makedefine }}
|
|
|
|
| makerule<<C>> {{ return makerule }}
|
|
|
|
| object<<C>> {{ return object }}
|
2003-07-18 19:05:10 +02:00
|
|
|
| option<<C>> {{ return option }}
|
2003-07-28 23:35:14 +02:00
|
|
|
| partdef<<C>> {{ return partdef }}
|
2003-09-02 01:17:58 +02:00
|
|
|
| prtstmt<<C>> {{ return prtstmt }}
|
|
|
|
| register<<C>> {{ return register }}
|
2004-10-14 23:40:58 +02:00
|
|
|
| device<<C>> {{ return device }}
|
2009-01-19 22:20:22 +01:00
|
|
|
| smmobject<<C>> {{ return smmobject }}
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-06-24 01:52:15 +02:00
|
|
|
# ENTRY for parsing Config.lb file
|
2003-07-18 00:25:53 +02:00
|
|
|
rule cfgfile: (uses<<1>>)*
|
|
|
|
(stmt<<1>>)*
|
|
|
|
EOF {{ return 1 }}
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2004-10-14 23:40:58 +02:00
|
|
|
rule cfgfile: (uses<<1>>)*
|
|
|
|
(stmt<<1>>)*
|
|
|
|
EOF {{ return 1 }}
|
|
|
|
|
2003-06-23 18:54:12 +02:00
|
|
|
rule usesid<<C>>: ID {{ if (C): usesoption(ID) }}
|
|
|
|
|
|
|
|
rule uses<<C>>: USES (usesid<<C>>)+
|
|
|
|
|
2004-10-14 23:40:58 +02:00
|
|
|
rule mainboardvariables: (uses<<1>>)*
|
|
|
|
(default<<1>>)*
|
|
|
|
(option<<1>>)*
|
|
|
|
END {{ return 1}}
|
|
|
|
|
2003-06-23 18:54:12 +02:00
|
|
|
rule value: STR {{ return dequote(STR) }}
|
2003-06-24 19:26:45 +02:00
|
|
|
| expr {{ return expr }}
|
2003-06-23 18:54:12 +02:00
|
|
|
| DELEXPR {{ return DELEXPR }}
|
|
|
|
|
2003-11-05 19:55:44 +01:00
|
|
|
rule option<<C>>: OPTION ID EQ value {{ if (C): setoption(ID, value, 0) }}
|
2003-06-24 19:26:45 +02:00
|
|
|
|
2003-06-25 17:27:41 +02:00
|
|
|
rule opif<<C>>: IF ID {{ c = lookup(ID) }}
|
|
|
|
(opstmt<<C and c>>)*
|
2003-07-18 00:25:53 +02:00
|
|
|
[ ELSE (opstmt<<C and not c>>)* ]
|
|
|
|
END
|
2003-06-25 17:27:41 +02:00
|
|
|
|
|
|
|
rule opstmt<<C>>: option<<C>>
|
|
|
|
| opif<<C>>
|
2003-07-10 22:55:09 +02:00
|
|
|
| prtstmt<<C>>
|
|
|
|
|
2003-07-18 19:05:10 +02:00
|
|
|
rule payload<<C>>: PAYLOAD DIRPATH {{ if (C): payload(DIRPATH) }}
|
|
|
|
|
2004-10-14 23:40:58 +02:00
|
|
|
rule mainboard:
|
|
|
|
MAINBOARD PATH {{ mainboardsetup(PATH) }}
|
2003-07-18 19:05:10 +02:00
|
|
|
|
|
|
|
rule romif<<C>>: IF ID {{ c = lookup(ID) }}
|
|
|
|
(romstmt<<C and c>>)*
|
|
|
|
[ ELSE (romstmt<<C and not c>>)* ]
|
|
|
|
END
|
|
|
|
|
|
|
|
rule romstmt<<C>>: romif<<C>>
|
|
|
|
| option<<C>>
|
|
|
|
| payload<<C>>
|
2003-07-10 22:55:09 +02:00
|
|
|
|
2003-07-18 03:06:15 +02:00
|
|
|
rule romimage: ROMIMAGE STR {{ startromimage(dequote(STR)) }}
|
2003-07-18 19:05:10 +02:00
|
|
|
(romstmt<<1>>)*
|
2003-07-18 03:06:15 +02:00
|
|
|
END {{ endromimage() }}
|
2003-06-24 19:26:45 +02:00
|
|
|
|
2003-09-26 13:40:05 +02:00
|
|
|
rule roms: STR {{ s = '[' + STR }}
|
2003-07-18 00:25:53 +02:00
|
|
|
( STR {{ s = s + "," + STR }}
|
2003-09-26 13:40:05 +02:00
|
|
|
)* {{ return eval(s + ']') }}
|
2003-06-24 19:26:45 +02:00
|
|
|
|
2003-09-17 14:17:58 +02:00
|
|
|
rule buildrom: BUILDROM DIRPATH expr roms {{ addbuildrom(DIRPATH, expr, roms) }}
|
2003-07-18 00:25:53 +02:00
|
|
|
|
2003-07-18 03:06:15 +02:00
|
|
|
rule romstmts: romimage
|
|
|
|
| buildrom
|
|
|
|
| opstmt<<1>>
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-06-24 01:52:15 +02:00
|
|
|
# ENTRY for parsing root part
|
2004-10-14 23:40:58 +02:00
|
|
|
rule board: {{ loadoptions("config", "Options.lb", "options") }}
|
2003-06-23 18:54:12 +02:00
|
|
|
TARGET DIRPATH {{ target(DIRPATH) }}
|
2004-10-14 23:40:58 +02:00
|
|
|
mainboard
|
2003-07-18 00:25:53 +02:00
|
|
|
(romstmts)*
|
|
|
|
EOF {{ return 1 }}
|
|
|
|
|
|
|
|
# ENTRY for parsing a delayed value
|
|
|
|
rule delexpr: "{" expr "}" EOF {{ return expr }}
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-11-05 19:55:44 +01:00
|
|
|
rule wrstr<<ID>>: STR {{ setwrite(ID, dequote(STR)) }}
|
|
|
|
|
2003-06-23 18:54:12 +02:00
|
|
|
rule defstmts<<ID>>: {{ d = 0 }}
|
|
|
|
( DEFAULT
|
2003-11-05 19:55:44 +01:00
|
|
|
( value {{ setdefault(ID, value, 1) }}
|
2003-06-23 18:54:12 +02:00
|
|
|
| NONE {{ setnodefault(ID) }}
|
2003-06-24 05:08:57 +02:00
|
|
|
) {{ d = d | 1 }}
|
2003-06-23 18:54:12 +02:00
|
|
|
| FORMAT STR {{ setformat(ID, dequote(STR)) }}
|
|
|
|
| EXPORT
|
|
|
|
( ALWAYS {{ setexported(ID) }}
|
2003-06-24 01:52:15 +02:00
|
|
|
| USED {{ setexportable(ID) }}
|
2003-06-23 18:54:12 +02:00
|
|
|
| NEVER {{ setnoexport(ID) }}
|
2003-06-24 05:08:57 +02:00
|
|
|
) {{ d = d | 2 }}
|
|
|
|
| COMMENT STR {{ setcomment(ID, dequote(STR)); d = d | 4 }}
|
2003-11-05 19:55:44 +01:00
|
|
|
| WRITE (wrstr<<ID>>)+
|
2003-06-23 18:54:12 +02:00
|
|
|
)+ {{ return d }}
|
|
|
|
|
|
|
|
rule define: DEFINE ID {{ newoption(ID) }}
|
|
|
|
defstmts<<ID>> END {{ validdef(ID, defstmts) }}
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-06-24 01:52:15 +02:00
|
|
|
# ENTRY for parsing Options.lb file
|
2003-07-18 00:25:53 +02:00
|
|
|
rule options: (define)* EOF {{ return 1 }}
|
2003-06-14 17:07:02 +02:00
|
|
|
%%
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
#=============================================================================
|
|
|
|
# FILE OUTPUT
|
|
|
|
#=============================================================================
|
|
|
|
def writemakefileheader(file, fname):
|
2004-11-05 09:21:05 +01:00
|
|
|
file.write("# File: %s is autogenerated\n" % fname)
|
2004-11-05 09:57:09 +01:00
|
|
|
|
|
|
|
def writemakefilefooter(file, fname):
|
|
|
|
file.write("\n\n%s: %s %s\n"
|
2004-11-05 09:50:54 +01:00
|
|
|
% (os.path.basename(fname), os.path.abspath(sys.argv[0]), top_config_file))
|
2006-08-11 08:49:39 +02:00
|
|
|
file.write("\t(cd %s ; export PYTHONPATH=%s/util/newconfig ; python %s %s %s)\n\n"
|
|
|
|
% (os.getcwd(), treetop, sys.argv[0], sys.argv[1], sys.argv[2]))
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
def writemakefilesettings(path):
|
2003-11-05 19:55:44 +01:00
|
|
|
""" Write Makefile.settings to seperate the settings
|
2004-02-04 10:11:51 +01:00
|
|
|
from the actual makefile creation."""
|
2003-11-05 19:55:44 +01:00
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
global treetop, target_dir
|
|
|
|
|
|
|
|
filename = os.path.join(path, "Makefile.settings")
|
|
|
|
print "Creating", filename
|
2003-07-25 19:29:13 +02:00
|
|
|
file = safe_open(filename, 'w+')
|
2003-07-18 00:25:53 +02:00
|
|
|
writemakefileheader(file, filename)
|
|
|
|
file.write("TOP:=%s\n" % (treetop))
|
|
|
|
file.write("TARGET_DIR:=%s\n" % target_dir)
|
2004-11-05 09:57:09 +01:00
|
|
|
writemakefilefooter(file, filename)
|
2003-07-18 00:25:53 +02:00
|
|
|
file.close()
|
|
|
|
|
|
|
|
def writeimagesettings(image):
|
2003-11-05 19:55:44 +01:00
|
|
|
"""Write Makefile.settings to seperate the settings
|
2004-02-04 10:11:51 +01:00
|
|
|
from the actual makefile creation."""
|
2003-11-05 19:55:44 +01:00
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
global treetop
|
|
|
|
global global_options_by_order
|
|
|
|
|
|
|
|
filename = os.path.join(image.gettargetdir(), "Makefile.settings")
|
|
|
|
print "Creating", filename
|
2003-07-25 19:29:13 +02:00
|
|
|
file = safe_open(filename, 'w+')
|
2003-07-18 00:25:53 +02:00
|
|
|
writemakefileheader(file, filename)
|
|
|
|
file.write("TOP:=%s\n" % (treetop))
|
|
|
|
file.write("TARGET_DIR:=%s\n" % (image.gettargetdir()))
|
2004-02-04 10:11:51 +01:00
|
|
|
file.write("\n")
|
|
|
|
exported = []
|
|
|
|
for o in global_exported_options:
|
|
|
|
exported.append(o)
|
|
|
|
for o in image.exported_options:
|
|
|
|
if (not o in exported):
|
|
|
|
exported.append(o)
|
|
|
|
for o in exported:
|
|
|
|
file.write("export %s:=" % o.name)
|
|
|
|
if (hasvalue(o.name, image)):
|
|
|
|
file.write("%s" % getformated(o.name, image))
|
|
|
|
file.write("\n")
|
|
|
|
file.write("\n")
|
|
|
|
file.write("export VARIABLES :=\n")
|
|
|
|
for o in exported:
|
|
|
|
file.write("export VARIABLES += %s\n" % o.name)
|
2003-07-18 00:25:53 +02:00
|
|
|
file.write("\n")
|
2004-11-05 09:57:09 +01:00
|
|
|
writemakefilefooter(file,filename)
|
2003-07-18 00:25:53 +02:00
|
|
|
file.close()
|
|
|
|
|
|
|
|
# write the romimage makefile
|
|
|
|
# let's try the Makefile
|
|
|
|
# first, dump all the -D stuff
|
|
|
|
|
|
|
|
def writeimagemakefile(image):
|
|
|
|
makefilepath = os.path.join(image.gettargetdir(), "Makefile")
|
|
|
|
print "Creating", makefilepath
|
2003-07-25 19:29:13 +02:00
|
|
|
file = safe_open(makefilepath, 'w+')
|
2003-07-18 00:25:53 +02:00
|
|
|
writemakefileheader(file, makefilepath)
|
|
|
|
|
2004-11-05 10:03:47 +01:00
|
|
|
# main rule
|
2008-01-18 16:08:58 +01:00
|
|
|
file.write("\nall: coreboot.rom\n\n")
|
2005-12-02 22:52:30 +01:00
|
|
|
file.write(".PHONY: all\n\n")
|
2003-07-18 00:25:53 +02:00
|
|
|
#file.write("include cpuflags\n")
|
|
|
|
# Putting "include cpuflags" in the Makefile has the problem that the
|
|
|
|
# cpuflags file would be generated _after_ we want to include it.
|
|
|
|
# Instead, let make do the work of computing CPUFLAGS:
|
|
|
|
file.write("# Get the value of TOP, VARIABLES, and several other variables.\n")
|
|
|
|
file.write("include Makefile.settings\n\n")
|
2003-09-02 01:17:58 +02:00
|
|
|
file.write("# Function to create an item like -Di586 or -DCONFIG_MAX_CPUS='1' or -Ui686\n")
|
2009-04-03 01:08:16 +02:00
|
|
|
file.write("D_item = $(shell echo '$(if $(subst undefined,,$(origin $1)),\\#define $1$(if $($1), $($1),),\\#undef $1)' >> settings.h)\n\n")
|
2003-07-18 00:25:53 +02:00
|
|
|
file.write("# Compute the value of CPUFLAGS here during make's first pass.\n")
|
2009-04-03 01:08:16 +02:00
|
|
|
file.write("CPUFLAGS := $(strip $(shell echo '/* autogenerated */' > settings.h)$(foreach _var_,$(VARIABLES),$(call D_item,$(_var_)))--include=settings.h)\n\n")
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
for i in image.getuserdefines():
|
|
|
|
file.write("%s\n" %i)
|
|
|
|
file.write("\n")
|
|
|
|
|
|
|
|
# print out all the object dependencies
|
|
|
|
file.write("\n# object dependencies (objectrules:)\n")
|
|
|
|
file.write("INIT-OBJECTS :=\n")
|
|
|
|
file.write("OBJECTS :=\n")
|
|
|
|
file.write("DRIVER :=\n")
|
|
|
|
file.write("\nSOURCES :=\n")
|
2003-07-19 06:07:07 +02:00
|
|
|
for irule, init in image.getinitobjectrules().items():
|
2003-07-18 00:25:53 +02:00
|
|
|
i_name = init[0]
|
|
|
|
i_source = init[1]
|
|
|
|
file.write("INIT-OBJECTS += %s\n" % (i_name))
|
|
|
|
file.write("SOURCES += %s\n" % (i_source))
|
|
|
|
|
2003-07-19 06:07:07 +02:00
|
|
|
for objrule, obj in image.getobjectrules().items():
|
2003-07-18 00:25:53 +02:00
|
|
|
obj_name = obj[0]
|
|
|
|
obj_source = obj[1]
|
2003-07-21 01:28:01 +02:00
|
|
|
file.write("OBJECTS += %s\n" % (obj_name))
|
2003-07-18 00:25:53 +02:00
|
|
|
file.write("SOURCES += %s\n" % (obj_source))
|
|
|
|
|
2009-01-19 22:20:22 +01:00
|
|
|
for srule, smm in image.getsmmobjectrules().items():
|
|
|
|
s_name = smm[0]
|
|
|
|
s_source = smm[1]
|
|
|
|
file.write("SMM-OBJECTS += %s\n" % (s_name))
|
|
|
|
file.write("SOURCES += %s\n" % (s_source))
|
|
|
|
|
|
|
|
|
2003-07-21 01:28:01 +02:00
|
|
|
# for chip_target.c
|
2003-07-23 20:13:19 +02:00
|
|
|
file.write("OBJECTS += static.o\n")
|
|
|
|
file.write("SOURCES += static.c\n")
|
2003-07-21 01:28:01 +02:00
|
|
|
|
2003-07-19 06:07:07 +02:00
|
|
|
for driverrule, driver in image.getdriverrules().items():
|
2003-07-18 00:25:53 +02:00
|
|
|
obj_name = driver[0]
|
|
|
|
obj_source = driver[1]
|
|
|
|
file.write("DRIVER += %s\n" % (obj_name))
|
|
|
|
file.write("SOURCES += %s\n" % (obj_source))
|
|
|
|
|
|
|
|
# Print out all ldscript.ld dependencies.
|
|
|
|
file.write("\n# ldscript.ld dependencies:\n")
|
|
|
|
file.write("LDSUBSCRIPTS-1 := \n" )
|
|
|
|
for script in image.getldscripts():
|
|
|
|
file.write("LDSUBSCRIPTS-1 += %s\n" % topify(script))
|
|
|
|
|
|
|
|
# Print out the dependencies for crt0_includes.h
|
|
|
|
file.write("\n# Dependencies for crt0_includes.h\n")
|
|
|
|
file.write("CRT0_INCLUDES:=\n")
|
2003-07-21 18:51:40 +02:00
|
|
|
for inc in image.getinitincludes():
|
2003-07-18 00:25:53 +02:00
|
|
|
if (local_path.match(inc)):
|
|
|
|
file.write("CRT0_INCLUDES += %s\n" % inc)
|
|
|
|
else:
|
|
|
|
file.write("CRT0_INCLUDES += $(TOP)/src/%s\n" % inc)
|
|
|
|
|
|
|
|
# Print out the user defines.
|
|
|
|
file.write("\n# userdefines:\n")
|
|
|
|
|
|
|
|
# Print out the base rules.
|
|
|
|
# Need to have a rule that counts on 'all'.
|
|
|
|
file.write("\n# mainrulelist:")
|
|
|
|
|
|
|
|
# Print out any user rules.
|
|
|
|
file.write("\n# From makerule or docipl commands:\n")
|
2003-11-05 19:55:44 +01:00
|
|
|
|
|
|
|
file.write("\n# initobjectrules:\n")
|
|
|
|
for irule, init in image.getinitobjectrules().items():
|
|
|
|
source = topify(init[1])
|
|
|
|
type = init[2]
|
|
|
|
if (type == 'S'):
|
|
|
|
# for .S, .o depends on .s
|
|
|
|
file.write("%s: %s.s\n" % (init[0], init[3]))
|
|
|
|
file.write("\t$(CC) -c $(CPU_OPT) -o $@ $<\n")
|
|
|
|
# and .s depends on .S
|
|
|
|
file.write("%s.s: %s\n" % (init[3], source))
|
|
|
|
# Note: next 2 lines are ONE output line!
|
|
|
|
file.write("\t$(CPP) $(CPPFLAGS) $< ")
|
|
|
|
file.write(">$@.new && mv $@.new $@\n")
|
|
|
|
else:
|
|
|
|
file.write("%s: %s\n" % (init[0], source))
|
|
|
|
file.write("\t$(CC) -c $(CFLAGS) -o $@ $<\n")
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
file.write("\n# objectrules:\n")
|
2003-07-19 06:07:07 +02:00
|
|
|
for objrule, obj in image.getobjectrules().items():
|
2003-07-18 00:25:53 +02:00
|
|
|
source = topify(obj[1])
|
2003-07-23 05:11:40 +02:00
|
|
|
type = obj[2]
|
|
|
|
if (type == 'S'):
|
|
|
|
# for .S, .o depends on .s
|
|
|
|
file.write("%s: %s.s\n" % (obj[0], obj[3]))
|
|
|
|
file.write("\t$(CC) -c $(CPU_OPT) -o $@ $<\n")
|
|
|
|
# and .s depends on .S
|
|
|
|
file.write("%s.s: %s\n" % (obj[3], source))
|
|
|
|
# Note: next 2 lines are ONE output line!
|
|
|
|
file.write("\t$(CPP) $(CPPFLAGS) $< ")
|
|
|
|
file.write(">$@.new && mv $@.new $@\n")
|
|
|
|
else:
|
|
|
|
file.write("%s: %s\n" % (obj[0], source))
|
|
|
|
file.write("\t$(CC) -c $(CFLAGS) -o $@ $<\n")
|
2003-07-18 00:25:53 +02:00
|
|
|
#file.write("%s\n" % objrule[2])
|
|
|
|
|
2003-07-19 06:07:07 +02:00
|
|
|
for driverrule, driver in image.getdriverrules().items():
|
2003-07-18 00:25:53 +02:00
|
|
|
source = topify(driver[1])
|
|
|
|
file.write("%s: %s\n" % (driver[0], source))
|
|
|
|
file.write("\t$(CC) -c $(CFLAGS) -o $@ $<\n")
|
|
|
|
#file.write("%s\n" % objrule[2])
|
|
|
|
|
2009-01-19 22:20:22 +01:00
|
|
|
file.write("\n# smmobjectrules:\n")
|
|
|
|
for irule, smm in image.getsmmobjectrules().items():
|
|
|
|
source = topify(smm[1])
|
|
|
|
type = smm[2]
|
|
|
|
if (type == 'S'):
|
|
|
|
# for .S, .o depends on .s
|
|
|
|
file.write("%s: %s.s\n" % (smm[0], smm[3]))
|
|
|
|
file.write("\t$(CC) -c $(CPU_OPT) -o $@ $<\n")
|
|
|
|
# and .s depends on .S
|
|
|
|
file.write("%s.s: %s\n" % (smm[3], source))
|
|
|
|
# Note: next 2 lines are ONE output line!
|
|
|
|
file.write("\t$(CPP) $(CPPFLAGS) $< ")
|
|
|
|
file.write(">$@.new && mv $@.new $@\n")
|
|
|
|
else:
|
|
|
|
file.write("%s: %s\n" % (smm[0], source))
|
|
|
|
file.write("\t$(CC) -c $(CFLAGS) -o $@ $<\n")
|
|
|
|
|
2003-07-21 06:20:08 +02:00
|
|
|
# special rule for chip_target.c
|
2003-07-23 20:13:19 +02:00
|
|
|
file.write("static.o: static.c\n")
|
2003-07-21 01:28:01 +02:00
|
|
|
file.write("\t$(CC) -c $(CFLAGS) -o $@ $<\n")
|
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
# Print out the rules that will make cause the files
|
|
|
|
# generated by NLBConfig.py to be remade if any dependencies change.
|
|
|
|
|
|
|
|
file.write("\n# Remember the automatically generated files\n")
|
|
|
|
file.write("GENERATED:=\n")
|
2003-07-21 01:28:01 +02:00
|
|
|
for genfile in ['Makefile',
|
2003-07-18 00:25:53 +02:00
|
|
|
'nsuperio.c',
|
2003-07-23 20:13:19 +02:00
|
|
|
'static.c',
|
2008-01-18 16:08:58 +01:00
|
|
|
'corebootDoc.config' ]:
|
2003-07-18 00:25:53 +02:00
|
|
|
file.write("GENERATED += %s\n" % genfile)
|
2003-07-21 01:28:01 +02:00
|
|
|
file.write("GENERATED += %s\n" % image.getincludefilename())
|
2003-07-18 00:25:53 +02:00
|
|
|
|
2003-09-02 01:17:58 +02:00
|
|
|
keys = global_options_by_order
|
2003-07-18 00:25:53 +02:00
|
|
|
keys.sort()
|
|
|
|
file.write("\necho:\n")
|
|
|
|
for key in keys:
|
|
|
|
file.write("\t@echo %s='$(%s)'\n"% (key,key))
|
|
|
|
|
2003-07-19 06:07:07 +02:00
|
|
|
for i, m in image.getmakerules().items():
|
2003-07-18 00:25:53 +02:00
|
|
|
file.write("%s: " %i)
|
|
|
|
for i in m.dependency:
|
|
|
|
file.write("%s " % i)
|
|
|
|
file.write("\n")
|
|
|
|
for i in m.actions:
|
|
|
|
file.write("\t%s\n" % i)
|
2004-11-05 09:57:09 +01:00
|
|
|
writemakefilefooter(file, makefilepath)
|
2003-07-18 00:25:53 +02:00
|
|
|
file.close()
|
|
|
|
|
|
|
|
#
|
|
|
|
def writemakefile(path):
|
2009-04-03 14:52:43 +02:00
|
|
|
global rommapping
|
|
|
|
global bootblocksize
|
2003-07-18 00:25:53 +02:00
|
|
|
makefilepath = os.path.join(path, "Makefile")
|
|
|
|
print "Creating", makefilepath
|
2003-07-25 19:29:13 +02:00
|
|
|
file = safe_open(makefilepath, 'w+')
|
2003-07-18 00:25:53 +02:00
|
|
|
writemakefileheader(file, makefilepath)
|
|
|
|
|
|
|
|
# main rule
|
2009-04-03 14:52:43 +02:00
|
|
|
file.write("\nall: romtool")
|
2004-11-05 09:21:05 +01:00
|
|
|
for i in buildroms:
|
2009-04-03 14:52:43 +02:00
|
|
|
file.write(" %sfs" % i.name)
|
2004-11-05 09:21:05 +01:00
|
|
|
file.write("\n\n")
|
2009-04-03 14:52:43 +02:00
|
|
|
|
|
|
|
# romtool rules
|
|
|
|
file.write("\nromtool:\n\tcd $(TOP)/util/romtool; make\n")
|
|
|
|
|
2004-11-05 10:03:47 +01:00
|
|
|
file.write("include Makefile.settings\n\n")
|
2003-07-19 06:07:07 +02:00
|
|
|
for i, o in romimages.items():
|
2008-01-18 16:08:58 +01:00
|
|
|
file.write("%s/coreboot.rom:\n" % o.getname())
|
2003-07-18 00:25:53 +02:00
|
|
|
file.write("\tif (cd %s; \\\n" % o.getname())
|
2008-06-09 01:05:24 +02:00
|
|
|
file.write("\t\t$(MAKE) coreboot.rom)\\\n")
|
2003-07-18 00:25:53 +02:00
|
|
|
file.write("\tthen true; else exit 1; fi;\n\n")
|
2003-07-23 20:52:17 +02:00
|
|
|
file.write("clean: ")
|
|
|
|
for i in romimages.keys():
|
2004-11-05 09:21:05 +01:00
|
|
|
file.write(" %s-clean" % i)
|
2008-09-04 15:44:00 +02:00
|
|
|
file.write(" base-clean")
|
2003-07-23 20:52:17 +02:00
|
|
|
file.write("\n\n")
|
|
|
|
for i, o in romimages.items():
|
|
|
|
file.write("%s-clean:\n" % o.getname())
|
2008-06-09 01:05:24 +02:00
|
|
|
file.write("\t(cd %s; $(MAKE) clean)\n\n" % o.getname())
|
2008-09-04 15:44:00 +02:00
|
|
|
file.write("base-clean:\n")
|
|
|
|
file.write("\trm -f romcc*\n\n")
|
2004-11-05 09:21:05 +01:00
|
|
|
|
2003-09-26 13:40:05 +02:00
|
|
|
for i in buildroms:
|
2004-11-05 09:21:05 +01:00
|
|
|
file.write("%s:" % i.name)
|
2003-09-26 13:40:05 +02:00
|
|
|
for j in i.roms:
|
2008-01-18 16:08:58 +01:00
|
|
|
file.write(" %s/coreboot.rom " % j)
|
2004-11-05 09:21:05 +01:00
|
|
|
file.write("\n")
|
|
|
|
file.write("\t cat ")
|
|
|
|
for j in i.roms:
|
2008-01-18 16:08:58 +01:00
|
|
|
file.write(" %s/coreboot.rom " % j)
|
2004-11-05 09:21:05 +01:00
|
|
|
file.write("> %s\n\n" %i.name)
|
2009-04-03 14:52:43 +02:00
|
|
|
# build the bootblock here as well.
|
|
|
|
file.write("\n")
|
|
|
|
file.write("\t cat ")
|
|
|
|
for j in i.roms:
|
|
|
|
file.write(" %s/coreboot.strip " % j)
|
|
|
|
file.write("> %s.bootblock\n\n" %i.name)
|
|
|
|
|
|
|
|
romsize = getoption("ROM_SIZE", image)
|
|
|
|
# i.name? That can not be right, can it?
|
|
|
|
file.write("%sfs: %s $(TOP)/util/romtool/romtool\n" %(i.name,i.name));
|
|
|
|
file.write("\trm -f coreboot.romfs\n");
|
|
|
|
file.write("\t$(TOP)/util/romtool/romtool %sfs create %s %s %s.bootblock\n" % (i.name, romsize, bootblocksize, i.name))
|
|
|
|
for i in buildroms:
|
|
|
|
for j in i.roms:
|
|
|
|
#failover is a hack that will go away soon.
|
|
|
|
if (j != "failover") and (rommapping[j] != "/dev/null"):
|
|
|
|
file.write("\t $(TOP)/util/romtool/romtool %sfs add-payload %s %s/payload\n" % (i.name, rommapping[j], j))
|
|
|
|
file.write("\t $(TOP)/util/romtool/romtool %sfs print\n" % i.name)
|
2004-11-05 09:21:05 +01:00
|
|
|
|
2009-04-03 14:52:43 +02:00
|
|
|
file.write(".PHONY: all clean romtool")
|
2004-11-05 09:21:05 +01:00
|
|
|
for i in romimages.keys():
|
|
|
|
file.write(" %s-clean" % i)
|
2005-12-02 22:52:30 +01:00
|
|
|
for i, o in romimages.items():
|
2008-01-18 16:08:58 +01:00
|
|
|
file.write(" %s/coreboot.rom" % o.getname())
|
2004-11-05 09:21:05 +01:00
|
|
|
file.write("\n\n")
|
|
|
|
|
2004-11-05 09:57:09 +01:00
|
|
|
writemakefilefooter(file, makefilepath)
|
2003-07-18 00:25:53 +02:00
|
|
|
file.close()
|
|
|
|
|
|
|
|
def writeinitincludes(image):
|
|
|
|
global include_pattern
|
|
|
|
filepath = os.path.join(image.gettargetdir(), image.getincludefilename())
|
|
|
|
print "Creating", filepath
|
2003-07-25 19:29:13 +02:00
|
|
|
outfile = safe_open(filepath, 'w+')
|
2003-07-18 00:25:53 +02:00
|
|
|
if (image.newformat()):
|
2003-07-25 19:29:13 +02:00
|
|
|
infile = safe_open(image.getinitfile(), 'r')
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
line = infile.readline()
|
|
|
|
while (line):
|
|
|
|
p = include_pattern.match(line)
|
|
|
|
if (p):
|
2003-07-21 18:51:40 +02:00
|
|
|
for i in image.getinitincludes():
|
|
|
|
inc = image.getinitinclude(i)
|
2003-07-18 00:25:53 +02:00
|
|
|
if (inc.getstring() == p.group(1)):
|
|
|
|
outfile.write("#include \"%s\"\n" % inc.getpath())
|
|
|
|
else:
|
2004-03-23 18:37:02 +01:00
|
|
|
outfile.write(line)
|
2003-07-18 00:25:53 +02:00
|
|
|
line = infile.readline()
|
|
|
|
|
|
|
|
infile.close()
|
|
|
|
else:
|
2003-07-21 18:51:40 +02:00
|
|
|
for i in image.getinitincludes():
|
2003-07-18 00:25:53 +02:00
|
|
|
outfile.write("#include <%s>\n" % i)
|
|
|
|
outfile.close()
|
|
|
|
|
|
|
|
def writeldoptions(image):
|
2004-02-04 10:11:51 +01:00
|
|
|
"""Write ldoptions file."""
|
2003-07-18 00:25:53 +02:00
|
|
|
filename = os.path.join(image.gettargetdir(), "ldoptions")
|
|
|
|
print "Creating", filename
|
2003-07-25 19:29:13 +02:00
|
|
|
file = safe_open(filename, 'w+')
|
2004-02-04 10:11:51 +01:00
|
|
|
for o in global_exported_options:
|
|
|
|
if (hasvalue(o.name, image) and IsInt(getoption(o.name, image))):
|
|
|
|
file.write("%s = %s;\n" % (o.name, getformated(o.name, image)))
|
|
|
|
for o in image.exported_options:
|
|
|
|
if (not o in global_exported_options and hasvalue(o.name, image) and IsInt(getoption(o.name, image))):
|
|
|
|
file.write("%s = %s;\n" % (o.name, getformated(o.name, image)))
|
2003-07-18 00:25:53 +02:00
|
|
|
file.close()
|
|
|
|
|
2003-06-14 17:07:02 +02:00
|
|
|
def dumptree(part, lvl):
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.dumptree, "DUMPTREE ME is")
|
2003-06-14 17:07:02 +02:00
|
|
|
part.dumpme(lvl)
|
|
|
|
# dump the siblings -- actually are there any? not sure
|
2003-07-10 14:38:39 +02:00
|
|
|
# siblings are:
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.dumptree, "DUMPTREE SIBLINGS are")
|
2004-10-16 21:58:35 +02:00
|
|
|
kid = part.next_sibling
|
2003-07-10 16:46:59 +02:00
|
|
|
while (kid):
|
2003-07-10 14:38:39 +02:00
|
|
|
kid.dumpme(lvl)
|
2004-10-16 21:58:35 +02:00
|
|
|
kid = kid.next_sibling
|
2003-06-14 17:07:02 +02:00
|
|
|
# dump the kids
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.dumptree, "DUMPTREE KIDS are")
|
2003-07-10 14:38:39 +02:00
|
|
|
#for kid in part.children:
|
|
|
|
if (part.children):
|
|
|
|
dumptree(part.children, lvl+1)
|
2004-10-16 21:58:35 +02:00
|
|
|
kid = part.next_sibling
|
|
|
|
while (kid):
|
|
|
|
if (kid.children):
|
|
|
|
dumptree(kid.children, lvl + 1)
|
|
|
|
kid = kid.next_sibling
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.dumptree, "DONE DUMPTREE")
|
|
|
|
|
|
|
|
def writecode(image):
|
2003-07-23 20:13:19 +02:00
|
|
|
filename = os.path.join(img_dir, "static.c")
|
2003-07-21 01:28:01 +02:00
|
|
|
print "Creating", filename
|
2003-07-25 19:29:13 +02:00
|
|
|
file = safe_open(filename, 'w+')
|
2004-10-16 08:20:29 +02:00
|
|
|
file.write("#include <device/device.h>\n")
|
2003-09-02 01:17:58 +02:00
|
|
|
file.write("#include <device/pci.h>\n")
|
2003-07-28 23:35:14 +02:00
|
|
|
for path in image.getconfigincludes().values():
|
|
|
|
file.write("#include \"%s\"\n" % path)
|
2009-02-28 21:10:20 +01:00
|
|
|
file.write("\n/* pass 0 */\n")
|
2003-07-28 23:35:14 +02:00
|
|
|
gencode(image.getroot(), file, 0)
|
2009-02-28 21:10:20 +01:00
|
|
|
file.write("\n/* pass 1 */\n")
|
2003-07-28 23:35:14 +02:00
|
|
|
gencode(image.getroot(), file, 1)
|
2003-07-21 01:28:01 +02:00
|
|
|
file.close()
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2003-07-28 23:35:14 +02:00
|
|
|
def gencode(part, file, pass_num):
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.gencode, "GENCODE ME is")
|
2003-07-28 23:35:14 +02:00
|
|
|
part.gencode(file, pass_num)
|
2003-06-14 17:07:02 +02:00
|
|
|
# dump the siblings -- actually are there any? not sure
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.gencode, "GENCODE SIBLINGS are")
|
2004-10-16 21:58:35 +02:00
|
|
|
kid = part.next_sibling
|
2003-07-11 16:51:29 +02:00
|
|
|
while (kid):
|
2003-07-28 23:35:14 +02:00
|
|
|
kid.gencode(file, pass_num)
|
2004-10-16 21:58:35 +02:00
|
|
|
kid = kid.next_sibling
|
2003-07-21 01:28:01 +02:00
|
|
|
# now dump the children
|
|
|
|
debug.info(debug.gencode, "GENCODE KIDS are")
|
2003-07-10 14:38:39 +02:00
|
|
|
if (part.children):
|
2003-07-28 23:35:14 +02:00
|
|
|
gencode(part.children, file, pass_num)
|
2004-10-16 21:58:35 +02:00
|
|
|
kid = part.next_sibling
|
2003-07-21 01:28:01 +02:00
|
|
|
while (kid):
|
|
|
|
if (kid.children):
|
2003-07-28 23:35:14 +02:00
|
|
|
gencode(kid.children, file, pass_num)
|
2004-10-16 21:58:35 +02:00
|
|
|
kid = kid.next_sibling
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.gencode, "DONE GENCODE")
|
|
|
|
|
2009-02-28 21:10:20 +01:00
|
|
|
def writegraph(image):
|
|
|
|
filename = os.path.join(img_dir, "static.dot")
|
|
|
|
print "Creating", filename
|
|
|
|
file = safe_open(filename, 'w+')
|
|
|
|
file.write("digraph devicetree {\n")
|
|
|
|
file.write(" rankdir=LR\n")
|
|
|
|
genranks(image.getroot(), file, 0)
|
|
|
|
gennodes(image.getroot(), file)
|
|
|
|
gengraph(image.getroot(), file)
|
|
|
|
file.write("}\n")
|
|
|
|
file.close()
|
|
|
|
|
|
|
|
def genranks(part, file, level):
|
|
|
|
#file.write(" # Level %d\n" % level )
|
|
|
|
file.write(" { rank = same; \"dev_%s_%d\"" % (part.type_name,part.instance ))
|
|
|
|
sib = part.next_sibling
|
|
|
|
while (sib):
|
|
|
|
file.write("; \"dev_%s_%d\"" % (sib.type_name, sib.instance))
|
|
|
|
sib = sib.next_sibling
|
|
|
|
file.write("}\n" )
|
|
|
|
# now dump the children
|
|
|
|
if (part.children):
|
|
|
|
genranks(part.children, file, level + 1)
|
|
|
|
|
|
|
|
kid = part.next_sibling
|
|
|
|
while (kid):
|
|
|
|
if (kid.children):
|
|
|
|
genranks(kid.children, file, level + 1)
|
|
|
|
kid = kid.next_sibling
|
|
|
|
|
|
|
|
|
|
|
|
def gennodes(part, file):
|
|
|
|
file.write(" dev_%s_%d[shape=record, label=\"%s\"];\n" % (part.type_name,part.instance,part.graph_name() ))
|
|
|
|
sib = part.next_sibling
|
|
|
|
while (sib):
|
|
|
|
file.write(" dev_%s_%d[shape=record, label=\"%s\"];\n" % (sib.type_name,sib.instance,sib.graph_name() ))
|
|
|
|
sib = sib.next_sibling
|
|
|
|
# now dump the children
|
|
|
|
if (part.children):
|
|
|
|
gennodes(part.children, file)
|
|
|
|
|
|
|
|
kid = part.next_sibling
|
|
|
|
while (kid):
|
|
|
|
if (kid.children):
|
|
|
|
gennodes(kid.children, file)
|
|
|
|
kid = kid.next_sibling
|
|
|
|
|
|
|
|
|
|
|
|
def gengraph(part, file):
|
|
|
|
if (part.parent != part):
|
|
|
|
file.write(" dev_%s_%d -> dev_%s_%d;\n" % \
|
|
|
|
(part.parent.type_name, part.parent.instance, \
|
|
|
|
part.type_name, part.instance ))
|
|
|
|
sib = part.next_sibling
|
|
|
|
while (sib):
|
|
|
|
file.write(" dev_%s_%d -> dev_%s_%d;\n" % \
|
|
|
|
(sib.parent.type_name, sib.parent.instance, \
|
|
|
|
sib.type_name, sib.instance ))
|
|
|
|
sib = sib.next_sibling
|
|
|
|
|
|
|
|
kid = part.next_sibling
|
|
|
|
while (kid):
|
|
|
|
if (kid.children):
|
|
|
|
gengraph(kid.children, file)
|
|
|
|
kid = kid.next_sibling
|
|
|
|
|
|
|
|
if (part.children):
|
|
|
|
gengraph(part.children, file)
|
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
def verifyparse():
|
2003-07-21 01:28:01 +02:00
|
|
|
"""Add any run-time checks to verify that parsing the configuration
|
|
|
|
was successful"""
|
2003-06-14 17:07:02 +02:00
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
for image in romimages.values():
|
|
|
|
print("Verifying ROMIMAGE %s" % image.name)
|
|
|
|
if (image.newformat() and image.getinitfile() == ''):
|
|
|
|
fatal("An init file must be specified")
|
|
|
|
for op in image.exported_options:
|
|
|
|
if (getoptionvalue(op.name, op, image) == 0 and getoptionvalue(op.name, op, 0) == 0):
|
2004-10-14 18:25:01 +02:00
|
|
|
warning("Exported option %s has no value (check Options.lb)" % op.name);
|
|
|
|
print("Verifing global options")
|
|
|
|
for op in global_exported_options:
|
|
|
|
if (getoptionvalue(op.name, op, 0) == 0):
|
|
|
|
notice("Exported option %s has no value (check Options.lb)" % op.name);
|
2004-02-04 10:11:51 +01:00
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
#=============================================================================
|
|
|
|
# MAIN PROGRAM
|
|
|
|
#=============================================================================
|
2003-06-14 17:07:02 +02:00
|
|
|
if __name__=='__main__':
|
2003-06-23 18:54:12 +02:00
|
|
|
from sys import argv
|
|
|
|
if (len(argv) < 3):
|
2008-01-18 16:08:58 +01:00
|
|
|
fatal("Args: <file> <path to coreboot>")
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
top_config_file = os.path.abspath(sys.argv[1])
|
|
|
|
|
|
|
|
treetop = os.path.abspath(sys.argv[2])
|
|
|
|
|
|
|
|
# Now read in the customizing script...
|
2003-07-19 06:07:07 +02:00
|
|
|
loc.push(argv[1])
|
2003-07-25 19:29:13 +02:00
|
|
|
fp = safe_open(argv[1], 'r')
|
|
|
|
if (not parse('board', fp.read())):
|
2003-07-19 06:07:07 +02:00
|
|
|
fatal("Could not parse file")
|
|
|
|
loc.pop()
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2004-02-04 10:11:51 +01:00
|
|
|
verifyparse()
|
2003-07-14 20:00:10 +02:00
|
|
|
|
2003-07-18 00:25:53 +02:00
|
|
|
# no longer need to check if an options has been used
|
|
|
|
alloptions = 1
|
2003-06-23 18:54:12 +02:00
|
|
|
|
2003-07-19 06:07:07 +02:00
|
|
|
for image_name, image in romimages.items():
|
2003-07-21 01:28:01 +02:00
|
|
|
if (debug.level(debug.dumptree)):
|
|
|
|
debug.info(debug.dumptree, "DEVICE TREE:")
|
2003-07-18 00:25:53 +02:00
|
|
|
dumptree(image.getroot(), 0)
|
|
|
|
|
|
|
|
img_dir = image.gettargetdir()
|
|
|
|
if not os.path.isdir(img_dir):
|
|
|
|
print "Creating directory %s" % img_dir
|
|
|
|
os.makedirs(img_dir)
|
|
|
|
|
2009-02-28 13:50:32 +01:00
|
|
|
for objrule, obj in image.getobjectrules().items():
|
|
|
|
sub_dir = img_dir + '/' + os.path.dirname(obj[0])
|
|
|
|
if not os.path.isdir(sub_dir):
|
|
|
|
print "Creating sub directory %s" % sub_dir
|
|
|
|
os.makedirs(sub_dir)
|
|
|
|
|
|
|
|
for driverrule, driver in image.getdriverrules().items():
|
|
|
|
sub_dir = img_dir + '/' + os.path.dirname(driver[0])
|
|
|
|
if not os.path.isdir(sub_dir):
|
|
|
|
print "Creating sub directory %s" % sub_dir
|
|
|
|
os.makedirs(sub_dir)
|
|
|
|
|
|
|
|
for srule, smm in image.getsmmobjectrules().items():
|
|
|
|
sub_dir = img_dir + '/' + os.path.dirname(smm[0])
|
|
|
|
if not os.path.isdir(sub_dir):
|
|
|
|
print "Creating sub directory %s" % sub_dir
|
|
|
|
os.makedirs(sub_dir)
|
|
|
|
|
|
|
|
for irule, init in image.getinitobjectrules().items():
|
|
|
|
sub_dir = img_dir + '/' + os.path.dirname(init[0])
|
|
|
|
if not os.path.isdir(sub_dir):
|
|
|
|
print "Creating sub directory %s" % sub_dir
|
|
|
|
os.makedirs(sub_dir)
|
|
|
|
|
2003-07-21 01:28:01 +02:00
|
|
|
if (debug.level(debug.dump)):
|
2003-07-21 18:51:40 +02:00
|
|
|
for i in image.getinitincludes():
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.dump, "crt0include file %s" % i)
|
2003-07-18 00:25:53 +02:00
|
|
|
for i in image.getdriverrules().keys():
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.dump, "driver file %s" % i)
|
2003-07-18 00:25:53 +02:00
|
|
|
for i in image.getldscripts():
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.dump, "ldscript file %s" % i)
|
2003-07-19 06:07:07 +02:00
|
|
|
for i, m in image.getmakerules().items():
|
2003-07-21 01:28:01 +02:00
|
|
|
debug.info(debug.dump, " makerule %s dep %s act %s" % (i, m.dependency, m.actions))
|
2003-07-18 00:25:53 +02:00
|
|
|
|
2003-07-21 01:28:01 +02:00
|
|
|
writecode(image)
|
2003-07-18 00:25:53 +02:00
|
|
|
writeimagesettings(image)
|
|
|
|
writeinitincludes(image)
|
|
|
|
writeimagemakefile(image)
|
|
|
|
writeldoptions(image)
|
2009-02-28 21:10:20 +01:00
|
|
|
writegraph(image)
|
2003-06-23 18:54:12 +02:00
|
|
|
|
|
|
|
writemakefilesettings(target_dir)
|
|
|
|
writemakefile(target_dir)
|
2003-07-18 00:25:53 +02:00
|
|
|
|
|
|
|
sys.exit(0)
|