diff options
author | Aarya Chaumal <aarya.chaumal@gmail.com> | 2022-06-04 01:34:44 +0530 |
---|---|---|
committer | Thomas Heijligen <src@posteo.de> | 2022-06-20 10:34:43 +0000 |
commit | 7db2baa77d41c3a74449a3f2b907025f69b776b9 (patch) | |
tree | a98c3e4250cef520b30300536e0138ff5fefe1a5 | |
parent | aa64c054d0b0ac842ad8ac966f7ad57afc41f3c1 (diff) | |
download | flashrom-7db2baa77d41c3a74449a3f2b907025f69b776b9.tar.gz flashrom-7db2baa77d41c3a74449a3f2b907025f69b776b9.tar.bz2 flashrom-7db2baa77d41c3a74449a3f2b907025f69b776b9.zip |
flashrom.c, flashcips.c: Test the order of erase functions
Add a check so that the erase functions for all flashchips are in
increasing order of their respective eraseblock sizes. This is required
for the implentation of the improved erasing algorithm. The patch uses
the count of eraseblocks in each erase function to determine the order
(More eraseblocks means that the function has smaller eraseblock size).
Also fix the structs in flashchips.c which were found to be not
conforming to this test.
TEST = make && ./flashrom
Change-Id: I137cb40483fa690ecc6c7eaece2d9d3f7a851bb4
Signed-off-by: Aarya Chaumal <aarya.chaumal@gmail.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/64961
Reviewed-by: Thomas Heijligen <src@posteo.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r-- | flashchips.c | 24 | ||||
-rw-r--r-- | flashrom.c | 11 |
2 files changed, 23 insertions, 12 deletions
diff --git a/flashchips.c b/flashchips.c index 71a6bfbd..33df792b 100644 --- a/flashchips.c +++ b/flashchips.c @@ -5355,12 +5355,12 @@ const struct flashchip flashchips[] = { .eraseblocks = { {4 * 1024, 512} }, .block_erase = spi_block_erase_20, }, { - .eraseblocks = { {64 * 1024, 32} }, - .block_erase = spi_block_erase_52, - }, { .eraseblocks = { {32 * 1024, 64} }, .block_erase = spi_block_erase_d8, }, { + .eraseblocks = { {64 * 1024, 32} }, + .block_erase = spi_block_erase_52, + }, { .eraseblocks = { {2048 * 1024, 1} }, .block_erase = spi_block_erase_60, }, { @@ -9212,12 +9212,12 @@ const struct flashchip flashchips[] = { .eraseblocks = { {4 * 1024, 2048} }, .block_erase = spi_block_erase_20, }, { - .eraseblocks = { {64 * 1024, 128} }, - .block_erase = spi_block_erase_d8, - }, { .eraseblocks = { {32 * 1024, 256} }, .block_erase = spi_block_erase_52, }, { + .eraseblocks = { {64 * 1024, 128} }, + .block_erase = spi_block_erase_d8, + }, { .eraseblocks = { {8 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_60, }, { @@ -9290,12 +9290,12 @@ const struct flashchip flashchips[] = { .eraseblocks = { {4 * 1024, 1024} }, .block_erase = spi_block_erase_20, }, { - .eraseblocks = { {64 * 1024, 64} }, - .block_erase = spi_block_erase_d8, - }, { .eraseblocks = { {32 * 1024, 128} }, .block_erase = spi_block_erase_52, }, { + .eraseblocks = { {64 * 1024, 64} }, + .block_erase = spi_block_erase_d8, + }, { .eraseblocks = { {4 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_60, }, { @@ -9329,12 +9329,12 @@ const struct flashchip flashchips[] = { .eraseblocks = { {4 * 1024, 2048} }, .block_erase = spi_block_erase_20, }, { - .eraseblocks = { {64 * 1024, 128} }, - .block_erase = spi_block_erase_d8, - }, { .eraseblocks = { {32 * 1024, 256} }, .block_erase = spi_block_erase_52, }, { + .eraseblocks = { {64 * 1024, 128} }, + .block_erase = spi_block_erase_d8, + }, { .eraseblocks = { {8 * 1024 * 1024, 1} }, .block_erase = spi_block_erase_60, }, { @@ -1075,10 +1075,12 @@ static int selfcheck_eraseblocks(const struct flashchip *chip) { int i, j, k; int ret = 0; + unsigned int prev_eraseblock_count = chip->total_size * 1024; for (k = 0; k < NUM_ERASEFUNCTIONS; k++) { unsigned int done = 0; struct block_eraser eraser = chip->block_erasers[k]; + unsigned int curr_eraseblock_count = 0; for (i = 0; i < NUM_ERASEREGIONS; i++) { /* Blocks with zero size are bugs in flashchips.c. */ @@ -1101,6 +1103,7 @@ static int selfcheck_eraseblocks(const struct flashchip *chip) } done += eraser.eraseblocks[i].count * eraser.eraseblocks[i].size; + curr_eraseblock_count += eraser.eraseblocks[i].count; } /* Empty eraseblock definition with erase function. */ if (!done && eraser.block_erase) @@ -1132,6 +1135,14 @@ static int selfcheck_eraseblocks(const struct flashchip *chip) ret = 1; } } + if(curr_eraseblock_count > prev_eraseblock_count) + { + msg_gerr("ERROR: Flash chip %s erase function %i is not " + "in order. Please report a bug at flashrom@flashrom.org\n", + chip->name, k); + ret = 1; + } + prev_eraseblock_count = curr_eraseblock_count; } return ret; } |