From: Dinh Nguyen <dingu...@opensource.altera.com> Add code to handle status of the bsel.
Signed-off-by: Dinh Nguyen <dingu...@opensource.altera.com> --- arch/arm/cpu/armv7/socfpga/lowlevel_init.S | 61 ++++++++++++---------- arch/arm/cpu/armv7/socfpga/spl.c | 2 + arch/arm/include/asm/arch-socfpga/reset_manager.h | 31 +++++++++++ arch/arm/include/asm/arch-socfpga/system_manager.h | 9 +++- 4 files changed, 73 insertions(+), 30 deletions(-) diff --git a/arch/arm/cpu/armv7/socfpga/lowlevel_init.S b/arch/arm/cpu/armv7/socfpga/lowlevel_init.S index f251f07..ee3c9fa 100644 --- a/arch/arm/cpu/armv7/socfpga/lowlevel_init.S +++ b/arch/arm/cpu/armv7/socfpga/lowlevel_init.S @@ -6,44 +6,49 @@ #include <config.h> #include <version.h> +#include <linux/linkage.h> +#include <asm-offsets.h> +#include <asm/arch/reset_manager.h> +#include <asm/arch/system_manager.h> /* Save the parameter pass in by previous boot loader */ .global save_boot_params save_boot_params: /* no parameter to save */ - bx lr - - /* Remap */ #ifdef CONFIG_SPL_BUILD /* - * SPL : configure the remap (L3 NIC-301 GPV) - * so the on-chip RAM at lower memory instead ROM. - */ - ldr r0, =SOCFPGA_L3REGS_ADDRESS - mov r1, #0x19 - str r1, [r0] -#else - /* - * U-Boot : configure the remap (L3 NIC-301 GPV) - * so the SDRAM at lower memory instead on-chip RAM. - */ - ldr r0, =SOCFPGA_L3REGS_ADDRESS - mov r1, #0x2 - str r1, [r0] + * If BSEL is zero, then the bootrom has not + * handed any information to preloader. + */ + ldr r9,=SYSMGR_BOOTINFO + ldr r9, [r9] + and r9, r9, #SYSMGR_BOOTINFO_BSEL_MASK + cmp r9, #0 + bne bsel_non_zero + ldr r4, =rst_mgr_status + ldr r5, =RSTMGR_COLDRST_MASK + str r5, [r4] + b bsel_zero - /* Private components security */ +bsel_non_zero: + /* get the reset manager status register passed by BootROM */ + add r5, r0,#0x38 + ldr r4, =rst_mgr_status + ldr r5, [r5] + str r5, [r4] +bsel_zero: /* - * U-Boot : configure private timer, global timer and cpu - * component access as non secure for kernel stage (as required - * by kernel) + * Initialize the early stack point on OCRAM. This is to avoid OCRAM + * false double bit error as OCRAM always ready in 64 bit manner */ - mrc p15,4,r0,c15,c0,0 - add r1, r0, #0x54 - ldr r2, [r1] - orr r2, r2, #0xff - orr r2, r2, #0xf00 - str r2, [r1] + ldr r1, =(CONFIG_SYS_INIT_SP_ADDR) /* start of temporary SP */ + sub r0, r1, #GD_SIZE /* start of mem init */ + mov r2, #0x00000000 /* prepare zero to mem init */ +clrsp: cmp r0, r1 /* while not at end of BSS */ + strlo r2, [r0] /* clear 32-bit BSS word */ + addlo r0, r0, #4 /* move to next */ + blo clrsp #endif /* #ifdef CONFIG_SPL_BUILD */ - mov pc, lr + bx lr diff --git a/arch/arm/cpu/armv7/socfpga/spl.c b/arch/arm/cpu/armv7/socfpga/spl.c index 16ca8b0..bf5b682 100644 --- a/arch/arm/cpu/armv7/socfpga/spl.c +++ b/arch/arm/cpu/armv7/socfpga/spl.c @@ -20,6 +20,8 @@ DECLARE_GLOBAL_DATA_PTR; +u32 rst_mgr_status; + #define MAIN_VCO_BASE ( \ (CONFIG_HPS_MAINPLLGRP_VCO_DENOM << \ CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) | \ diff --git a/arch/arm/include/asm/arch-socfpga/reset_manager.h b/arch/arm/include/asm/arch-socfpga/reset_manager.h index d63a285..9b3f279 100644 --- a/arch/arm/include/asm/arch-socfpga/reset_manager.h +++ b/arch/arm/include/asm/arch-socfpga/reset_manager.h @@ -7,6 +7,7 @@ #ifndef _RESET_MANAGER_H_ #define _RESET_MANAGER_H_ +#ifndef __ASSEMBLY__ void reset_cpu(ulong addr); void reset_deassert_peripherals_handoff(void); @@ -29,6 +30,7 @@ struct socfpga_reset_manager { u32 per2_mod_reset; u32 brg_mod_reset; }; +#endif /* __ASSEMBLY__ */ #if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET) #define RSTMGR_CTRL_SWWARMRSTREQ_LSB 2 @@ -45,4 +47,33 @@ struct socfpga_reset_manager { #define RSTMGR_PERMODRST_SPIM1_LSB 19 #define RSTMGR_PERMODRST_SDR_LSB 29 +#define RSTMGR_STAT_L4WD1RST_MASK 0x00008000 +#define RSTMGR_STAT_L4WD0RST_MASK 0x00004000 +#define RSTMGR_STAT_MPUWD1RST_MASK 0x00002000 +#define RSTMGR_STAT_MPUWD0RST_MASK 0x00001000 +#define RSTMGR_STAT_SWWARMRST_MASK 0x00000400 +#define RSTMGR_STAT_FPGAWARMRST_MASK 0x00000200 +#define RSTMGR_STAT_NRSTPINRST_MASK 0x00000100 +#define RSTMGR_STAT_SWCOLDRST_MASK 0x00000010 +#define RSTMGR_STAT_CONFIGIOCOLDRST_MASK 0x00000008 +#define RSTMGR_STAT_FPGACOLDRST_MASK 0x00000004 +#define RSTMGR_STAT_NPORPINRST_MASK 0x00000002 +#define RSTMGR_STAT_PORVOLTRST_MASK 0x00000001 + +#define RSTMGR_WARMRST_MASK (\ + RSTMGR_STAT_L4WD1RST_MASK | \ + RSTMGR_STAT_L4WD0RST_MASK | \ + RSTMGR_STAT_MPUWD1RST_MASK | \ + RSTMGR_STAT_MPUWD0RST_MASK | \ + RSTMGR_STAT_SWWARMRST_MASK | \ + RSTMGR_STAT_FPGAWARMRST_MASK | \ + RSTMGR_STAT_NRSTPINRST_MASK) +#define RSTMGR_COLDRST_MASK (\ + RSTMGR_STAT_SWCOLDRST_MASK | \ + RSTMGR_STAT_CONFIGIOCOLDRST_MASK | \ + RSTMGR_STAT_FPGACOLDRST_MASK | \ + RSTMGR_STAT_NPORPINRST_MASK | \ + RSTMGR_STAT_PORVOLTRST_MASK) + + #endif /* _RESET_MANAGER_H_ */ diff --git a/arch/arm/include/asm/arch-socfpga/system_manager.h b/arch/arm/include/asm/arch-socfpga/system_manager.h index 10659f7..01ce2e2 100644 --- a/arch/arm/include/asm/arch-socfpga/system_manager.h +++ b/arch/arm/include/asm/arch-socfpga/system_manager.h @@ -15,8 +15,6 @@ void sysmgr_enable_warmrstcfgio(void); /* declaration for handoff table type */ extern unsigned long sys_mgr_init_table[CONFIG_HPS_PINMUX_NUM]; -#endif - struct socfpga_system_manager { /* System Manager Module */ u32 siliconid1; /* 0x00 */ @@ -118,6 +116,8 @@ struct socfpga_system_manager { u32 spim0usefpga; /* 0x738 */ }; +#endif /* __ASSEMBLY__ */ + #define SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGPINMUX (1 << 0) #define SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO (1 << 1) #define SYSMGR_ECC_OCRAM_EN (1 << 0) @@ -154,4 +154,9 @@ struct socfpga_system_manager { */ #define SOCFPGA_MPUL2_ADRFLTR_START (0xC00) +#define SYSMGR_BOOTINFO (SOCFPGA_SYSMGR_ADDRESS + 0x14) +#define SYSMGR_BOOTINFO_CSEL_LSB 3 +#define SYSMGR_BOOTINFO_CSEL_MASK 0x18 +#define SYSMGR_BOOTINFO_BSEL_MASK 0x7 + #endif /* _SYSTEM_MANAGER_H_ */ -- 2.2.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot