diff mbox

[U-Boot,7/8] arm/davinci: spl - boot device selection

Message ID 1339535752-21565-7-git-send-email-mikhail.kshevetskiy@gmail.com
State Changes Requested
Delegated to: Tom Rini
Headers show

Commit Message

Mikhail Kshevetskiy June 12, 2012, 9:15 p.m. UTC
Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@gmail.com>
---
 arch/arm/cpu/arm926ejs/davinci/Makefile          |    5 ++
 arch/arm/cpu/arm926ejs/davinci/spl.c             |   91 +++++++++++++++++++---
 arch/arm/cpu/arm926ejs/davinci/spl_mmc.c         |   37 +++++++++
 arch/arm/cpu/arm926ejs/davinci/spl_nand.c        |   11 +++
 arch/arm/cpu/arm926ejs/davinci/spl_spi_flash.c   |   25 ++++++
 arch/arm/cpu/arm926ejs/davinci/spl_ymodem.c      |   41 ++++++++++
 arch/arm/include/asm/arch-davinci/davinci_boot.h |   25 ++++++
 include/configs/cam_enc_4xx.h                    |   12 +--
 include/configs/da850evm.h                       |   19 +++--
 include/configs/hawkboard.h                      |   11 +--
 10 files changed, 247 insertions(+), 30 deletions(-)
 create mode 100644 arch/arm/cpu/arm926ejs/davinci/spl_mmc.c
 create mode 100644 arch/arm/cpu/arm926ejs/davinci/spl_nand.c
 create mode 100644 arch/arm/cpu/arm926ejs/davinci/spl_spi_flash.c
 create mode 100644 arch/arm/cpu/arm926ejs/davinci/spl_ymodem.c
 create mode 100644 arch/arm/include/asm/arch-davinci/davinci_boot.h

Comments

Christian Riesch June 18, 2012, 8:10 p.m. UTC | #1
Hi,

On Tuesday, June 12, 2012, Mikhail Kshevetskiy wrote:

> Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@gmail.com<javascript:;>
> >
> ---
>  arch/arm/cpu/arm926ejs/davinci/Makefile          |    5 ++
>  arch/arm/cpu/arm926ejs/davinci/spl.c             |   91
> +++++++++++++++++++---
>  arch/arm/cpu/arm926ejs/davinci/spl_mmc.c         |   37 +++++++++
>  arch/arm/cpu/arm926ejs/davinci/spl_nand.c        |   11 +++
>  arch/arm/cpu/arm926ejs/davinci/spl_spi_flash.c   |   25 ++++++
>  arch/arm/cpu/arm926ejs/davinci/spl_ymodem.c      |   41 ++++++++++
>  arch/arm/include/asm/arch-davinci/davinci_boot.h |   25 ++++++
>  include/configs/cam_enc_4xx.h                    |   12 +--
>  include/configs/da850evm.h                       |   19 +++--
>  include/configs/hawkboard.h                      |   11 +--
>  10 files changed, 247 insertions(+), 30 deletions(-)
>  create mode 100644 arch/arm/cpu/arm926ejs/davinci/spl_mmc.c
>  create mode 100644 arch/arm/cpu/arm926ejs/davinci/spl_nand.c
>  create mode 100644 arch/arm/cpu/arm926ejs/davinci/spl_spi_flash.c
>  create mode 100644 arch/arm/cpu/arm926ejs/davinci/spl_ymodem.c
>  create mode 100644 arch/arm/include/asm/arch-davinci/davinci_boot.h
>
> diff --git a/arch/arm/cpu/arm926ejs/davinci/Makefile
> b/arch/arm/cpu/arm926ejs/davinci/Makefile
> index da7efac..12bd37a 100644
> --- a/arch/arm/cpu/arm926ejs/davinci/Makefile
> +++ b/arch/arm/cpu/arm926ejs/davinci/Makefile
> @@ -40,6 +40,11 @@ ifdef CONFIG_SPL_BUILD
>  COBJS-y        += spl.o
>  COBJS-$(CONFIG_SOC_DM365)      += dm365_lowlevel.o
>  COBJS-$(CONFIG_SOC_DA8XX)      += da850_lowlevel.o
> +
> +COBJS-$(CONFIG_SPL_NAND_SUPPORT)       += spl_nand.o
> +COBJS-$(CONFIG_SPL_SPI_FLASH_SUPPORT)  += spl_spi_flash.o
> +COBJS-$(CONFIG_SPL_YMODEM_SUPPORT)     += spl_ymodem.o
> +COBJS-$(CONFIG_SPL_MMC_SUPPORT)                += spl_mmc.o
>  endif
>
>  SOBJS  = reset.o
> diff --git a/arch/arm/cpu/arm926ejs/davinci/spl.c
> b/arch/arm/cpu/arm926ejs/davinci/spl.c
> index 74632e5..a8c318c 100644
> --- a/arch/arm/cpu/arm926ejs/davinci/spl.c
> +++ b/arch/arm/cpu/arm926ejs/davinci/spl.c
> @@ -25,9 +25,11 @@
>  #include <asm/utils.h>
>  #include <nand.h>
>  #include <asm/arch/dm365_lowlevel.h>
> +#include <asm/arch/davinci_boot.h>
>  #include <ns16550.h>
>  #include <malloc.h>
>  #include <spi_flash.h>
> +#include <linux/compiler.h>
>
>  #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
>
> @@ -72,25 +74,92 @@ void board_init_f(ulong dummy)
>        relocate_code(CONFIG_SPL_STACK, NULL, CONFIG_SPL_TEXT_BASE);
>  }
>
> +u32 davinci_boot_device(void){
> +#ifdef CONFIG_SOC_DA8XX
> +       u32 bootmode = ((*((vu_long*)0x01C14020)) & 0x1F);


You should probably introduce defines for the address and the bitmask. How
about using readl?


> +       switch(bootmode){
> +       case 0x0E:      /* NAND 8  */
> +       case 0x10:      /* NAND 16 */
> +               return BOOT_DEVICE_NAND;
> +       case 0x0A:
> +       case 0x0C:
> +               return BOOT_DEVICE_SPI_FLASH;
> +       case 0x16:      /* UART0 */
> +       case 0x17:      /* UART1 */
> +       case 0x14:      /* UART2 */
> +               return BOOT_DEVICE_UART;
> +       case 0x1C:      /* MMC/SD */
> +               return BOOT_DEVICE_MMC;
> +       default:
> +               return BOOT_DEVICE_NONE;
> +       }


Nice :-)


