Add code to parse the device tree pointer from the atags, and an (empty) routine to create an mdesc from the discovered device tree.
Split the parsing code in setup_arch to handle both device-tree and tags based machine discovery. Signed-off-by: Jeremy Kerr <[email protected]> --- arch/arm/include/asm/devtree.h | 22 +++++++++ arch/arm/kernel/Makefile | 1 arch/arm/kernel/devtree.c | 14 +++++ arch/arm/kernel/setup.c | 80 +++++++++++++++++++++------------ 4 files changed, 90 insertions(+), 27 deletions(-) diff --git a/arch/arm/include/asm/devtree.h b/arch/arm/include/asm/devtree.h new file mode 100644 index 0000000..0914ac2 --- /dev/null +++ b/arch/arm/include/asm/devtree.h @@ -0,0 +1,22 @@ +/* + * linux/arch/arm/include/asm/devtree.h + * + * Copyright (C) 2009 Canonical Ltd. <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifdef CONFIG_ARM_DEVTREE + +extern struct machine_desc *parse_devicetree(void *devtree); + +#else + +static inline struct machine_desc *parse_devicetree(void *devtree) +{ + return NULL; +} + +#endif diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 79087dd..45d2d82 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -36,6 +36,7 @@ obj-$(CONFIG_ARM_THUMBEE) += thumbee.o obj-$(CONFIG_KGDB) += kgdb.o obj-$(CONFIG_ARM_UNWIND) += unwind.o obj-$(CONFIG_HAVE_TCM) += tcm.o +obj-$(CONFIG_ARM_DEVTREE) += devtree.o obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o AFLAGS_crunch-bits.o := -Wa,-mcpu=ep9312 diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c new file mode 100644 index 0000000..864eab5 --- /dev/null +++ b/arch/arm/kernel/devtree.c @@ -0,0 +1,14 @@ +/* + * linux/arch/arm/kernel/devtree.c + * + * Copyright (C) 2009 Canonical Ltd. <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +struct machine_desc * __init parse_devicetree(void *devtree) +{ + return NULL; +} diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index e662d17..8abb4be 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -42,6 +42,7 @@ #include <asm/mach/time.h> #include <asm/traps.h> #include <asm/unwind.h> +#include <asm/devtree.h> #include "compat.h" #include "atags.h" @@ -636,6 +637,17 @@ static void __init parse_tags(const struct tag *t) t->hdr.tag); } +static void * __init find_devtree(const struct tag *tags) +{ + const struct tag *t; + + for_each_tag(t, tags) + if (t->hdr.tag == ATAG_DEVTREE) + return __va(t->u.devtree.devtree); + + return NULL; +} + /* * This holds our defaults. */ @@ -692,48 +704,62 @@ void __init setup_arch(char **cmdline_p) struct tag *tags = (struct tag *)&init_tags; struct machine_desc *mdesc; char *from = default_command_line; + void *devtree; unwind_init(); setup_processor(); - mdesc = setup_machine(machine_arch_type); - machine_name = mdesc->name; - - if (mdesc->soft_reboot) - reboot_setup("s"); if (__atags_pointer) tags = phys_to_virt(__atags_pointer); - else if (mdesc->boot_params) - tags = phys_to_virt(mdesc->boot_params); - /* - * If we have the old style parameters, convert them to - * a tag list. - */ - if (tags->hdr.tag != ATAG_CORE) - convert_to_tag_list(tags); - if (tags->hdr.tag != ATAG_CORE) - tags = (struct tag *)&init_tags; - - if (mdesc->fixup) - mdesc->fixup(mdesc, tags, &from, &meminfo); - - if (tags->hdr.tag == ATAG_CORE) { - if (meminfo.nr_banks != 0) - squash_mem_tags(tags); - save_atags(tags); - parse_tags(tags); + devtree = find_devtree(tags); + if (devtree) { + mdesc = parse_devicetree(devtree); + + /* + * todo: fallback to arch-number-based mdesc discovery + * if device tree doesn't match + */ + } else { + mdesc = setup_machine(machine_arch_type); + + if (!__atags_pointer && mdesc->boot_params) + tags = phys_to_virt(mdesc->boot_params); + + /* + * If we have the old style parameters, convert them to + * a tag list. + */ + if (tags->hdr.tag != ATAG_CORE) + convert_to_tag_list(tags); + if (tags->hdr.tag != ATAG_CORE) + tags = (struct tag *)&init_tags; + + if (mdesc->fixup) + mdesc->fixup(mdesc, tags, &from, &meminfo); + + if (tags->hdr.tag == ATAG_CORE) { + if (meminfo.nr_banks != 0) + squash_mem_tags(tags); + save_atags(tags); + parse_tags(tags); + } + + /* Copy discovered command line to boot_command_line */ + strlcpy(boot_command_line, from, COMMAND_LINE_SIZE); + } + machine_name = mdesc->name; + if (mdesc->soft_reboot) + reboot_setup("s"); + init_mm.start_code = (unsigned long) _text; init_mm.end_code = (unsigned long) _etext; init_mm.end_data = (unsigned long) _edata; init_mm.brk = (unsigned long) _end; - /* parse_early_param needs a boot_command_line */ - strlcpy(boot_command_line, from, COMMAND_LINE_SIZE); - /* populate cmd_line too for later use, preserving boot_command_line */ strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE); *cmdline_p = cmd_line; _______________________________________________ devicetree-discuss mailing list [email protected] https://lists.ozlabs.org/listinfo/devicetree-discuss
