summaryrefslogtreecommitdiffstats
path: root/layout.c
diff options
context:
space:
mode:
authorCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2010-10-19 22:06:20 +0000
committerCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2010-10-19 22:06:20 +0000
commit42d38a9dd1ef58870635c0e003b1a37e89a51ba7 (patch)
treeac178e88227887c2bff187608c7308d1f4748621 /layout.c
parent83d349ac34ca21e0ffe255d4a2f189e5e0a07c8d (diff)
downloadflashrom-42d38a9dd1ef58870635c0e003b1a37e89a51ba7.tar.gz
flashrom-42d38a9dd1ef58870635c0e003b1a37e89a51ba7.tar.bz2
flashrom-42d38a9dd1ef58870635c0e003b1a37e89a51ba7.zip
Always read the flash chip before writing
This will allow flashrom to skip erase of already-erased blocks and to skip write of blocks which already have the wanted contents. Avoid emergency messages by checking if the chip contents after a failed write operation (erase/write) are unchanged. Keep the emergency messages after a failed pure erase. That part is debatable because if someone wants erase, he pretty sure doesn't care about the flash contents anymore. Please note that this introduces additional overhead of a full chip read before write. This is frowned upon by people with slow programmers. A followup patch will make this configurable. Corresponding to flashrom svn r1215. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Stefan Reinauer <stepan@coreboot.org>
Diffstat (limited to 'layout.c')
-rw-r--r--layout.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/layout.c b/layout.c
index c01e09c13..b24e4dd95 100644
--- a/layout.c
+++ b/layout.c
@@ -205,7 +205,7 @@ int find_romentry(char *name)
return -1;
}
-int handle_romentries(uint8_t *buffer, struct flashchip *flash)
+int handle_romentries(struct flashchip *flash, uint8_t *oldcontents, uint8_t *newcontents)
{
int i;
@@ -225,13 +225,12 @@ int handle_romentries(uint8_t *buffer, struct flashchip *flash)
// normal will be updated and the rest will be kept.
for (i = 0; i < romimages; i++) {
-
if (rom_entries[i].included)
continue;
- flash->read(flash, buffer + rom_entries[i].start,
- rom_entries[i].start,
- rom_entries[i].end - rom_entries[i].start + 1);
+ memcpy(newcontents + rom_entries[i].start,
+ oldcontents + rom_entries[i].start,
+ rom_entries[i].end - rom_entries[i].start + 1);
}
return 0;