All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 0/5] nand: sunxi: Add SPL support for booting from NAND.
@ 2015-04-29 15:02 Daniel Kochmański
  2015-04-29 15:02 ` [U-Boot] [PATCH 1/5] nand: sunxi: change BLOCK_SIZE in mksunxiboot to match NAND block size Daniel Kochmański
                   ` (4 more replies)
  0 siblings, 5 replies; 26+ messages in thread
From: Daniel Kochmański @ 2015-04-29 15:02 UTC (permalink / raw)
  To: u-boot

This patchset adds minimal SPL driver for reading from A20 nand
partitions utilizing DMA controller.  It supports randomization and
syndrome partitions.

Since BROM reads second syndrome partition, if first SPL checksum
doesn't match, additional U-Boot offset may be provided to load backup
U-boot from second block of second page.

To simplify loading many files (devicetree, kernel, sourcable boot
script) additional parameter is added, which allows preloading
multiboot image into memory directly from SPL.

Additionally conveniance function a20_nandread has been added, which
utilizes SPL driver on normal U-Boot.

Best regards,
Daniel Kochma?ski

Daniel Kochma?ski (5):
  nand: sunxi: change BLOCK_SIZE in mksunxiboot to match NAND block size
  nand: sunxi: Add support for booting from internal NAND memory
  nand: sunxi: Add secondary U-Boot offset on second syndrome partition
  nand: sunxi: Add multiimage preload option
  nand: sunxi: And a20_nandread command utilizing spl nand read driver

 README                           |  10 ++
 arch/arm/cpu/armv7/sunxi/board.c |  12 ++-
 board/sunxi/Kconfig              |  12 +++
 board/sunxi/Makefile             |   1 +
 board/sunxi/nand.c               | 219 +++++++++++++++++++++++++++++++++++++++
 common/Kconfig                   |   7 ++
 common/Makefile                  |   1 +
 common/cmd_a20_nandread.c        |  27 +++++
 common/spl/spl_nand.c            |  51 +++++++--
 include/configs/sunxi-common.h   |  12 +++
 tools/mksunxiboot.c              |   2 +-
 11 files changed, 344 insertions(+), 10 deletions(-)
 create mode 100644 board/sunxi/nand.c
 create mode 100644 common/cmd_a20_nandread.c

-- 
2.3.6

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 1/5] nand: sunxi: change BLOCK_SIZE in mksunxiboot to match NAND block size
  2015-04-29 15:02 [U-Boot] [PATCH 0/5] nand: sunxi: Add SPL support for booting from NAND Daniel Kochmański
@ 2015-04-29 15:02 ` Daniel Kochmański
  2015-05-02 14:08   ` Ian Campbell
  2015-04-29 15:02 ` [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory Daniel Kochmański
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 26+ messages in thread
From: Daniel Kochmański @ 2015-04-29 15:02 UTC (permalink / raw)
  To: u-boot

This change is necessary to calculate correct checksum for NAND
boot. Works both for MMC and NAND. Without it BROM rejects boot image
as invalid (bad checksum). (Changes block size from 0x200 to 0x2000).

Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
Cc: Ian Campbell <ijc@hellion.org.uk>
Cc: Hans De Goede <hdegoede@redhat.com>
---

 tools/mksunxiboot.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/mksunxiboot.c b/tools/mksunxiboot.c
index 0035f6e..bef0c79 100644
--- a/tools/mksunxiboot.c
+++ b/tools/mksunxiboot.c
@@ -65,7 +65,7 @@ int gen_check_sum(struct boot_file_head *head_p)
 
 #define SUN4I_SRAM_SIZE 0x7600	/* 0x7748+ is used by BROM */
 #define SRAM_LOAD_MAX_SIZE (SUN4I_SRAM_SIZE - sizeof(struct boot_file_head))
-#define BLOCK_SIZE 512
+#define BLOCK_SIZE 0x2000
 
 struct boot_img {
 	struct boot_file_head header;
-- 
2.3.6

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory
  2015-04-29 15:02 [U-Boot] [PATCH 0/5] nand: sunxi: Add SPL support for booting from NAND Daniel Kochmański
  2015-04-29 15:02 ` [U-Boot] [PATCH 1/5] nand: sunxi: change BLOCK_SIZE in mksunxiboot to match NAND block size Daniel Kochmański
@ 2015-04-29 15:02 ` Daniel Kochmański
  2015-05-02 14:21   ` Ian Campbell
  2015-05-18 23:47   ` Scott Wood
  2015-04-29 15:02 ` [U-Boot] [PATCH 3/5] nand: sunxi: Add secondary U-Boot offset on second syndrome partition Daniel Kochmański
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 26+ messages in thread
From: Daniel Kochmański @ 2015-04-29 15:02 UTC (permalink / raw)
  To: u-boot

Adds minimal DMA NAND driver for booting from NAND internal
memory. New config option SPL_NAND_SUPPORT is created for sunxi board,
which enables introduced driver and sets ENV_IS_NOWHERE (instead of
ENV_IS_IN_MMC).

NAND driver utilizes DMA interface to flash controller, which supports
randomization. Reading from both syndrome and non-syndrom partitions
is supported. Writing to flash isn't implemented for time being.

Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
Cc: Ian Campbell <ijc@hellion.org.uk>
Cc: Hans De Goede <hdegoede@redhat.com>
---

 arch/arm/cpu/armv7/sunxi/board.c |  12 ++-
 board/sunxi/Kconfig              |  12 +++
 board/sunxi/Makefile             |   1 +
 board/sunxi/nand.c               | 219 +++++++++++++++++++++++++++++++++++++++
 common/spl/spl_nand.c            |  13 +--
 include/configs/sunxi-common.h   |   9 ++
 6 files changed, 258 insertions(+), 8 deletions(-)
 create mode 100644 board/sunxi/nand.c

diff --git a/arch/arm/cpu/armv7/sunxi/board.c b/arch/arm/cpu/armv7/sunxi/board.c
index c1b4cf5..ba81557 100644
--- a/arch/arm/cpu/armv7/sunxi/board.c
+++ b/arch/arm/cpu/armv7/sunxi/board.c
@@ -112,8 +112,10 @@ void s_init(void)
 #ifdef CONFIG_SPL_BUILD
 /* The sunxi internal brom will try to loader external bootloader
  * from mmc0, nand flash, mmc2.
- * Unfortunately we can't check how SPL was loaded so assume
- * it's always the first SD/MMC controller
+ *
+ * Unfortunately we can't check how SPL was loaded so assume it's
+ * always the first SD/MMC controller, unless it was explicitly
+ * stated that SPL is on nand flash.
  */
 u32 spl_boot_device(void)
 {
@@ -123,6 +125,12 @@ u32 spl_boot_device(void)
 	 * enabled build. It has many restrictions and can only boot over USB.
 	 */
 	return BOOT_DEVICE_BOARD;
+#elif defined(CONFIG_SPL_NAND_SUPPORT)
+	/*
+	 * This is compile time configuration informing SPL, that it
+	 * was loaded from nand flash.
+	 */
+	return BOOT_DEVICE_NAND;
 #else
 	/*
 	 * When booting from the SD card, the "eGON.BT0" signature is expected
diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
index 88e3358..1a30684 100644
--- a/board/sunxi/Kconfig
+++ b/board/sunxi/Kconfig
@@ -239,6 +239,18 @@ config MMC_SUNXI_SLOT_EXTRA
 	slot or emmc on mmc1 - mmc3. Setting this to 1, 2 or 3 will enable
 	support for this.
 
+config SPL_NAND_SUPPORT
+	bool "SPL/NAND mode support"
+	depends on SPL
+	default n
+	---help---
+	  This enables support for booting from NAND internal
+	  memory. U-Boot SPL doesn't detect where is it load from,
+	  therefore this option is needed to properly load image from
+	  flash. Option also disables MMC functionality on U-Boot due to
+	  initialization errors encountered, when both controllers are
+	  enabled.
+
 config USB0_VBUS_PIN
 	string "Vbus enable pin for usb0 (otg)"
 	default ""
diff --git a/board/sunxi/Makefile b/board/sunxi/Makefile
index 43766e0..7ad7412 100644
--- a/board/sunxi/Makefile
+++ b/board/sunxi/Makefile
@@ -9,6 +9,7 @@
 # SPDX-License-Identifier:	GPL-2.0+
 #
 obj-y	+= board.o
+obj-$(CONFIG_NAND_SUNXI)	+= nand.o
 obj-$(CONFIG_SUNXI_GMAC)	+= gmac.o
 obj-$(CONFIG_SUNXI_AHCI)	+= ahci.o
 obj-$(CONFIG_MACH_SUN4I)	+= dram_sun4i_auto.o
diff --git a/board/sunxi/nand.c b/board/sunxi/nand.c
new file mode 100644
index 0000000..e449da2
--- /dev/null
+++ b/board/sunxi/nand.c
@@ -0,0 +1,219 @@
+/*
+ * Copyright (c) 2014, Antmicro Ltd <www.antmicro.com>
+ * Copyright (c) 2015, Turtle Solutions <www.turtle-solutions.eu>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <config.h>
+#include <asm/io.h>
+#include <nand.h>
+
+/* minimal "boot0" style NAND support for Allwinner A20 */
+#define W32(a, b) (*(volatile unsigned int *)(a)) = b
+#define R32(a)    (*(volatile unsigned int *)(a))
+
+/* temporary buffer for read of 1024 bytes */
+#ifdef CONFIG_SPL_BUILD
+char temp_buf[0x400] __attribute__((aligned(0x10), section(".text#")));
+#else
+void *temp_buf = 0x0;
+#endif
+
+#define PORTC_BASE			0x01c20800
+#define CCMU_BASE			0x01c20000
+#define NANDFLASHC_BASE		0x01c03000
+#define DMAC_BASE			0x01c02000
+
+#define NANDFLASHC_CTL			0x00000000
+#define NANDFLASHC_ST			0x00000004
+#define NANDFLASHC_INT			0x00000008
+#define NANDFLASHC_TIMING_CTL		0x0000000C
+#define NANDFLASHC_TIMING_CFG		0x00000010
+#define NANDFLASHC_ADDR_LOW		0x00000014
+#define NANDFLASHC_ADDR_HIGH		0x00000018
+#define NANDFLASHC_SECTOR_NUM		0x0000001C
+#define NANDFLASHC_CNT			0x00000020
+#define NANDFLASHC_CMD			0x00000024
+#define NANDFLASHC_RCMD_SET		0x00000028
+#define NANDFLASHC_WCMD_SET		0x0000002C
+#define NANDFLASHC_IO_DATA		0x00000030
+#define NANDFLASHC_ECC_CTL		0x00000034
+#define NANDFLASHC_ECC_ST		0x00000038
+#define NANDFLASHC_DEBUG		0x0000003C
+#define NANDFLASHC_ECC_CNT0		0x00000040
+#define NANDFLASHC_ECC_CNT1		0x00000044
+#define NANDFLASHC_ECC_CNT2		0x00000048
+#define NANDFLASHC_ECC_CNT3		0x0000004C
+#define NANDFLASHC_USER_DATA_BASE	0x00000050
+#define NANDFLASHC_EFNAND_STATUS	0x00000090
+#define NANDFLASHC_SPARE_AREA		0x000000A0
+#define NANDFLASHC_PATTERN_ID		0x000000A4
+#define NANDFLASHC_RAM0_BASE		0x00000400
+#define NANDFLASHC_RAM1_BASE		0x00000800
+
+void nand_set_clocks(void)
+{
+	W32(PORTC_BASE + 0x48, 0x22222222);
+	W32(PORTC_BASE + 0x4C, 0x22222222);
+	W32(PORTC_BASE + 0x50, 0x2222222);
+	W32(PORTC_BASE + 0x54, 0x2);
+	W32(PORTC_BASE + 0x5C, 0x55555555);
+	W32(PORTC_BASE + 0x60, 0x15555);
+	W32(PORTC_BASE + 0x64, 0x5140);
+	W32(PORTC_BASE + 0x68, 0x4016);
+
+	uint32_t val = R32(CCMU_BASE + 0x60);
+	W32(CCMU_BASE + 0x60, 0x2000 | val);
+	val = R32(CCMU_BASE + 0x80);
+	W32(CCMU_BASE + 0x80, val | 0x80000000 | 0x1);
+}
+
+int initialized = 0;
+void nand_init(void)
+{
+	initialized = 1;
+	uint32_t val;
+	nand_set_clocks();
+	val = R32(NANDFLASHC_BASE + 0x00);
+	/* CTL = (1<<0 <-EN    1<<1 RESET) */
+	W32(NANDFLASHC_BASE + 0x00, val | 0x3);	/* enable and reset CTL */
+	do {
+		val = R32(NANDFLASHC_BASE + 0x00);
+		if (val & (1<<1))
+			break;
+	} while (1);
+}
+
+/* random seed */
+const uint16_t random_seed[128] = {
+	0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
+	0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
+	0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
+	0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
+	0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
+	0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
+	0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
+	0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
+	0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
+	0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
+	0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
+	0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
+	0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
+	0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
+	0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
+	0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
+};
+
+uint32_t ecc_errors = 0;
+
+/* read 0x400 bytes from real_addr to temp_buf */
+void nand_read_block(unsigned int real_addr, int syndrome)
+{
+	uint32_t val;
+	if (!initialized)
+		nand_init();
+
+	memset((void *)temp_buf, 0, 0x400); /* clear temp_buf */
+
+	/* set CMD  */
+	W32(NANDFLASHC_BASE + NANDFLASHC_CMD, 0xC000FF);
+	do {
+		val = R32(NANDFLASHC_BASE + NANDFLASHC_ST);
+		if (val & (1<<1))
+			break;
+		udelay(1000);
+	} while (1);
+
+	uint32_t page = real_addr / (8 * 1024);
+	if (page > 0xFFFF) {
+		/* TODO: currently this is not supported */
+		printf("Reading from address >= %08X is not allowed.\n",
+		       0xFFFF * 8 * 1024);
+		return;
+	}
+
+	uint32_t shift = real_addr % (8*1024);
+	W32(0x1C03038, 0);
+
+	/* ECC_CTL, randomization */
+	if (syndrome) {
+		W32(0x1C03034, (0x4A80<<16) | 0x0200 | 1 | (1<<3) | (1<<12));
+		/* shift every 1kB in syndrome */
+		shift += (shift / 0x400) * 0x2e;
+
+	} else {
+		W32(0x1C03034, ((random_seed[page % 128]<<16) |
+				0x0200 | 1 | (1<<3) | (1<<12)));
+	}
+
+	uint32_t addr = (page << 16) | shift;
+	val = R32(NANDFLASHC_BASE + NANDFLASHC_CTL);
+	W32(NANDFLASHC_BASE + NANDFLASHC_CTL, val | (1<<14));
+
+	if (syndrome) {
+		W32(NANDFLASHC_BASE + NANDFLASHC_SPARE_AREA, 0x400);
+	} else {
+		uint32_t oob_offset = 0x2000  + (shift / 0x400) * 0x2e;
+		W32(NANDFLASHC_BASE + NANDFLASHC_SPARE_AREA, oob_offset);
+	}
+
+	/* DMAC */
+	W32(DMAC_BASE + 0x300, 0x0); /* clear dma cmd */
+	/* read from REG_IO_DATA */
+	W32(DMAC_BASE + 0x304, NANDFLASHC_BASE + NANDFLASHC_IO_DATA);
+	W32(DMAC_BASE + 0x308, (uint32_t)temp_buf); /* read to RAM */
+	W32(DMAC_BASE + 0x318, 0x7F0F);
+	W32(DMAC_BASE + 0x30C, 0x400); /* 1kB */
+	W32(DMAC_BASE + 0x300, 0x84000423);
+
+	W32(NANDFLASHC_BASE + NANDFLASHC_RCMD_SET, 0x00E00530);
+	W32(NANDFLASHC_BASE + NANDFLASHC_SECTOR_NUM, 1);
+	W32(NANDFLASHC_BASE + NANDFLASHC_ADDR_LOW, addr);
+	W32(NANDFLASHC_BASE + NANDFLASHC_ADDR_HIGH, 0);
+
+	/* CMD (PAGE READ) */
+	W32(NANDFLASHC_BASE + NANDFLASHC_CMD, 0x85EC0000
+	    | (syndrome ? 0x02000000 : 0x0));
+	do {			/* wait for dma irq */
+		val = R32(NANDFLASHC_BASE + NANDFLASHC_ST);
+		if (val & (1<<2))
+			break;
+		udelay(1000);
+	} while (1);
+
+	do {			/* make sure cmd is finished */
+		val = R32(DMAC_BASE + 300);
+		if (!(val & 0x80000000))
+			break;
+		udelay(1000);
+	} while (1);
+
+	if (R32(NANDFLASHC_BASE | NANDFLASHC_ECC_ST))
+		ecc_errors++;
+}
+
+int helper_load(uint32_t offs, unsigned int size, void *dest)
+{
+	uint32_t dst;
+	uint32_t adr = offs;
+	memset((void *)dest, 0x0, size); /* clean destination memory */
+	ecc_errors = 0;
+	for (dst = (uint32_t)dest; dst < ((uint32_t)dest+size); dst += 0x400) {
+		/* if < 0x400000 then syndrome read */
+		nand_read_block(adr, adr < 0x400000);
+		memcpy((void *)dst, (void *)temp_buf, 0x400);
+		adr += 0x400;
+	}
+	return ecc_errors;
+}
+
+int nand_spl_load_image(uint32_t offs, unsigned int size, void *dest)
+{
+	helper_load(offs, size, dest);
+	return 0;
+}
+
+void nand_deselect(void)
+{}
diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
index b8c369d..9d59fbb 100644
--- a/common/spl/spl_nand.c
+++ b/common/spl/spl_nand.c
@@ -74,24 +74,25 @@ void spl_nand_load_image(void)
 #endif
 #ifdef CONFIG_NAND_ENV_DST
 	nand_spl_load_image(CONFIG_ENV_OFFSET,
-		sizeof(*header), (void *)header);
+			    sizeof(*header), (void *)header);
 	spl_parse_image_header(header);
 	nand_spl_load_image(CONFIG_ENV_OFFSET, spl_image.size,
-		(void *)spl_image.load_addr);
+			    (void *)spl_image.load_addr);
 #ifdef CONFIG_ENV_OFFSET_REDUND
 	nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND,
