Check result of all SPI erase functions. Since block erase functions do not know the block length (it's not specified in any standard), block erase functions now get an additional parameter blocklen. This enables flashrom to verify the erase result for block erase functions at correct boundaries.
Unchecked erase is bad and can lead to problems nobody can understand.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Index: flashrom-spi_verify_erase/flash.h =================================================================== --- flashrom-spi_verify_erase/flash.h (Revision 618) +++ flashrom-spi_verify_erase/flash.h (Arbeitskopie) @@ -424,8 +424,11 @@ int spi_chip_erase_c7(struct flashchip *flash); int spi_chip_erase_60_c7(struct flashchip *flash); int spi_chip_erase_d8(struct flashchip *flash); -int spi_block_erase_52(const struct flashchip *flash, unsigned long addr); -int spi_block_erase_d8(const struct flashchip *flash, unsigned long addr); +int spi_block_erase_20(struct flashchip *flash, unsigned int addr, unsigned int blocklen); +int spi_block_erase_52(struct flashchip *flash, unsigned int addr, unsigned int blocklen); +int spi_block_erase_d8(struct flashchip *flash, unsigned int addr, unsigned int blocklen); +int spi_block_erase_60(struct flashchip *flash, unsigned int addr, unsigned int blocklen); +int spi_block_erase_c7(struct flashchip *flash, unsigned int addr, unsigned int blocklen); int spi_chip_write_1(struct flashchip *flash, uint8_t *buf); int spi_chip_write_256(struct flashchip *flash, uint8_t *buf); int spi_chip_read(struct flashchip *flash, uint8_t *buf, int start, int len); Index: flashrom-spi_verify_erase/spi.c =================================================================== --- flashrom-spi_verify_erase/spi.c (Revision 618) +++ flashrom-spi_verify_erase/spi.c (Arbeitskopie) @@ -1,7 +1,7 @@ /* * This file is part of the flashrom project. * - * Copyright (C) 2007, 2008 Carl-Daniel Hailfinger + * Copyright (C) 2007, 2008, 2009 Carl-Daniel Hailfinger * Copyright (C) 2008 coresystems GmbH * * This program is free software; you can redistribute it and/or modify @@ -430,6 +430,10 @@ /* FIXME: We assume spi_read_status_register will never fail. */ while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) programmer_delay(1000 * 1000); + if (check_erased_range(flash, 0, flash->total_size * 1024)) { + fprintf(stderr, "ERASE FAILED!\n"); + return -1; + } return 0; }
@@ -458,6 +462,10 @@ /* FIXME: We assume spi_read_status_register will never fail. */ while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) programmer_delay(1000 * 1000); + if (check_erased_range(flash, 0, flash->total_size * 1024)) { + fprintf(stderr, "ERASE FAILED!\n"); + return -1; + } return 0; }
@@ -472,9 +480,9 @@ return result; }
-int spi_block_erase_52(const struct flashchip *flash, unsigned long addr) +int spi_block_erase_52(struct flashchip *flash, unsigned int addr, unsigned int blocklen) { - unsigned char cmd[JEDEC_BE_52_OUTSIZE] = {JEDEC_BE_52}; + unsigned char cmd[JEDEC_BE_52_OUTSIZE] = {JEDEC_BE_52, }; int result;
cmd[1] = (addr & 0x00ff0000) >> 16; @@ -490,6 +498,10 @@ */ while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) programmer_delay(100 * 1000); + if (check_erased_range(flash, addr, blocklen)) { + fprintf(stderr, "ERASE FAILED!\n"); + return -1; + } return 0; }
@@ -498,9 +510,9 @@ * 32k for SST * 4-32k non-uniform for EON */ -int spi_block_erase_d8(const struct flashchip *flash, unsigned long addr) +int spi_block_erase_d8(struct flashchip *flash, unsigned int addr, unsigned int blocklen) { - unsigned char cmd[JEDEC_BE_D8_OUTSIZE] = { JEDEC_BE_D8 }; + unsigned char cmd[JEDEC_BE_D8_OUTSIZE] = { JEDEC_BE_D8, }; int result;
cmd[1] = (addr & 0x00ff0000) >> 16; @@ -516,6 +528,10 @@ */ while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) programmer_delay(100 * 1000); + if (check_erased_range(flash, addr, blocklen)) { + fprintf(stderr, "ERASE FAILED!\n"); + return -1; + } return 0; }
@@ -530,7 +546,7 @@ printf("Erasing chip: \n");
for (i = 0; i < total_size / erase_size; i++) { - rc = spi_block_erase_d8(flash, i * erase_size); + rc = spi_block_erase_d8(flash, i * erase_size, erase_size); if (rc) { printf("Error erasing block at 0x%x\n", i); break; @@ -543,9 +559,9 @@ }
/* Sector size is usually 4k, though Macronix eliteflash has 64k */ -int spi_sector_erase(const struct flashchip *flash, unsigned long addr) +int spi_block_erase_20(struct flashchip *flash, unsigned int addr, unsigned int blocklen) { - unsigned char cmd[JEDEC_SE_OUTSIZE] = { JEDEC_SE }; + unsigned char cmd[JEDEC_SE_OUTSIZE] = { JEDEC_SE, }; int result; cmd[1] = (addr & 0x00ff0000) >> 16; @@ -562,9 +578,31 @@ */ while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) programmer_delay(10 * 1000); + if (check_erased_range(flash, addr, blocklen)) { + fprintf(stderr, "ERASE FAILED!\n"); + return -1; + } return 0; }
+int spi_block_erase_60(struct flashchip *flash, unsigned int addr, unsigned int blocklen) +{ + if ((addr != 0) || (blocklen != flash->total_size * 1024)) { + fprintf(stderr, "%s called with incorrect arguments\n", __func__); + return -1; + } + return spi_chip_erase_60(flash); +} + +int spi_block_erase_c7(struct flashchip *flash, unsigned int addr, unsigned int blocklen) +{ + if ((addr != 0) || (blocklen != flash->total_size * 1024)) { + fprintf(stderr, "%s called with incorrect arguments\n", __func__); + return -1; + } + return spi_chip_erase_c7(flash); +} + int spi_write_status_enable(void) { const unsigned char cmd[JEDEC_EWSR_OUTSIZE] = { JEDEC_EWSR }; @@ -810,7 +848,10 @@ default: break; } - flash->erase(flash); + if (flash->erase(flash)) { + fprintf(stderr, "ERASE FAILED!\n"); + return -1; + } result = spi_write_enable(); if (result) return result; Index: flashrom-spi_verify_erase/ichspi.c =================================================================== --- flashrom-spi_verify_erase/ichspi.c (Revision 618) +++ flashrom-spi_verify_erase/ichspi.c (Arbeitskopie) @@ -661,7 +661,7 @@ * For this, we need to add a block erase function to * struct flashchip. */ - rc = spi_block_erase_d8(flash, i * erase_size); + rc = spi_block_erase_d8(flash, i * erase_size, erase_size); if (rc) { printf("Error erasing block at 0x%x\n", i); break;
On Mon, Jun 22, 2009 at 11:57:03AM +0200, Carl-Daniel Hailfinger wrote:
Check result of all SPI erase functions. Since block erase functions do not know the block length (it's not specified in any standard), block erase functions now get an additional parameter blocklen. This enables flashrom to verify the erase result for block erase functions at correct boundaries.
Unchecked erase is bad and can lead to problems nobody can understand.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Acked-by: Uwe Hermann uwe@hermann-uwe.de
Tested OK on an sb600 board.
Index: flashrom-spi_verify_erase/spi.c
--- flashrom-spi_verify_erase/spi.c (Revision 618) +++ flashrom-spi_verify_erase/spi.c (Arbeitskopie) @@ -1,7 +1,7 @@ /*
- This file is part of the flashrom project.
- Copyright (C) 2007, 2008 Carl-Daniel Hailfinger
- Copyright (C) 2007, 2008, 2009 Carl-Daniel Hailfinger
Maybe 2007-2009 for brevity and shorter lines (on the long term).
Uwe.
On 24.06.2009 00:00, Uwe Hermann wrote:
On Mon, Jun 22, 2009 at 11:57:03AM +0200, Carl-Daniel Hailfinger wrote:
Check result of all SPI erase functions. Since block erase functions do not know the block length (it's not specified in any standard), block erase functions now get an additional parameter blocklen. This enables flashrom to verify the erase result for block erase functions at correct boundaries.
Unchecked erase is bad and can lead to problems nobody can understand.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Acked-by: Uwe Hermann uwe@hermann-uwe.de
Tested OK on an sb600 board.
Thanks, committed in r.
Index: flashrom-spi_verify_erase/spi.c
- Copyright (C) 2007, 2008 Carl-Daniel Hailfinger
- Copyright (C) 2007, 2008, 2009 Carl-Daniel Hailfinger
Maybe 2007-2009 for brevity and shorter lines (on the long term).
I think I once read a comment which said that year ranges have no legal significance, they are like (C) convenient hints without meaning. Since copyright law is a strange beast and I'm not a lawyer, I prefer to be cautious.
Regards, Carl-Daniel
On 24.06.2009 10:26, Carl-Daniel Hailfinger wrote:
On 24.06.2009 00:00, Uwe Hermann wrote:
On Mon, Jun 22, 2009 at 11:57:03AM +0200, Carl-Daniel Hailfinger wrote:
Check result of all SPI erase functions. Since block erase functions do not know the block length (it's not specified in any standard), block erase functions now get an additional parameter blocklen. This enables flashrom to verify the erase result for block erase functions at correct boundaries.
Unchecked erase is bad and can lead to problems nobody can understand.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Acked-by: Uwe Hermann uwe@hermann-uwe.de
This was r630.
Regards, Carl-Daniel