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

William A. Kennington III wak at google.com
Tue Aug 29 16:48:40 AEST 2017

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.

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",
+	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