-		sizeof(*header), (void *)header);
+			    sizeof(*header), (void *)header);
 	spl_parse_image_header(header);
 	nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, spl_image.size,
-		(void *)spl_image.load_addr);
+			    (void *)spl_image.load_addr);
 #endif
 #endif
 	/* Load u-boot */
 	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
-		sizeof(*header), (void *)header);
+			    sizeof(*header), (void *)header);
 	spl_parse_image_header(header);
 	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
-		spl_image.size, (void *)(unsigned long)spl_image.load_addr);
+			    spl_image.size,
+			    (void *)(unsigned long)spl_image.load_addr);
 	nand_deselect();
 }
 #endif
diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h
index 365d9a5..b40cdd3 100644
--- a/include/configs/sunxi-common.h
+++ b/include/configs/sunxi-common.h
@@ -106,8 +106,10 @@
 #define CONFIG_CMD_MMC
 #define CONFIG_MMC_SUNXI
 #define CONFIG_MMC_SUNXI_SLOT		0
+#if !defined(CONFIG_SPL_NAND_SUPPORT)
 #define CONFIG_ENV_IS_IN_MMC
 #define CONFIG_SYS_MMC_ENV_DEV		0	/* first detected MMC controller */
+#endif /* CONFIG_SPL_NAND_SUPPORT */
 #endif
 
 /* 4MB of malloc() pool */
@@ -323,6 +325,13 @@ extern int soft_i2c_gpio_scl;
 #define CONFIG_ENV_IS_NOWHERE
 #endif
 
+#ifdef CONFIG_SPL_NAND_SUPPORT
+#define CONFIG_NAND
+#define CONFIG_NAND_SUNXI
+#define CONFIG_CMD_SPL_WRITE_SIZE		0x000400
+#define CONFIG_SYS_NAND_U_BOOT_OFFS		0x008000
+#endif /* CONFIG_SPL_NAND_SUPPORT */
+
 #define CONFIG_MISC_INIT_R
 #define CONFIG_SYS_CONSOLE_IS_IN_ENV
 
