[coreboot-gerrit] Patch set updated for coreboot: d072b8a SPI flash: Fix alignment checks in Page Program commands

Kyösti Mälkki (kyosti.malkki@gmail.com) gerrit at coreboot.org
Mon Jun 30 12:26:24 CEST 2014


Kyösti Mälkki (kyosti.malkki at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/6162

-gerrit

commit d072b8a4bb6b19bb9400dfd3723d5a8078dc9937
Author: Kyösti Mälkki <kyosti.malkki at gmail.com>
Date:   Sun Jun 29 16:15:39 2014 +0300

    SPI flash: Fix alignment checks in Page Program commands
    
    There are two separate restrictions to take into account:
    
      Page Program command must not cross address boundaries defined by the
      flash part's page size.
    
      Total number of bytes for any command sent to flash part is restricted
      by the SPI controller capabilities.
    
    Consider
    
      CONTROLLER_PAGE_LIMIT=64, page_size=256, offset=62, len=4.
      This write would be split at offset 64 for no reason.
    
    Consider
    
      CONTROLLER_PAGE_LIMIT=40, page_size=256, offset=254, len=4.
      This write would not be split at page boundary as required.
    
    We do not really hit the second case. Nevertheless, CONTROLLER_PAGE_LIMIT
    is a misnomer for the maximum payload length supported by the SPI controller
    and is removed in a followup.
    
    Change-Id: I727f2e7de86a91b6a509460ff1f374acd006a0bc
    Signed-off-by: Kyösti Mälkki <kyosti.malkki at gmail.com>
---
 src/drivers/spi/adesto.c     | 3 ++-
 src/drivers/spi/amic.c       | 3 ++-
 src/drivers/spi/gigadevice.c | 3 ++-
 src/drivers/spi/macronix.c   | 3 ++-
 src/drivers/spi/stmicro.c    | 3 ++-
 src/drivers/spi/winbond.c    | 3 ++-
 6 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/src/drivers/spi/adesto.c b/src/drivers/spi/adesto.c
index 83be8b8..9dc8e14 100644
--- a/src/drivers/spi/adesto.c
+++ b/src/drivers/spi/adesto.c
@@ -88,7 +88,7 @@ static int adesto_write(struct spi_flash *flash,
 	int ret;
 	u8 cmd[4];
 
-	page_size = min(1 << stm->params->l2_page_size, CONTROLLER_PAGE_LIMIT);
+	page_size = 1 << stm->params->l2_page_size;
 	byte_addr = offset % page_size;
 
 	flash->spi->rw = SPI_WRITE_FLAG;
@@ -100,6 +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);
 
 		cmd[0] = CMD_AT25DF_PP;
 		cmd[1] = (offset >> 16) & 0xff;
diff --git a/src/drivers/spi/amic.c b/src/drivers/spi/amic.c
index fa17036..4cccc71 100644
--- a/src/drivers/spi/amic.c
+++ b/src/drivers/spi/amic.c
@@ -70,7 +70,7 @@ static int amic_write(struct spi_flash *flash,
 	int ret;
 	u8 cmd[4];
 
-	page_size = min(1 << amic->params->l2_page_size, CONTROLLER_PAGE_LIMIT);
+	page_size = 1 << amic->params->l2_page_size;
 	byte_addr = offset % page_size;
 
 	flash->spi->rw = SPI_WRITE_FLAG;
@@ -82,6 +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);
 
 		cmd[0] = CMD_A25_PP;
 		cmd[1] = (offset >> 16) & 0xff;
diff --git a/src/drivers/spi/gigadevice.c b/src/drivers/spi/gigadevice.c
index 5a8f82f..3fb89c7 100644
--- a/src/drivers/spi/gigadevice.c
+++ b/src/drivers/spi/gigadevice.c
@@ -128,7 +128,7 @@ static int gigadevice_write(struct spi_flash *flash, u32 offset,
 	int ret;
 	u8 cmd[4];
 
-	page_size = min(1 << stm->params->l2_page_size, CONTROLLER_PAGE_LIMIT);
+	page_size = 1 << stm->params->l2_page_size;
 	byte_addr = offset % page_size;
 
 	flash->spi->rw = SPI_WRITE_FLAG;
@@ -141,6 +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);
 
 		ret = spi_flash_cmd(flash->spi, CMD_GD25_WREN, NULL, 0);
 		if (ret < 0) {
diff --git a/src/drivers/spi/macronix.c b/src/drivers/spi/macronix.c
index bbc3704..3611599 100644
--- a/src/drivers/spi/macronix.c
+++ b/src/drivers/spi/macronix.c
@@ -131,7 +131,7 @@ static int macronix_write(struct spi_flash *flash,
 	int ret;
 	u8 cmd[4];
 
-	page_size = min(mcx->params->page_size, CONTROLLER_PAGE_LIMIT);
+	page_size = mcx->params->page_size;
 	byte_addr = offset % page_size;
 
 	flash->spi->rw = SPI_WRITE_FLAG;
@@ -144,6 +144,7 @@ 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);
 
 		cmd[0] = CMD_MX25XX_PP;
 		cmd[1] = (offset >> 16) & 0xff;
diff --git a/src/drivers/spi/stmicro.c b/src/drivers/spi/stmicro.c
index af23853..c825bd0 100644
--- a/src/drivers/spi/stmicro.c
+++ b/src/drivers/spi/stmicro.c
@@ -143,7 +143,7 @@ static int stmicro_write(struct spi_flash *flash,
 	int ret;
 	u8 cmd[4];
 
-	page_size = min(stm->params->page_size, CONTROLLER_PAGE_LIMIT);
+	page_size = stm->params->page_size;
 	byte_addr = offset % page_size;
 
 	flash->spi->rw = SPI_WRITE_FLAG;
@@ -155,6 +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);
 
 		cmd[0] = CMD_M25PXX_PP;
 		cmd[1] = (offset >> 16) & 0xff;
diff --git a/src/drivers/spi/winbond.c b/src/drivers/spi/winbond.c
index 52c7b61..eb0868e 100644
--- a/src/drivers/spi/winbond.c
+++ b/src/drivers/spi/winbond.c
@@ -122,7 +122,7 @@ static int winbond_write(struct spi_flash *flash,
 	int ret;
 	u8 cmd[4];
 
-	page_size = min(1 << stm->params->l2_page_size, CONTROLLER_PAGE_LIMIT);
+	page_size = 1 << stm->params->l2_page_size;
 	byte_addr = offset % page_size;
 
 	flash->spi->rw = SPI_WRITE_FLAG;
@@ -134,6 +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);
 
 		cmd[0] = CMD_W25_PP;
 		cmd[1] = (offset >> 16) & 0xff;



More information about the coreboot-gerrit mailing list