chip stuff

git-svn-id: svn://svn.coreboot.org/coreboot/trunk@988 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Greg Watson 2003-07-20 23:28:01 +00:00
parent 9b4336cf41
commit d0580343b6
6 changed files with 157 additions and 85 deletions

View File

@ -71,9 +71,9 @@ makerule linuxbios
end end
makerule linuxbios.a makerule linuxbios.a
depends "$(OBJECTS-1)" depends "$(OBJECTS)"
action "rm -f linuxbios.a" action "rm -f linuxbios.a"
action "ar cr linuxbios.a $(OBJECTS-1)" action "ar cr linuxbios.a $(OBJECTS)"
end end
#makerule crt0.S #makerule crt0.S
@ -152,6 +152,7 @@ makerule clean
action "rm -f TAGS tags" action "rm -f TAGS tags"
action "rm -f docipl" action "rm -f docipl"
action "rm -f build_opt_tbl option_table.c crt0.S" action "rm -f build_opt_tbl option_table.c crt0.S"
action "rm -f chip_*.c"
end end
# do standard config files that the user need not specify # do standard config files that the user need not specify

15
src/devices/chip.c Normal file
View File

@ -0,0 +1,15 @@
/* chips are arbitrary chips (superio, southbridge, etc.)
* They have private structures that define chip resources and default
* settings. They have four externally visible functions for control.
* They have a generic component which applies to all chips for
* path, etc.
*/
#include <device/chip.h>
void
chip_configure(struct chip *root, enum chip_pass pass)
{
while (root) {
}
}

View File