-- 
2.3.6

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 3/5] nand: sunxi: Add secondary U-Boot offset on second syndrome partition
  2015-04-29 15:02 [U-Boot] [PATCH 0/5] nand: sunxi: Add SPL support for booting from NAND Daniel Kochmański
  2015-04-29 15:02 ` [U-Boot] [PATCH 1/5] nand: sunxi: change BLOCK_SIZE in mksunxiboot to match NAND block size Daniel Kochmański
  2015-04-29 15:02 ` [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory Daniel Kochmański
@ 2015-04-29 15:02 ` Daniel Kochmański
  2015-05-02 14:24   ` Ian Campbell
                     ` (2 more replies)
  2015-04-29 15:03 ` [U-Boot] [PATCH 4/5] nand: sunxi: Add multiimage preload option Daniel Kochmański
  2015-04-29 15:03 ` [U-Boot] [PATCH 5/5] nand: sunxi: And a20_nandread command utilizing spl nand read driver Daniel Kochmański
  4 siblings, 3 replies; 26+ messages in thread
From: Daniel Kochmański @ 2015-04-29 15:02 UTC (permalink / raw)
  To: u-boot

Introduces CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS, pointing to backup
U-Boot instance in nand memory. In case if first header doesn't match,
tries to load bootloader from this offset. In case of both failing,
hang() is called.

Additionally define offset of backup U-boot for sunxi at start of
second syndrome partition.

Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
Cc: Ian Campbell <ijc@hellion.org.uk>
Cc: Hans De Goede <hdegoede@redhat.com>
---

 README                         |  4 ++++
 common/spl/spl_nand.c          | 28 +++++++++++++++++++++++++---
 include/configs/sunxi-common.h |  1 +
 3 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/README b/README
index ee65fdb..4ccf3cb 100644
--- a/README
+++ b/README
@@ -3722,6 +3722,10 @@ FIT uImage format:
 		CONFIG_SYS_NAND_U_BOOT_OFFS
 		Location in NAND to read U-Boot from
 
+		CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS
+		Location in NAND to read backup U-Boot from, if first
+		location doesn't contain valid image.
+
 		CONFIG_SYS_NAND_U_BOOT_DST
 		Location in memory to load U-Boot to
 
diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
index 9d59fbb..7c44de1 100644
--- a/common/spl/spl_nand.c
+++ b/common/spl/spl_nand.c
@@ -2,6 +2,9 @@
  * Copyright (C) 2011
  * Corscience GmbH & Co. KG - Simon Schwarz <schwarz@corscience.de>
  *
+ * Copyright (C) 2015
+ * Turtle Solutions - Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
+ *
  * SPDX-License-Identifier:	GPL-2.0+
  */
 #include <common.h>
@@ -90,9 +93,28 @@ void spl_nand_load_image(void)
 	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
 			    sizeof(*header), (void *)header);
 	spl_parse_image_header(header);
-	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
-			    spl_image.size,
-			    (void *)(unsigned long)spl_image.load_addr);
+	if (header->ih_os == IH_OS_U_BOOT) {
+		nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
+				    spl_image.size,
+				    (void *)(unsigned long)spl_image.load_addr);
+		nand_deselect();
+		return;
+	}
+	puts("U-boot header didn't match.\n");
+#ifdef CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS
+	puts("Trying to start backup u-boot now...\n");
+	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS,
+			    sizeof(*header), (void *)header);
+	spl_parse_image_header(header);
+	if (header->ih_os == IH_OS_U_BOOT) {
+		nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS,
+				    spl_image.size,
+				    (void *)(unsigned long)spl_image.load_addr);
+		nand_deselect();
+		return;
+	}
+#endif
+	puts("No valid u-boot image found.\n");
 	nand_deselect();
 }
 #endif
diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h
index b40cdd3..15fe512 100644
--- a/include/configs/sunxi-common.h
+++ b/include/configs/sunxi-common.h
@@ -330,6 +330,7 @@ extern int soft_i2c_gpio_scl;
 #define CONFIG_NAND_SUNXI
 #define CONFIG_CMD_SPL_WRITE_SIZE		0x000400
 #define CONFIG_SYS_NAND_U_BOOT_OFFS		0x008000
+#define CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS	0x208000
 #endif /* CONFIG_SPL_NAND_SUPPORT */
 
 #define CONFIG_MISC_INIT_R
-- 
2.3.6

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 4/5] nand: sunxi: Add multiimage preload option
  2015-04-29 15:02 [U-Boot] [PATCH 0/5] nand: sunxi: Add SPL support for booting from NAND Daniel Kochmański
                   ` (2 preceding siblings ...)
  2015-04-29 15:02 ` [U-Boot] [PATCH 3/5] nand: sunxi: Add secondary U-Boot offset on second syndrome partition Daniel Kochmański
@ 2015-04-29 15:03 ` Daniel Kochmański
  2015-05-02 14:24   ` Ian Campbell
  2015-05-18 23:43   ` Scott Wood
  2015-04-29 15:03 ` [U-Boot] [PATCH 5/5] nand: sunxi: And a20_nandread command utilizing spl nand read driver Daniel Kochmański
  4 siblings, 2 replies; 26+ messages in thread
From: Daniel Kochmański @ 2015-04-29 15:03 UTC (permalink / raw)
  To: u-boot

Patch adds support in spl_nand for preloading multiimage before
loading u-boot into memory. It might be used in example to put in
memory single image containing boot script, kernel and device
tree.

Behavior is triggered, if CONFIG_SPL_NAND_MULTI_PRELOAD is defined -
multiimage is loaded from CONFIG_SYS_NAND_MULTI_OFFS to address
specified on image creation.

Additionally defines it in sunxi-common.h conditionally when
CONFIG_SPL_NAND_SUPPORT is enabled. SPL tries to preload image from
beginning of non-syndrome area.

Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
Cc: Ian Campbell <ijc@hellion.org.uk>
Cc: Hans De Goede <hdegoede@redhat.com>
---

 README                         |  6 ++++++
 common/spl/spl_nand.c          | 14 ++++++++++++++
 include/configs/sunxi-common.h |  2 ++
 3 files changed, 22 insertions(+)

diff --git a/README b/README
index 4ccf3cb..444b02f 100644
--- a/README
+++ b/README
@@ -3719,6 +3719,9 @@ FIT uImage format:
 		CONFIG_SPL_NAND_BOOT
 		Add support NAND boot
 
+		CONFIG_SPL_NAND_MULTI_PRELOAD
+		Preload multiimage from predefined offset in NAND.
+
 		CONFIG_SYS_NAND_U_BOOT_OFFS
 		Location in NAND to read U-Boot from
 
@@ -3735,6 +3738,9 @@ FIT uImage format:
 		CONFIG_SYS_NAND_U_BOOT_START
 		Entry point in loaded image to jump to
 
+		CONFIG_SYS_NAND_MULTI_OFFS
+		Location in NAND to read multiimage from.
+
 		CONFIG_SYS_NAND_HW_ECC_OOBFIRST
 		Define this if you need to first read the OOB and then the
 		data. This is used, for example, on davinci platforms.
diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
index 7c44de1..f87db0a 100644
--- a/common/spl/spl_nand.c
+++ b/common/spl/spl_nand.c
@@ -89,6 +89,20 @@ void spl_nand_load_image(void)
 			    (void *)spl_image.load_addr);
 #endif
 #endif
+#ifdef CONFIG_SPL_NAND_MULTI_PRELOAD
+	/* Load multiimage */
+	puts("Preloading multiimage.\n");
+	nand_spl_load_image(CONFIG_SYS_NAND_MULTI_OFFS,
+			    sizeof(*header), (void *)header);
+	spl_parse_image_header(header);
+	if (header->ih_type == IH_TYPE_MULTI) {
+		nand_spl_load_image(CONFIG_SYS_NAND_MULTI_OFFS,
+				    spl_image.size,
+				    (void *)(unsigned long)spl_image.load_addr);
+	} else {
+		puts("Multiimage header didn't match.\n");
+	}
+#endif /* CONFIG_SPL_NAND_MULTI_PRELOAD */
 	/* Load u-boot */
 	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
 			    sizeof(*header), (void *)header);
diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h
index 15fe512..0b4ea7e 100644
--- a/include/configs/sunxi-common.h
+++ b/include/configs/sunxi-common.h
@@ -328,9 +328,11 @@ extern int soft_i2c_gpio_scl;
 #ifdef CONFIG_SPL_NAND_SUPPORT
 #define CONFIG_NAND
 #define CONFIG_NAND_SUNXI
+#define CONFIG_SPL_NAND_MULTI_PRELOAD
 #define CONFIG_CMD_SPL_WRITE_SIZE		0x000400
 #define CONFIG_SYS_NAND_U_BOOT_OFFS		0x008000
 #define CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS	0x208000
+#define CONFIG_SYS_NAND_MULTI_OFFS		0x400000
 #endif /* CONFIG_SPL_NAND_SUPPORT */
 
 #define CONFIG_MISC_INIT_R
-- 
2.3.6

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 5/5] nand: sunxi: And a20_nandread command utilizing spl nand read driver
  2015-04-29 15:02 [U-Boot] [PATCH 0/5] nand: sunxi: Add SPL support for booting from NAND Daniel Kochmański
                   ` (3 preceding siblings ...)
  2015-04-29 15:03 ` [U-Boot] [PATCH 4/5] nand: sunxi: Add multiimage preload option Daniel Kochmański
@ 2015-04-29 15:03 ` Daniel Kochmański
  2015-05-02 14:26   ` Ian Campbell
  2015-05-18 23:52   ` Scott Wood
  4 siblings, 2 replies; 26+ messages in thread
From: Daniel Kochmański @ 2015-04-29 15:03 UTC (permalink / raw)
  To: u-boot

This patch adds a20_nandread command. It is simple function utilizing
function from SPL nand driver `nand_spl_load_image`.

Usage: a20_nandread <address> <offset> <bytes>

Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
Cc: Ian Campbell <ijc@hellion.org.uk>
Cc: Hans De Goede <hdegoede@redhat.com>
---

 common/Kconfig            |  7 +++++++
 common/Makefile           |  1 +
 common/cmd_a20_nandread.c | 27 +++++++++++++++++++++++++++
 3 files changed, 35 insertions(+)
 create mode 100644 common/cmd_a20_nandread.c

diff --git a/common/Kconfig b/common/Kconfig
index 5d7e48a..8edabb6 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -204,6 +204,13 @@ config CMD_NAND
 	help
 	  NAND support.
 
+config CMD_A20_NANDREAD
+	depends on SPL_NAND_SUPPORT
+	bool "a20_nandread"
+	help
+	  NAND read support for A20 SoC. Depends on SPL driver.
+	  Usage: a20_nandread <address> <offset> <size>
+
 config CMD_SPI
 	bool "sspi"
 	help
diff --git a/common/Makefile b/common/Makefile
index fba3830..9286518 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -138,6 +138,7 @@ obj-$(CONFIG_CMD_MMC) += cmd_mmc.o
 obj-$(CONFIG_CMD_MMC_SPI) += cmd_mmc_spi.o
 obj-$(CONFIG_MP) += cmd_mp.o
 obj-$(CONFIG_CMD_MTDPARTS) += cmd_mtdparts.o
+obj-$(CONFIG_CMD_A20_NANDREAD) += cmd_a20_nandread.o
 obj-$(CONFIG_CMD_NAND) += cmd_nand.o
 obj-$(CONFIG_CMD_NET) += cmd_net.o
 obj-$(CONFIG_CMD_ONENAND) += cmd_onenand.o
diff --git a/common/cmd_a20_nandread.c b/common/cmd_a20_nandread.c
new file mode 100644
index 0000000..7361be7
--- /dev/null
+++ b/common/cmd_a20_nandread.c
@@ -0,0 +1,27 @@
+#include <common.h>
+#include <command.h>
+
+int nand_spl_load_image(uint32_t offs, unsigned int size, void *dest);
+
+static int do_a20_nandread(cmd_tbl_t *cmdtp, int flag,
+			   int argc, char *const argv[])
+{
+	if (argc != 4) {
+		printf("usage: a20_nandread <address> <offset> <bytes>\n");
+		return 1;
+	}
+
+	uint32_t dst = simple_strtoul(argv[1], NULL, 16);
+	uint32_t src = simple_strtoul(argv[2], NULL, 16);
+	uint32_t cnt = simple_strtoul(argv[3], NULL, 16);
+	printf("Loading 0x%08XB @ 0x%08X -> 0x%08X...\n", cnt, src, dst);
+	nand_spl_load_image(src, cnt, (void *)dst);
+	return 0;
+}
+
+U_BOOT_CMD(
+	a20_nandread,	CONFIG_SYS_MAXARGS,	3,	do_a20_nandread,
+	"a20_nandread",
+	"[offset size bytes]\n"
+	"   "
+);
-- 
2.3.6

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 1/5] nand: sunxi: change BLOCK_SIZE in mksunxiboot to match NAND block size
  2015-04-29 15:02 ` [U-Boot] [PATCH 1/5] nand: sunxi: change BLOCK_SIZE in mksunxiboot to match NAND block size Daniel Kochmański
@ 2015-05-02 14:08   ` Ian Campbell
  2015-05-05  9:02     ` Daniel Kochmański
  0 siblings, 1 reply; 26+ messages in thread
From: Ian Campbell @ 2015-05-02 14:08 UTC (permalink / raw)
  To: u-boot

On Wed, 2015-04-29 at 17:02 +0200, Daniel Kochma?ski wrote:
> This change is necessary to calculate correct checksum for NAND
> boot. Works both for MMC and NAND. Without it BROM rejects boot image
> as invalid (bad checksum). (Changes block size from 0x200 to 0x2000).

I'm inferring here that for MMC boot this checksum is ignored by the
BROM? If that is the case then I think it should be explicitly
mentioned.

As well as the checksum this also changes the header's length field,
FWIW.


> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
> Cc: Ian Campbell <ijc@hellion.org.uk>
> Cc: Hans De Goede <hdegoede@redhat.com>
> ---
> 
>  tools/mksunxiboot.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/tools/mksunxiboot.c b/tools/mksunxiboot.c
> index 0035f6e..bef0c79 100644
> --- a/tools/mksunxiboot.c
> +++ b/tools/mksunxiboot.c
> @@ -65,7 +65,7 @@ int gen_check_sum(struct boot_file_head *head_p)
>  
>  #define SUN4I_SRAM_SIZE 0x7600	/* 0x7748+ is used by BROM */
>  #define SRAM_LOAD_MAX_SIZE (SUN4I_SRAM_SIZE - sizeof(struct boot_file_head))
> -#define BLOCK_SIZE 512
> +#define BLOCK_SIZE 0x2000
>  
>  struct boot_img {
>  	struct boot_file_head header;

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory
  2015-04-29 15:02 ` [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory Daniel Kochmański
@ 2015-05-02 14:21   ` Ian Campbell
  2015-05-05  9:14     ` Daniel Kochmański
  2015-05-05  9:19     ` Daniel Kochmański
  2015-05-18 23:47   ` Scott Wood
  1 sibling, 2 replies; 26+ messages in thread
From: Ian Campbell @ 2015-05-02 14:21 UTC (permalink / raw)
  To: u-boot

On Wed, 2015-04-29 at 17:02 +0200, Daniel Kochma?ski wrote:
> diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
> index 88e3358..1a30684 100644
> --- a/board/sunxi/Kconfig
> +++ b/board/sunxi/Kconfig
> @@ -239,6 +239,18 @@ config MMC_SUNXI_SLOT_EXTRA
>  	slot or emmc on mmc1 - mmc3. Setting this to 1, 2 or 3 will enable
>  	support for this.
>  
> +config SPL_NAND_SUPPORT
> +	bool "SPL/NAND mode support"
> +	depends on SPL
> +	default n
> +	---help---
> +	  This enables support for booting from NAND internal
> +	  memory. U-Boot SPL doesn't detect where is it load from,
> +	  therefore this option is needed to properly load image from
> +	  flash. Option also disables MMC functionality on U-Boot due to
> +	  initialization errors encountered, when both controllers are
> +	  enabled.

Is this last bit a bug in the s/w or a hardware thing? Does this mean
that MMC is not available in the main u-boot image too when NAND support
is enabled?

> +
>  config USB0_VBUS_PIN
>  	string "Vbus enable pin for usb0 (otg)"
>  	default ""
> diff --git a/board/sunxi/Makefile b/board/sunxi/Makefile
> index 43766e0..7ad7412 100644
> --- a/board/sunxi/Makefile
> +++ b/board/sunxi/Makefile
> @@ -9,6 +9,7 @@
>  # SPDX-License-Identifier:	GPL-2.0+
>  #
>  obj-y	+= board.o
> +obj-$(CONFIG_NAND_SUNXI)	+= nand.o

CONFIG_SUNXI_NAND would be more consistent with the rest I think.

>  obj-$(CONFIG_SUNXI_GMAC)	+= gmac.o
>  obj-$(CONFIG_SUNXI_AHCI)	+= ahci.o

> +void nand_set_clocks(void)
> +{
> +	W32(PORTC_BASE + 0x48, 0x22222222);

u-boot style is to declare a struct which matches the register layout
and to do something like:
        struct nand_ctrl_foo *mcf = (void *)NANCFLASHC_BASE;

And use writel, set_bits, setclr_bits and friends.

Please also try and give sensible names to all the magic numbers, or at
least include a comment explaining that these are magic numbers derived
from $SOMEWHERE and we don't know what they mean (if that is the case).

Both of these apply to several bits of the code too.

> +	W32(PORTC_BASE + 0x4C, 0x22222222);
> +	W32(PORTC_BASE + 0x50, 0x2222222);
> +	W32(PORTC_BASE + 0x54, 0x2);
> +	W32(PORTC_BASE + 0x5C, 0x55555555);
> +	W32(PORTC_BASE + 0x60, 0x15555);
> +	W32(PORTC_BASE + 0x64, 0x5140);
> +	W32(PORTC_BASE + 0x68, 0x4016);
> +
> +	uint32_t val = R32(CCMU_BASE + 0x60);
> +	W32(CCMU_BASE + 0x60, 0x2000 | val);
> +	val = R32(CCMU_BASE + 0x80);
> +	W32(CCMU_BASE + 0x80, val | 0x80000000 | 0x1);
> +}
> +
> +int initialized = 0;
> +void nand_init(void)
> +{
> +	initialized = 1;

Please call this from somewhere during init e.g. board.c rather than
from nand_read with a latch.

> +	uint32_t val;
> +	nand_set_clocks();
> +	val = R32(NANDFLASHC_BASE + 0x00);
> +	/* CTL = (1<<0 <-EN    1<<1 RESET) */
> +	W32(NANDFLASHC_BASE + 0x00, val | 0x3);	/* enable and reset CTL */
> +	do {
> +		val = R32(NANDFLASHC_BASE + 0x00);
> +		if (val & (1<<1))
> +			break;
> +	} while (1);

Potentially infinite loop?

There were some similar instances below which had a t/o. Perhaps combine
them all into a helper similar to the dram code's
mctl_await_completion()?

> +uint32_t ecc_errors = 0;
> +
> +/* read 0x400 bytes from real_addr to temp_buf */
> +void nand_read_block(unsigned int real_addr, int syndrome)
> +{
> +	uint32_t val;
> +	if (!initialized)
> +		nand_init();
> +
> +	memset((void *)temp_buf, 0, 0x400); /* clear temp_buf */

Can we not avoid going via this global temp_buf by setting DMAC_BASE +
0x308 to the correct address on each read?

Ian.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 3/5] nand: sunxi: Add secondary U-Boot offset on second syndrome partition
  2015-04-29 15:02 ` [U-Boot] [PATCH 3/5] nand: sunxi: Add secondary U-Boot offset on second syndrome partition Daniel Kochmański
@ 2015-05-02 14:24   ` Ian Campbell
  2015-05-05 14:21   ` Tim Harvey
  2015-05-18 23:10   ` Scott Wood
  2 siblings, 0 replies; 26+ messages in thread
From: Ian Campbell @ 2015-05-02 14:24 UTC (permalink / raw)
  To: u-boot

On Wed, 2015-04-29 at 17:02 +0200, Daniel Kochma?ski wrote:
> Introduces CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS, pointing to backup
> U-Boot instance in nand memory. In case if first header doesn't match,
> tries to load bootloader from this offset. In case of both failing,
> hang() is called.
> 
> Additionally define offset of backup U-boot for sunxi at start of
> second syndrome partition.
> 
> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
> Cc: Ian Campbell <ijc@hellion.org.uk>
> Cc: Hans De Goede <hdegoede@redhat.com>
> ---
> 
>  README                         |  4 ++++
>  common/spl/spl_nand.c          | 28 +++++++++++++++++++++++++---

This needs an ack from the maintainer of this file rather than Hans or
I.

Adding CC of Simon who is mentioned in the header plus some people who
touched the file recently in the hopes of finding out who that is.

Ian.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 4/5] nand: sunxi: Add multiimage preload option
  2015-04-29 15:03 ` [U-Boot] [PATCH 4/5] nand: sunxi: Add multiimage preload option Daniel Kochmański
@ 2015-05-02 14:24   ` Ian Campbell
  2015-05-18 23:43   ` Scott Wood
  1 sibling, 0 replies; 26+ messages in thread
From: Ian Campbell @ 2015-05-02 14:24 UTC (permalink / raw)
  To: u-boot

On Wed, 2015-04-29 at 17:03 +0200, Daniel Kochma?ski wrote:
> Patch adds support in spl_nand for preloading multiimage before
> loading u-boot into memory. It might be used in example to put in
> memory single image containing boot script, kernel and device
> tree.
> 
> Behavior is triggered, if CONFIG_SPL_NAND_MULTI_PRELOAD is defined -
> multiimage is loaded from CONFIG_SYS_NAND_MULTI_OFFS to address
> specified on image creation.
> 
> Additionally defines it in sunxi-common.h conditionally when
> CONFIG_SPL_NAND_SUPPORT is enabled. SPL tries to preload image from
> beginning of non-syndrome area.
> 
> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
> Cc: Ian Campbell <ijc@hellion.org.uk>
> Cc: Hans De Goede <hdegoede@redhat.com>
> ---
> 
>  README                         |  6 ++++++
>  common/spl/spl_nand.c          | 14 ++++++++++++++

As with the previous patch this likely needs an Ack from someone else.

Ian.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 5/5] nand: sunxi: And a20_nandread command utilizing spl nand read driver
  2015-04-29 15:03 ` [U-Boot] [PATCH 5/5] nand: sunxi: And a20_nandread command utilizing spl nand read driver Daniel Kochmański
@ 2015-05-02 14:26   ` Ian Campbell
  2015-05-04 14:20     ` Hans de Goede
  2015-05-18 23:52   ` Scott Wood
  1 sibling, 1 reply; 26+ messages in thread
From: Ian Campbell @ 2015-05-02 14:26 UTC (permalink / raw)
  To: u-boot

On Wed, 2015-04-29 at 17:03 +0200, Daniel Kochma?ski wrote:
> This patch adds a20_nandread command. It is simple function utilizing
> function from SPL nand driver `nand_spl_load_image`.
> 
> Usage: a20_nandread <address> <offset> <bytes>

This stuff should really be integrated with cmd_nand.c rather than
adding an adhoc SoC specific interface.

> 
> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
> Cc: Ian Campbell <ijc@hellion.org.uk>
> Cc: Hans De Goede <hdegoede@redhat.com>
> ---
> 
>  common/Kconfig            |  7 +++++++
>  common/Makefile           |  1 +
>  common/cmd_a20_nandread.c | 27 +++++++++++++++++++++++++++
>  3 files changed, 35 insertions(+)
>  create mode 100644 common/cmd_a20_nandread.c
> 
> diff --git a/common/Kconfig b/common/Kconfig
> index 5d7e48a..8edabb6 100644
> --- a/common/Kconfig
> +++ b/common/Kconfig
> @@ -204,6 +204,13 @@ config CMD_NAND
>  	help
>  	  NAND support.
>  
> +config CMD_A20_NANDREAD
> +	depends on SPL_NAND_SUPPORT
> +	bool "a20_nandread"
> +	help
> +	  NAND read support for A20 SoC. Depends on SPL driver.
> +	  Usage: a20_nandread <address> <offset> <size>
> +
>  config CMD_SPI
>  	bool "sspi"
>  	help
> diff --git a/common/Makefile b/common/Makefile
> index fba3830..9286518 100644
> --- a/common/Makefile
> +++ b/common/Makefile
> @@ -138,6 +138,7 @@ obj-$(CONFIG_CMD_MMC) += cmd_mmc.o
>  obj-$(CONFIG_CMD_MMC_SPI) += cmd_mmc_spi.o
>  obj-$(CONFIG_MP) += cmd_mp.o
>  obj-$(CONFIG_CMD_MTDPARTS) += cmd_mtdparts.o
> +obj-$(CONFIG_CMD_A20_NANDREAD) += cmd_a20_nandread.o
>  obj-$(CONFIG_CMD_NAND) += cmd_nand.o
>  obj-$(CONFIG_CMD_NET) += cmd_net.o
>  obj-$(CONFIG_CMD_ONENAND) += cmd_onenand.o
> diff --git a/common/cmd_a20_nandread.c b/common/cmd_a20_nandread.c
> new file mode 100644
> index 0000000..7361be7
> --- /dev/null
> +++ b/common/cmd_a20_nandread.c
> @@ -0,0 +1,27 @@
> +#include <common.h>
> +#include <command.h>
> +
> +int nand_spl_load_image(uint32_t offs, unsigned int size, void *dest);
> +
> +static int do_a20_nandread(cmd_tbl_t *cmdtp, int flag,
> +			   int argc, char *const argv[])
> +{
> +	if (argc != 4) {
> +		printf("usage: a20_nandread <address> <offset> <bytes>\n");
> +		return 1;
> +	}
> +
> +	uint32_t dst = simple_strtoul(argv[1], NULL, 16);
> +	uint32_t src = simple_strtoul(argv[2], NULL, 16);
> +	uint32_t cnt = simple_strtoul(argv[3], NULL, 16);
> +	printf("Loading 0x%08XB @ 0x%08X -> 0x%08X...\n", cnt, src, dst);
> +	nand_spl_load_image(src, cnt, (void *)dst);
> +	return 0;
> +}
> +
> +U_BOOT_CMD(
> +	a20_nandread,	CONFIG_SYS_MAXARGS,	3,	do_a20_nandread,
> +	"a20_nandread",
> +	"[offset size bytes]\n"
> +	"   "
> +);

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 5/5] nand: sunxi: And a20_nandread command utilizing spl nand read driver
  2015-05-02 14:26   ` Ian Campbell
@ 2015-05-04 14:20     ` Hans de Goede
  2015-05-05  9:17       ` Daniel Kochmański
  0 siblings, 1 reply; 26+ messages in thread
From: Hans de Goede @ 2015-05-04 14:20 UTC (permalink / raw)
  To: u-boot

Hi,

On 05/02/2015 04:26 PM, Ian Campbell wrote:
> On Wed, 2015-04-29 at 17:03 +0200, Daniel Kochma?ski wrote:
>> This patch adds a20_nandread command. It is simple function utilizing
>> function from SPL nand driver `nand_spl_load_image`.
>>
>> Usage: a20_nandread <address> <offset> <bytes>
>
> This stuff should really be integrated with cmd_nand.c rather than
> adding an adhoc SoC specific interface.

I want to go even further and I see that this really needs to be integrated
with the blkdev code so that one can just do:

ls nand 0:1

And things will just work, these way we can also just have the standard
boot cmds from config_distro_bootcmd.h work rather then needing special
nand boot commands.

Regards,

Hans



>
>>
>> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
>> Cc: Ian Campbell <ijc@hellion.org.uk>
>> Cc: Hans De Goede <hdegoede@redhat.com>
>> ---
>>
>>   common/Kconfig            |  7 +++++++
>>   common/Makefile           |  1 +
>>   common/cmd_a20_nandread.c | 27 +++++++++++++++++++++++++++
>>   3 files changed, 35 insertions(+)
>>   create mode 100644 common/cmd_a20_nandread.c
>>
>> diff --git a/common/Kconfig b/common/Kconfig
>> index 5d7e48a..8edabb6 100644
>> --- a/common/Kconfig
>> +++ b/common/Kconfig
>> @@ -204,6 +204,13 @@ config CMD_NAND
>>   	help
>>   	  NAND support.
>>
>> +config CMD_A20_NANDREAD
>> +	depends on SPL_NAND_SUPPORT
>> +	bool "a20_nandread"
>> +	help
>> +	  NAND read support for A20 SoC. Depends on SPL driver.
>> +	  Usage: a20_nandread <address> <offset> <size>
>> +
>>   config CMD_SPI
>>   	bool "sspi"
>>   	help
>> diff --git a/common/Makefile b/common/Makefile
>> index fba3830..9286518 100644
>> --- a/common/Makefile
>> +++ b/common/Makefile
>> @@ -138,6 +138,7 @@ obj-$(CONFIG_CMD_MMC) += cmd_mmc.o
>>   obj-$(CONFIG_CMD_MMC_SPI) += cmd_mmc_spi.o
>>   obj-$(CONFIG_MP) += cmd_mp.o
>>   obj-$(CONFIG_CMD_MTDPARTS) += cmd_mtdparts.o
>> +obj-$(CONFIG_CMD_A20_NANDREAD) += cmd_a20_nandread.o
>>   obj-$(CONFIG_CMD_NAND) += cmd_nand.o
>>   obj-$(CONFIG_CMD_NET) += cmd_net.o
>>   obj-$(CONFIG_CMD_ONENAND) += cmd_onenand.o
>> diff --git a/common/cmd_a20_nandread.c b/common/cmd_a20_nandread.c
>> new file mode 100644
>> index 0000000..7361be7
>> --- /dev/null
>> +++ b/common/cmd_a20_nandread.c
>> @@ -0,0 +1,27 @@
>> +#include <common.h>
>> +#include <command.h>
>> +
>> +int nand_spl_load_image(uint32_t offs, unsigned int size, void *dest);
>> +
>> +static int do_a20_nandread(cmd_tbl_t *cmdtp, int flag,
>> +			   int argc, char *const argv[])
>> +{
>> +	if (argc != 4) {
>> +		printf("usage: a20_nandread <address> <offset> <bytes>\n");
>> +		return 1;
>> +	}
>> +
>> +	uint32_t dst = simple_strtoul(argv[1], NULL, 16);
>> +	uint32_t src = simple_strtoul(argv[2], NULL, 16);
>> +	uint32_t cnt = simple_strtoul(argv[3], NULL, 16);
>> +	printf("Loading 0x%08XB @ 0x%08X -> 0x%08X...\n", cnt, src, dst);
>> +	nand_spl_load_image(src, cnt, (void *)dst);
>> +	return 0;
>> +}
>> +
>> +U_BOOT_CMD(
>> +	a20_nandread,	CONFIG_SYS_MAXARGS,	3,	do_a20_nandread,
>> +	"a20_nandread",
>> +	"[offset size bytes]\n"
>> +	"   "
>> +);
>
>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 1/5] nand: sunxi: change BLOCK_SIZE in mksunxiboot to match NAND block size
  2015-05-02 14:08   ` Ian Campbell
@ 2015-05-05  9:02     ` Daniel Kochmański
  2015-05-09 13:51       ` Ian Campbell
  0 siblings, 1 reply; 26+ messages in thread
From: Daniel Kochmański @ 2015-05-05  9:02 UTC (permalink / raw)
  To: u-boot


Ian Campbell writes:

> On Wed, 2015-04-29 at 17:02 +0200, Daniel Kochma?ski wrote:
>> This change is necessary to calculate correct checksum for NAND
>> boot. Works both for MMC and NAND. Without it BROM rejects boot image
>> as invalid (bad checksum). (Changes block size from 0x200 to 0x2000).
>
> I'm inferring here that for MMC boot this checksum is ignored by the
> BROM? If that is the case then I think it should be explicitly
> mentioned.

It isn't ignored, just larger block is taken into checksum and put in
header (which is read by BROM). I think, that in NAND case BROM just
ignores length field in header, and calculates checksum for whole page
(8KB), while on MMC it respects this field, hence 0x2000 works for
both.

I've tried to put garbage into checksum field, and MMC doesn't boot if
checksum isn't correct.
>
> As well as the checksum this also changes the header's length field,
> FWIW.
>

Yes, this is true. Should I change it to set block size conditionally
depending on defines - if it's SPL NAND boot, then use 0x2000, in other
occasion use 0x200? Whole `u-boot-sunxi-with-spl.bin` size doesn't
increase tough (probably because of space between spl and proper
u-boot).
>
>> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
>> Cc: Ian Campbell <ijc@hellion.org.uk>
>> Cc: Hans De Goede <hdegoede@redhat.com>
>> ---
>> 
>>  tools/mksunxiboot.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>> 
>> diff --git a/tools/mksunxiboot.c b/tools/mksunxiboot.c
>> index 0035f6e..bef0c79 100644
>> --- a/tools/mksunxiboot.c
>> +++ b/tools/mksunxiboot.c
>> @@ -65,7 +65,7 @@ int gen_check_sum(struct boot_file_head *head_p)
>>  
>>  #define SUN4I_SRAM_SIZE 0x7600	/* 0x7748+ is used by BROM */
>>  #define SRAM_LOAD_MAX_SIZE (SUN4I_SRAM_SIZE - sizeof(struct boot_file_head))
>> -#define BLOCK_SIZE 512
>> +#define BLOCK_SIZE 0x2000
>>  
>>  struct boot_img {
>>  	struct boot_file_head header;

-- 
Daniel Kochma?ski | Pozna?, Poland
;; aka jackdaniel

"Be the change that you wish to see in the world." - Mahatma Gandhi

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory
  2015-05-02 14:21   ` Ian Campbell
