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.
Tested: make && ./flashrom
Change-Id: I137cb40483fa690ecc6c7eaece2d9d3f7a851bb4
Signed-off-by: Aarya Chaumal <aarya.chaumal@gmail.com>
Original-Reviewed-on: https://review.coreboot.org/c/flashrom/+/64961
Original-Reviewed-by: Thomas Heijligen <src@posteo.de>
Reviewed-on: https://review.coreboot.org/c/flashrom-stable/+/70987
Reviewed-by: Nico Huber <nico.h@gmx.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aarya <aarya.chaumal@gmail.com>
diff --git a/flashchips.c b/flashchips.c
index 2f6c121..95bbcba 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -5317,12 +5317,12 @@
.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,
}, {
@@ -9174,12 +9174,12 @@
.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,
}, {
@@ -9252,12 +9252,12 @@
.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,
}, {
@@ -9291,12 +9291,12 @@
.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,
}, {
diff --git a/flashrom.c b/flashrom.c
index 430c871..43c69ed 100644
--- a/flashrom.c
+++ b/flashrom.c
@@ -1412,10 +1412,12 @@
{
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. */
@@ -1438,6 +1440,7 @@
}
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)
@@ -1469,6 +1472,14 @@
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;
}