Commit 4674f2f3 authored by Scott Wood's avatar Scott Wood Committed by Paul Mackerras

[POWERPC] bootwrapper: flatdevtree fixes

1. ft_create_node was returning the internal pointer rather than a phandle.
2. ft_find_device_rel was treating a "top" phandle of NULL as an error,
rather than as the root of the tree.  The old, absolute ft_find_device
is removed, and the relative version is renamed to ft_find_device().
Signed-off-by: default avatarScott Wood <scottwood@freescale.com>
Acked-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 6bcc4c01
...@@ -354,16 +354,21 @@ static void ft_put_bin(struct ft_cxt *cxt, const void *data, unsigned int sz) ...@@ -354,16 +354,21 @@ static void ft_put_bin(struct ft_cxt *cxt, const void *data, unsigned int sz)
cxt->p += sza; cxt->p += sza;
} }
int ft_begin_node(struct ft_cxt *cxt, const char *name) char *ft_begin_node(struct ft_cxt *cxt, const char *name)
{ {
unsigned long nlen = strlen(name) + 1; unsigned long nlen = strlen(name) + 1;
unsigned long len = 8 + _ALIGN(nlen, 4); unsigned long len = 8 + _ALIGN(nlen, 4);
char *ret;
if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, len)) if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, len))
return -1; return NULL;
ret = cxt->p;
ft_put_word(cxt, OF_DT_BEGIN_NODE); ft_put_word(cxt, OF_DT_BEGIN_NODE);
ft_put_bin(cxt, name, strlen(name) + 1); ft_put_bin(cxt, name, strlen(name) + 1);
return 0;
return ret;
} }
void ft_end_node(struct ft_cxt *cxt) void ft_end_node(struct ft_cxt *cxt)
...@@ -625,25 +630,17 @@ void ft_end_tree(struct ft_cxt *cxt) ...@@ -625,25 +630,17 @@ void ft_end_tree(struct ft_cxt *cxt)
bph->dt_strings_size = cpu_to_be32(ssize); bph->dt_strings_size = cpu_to_be32(ssize);
} }
void *ft_find_device(struct ft_cxt *cxt, const char *srch_path) void *ft_find_device(struct ft_cxt *cxt, const void *top, const char *srch_path)
{
char *node;
/* require absolute path */
if (srch_path[0] != '/')
return NULL;
node = ft_find_descendent(cxt, ft_root_node(cxt), srch_path);
return ft_get_phandle(cxt, node);
}
void *ft_find_device_rel(struct ft_cxt *cxt, const void *top,
const char *srch_path)
{ {
char *node; char *node;
node = ft_node_ph2node(cxt, top); if (top) {
if (node == NULL) node = ft_node_ph2node(cxt, top);
return NULL; if (node == NULL)
return NULL;
} else {
node = ft_root_node(cxt);
}
node = ft_find_descendent(cxt, node, srch_path); node = ft_find_descendent(cxt, node, srch_path);
return ft_get_phandle(cxt, node); return ft_get_phandle(cxt, node);
...@@ -945,7 +942,7 @@ int ft_del_prop(struct ft_cxt *cxt, const void *phandle, const char *propname) ...@@ -945,7 +942,7 @@ int ft_del_prop(struct ft_cxt *cxt, const void *phandle, const char *propname)
void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name) void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name)
{ {
struct ft_atom atom; struct ft_atom atom;
char *p, *next; char *p, *next, *ret;
int depth = 0; int depth = 0;
if (parent) { if (parent) {
...@@ -970,9 +967,9 @@ void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name) ...@@ -970,9 +967,9 @@ void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name)
break; break;
/* end of node, insert here */ /* end of node, insert here */
cxt->p = p; cxt->p = p;
ft_begin_node(cxt, name); ret = ft_begin_node(cxt, name);
ft_end_node(cxt); ft_end_node(cxt);
return p; return ft_get_phandle(cxt, ret);
} }
p = next; p = next;
} }
......
...@@ -76,7 +76,7 @@ struct ft_cxt { ...@@ -76,7 +76,7 @@ struct ft_cxt {
unsigned int nodes_used; unsigned int nodes_used;
}; };
int ft_begin_node(struct ft_cxt *cxt, const char *name); char *ft_begin_node(struct ft_cxt *cxt, const char *name);
void ft_end_node(struct ft_cxt *cxt); void ft_end_node(struct ft_cxt *cxt);
void ft_begin_tree(struct ft_cxt *cxt); void ft_begin_tree(struct ft_cxt *cxt);
...@@ -96,9 +96,8 @@ int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size); ...@@ -96,9 +96,8 @@ int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size);
void ft_dump_blob(const void *bphp); void ft_dump_blob(const void *bphp);
void ft_merge_blob(struct ft_cxt *cxt, void *blob); void ft_merge_blob(struct ft_cxt *cxt, void *blob);
void *ft_find_device(struct ft_cxt *cxt, const char *srch_path); void *ft_find_device(struct ft_cxt *cxt, const void *top,
void *ft_find_device_rel(struct ft_cxt *cxt, const void *top, const char *srch_path);
const char *srch_path);
void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path); void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path);
int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname, int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
void *buf, const unsigned int buflen); void *buf, const unsigned int buflen);
......
...@@ -18,7 +18,7 @@ static struct ft_cxt cxt; ...@@ -18,7 +18,7 @@ static struct ft_cxt cxt;
static void *fdtm_finddevice(const char *name) static void *fdtm_finddevice(const char *name)
{ {
return ft_find_device(&cxt, name); return ft_find_device(&cxt, NULL, name);
} }
static int fdtm_getprop(const void *phandle, const char *propname, static int fdtm_getprop(const void *phandle, const char *propname,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment