OpenWrt – Rev 4

Subversion Repositories:
Rev:
From e17398316e82d8b28217232b4fd6030c65138e74 Mon Sep 17 00:00:00 2001
From: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Date: Mon, 12 Aug 2013 01:18:00 +0200
Subject: MIPS: lantiq: add NAND SPL support

Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>

--- a/arch/mips/cpu/mips32/lantiq-common/spl.c
+++ b/arch/mips/cpu/mips32/lantiq-common/spl.c
@@ -8,6 +8,7 @@
 #include <image.h>
 #include <version.h>
 #include <spi_flash.h>
+#include <nand.h>
 #include <linux/compiler.h>
 #include <lzma/LzmaDec.h>
 #include <linux/lzo.h>
@@ -63,6 +64,18 @@
 #define spl_boot_nor_flash     0
 #endif
 
+#if defined(CONFIG_LTQ_SUPPORT_SPL_NAND_FLASH) && defined(CONFIG_SYS_BOOT_NANDSPL)
+#define spl_boot_nand_flash    1
+#else
+#define spl_boot_nand_flash    0
+#ifndef CONFIG_SYS_NAND_U_BOOT_OFFS
+#define CONFIG_SYS_NAND_U_BOOT_OFFS    0
+#endif
+#ifndef CONFIG_SYS_NAND_PAGE_SIZE
+#define CONFIG_SYS_NAND_PAGE_SIZE      0
+#endif
+#endif
+
 #define spl_sync()     __asm__ __volatile__("sync");
 
 struct spl_image {
@@ -337,6 +350,58 @@ static int spl_load_nor_flash(struct spl
        return ret;
 }
 
+static int spl_load_nand_flash(struct spl_image *spl)
+{
+       image_header_t *hdr;
+       int ret;
+       unsigned long loadaddr;
+
+       /*
+        * Image format:
+        *
+        * - 12 byte non-volatile bootstrap header
+        * - SPL binary
+        * - 12 byte non-volatile bootstrap header
+        * - padding bytes up to CONFIG_SYS_NAND_U_BOOT_OFFS
+        * - 64 byte U-Boot mkimage header
+        * - U-Boot binary
+        */
+       spl->data_addr = CONFIG_SYS_NAND_U_BOOT_OFFS;
+
+       spl_puts("SPL: initializing NAND flash\n");
+       nand_init();
+
+       spl_debug("SPL: reading image header at page offset %lx\n",
+                 spl->data_addr);
+
+       hdr = (image_header_t *) CONFIG_LOADADDR;
+       ret = nand_spl_load_image(spl->data_addr,
+                                 CONFIG_SYS_NAND_PAGE_SIZE, hdr);
+       if (ret)
+               return ret;
+
+       spl_debug("SPL: checking image header at address %p\n", hdr);
+
+       ret = spl_parse_image(hdr, spl);
+       if (ret)
+               return ret;
+
+       if (spl_is_compressed(spl))
+               loadaddr = CONFIG_LOADADDR;
+       else
+               loadaddr = spl->entry_addr;
+
+       spl_puts("SPL: loading U-Boot to RAM\n");
+
+       ret = nand_spl_load_image(spl->data_addr, spl->data_size,
+                                 (void *) loadaddr);
+
+       if (spl_is_compressed(spl))
+               ret = spl_uncompress(spl, loadaddr);
+
+       return ret;
+}
+
 static int spl_load(struct spl_image *spl)
 {
        int ret;
@@ -345,6 +410,8 @@ static int spl_load(struct spl_image *sp
                ret = spl_load_spi_flash(spl);
        else if (spl_boot_nor_flash)
                ret = spl_load_nor_flash(spl);
+       else if (spl_boot_nand_flash)
+               ret = spl_load_nand_flash(spl);
        else
                ret = 1;
 
--- a/arch/mips/include/asm/lantiq/config.h
+++ b/arch/mips/include/asm/lantiq/config.h
@@ -40,6 +40,26 @@
 #define CONFIG_SPI_SPL_SIMPLE
 #endif
 
+/*
+ * NAND flash SPL
+ * BOOT CFG 06 only (address cycle based probing, 2KB or 512B page size)
+ */
+#if defined(CONFIG_LTQ_SUPPORT_SPL_NAND_FLASH) && defined(CONFIG_SYS_BOOT_NANDSPL)
+#define CONFIG_SPL
+#define CONFIG_SPL_NAND_SUPPORT
+#define CONFIG_SPL_NAND_DRIVERS
+#define CONFIG_SPL_NAND_SIMPLE
+#define CONFIG_SPL_NAND_ECC
+
+/* use software ECC until driver supports HW ECC */
+#define CONFIG_SPL_NAND_SOFTECC
+#define CONFIG_SYS_NAND_ECCSIZE                256
+#define CONFIG_SYS_NAND_ECCBYTES       3
+#define CONFIG_SYS_NAND_ECCPOS         {40, 41, 42, 43, 44, 45, 46, 47, \
+                                       48, 49, 50, 51, 52, 53, 54, 55, \
+                                       56, 57, 58, 59, 60, 61, 62, 63}
+#endif
+
 #if defined(CONFIG_LTQ_SUPPORT_SPL_NOR_FLASH) && defined(CONFIG_SYS_BOOT_NORSPL)
 #define CONFIG_SPL
 #endif
@@ -148,6 +168,21 @@
 #define CONFIG_ENV_LOAD_UBOOT_SF
 #endif
 
+#if defined(CONFIG_LTQ_SUPPORT_NAND_FLASH)
+#define CONFIG_ENV_WRITE_UBOOT_NAND                            \
+       "write-uboot-nand="                                     \
+       "nand erase 0 $filesize && "                            \
+       "nand write $fileaddr 0 $filesize\0"
+
+#define CONFIG_ENV_LOAD_UBOOT_NAND                                             \
+       "load-uboot-nandspl=tftpboot u-boot.ltq.nandspl\0"                      \
+       "load-uboot-nandspl-lzo=tftpboot u-boot.ltq.lzo.nandspl\0"              \
+       "load-uboot-nandspl-lzma=tftpboot u-boot.ltq.lzma.nandspl\0"
+#else
+#define CONFIG_ENV_WRITE_UBOOT_NAND
+#define CONFIG_ENV_LOAD_UBOOT_NAND
+#endif
+
 #define CONFIG_ENV_LANTIQ_DEFAULTS     \
        CONFIG_ENV_CONSOLEDEV           \
        CONFIG_ENV_ADDCONSOLE           \
@@ -159,6 +194,8 @@
        CONFIG_ENV_LOAD_UBOOT_NOR       \
        CONFIG_ENV_SF_PROBE             \
        CONFIG_ENV_WRITE_UBOOT_SF       \
-       CONFIG_ENV_LOAD_UBOOT_SF
+       CONFIG_ENV_LOAD_UBOOT_SF        \
+       CONFIG_ENV_WRITE_UBOOT_NAND     \
+       CONFIG_ENV_LOAD_UBOOT_NAND
 
 #endif /* __LANTIQ_CONFIG_H__ */