[Skiboot] [RFC PATCH 3/3] libflash: add flash_erase_corrected() to set ECC bytes in erased areas
Michael Neuling
mikey at neuling.org
Fri Mar 6 15:48:44 AEDT 2015
On Thu, 2015-03-05 at 20:39 +1100, Cyril Bur wrote:
> From: Cyril Bur <cyril.bur at au1.ibm.com>
>
> Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
> ---
> libflash/libflash.c | 32 ++++++++++++++++++++++++++++++++
> libflash/libflash.h | 1 +
> 2 files changed, 33 insertions(+)
>
> diff --git a/libflash/libflash.c b/libflash/libflash.c
> index cae62ec..84a78f6 100644
> --- a/libflash/libflash.c
> +++ b/libflash/libflash.c
> @@ -309,6 +309,38 @@ int flash_erase(struct flash_chip *c, uint32_t dst, uint32_t size)
> return 0;
> }
>
> +int flash_erase_corrected(struct flash_chip *c, uint32_t dst, uint32_t size, bool ecc)
> +{
> +
> + int rc = flash_erase(c, dst, size);
> +
> + if (rc == 0 && ecc) {
> + uint32_t i;
> + uint8_t zero = 0;
> +
> + /*
> + * We have just erased this region which means it will be all FF.
> + * The ECC byte for that is 00 so the easiest way to deal is just to
> + * write 00 every 9th byte.
> + * Really should optimise this.
> + */
> +
> + /* Align dst, probably already is but best to be sure */
> + if (dst & 0x7) {
> + dst &= ~0x7UL;
> + dst += 8;
> + }
This alignment doesn't seem like the right thing to do. If I passed in
a dst pointer, I wouldn't expect this function to align it for me.
Why not reuse your packed struct ecc64 here again and avoid the magic "+
9" maths.
Thanks for fixing this.
Mikey
> +
> + i = 9;
> + while (rc == 0 && i < size) {
> + rc = flash_write(c, dst + i, &zero, 1, 0);
> + i += 9;
> + }
> + }
> +
> + return rc;
> +}
> +
> int flash_erase_chip(struct flash_chip *c)
> {
> struct spi_flash_ctrl *ct = c->ctrl;
> diff --git a/libflash/libflash.h b/libflash/libflash.h
> index 51584da..f7ca205 100644
> --- a/libflash/libflash.h
> +++ b/libflash/libflash.h
> @@ -74,6 +74,7 @@ int flash_read(struct flash_chip *c, uint32_t pos, void *buf, uint32_t len);
> int flash_read_corrected(struct flash_chip *c, uint32_t pos, void *buf,
> uint32_t len, bool ecc);
> int flash_erase(struct flash_chip *c, uint32_t dst, uint32_t size);
> +int flash_erase_corrected(struct flash_chip *c, uint32_t dst, uint32_t size, bool ecc);
> int flash_write(struct flash_chip *c, uint32_t dst, const void *src,
> uint32_t size, bool verify);
> int flash_write_corrected(struct flash_chip *c, uint32_t dst, const void *src,
More information about the Skiboot
mailing list