> +#else
> +#ifdef
> +#endif CONFIG_SPL_NAND_SUPPORT
> +       return BOOT_DEVICE_NAND;
> +#endif
> +#ifdef BOOT_DEVICE_SPI_FLASH
> +       return BOOT_DEVICE_SPI_FLASH;
> +#endif
> +#ifdef CONFIG_SPL_YMODEM_SUPPORT
> +       return BOOT_DEVICE_UART;
> +#endif
> +#ifdef CONFIG_SPL_MMC_SUPPORT
> +       return BOOT_DEVICE_MMC;
> +#endif
> +}
> +
>  void board_init_r(gd_t *id, ulong dummy)
>  {
> -#ifdef CONFIG_SPL_NAND_LOAD
> -       nand_init();
> -       puts("Nand boot...\n");
> -       nand_boot();
> -#endif
> -#ifdef CONFIG_SPL_SPI_LOAD
> -       mem_malloc_init(CONFIG_SYS_TEXT_BASE - CONFIG_SYS_MALLOC_LEN,
> -                       CONFIG_SYS_MALLOC_LEN);
> +       u32 boot_device;
> +       void (*uboot)(void) __noreturn;
> +
> +       mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
> +                       CONFIG_SYS_SPL_MALLOC_SIZE);
>
>        gd = &gdata;
>        gd->bd = &bdata;
>        gd->flags |= GD_FLG_RELOC;
> +#ifdef CONFIG_SPL_SERIAL_SUPPORT
>        gd->baudrate = CONFIG_BAUDRATE;
> -       serial_init();          /* serial communications setup */
> +       serial_init();
>        gd->have_console = 1;
> +#endif
>
> -       puts("SPI boot...\n");
> -       spi_boot();
> +       boot_device = davinci_boot_device();
> +       debug("boot device - %d\n", boot_device);
> +       switch (boot_device) {
> +#ifdef CONFIG_SPL_NAND_SUPPORT
> +       case BOOT_DEVICE_NAND:
> +               puts("Booting from nand flash ...\n");
> +               spl_nand_load_image();
> +               break;
> +#endif
> +#ifdef CONFIG_SPL_SPI_FLASH_SUPPORT
> +       case BOOT_DEVICE_SPI_FLASH:
> +               puts("Booting from spi flash ...\n");
> +               spl_spi_flash_load_image();
> +               break;
>  #endif
> +#ifdef CONFIG_SPL_YMODEM_SUPPORT
> +       case BOOT_DEVICE_UART:
> +               puts("Booting from uart ...\n");
> +               spl_ymodem_load_image();
> +               break;
> +#endif
> +#ifdef CONFIG_SPL_MMC_SUPPORT
> +       case BOOT_DEVICE_MMC:
> +               puts("Booting from mmc/sd card...\n");
> +               spl_mmc_load_image();
> +               break;
> +#endif
> +       default:
> +               printf("SPL: Un-supported Boot Device - %d!!!\n",
> boot_device);
> +               hang();
> +               break;
> +       }
> +
> +       puts("Jump to U-Boot image...\n");
> +       uboot = (void *) CONFIG_SYS_TEXT_BASE;
> +       (*uboot)();
>  }
> diff --git a/arch/arm/cpu/arm926ejs/davinci/spl_mmc.c
> b/arch/arm/cpu/arm926ejs/davinci/spl_mmc.c
> new file mode 100644
> index 0000000..520ecd1
> --- /dev/null
> +++ b/arch/arm/cpu/arm926ejs/davinci/spl_mmc.c
> @@ -0,0 +1,37 @@
> +#include <common.h>
> +#include <asm/u-boot.h>
> +#include <asm/utils.h>
> +#include <mmc.h>
> +#include <asm/arch/sdmmc_defs.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +void spl_mmc_load_image(void)
> +{
> +       int ret;
> +       struct mmc *mmc;
> +
> +       mmc_initialize(gd->bd);
> +       /* We register only one device. So, the dev id is always 0 */
> +       mmc = find_mmc_device(0);
> +       if (!mmc) {
> +               puts("spl: mmc device not found!!\n");
> +               hang();
> +       }
> +
> +       ret = mmc_init(mmc);
> +       if (ret) {
> +               printf("spl: mmc init failed: err - %d\n", ret);
> +               hang();
> +       }
> +
> +       ret = mmc->block_dev.block_read(0,
> CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR,
> +                                       CONFIG_SYS_U_BOOT_MAX_SIZE_SECTORS,
> +                                       (void *) CONFIG_SYS_TEXT_BASE);
> +       if (ret < 0) {
> +               printf("spl: mmc blk read err - %d\n", ret);
> +               hang();
> +       }
> +
> +       debug("Loaded %d sectors from SD/MMC card\n",
> CONFIG_SYS_U_BOOT_MAX_SIZE_SECTORS);
> +}
> diff --git a/arch/arm/cpu/arm926ejs/davinci/spl_nand.c
> b/arch/arm/cpu/arm926ejs/davinci/spl_nand.c
> new file mode 100644
> index 0000000..bad1e8f
> --- /dev/null
> +++ b/arch/arm/cpu/arm926ejs/davinci/spl_nand.c
> @@ -0,0 +1,11 @@
> +#include <common.h>
> +#include <nand.h>
> +
> +void spl_nand_load_image(void)
> +{
> +       nand_init();
> +       nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
> +                       CONFIG_SYS_NAND_U_BOOT_SIZE,
> +                       (void *) CONFIG_SYS_TEXT_BASE);
> +       debug("Loaded %d bytes from NAND flash\n",
> CONFIG_SYS_NAND_U_BOOT_SIZE);



