mirror of
https://github.com/torvalds/linux.git
synced 2024-12-13 06:32:50 +00:00
[POWERPC] Fix bug adding properties with flatdevtree.c's ft_set_prop()
ft_set_prop() from flatdevtree.c in the zImage wrapper will either replace an existing property in the flat device tree, or add a new property definiion if the given property isn't present. However, when adding properties, it adds the property definition immediately before the node's END_NODE tag, potentially after any subnode definitions for the node. This confuses the kernel flat tree parser in prom.c which assumes that all property definitions for a node come before all subnode definitions. This patch corrects ft_set_prop() so that it adds new properties before the first subnode, instead of before the END_NODE tag. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Acked-by: Scott Wood <scottwood@freescale.com> Acked-by: Mark A. Greer <mgreer@mvista.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
e3d67b663b
commit
7c40542ffa
@ -891,28 +891,27 @@ int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
|
|||||||
struct ft_atom atom;
|
struct ft_atom atom;
|
||||||
void *node;
|
void *node;
|
||||||
char *p, *next;
|
char *p, *next;
|
||||||
int nextra, depth;
|
int nextra;
|
||||||
|
|
||||||
node = ft_node_ph2node(cxt, phandle);
|
node = ft_node_ph2node(cxt, phandle);
|
||||||
if (node == NULL)
|
if (node == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
depth = 0;
|
next = ft_next(cxt, node, &atom);
|
||||||
p = node;
|
if (atom.tag != OF_DT_BEGIN_NODE)
|
||||||
|
/* phandle didn't point to a node */
|
||||||
|
return -1;
|
||||||
|
p = next;
|
||||||
|
|
||||||
while ((next = ft_next(cxt, p, &atom)) != NULL) {
|
while ((next = ft_next(cxt, p, &atom)) != NULL) {
|
||||||
switch (atom.tag) {
|
switch (atom.tag) {
|
||||||
case OF_DT_BEGIN_NODE:
|
case OF_DT_BEGIN_NODE: /* properties must go before subnodes */
|
||||||
++depth;
|
|
||||||
break;
|
|
||||||
case OF_DT_END_NODE:
|
case OF_DT_END_NODE:
|
||||||
if (--depth > 0)
|
|
||||||
break;
|
|
||||||
/* haven't found the property, insert here */
|
/* haven't found the property, insert here */
|
||||||
cxt->p = p;
|
cxt->p = p;
|
||||||
return ft_prop(cxt, propname, buf, buflen);
|
return ft_prop(cxt, propname, buf, buflen);
|
||||||
case OF_DT_PROP:
|
case OF_DT_PROP:
|
||||||
if ((depth != 1) || strcmp(atom.name, propname))
|
if (strcmp(atom.name, propname))
|
||||||
break;
|
break;
|
||||||
/* found an existing property, overwrite it */
|
/* found an existing property, overwrite it */
|
||||||
nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4);
|
nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4);
|
||||||
|
Loading…
Reference in New Issue
Block a user