diff options
Diffstat (limited to 'arch/arm/cpu/armv7/omap-common/boot-common.c')
| -rw-r--r-- | arch/arm/cpu/armv7/omap-common/boot-common.c | 70 | 
1 files changed, 53 insertions, 17 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..76ae1b675 100644 --- a/arch/arm/cpu/armv7/omap-common/boot-common.c +++ b/arch/arm/cpu/armv7/omap-common/boot-common.c @@ -23,31 +23,56 @@  #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; +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 !defined(CONFIG_AM33XX) && !defined(CONFIG_TI81XX) +		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 +#endif +		{ +			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_SPL_BUILD  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 +98,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  |