Why not use the code from drivers/mtd/nand/nand_spl_load.c?

+}
> diff --git a/arch/arm/cpu/arm926ejs/davinci/spl_spi_flash.c
> b/arch/arm/cpu/arm926ejs/davinci/spl_spi_flash.c
> new file mode 100644
> index 0000000..2d5b045
> --- /dev/null
> +++ b/arch/arm/cpu/arm926ejs/davinci/spl_spi_flash.c
> @@ -0,0 +1,25 @@
> +#include <common.h>
> +#include <spi_flash.h>
> +
> +void spl_spi_flash_load_image(void)
> +{
> +       int ret;
> +       struct spi_flash *flash;
> +
> +       flash = spi_flash_probe(CONFIG_SPL_SPI_BUS, CONFIG_SPL_SPI_CS,
> +                               CONFIG_SF_DEFAULT_SPEED, SPI_MODE_3);
> +       if (!flash) {
> +               puts("spl: spi flash probe failed.\n");
> +               hang();
> +       }
> +
> +       ret = spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS,
> +                            CONFIG_SYS_SPI_U_BOOT_SIZE,
> +                            (void *) CONFIG_SYS_TEXT_BASE);


This duplicates the code in drivers/mtd/spi/spi_spl_load.c.


> +       if (ret < 0) {
> +               printf("spl: spi flash read err - %d\n", ret);
> +               hang();
> +       }
> +
> +       debug("Loaded %d bytes from SPI flash\n",
> CONFIG_SYS_SPI_U_BOOT_SIZE);
> +}
> diff --git a/arch/arm/cpu/arm926ejs/davinci/spl_ymodem.c
> b/arch/arm/cpu/arm926ejs/davinci/spl_ymodem.c
> new file mode 100644
> index 0000000..be6786b
> --- /dev/null
> +++ b/arch/arm/cpu/arm926ejs/davinci/spl_ymodem.c
> @@ -0,0 +1,41 @@
> +#include <common.h>
> +#include <xyzModem.h>
> +#include <asm/u-boot.h>
> +#include <asm/utils.h>
> +
> +#define BUF_SIZE 1024
> +
> +static int getcymodem(void) {
> +       if (tstc())
> +               return (getc());
> +       return -1;
> +}
> +
> +void spl_ymodem_load_image(void)
> +{
> +       int size;
> +       int err;
> +       int res;
> +       connection_info_t info;
> +       ulong store_addr = ~0;
> +
> +       size = 0;
> +       info.mode = xyzModem_ymodem;
> +       res = xyzModem_stream_open (&info, &err);
> +       if (!res) {
> +               store_addr = CONFIG_SYS_TEXT_BASE;
> +               while ((res =
> +                       xyzModem_stream_read ((char*)store_addr, 1024,
> &err)) > 0) {
> +                       store_addr += res;
> +                       size += res;
> +               }
> +       } else {
> +               printf("spl: ymodem err - %s\n", xyzModem_error(err));
> +               hang();
> +       }
> +
> +       xyzModem_stream_close (&err);
> +       xyzModem_stream_terminate (false, &getcymodem);
> +
> +       debug("Loaded %d bytes from UART\n", size);
> +}
> diff --git a/arch/arm/include/asm/arch-davinci/davinci_boot.h
> b/arch/arm/include/asm/arch-davinci/davinci_boot.h
> new file mode 100644
> index 0000000..5d553ee
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-davinci/davinci_boot.h
> @@ -0,0 +1,25 @@
> +#ifndef        _DAVINCI_BOOT_H_
> +#define        _DAVINCI_BOOT_H_
> +
> +/* Boot device */
> +#define BOOT_DEVICE_NONE        0
> +#define BOOT_DEVICE_NAND        1
> +#define BOOT_DEVICE_SPI_FLASH   2
> +#define BOOT_DEVICE_UART        3
> +#define BOOT_DEVICE_MMC         4
> +
> +u32 davinci_boot_device(void);
> +
> +/* NAND SPL functions */
> +void spl_nand_load_image(void);
> +
> +/* SPI FLASH SPL functions */
> +void spl_spi_flash_load_image(void);
> +
> +/* YMODEM SPL functions */
> +void spl_ymodem_load_image(void);
> +
> +/* MMC SPL functions */
> +void spl_mmc_load_image(void);
> +
> +#endif /* _DAVINCI_BOOT_H_ */
> diff --git a/include/configs/cam_enc_4xx.h b/include/configs/cam_enc_4xx.h
> index 71faf1c..58dde89 100644
> --- a/include/configs/cam_enc_4xx.h
> +++ b/include/configs/cam_enc_4xx.h
> @@ -219,18 +219,18 @@
>
>  /* Defines for SPL */
>  #define CONFIG_SPL
> +#define CONFIG_SPL_LDSCRIPT            "$(BOARDDIR)/u-boot-spl.lds"
> +#define CONFIG_SPL_STACK               (0x00010000 + 0x7f00)
> +#define CONFIG_SPL_TEXT_BASE           0x00000020
> /*CONFIG_SYS_SRAM_START*/
> +#define CONFIG_SYS_SPL_MALLOC_START    (CONFIG_SYS_TEXT_BASE -
> CONFIG_SYS_MALLOC_LEN)
> +#define CONFIG_SYS_SPL_MALLOC_SIZE     CONFIG_SYS_MALLOC_LEN
> +#define CONFIG_SPL_MAX_SIZE            12320
>  #define CONFIG_SPL_LIBGENERIC_SUPPORT
>  #define CONFIG_SPL_NAND_SUPPORT
>  #define CONFIG_SPL_NAND_SIMPLE
> -#define CONFIG_SPL_NAND_LOAD
>  #define CONFIG_SYS_NAND_HW_ECC_OOBFIRST
>  #define CONFIG_SPL_SERIAL_SUPPORT
>  #define CONFIG_SPL_POST_MEM_SUPPORT
> -#define CONFIG_SPL_LDSCRIPT            "$(BOARDDIR)/u-boot-spl.lds"
> -#define CONFIG_SPL_STACK               (0x00010000 + 0x7f00)
> -
> -#define CONFIG_SPL_TEXT_BASE           0x00000020
> /*CONFIG_SYS_SRAM_START*/
> -#define CONFIG_SPL_MAX_SIZE            12320
>
>  #ifndef CONFIG_SPL_BUILD
>  #define CONFIG_SYS_TEXT_BASE           0x81080000
> diff --git a/include/configs/da850evm.h b/include/configs/da850evm.h
> index 989472b..e027fe7 100644
> --- a/include/configs/da850evm.h
> +++ b/include/configs/da850evm.h
> @@ -315,20 +315,23 @@
>
>  /* defines for SPL */
>  #define CONFIG_SPL
> +#define CONFIG_SPL_LDSCRIPT
>  "board/$(BOARDDIR)/u-boot-spl-da850evm.lds"
> +#define CONFIG_SPL_STACK               0x8001ff00
> +#define CONFIG_SPL_TEXT_BASE           0x80000000
> +#define CONFIG_SYS_SPL_MALLOC_START    (CONFIG_SYS_TEXT_BASE -
> CONFIG_SYS_MALLOC_LEN)
> +#define CONFIG_SYS_SPL_MALLOC_SIZE     CONFIG_SYS_MALLOC_LEN
> +#define CONFIG_SPL_MAX_SIZE            32768
> +#define CONFIG_SPL_LIBCOMMON_SUPPORT
> +#define CONFIG_SPL_LIBGENERIC_SUPPORT
>  #define CONFIG_SPL_SPI_SUPPORT
>  #define CONFIG_SPL_SPI_FLASH_SUPPORT
> -#define CONFIG_SPL_SPI_LOAD
>  #define CONFIG_SPL_SPI_BUS 0
>  #define CONFIG_SPL_SPI_CS 0
> -#define CONFIG_SPL_SERIAL_SUPPORT
> -#define CONFIG_SPL_LIBCOMMON_SUPPORT
> -#define CONFIG_SPL_LIBGENERIC_SUPPORT
> -#define CONFIG_SPL_LDSCRIPT    "board/$(BOARDDIR)/u-boot-spl-da850evm.lds"
> -#define CONFIG_SPL_STACK       0x8001ff00
> -#define CONFIG_SPL_TEXT_BASE   0x80000000
> -#define CONFIG_SPL_MAX_SIZE    32768
>  #define CONFIG_SYS_SPI_U_BOOT_OFFS     0x8000
>  #define CONFIG_SYS_SPI_U_BOOT_SIZE     0x30000
> +#define CONFIG_SPL_SERIAL_SUPPORT
> +#define CONFIG_SPL_YMODEM_SUPPORT
> +
>
>  /* additions for new relocation code, must added to all boards */
>  #define CONFIG_SYS_SDRAM_BASE          0xc0000000
> diff --git a/include/configs/hawkboard.h b/include/configs/hawkboard.h
> index 6d2d4fb..a3b8d5d 100644
> --- a/include/configs/hawkboard.h
> +++ b/include/configs/hawkboard.h
> @@ -59,14 +59,15 @@
>
>  /* Spl */
>  #define CONFIG_SPL
> -#define CONFIG_SPL_NAND_SUPPORT
> -#define CONFIG_SPL_NAND_SIMPLE
> -#define CONFIG_SPL_NAND_LOAD
> -#define CONFIG_SPL_LIBGENERIC_SUPPORT  /* for udelay and __div64_32 for
> NAND */
> -#define CONFIG_SPL_SERIAL_SUPPORT
>  #define CONFIG_SPL_LDSCRIPT
>  "board/$(BOARDDIR)/u-boot-spl-hawk.lds"
>  #define CONFIG_SPL_TEXT_BASE           0xc1080000
>  #define CONFIG_SPL_STACK               CONFIG_SYS_INIT_SP_ADDR
> +#define CONFIG_SYS_SPL_MALLOC_START    (CONFIG_SYS_TEXT_BASE -
> CONFIG_SYS_MALLOC_LEN)
> +#define CONFIG_SYS_SPL_MALLOC_SIZE     CONFIG_SYS_MALLOC_LEN
> +#define CONFIG_SPL_LIBGENERIC_SUPPORT  /* for udelay and __div64_32 for
> NAND */
> +#define CONFIG_SPL_NAND_SUPPORT
> +#define CONFIG_SPL_NAND_SIMPLE
> +#define CONFIG_SPL_SERIAL_SUPPORT
>
>  /*
>  * Memory Info
> --
> 1.7.10
>
> Regards, Christian

> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de <javascript:;>
> http://lists.denx.de/mailman/listinfo/u-boot
>
diff mbox

Patch

diff --git a/arch/arm/cpu/arm926ejs/davinci/Makefile b/arch/arm/cpu/arm926ejs/davinci/Makefile
index da7efac..12bd37a 100644
--- a/arch/arm/cpu/arm926ejs/davinci/Makefile
+++ b/arch/arm/cpu/arm926ejs/davinci/Makefile
@@ -40,6 +40,11 @@  ifdef CONFIG_SPL_BUILD
 COBJS-y	+= spl.o
 COBJS-$(CONFIG_SOC_DM365)	+= dm365_lowlevel.o
 COBJS-$(CONFIG_SOC_DA8XX)	+= da850_lowlevel.o
+
+COBJS-$(CONFIG_SPL_NAND_SUPPORT)	+= spl_nand.o
+COBJS-$(CONFIG_SPL_SPI_FLASH_SUPPORT)	+= spl_spi_flash.o
+COBJS-$(CONFIG_SPL_YMODEM_SUPPORT)	+= spl_ymodem.o
+COBJS-$(CONFIG_SPL_MMC_SUPPORT)		+= spl_mmc.o
 endif
 
 SOBJS	= reset.o
diff --git a/arch/arm/cpu/arm926ejs/davinci/spl.c b/arch/arm/cpu/arm926ejs/davinci/spl.c
index 74632e5..a8c318c 100644
--- a/arch/arm/cpu/arm926ejs/davinci/spl.c
+++ b/arch/arm/cpu/arm926ejs/davinci/spl.c
@@ -25,9 +25,11 @@ 
 #include <asm/utils.h>
 #include <nand.h>
 #include <asm/arch/dm365_lowlevel.h>
+#include <asm/arch/davinci_boot.h>
 #include <ns16550.h>
 #include <malloc.h>
 #include <spi_flash.h>
+#include <linux/compiler.h>
 
 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
 
@@ -72,25 +74,92 @@  void board_init_f(ulong dummy)
 	relocate_code(CONFIG_SPL_STACK, NULL, CONFIG_SPL_TEXT_BASE);
 }
 
+u32 davinci_boot_device(void){
+#ifdef CONFIG_SOC_DA8XX
+	u32 bootmode = ((*((vu_long*)0x01C14020)) & 0x1F);
+	switch(bootmode){
+	case 0x0E:	/* NAND 8  */
+	case 0x10:	/* NAND 16 */
+		return BOOT_DEVICE_NAND;
+	case 0x0A:
+	case 0x0C:
+		return BOOT_DEVICE_SPI_FLASH;
+	case 0x16:	/* UART0 */
+	case 0x17:	/* UART1 */
+	case 0x14:	/* UART2 */
+		return BOOT_DEVICE_UART;
+	case 0x1C:	/* MMC/SD */
+		return BOOT_DEVICE_MMC;
+	default:
+		return BOOT_DEVICE_NONE;
+	}
+#else
+#ifdef
+#endif CONFIG_SPL_NAND_SUPPORT
+	return BOOT_DEVICE_NAND;
+#endif
+#ifdef BOOT_DEVICE_SPI_FLASH
+	return BOOT_DEVICE_SPI_FLASH;
+#endif
+#ifdef CONFIG_SPL_YMODEM_SUPPORT
+	return BOOT_DEVICE_UART;
+#endif
+#ifdef CONFIG_SPL_MMC_SUPPORT
+	return BOOT_DEVICE_MMC;
+#endif
+}
+
 void board_init_r(gd_t *id, ulong dummy)
 {
-#ifdef CONFIG_SPL_NAND_LOAD
-	nand_init();
-	puts("Nand boot...\n");
-	nand_boot();
-#endif
-#ifdef CONFIG_SPL_SPI_LOAD
-	mem_malloc_init(CONFIG_SYS_TEXT_BASE - CONFIG_SYS_MALLOC_LEN,
-			CONFIG_SYS_MALLOC_LEN);
+	u32 boot_device;
+	void (*uboot)(void) __noreturn;
+
+	mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
+			CONFIG_SYS_SPL_MALLOC_SIZE);
 
 	gd = &gdata;
 	gd->bd = &bdata;
 	gd->flags |= GD_FLG_RELOC;