@ 2015-05-05  9:14     ` Daniel Kochmański
  2015-05-05  9:19     ` Daniel Kochmański
  1 sibling, 0 replies; 26+ messages in thread
From: Daniel Kochmański @ 2015-05-05  9:14 UTC (permalink / raw)
  To: u-boot


Ian Campbell writes:

> On Wed, 2015-04-29 at 17:02 +0200, Daniel Kochma?ski wrote:
>> diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
>> index 88e3358..1a30684 100644
>> --- a/board/sunxi/Kconfig
>> +++ b/board/sunxi/Kconfig
>> @@ -239,6 +239,18 @@ config MMC_SUNXI_SLOT_EXTRA
>>  	slot or emmc on mmc1 - mmc3. Setting this to 1, 2 or 3 will enable
>>  	support for this.
>>  
>> +config SPL_NAND_SUPPORT
>> +	bool "SPL/NAND mode support"
>> +	depends on SPL
>> +	default n
>> +	---help---
>> +	  This enables support for booting from NAND internal
>> +	  memory. U-Boot SPL doesn't detect where is it load from,
>> +	  therefore this option is needed to properly load image from
>> +	  flash. Option also disables MMC functionality on U-Boot due to
>> +	  initialization errors encountered, when both controllers are
>> +	  enabled.
>
> Is this last bit a bug in the s/w or a hardware thing? Does this mean
> that MMC is not available in the main u-boot image too when NAND support
> is enabled?
>

