This patch allow us to have a universal spl that detects a boot
device and select a corresponding boot algorithm for main u-boot part
(SOC_DA8XX only)

This patch create copy copy of drivers/mtd/nand/nand_spl_load.c and
drivers/mtd/spi/spi_spl_load.c for the following reasons:
 * avoid jump to main u-boot code just after its loading (required
   for the next patch: spl - add compressed u-boot image support)
 * makes a structure similar to omap3 sources

Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevets...@gmail.com>
---
Change for v3:
 * split MMC+SPL+no partition table support bugfix to separate patch
   series (series 3/3)
Change for v2:
 * fix checkpatch warnings
 * defines for constants
 * use readl() to read a BOOTCFG_REG
 * improve patch description
---
 arch/arm/cpu/arm926ejs/davinci/Makefile          |    5 ++
 arch/arm/cpu/arm926ejs/davinci/spl.c             |   91 +++++++++++++++++++---
 arch/arm/cpu/arm926ejs/davinci/spl_mmc.c         |   39 ++++++++++
 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      |   42 ++++++++++
 arch/arm/include/asm/arch-davinci/davinci_boot.h |   50 ++++++++++++
 include/configs/cam_enc_4xx.h                    |   12 +--
 include/configs/da850evm.h                       |   19 +++--
 include/configs/hawkboard.h                      |   11 +--
 10 files changed, 275 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..50b4bbc 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 = readl(BOOTCFG_REG) & BOOTCFG_REG_DEVICE_MASK;
+       switch (bootmode) {
+       case BOOTCFG_DEVICE_NAND8:
+       case BOOTCFG_DEVICE_NAND16:
+               return BOOT_DEVICE_TYPE_NAND;
+       case BOOTCFG_DEVICE_SPI0_FLASH:
+       case BOOTCFG_DEVICE_SPI1_FLASH:
+               return BOOT_DEVICE_TYPE_SPI_FLASH;
+       case BOOTCFG_DEVICE_UART0:
+       case BOOTCFG_DEVICE_UART1:
+       case BOOTCFG_DEVICE_UART2:
+               return BOOT_DEVICE_TYPE_UART;
+       case BOOTCFG_DEVICE_MMC_OR_SD0:
+               return BOOT_DEVICE_TYPE_MMC;
+       default:
+               return BOOT_DEVICE_TYPE_NONE;
+       }
+#else
+#ifdef
+#endif CONFIG_SPL_NAND_SUPPORT
+       return BOOT_DEVICE_TYPE_NAND;
+#endif
+#ifdef BOOT_DEVICE_SPI_FLASH
+       return BOOT_DEVICE_TYPE_SPI_FLASH;
+#endif
+#ifdef CONFIG_SPL_YMODEM_SUPPORT
+       return BOOT_DEVICE_TYPE_UART;
+#endif
+#ifdef CONFIG_SPL_MMC_SUPPORT
+       return BOOT_DEVICE_TYPE_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_TYPE_NAND:
+               puts("Booting from nand flash ...\n");
+               spl_nand_load_image();
+               break;
+#endif
+#ifdef CONFIG_SPL_SPI_FLASH_SUPPORT
+       case BOOT_DEVICE_TYPE_SPI_FLASH:
+               puts("Booting from spi flash ...\n");
+               spl_spi_flash_load_image();
+               break;
 #endif
+#ifdef CONFIG_SPL_YMODEM_SUPPORT
+       case BOOT_DEVICE_TYPE_UART:
+               puts("Booting from uart ...\n");
+               spl_ymodem_load_image();
+               break;
+#endif
+#ifdef CONFIG_SPL_MMC_SUPPORT
+       case BOOT_DEVICE_TYPE_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..1a551e9
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/davinci/spl_mmc.c
@@ -0,0 +1,39 @@
+#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..d6fadcd
--- /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..b8c4db1
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/davinci/spl_ymodem.c
@@ -0,0 +1,42 @@
+#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..57afa24
--- /dev/null
+++ b/arch/arm/include/asm/arch-davinci/davinci_boot.h
@@ -0,0 +1,50 @@
+#ifndef        _DAVINCI_BOOT_H_
+#define        _DAVINCI_BOOT_H_
+
+#include <asm/arch/hardware.h>
+
+#define BOOTCFG_REG                    (DAVINCI_BOOTCFG_BASE + 0x20)
+#define BOOTCFG_REG_DEVICE_MASK                0x1F
+
+#define BOOTCFG_DEVICE_NOR             0x02
+#define BOOTCFG_DEVICE_NAND8           0x0E
+#define BOOTCFG_DEVICE_NAND16          0x10
+#define BOOTCFG_DEVICE_MMC_OR_SD0      0x1C
+#define BOOTCFG_DEVICE_I2C0_EEPROM     0x00
+#define BOOTCFG_DEVICE_I2C1_EEPROM     0x06
+#define BOOTCFG_DEVICE_I2C0_SLAVE      0x01
+#define BOOTCFG_DEVICE_I2C1_SLAVE      0x07
+#define BOOTCFG_DEVICE_SPI0_EEPROM     0x08
+#define BOOTCFG_DEVICE_SPI1_EEPROM     0x09
+#define BOOTCFG_DEVICE_SPI0_FLASH      0x0A
+#define BOOTCFG_DEVICE_SPI1_FLASH      0x0C
+#define BOOTCFG_DEVICE_SPI0_SLAVE      0x12
+#define BOOTCFG_DEVICE_SPI1_SLAVE      0x13
+#define BOOTCFG_DEVICE_UART0           0x16
+#define BOOTCFG_DEVICE_UART1           0x17
+#define BOOTCFG_DEVICE_UART2           0x14
+#define BOOTCFG_DEVICE_HPI             0x04
+#define BOOTCFG_DEVICE_EMULATION_DEBUG 0x1E
+
+/* Boot device */
+#define BOOT_DEVICE_TYPE_NONE          0
+#define BOOT_DEVICE_TYPE_NAND          1
+#define BOOT_DEVICE_TYPE_SPI_FLASH     2
+#define BOOT_DEVICE_TYPE_UART          3
+#define BOOT_DEVICE_TYPE_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 771ac9c..590f3f8 100644
--- a/include/configs/cam_enc_4xx.h
+++ b/include/configs/cam_enc_4xx.h
@@ -217,18 +217,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 e6adb1f..7a3ec4c 100644
--- a/include/configs/da850evm.h
+++ b/include/configs/da850evm.h
@@ -313,20 +313,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 c6e8859..133fdfb 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.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to