diff options
author | David Gibson <dgibson@sneetch.(none)> | 2005-07-15 17:14:24 +1000 |
---|---|---|
committer | David Gibson <dgibson@sneetch.(none)> | 2005-07-15 17:14:24 +1000 |
commit | f0517db25008374955e1b09a140413d7e0f499c3 (patch) | |
tree | 4afdb633dbff1189b950b2c5ba633c23125a4ef5 /treesource.c | |
parent | 586606e35d1e72d3ee2073bca4247b340233af53 (diff) | |
download | dtc-f0517db25008374955e1b09a140413d7e0f499c3.tar.gz |
Support for specifying memreserve ranges in the source format, based on
a patch by Jon Loeliger <jdl AT freescale.com>, although tweaked
substantially.
Diffstat (limited to 'treesource.c')
-rw-r--r-- | treesource.c | 51 |
1 files changed, 44 insertions, 7 deletions
diff --git a/treesource.c b/treesource.c index 6b0c974..ee0a7b8 100644 --- a/treesource.c +++ b/treesource.c @@ -20,20 +20,35 @@ #include "dtc.h" -struct node *device_tree; - extern FILE *yyin; extern int yyparse(void); +extern void yyerror(char const *); + +struct boot_info *the_boot_info; + +struct data build_mem_reserve(struct data d) +{ + /* + * FIXME: Should reconcile the -R parameter here now? + */ + if (d.len % 16 != 0) { + yyerror("Memory Reserve entries are <u64 addr, u64 size>\n"); + } + return d; +} + -struct node *dt_from_source(FILE *f) +struct boot_info *dt_from_source(FILE *f) { + the_boot_info = NULL; + yyin = f; if (yyparse() != 0) return NULL; - fill_fullpaths(device_tree, ""); + fill_fullpaths(the_boot_info->dt, ""); - return device_tree; + return the_boot_info; } static void write_prefix(FILE *f, int level) @@ -75,7 +90,8 @@ static enum proptype guess_type(struct property *prop) } -void write_tree_source(FILE *f, struct node *tree, int level) + +void write_tree_source_node(FILE *f, struct node *tree, int level) { struct property *prop; struct node *child; @@ -133,8 +149,29 @@ void write_tree_source(FILE *f, struct node *tree, int level) } for_each_child(tree, child) { fprintf(f, "\n"); - write_tree_source(f, child, level+1); + write_tree_source_node(f, child, level+1); } write_prefix(f, level); fprintf(f, "};\n"); } + + +void write_tree_source(FILE *f, struct boot_info *bi) +{ + int i; + + assert((bi->mem_reserve_data.len % sizeof(struct reserve_entry)) == 0); + for (i = 0; + i < (bi->mem_reserve_data.len / sizeof(struct reserve_entry)); + i++) { + struct reserve_entry *re = ((struct reserve_entry *) + bi->mem_reserve_data.val) + i; + + fprintf(f, "/memreserve/\t%016llx-%016llx;\n", + (unsigned long long)re->address, + (unsigned long long)re->address + re->size - 1); + } + + write_tree_source_node(f, bi->dt, 0); +} + |