[flashrom] [PATCH] Fix sfdp_add_uniform_eraser and its usage.
Carl-Daniel Hailfinger
c-d.hailfinger.devel.2006 at gmx.net
Mon Feb 20 21:38:52 CET 2012
Am 19.02.2012 20:05 schrieb Stefan Tauner:
> sfdp_add_uniform_eraser checks for existing erasers. Due to a bug it looked for
> eraser slots that have no erase functions set instead of those that have one set.
>
> Also, the special 4k opcode encoded in the first double word was tried to add
> with sfdp_add_uniform_eraser
-ENOPARSE
> although the total size of the chip was not yet
> known. This is now postponed and an additional check to sfdp_add_uniform_eraser
> is added.
>
> Signed-off-by: Stefan Tauner <stefan.tauner at student.tuwien.ac.at>
> ---
> this is the last fixup combined with what is described in the second half
> of the commit log above.
>
> sfdp.c | 18 +++++++++++++-----
> 1 files changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/sfdp.c b/sfdp.c
> index 75dfb5f..80faeca 100644
> --- a/sfdp.c
> +++ b/sfdp.c
> @@ -78,8 +78,10 @@ static int sfdp_add_uniform_eraser(struct flashctx *flash, uint8_t opcode, uint3
> uint32_t total_size = flash->total_size * 1024;
> erasefunc_t *erasefn = spi_get_erasefn_from_opcode(opcode);
>
> - if (erasefn == NULL || block_size == 0 || total_size % block_size != 0) {
> - msg_cdbg("%s: invalid input\n", __func__);
> + if (erasefn == NULL || total_size == 0 || block_size == 0 ||
> + total_size % block_size != 0) {
> + msg_cdbg("%s: invalid input, please report to "
> + "flashrom at flashrom.org\n", __func__);
> return 1;
> }
>
> @@ -89,11 +91,12 @@ static int sfdp_add_uniform_eraser(struct flashctx *flash, uint8_t opcode, uint3
> if (eraser->eraseblocks[0].size == block_size &&
> eraser->block_erase == erasefn) {
> msg_cdbg2(" Tried to add a duplicate block eraser: "
> - "%d x %d B with opcode 0x%02x\n",
> + "%d x %d B with opcode 0x%02x.\n",
> total_size/block_size, block_size, opcode);
> return 1;
> }
> - if (eraser->eraseblocks[0].size != 0 || !eraser->block_erase) {
> + if (eraser->eraseblocks[0].size != 0 ||
> + eraser->block_erase != NULL) {
> msg_cspew(" Block Eraser %d is already occupied.\n",
> i);
> continue;
> @@ -115,6 +118,7 @@ static int sfdp_add_uniform_eraser(struct flashctx *flash, uint8_t opcode, uint3
>
> static int sfdp_fill_flash(struct flashctx *flash, uint8_t *buf, uint16_t len)
> {
> + uint8_t opcode_4k = 0xFF;
rename to opcode_4k_erase?
> uint32_t tmp32;
> uint8_t tmp8;
> uint32_t total_size; /* in bytes */
> @@ -181,7 +185,8 @@ static int sfdp_fill_flash(struct flashctx *flash, uint8_t *buf, uint16_t len)
> }
>
> if ((tmp32 & 0x3) == 0x1) {
> - sfdp_add_uniform_eraser(flash, (tmp32 >> 8) & 0xFF, 4 * 1024);
> + /* add the eraser later, because we don't know total_size yet */
> + opcode_4k = (tmp32 >> 8) & 0xFF;
> }
>
> /* 2. double word */
> @@ -204,6 +209,9 @@ static int sfdp_fill_flash(struct flashctx *flash, uint8_t *buf, uint16_t len)
> return 1;
> }
>
> + if (opcode_4k != 0xFF)
> + sfdp_add_uniform_eraser(flash, opcode_4k, 4 * 1024);
> +
> /* FIXME: double words 3-7 contain unused fast read information */
>
> if (len == 4 * 4) {
How well-tested is this? I'd rather not have a fixup for the fixup.
Regards,
Carl-Daniel
--
http://www.hailfinger.org/
More information about the flashrom
mailing list