From 77d1280d0c866a9f85e62f74c43fe8d021a4ff39 Mon Sep 17 00:00:00 2001 From: Kyösti Mälkki Date: Sun, 29 Jun 2014 16:15:39 +0300 Subject: SPI flash: Fix alignment checks in Page Program commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-on: http://review.coreboot.org/6162 Tested-by: build bot (Jenkins) Reviewed-by: Edward O'Callaghan --- src/drivers/spi/winbond.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/drivers/spi/winbond.c') diff --git a/src/drivers/spi/winbond.c b/src/drivers/spi/winbond.c index 52c7b61245..eb0868ec7a 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; -- cgit v1.2.3