summaryrefslogtreecommitdiff
path: root/src/drivers/spi
diff options
context:
space:
mode:
authorKyösti Mälkki <kyosti.malkki@gmail.com>2014-06-29 16:17:33 +0300
committerKyösti Mälkki <kyosti.malkki@gmail.com>2014-07-14 19:42:49 +0200
commit1110495de926db4b21b9969da522e5270c67f115 (patch)
tree04a04b6e797173c1b3639a4c4ecb90c544ab84ab /src/drivers/spi
parent77d1280d0c866a9f85e62f74c43fe8d021a4ff39 (diff)
downloadcoreboot-1110495de926db4b21b9969da522e5270c67f115.tar.xz
SPI: Split writes using spi_crop_chunk()
SPI controllers in Intel and AMD bridges have a slightly different restriction on how long transactions they can handle. Change-Id: I3d149d4b7e7e9633482a153d5e380a86c553d871 Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: http://review.coreboot.org/6163 Tested-by: build bot (Jenkins) Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
Diffstat (limited to 'src/drivers/spi')
-rw-r--r--src/drivers/spi/adesto.c4
-rw-r--r--src/drivers/spi/amic.c4
-rw-r--r--src/drivers/spi/gigadevice.c4
-rw-r--r--src/drivers/spi/macronix.c5
-rw-r--r--src/drivers/spi/stmicro.c4
-rw-r--r--src/drivers/spi/winbond.c4
6 files changed, 12 insertions, 13 deletions
diff --git a/src/drivers/spi/adesto.c b/src/drivers/spi/adesto.c
index 9dc8e14546..50e58839a1 100644
--- a/src/drivers/spi/adesto.c
+++ b/src/drivers/spi/adesto.c
@@ -100,7 +100,7 @@ static int adesto_write(struct spi_flash *flash,
for (actual = 0; actual < len; actual += chunk_len) {
chunk_len = min(len - actual, page_size - byte_addr);
- chunk_len = min(chunk_len, CONTROLLER_PAGE_LIMIT);
+ chunk_len = spi_crop_chunk(sizeof(cmd), chunk_len);
cmd[0] = CMD_AT25DF_PP;
cmd[1] = (offset >> 16) & 0xff;
@@ -118,7 +118,7 @@ static int adesto_write(struct spi_flash *flash,
goto out;
}
- ret = spi_flash_cmd_write(flash->spi, cmd, 4,
+ ret = spi_flash_cmd_write(flash->spi, cmd, sizeof(cmd),
buf + actual, chunk_len);
if (ret < 0) {
printk(BIOS_WARNING, "SF: adesto Page Program failed\n");
diff --git a/src/drivers/spi/amic.c b/src/drivers/spi/amic.c
index 4cccc71197..63a68a5309 100644
--- a/src/drivers/spi/amic.c
+++ b/src/drivers/spi/amic.c
@@ -82,7 +82,7 @@ static int amic_write(struct spi_flash *flash,
for (actual = 0; actual < len; actual += chunk_len) {
chunk_len = min(len - actual, page_size - byte_addr);
- chunk_len = min(chunk_len, CONTROLLER_PAGE_LIMIT);
+ chunk_len = spi_crop_chunk(sizeof(cmd), chunk_len);
cmd[0] = CMD_A25_PP;
cmd[1] = (offset >> 16) & 0xff;
@@ -100,7 +100,7 @@ static int amic_write(struct spi_flash *flash,
goto out;
}
- ret = spi_flash_cmd_write(flash->spi, cmd, 4,
+ ret = spi_flash_cmd_write(flash->spi, cmd, sizeof(cmd),
buf + actual, chunk_len);
if (ret < 0) {
printk(BIOS_WARNING, "SF: AMIC Page Program failed\n");
diff --git a/src/drivers/spi/gigadevice.c b/src/drivers/spi/gigadevice.c
index 3fb89c7fc5..783d321566 100644
--- a/src/drivers/spi/gigadevice.c
+++ b/src/drivers/spi/gigadevice.c
@@ -141,7 +141,7 @@ static int gigadevice_write(struct spi_flash *flash, u32 offset,
for (actual = 0; actual < len; actual += chunk_len) {
chunk_len = min(len - actual, page_size - byte_addr);
- chunk_len = min(chunk_len, CONTROLLER_PAGE_LIMIT);
+ chunk_len = spi_crop_chunk(sizeof(cmd), chunk_len);
ret = spi_flash_cmd(flash->spi, CMD_GD25_WREN, NULL, 0);
if (ret < 0) {
@@ -161,7 +161,7 @@ static int gigadevice_write(struct spi_flash *flash, u32 offset,
cmd[0], cmd[1], cmd[2], cmd[3], chunk_len);
#endif
- ret = spi_flash_cmd_write(flash->spi, cmd, 4,
+ ret = spi_flash_cmd_write(flash->spi, cmd, sizeof(cmd),
buf + actual, chunk_len);
if (ret < 0) {
printk(BIOS_WARNING,
diff --git a/src/drivers/spi/macronix.c b/src/drivers/spi/macronix.c
index 3611599065..6e910f6b91 100644
--- a/src/drivers/spi/macronix.c
+++ b/src/drivers/spi/macronix.c
@@ -144,13 +144,12 @@ static int macronix_write(struct spi_flash *flash,
ret = 0;
for (actual = 0; actual < len; actual += chunk_len) {
chunk_len = min(len - actual, page_size - byte_addr);
- chunk_len = min(chunk_len, CONTROLLER_PAGE_LIMIT);
+ chunk_len = spi_crop_chunk(sizeof(cmd), chunk_len);
cmd[0] = CMD_MX25XX_PP;
cmd[1] = (offset >> 16) & 0xff;
cmd[2] = (offset >> 8) & 0xff;
cmd[3] = offset & 0xff;
-
#if CONFIG_DEBUG_SPI_FLASH
printk(BIOS_SPEW, "PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x }"
" chunk_len = %zu\n",
@@ -163,7 +162,7 @@ static int macronix_write(struct spi_flash *flash,
break;
}
- ret = spi_flash_cmd_write(flash->spi, cmd, 4,
+ ret = spi_flash_cmd_write(flash->spi, cmd, sizeof(cmd),
buf + actual, chunk_len);
if (ret < 0) {
printk(BIOS_WARNING, "SF: Macronix Page Program failed\n");
diff --git a/src/drivers/spi/stmicro.c b/src/drivers/spi/stmicro.c
index c825bd083b..bc7969d138 100644
--- a/src/drivers/spi/stmicro.c
+++ b/src/drivers/spi/stmicro.c
@@ -155,7 +155,7 @@ static int stmicro_write(struct spi_flash *flash,
for (actual = 0; actual < len; actual += chunk_len) {
chunk_len = min(len - actual, page_size - byte_addr);
- chunk_len = min(chunk_len, CONTROLLER_PAGE_LIMIT);
+ chunk_len = spi_crop_chunk(sizeof(cmd), chunk_len);
cmd[0] = CMD_M25PXX_PP;
cmd[1] = (offset >> 16) & 0xff;
@@ -173,7 +173,7 @@ static int stmicro_write(struct spi_flash *flash,
goto out;
}
- ret = spi_flash_cmd_write(flash->spi, cmd, 4,
+ ret = spi_flash_cmd_write(flash->spi, cmd, sizeof(cmd),
buf + actual, chunk_len);
if (ret < 0) {
printk(BIOS_WARNING, "SF: STMicro Page Program failed\n");
diff --git a/src/drivers/spi/winbond.c b/src/drivers/spi/winbond.c
index eb0868ec7a..7ddd312616 100644
--- a/src/drivers/spi/winbond.c
+++ b/src/drivers/spi/winbond.c
@@ -134,7 +134,7 @@ static int winbond_write(struct spi_flash *flash,
for (actual = 0; actual < len; actual += chunk_len) {
chunk_len = min(len - actual, page_size - byte_addr);
- chunk_len = min(chunk_len, CONTROLLER_PAGE_LIMIT);
+ chunk_len = spi_crop_chunk(sizeof(cmd), chunk_len);
cmd[0] = CMD_W25_PP;
cmd[1] = (offset >> 16) & 0xff;
@@ -152,7 +152,7 @@ static int winbond_write(struct spi_flash *flash,
goto out;
}
- ret = spi_flash_cmd_write(flash->spi, cmd, 4,
+ ret = spi_flash_cmd_write(flash->spi, cmd, sizeof(cmd),
buf + actual, chunk_len);
if (ret < 0) {
printk(BIOS_WARNING, "SF: Winbond Page Program failed\n");