For optimal partial reflashing, we have to find out which parts of the chip can be written without erase. For that, the only criterion (except a limit on the number of writes for very old chips) is whether the write will only clear bits (set them to 0). If (current&new==new) we can skip the erase. If any bit would have to be set to 1, we need to erase.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Index: flashrom-need_erase/flash.h =================================================================== --- flashrom-need_erase/flash.h (Revision 725) +++ flashrom-need_erase/flash.h (Arbeitskopie) @@ -455,6 +455,7 @@ int max(int a, int b); int check_erased_range(struct flashchip *flash, int start, int len); int verify_range(struct flashchip *flash, uint8_t *cmpbuf, int start, int len, char *message); +int need_erase(uint8_t *have, uint8_t *want, int len); char *strcat_realloc(char *dest, const char *src);
#define OK 0 Index: flashrom-need_erase/flashrom.c =================================================================== --- flashrom-need_erase/flashrom.c (Revision 725) +++ flashrom-need_erase/flashrom.c (Arbeitskopie) @@ -379,6 +379,26 @@ return ret; }
+/** + * Check if the buffer have can be programmed to the content of want without + * erasing. This is only possible if no bit has to be set to 1. + * + * @have buffer with current content + * @want buffer with desired content + * @len length of the verified area + * @return 0 if no erase is needed, >0 otherwise + */ +int need_erase(uint8_t *have, uint8_t *want, int len) +{ + int failcount = 0; + int i; + + for (i = 0; i < len; i++) + if ((have[i] & want[i]) != want[i]) + failcount++; + return failcount; +} + struct flashchip *probe_flash(struct flashchip *first_flash, int force) { struct flashchip *flash;