Message ID | 20100319200049.5195.97171.stgit@angua (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
On Fri, Mar 19, 2010 at 02:01:49PM -0600, Grant Likely wrote: > From: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> > > NOPs within the property section are skipped, but NOPs between > OF_DT_END_NODE and OF_DT_BEGIN_NODE were not. My firmware NOPs out > entire nodes depending on various environment parameters. > > of_scan_flat_dt already handles NOP more generally. Fwiw, there's a test program in the libfdt/dtc tree called "nopulate" which will liberally spread NOPs through a device tree blob (one between every other tag), which might be useful for testing this
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 406757a..dee4fb5 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -376,8 +376,11 @@ unsigned long __init unflatten_dt_node(unsigned long mem, if (!np->type) np->type = "<NULL>"; } - while (tag == OF_DT_BEGIN_NODE) { - mem = unflatten_dt_node(mem, p, np, allnextpp, fpsize); + while (tag == OF_DT_BEGIN_NODE || tag == OF_DT_NOP) { + if (tag == OF_DT_NOP) + *p += 4; + else + mem = unflatten_dt_node(mem, p, np, allnextpp, fpsize); tag = be32_to_cpup((__be32 *)(*p)); } if (tag != OF_DT_END_NODE) {