+#ifdef CONFIG_SPL_SERIAL_SUPPORT
 	gd->baudrate = CONFIG_BAUDRATE;
-	serial_init();          /* serial communications setup */
+	serial_init();
 	gd->have_console = 1;
+#endif
 
-	puts("SPI boot...\n");
-	spi_boot();
+	boot_device = davinci_boot_device();
+	debug("boot device - %d\n", boot_device);
+	switch (boot_device) {
+#ifdef CONFIG_SPL_NAND_SUPPORT
+	case BOOT_DEVICE_NAND:
+		puts("Booting from nand flash ...\n");
+		spl_nand_load_image();
+		break;
+#endif
+#ifdef CONFIG_SPL_SPI_FLASH_SUPPORT
+	case BOOT_DEVICE_SPI_FLASH:
+		puts("Booting from spi flash ...\n");
+		spl_spi_flash_load_image();
+		break;
 #endif
+#ifdef CONFIG_SPL_YMODEM_SUPPORT
+	case BOOT_DEVICE_UART:
+		puts("Booting from uart ...\n");
+		spl_ymodem_load_image();
+		break;
+#endif
+#ifdef CONFIG_SPL_MMC_SUPPORT
+	case BOOT_DEVICE_MMC:
+		puts("Booting from mmc/sd card...\n");
+		spl_mmc_load_image();
+		break;
+#endif
+	default:
+		printf("SPL: Un-supported Boot Device - %d!!!\n", boot_device);
+		hang();
+		break;
+	}
+
+	puts("Jump to U-Boot image...\n");
+	uboot = (void *) CONFIG_SYS_TEXT_BASE;
+	(*uboot)();
 }
