Patchwork [U-Boot,v4,05/14] sf: Update sf read to support all sizes of flashes

login
register
mail settings
Submitter Jagannadha Sutradharudu Teki
Date June 13, 2013, 8:55 p.m.
Message ID <2712da24-4734-4b7c-bc21-6d59c868cbf3@CO9EHSMHS031.ehs.local>
Download mbox | patch
Permalink /patch/251161/
State Superseded
Delegated to: Jagannadha Sutradharudu Teki
Headers show

Comments

Jagannadha Sutradharudu Teki - June 13, 2013, 8:55 p.m.
This patch updated the spi_flash read func to support all
sizes of flashes using bank reg addr facility.

The same support has been added in below patch for erase/write
spi_flash functions:
"sf: Support all sizes of flashes using bank addr reg facility"
(sha1: c956f600cbb0943d0afe1004cdb503f4fcd8f415)

With these new updates on sf framework, the flashes which has < 16MB
are not effected as per as performance is concern and but the
u-boot.bin size incrased ~460 bytes.

sf update(for first 16MBytes), Changes before:
U-Boot> sf update 0x1000000 0x0 0x1000000
- N25Q256
  16777216 bytes written, 0 bytes skipped in 199.72s, speed 86480 B/s
- W25Q128BV
  16777216 bytes written, 0 bytes skipped in 351.739s, speed 48913 B/s
- S25FL256S_64K
  16777216 bytes written, 0 bytes skipped in 65.659s, speed 262144 B/s

sf update(for first 16MBytes), Changes before:
U-Boot> sf update 0x1000000 0x0 0x1000000
- N25Q256
  16777216 bytes written, 0 bytes skipped in 198.953s, speed 86480 B/s
- W25Q128BV
  16777216 bytes written, 0 bytes skipped in 350.90s, speed 49200 B/s
- S25FL256S_64K
  16777216 bytes written, 0 bytes skipped in 66.521s, speed 262144 B/s

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
Changes for v4:
	- none 
Changes for v3:
	- none
Changes for v2:
	- none

 drivers/mtd/spi/spi_flash.c | 36 +++++++++++++++++++++++++++++++++---
 1 file changed, 33 insertions(+), 3 deletions(-)
Simon Glass - June 19, 2013, 4:29 a.m.
Hi Jagan,

On Thu, Jun 13, 2013 at 1:55 PM, Jagannadha Sutradharudu Teki <
jagannadha.sutradharudu-teki@xilinx.com> wrote:

> This patch updated the spi_flash read func to support all
> sizes of flashes using bank reg addr facility.
>
> The same support has been added in below patch for erase/write
> spi_flash functions:
> "sf: Support all sizes of flashes using bank addr reg facility"
> (sha1: c956f600cbb0943d0afe1004cdb503f4fcd8f415)
>
> With these new updates on sf framework, the flashes which has < 16MB
> are not effected as per as performance is concern and but the
> u-boot.bin size incrased ~460 bytes.
>
> sf update(for first 16MBytes), Changes before:
> U-Boot> sf update 0x1000000 0x0 0x1000000
> - N25Q256
>   16777216 bytes written, 0 bytes skipped in 199.72s, speed 86480 B/s
> - W25Q128BV
>   16777216 bytes written, 0 bytes skipped in 351.739s, speed 48913 B/s
> - S25FL256S_64K
>   16777216 bytes written, 0 bytes skipped in 65.659s, speed 262144 B/s
>
> sf update(for first 16MBytes), Changes before:
> U-Boot> sf update 0x1000000 0x0 0x1000000
> - N25Q256
>   16777216 bytes written, 0 bytes skipped in 198.953s, speed 86480 B/s
> - W25Q128BV
>   16777216 bytes written, 0 bytes skipped in 350.90s, speed 49200 B/s
> - S25FL256S_64K
>   16777216 bytes written, 0 bytes skipped in 66.521s, speed 262144 B/s
>

FYI you can also use 'sf test' to get performance numbers.

Regards,
Simon

Patch

diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
index a6c5d83..7e987a0 100644
--- a/drivers/mtd/spi/spi_flash.c
+++ b/drivers/mtd/spi/spi_flash.c
@@ -148,7 +148,9 @@  int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,
 int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
 		size_t len, void *data)
 {
-	u8 cmd[5];
+	u8 cmd[5], bank_sel;
+	u32 remain_len, read_len;
+	int ret = -1;
 
 	/* Handle memory-mapped SPI */
 	if (flash->memory_map) {
@@ -157,10 +159,38 @@  int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
 	}
 
 	cmd[0] = CMD_READ_ARRAY_FAST;
-	spi_flash_addr(offset, cmd);
 	cmd[4] = 0x00;
 
-	return spi_flash_read_common(flash, cmd, sizeof(cmd), data, len);
+	while (len) {
+		bank_sel = offset / SPI_FLASH_16MB_BOUN;
+
+		ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
+		if (ret) {
+			debug("SF: fail to set bank%d\n", bank_sel);
+			return ret;
+		}
+
+		remain_len = (SPI_FLASH_16MB_BOUN * (bank_sel + 1) - offset);
+		if (len < remain_len)
+			read_len = len;
+		else
+			read_len = remain_len;
+
+		spi_flash_addr(offset, cmd);
+
+		ret = spi_flash_read_common(flash, cmd, sizeof(cmd),
+							data, read_len);
+		if (ret < 0) {
+			debug("SF: read failed\n");
+			break;
+		}
+
+		offset += read_len;
+		len -= read_len;
+		data += read_len;
+	}
+
+	return ret;
 }
 
 int spi_flash_cmd_poll_bit(struct spi_flash *flash, unsigned long timeout,