diff options
Diffstat (limited to 'arch/arm/cpu/armv7/omap-common')
| -rw-r--r-- | arch/arm/cpu/armv7/omap-common/boot-common.c | 31 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/omap-common/clocks-common.c | 1 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/omap-common/emif-common.c | 11 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/omap-common/hwinit-common.c | 61 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/omap-common/lowlevel_init.S | 50 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/omap-common/reset.c | 4 | 
6 files changed, 84 insertions, 74 deletions
| diff --git a/arch/arm/cpu/armv7/omap-common/boot-common.c b/arch/arm/cpu/armv7/omap-common/boot-common.c index 24cbe2da0..bff7e9c82 100644 --- a/arch/arm/cpu/armv7/omap-common/boot-common.c +++ b/arch/arm/cpu/armv7/omap-common/boot-common.c @@ -23,31 +23,17 @@  #include <asm/arch/mmc_host_def.h>  #include <asm/arch/sys_proto.h> -/* - * This is used to verify if the configuration header - * was executed by rom code prior to control of transfer - * to the bootloader. SPL is responsible for saving and - * passing the boot_params pointer to the u-boot. - */ -struct omap_boot_parameters boot_params __attribute__ ((section(".data"))); +DECLARE_GLOBAL_DATA_PTR;  #ifdef CONFIG_SPL_BUILD -/* - * We use static variables because global data is not ready yet. - * Initialized data is available in SPL right from the beginning. - * We would not typically need to save these parameters in regular - * U-Boot. This is needed only in SPL at the moment. - */ -u32 omap_bootmode = MMCSD_MODE_FAT; -  u32 spl_boot_device(void)  { -	return (u32) (boot_params.omap_bootdevice); +	return (u32) (gd->arch.omap_boot_params.omap_bootdevice);  }  u32 spl_boot_mode(void)  { -	return omap_bootmode; +	return gd->arch.omap_boot_params.omap_bootmode;  }  void spl_board_init(void) @@ -73,4 +59,15 @@ int board_mmc_init(bd_t *bis)  	}  	return 0;  } + +void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) +{ +	typedef void __noreturn (*image_entry_noargs_t)(u32 *); +	image_entry_noargs_t image_entry = +			(image_entry_noargs_t) spl_image->entry_point; + +	debug("image entry point: 0x%X\n", spl_image->entry_point); +	/* Pass the saved boot_params from rom code */ +	image_entry((u32 *)&gd->arch.omap_boot_params); +}  #endif diff --git a/arch/arm/cpu/armv7/omap-common/clocks-common.c b/arch/arm/cpu/armv7/omap-common/clocks-common.c index 2b955c7c0..99910cdcb 100644 --- a/arch/arm/cpu/armv7/omap-common/clocks-common.c +++ b/arch/arm/cpu/armv7/omap-common/clocks-common.c @@ -716,6 +716,7 @@ void prcm_init(void)  		setup_non_essential_dplls();  		enable_non_essential_clocks();  #endif +		setup_warmreset_time();  		break;  	default:  		break; diff --git a/arch/arm/cpu/armv7/omap-common/emif-common.c b/arch/arm/cpu/armv7/omap-common/emif-common.c index cdb443972..11e830a53 100644 --- a/arch/arm/cpu/armv7/omap-common/emif-common.c +++ b/arch/arm/cpu/armv7/omap-common/emif-common.c @@ -1075,6 +1075,11 @@ static void do_sdram_init(u32 base)  		else  			ddr3_init(base, regs);  	} +	if (warm_reset() && (emif_sdram_type() == EMIF_SDRAM_TYPE_DDR3)) { +		set_lpmode_selfrefresh(base); +		emif_reset_phy(base); +		ddr3_leveling(base, regs); +	}  	/* Write to the shadow registers */  	emif_update_timings(base, regs); @@ -1262,10 +1267,10 @@ void sdram_init(void)  	in_sdram = running_from_sdram();  	debug("in_sdram = %d\n", in_sdram); -	if (!(in_sdram || warm_reset())) { -		if (sdram_type == EMIF_SDRAM_TYPE_LPDDR2) +	if (!in_sdram) { +		if ((sdram_type == EMIF_SDRAM_TYPE_LPDDR2) && !warm_reset())  			bypass_dpll((*prcm)->cm_clkmode_dpll_core); -		else +		else if (sdram_type == EMIF_SDRAM_TYPE_DDR3)  			writel(CM_DLL_CTRL_NO_OVERRIDE, (*prcm)->cm_dll_ctrl);  	} diff --git a/arch/arm/cpu/armv7/omap-common/hwinit-common.c b/arch/arm/cpu/armv7/omap-common/hwinit-common.c index 70d16a816..1645120de 100644 --- a/arch/arm/cpu/armv7/omap-common/hwinit-common.c +++ b/arch/arm/cpu/armv7/omap-common/hwinit-common.c @@ -101,11 +101,6 @@ void omap_rev_string(void)  }  #ifdef CONFIG_SPL_BUILD -static void init_boot_params(void) -{ -	boot_params_ptr = (u32 *) &boot_params; -} -  void spl_display_print(void)  {  	omap_rev_string(); @@ -116,6 +111,53 @@ void __weak srcomp_enable(void)  {  } +static void save_omap_boot_params(void) +{ +	u32 rom_params = *((u32 *)OMAP_SRAM_SCRATCH_BOOT_PARAMS); +	u8 boot_device; +	u32 dev_desc, dev_data; + +	if ((rom_params <  NON_SECURE_SRAM_START) || +	    (rom_params > NON_SECURE_SRAM_END)) +		return; + +	/* +	 * rom_params can be type casted to omap_boot_parameters and +	 * used. But it not correct to assume that romcode structure +	 * encoding would be same as u-boot. So use the defined offsets. +	 */ +	gd->arch.omap_boot_params.omap_bootdevice = boot_device = +				   *((u8 *)(rom_params + BOOT_DEVICE_OFFSET)); + +	gd->arch.omap_boot_params.ch_flags = +				*((u8 *)(rom_params + CH_FLAGS_OFFSET)); + +	if ((boot_device >= MMC_BOOT_DEVICES_START) && +	    (boot_device <= MMC_BOOT_DEVICES_END)) { +		if ((omap_hw_init_context() == +				      OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)) { +			gd->arch.omap_boot_params.omap_bootmode = +			*((u8 *)(rom_params + BOOT_MODE_OFFSET)); +		} else { +			dev_desc = *((u32 *)(rom_params + DEV_DESC_PTR_OFFSET)); +			dev_data = *((u32 *)(dev_desc + DEV_DATA_PTR_OFFSET)); +			gd->arch.omap_boot_params.omap_bootmode = +					*((u32 *)(dev_data + BOOT_MODE_OFFSET)); +		} +	} +} + +#ifdef CONFIG_ARCH_CPU_INIT +/* + * SOC specific cpu init + */ +int arch_cpu_init(void) +{ +	save_omap_boot_params(); +	return 0; +} +#endif /* CONFIG_ARCH_CPU_INIT */ +  /*   * Routine: s_init   * Description: Does early system init of watchdog, muxing,  andclocks @@ -132,6 +174,14 @@ void __weak srcomp_enable(void)   */  void s_init(void)  { +	/* +	 * Save the boot parameters passed from romcode. +	 * We cannot delay the saving further than this, +	 * to prevent overwrites. +	 */ +#ifdef CONFIG_SPL_BUILD +	save_omap_boot_params(); +#endif  	init_omap_revision();  	hw_data_init(); @@ -156,7 +206,6 @@ void s_init(void)  	/* For regular u-boot sdram_init() is called from dram_init() */  	sdram_init(); -	init_boot_params();  #endif  } diff --git a/arch/arm/cpu/armv7/omap-common/lowlevel_init.S b/arch/arm/cpu/armv7/omap-common/lowlevel_init.S index 90b3c8aea..c4895369b 100644 --- a/arch/arm/cpu/armv7/omap-common/lowlevel_init.S +++ b/arch/arm/cpu/armv7/omap-common/lowlevel_init.S @@ -28,59 +28,13 @@  #include <config.h>  #include <asm/arch/omap.h> +#include <asm/omap_common.h>  #include <asm/arch/spl.h>  #include <linux/linkage.h>  ENTRY(save_boot_params) -	/* -	 * See if the rom code passed pointer is valid: -	 * It is not valid if it is not in non-secure SRAM -	 * This may happen if you are booting with the help of -	 * debugger -	 */ -	ldr     r2, =NON_SECURE_SRAM_START -	cmp	r2, r0 -	bgt	1f -	ldr	r2, =NON_SECURE_SRAM_END -	cmp	r2, r0 -	blt	1f - -	/* -	 * store the boot params passed from rom code or saved -	 * and passed by SPL -	 */ -	cmp	r0, #0 -	beq	1f -	ldr	r1, =boot_params +	ldr	r1, =OMAP_SRAM_SCRATCH_BOOT_PARAMS  	str	r0, [r1] -#ifdef CONFIG_SPL_BUILD -	/* Store the boot device in spl_boot_device */ -	ldrb	r2, [r0, #BOOT_DEVICE_OFFSET]	@ r1 <- value of boot device -	and	r2, #BOOT_DEVICE_MASK -	ldr	r3, =boot_params -	strb	r2, [r3, #BOOT_DEVICE_OFFSET]	@ spl_boot_device <- r1 - -	/* -	 * boot mode is only valid for device that can be raw or FAT booted. -	 * in other cases it may be fatal to look.  While platforms differ -	 * in the values used for each MMC slot, they are contiguous. -	 */ -	cmp	r2, #MMC_BOOT_DEVICES_START -	blt	2f -	cmp	r2, #MMC_BOOT_DEVICES_END -	bgt	2f -	/* Store the boot mode (raw/FAT) in omap_bootmode */ -	ldr	r2, [r0, #DEV_DESC_PTR_OFFSET]	@ get the device descriptor ptr -	ldr	r2, [r2, #DEV_DATA_PTR_OFFSET]	@ get the pDeviceData ptr -	ldr	r2, [r2, #BOOT_MODE_OFFSET]	@ get the boot mode -	ldr	r3, =omap_bootmode -	str	r2, [r3] -#endif -2: -	ldrb	r2, [r0, #CH_FLAGS_OFFSET] -	ldr	r3, =boot_params -	strb	r2, [r3, #CH_FLAGS_OFFSET] -1:  	bx	lr  ENDPROC(save_boot_params) diff --git a/arch/arm/cpu/armv7/omap-common/reset.c b/arch/arm/cpu/armv7/omap-common/reset.c index 587bb4774..57ea9d999 100644 --- a/arch/arm/cpu/armv7/omap-common/reset.c +++ b/arch/arm/cpu/armv7/omap-common/reset.c @@ -39,3 +39,7 @@ u32 __weak warm_reset(void)  {  	return (readl(PRM_RSTST) & PRM_RSTST_WARM_RESET_MASK);  } + +void __weak setup_warmreset_time(void) +{ +} |