[Skiboot] [PATCH] flash: Support adding the no-erase property to flash

Suraj Jitindar Singh sjitindarsingh at gmail.com
Fri Sep 1 17:16:51 AEST 2017


Hi,

On Mon, 2017-08-28 at 23:48 -0700, William A. Kennington III wrote:
> Currently, flash devices like mbox-flash ignore erase commands. This
> means that issuing an erase from userspace, through the mtd device,
> and
> back returns a successful operation that does nothing. Unfortunately
> this makes userspace tools unhappy. Linux MTD devices support the
> MTD_NO_ERASE flag which conveys that writes do not require erases on
> the
> underlying flash devices. We should set this property on all of our
> devices which do not require erases to be performed.
> 
> NOTE: This still requires a linux kernel component to set the
> MTD_NO_ERASE flag from the device tree property.

Can I just check, does the MTD_NO_ERASE flag mean that the mtd device
doesn't have an erase function, or that an erase isn't necessary before
a write?

Because the V2 mbox has an erase method which mbox-flash will call when
an erase is performed. So if it means there isn't an erase function
then this is incorrect.

If it means that an erase isn't required before a write however then I
support this as the mbox protocol explicitly states this to be the
case.

Thanks,
Suraj

> 
> Signed-off-by: William A. Kennington III <wak at google.com>
> ---
>  core/flash.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/core/flash.c b/core/flash.c
> index 53e6eba08..9e230174f 100644
> --- a/core/flash.c
> +++ b/core/flash.c
> @@ -31,6 +31,7 @@
>  struct flash {
>  	struct list_node	list;
>  	bool			busy;
> +	bool			no_erase;
>  	struct blocklevel_device *bl;
>  	uint64_t		size;
>  	uint32_t		block_size;
> @@ -199,6 +200,8 @@ static struct dt_node *flash_add_dt_node(struct
> flash *flash, int id)
>  	dt_add_property_u64(flash_node, "reg", flash->size);
>  	dt_add_property_cells(flash_node, "ibm,flash-block-size",
>  			flash->block_size);
> +	if (flash->no_erase)
> +		dt_add_property(flash_node, "no-erase", NULL, 0);
>  
>  	/* we fix to 32-bits */
>  	dt_add_property_cells(flash_node, "#address-cells", 1);
> @@ -281,6 +284,7 @@ int flash_register(struct blocklevel_device *bl)
>  
>  	flash->busy = false;
>  	flash->bl = bl;
> +	flash->no_erase = !(bl->flags & WRITE_NEED_ERASE);
>  	flash->size = size;
>  	flash->block_size = block_size;
>  	flash->id = num_flashes();


More information about the Skiboot mailing list