@ -22,6 +22,14 @@ struct lpt_ports {
irq; // irq irq; // irq
}; };
enum chip_pass {
CHIP_PRE_CONSOLE,
CHIP_PRE_DEVICE_ENUMERATE,
CHIP_PRE_DEVICE_CONFIGURE,
CHIP_PRE_DEVICE_ENABLE,
CHIP_PRE_DEVICE_INITIALIZE,
CHIP_PRE_BOOT
};
/* linkages from devices of a type (e.g. superio devices) /* linkages from devices of a type (e.g. superio devices)
@ -33,10 +41,7 @@ struct chip;
/* there is one of these for each TYPE of chip */ /* there is one of these for each TYPE of chip */
struct chip_control { struct chip_control {
void (*alloc)(struct chip *s); void (*enable)(struct chip *, enum chip_pass);
void (*pre_pci_init)(struct chip *s);
void (*init)(struct chip *s);
void (*finishup)(struct chip *s);
char *path; /* the default path. Can be overridden char *path; /* the default path. Can be overridden
* by commands in config * by commands in config
*/ */
@ -54,3 +59,5 @@ struct chip {
void *chip_info; /* the dreaded "void *" */ void *chip_info; /* the dreaded "void *" */
}; };
extern struct chip *root;
extern void chip_configure(struct chip *, enum chip_pass);

View File

@ -0,0 +1,5 @@
struct superio_NSC_pc97307_config {
typedef struct com_ports com1;
typedef struct lpt_ports lpt;
};

View File

@ -2,6 +2,7 @@
/* This code is distributed without warranty under the GPL v2 (see COPYING) */ /* This code is distributed without warranty under the GPL v2 (see COPYING) */
#include <arch/io.h> #include <arch/io.h>
#include <device/chip.h>
#ifndef PNP_INDEX_REG #ifndef PNP_INDEX_REG
#define PNP_INDEX_REG 0x15C #define PNP_INDEX_REG 0x15C
@ -18,26 +19,28 @@
void pnp_output(char address, char data) void pnp_output(char address, char data)
{ {
outb(address, PNP_INDEX_REG); outb(address, PNP_INDEX_REG);
outb(data, PNP_DATA_REG); outb(data, PNP_DATA_REG);
} }
void sio_enable(void) void sio_enable(struct chip *chip, enum chip_pass pass)
{ {
/* Enable Super IO Chip */ switch (pass) {
pnp_output(0x07, 6); /* LD 6 = UART1 */ case CHIP_PRE_CONSOLE:
pnp_output(0x30, 0); /* Dectivate */ /* Enable Super IO Chip */
pnp_output(0x60, SIO_COM1_BASE >> 8); /* IO Base */ pnp_output(0x07, 6); /* LD 6 = UART1 */
pnp_output(0x61, SIO_COM1_BASE & 0xFF); /* IO Base */ pnp_output(0x30, 0); /* Dectivate */
pnp_output(0x30, 1); /* Activate */ pnp_output(0x60, chip->control->defaultport >> 8); /* IO Base */
pnp_output(0x61, chip->control->defaultport & 0xFF); /* IO Base */
pnp_output(0x30, 1); /* Activate */
break;
default:
/* nothing yet */
}
} }
#if 0
struct superio_control superio_NSC_pc97307_control = { struct superio_control superio_NSC_pc97307_control = {
pre_pci_init: (void *)0, enable: sio_enable,
init: (void *)0,
finishup: (void *)0,
defaultport: SIO_COM1_BASE, defaultport: SIO_COM1_BASE,
name: "NSC 87307" name: "NSC 87307"
}; };
#endif

View File

@ -3,7 +3,6 @@ import os
import re import re
import string import string
debug = 0
warnings = 0 warnings = 0
errors = 0 errors = 0
@ -79,6 +78,31 @@ class stack:
partstack = stack() partstack = stack()
dirstack = stack() dirstack = stack()
class debug_info:
none = 0
gencode = 1
dumptree = 2
object = 3
dict = 4
statement = 5
dump = 6
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
debug = debug_info(debug_info.none)
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Error Handling # Error Handling
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@ -155,11 +179,6 @@ def exitiferrors():
if (errors != 0): if (errors != 0):
sys.exit(1) sys.exit(1)
def debug_print(level, str):
global debug
if (debug >= level):
print str
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Main classes # Main classes
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@ -250,7 +269,7 @@ class romimage:
else: else:
source = os.path.join(dirstack.tos(), base + suffix) source = os.path.join(dirstack.tos(), base + suffix)
object = base + '.o' object = base + '.o'
debug_print(1, "add object %s source %s" % (object_name, source)) debug.info(debug.object, "add object %s source %s" % (object_name, source))
l = getdict(dict, base) l = getdict(dict, base)
if (l): if (l):
print "Warning, object/driver %s previously defined" % base print "Warning, object/driver %s previously defined" % base
@ -308,7 +327,7 @@ class romimage:
if (str != 0): if (str != 0):
self.useinitincludes = 1 self.useinitincludes = 1
debug_print(2, "ADDCRT0: %s -> %s" % (str, path)) debug.info(debug.object, "ADDCRT0: %s -> %s" % (str, path))
o = getdict(self.initincludes, path) o = getdict(self.initincludes, path)
if (o): if (o):
print "Warning, init include for %s previously defined" % path print "Warning, init include for %s previously defined" % path
@ -501,20 +520,20 @@ class option_value:
class partobj: class partobj:
"""A configuration part""" """A configuration part"""
def __init__ (self, image, dir, parent, type, name): def __init__ (self, image, dir, parent, type, name):
debug_print(1, "partobj dir %s parent %s type %s" %(dir,parent,type)) debug.info(debug.object, "partobj dir %s parent %s type %s" %(dir,parent,type))
self.image = image self.image = image
self.children = 0 self.children = 0
self.siblings = 0
self.initcode = [] self.initcode = []
self.registercode = [] self.registercode = []
# sibling is not a list. # sibling is not a list.
self.siblings = 0
self.type = type self.type = type
self.objects = [] self.objects = []
self.dir = dir self.dir = dir
self.irq = 0 self.irq = 0
self.instance = image.newpartinstance() self.instance = image.newpartinstance()
self.flatten_name = flatten_name(type + "/" + name) self.flatten_name = flatten_name(type + "/" + name)
debug_print(1, "INSTANCE %d" % self.instance) debug.info(debug.object, "INSTANCE %d" % self.instance)
self.devfn = 0 self.devfn = 0
self.private = 0 self.private = 0
self.uses_options = {} self.uses_options = {}
@ -527,12 +546,12 @@ class partobj:
self.chipconfig = 0 self.chipconfig = 0
if (parent): if (parent):
debug_print(1, "add to parent") debug.info(debug.gencode, "add to parent")
self.parent = parent self.parent = parent
# add current child as my sibling, # add current child as my sibling,
# me as the child. # me as the child.
if (parent.children): if (parent.children):
debug_print(1, "add %s (%d) as sibling" % (parent.children.dir, parent.children.instance)) debug.info(debug.gencode, "add %s (%d) as sibling" % (parent.children.dir, parent.children.instance))
self.siblings = parent.children self.siblings = parent.children
parent.children = self parent.children = self
else: else:
@ -559,6 +578,10 @@ class partobj:
def gencode(self, file): def gencode(self, file):
if (self.chipconfig): if (self.chipconfig):
debug.info(debug.gencode, "gencode: chipconfig(%d)" % self.instance)
file.write("#include \"%s/chip.h\"\n" % self.dir)
file.write("extern struct superio_control %s_control;\n" % \
self.flatten_name)
file.write("struct %s_config %s_config_%d" % (\ file.write("struct %s_config %s_config_%d" % (\
self.flatten_name ,\ self.flatten_name ,\
self.flatten_name , \ self.flatten_name , \
@ -578,8 +601,10 @@ class partobj:
file.write("/* %s %s */\n" % (self.type, self.dir)) file.write("/* %s %s */\n" % (self.type, self.dir))
#file.write(" .devfn = %d,\n" % self.devfn) #file.write(" .devfn = %d,\n" % self.devfn)
if (self.siblings): if (self.siblings):
debug.info(debug.gencode, "gencode: siblings(%d)" % self.siblings.instance)
file.write(" .next = &dev%d,\n" % self.siblings.instance) file.write(" .next = &dev%d,\n" % self.siblings.instance)
if (self.children): if (self.children):
debug.info(debug.gencode, "gencode: children(%d)" % self.children.instance)
file.write(" .children = &dev%d,\n" % \ file.write(" .children = &dev%d,\n" % \
self.children.instance) self.children.instance)
if (self.private): if (self.private):
@ -622,14 +647,14 @@ class partobj:
def getdict(dict, name): def getdict(dict, name):
if name not in dict.keys(): if name not in dict.keys():
debug_print(1, "Undefined: %s" % name) debug.info(debug.dict, "Undefined: %s" % name)
return 0 return 0
v = dict.get(name, 0) v = dict.get(name, 0)
debug_print(1, "getdict %s returning %s" % (name, v)) debug.info(debug.dict, "getdict %s returning %s" % (name, v))
return v return v
def setdict(dict, name, value): def setdict(dict, name, value):
debug_print(1, "setdict sets %s to %s" % (name, value)) debug.info(debug.dict, "setdict sets %s to %s" % (name, value))
dict[name] = value dict[name] = value
# options. # options.
@ -860,7 +885,7 @@ def addldscript(path):
fullpath = treetop + '/src/' + path fullpath = treetop + '/src/' + path
else: else:
fullpath = curdir + '/' + path fullpath = curdir + '/' + path
debug_print(1, "fullpath :%s: curdir :%s: path :%s:" % (fullpath, curdir, path)) debug.info(debug.statement, "fullpath :%s: curdir :%s: path :%s:" % (fullpath, curdir, path))
curimage.addldscript(fullpath) curimage.addldscript(fullpath)
def payload(path): def payload(path):
@ -965,7 +990,7 @@ def dodir(path, file):
path = re.sub('^/*', '', path) path = re.sub('^/*', '', path)
else: else:
fullpath = dirstack.tos() fullpath = dirstack.tos()
debug_print(1, "DODIR: path %s, fullpath %s" % (path, fullpath)) debug.info(debug.statement, "DODIR: path %s, fullpath %s" % (path, fullpath))
dirstack.push(os.path.join(fullpath, path)) dirstack.push(os.path.join(fullpath, path))
doconfigfile(fullpath, path, file) doconfigfile(fullpath, path, file)
dirstack.pop() dirstack.pop()
@ -1012,13 +1037,13 @@ def doconfigfile(path, confdir, file):
# MISC FUNCTIONS # MISC FUNCTIONS
#============================================================================= #=============================================================================
def ternary(val, yes, no): def ternary(val, yes, no):
debug_print(1, "ternary %s" % expr) debug.info(debug.statement, "ternary %s" % expr)
debug_print(1, "expr %s a %d yes %d no %d"% (expr, a, yes, no)) debug.info(debug.statement, "expr %s a %d yes %d no %d"% (expr, a, yes, no))
if (val == 0): if (val == 0):
debug_print("Ternary returns %d" % yes) debug.info(debug.statement, "Ternary returns %d" % yes)
return yes return yes
else: else:
debug_print("Ternary returns %d" % no) debug.info(debug.statement, "Ternary returns %d" % no)
return no return no
def tohex(name): def tohex(name):
@ -1427,9 +1452,13 @@ def writeimagemakefile(image):
for objrule, obj in image.getobjectrules().items(): for objrule, obj in image.getobjectrules().items():
obj_name = obj[0] obj_name = obj[0]
obj_source = obj[1] obj_source = obj[1]
file.write("OBJECTS-1 += %s\n" % (obj_name)) file.write("OBJECTS += %s\n" % (obj_name))
file.write("SOURCES += %s\n" % (obj_source)) file.write("SOURCES += %s\n" % (obj_source))
# for chip_target.c
file.write("OBJECTS += chip_%s.o\n" % target_name)
file.write("SOURCES += chip_%s.c\n" % target_name)
for driverrule, driver in image.getdriverrules().items(): for driverrule, driver in image.getdriverrules().items():
obj_name = driver[0] obj_name = driver[0]
obj_source = driver[1] obj_source = driver[1]
@ -1481,17 +1510,21 @@ def writeimagemakefile(image):
file.write("\t$(CC) -c $(CFLAGS) -o $@ $<\n") file.write("\t$(CC) -c $(CFLAGS) -o $@ $<\n")
#file.write("%s\n" % objrule[2]) #file.write("%s\n" % objrule[2])
# special rule for chips_target.c
file.write("chip_%s.o: chip_%s.c\n" % (target_name, target_name))
file.write("\t$(CC) -c $(CFLAGS) -o $@ $<\n")
# Print out the rules that will make cause the files # Print out the rules that will make cause the files
# generated by NLBConfig.py to be remade if any dependencies change. # generated by NLBConfig.py to be remade if any dependencies change.
file.write("\n# Remember the automatically generated files\n") file.write("\n# Remember the automatically generated files\n")
file.write("GENERATED:=\n") file.write("GENERATED:=\n")
for genfile in [ 'Makefile', for genfile in ['Makefile',
'nsuperio.c', 'nsuperio.c',
'chip.c', 'chip_%s.c' % target_name,
'LinuxBIOSDoc.config' ]: 'LinuxBIOSDoc.config' ]:
file.write("GENERATED += %s\n" % genfile) file.write("GENERATED += %s\n" % genfile)
file.write("GENERATED += %s\n" % image.getincludefilename()) file.write("GENERATED += %s\n" % image.getincludefilename())
#file.write("\n# Remake Makefile (and the other files generated by\n") #file.write("\n# Remake Makefile (and the other files generated by\n")
#file.write("# NLBConfig.py) if any config dependencies change.\n") #file.write("# NLBConfig.py) if any config dependencies change.\n")
@ -1581,44 +1614,67 @@ def writeldoptions(image):
file.write("%s = %s;\n" % (i, getformated(i, image))) file.write("%s = %s;\n" % (i, getformated(i, image)))
file.close() file.close()
def verifyparse(image):
"""Add any run-time checks to verify that parsing the configuration
was successful"""
if (image.newformat() and image.getinitfile() == ''):
fatal("An init file must be specified")
def dumptree(part, lvl): def dumptree(part, lvl):
debug_print(1, "DUMPTREE ME is") debug.info(debug.dumptree, "DUMPTREE ME is")
part.dumpme(lvl) part.dumpme(lvl)
# dump the siblings -- actually are there any? not sure # dump the siblings -- actually are there any? not sure
# siblings are: # siblings are:
debug_print(1, "DUMPTREE SIBLINGS are") debug.info(debug.dumptree, "DUMPTREE SIBLINGS are")
kid = part.siblings kid = part.siblings
while (kid): while (kid):
kid.dumpme(lvl) kid.dumpme(lvl)
kid = kid.siblings kid = kid.siblings
# dump the kids # dump the kids
debug_print(1, "DUMPTREE KIDS are") debug.info(debug.dumptree, "DUMPTREE KIDS are")
#for kid in part.children: #for kid in part.children:
if (part.children): if (part.children):
dumptree(part.children, lvl+1) dumptree(part.children, lvl+1)
debug_print(1, "DONE DUMPTREE") debug.info(debug.dumptree, "DONE DUMPTREE")
def writecode(image):
filename = os.path.join(img_dir, "chips_%s.c" % target_name)
print "Creating", filename
file = open(filename, 'w+')
# gen all the forward references
i = 0
file.write("#include <device/chip.h>\n")
file.write("struct chip ")
while (i <= image.numparts()):
if (i):
file.write("cdev%d "% i)
else:
file.write("root ")
i = i + 1
file.write(";\n")
gencode(image.getroot(), file)
file.close()
def gencode(part, file): def gencode(part, file):
debug_print(1, "GENCODE ME is") debug.info(debug.gencode, "GENCODE ME is")
part.gencode(file) part.gencode(file)
# dump the siblings -- actually are there any? not sure # dump the siblings -- actually are there any? not sure
# dump the kids debug.info(debug.gencode, "GENCODE SIBLINGS are")
debug_print(1, "GENCODE SIBLINGS are")
kid = part.siblings kid = part.siblings
while (kid): while (kid):
kid.gencode(file) kid.gencode(file)
kid = kid.siblings kid = kid.siblings
debug_print(1, "GENCODE KIDS are") # now dump the children
#for kid in part.children: debug.info(debug.gencode, "GENCODE KIDS are")
if (part.children): if (part.children):
gencode(part.children, file) gencode(part.children, file)
debug_print(1, "DONE GENCODE") kid = part.siblings
while (kid):
if (kid.children):
gencode(kid.children, file)
kid = kid.siblings
debug.info(debug.gencode, "DONE GENCODE")
def verifyparse(image):
"""Add any run-time checks to verify that parsing the configuration
was successful"""
if (image.newformat() and image.getinitfile() == ''):
fatal("An init file must be specified")
#============================================================================= #=============================================================================
# MAIN PROGRAM # MAIN PROGRAM
@ -1646,42 +1702,27 @@ if __name__=='__main__':
alloptions = 1 alloptions = 1
for image_name, image in romimages.items(): for image_name, image in romimages.items():
if (debug): if (debug.level(debug.dumptree)):
debug_print(1, "DEVICE TREE:") debug.info(debug.dumptree, "DEVICE TREE:")
dumptree(image.getroot(), 0) dumptree(image.getroot(), 0)
img_dir = image.gettargetdir() img_dir = image.gettargetdir()
if not os.path.isdir(img_dir): if not os.path.isdir(img_dir):
print "Creating directory %s" % img_dir print "Creating directory %s" % img_dir
os.makedirs(img_dir) os.makedirs(img_dir)
filename = os.path.join(img_dir, "chips.c")
print "Creating", filename
file = open(filename, 'w+')
# gen all the forward references
i = 0
file.write("struct chip ")
while (i <= image.numparts()):
if (i):
file.write("cdev%d "% i)
else:
file.write("root ")
i = i + 1
file.write(";\n")
gencode(image.getroot(), file)
file.close()
# crt0 includes # crt0 includes
if (debug): if (debug.level(debug.dump)):
for i in image.getinitincludes().keys(): for i in image.getinitincludes().keys():
debug_print(1, "crt0include file %s" % i) debug.info(debug.dump, "crt0include file %s" % i)
for i in image.getdriverrules().keys(): for i in image.getdriverrules().keys():
debug_print(1, "driver file %s" % i) debug.info(debug.dump, "driver file %s" % i)
for i in image.getldscripts(): for i in image.getldscripts():
debug_print(1, "ldscript file %s" % i) debug.info(debug.dump, "ldscript file %s" % i)
for i, m in image.getmakerules().items(): for i, m in image.getmakerules().items():
debug_print(1, " makerule %s dep %s act %s" % (i, m.dependency, m.actions)) debug.info(debug.dump, " makerule %s dep %s act %s" % (i, m.dependency, m.actions))
writecode(image)
writeimagesettings(image) writeimagesettings(image)
writeinitincludes(image) writeinitincludes(image)
writeimagemakefile(image) writeimagemakefile(image)