sf: Update sf read to support all sizes of flashes
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>
This commit is contained in:
parent
e3ff9d51ec
commit
fc207ee4db
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user