[PATCH 2/5] ARM: mvebu: Simplify memory init order
Sebastian Hesselbarth
sebastian.hesselbarth at gmail.com
Tue Sep 16 13:05:44 PDT 2014
On 09/15/2014 09:41 AM, Sascha Hauer wrote:
> The initialisation of the memory nodes on mvebu is a bit
> compilcated:
>
> pure_initcall(mvebu_memory_fixup_register)
> of_register_fixup(mvebu_memory_of_fixup, NULL)
> core_initcall(kirkwood_init_soc)
> mvebu_set_memory()
> core_initcall(of_arm_init)
> of_fix_tree()
> mvebu_memory_of_fixup()
>
> First a mvebu common of_fixup function is registered, then the SoC
> calls mvebu_set_memory which stores the memory base and size in global
> variables. Afterwards the of_fixup is executed which fixes the memory
> nodes according to the global variables.
>
> Instead register a SoC specific fixup which directly calls mvebu_set_memory
> with the memory base and size as arguments:
>
> pure_initcall(kirkwood_register_soc_fixup);
> of_register_fixup(kirkwood_init_soc, NULL);
> core_initcall(of_arm_init)
> of_fix_tree()
> kirkwood_init_soc()
> mvebu_set_memory(phys_base, phys_size);
>
> Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
Hmm, this breaks Armada 370 and most likely also Armada XP. Actually,
it breaks any SoC that has a DTB with internal regs set to 0xd0000000.
> ---
> arch/arm/mach-mvebu/armada-370-xp.c | 9 ++++++--
> arch/arm/mach-mvebu/common.c | 34 ++++++++++---------------------
> arch/arm/mach-mvebu/dove.c | 9 ++++++--
> arch/arm/mach-mvebu/include/mach/common.h | 2 +-
> arch/arm/mach-mvebu/kirkwood.c | 9 ++++++--
> 5 files changed, 33 insertions(+), 30 deletions(-)
>
> diff --git a/arch/arm/mach-mvebu/armada-370-xp.c b/arch/arm/mach-mvebu/armada-370-xp.c
> index 6251100..5c8499b 100644
> --- a/arch/arm/mach-mvebu/armada-370-xp.c
> +++ b/arch/arm/mach-mvebu/armada-370-xp.c
> @@ -52,7 +52,7 @@ static void __noreturn armada_370_xp_reset_cpu(unsigned long addr)
> ;
> }
>
> -static int armada_370_xp_init_soc(void)
> +static int armada_370_xp_init_soc(struct device_node *root, void *context)
> {
> unsigned long phys_base, phys_size;
> u32 reg;
> @@ -74,4 +74,9 @@ static int armada_370_xp_init_soc(void)
Because armada_370_xp_init_soc() does
mvebu_mbus_add_range(0xf0, 0x01, MVEBU_REMAP_INT_REG_BASE);
right above, which will add the range(s) required for internal register
of_fixup. Since this patch moved armada_370_xp_init_soc to the
of_fixups, we don't fix this up for the initial DT tree.
>
> return 0;
> }
> -core_initcall(armada_370_xp_init_soc);
> +
> +static int armada_370_register_soc_fixup(void)
> +{
I guess moving mvebu_mbus_add_range() in here does not work, because
it will add the armada_370_xp range also for dove and kirkwood.
> + return of_register_fixup(armada_370_xp_init_soc, NULL);
> +}
> +pure_initcall(armada_370_register_soc_fixup);
nit: s/armada_370_/armada_370_xp_/
I like the overall change, but haven't made my mind how this will work
out..
Sebastian
More information about the barebox
mailing list