diff --git a/arch/arm/cpu/arm926ejs/davinci/spl_mmc.c b/arch/arm/cpu/arm926ejs/davinci/spl_mmc.c
new file mode 100644
index 0000000..520ecd1
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/davinci/spl_mmc.c
@@ -0,0 +1,37 @@ 
+#include <common.h>
+#include <asm/u-boot.h>
+#include <asm/utils.h>
+#include <mmc.h>
+#include <asm/arch/sdmmc_defs.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void spl_mmc_load_image(void)
+{
+	int ret;
+	struct mmc *mmc;
+
+	mmc_initialize(gd->bd);
+	/* We register only one device. So, the dev id is always 0 */
+	mmc = find_mmc_device(0);
+	if (!mmc) {
+		puts("spl: mmc device not found!!\n");
+		hang();
+	}
+
+	ret = mmc_init(mmc);
+	if (ret) {
+		printf("spl: mmc init failed: err - %d\n", ret);
+		hang();
+	}
+
+	ret = mmc->block_dev.block_read(0, CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR,
+	                                CONFIG_SYS_U_BOOT_MAX_SIZE_SECTORS,
+	                                (void *) CONFIG_SYS_TEXT_BASE);
+	if (ret < 0) {
+		printf("spl: mmc blk read err - %d\n", ret);
+		hang();
+	}
+
+	debug("Loaded %d sectors from SD/MMC card\n", CONFIG_SYS_U_BOOT_MAX_SIZE_SECTORS);
+}
diff --git a/arch/arm/cpu/arm926ejs/davinci/spl_nand.c b/arch/arm/cpu/arm926ejs/davinci/spl_nand.c
new file mode 100644
index 0000000..bad1e8f
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/davinci/spl_nand.c
@@ -0,0 +1,11 @@ 
+#include <common.h>
+#include <nand.h>
+
+void spl_nand_load_image(void)
+{
+	nand_init();
+	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
+			CONFIG_SYS_NAND_U_BOOT_SIZE,
+			(void *) CONFIG_SYS_TEXT_BASE);
+	debug("Loaded %d bytes from NAND flash\n", CONFIG_SYS_NAND_U_BOOT_SIZE);
+}
diff --git a/arch/arm/cpu/arm926ejs/davinci/spl_spi_flash.c b/arch/arm/cpu/arm926ejs/davinci/spl_spi_flash.c
new file mode 100644
index 0000000..2d5b045
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/davinci/spl_spi_flash.c
@@ -0,0 +1,25 @@ 
+#include <common.h>
+#include <spi_flash.h>
+
+void spl_spi_flash_load_image(void)
+{
+	int ret;
+	struct spi_flash *flash;
+
+	flash = spi_flash_probe(CONFIG_SPL_SPI_BUS, CONFIG_SPL_SPI_CS,
+				CONFIG_SF_DEFAULT_SPEED, SPI_MODE_3);
+	if (!flash) {
+		puts("spl: spi flash probe failed.\n");
+		hang();
+	}
+
+	ret = spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS,
+		             CONFIG_SYS_SPI_U_BOOT_SIZE,
+		             (void *) CONFIG_SYS_TEXT_BASE);
+	if (ret < 0) {
+		printf("spl: spi flash read err - %d\n", ret);
+		hang();
+	}
+
+	debug("Loaded %d bytes from SPI flash\n", CONFIG_SYS_SPI_U_BOOT_SIZE);
+}
diff --git a/arch/arm/cpu/arm926ejs/davinci/spl_ymodem.c b/arch/arm/cpu/arm926ejs/davinci/spl_ymodem.c
new file mode 100644
index 0000000..be6786b
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/davinci/spl_ymodem.c
@@ -0,0 +1,41 @@ 
+#include <common.h>
+#include <xyzModem.h>
+#include <asm/u-boot.h>
+#include <asm/utils.h>
+
+#define BUF_SIZE 1024
+
+static int getcymodem(void) {
+	if (tstc())
+		return (getc());
+	return -1;
+}
+
+void spl_ymodem_load_image(void)
+{
+	int size;
+	int err;
+	int res;
+	connection_info_t info;
+	ulong store_addr = ~0;
+
+	size = 0;
+	info.mode = xyzModem_ymodem;
+	res = xyzModem_stream_open (&info, &err);
+	if (!res) {
+		store_addr = CONFIG_SYS_TEXT_BASE;
+		while ((res =
+			xyzModem_stream_read ((char*)store_addr, 1024, &err)) > 0) {
+			store_addr += res;
+			size += res;
+		}
+	} else {
+		printf("spl: ymodem err - %s\n", xyzModem_error(err));
+		hang();
+	}
+
+	xyzModem_stream_close (&err);
+	xyzModem_stream_terminate (false, &getcymodem);
+
+	debug("Loaded %d bytes from UART\n", size);
+}
diff --git a/arch/arm/include/asm/arch-davinci/davinci_boot.h b/arch/arm/include/asm/arch-davinci/davinci_boot.h
new file mode 100644
index 0000000..5d553ee
--- /dev/null
+++ b/arch/arm/include/asm/arch-davinci/davinci_boot.h
@@ -0,0 +1,25 @@ 
+#ifndef	_DAVINCI_BOOT_H_
+#define	_DAVINCI_BOOT_H_
+
+/* Boot device */
+#define BOOT_DEVICE_NONE        0
+#define BOOT_DEVICE_NAND        1
+#define BOOT_DEVICE_SPI_FLASH   2
+#define BOOT_DEVICE_UART        3
+#define BOOT_DEVICE_MMC         4
+
+u32 davinci_boot_device(void);
+
+/* NAND SPL functions */
+void spl_nand_load_image(void);
+
+/* SPI FLASH SPL functions */
+void spl_spi_flash_load_image(void);
+
+/* YMODEM SPL functions */
+void spl_ymodem_load_image(void);
+
+/* MMC SPL functions */
+void spl_mmc_load_image(void);
+
+#endif /* _DAVINCI_BOOT_H_ */
diff --git a/include/configs/cam_enc_4xx.h b/include/configs/cam_enc_4xx.h
index 71faf1c..58dde89 100644
--- a/include/configs/cam_enc_4xx.h
+++ b/include/configs/cam_enc_4xx.h
@@ -219,18 +219,18 @@ 
 
 /* Defines for SPL */
 #define CONFIG_SPL
