diff options
| author | SRICHARAN R <r.sricharan@ti.com> | 2013-04-24 00:41:23 +0000 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2013-05-10 08:25:56 -0400 | 
| commit | fda06812a068f916f64d9d1b3d1730e8213195b3 (patch) | |
| tree | b6efdc49f508ec4ec805200b6fe621ed1ba8b8c7 | |
| parent | f92f2277a6cadfdc703a6700593cac3d8211bf53 (diff) | |
| download | olio-uboot-2014.01-fda06812a068f916f64d9d1b3d1730e8213195b3.tar.xz olio-uboot-2014.01-fda06812a068f916f64d9d1b3d1730e8213195b3.zip | |
ARM: OMAP: Correct save_boot_params and replace with 'C' function
Currently save_boot_params saves the boot parameters passed
from romcode. But this is not stored in a writable location
consistently. So the current code would not work for a
'XIP' boot. Change this by saving the boot parameters in
'gd' which is always writable. Also add a 'C' function
instead of an assembly code that is more readable.
Signed-off-by: Sricharan R <r.sricharan@ti.com>
| -rw-r--r-- | arch/arm/cpu/armv7/omap-common/hwinit-common.c | 50 | ||||
| -rw-r--r-- | arch/arm/include/asm/global_data.h | 8 | ||||
| -rw-r--r-- | arch/arm/include/asm/omap_boot.h | 1 | ||||
| -rw-r--r-- | arch/arm/include/asm/omap_common.h | 4 | 
4 files changed, 56 insertions, 7 deletions
| diff --git a/arch/arm/cpu/armv7/omap-common/hwinit-common.c b/arch/arm/cpu/armv7/omap-common/hwinit-common.c index 70d16a816..c7107847c 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,42 @@ 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)); +		} +	} +} +  /*   * Routine: s_init   * Description: Does early system init of watchdog, muxing,  andclocks @@ -132,6 +163,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 +195,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/include/asm/global_data.h b/arch/arm/include/asm/global_data.h index 37ac0daa7..7611d0a18 100644 --- a/arch/arm/include/asm/global_data.h +++ b/arch/arm/include/asm/global_data.h @@ -24,6 +24,10 @@  #ifndef	__ASM_GBL_DATA_H  #define __ASM_GBL_DATA_H +#ifdef CONFIG_OMAP +#include <asm/omap_boot.h> +#endif +  /* Architecture-specific global data */  struct arch_global_data {  #if defined(CONFIG_FSL_ESDHC) @@ -51,6 +55,10 @@ struct arch_global_data {  	unsigned long tlb_addr;  	unsigned long tlb_size;  #endif + +#ifdef CONFIG_OMAP +	struct omap_boot_parameters omap_boot_params; +#endif  };  #include <asm-generic/global_data.h> diff --git a/arch/arm/include/asm/omap_boot.h b/arch/arm/include/asm/omap_boot.h index 87a95302f..a803965ac 100644 --- a/arch/arm/include/asm/omap_boot.h +++ b/arch/arm/include/asm/omap_boot.h @@ -45,5 +45,6 @@ struct omap_boot_parameters {  	unsigned char omap_bootdevice;  	unsigned char reset_reason;  	unsigned char ch_flags; +	unsigned long omap_bootmode;  };  #endif diff --git a/arch/arm/include/asm/omap_common.h b/arch/arm/include/asm/omap_common.h index 837b69fda..eebc9c7cb 100644 --- a/arch/arm/include/asm/omap_common.h +++ b/arch/arm/include/asm/omap_common.h @@ -597,5 +597,7 @@ static inline u32 omap_revision(void)  #define OMAP_SRAM_SCRATCH_DPLLS_PTR     (SRAM_SCRATCH_SPACE_ADDR + 0x18)  #define OMAP_SRAM_SCRATCH_VCORES_PTR    (SRAM_SCRATCH_SPACE_ADDR + 0x1C)  #define OMAP_SRAM_SCRATCH_SYS_CTRL	(SRAM_SCRATCH_SPACE_ADDR + 0x20) -#define OMAP_SRAM_SCRATCH_SPACE_END	(SRAM_SCRATCH_SPACE_ADDR + 0x24) +#define OMAP_SRAM_SCRATCH_BOOT_PARAMS	(SRAM_SCRATCH_SPACE_ADDR + 0x24) +#define OMAP5_SRAM_SCRATCH_SPACE_END	(SRAM_SCRATCH_SPACE_ADDR + 0x28) +  #endif /* _OMAP_COMMON_H_ */ |