This is the dtc update by itself.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Acked-by: Stefan Reinauer <stepan@coresystems.de>



git-svn-id: svn://coreboot.org/repository/LinuxBIOSv3@368 f3766cd6-281f-0410-b1cd-43a5c92072e9
This commit is contained in:
Ronald G. Minnich 2007-06-27 19:13:18 +00:00
commit b38118c224
4 changed files with 133 additions and 19 deletions

View file

@ -45,12 +45,15 @@ REFCHAR ({PROPCHAR}|{UNITCHAR}|[/@])
char *code = 0;
YY_BUFFER_STATE bstack = NULL;
int line;
void
switchin(FILE *f){
YY_BUFFER_STATE b;
bstack = YY_CURRENT_BUFFER;
b = yy_create_buffer(f, 8192);
line = yylineno;
yylineno = 1;
yy_switch_to_buffer(b);
}
@ -58,6 +61,7 @@ switchin(FILE *f){
void
switchback(void){
yy_switch_to_buffer(bstack);
yylineno = line;
}
%}

View file

@ -138,8 +138,13 @@ config: DT_CONFIG '('
} '{' proplist '}' ';' {
void switchback(void);
switchback();
}
')' ';' { $$ = $6}
')' ';' {
/* convention: first property is labeled with path */
$6->label = strdup($3.val);
$$ = $6
}
|
;

View file