+#define CONFIG_SPL_LDSCRIPT		"$(BOARDDIR)/u-boot-spl.lds"
+#define CONFIG_SPL_STACK		(0x00010000 + 0x7f00)
+#define CONFIG_SPL_TEXT_BASE		0x00000020 /*CONFIG_SYS_SRAM_START*/
+#define CONFIG_SYS_SPL_MALLOC_START	(CONFIG_SYS_TEXT_BASE - CONFIG_SYS_MALLOC_LEN)
+#define CONFIG_SYS_SPL_MALLOC_SIZE	CONFIG_SYS_MALLOC_LEN
+#define CONFIG_SPL_MAX_SIZE		12320
 #define CONFIG_SPL_LIBGENERIC_SUPPORT
 #define CONFIG_SPL_NAND_SUPPORT
 #define CONFIG_SPL_NAND_SIMPLE
-#define CONFIG_SPL_NAND_LOAD
 #define CONFIG_SYS_NAND_HW_ECC_OOBFIRST
 #define CONFIG_SPL_SERIAL_SUPPORT
 #define CONFIG_SPL_POST_MEM_SUPPORT
-#define CONFIG_SPL_LDSCRIPT		"$(BOARDDIR)/u-boot-spl.lds"
-#define CONFIG_SPL_STACK		(0x00010000 + 0x7f00)
-
-#define CONFIG_SPL_TEXT_BASE		0x00000020 /*CONFIG_SYS_SRAM_START*/
-#define CONFIG_SPL_MAX_SIZE		12320
 
 #ifndef CONFIG_SPL_BUILD
 #define CONFIG_SYS_TEXT_BASE		0x81080000
