[flashrom] [PATCH] Split out erase region walking
Carl-Daniel Hailfinger
c-d.hailfinger.devel.2006 at gmx.net
Sat Jul 10 15:56:35 CEST 2010
Split erase region walking out of erase_flash.
That allows us to use erase region walking for a combined erase/write
action, and is a prerequisite for partial flashing.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
Index: flashrom-walk_eraseregions/flashrom.c
===================================================================
--- flashrom-walk_eraseregions/flashrom.c (Revision 1072)
+++ flashrom-walk_eraseregions/flashrom.c (Arbeitskopie)
@@ -1164,14 +1164,36 @@
return ret;
}
-int erase_flash(struct flashchip *flash)
+static int walk_eraseregions(struct flashchip *flash, int erasefunction, int (*do_something) (struct flashchip *flash, unsigned int addr, unsigned int len))
{
- int i, j, k, ret = 0, found = 0;
+ int i, j;
+ unsigned int done = 0;
unsigned int start, len;
+ struct block_eraser eraser = flash->block_erasers[erasefunction];
+ for (i = 0; i < NUM_ERASEREGIONS; i++) {
+ /* count==0 for all automatically initialized array
+ * members so the loop below won't be executed for them.
+ */
+ for (j = 0; j < eraser.eraseblocks[i].count; j++) {
+ start = done + eraser.eraseblocks[i].size * j;
+ len = eraser.eraseblocks[i].size;
+ msg_cdbg("0x%06x-0x%06x, ", start,
+ start + len - 1);
+ if (do_something(flash, start, len))
+ return 1;
+ }
+ done += eraser.eraseblocks[i].count *
+ eraser.eraseblocks[i].size;
+ }
+ return 0;
+}
+int erase_flash(struct flashchip *flash)
+{
+ int k, ret = 0, found = 0;
+
msg_cinfo("Erasing flash chip... ");
for (k = 0; k < NUM_ERASEFUNCTIONS; k++) {
- unsigned int done = 0;
struct block_eraser eraser = flash->block_erasers[k];
msg_cdbg("Looking at blockwise erase function %i... ", k);
@@ -1194,24 +1216,7 @@
}
found = 1;
msg_cdbg("trying... ");
- for (i = 0; i < NUM_ERASEREGIONS; i++) {
- /* count==0 for all automatically initialized array
- * members so the loop below won't be executed for them.
- */
- for (j = 0; j < eraser.eraseblocks[i].count; j++) {
- start = done + eraser.eraseblocks[i].size * j;
- len = eraser.eraseblocks[i].size;
- msg_cdbg("0x%06x-0x%06x, ", start,
- start + len - 1);
- ret = eraser.block_erase(flash, start, len);
- if (ret)
- break;
- }
- if (ret)
- break;
- done += eraser.eraseblocks[i].count *
- eraser.eraseblocks[i].size;
- }
+ ret = walk_eraseregions(flash, k, eraser.block_erase);
msg_cdbg("\n");
/* If everything is OK, don't try another erase function. */
if (!ret)
--
http://www.hailfinger.org/
More information about the flashrom
mailing list