I'm not sure what is a reason, but controller can't initialize MMC when
SPL is loaded. MMC works in main u-boot allowing to boot from it and
perform any other option (rescan, part, info, etc.). It is only SPL
relevant.
>> +
>>  config USB0_VBUS_PIN
>>  	string "Vbus enable pin for usb0 (otg)"
>>  	default ""
>> diff --git a/board/sunxi/Makefile b/board/sunxi/Makefile
>> index 43766e0..7ad7412 100644
>> --- a/board/sunxi/Makefile
>> +++ b/board/sunxi/Makefile
>> @@ -9,6 +9,7 @@
>>  # SPDX-License-Identifier:	GPL-2.0+
>>  #
>>  obj-y	+= board.o
>> +obj-$(CONFIG_NAND_SUNXI)	+= nand.o
>
> CONFIG_SUNXI_NAND would be more consistent with the rest I think.
>

OK.
>>  obj-$(CONFIG_SUNXI_GMAC)	+= gmac.o
>>  obj-$(CONFIG_SUNXI_AHCI)	+= ahci.o
>
>> +void nand_set_clocks(void)
>> +{
>> +	W32(PORTC_BASE + 0x48, 0x22222222);
>
> u-boot style is to declare a struct which matches the register layout
> and to do something like:
>         struct nand_ctrl_foo *mcf = (void *)NANCFLASHC_BASE;
>
> And use writel, set_bits, setclr_bits and friends.

OK, I'll read about it and try to adjust driver.
>
> Please also try and give sensible names to all the magic numbers, or at
> least include a comment explaining that these are magic numbers derived
> from $SOMEWHERE and we don't know what they mean (if that is the case).
>
> Both of these apply to several bits of the code too.

This work is mainly based on register guess-work from here:
http://rhombus-tech.net/allwinner_a10/A10_register_guide/A10_NAND/ - so
I can gather names from there and put them in source.
>
>> +	W32(PORTC_BASE + 0x4C, 0x22222222);
>> +	W32(PORTC_BASE + 0x50, 0x2222222);
>> +	W32(PORTC_BASE + 0x54, 0x2);
>> +	W32(PORTC_BASE + 0x5C, 0x55555555);
>> +	W32(PORTC_BASE + 0x60, 0x15555);
>> +	W32(PORTC_BASE + 0x64, 0x5140);
>> +	W32(PORTC_BASE + 0x68, 0x4016);
>> +
>> +	uint32_t val = R32(CCMU_BASE + 0x60);
>> +	W32(CCMU_BASE + 0x60, 0x2000 | val);
>> +	val = R32(CCMU_BASE + 0x80);
>> +	W32(CCMU_BASE + 0x80, val | 0x80000000 | 0x1);
>> +}
>> +
>> +int initialized = 0;
>> +void nand_init(void)
>> +{
>> +	initialized = 1;
>
> Please call this from somewhere during init e.g. board.c rather than
> from nand_read with a latch.
>

Sure.
>> +	uint32_t val;
>> +	nand_set_clocks();
>> +	val = R32(NANDFLASHC_BASE + 0x00);
>> +	/* CTL = (1<<0 <-EN    1<<1 RESET) */
>> +	W32(NANDFLASHC_BASE + 0x00, val | 0x3);	/* enable and reset CTL */
>> +	do {
>> +		val = R32(NANDFLASHC_BASE + 0x00);
>> +		if (val & (1<<1))
>> +			break;
>> +	} while (1);
>
> Potentially infinite loop?
>
> There were some similar instances below which had a t/o. Perhaps combine
> them all into a helper similar to the dram code's
> mctl_await_completion()?
>

Ok, I'll look into that.
>> +uint32_t ecc_errors = 0;
>> +
>> +/* read 0x400 bytes from real_addr to temp_buf */
>> +void nand_read_block(unsigned int real_addr, int syndrome)
>> +{
>> +	uint32_t val;
>> +	if (!initialized)
>> +		nand_init();
>> +
>> +	memset((void *)temp_buf, 0, 0x400); /* clear temp_buf */
>
> Can we not avoid going via this global temp_buf by setting DMAC_BASE +
> 0x308 to the correct address on each read?
>

I'll check this, I think I had problems with that, but if it works w/o
temp_buf on both SPL and main U-Boot builds, then I'll get rid of it.
> Ian.

-- 
Daniel Kochma?ski | Pozna?, Poland
;; aka jackdaniel

"Be the change that you wish to see in the world." - Mahatma Gandhi

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 5/5] nand: sunxi: And a20_nandread command utilizing spl nand read driver
  2015-05-04 14:20     ` Hans de Goede
@ 2015-05-05  9:17       ` Daniel Kochmański
  2015-05-05  9:45         ` Hans de Goede
  0 siblings, 1 reply; 26+ messages in thread
From: Daniel Kochmański @ 2015-05-05  9:17 UTC (permalink / raw)
  To: u-boot


Hans de Goede writes:

> Hi,
>
> On 05/02/2015 04:26 PM, Ian Campbell wrote:
>> On Wed, 2015-04-29 at 17:03 +0200, Daniel Kochma?ski wrote:
>>> This patch adds a20_nandread command. It is simple function utilizing
>>> function from SPL nand driver `nand_spl_load_image`.
>>>
>>> Usage: a20_nandread <address> <offset> <bytes>
>>
>> This stuff should really be integrated with cmd_nand.c rather than
>> adding an adhoc SoC specific interface.
>
> I want to go even further and I see that this really needs to be integrated
> with the blkdev code so that one can just do:
>
> ls nand 0:1
>
> And things will just work, these way we can also just have the standard
> boot cmds from config_distro_bootcmd.h work rather then needing special
> nand boot commands.
>
> Regards,
>
> Hans
>

It was more a convenient function then proper integration. I'll look
into that, but it may take time - I'm quite unfamiliar with U-Boot nand
interface.
>
>
>>
>>>
>>> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
>>> Cc: Ian Campbell <ijc@hellion.org.uk>
>>> Cc: Hans De Goede <hdegoede@redhat.com>
>>> ---
>>>
>>>   common/Kconfig            |  7 +++++++
>>>   common/Makefile           |  1 +
>>>   common/cmd_a20_nandread.c | 27 +++++++++++++++++++++++++++
>>>   3 files changed, 35 insertions(+)
>>>   create mode 100644 common/cmd_a20_nandread.c
>>>
>>> diff --git a/common/Kconfig b/common/Kconfig
>>> index 5d7e48a..8edabb6 100644
>>> --- a/common/Kconfig
>>> +++ b/common/Kconfig
>>> @@ -204,6 +204,13 @@ config CMD_NAND
>>>   	help
>>>   	  NAND support.
>>>
>>> +config CMD_A20_NANDREAD
>>> +	depends on SPL_NAND_SUPPORT
>>> +	bool "a20_nandread"
>>> +	help
>>> +	  NAND read support for A20 SoC. Depends on SPL driver.
>>> +	  Usage: a20_nandread <address> <offset> <size>
>>> +
>>>   config CMD_SPI
>>>   	bool "sspi"
>>>   	help
>>> diff --git a/common/Makefile b/common/Makefile
>>> index fba3830..9286518 100644
>>> --- a/common/Makefile
>>> +++ b/common/Makefile
>>> @@ -138,6 +138,7 @@ obj-$(CONFIG_CMD_MMC) += cmd_mmc.o
>>>   obj-$(CONFIG_CMD_MMC_SPI) += cmd_mmc_spi.o
>>>   obj-$(CONFIG_MP) += cmd_mp.o
>>>   obj-$(CONFIG_CMD_MTDPARTS) += cmd_mtdparts.o
>>> +obj-$(CONFIG_CMD_A20_NANDREAD) += cmd_a20_nandread.o
>>>   obj-$(CONFIG_CMD_NAND) += cmd_nand.o
>>>   obj-$(CONFIG_CMD_NET) += cmd_net.o
>>>   obj-$(CONFIG_CMD_ONENAND) += cmd_onenand.o
>>> diff --git a/common/cmd_a20_nandread.c b/common/cmd_a20_nandread.c
>>> new file mode 100644
>>> index 0000000..7361be7
>>> --- /dev/null
>>> +++ b/common/cmd_a20_nandread.c
>>> @@ -0,0 +1,27 @@
>>> +#include <common.h>
>>> +#include <command.h>
>>> +
>>> +int nand_spl_load_image(uint32_t offs, unsigned int size, void *dest);
>>> +
>>> +static int do_a20_nandread(cmd_tbl_t *cmdtp, int flag,
>>> +			   int argc, char *const argv[])
>>> +{
>>> +	if (argc != 4) {
>>> +		printf("usage: a20_nandread <address> <offset> <bytes>\n");
>>> +		return 1;
>>> +	}
>>> +
>>> +	uint32_t dst = simple_strtoul(argv[1], NULL, 16);
>>> +	uint32_t src = simple_strtoul(argv[2], NULL, 16);
>>> +	uint32_t cnt = simple_strtoul(argv[3], NULL, 16);
>>> +	printf("Loading 0x%08XB @ 0x%08X -> 0x%08X...\n", cnt, src, dst);
>>> +	nand_spl_load_image(src, cnt, (void *)dst);
>>> +	return 0;
>>> +}
>>> +
>>> +U_BOOT_CMD(
>>> +	a20_nandread,	CONFIG_SYS_MAXARGS,	3,	do_a20_nandread,
>>> +	"a20_nandread",
>>> +	"[offset size bytes]\n"
>>> +	"   "
>>> +);
>>
>>

-- 
Daniel Kochma?ski | Pozna?, Poland
;; aka jackdaniel

"Be the change that you wish to see in the world." - Mahatma Gandhi

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory
  2015-05-02 14:21   ` Ian Campbell
  2015-05-05  9:14     ` Daniel Kochmański
@ 2015-05-05  9:19     ` Daniel Kochmański
  2015-05-09 13:53       ` Ian Campbell
  1 sibling, 1 reply; 26+ messages in thread
From: Daniel Kochmański @ 2015-05-05  9:19 UTC (permalink / raw)
  To: u-boot


(sorry for resending, used wrong mail here - not sure how mailing list
will handle that).

Ian Campbell writes:

> On Wed, 2015-04-29 at 17:02 +0200, Daniel Kochma?ski wrote:
>> diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
>> index 88e3358..1a30684 100644
>> --- a/board/sunxi/Kconfig
>> +++ b/board/sunxi/Kconfig
>> @@ -239,6 +239,18 @@ config MMC_SUNXI_SLOT_EXTRA
>>  	slot or emmc on mmc1 - mmc3. Setting this to 1, 2 or 3 will enable
>>  	support for this.
>>  
>> +config SPL_NAND_SUPPORT
>> +	bool "SPL/NAND mode support"
>> +	depends on SPL
>> +	default n
>> +	---help---
>> +	  This enables support for booting from NAND internal
>> +	  memory. U-Boot SPL doesn't detect where is it load from,
>> +	  therefore this option is needed to properly load image from
>> +	  flash. Option also disables MMC functionality on U-Boot due to
>> +	  initialization errors encountered, when both controllers are
>> +	  enabled.
>
> Is this last bit a bug in the s/w or a hardware thing? Does this mean
> that MMC is not available in the main u-boot image too when NAND support
> is enabled?
>

I'm not sure what is a reason, but controller can't initialize MMC when
SPL is loaded. MMC works in main u-boot allowing to boot from it and
perform any other option (rescan, part, info, etc.). It is only SPL
relevant.
>> +
>>  config USB0_VBUS_PIN
>>  	string "Vbus enable pin for usb0 (otg)"
>>  	default ""
>> diff --git a/board/sunxi/Makefile b/board/sunxi/Makefile
>> index 43766e0..7ad7412 100644
>> --- a/board/sunxi/Makefile
>> +++ b/board/sunxi/Makefile
>> @@ -9,6 +9,7 @@
>>  # SPDX-License-Identifier:	GPL-2.0+
>>  #
>>  obj-y	+= board.o
>> +obj-$(CONFIG_NAND_SUNXI)	+= nand.o
>
> CONFIG_SUNXI_NAND would be more consistent with the rest I think.
>

OK.
>>  obj-$(CONFIG_SUNXI_GMAC)	+= gmac.o
>>  obj-$(CONFIG_SUNXI_AHCI)	+= ahci.o
>
>> +void nand_set_clocks(void)
>> +{
>> +	W32(PORTC_BASE + 0x48, 0x22222222);
>
> u-boot style is to declare a struct which matches the register layout
> and to do something like:
>         struct nand_ctrl_foo *mcf = (void *)NANCFLASHC_BASE;
>
> And use writel, set_bits, setclr_bits and friends.

OK, I'll read about it and try to adjust driver.
>
> Please also try and give sensible names to all the magic numbers, or at
> least include a comment explaining that these are magic numbers derived
> from $SOMEWHERE and we don't know what they mean (if that is the case).
>
> Both of these apply to several bits of the code too.

This work is mainly based on register guess-work from here:
http://rhombus-tech.net/allwinner_a10/A10_register_guide/A10_NAND/ - so
I can gather names from there and put them in source.
>
>> +	W32(PORTC_BASE + 0x4C, 0x22222222);
>> +	W32(PORTC_BASE + 0x50, 0x2222222);
>> +	W32(PORTC_BASE + 0x54, 0x2);
>> +	W32(PORTC_BASE + 0x5C, 0x55555555);
>> +	W32(PORTC_BASE + 0x60, 0x15555);
>> +	W32(PORTC_BASE + 0x64, 0x5140);
>> +	W32(PORTC_BASE + 0x68, 0x4016);
>> +
>> +	uint32_t val = R32(CCMU_BASE + 0x60);
>> +	W32(CCMU_BASE + 0x60, 0x2000 | val);
>> +	val = R32(CCMU_BASE + 0x80);
>> +	W32(CCMU_BASE + 0x80, val | 0x80000000 | 0x1);
>> +}
>> +
>> +int initialized = 0;
>> +void nand_init(void)
>> +{
>> +	initialized = 1;
>
> Please call this from somewhere during init e.g. board.c rather than
> from nand_read with a latch.
>

Sure.
>> +	uint32_t val;
>> +	nand_set_clocks();
>> +	val = R32(NANDFLASHC_BASE + 0x00);
>> +	/* CTL = (1<<0 <-EN    1<<1 RESET) */
>> +	W32(NANDFLASHC_BASE + 0x00, val | 0x3);	/* enable and reset CTL */
>> +	do {
>> +		val = R32(NANDFLASHC_BASE + 0x00);
>> +		if (val & (1<<1))
>> +			break;
>> +	} while (1);
>
> Potentially infinite loop?
>
> There were some similar instances below which had a t/o. Perhaps combine
> them all into a helper similar to the dram code's
> mctl_await_completion()?
>

Ok, I'll look into that.
>> +uint32_t ecc_errors = 0;
>> +
>> +/* read 0x400 bytes from real_addr to temp_buf */
>> +void nand_read_block(unsigned int real_addr, int syndrome)
>> +{
>> +	uint32_t val;
>> +	if (!initialized)
>> +		nand_init();
>> +
>> +	memset((void *)temp_buf, 0, 0x400); /* clear temp_buf */
>
> Can we not avoid going via this global temp_buf by setting DMAC_BASE +
> 0x308 to the correct address on each read?
>

I'll check this, I think I had problems with that, but if it works w/o
temp_buf on both SPL and main U-Boot builds, then I'll get rid of it.
> Ian.

-- 
Daniel Kochma?ski | Pozna?, Poland
;; aka jackdaniel

"Be the change that you wish to see in the world." - Mahatma Gandhi

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 5/5] nand: sunxi: And a20_nandread command utilizing spl nand read driver
  2015-05-05  9:17       ` Daniel Kochmański
@ 2015-05-05  9:45         ` Hans de Goede
  0 siblings, 0 replies; 26+ messages in thread
From: Hans de Goede @ 2015-05-05  9:45 UTC (permalink / raw)
  To: u-boot

Hi,

On 05-05-15 11:17, Daniel Kochma?ski wrote:
>
> Hans de Goede writes:
>
>> Hi,
>>
>> On 05/02/2015 04:26 PM, Ian Campbell wrote:
>>> On Wed, 2015-04-29 at 17:03 +0200, Daniel Kochma?ski wrote:
>>>> This patch adds a20_nandread command. It is simple function utilizing
>>>> function from SPL nand driver `nand_spl_load_image`.
>>>>
>>>> Usage: a20_nandread <address> <offset> <bytes>
>>>
>>> This stuff should really be integrated with cmd_nand.c rather than
>>> adding an adhoc SoC specific interface.
>>
>> I want to go even further and I see that this really needs to be integrated
>> with the blkdev code so that one can just do:
>>
>> ls nand 0:1
>>
>> And things will just work, these way we can also just have the standard
>> boot cmds from config_distro_bootcmd.h work rather then needing special
>> nand boot commands.
>>
>> Regards,
>>
>> Hans
>>
>
> It was more a convenient function then proper integration.

I understand but for upstream nand support we really want a proper solution,
note that I'm find with having the nand support being read only, but it
should really be integrated enough that things like:

ls nand 0:1

Will work.


> I'll look
> into that, but it may take time - I'm quite unfamiliar with U-Boot nand
> interface.

Thanks!

Regards,

Hans

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 3/5] nand: sunxi: Add secondary U-Boot offset on second syndrome partition
  2015-04-29 15:02 ` [U-Boot] [PATCH 3/5] nand: sunxi: Add secondary U-Boot offset on second syndrome partition Daniel Kochmański
  2015-05-02 14:24   ` Ian Campbell
@ 2015-05-05 14:21   ` Tim Harvey
  2015-05-05 14:34     ` Daniel Kochmański
  2015-05-18 23:10   ` Scott Wood
  2 siblings, 1 reply; 26+ messages in thread
From: Tim Harvey @ 2015-05-05 14:21 UTC (permalink / raw)
  To: u-boot

On Wed, Apr 29, 2015 at 8:02 AM, Daniel Kochma?ski
<dkochmanski@turtle-solutions.eu> wrote:
> Introduces CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS, pointing to backup
> U-Boot instance in nand memory. In case if first header doesn't match,
> tries to load bootloader from this offset. In case of both failing,
> hang() is called.
>
> Additionally define offset of backup U-boot for sunxi at start of
> second syndrome partition.
>
> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
> Cc: Ian Campbell <ijc@hellion.org.uk>
> Cc: Hans De Goede <hdegoede@redhat.com>
> ---
>
>  README                         |  4 ++++
>  common/spl/spl_nand.c          | 28 +++++++++++++++++++++++++---
>  include/configs/sunxi-common.h |  1 +
>  3 files changed, 30 insertions(+), 3 deletions(-)
>
> diff --git a/README b/README
> index ee65fdb..4ccf3cb 100644
> --- a/README
> +++ b/README
> @@ -3722,6 +3722,10 @@ FIT uImage format:
>                 CONFIG_SYS_NAND_U_BOOT_OFFS
>                 Location in NAND to read U-Boot from
>
> +               CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS
> +               Location in NAND to read backup U-Boot from, if first
> +               location doesn't contain valid image.
> +
>                 CONFIG_SYS_NAND_U_BOOT_DST
>                 Location in memory to load U-Boot to
>
> diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
> index 9d59fbb..7c44de1 100644
> --- a/common/spl/spl_nand.c
> +++ b/common/spl/spl_nand.c
> @@ -2,6 +2,9 @@
>   * Copyright (C) 2011
>   * Corscience GmbH & Co. KG - Simon Schwarz <schwarz@corscience.de>
>   *
> + * Copyright (C) 2015
> + * Turtle Solutions - Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
> + *
>   * SPDX-License-Identifier:    GPL-2.0+
>   */
>  #include <common.h>
> @@ -90,9 +93,28 @@ void spl_nand_load_image(void)
>         nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
>                             sizeof(*header), (void *)header);
>         spl_parse_image_header(header);
> -       nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
> -                           spl_image.size,
> -                           (void *)(unsigned long)spl_image.load_addr);
> +       if (header->ih_os == IH_OS_U_BOOT) {
> +               nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
> +                                   spl_image.size,
> +                                   (void *)(unsigned long)spl_image.load_addr);
> +               nand_deselect();
> +               return;
> +       }
> +       puts("U-boot header didn't match.\n");
> +#ifdef CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS
> +       puts("Trying to start backup u-boot now...\n");
> +       nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS,
> +                           sizeof(*header), (void *)header);
> +       spl_parse_image_header(header);
> +       if (header->ih_os == IH_OS_U_BOOT) {
> +               nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS,
> +                                   spl_image.size,
> +                                   (void *)(unsigned long)spl_image.load_addr);
> +               nand_deselect();
> +               return;
> +       }
> +#endif
> +       puts("No valid u-boot image found.\n");
>         nand_deselect();
>  }
>  #endif