diff --git a/include/configs/da850evm.h b/include/configs/da850evm.h
index 989472b..e027fe7 100644
--- a/include/configs/da850evm.h
+++ b/include/configs/da850evm.h
@@ -315,20 +315,23 @@ 
 
 /* defines for SPL */
 #define CONFIG_SPL
+#define CONFIG_SPL_LDSCRIPT		"board/$(BOARDDIR)/u-boot-spl-da850evm.lds"
+#define CONFIG_SPL_STACK		0x8001ff00
+#define CONFIG_SPL_TEXT_BASE		0x80000000
+#define CONFIG_SYS_SPL_MALLOC_START	(CONFIG_SYS_TEXT_BASE - CONFIG_SYS_MALLOC_LEN)
+#define CONFIG_SYS_SPL_MALLOC_SIZE	CONFIG_SYS_MALLOC_LEN
+#define CONFIG_SPL_MAX_SIZE		32768
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
 #define CONFIG_SPL_SPI_SUPPORT
 #define CONFIG_SPL_SPI_FLASH_SUPPORT
-#define CONFIG_SPL_SPI_LOAD
 #define CONFIG_SPL_SPI_BUS 0
 #define CONFIG_SPL_SPI_CS 0
-#define CONFIG_SPL_SERIAL_SUPPORT
-#define CONFIG_SPL_LIBCOMMON_SUPPORT
-#define CONFIG_SPL_LIBGENERIC_SUPPORT
-#define CONFIG_SPL_LDSCRIPT	"board/$(BOARDDIR)/u-boot-spl-da850evm.lds"
-#define CONFIG_SPL_STACK	0x8001ff00
-#define CONFIG_SPL_TEXT_BASE	0x80000000
-#define CONFIG_SPL_MAX_SIZE	32768
 #define CONFIG_SYS_SPI_U_BOOT_OFFS	0x8000
 #define CONFIG_SYS_SPI_U_BOOT_SIZE	0x30000