@ -201,6 +201,8 @@ int main(int argc, char *argv[])
dt_to_C(outf, bi, outversion, boot_cpuid_phys);
} else if (streq(outform, "linuxbios") || streq(outform, "lb")) {
dt_to_linuxbios(outf, bi, outversion, boot_cpuid_phys);
} else if (streq(outform, "linuxbiosinclude") || streq(outform, "lbh")) {
dt_to_linuxbiosh(outf, bi, outversion, boot_cpuid_phys);
} else if (streq(outform, "null")) {
/* do nothing */
} else {

View file

@ -104,7 +104,19 @@ topath(struct property *p){
return pathname;
}
char *toname(char *path, char *suffix){
char *ret = malloc(strlen(path) + strlen(suffix) + 1), *cp, *src;
for(cp = ret, src = path; *src; cp++, src++){
if (*src == '/')
*cp = '_';
else
*cp = *src;
}
cp = ret;
if (suffix)
strcat(cp, suffix);
return cp;
}
static void bin_emit_cell(void *e, cell_t val)
{
@ -439,15 +451,17 @@ static void linuxbios_emit_data(void *e, struct property *p)
return;
cleanname = clean(p->name, 1);
fprintf(f, "\t.%s = {", cleanname);
fprintf(f, "\t.%s = ", cleanname);
free(cleanname);
fprintf(f, "0x%lx,\n", strtoul((char *)d.val, 0, 0));
#if 0
/* sorry, but right now, u32 is all you get */
fprintf(f, "0");
for(i = 0; i < vallen; i++)
fprintf(f, "|(0x%02x<<%d)", d.val[i], (3-i)*8);
fprintf(f, "},\n");
fprintf(f, ",\n");
#endif
}
static void linuxbios_emit_beginnode(void *e, char *label)
@ -505,6 +519,7 @@ static void linuxbios_emit_special(FILE *e, struct node *tree)
struct property *prop;
int ops_set = 0;
int is_root = 0;
char *configname;
fprintf(f, "struct device dev_%s = {\n", tree->label);
/* special case -- the root has a distinguished path */
@ -513,6 +528,10 @@ static void linuxbios_emit_special(FILE *e, struct node *tree)
fprintf(f, "\t.path = { .type = DEVICE_PATH_ROOT },\n");
}
if (tree->config){
configname = clean(tree->label, 0);
printf("\t.device_configuration = &%s,\n", configname);
}
for_each_property(tree, prop) {
if (streq(prop->name, "pcidomain")){
fprintf(f, "\t.path = {.type=DEVICE_PATH_PCI_DOMAIN,.u={.pci_domain={ .domain = %s }}},\n",
@ -640,7 +659,32 @@ static void flatten_tree_emit_includes(struct node *tree, struct emitter *emit,
}
static void flatten_tree_emit_constructors(struct node *tree, struct emitter *emit,
void *etarget, struct data *strbuf,
struct version_info *vi)
{
struct property *prop;
struct node *child;
/* find any/all properties with the name constructor */
for_each_config(tree, prop) {
if (streq(prop->name, "constructor")){
printf("\t%s,\n", prop->val.val);
}
}
for_each_property(tree, prop) {
if (streq(prop->name, "constructor")){
printf("\t%s,\n", prop->val.val);
}
}
for_each_child(tree, child) {
flatten_tree_emit_constructors(child, emit, etarget, strbuf, vi);
}
}
static void flatten_tree_emit_structdecls(struct node *tree, struct emitter *emit,
void *etarget, struct data *strbuf,
struct version_info *vi)
@ -653,7 +697,8 @@ static void flatten_tree_emit_structdecls(struct node *tree, struct emitter *emi
FILE *f = etarget;
if (tree->config){
treename = clean(tree->name, 0);
// treename = clean(tree->label, 0);
treename = toname(tree->config->label, "_config");
emit->beginnode(etarget, treename);
@ -668,6 +713,8 @@ static void flatten_tree_emit_structdecls(struct node *tree, struct emitter *emi
char *cleanname;
if (streq(prop->name, "name"))
seen_name_prop = 1;
if (streq(prop->name, "constructor")) /* this is special */
continue;
cleanname = clean(prop->name, 0);
fprintf(f, "\tu32 %s;\n", cleanname);
free(cleanname);
@ -679,7 +726,24 @@ static void flatten_tree_emit_structdecls(struct node *tree, struct emitter *emi
}
#endif
emit->endnode(etarget, treename);
free(treename);
}
for_each_config(tree, prop) {
if (! streq(prop->name, "constructor")) /* this is special */
continue;
fprintf(f, "extern struct constructor %s[];\n", prop->val.val);
}
for_each_property(tree, prop) {
if (! streq(prop->name, "constructor")) /* this is special */
continue;
fprintf(f, "extern struct constructor %s[];\n", prop->val.val);
}
for_each_property(tree, prop) {
if (! streq(prop->name, "ops")) /* this is special */
continue;
fprintf(f, "extern struct device_operations %s;\n", prop->val.val);
}
for_each_child(tree, child) {
@ -695,7 +759,7 @@ static void flatten_tree_emit_structinits(struct node *tree, struct emitter *emi
void *etarget, struct data *strbuf,
struct version_info *vi)
{
char *treename;
char *treename, *treelabel, *structname;
struct property *configprop, *dtsprop;
struct node *child;
@ -724,8 +788,14 @@ static void flatten_tree_emit_structinits(struct node *tree, struct emitter *emi
*/
if (tree->config){
treename = clean(tree->name, 0);
emit->beginnode(etarget, treename);
treelabel = clean(tree->label, 0);
structname = toname(tree->config->label, "_config");
/* beginnode does not work here.
* the design of this code is wrong and must be fixed.
* the operator should take the node itself, not a string.
*/
printf("struct %s %s = {\n", structname, treelabel);
// emit->beginnode(etarget, treename);
#if 0
if (vi->flags & FTF_FULLPATH)
emit->string(etarget, tree->fullpath, 0);
@ -736,6 +806,8 @@ static void flatten_tree_emit_structinits(struct node *tree, struct emitter *emi
for_each_config(tree, configprop) {
char *cleanname;
int found = 0;
if (streq(configprop->name, "constructor")) /* this is special */
continue;
#if 0
cleanname = clean(configprop->name, 0);
fprintf(f, "\tu32 %s = \n", cleanname);
@ -756,8 +828,7 @@ static void flatten_tree_emit_structinits(struct node *tree, struct emitter *emi
fprintf(f, "\tu8 %s[%d];\n", configprop->name, configprop->val.len);
}
#endif
emit->endnode(etarget, treename);
free(treename);
emit->endnode(etarget, treelabel);
}
/*
for_each_property(tree, prop) {
@ -785,7 +856,6 @@ static void flatten_tree_emit_structinits(struct node *tree, struct emitter *emi
}
static void flatten_tree(struct node *tree, struct emitter *emit,
void *etarget, struct data *strbuf,
struct version_info *vi)
@ -1208,9 +1278,7 @@ void dt_to_linuxbios(FILE *f, struct boot_info *bi, int version, int boot_cpuid_
/* steps: emit all structs. Then emit the initializers, with the pointers to other structs etc. */
fix_next(bi->dt);
/* emit any includes that we need -- TODO: ONLY ONCE PER TYPE*/
fprintf(f, "#include <device/device.h>\n#include <device/pci.h>\n");
flatten_tree_emit_includes(bi->dt, &linuxbios_emitter, f, &strbuf, vi);
fprintf(f, "#include <statictree.h>\n");
/* forward declarations */
for(next = first_node; next; next = next->next)
fprintf(f, "struct device dev_%s;\n", next->label);
@ -1218,11 +1286,46 @@ void dt_to_linuxbios(FILE *f, struct boot_info *bi, int version, int boot_cpuid_
/* emit the code, if any */
if (code)
fprintf(f, "%s\n", code);
flatten_tree_emit_structinits(bi->dt, &linuxbios_emitter, f, &strbuf, vi);
fprintf(f, "struct constructor *all_constructors[] = {\n");
flatten_tree_emit_constructors(bi->dt, &linuxbios_emitter, f, &strbuf, vi);
fprintf(f, "\t0\n};\n");
data_free(strbuf);
/* */
}
void dt_to_linuxbiosh(FILE *f, struct boot_info *bi, int version, int boot_cpuid_phys)
{
struct version_info *vi = NULL;
int i;
struct data strbuf = empty_data;
char *symprefix = "dt";
extern char *code;
struct node *next;
extern struct node *first_node;
labeltree(bi->dt);
for (i = 0; i < ARRAY_SIZE(version_table); i++) {
if (version_table[i].version == version)
vi = &version_table[i];
}
if (!vi)
die("Unknown device tree blob version %d\n", version);
/* the root is special -- the parser gives it no name. We fix that here.
* fix in parser?
*/
bi->dt->name = bi->dt->label = "root";
/* steps: emit all structs. Then emit the initializers, with the pointers to other structs etc. */
fix_next(bi->dt);
/* emit any includes that we need -- TODO: ONLY ONCE PER TYPE*/
fprintf(f, "#include <device/device.h>\n#include <device/pci.h>\n");
flatten_tree_emit_includes(bi->dt, &linuxbios_emitter, f, &strbuf, vi);
flatten_tree_emit_structdecls(bi->dt, &linuxbios_emitter, f, &strbuf, vi);
flatten_tree_emit_structinits(bi->dt, &linuxbios_emitter, f, &strbuf, vi);
data_free(strbuf);
/* */
}