Daniel,

Under what circumstances would header->ih_os not be IH_OS_U_BOOT? It
seems to me only if CONFIG_SYS_NAND_U_BOOT_OFFS pointed to the wrong
place but wouldn't this be a board configuration error?

Are you trying to put some redundancy in for detecting a corrupted
image? It seems to me that you would want to do more than check the
header type in that case.

Tim

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 3/5] nand: sunxi: Add secondary U-Boot offset on second syndrome partition
  2015-05-05 14:21   ` Tim Harvey
@ 2015-05-05 14:34     ` Daniel Kochmański
  0 siblings, 0 replies; 26+ messages in thread
From: Daniel Kochmański @ 2015-05-05 14:34 UTC (permalink / raw)
  To: u-boot


Hi,

Tim Harvey writes:

> On Wed, Apr 29, 2015 at 8:02 AM, Daniel Kochma?ski
> <dkochmanski@turtle-solutions.eu> wrote:
>> Introduces CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS, pointing to backup
>> U-Boot instance in nand memory. In case if first header doesn't match,
>> tries to load bootloader from this offset. In case of both failing,
>> hang() is called.
>>
>> Additionally define offset of backup U-boot for sunxi at start of
>> second syndrome partition.
>>
>> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
>> Cc: Ian Campbell <ijc@hellion.org.uk>
>> Cc: Hans De Goede <hdegoede@redhat.com>
>> ---
>>
>>  README                         |  4 ++++
>>  common/spl/spl_nand.c          | 28 +++++++++++++++++++++++++---
>>  include/configs/sunxi-common.h |  1 +
>>  3 files changed, 30 insertions(+), 3 deletions(-)
>>
>> diff --git a/README b/README
>> index ee65fdb..4ccf3cb 100644
>> --- a/README
>> +++ b/README
>> @@ -3722,6 +3722,10 @@ FIT uImage format:
>>                 CONFIG_SYS_NAND_U_BOOT_OFFS
>>                 Location in NAND to read U-Boot from
>>
>> +               CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS
>> +               Location in NAND to read backup U-Boot from, if first
>> +               location doesn't contain valid image.
>> +
>>                 CONFIG_SYS_NAND_U_BOOT_DST
>>                 Location in memory to load U-Boot to
>>
>> diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
>> index 9d59fbb..7c44de1 100644
>> --- a/common/spl/spl_nand.c
>> +++ b/common/spl/spl_nand.c
>> @@ -2,6 +2,9 @@
>>   * Copyright (C) 2011
>>   * Corscience GmbH & Co. KG - Simon Schwarz <schwarz@corscience.de>
>>   *
>> + * Copyright (C) 2015
>> + * Turtle Solutions - Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
>> + *
>>   * SPDX-License-Identifier:    GPL-2.0+
>>   */
>>  #include <common.h>
>> @@ -90,9 +93,28 @@ void spl_nand_load_image(void)
>>         nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
>>                             sizeof(*header), (void *)header);
>>         spl_parse_image_header(header);
>> -       nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
>> -                           spl_image.size,
>> -                           (void *)(unsigned long)spl_image.load_addr);
>> +       if (header->ih_os == IH_OS_U_BOOT) {
>> +               nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
>> +                                   spl_image.size,
>> +                                   (void *)(unsigned long)spl_image.load_addr);
>> +               nand_deselect();
>> +               return;
>> +       }
>> +       puts("U-boot header didn't match.\n");
>> +#ifdef CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS
>> +       puts("Trying to start backup u-boot now...\n");
>> +       nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS,
>> +                           sizeof(*header), (void *)header);
>> +       spl_parse_image_header(header);
>> +       if (header->ih_os == IH_OS_U_BOOT) {
>> +               nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS,
>> +                                   spl_image.size,
>> +                                   (void *)(unsigned long)spl_image.load_addr);
>> +               nand_deselect();
>> +               return;
>> +       }
>> +#endif
>> +       puts("No valid u-boot image found.\n");
>>         nand_deselect();
>>  }
>>  #endif
>
> Daniel,
>
> Under what circumstances would header->ih_os not be IH_OS_U_BOOT? It
> seems to me only if CONFIG_SYS_NAND_U_BOOT_OFFS pointed to the wrong
> place but wouldn't this be a board configuration error?