+#define CONFIG_SPL_SERIAL_SUPPORT
+#define CONFIG_SPL_YMODEM_SUPPORT
+
 
 /* additions for new relocation code, must added to all boards */
 #define CONFIG_SYS_SDRAM_BASE		0xc0000000
diff --git a/include/configs/hawkboard.h b/include/configs/hawkboard.h
index 6d2d4fb..a3b8d5d 100644
--- a/include/configs/hawkboard.h
+++ b/include/configs/hawkboard.h
@@ -59,14 +59,15 @@ 
 
 /* Spl */
 #define CONFIG_SPL
-#define CONFIG_SPL_NAND_SUPPORT
-#define CONFIG_SPL_NAND_SIMPLE
-#define CONFIG_SPL_NAND_LOAD
-#define CONFIG_SPL_LIBGENERIC_SUPPORT	/* for udelay and __div64_32 for NAND */
-#define CONFIG_SPL_SERIAL_SUPPORT
 #define CONFIG_SPL_LDSCRIPT		"board/$(BOARDDIR)/u-boot-spl-hawk.lds"
 #define CONFIG_SPL_TEXT_BASE		0xc1080000
 #define CONFIG_SPL_STACK		CONFIG_SYS_INIT_SP_ADDR
+#define CONFIG_SYS_SPL_MALLOC_START	(CONFIG_SYS_TEXT_BASE - CONFIG_SYS_MALLOC_LEN)
+#define CONFIG_SYS_SPL_MALLOC_SIZE	CONFIG_SYS_MALLOC_LEN
+#define CONFIG_SPL_LIBGENERIC_SUPPORT	/* for udelay and __div64_32 for NAND */
+#define CONFIG_SPL_NAND_SUPPORT
+#define CONFIG_SPL_NAND_SIMPLE
+#define CONFIG_SPL_SERIAL_SUPPORT
 
 /*
  * Memory Info