aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAarya Chaumal <aarya.chaumal@gmail.com>2022-06-04 01:34:44 +0530
committerThomas Heijligen <src@posteo.de>2022-06-20 10:34:43 +0000
commit7db2baa77d41c3a74449a3f2b907025f69b776b9 (patch)
treea98c3e4250cef520b30300536e0138ff5fefe1a5
parentaa64c054d0b0ac842ad8ac966f7ad57afc41f3c1 (diff)
downloadflashrom-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.c24
-rw-r--r--flashrom.c11
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,
}, {
diff --git a/flashrom.c b/flashrom.c
index 8d6b3db1..8e430016 100644
--- a/flashrom.c
+++ b/flashrom.c
@@ -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;
}