In case of sunxi boards so-called BROM when it reads bootloader from
NAND it tries to load it from first block of NAND, and if
header/checksum doesn't match, then it tries to read it from second one.
>
> Are you trying to put some redundancy in for detecting a corrupted
> image? It seems to me that you would want to do more than check the
> header type in that case.

SPL can't detect, from which offset it was loaded, therefore even if
image is correct and is placed on second block, it needs to check, if
something it reads is actual U-Boot. If not, then it is placed at second
one, and it should read U-Boot from second offset.
>
> Tim

-- 
Daniel Kochma?ski | Pozna?, Poland
;; aka jackdaniel

"Be the change that you wish to see in the world." - Mahatma Gandhi

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 1/5] nand: sunxi: change BLOCK_SIZE in mksunxiboot to match NAND block size
  2015-05-05  9:02     ` Daniel Kochmański
@ 2015-05-09 13:51       ` Ian Campbell
  0 siblings, 0 replies; 26+ messages in thread
From: Ian Campbell @ 2015-05-09 13:51 UTC (permalink / raw)
  To: u-boot

On Tue, 2015-05-05 at 11:02 +0200, Daniel Kochma?ski wrote:
> Ian Campbell writes:
> 
> > On Wed, 2015-04-29 at 17:02 +0200, Daniel Kochma?ski wrote:
> >> This change is necessary to calculate correct checksum for NAND
> >> boot. Works both for MMC and NAND. Without it BROM rejects boot image
> >> as invalid (bad checksum). (Changes block size from 0x200 to 0x2000).
> >
> > I'm inferring here that for MMC boot this checksum is ignored by the
> > BROM? If that is the case then I think it should be explicitly
> > mentioned.
> 
> It isn't ignored, just larger block is taken into checksum and put in
> header (which is read by BROM). I think, that in NAND case BROM just
> ignores length field in header, and calculates checksum for whole page
> (8KB), while on MMC it respects this field, hence 0x2000 works for
> both.

OK, please add an explanation along these lines to the commit message.

> I've tried to put garbage into checksum field, and MMC doesn't boot if
> checksum isn't correct.
> >
> > As well as the checksum this also changes the header's length field,
> > FWIW.
> >
> 
> Yes, this is true. Should I change it to set block size conditionally
> depending on defines - if it's SPL NAND boot, then use 0x2000, in other
> occasion use 0x200?

I don't think that is necessary assuming...

>  Whole `u-boot-sunxi-with-spl.bin` size doesn't
> increase tough (probably because of space between spl and proper
> u-boot).

... this is actually the case, then you could just say it in the commit
log.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory
  2015-05-05  9:19     ` Daniel Kochmański
@ 2015-05-09 13:53       ` Ian Campbell
  2015-05-09 14:33         ` Hans de Goede
  0 siblings, 1 reply; 26+ messages in thread
From: Ian Campbell @ 2015-05-09 13:53 UTC (permalink / raw)
  To: u-boot

On Tue, 2015-05-05 at 11:19 +0200, Daniel Kochma?ski wrote:
> (sorry for resending, used wrong mail here - not sure how mailing list
> will handle that).
> 
> Ian Campbell writes:
> 
> > On Wed, 2015-04-29 at 17:02 +0200, Daniel Kochma?ski wrote:
> >> diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
> >> index 88e3358..1a30684 100644
> >> --- a/board/sunxi/Kconfig
> >> +++ b/board/sunxi/Kconfig
> >> @@ -239,6 +239,18 @@ config MMC_SUNXI_SLOT_EXTRA
> >>  	slot or emmc on mmc1 - mmc3. Setting this to 1, 2 or 3 will enable
> >>  	support for this.
> >>  
> >> +config SPL_NAND_SUPPORT
> >> +	bool "SPL/NAND mode support"
> >> +	depends on SPL
> >> +	default n
> >> +	---help---
> >> +	  This enables support for booting from NAND internal
> >> +	  memory. U-Boot SPL doesn't detect where is it load from,
> >> +	  therefore this option is needed to properly load image from
> >> +	  flash. Option also disables MMC functionality on U-Boot due to
> >> +	  initialization errors encountered, when both controllers are
> >> +	  enabled.
> >
> > Is this last bit a bug in the s/w or a hardware thing? Does this mean
> > that MMC is not available in the main u-boot image too when NAND support
> > is enabled?
> >
> 
> I'm not sure what is a reason, but controller can't initialize MMC when
> SPL is loaded. MMC works in main u-boot allowing to boot from it and
> perform any other option (rescan, part, info, etc.). It is only SPL
> relevant.

How strange! Hans, do you have any ideas about why this might be the
case? Is there some overlap between MMC and NAND? I can't think what...

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory
  2015-05-09 13:53       ` Ian Campbell
