@ -24,6 +24,7 @@
# include <asm/u-boot.h>
# include <asm/utils.h>
# include <asm/arch/sys_proto.h>
# include <asm/io.h>
# include <nand.h>
# include <version.h>
# include <asm/omap_common.h>
@ -32,6 +33,9 @@
void spl_nand_load_image ( void )
{
struct image_header * header ;
int * src __attribute__ ( ( unused ) ) ;
int * dst __attribute__ ( ( unused ) ) ;
switch ( omap_boot_mode ( ) ) {
case NAND_MODE_HW_ECC :
debug ( " spl: nand - using hw ecc \n " ) ;
@ -45,26 +49,56 @@ void spl_nand_load_image(void)
/*use CONFIG_SYS_TEXT_BASE as temporary storage area */
header = ( struct image_header * ) ( CONFIG_SYS_TEXT_BASE ) ;
# ifdef CONFIG_SPL_OS_BOOT
if ( ! spl_uboot_key ( ) ) {
/*
* load parameter image
* load to temp position since nand_spl_load_image reads
* a whole block which is typically larger than
* CONFIG_CMD_SAVEBP_WRITE_SIZE therefore may overwrite
* following sections like BSS
*/
nand_spl_load_image ( CONFIG_CMD_SPL_NAND_OFS ,
CONFIG_CMD_SPL_WRITE_SIZE ,
( void * ) CONFIG_SYS_TEXT_BASE ) ;
/* copy to destintion */
for ( dst = ( int * ) CONFIG_SYS_SPL_ARGS_ADDR ,
src = ( int * ) CONFIG_SYS_TEXT_BASE ;
src < ( int * ) ( CONFIG_SYS_TEXT_BASE +
CONFIG_CMD_SPL_WRITE_SIZE ) ;
src + + , dst + + ) {
writel ( readl ( src ) , dst ) ;
}
/* load linux */
nand_spl_load_image ( CONFIG_SYS_NAND_SPL_KERNEL_OFFS ,
CONFIG_SYS_NAND_PAGE_SIZE , ( void * ) header ) ;
spl_parse_image_header ( header ) ;
nand_spl_load_image ( CONFIG_SYS_NAND_SPL_KERNEL_OFFS ,
spl_image . size , ( void * ) spl_image . load_addr ) ;
} else
# endif
{
# ifdef CONFIG_NAND_ENV_DST
nand_spl_load_image ( CONFIG_ENV_OFFSET ,
CONFIG_SYS_NAND_PAGE_SIZE , ( void * ) header ) ;
spl_parse_image_header ( header ) ;
nand_spl_load_image ( CONFIG_ENV_OFFSET , spl_image . size ,
( void * ) image_load_addr ) ;
nand_spl_load_image ( CONFIG_ENV_OFFSET ,
CONFIG_SYS_NAND_PAGE_SIZE , ( void * ) header ) ;
spl_parse_image_header ( header ) ;
nand_spl_load_image ( CONFIG_ENV_OFFSET , spl_image . size ,
( void * ) spl_image . load_addr ) ;
# ifdef CONFIG_ENV_OFFSET_REDUND
nand_spl_load_image ( CONFIG_ENV_OFFSET_REDUND ,
CONFIG_SYS_NAND_PAGE_SIZE , ( void * ) header ) ;
spl_parse_image_header ( header ) ;
nand_spl_load_image ( CONFIG_ENV_OFFSET_REDUND , spl_image . size ,
( void * ) image_load_addr ) ;
nand_spl_load_image ( CONFIG_ENV_OFFSET_REDUND ,
CONFIG_SYS_NAND_PAGE_SIZE , ( void * ) header ) ;
spl_parse_image_header ( header ) ;
nand_spl_load_image ( CONFIG_ENV_OFFSET_REDUND , spl_image . size ,
( void * ) spl_image . load_addr ) ;
# endif
# endif
/* Load u-boot */
nand_spl_load_image ( CONFIG_SYS_NAND_U_BOOT_OFFS ,
CONFIG_SYS_NAND_PAGE_SIZE , ( void * ) header ) ;
spl_parse_image_header ( header ) ;
nand_spl_load_image ( CONFIG_SYS_NAND_U_BOOT_OFFS ,
spl_image . size , ( void * ) spl_image . load_addr ) ;
/* Load u-boot */
nand_spl_load_image ( CONFIG_SYS_NAND_U_BOOT_OFFS ,
CONFIG_SYS_NAND_PAGE_SIZE , ( void * ) header ) ;
spl_parse_image_header ( header ) ;
nand_spl_load_image ( CONFIG_SYS_NAND_U_BOOT_OFFS ,
spl_image . size , ( void * ) spl_image . load_addr ) ;
}
nand_deselect ( ) ;
}