1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-27 23:22:37 +02:00

Move erase verification to generic code

Erase functions are no longer called from chip drivers and thus their
internal erase verification can be moved to generic code. This also
makes it easier to skip the verify step if desired and to differentiate
between failed command submission and failed erase verification.

Corresponding to flashrom svn r1353.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
This commit is contained in:
Carl-Daniel Hailfinger 2011-06-26 17:04:16 +00:00
parent bfa021dd80
commit b4061f61cd
10 changed files with 21 additions and 72 deletions

View File

@ -136,11 +136,7 @@ int erase_block_82802ab(struct flashchip *flash, unsigned int page, unsigned int
status = wait_82802ab(flash); status = wait_82802ab(flash);
print_status_82802ab(status); print_status_82802ab(status);
if (check_erased_range(flash, page, pagesize)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }

View File

@ -210,7 +210,6 @@ int min(int a, int b);
int max(int a, int b); int max(int a, int b);
void tolower_string(char *str); void tolower_string(char *str);
char *extract_param(char **haystack, char *needle, char *delim); char *extract_param(char **haystack, char *needle, char *delim);
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 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, enum write_granularity gran); int need_erase(uint8_t *have, uint8_t *want, int len, enum write_granularity gran);
char *strcat_realloc(char *dest, const char *src); char *strcat_realloc(char *dest, const char *src);

View File

@ -1400,6 +1400,10 @@ static int erase_and_write_block_helper(struct flashchip *flash,
ret = erasefn(flash, start, len); ret = erasefn(flash, start, len);
if (ret) if (ret)
return ret; return ret;
if (check_erased_range(flash, start, len)) {
msg_cerr("ERASE FAILED!\n");
return -1;
}
/* Erase was successful. Adjust curcontents. */ /* Erase was successful. Adjust curcontents. */
memset(curcontents, 0xff, len); memset(curcontents, 0xff, len);
skip = 0; skip = 0;

16
jedec.c
View File

@ -264,10 +264,7 @@ static int erase_sector_jedec_common(struct flashchip *flash, unsigned int page,
/* wait for Toggle bit ready */ /* wait for Toggle bit ready */
toggle_ready_jedec_slow(bios); toggle_ready_jedec_slow(bios);
if (check_erased_range(flash, page, pagesize)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }
@ -297,16 +294,12 @@ static int erase_block_jedec_common(struct flashchip *flash, unsigned int block,
/* wait for Toggle bit ready */ /* wait for Toggle bit ready */
toggle_ready_jedec_slow(bios); toggle_ready_jedec_slow(bios);
if (check_erased_range(flash, block, blocksize)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }
static int erase_chip_jedec_common(struct flashchip *flash, unsigned int mask) static int erase_chip_jedec_common(struct flashchip *flash, unsigned int mask)
{ {
int total_size = flash->total_size * 1024;
chipaddr bios = flash->virtual_memory; chipaddr bios = flash->virtual_memory;
int delay_us = 0; int delay_us = 0;
if(flash->probe_timing != TIMING_ZERO) if(flash->probe_timing != TIMING_ZERO)
@ -329,10 +322,7 @@ static int erase_chip_jedec_common(struct flashchip *flash, unsigned int mask)
toggle_ready_jedec_slow(bios); toggle_ready_jedec_slow(bios);
if (check_erased_range(flash, 0, total_size)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }

View File

@ -101,10 +101,7 @@ int erase_m29f400bt(struct flashchip *flash)
programmer_delay(10); programmer_delay(10);
toggle_ready_jedec(bios); toggle_ready_jedec(bios);
if (check_erased_range(flash, 0, flash->total_size * 1024)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }
@ -124,10 +121,7 @@ int block_erase_m29f400bt(struct flashchip *flash, unsigned int start, unsigned
programmer_delay(10); programmer_delay(10);
toggle_ready_jedec(bios); toggle_ready_jedec(bios);
if (check_erased_range(flash, start, len)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }

View File

@ -50,9 +50,6 @@ int erase_lhf00l04_block(struct flashchip *flash, unsigned int blockaddr, unsign
status = wait_82802ab(flash); status = wait_82802ab(flash);
print_status_82802ab(status); print_status_82802ab(status);
if (check_erased_range(flash, blockaddr, blocklen)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }

30
spi25.c
View File

@ -481,10 +481,7 @@ int spi_chip_erase_60(struct flashchip *flash)
/* FIXME: We assume spi_read_status_register will never fail. */ /* FIXME: We assume spi_read_status_register will never fail. */
while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
programmer_delay(1000 * 1000); programmer_delay(1000 * 1000);
if (check_erased_range(flash, 0, flash->total_size * 1024)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }
@ -520,10 +517,7 @@ int spi_chip_erase_c7(struct flashchip *flash)
/* FIXME: We assume spi_read_status_register will never fail. */ /* FIXME: We assume spi_read_status_register will never fail. */
while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
programmer_delay(1000 * 1000); programmer_delay(1000 * 1000);
if (check_erased_range(flash, 0, flash->total_size * 1024)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }
@ -564,10 +558,7 @@ int spi_block_erase_52(struct flashchip *flash, unsigned int addr, unsigned int
*/ */
while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
programmer_delay(100 * 1000); programmer_delay(100 * 1000);
if (check_erased_range(flash, addr, blocklen)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }
@ -613,10 +604,7 @@ int spi_block_erase_d8(struct flashchip *flash, unsigned int addr, unsigned int
*/ */
while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
programmer_delay(100 * 1000); programmer_delay(100 * 1000);
if (check_erased_range(flash, addr, blocklen)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }
@ -660,10 +648,7 @@ int spi_block_erase_d7(struct flashchip *flash, unsigned int addr, unsigned int
*/ */
while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
programmer_delay(100 * 1000); programmer_delay(100 * 1000);
if (check_erased_range(flash, addr, blocklen)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }
@ -705,10 +690,7 @@ int spi_block_erase_20(struct flashchip *flash, unsigned int addr, unsigned int
*/ */
while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP) while (spi_read_status_register() & JEDEC_RDSR_BIT_WIP)
programmer_delay(10 * 1000); programmer_delay(10 * 1000);
if (check_erased_range(flash, addr, blocklen)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }

View File

@ -71,10 +71,7 @@ int erase_sector_28sf040(struct flashchip *flash, unsigned int address, unsigned
/* wait for Toggle bit ready */ /* wait for Toggle bit ready */
toggle_ready_jedec(bios); toggle_ready_jedec(bios);
if (check_erased_range(flash, address, sector_size)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }
@ -113,10 +110,7 @@ static int erase_28sf040(struct flashchip *flash)
programmer_delay(10); programmer_delay(10);
toggle_ready_jedec(bios); toggle_ready_jedec(bios);
if (check_erased_range(flash, 0, flash->total_size * 1024)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }

View File

@ -70,9 +70,6 @@ int erase_sector_49lfxxxc(struct flashchip *flash, unsigned int address, unsigne
status = wait_82802ab(flash); status = wait_82802ab(flash);
print_status_82802ab(status); print_status_82802ab(status);
if (check_erased_range(flash, address, sector_size)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }

View File

@ -107,10 +107,6 @@ int erase_sector_stm50flw0x0x(struct flashchip *flash, unsigned int sector, unsi
wait_82802ab(flash); wait_82802ab(flash);
if (check_erased_range(flash, sector, sectorsize)) { /* FIXME: Check the status register for errors. */
msg_cerr("ERASE FAILED!\n");
return -1;
}
return 0; return 0;
} }