From b8c475ce0be7ea15ce6eef930d01dad7c57da03f Mon Sep 17 00:00:00 2001 From: Inderpal Singh Date: Tue, 18 Dec 2012 14:39:38 +0530 Subject: EXYNOS5250: ARNDALE: Read operating mode and invoke copy functions accordingly Signed-off-by: Inderpal Singh --- board/samsung/smdk5250/lowlevel_init.S | 23 +++++++++++++++++++++++ board/samsung/smdk5250/mmc_boot.c | 13 +++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/board/samsung/smdk5250/lowlevel_init.S b/board/samsung/smdk5250/lowlevel_init.S index 2ef520f67..25e2e6881 100644 --- a/board/samsung/smdk5250/lowlevel_init.S +++ b/board/samsung/smdk5250/lowlevel_init.S @@ -102,6 +102,8 @@ first_cpu: cmp r1, r2 /* compare r1, r2 */ beq 1f /* r0 == r1 then skip sdram init */ + bl read_om + /* init system clock */ bl system_clock_init @@ -133,3 +135,24 @@ exit_wakeup: mov pc, r1 nop nop + +read_om: + /* Read booting information */ + ldr r0, =EXYNOS5_POWER_BASE + ldr r1, [r0,#0x0] /*OMR_OFFSET*/ + bic r2, r1, #0xffffffc1 + + /* SD/MMC BOOT */ + cmp r2, #0x4 + moveq r3, #BOOT_MMCSD + + /* eMMC 4.4 BOOT */ + cmp r2, #0x8 + moveq r3, #BOOT_EMMC_4_4 + cmp r2, #0x28 + moveq r3, #BOOT_EMMC_4_4 + + ldr r0, =(EXYNOS5_POWER_BASE + INFORM3_OFFSET) + str r3, [r0] + + mov pc, lr diff --git a/board/samsung/smdk5250/mmc_boot.c b/board/samsung/smdk5250/mmc_boot.c index 449a919d5..c0b79eb38 100644 --- a/board/samsung/smdk5250/mmc_boot.c +++ b/board/samsung/smdk5250/mmc_boot.c @@ -30,9 +30,18 @@ */ void copy_uboot_to_ram(void) { - u32 (*copy_bl2)(u32, u32, u32) = (void *) *(u32 *)COPY_BL2_FNPTR_ADDR; + u32 (*copy_bl2_from_mmc)(u32, u32, u32) = (void *) *(u32 *)COPY_BL2_FNPTR_ADDR; + u32 (*copy_bl2_from_emmc)(u32, u32) = (void *) *(u32 *)COPY_BL2_FNPTR_ADDR_EMMC; + u32 (*copy_bl2_from_emmc_done)() = (void *) *(u32 *)COPY_BL2_FNPTR_ADDR_EMMC_DONE; - copy_bl2(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT, CONFIG_SYS_TEXT_BASE); + u32 inform3 = readl(EXYNOS5_POWER_BASE + INFORM3_OFFSET); + + if (inform3 == BOOT_MMCSD) + copy_bl2_from_mmc(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT, CONFIG_SYS_TEXT_BASE); + else if (inform3 == BOOT_EMMC_4_4) { + copy_bl2_from_emmc(BL2_SIZE_BLOC_COUNT, CONFIG_SYS_TEXT_BASE); + copy_bl2_from_emmc_done(); + } } void board_init_f(unsigned long bootflag) -- cgit v1.2.3