diff --git a/arch/arm/boards/sama5d27-giantboard/lowlevel.c b/arch/arm/boards/sama5d27-giantboard/lowlevel.c index 0bb3a72..3dada9b 100644 --- a/arch/arm/boards/sama5d27-giantboard/lowlevel.c +++ b/arch/arm/boards/sama5d27-giantboard/lowlevel.c @@ -7,7 +7,7 @@ #include #include -#include +#include #include #include #include @@ -25,7 +25,7 @@ extern char __dtb_z_at91_sama5d27_giantboard_start[]; -ENTRY_FUNCTION(start_sama5d27_giantboard, r0, r1, r2) +SAMA5_ENTRY_FUNCTION(start_sama5d27_giantboard, r4) { void *fdt; @@ -36,5 +36,5 @@ fdt = __dtb_z_at91_sama5d27_giantboard_start + get_runtime_offset(); - sama5d2_barebox_entry(fdt); + sama5d2_barebox_entry(r4, fdt); } diff --git a/arch/arm/boards/sama5d27-som1/lowlevel.c b/arch/arm/boards/sama5d27-som1/lowlevel.c index 792e065..b093711 100644 --- a/arch/arm/boards/sama5d27-som1/lowlevel.c +++ b/arch/arm/boards/sama5d27-som1/lowlevel.c @@ -69,5 +69,5 @@ fdt = __dtb_z_at91_sama5d27_som1_ek_start + get_runtime_offset(); ek_turn_led(RGB_LED_GREEN); - sama5d2_barebox_entry(fdt); + sama5d2_barebox_entry(r4, fdt); } diff --git a/arch/arm/mach-at91/ddramc.c b/arch/arm/mach-at91/ddramc.c index 6dac794..a241ea9 100644 --- a/arch/arm/mach-at91/ddramc.c +++ b/arch/arm/mach-at91/ddramc.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -18,8 +19,9 @@ return at91_get_ddram_size(base, true); } -void __noreturn sama5d2_barebox_entry(void *boarddata) +void __noreturn sama5d2_barebox_entry(unsigned int r4, void *boarddata) { + __sama5d2_stashed_bootrom_r4 = r4; barebox_arm_entry(SAMA5_DDRCS, sama5_ramsize(SAMA5D2_BASE_MPDDRC), boarddata); } diff --git a/arch/arm/mach-at91/include/mach/ddramc.h b/arch/arm/mach-at91/include/mach/ddramc.h index cd85bb6..b929bf5 100644 --- a/arch/arm/mach-at91/include/mach/ddramc.h +++ b/arch/arm/mach-at91/include/mach/ddramc.h @@ -32,7 +32,6 @@ void __iomem *ram_address, struct at91_ddramc_register *ddramc_config); -void __noreturn sama5d2_barebox_entry(void *boarddata); - +void __noreturn sama5d2_barebox_entry(unsigned int r4, void *boarddata); #endif /* #ifndef __DDRAMC_H__ */ diff --git a/arch/arm/mach-at91/include/mach/sama5_bootsource.h b/arch/arm/mach-at91/include/mach/sama5_bootsource.h index 29354dc..0f90afe 100644 --- a/arch/arm/mach-at91/include/mach/sama5_bootsource.h +++ b/arch/arm/mach-at91/include/mach/sama5_bootsource.h @@ -43,4 +43,7 @@ return FIELD_GET(SAMA5_BOOTSOURCE_INSTANCE, reg); } +#define __sama5d2_stashed_bootrom_r4 \ + (*(volatile u32 *)(SAMA5D2_SRAM_BASE + SAMA5D2_SRAM_SIZE - 0x4)) + #endif diff --git a/arch/arm/mach-at91/sama5d2.c b/arch/arm/mach-at91/sama5d2.c index c498b09..2ce6d7f 100644 --- a/arch/arm/mach-at91/sama5d2.c +++ b/arch/arm/mach-at91/sama5d2.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #define SFR_CAN 0x48 @@ -52,3 +53,19 @@ return 0; } postmmu_initcall(sama5d2_init); + +static int sama5d2_bootsource_init(void) +{ + u32 r4; + + if (!of_machine_is_compatible("atmel,sama5d2")) + return 0; + + r4 = __sama5d2_stashed_bootrom_r4; + + bootsource_set(sama5_bootsource(r4)); + bootsource_set_instance(sama5_bootsource_instance(r4)); + + return 0; +} +postcore_initcall(sama5d2_bootsource_init);