On Wed, Nov 13, 2013 at 4:51 PM, Rob Herring <robherring2@xxxxxxxxx> wrote: > On Tue, Nov 12, 2013 at 1:42 PM, Geert Uytterhoeven > <geert@xxxxxxxxxxxxxx> wrote: >> The different architectures used their own (and different) declarations: >> >> extern struct boot_param_header __dtb_start; >> extern u32 __dtb_start[]; >> extern char __dtb_start[]; >> >> Consolidate them using the first variant in <linux/of_fdt.h>. >> This requires adding a few "address of" operators on architectures where >> __dtb_start was an array before. >> >> Signed-off-by: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx> >> Cc: Vineet Gupta <vgupta@xxxxxxxxxxxx> >> Cc: James Hogan <james.hogan@xxxxxxxxxx> >> Cc: Ralf Baechle <ralf@xxxxxxxxxxxxxx> >> Cc: Jonas Bonn <jonas@xxxxxxxxxxxx> >> CC: Chris Zankel <chris@xxxxxxxxxx> >> Cc: Rob Herring <rob.herring@xxxxxxxxxxx> >> Cc: devicetree@xxxxxxxxxxxxxxx >> --- >> arch/arc/include/asm/sections.h | 1 - >> arch/arc/kernel/setup.c | 2 +- >> arch/metag/kernel/setup.c | 6 +----- >> arch/mips/include/asm/mips-boards/generic.h | 4 ---- >> arch/mips/lantiq/prom.h | 2 -- >> arch/mips/netlogic/xlp/dt.c | 4 ++-- >> arch/mips/ralink/of.c | 2 -- >> arch/openrisc/kernel/setup.c | 2 +- >> arch/openrisc/kernel/vmlinux.h | 2 -- >> arch/xtensa/kernel/setup.c | 3 +-- >> include/linux/of_fdt.h | 3 +++ >> 11 files changed, 9 insertions(+), 22 deletions(-) > > This is great, but I would like to see this taken one step further and > move the selection logic into the core code. We can try to use the > built-in dtb if early_init_dt_scan is passed a NULL or invalid dtb. This > should work for most arches I think and still allows an arch to do a > different selection algorithm if desired. Yes, that makes sense. > Are the DT related patches dependent on the rest of the series? Not really. There may be small rejects if you apply it out-of-order, but nothing serious. > Something like this is what I have in mind: > > diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c > index 5c47910..723f854d 100644 > --- a/drivers/of/fdt.c > +++ b/drivers/of/fdt.c > @@ -869,14 +869,16 @@ void * __init __weak > early_init_dt_alloc_memory_arch(u64 size, u64 align) > > bool __init early_init_dt_scan(void *params) > { > - if (!params) > - return false; > - > /* Setup flat device-tree pointer */ > initial_boot_params = params; > > + if (!initial_boot_params || > + (be32_to_cpu(initial_boot_params->magic) != OF_DT_HEADER)) > + initial_boot_params = &__dtb_start; > + > /* check device tree validity */ > - if (be32_to_cpu(initial_boot_params->magic) != OF_DT_HEADER) { > + if (!initial_boot_params || initial_boot_params cannot be NULL here, so no need to check. > + (be32_to_cpu(initial_boot_params->magic) != OF_DT_HEADER)) { However, if __dtb_end == __dtb_start, you may be reading random data here from the next section. The OF_DT_HEADER check should cover this, but better safe than sorry? > initial_boot_params = NULL; > return false; > } Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html