1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
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__ */
|