summaryrefslogtreecommitdiff
path: root/treesource.c
diff options
context:
space:
mode:
authorDavid Gibson <dgibson@sneetch.(none)>2005-07-15 17:14:24 +1000
committerDavid Gibson <dgibson@sneetch.(none)>2005-07-15 17:14:24 +1000
commitf0517db25008374955e1b09a140413d7e0f499c3 (patch)
tree4afdb633dbff1189b950b2c5ba633c23125a4ef5 /treesource.c
parent586606e35d1e72d3ee2073bca4247b340233af53 (diff)
downloaddtc-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.c51
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);
+}
+