@ 2015-05-09 14:33         ` Hans de Goede
  0 siblings, 0 replies; 26+ messages in thread
From: Hans de Goede @ 2015-05-09 14:33 UTC (permalink / raw)
  To: u-boot

Hi,

On 09-05-15 15:53, Ian Campbell wrote:
> On Tue, 2015-05-05 at 11:19 +0200, Daniel Kochma?ski wrote:
>> (sorry for resending, used wrong mail here - not sure how mailing list
>> will handle that).
>>
>> Ian Campbell writes:
>>
>>> On Wed, 2015-04-29 at 17:02 +0200, Daniel Kochma?ski wrote:
>>>> diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
>>>> index 88e3358..1a30684 100644
>>>> --- a/board/sunxi/Kconfig
>>>> +++ b/board/sunxi/Kconfig
>>>> @@ -239,6 +239,18 @@ config MMC_SUNXI_SLOT_EXTRA
>>>>   	slot or emmc on mmc1 - mmc3. Setting this to 1, 2 or 3 will enable
>>>>   	support for this.
>>>>
>>>> +config SPL_NAND_SUPPORT
>>>> +	bool "SPL/NAND mode support"
>>>> +	depends on SPL
>>>> +	default n
>>>> +	---help---
>>>> +	  This enables support for booting from NAND internal
>>>> +	  memory. U-Boot SPL doesn't detect where is it load from,
>>>> +	  therefore this option is needed to properly load image from
>>>> +	  flash. Option also disables MMC functionality on U-Boot due to
>>>> +	  initialization errors encountered, when both controllers are
>>>> +	  enabled.
>>>
>>> Is this last bit a bug in the s/w or a hardware thing? Does this mean
>>> that MMC is not available in the main u-boot image too when NAND support
>>> is enabled?
>>>
>>
>> I'm not sure what is a reason, but controller can't initialize MMC when
>> SPL is loaded. MMC works in main u-boot allowing to boot from it and
>> perform any other option (rescan, part, info, etc.). It is only SPL
>> relevant.
>
> How strange! Hans, do you have any ideas about why this might be the
> case? Is there some overlap between MMC and NAND? I can't think what...

Nope, I've no clue, things should work with both build-in, first thing
which comes to mind is that we're running out of stack space / internal
sram.

Second thing is, how did you test the SPL code with both build-in ? Did you
boot from MMC or from NAND? It could be that the MMC code relies on some
MMC setup done by the BROM, so that it will not work when booting from NAND.

Regards,

Hans

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 3/5] nand: sunxi: Add secondary U-Boot offset on second syndrome partition
  2015-04-29 15:02 ` [U-Boot] [PATCH 3/5] nand: sunxi: Add secondary U-Boot offset on second syndrome partition Daniel Kochmański
  2015-05-02 14:24   ` Ian Campbell
  2015-05-05 14:21   ` Tim Harvey
@ 2015-05-18 23:10   ` Scott Wood
  2 siblings, 0 replies; 26+ messages in thread
From: Scott Wood @ 2015-05-18 23:10 UTC (permalink / raw)
  To: u-boot

On Wed, 2015-04-29 at 17:02 +0200, Daniel Kochma?ski wrote:
> diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
> index 9d59fbb..7c44de1 100644
> --- a/common/spl/spl_nand.c
> +++ b/common/spl/spl_nand.c
> @@ -2,6 +2,9 @@
>   * Copyright (C) 2011
>   * Corscience GmbH & Co. KG - Simon Schwarz <schwarz@corscience.de>
>   *
> + * Copyright (C) 2015
> + * Turtle Solutions - Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
> + *
>   * SPDX-License-Identifier:	GPL-2.0+
>   */
>  #include <common.h>
> @@ -90,9 +93,28 @@ void spl_nand_load_image(void)
>  	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
>  			    sizeof(*header), (void *)header);
>  	spl_parse_image_header(header);
> -	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
> -			    spl_image.size,
> -			    (void *)(unsigned long)spl_image.load_addr);
> +	if (header->ih_os == IH_OS_U_BOOT) {
> +		nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
> +				    spl_image.size,
> +				    (void *)(unsigned long)spl_image.load_addr);
> +		nand_deselect();
> +		return;
> +	}
> +	puts("U-boot header didn't match.\n");
> +#ifdef CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS
> +	puts("Trying to start backup u-boot now...\n");
> +	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS,
> +			    sizeof(*header), (void *)header);
> +	spl_parse_image_header(header);
> +	if (header->ih_os == IH_OS_U_BOOT) {
> +		nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_BACKUP_OFFS,
> +				    spl_image.size,
> +				    (void *)(unsigned long)spl_image.load_addr);
> +		nand_deselect();
> +		return;
> +	}
> +#endif

Factor this code into a function that is called twice rather than
repeating everything.

-Scott

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 4/5] nand: sunxi: Add multiimage preload option
  2015-04-29 15:03 ` [U-Boot] [PATCH 4/5] nand: sunxi: Add multiimage preload option Daniel Kochmański
  2015-05-02 14:24   ` Ian Campbell
@ 2015-05-18 23:43   ` Scott Wood
  1 sibling, 0 replies; 26+ messages in thread
From: Scott Wood @ 2015-05-18 23:43 UTC (permalink / raw)
  To: u-boot

On Wed, 2015-04-29 at 17:03 +0200, Daniel Kochma?ski wrote:
> Patch adds support in spl_nand for preloading multiimage before
> loading u-boot into memory. It might be used in example to put in
> memory single image containing boot script, kernel and device
> tree.

Why can't the main U-Boot load it?

> Behavior is triggered, if CONFIG_SPL_NAND_MULTI_PRELOAD is defined -
> multiimage is loaded from CONFIG_SYS_NAND_MULTI_OFFS to address
> specified on image creation.
> 
> Additionally defines it in sunxi-common.h conditionally when
> CONFIG_SPL_NAND_SUPPORT is enabled. SPL tries to preload image from
> beginning of non-syndrome area.
> 
> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
> Cc: Ian Campbell <ijc@hellion.org.uk>
> Cc: Hans De Goede <hdegoede@redhat.com>
> ---
> 
>  README                         |  6 ++++++
>  common/spl/spl_nand.c          | 14 ++++++++++++++
>  include/configs/sunxi-common.h |  2 ++
>  3 files changed, 22 insertions(+)
> 
> diff --git a/README b/README
> index 4ccf3cb..444b02f 100644
> --- a/README
> +++ b/README
> @@ -3719,6 +3719,9 @@ FIT uImage format:
>  		CONFIG_SPL_NAND_BOOT
>  		Add support NAND boot
>  
> +		CONFIG_SPL_NAND_MULTI_PRELOAD
> +		Preload multiimage from predefined offset in NAND.

Why is this not implied by CONFIG_SYS_NAND_MULTI_OFFS not being defined?

> +
>  		CONFIG_SYS_NAND_U_BOOT_OFFS
>  		Location in NAND to read U-Boot from
>  
> @@ -3735,6 +3738,9 @@ FIT uImage format:
>  		CONFIG_SYS_NAND_U_BOOT_START
>  		Entry point in loaded image to jump to
>  
> +		CONFIG_SYS_NAND_MULTI_OFFS
> +		Location in NAND to read multiimage from.

Why SYS and not SPL?  Why not using kconfig?

> +
>  		CONFIG_SYS_NAND_HW_ECC_OOBFIRST
>  		Define this if you need to first read the OOB and then the
>  		data. This is used, for example, on davinci platforms.
> diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
> index 7c44de1..f87db0a 100644
> --- a/common/spl/spl_nand.c
> +++ b/common/spl/spl_nand.c
> @@ -89,6 +89,20 @@ void spl_nand_load_image(void)
>  			    (void *)spl_image.load_addr);
>  #endif
>  #endif
> +#ifdef CONFIG_SPL_NAND_MULTI_PRELOAD
> +	/* Load multiimage */
> +	puts("Preloading multiimage.\n");

This function isn't this verbose for any of the other images...

-Scott

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory
  2015-04-29 15:02 ` [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory Daniel Kochmański
  2015-05-02 14:21   ` Ian Campbell
@ 2015-05-18 23:47   ` Scott Wood
  1 sibling, 0 replies; 26+ messages in thread
From: Scott Wood @ 2015-05-18 23:47 UTC (permalink / raw)
  To: u-boot

On Wed, 2015-04-29 at 17:02 +0200, Daniel Kochma?ski wrote:
> Adds minimal DMA NAND driver for booting from NAND internal
> memory. New config option SPL_NAND_SUPPORT is created for sunxi board,
> which enables introduced driver and sets ENV_IS_NOWHERE (instead of
> ENV_IS_IN_MMC).
> 
> NAND driver utilizes DMA interface to flash controller, which supports
> randomization. Reading from both syndrome and non-syndrom partitions
> is supported. Writing to flash isn't implemented for time being.
> 
> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
> Cc: Ian Campbell <ijc@hellion.org.uk>
> Cc: Hans De Goede <hdegoede@redhat.com>
> ---
> 
>  arch/arm/cpu/armv7/sunxi/board.c |  12 ++-
>  board/sunxi/Kconfig              |  12 +++
>  board/sunxi/Makefile             |   1 +
>  board/sunxi/nand.c               | 219 +++++++++++++++++++++++++++++++++++++++
>  common/spl/spl_nand.c            |  13 +--
>  include/configs/sunxi-common.h   |   9 ++
>  6 files changed, 258 insertions(+), 8 deletions(-)
>  create mode 100644 board/sunxi/nand.c

NAND drivers go in drivers/mtd/nand (with "spl" in the name since it's
an SPL driver).

-Scott

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [U-Boot] [PATCH 5/5] nand: sunxi: And a20_nandread command utilizing spl nand read driver
  2015-04-29 15:03 ` [U-Boot] [PATCH 5/5] nand: sunxi: And a20_nandread command utilizing spl nand read driver Daniel Kochmański
  2015-05-02 14:26   ` Ian Campbell
@ 2015-05-18 23:52   ` Scott Wood
  1 sibling, 0 replies; 26+ messages in thread
From: Scott Wood @ 2015-05-18 23:52 UTC (permalink / raw)
  To: u-boot

On Wed, 2015-04-29 at 17:03 +0200, Daniel Kochma?ski wrote:
> This patch adds a20_nandread command. It is simple function utilizing
> function from SPL nand driver `nand_spl_load_image`.
> 
> Usage: a20_nandread <address> <offset> <bytes>
> 
> Signed-off-by: Daniel Kochma?ski <dkochmanski@turtle-solutions.eu>
> Cc: Ian Campbell <ijc@hellion.org.uk>
> Cc: Hans De Goede <hdegoede@redhat.com>
> ---
> 
>  common/Kconfig            |  7 +++++++
>  common/Makefile           |  1 +
>  common/cmd_a20_nandread.c | 27 +++++++++++++++++++++++++++
>  3 files changed, 35 insertions(+)
>  create mode 100644 common/cmd_a20_nandread.c

Obviously a real NAND driver would be preferred (even if some
functionality is missing at first), but if for some reason we do need to
support simple read-only access using SPL code in the main U-Boot, what
is a20-specific about this file beyond the use case?

-Scott

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2015-05-18 23:52 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-29 15:02 [U-Boot] [PATCH 0/5] nand: sunxi: Add SPL support for booting from NAND Daniel Kochmański
2015-04-29 15:02 ` [U-Boot] [PATCH 1/5] nand: sunxi: change BLOCK_SIZE in mksunxiboot to match NAND block size Daniel Kochmański
2015-05-02 14:08   ` Ian Campbell
2015-05-05  9:02     ` Daniel Kochmański
2015-05-09 13:51       ` Ian Campbell
2015-04-29 15:02 ` [U-Boot] [PATCH 2/5] nand: sunxi: Add support for booting from internal NAND memory Daniel Kochmański
2015-05-02 14:21   ` Ian Campbell
2015-05-05  9:14     ` Daniel Kochmański
2015-05-05  9:19     ` Daniel Kochmański
2015-05-09 13:53       ` Ian Campbell
2015-05-09 14:33         ` Hans de Goede
2015-05-18 23:47   ` Scott Wood
2015-04-29 15:02 ` [U-Boot] [PATCH 3/5] nand: sunxi: Add secondary U-Boot offset on second syndrome partition Daniel Kochmański
2015-05-02 14:24   ` Ian Campbell
2015-05-05 14:21   ` Tim Harvey
2015-05-05 14:34     ` Daniel Kochmański
2015-05-18 23:10   ` Scott Wood
2015-04-29 15:03 ` [U-Boot] [PATCH 4/5] nand: sunxi: Add multiimage preload option Daniel Kochmański
2015-05-02 14:24   ` Ian Campbell
2015-05-18 23:43   ` Scott Wood
2015-04-29 15:03 ` [U-Boot] [PATCH 5/5] nand: sunxi: And a20_nandread command utilizing spl nand read driver Daniel Kochmański
2015-05-02 14:26   ` Ian Campbell
2015-05-04 14:20     ` Hans de Goede
2015-05-05  9:17       ` Daniel Kochmański
2015-05-05  9:45         ` Hans de Goede
2015-05-18 23:52   ` Scott Wood

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.