linux-api.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] mtd: add OTP (one-time-programmable) erase ioctl
@ 2021-03-03 20:18 Michael Walle
  2021-03-08 11:27 ` Vignesh Raghavendra
  2021-04-08  5:51 ` Tudor.Ambarus
  0 siblings, 2 replies; 5+ messages in thread
From: Michael Walle @ 2021-03-03 20:18 UTC (permalink / raw)
  To: linux-mtd, linux-kernel, linux-api
  Cc: Miquel Raynal, Richard Weinberger, Vignesh Raghavendra,
	Tudor.Ambarus, Michael Walle

This may sound like a contradiction but some SPI-NOR flashes really
support erasing their OTP region until it is finally locked. Having the
possibility to erase an OTP region might come in handy during
development.

The ioctl argument follows the OTPLOCK style.

Signed-off-by: Michael Walle <michael@walle.cc>
---
Changes since RFC:
 - check write permissions for OTPERASE
 - use correct ioctl macro (_IOW)

 drivers/mtd/mtdchar.c      |  7 ++++++-
 drivers/mtd/mtdcore.c      | 12 ++++++++++++
 include/linux/mtd/mtd.h    |  3 +++
 include/uapi/mtd/mtd-abi.h |  2 ++
 4 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c
index 57c4a2f0b703..b9b56eb9457e 100644
--- a/drivers/mtd/mtdchar.c
+++ b/drivers/mtd/mtdchar.c
@@ -666,6 +666,7 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
 	case MEMWRITEOOB:
 	case MEMWRITEOOB64:
 	case MEMWRITE:
+	case OTPERASE:
 		if (!(file->f_mode & FMODE_WRITE))
 			return -EPERM;
 		break;
@@ -930,6 +931,7 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
 	}
 
 	case OTPLOCK:
+	case OTPERASE:
 	{
 		struct otp_info oinfo;
 
@@ -937,7 +939,10 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
 			return -EINVAL;
 		if (copy_from_user(&oinfo, argp, sizeof(oinfo)))
 			return -EFAULT;
-		ret = mtd_lock_user_prot_reg(mtd, oinfo.start, oinfo.length);
+		if (cmd == OTPLOCK)
+			ret = mtd_lock_user_prot_reg(mtd, oinfo.start, oinfo.length);
+		else
+			ret = mtd_erase_user_prot_reg(mtd, oinfo.start, oinfo.length);
 		break;
 	}
 
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 38782ceea1f6..aea58366a94e 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -1919,6 +1919,18 @@ int mtd_lock_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len)
 }
 EXPORT_SYMBOL_GPL(mtd_lock_user_prot_reg);
 
+int mtd_erase_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len)
+{
+	struct mtd_info *master = mtd_get_master(mtd);
+
+	if (!master->_erase_user_prot_reg)
+		return -EOPNOTSUPP;
+	if (!len)
+		return 0;
+	return master->_erase_user_prot_reg(master, from, len);
+}
+EXPORT_SYMBOL_GPL(mtd_erase_user_prot_reg);
+
 /* Chip-supported device locking */
 int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
 {
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index ceabc2cae8a4..4aac200ca8b5 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -337,6 +337,8 @@ struct mtd_info {
 				     size_t len, size_t *retlen, u_char *buf);
 	int (*_lock_user_prot_reg) (struct mtd_info *mtd, loff_t from,
 				    size_t len);
+	int (*_erase_user_prot_reg) (struct mtd_info *mtd, loff_t from,
+				     size_t len);
 	int (*_writev) (struct mtd_info *mtd, const struct kvec *vecs,
 			unsigned long count, loff_t to, size_t *retlen);
 	void (*_sync) (struct mtd_info *mtd);
@@ -518,6 +520,7 @@ int mtd_read_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
 int mtd_write_user_prot_reg(struct mtd_info *mtd, loff_t to, size_t len,
 			    size_t *retlen, u_char *buf);
 int mtd_lock_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len);
+int mtd_erase_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len);
 
 int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
 	       unsigned long count, loff_t to, size_t *retlen);
diff --git a/include/uapi/mtd/mtd-abi.h b/include/uapi/mtd/mtd-abi.h
index 65b9db936557..b869990c2db2 100644
--- a/include/uapi/mtd/mtd-abi.h
+++ b/include/uapi/mtd/mtd-abi.h
@@ -205,6 +205,8 @@ struct otp_info {
  * without OOB, e.g., NOR flash.
  */
 #define MEMWRITE		_IOWR('M', 24, struct mtd_write_req)
+/* Erase a given range of user data (must be in mode %MTD_FILE_MODE_OTP_USER) */
+#define OTPERASE		_IOW('M', 25, struct otp_info)
 
 /*
  * Obsolete legacy interface. Keep it in order not to break userspace
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] mtd: add OTP (one-time-programmable) erase ioctl
  2021-03-03 20:18 [PATCH] mtd: add OTP (one-time-programmable) erase ioctl Michael Walle
@ 2021-03-08 11:27 ` Vignesh Raghavendra
  2021-04-08  5:51 ` Tudor.Ambarus
  1 sibling, 0 replies; 5+ messages in thread
From: Vignesh Raghavendra @ 2021-03-08 11:27 UTC (permalink / raw)
  To: Michael Walle, linux-mtd, linux-kernel, linux-api
  Cc: Miquel Raynal, Richard Weinberger, Tudor.Ambarus



On 3/4/21 1:48 AM, Michael Walle wrote:
> This may sound like a contradiction but some SPI-NOR flashes really
> support erasing their OTP region until it is finally locked. Having the
> possibility to erase an OTP region might come in handy during
> development.
> 
> The ioctl argument follows the OTPLOCK style.
> 
> Signed-off-by: Michael Walle <michael@walle.cc>
> ---

Acked-by: Vignesh Raghavendra <vigneshr@ti.com>


[...]

Regards
Vignesh


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] mtd: add OTP (one-time-programmable) erase ioctl
  2021-03-03 20:18 [PATCH] mtd: add OTP (one-time-programmable) erase ioctl Michael Walle
  2021-03-08 11:27 ` Vignesh Raghavendra
@ 2021-04-08  5:51 ` Tudor.Ambarus
  2021-04-08  6:55   ` Michael Walle
  1 sibling, 1 reply; 5+ messages in thread
From: Tudor.Ambarus @ 2021-04-08  5:51 UTC (permalink / raw)
  To: michael, linux-mtd, linux-kernel, linux-api
  Cc: miquel.raynal, richard, vigneshr

Michael,

Would you please resend this patch, together with the mtd-utils
and the SPI NOR patch in a single patch set? You'll help us all
having all in a single place.

For the new ioctl we'll need acks from all the mtd maintainers
and at least a tested-by tag.

Cheers,
ta

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] mtd: add OTP (one-time-programmable) erase ioctl
  2021-04-08  5:51 ` Tudor.Ambarus
@ 2021-04-08  6:55   ` Michael Walle
  2021-04-08  7:06     ` Miquel Raynal
  0 siblings, 1 reply; 5+ messages in thread
From: Michael Walle @ 2021-04-08  6:55 UTC (permalink / raw)
  To: Tudor.Ambarus
  Cc: linux-mtd, linux-kernel, linux-api, miquel.raynal, richard, vigneshr

Hi Tudor,

Am 2021-04-08 07:51, schrieb Tudor.Ambarus@microchip.com:
> Would you please resend this patch, together with the mtd-utils
> and the SPI NOR patch in a single patch set? You'll help us all
> having all in a single place.

This has already been picked-up:
https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git/commit/?h=mtd/next&id=e3c1f1c92d6ede3cfa09d6a103d3d1c1ef645e35

Although, I didn't receive an email notice.

-michael

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] mtd: add OTP (one-time-programmable) erase ioctl
  2021-04-08  6:55   ` Michael Walle
@ 2021-04-08  7:06     ` Miquel Raynal
  0 siblings, 0 replies; 5+ messages in thread
From: Miquel Raynal @ 2021-04-08  7:06 UTC (permalink / raw)
  To: Michael Walle
  Cc: Tudor.Ambarus, linux-mtd, linux-kernel, linux-api, richard, vigneshr

Hello,

Michael Walle <michael@walle.cc> wrote on Thu, 08 Apr 2021 08:55:42
+0200:

> Hi Tudor,
> 
> Am 2021-04-08 07:51, schrieb Tudor.Ambarus@microchip.com:
> > Would you please resend this patch, together with the mtd-utils
> > and the SPI NOR patch in a single patch set? You'll help us all
> > having all in a single place.  
> 
> This has already been picked-up:
> https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git/commit/?h=mtd/next&id=e3c1f1c92d6ede3cfa09d6a103d3d1c1ef645e35
> 
> Although, I didn't receive an email notice.
> 
> -michael

Sometimes the notifications are not triggered when there is a conflict
when applying the patch from patchwork directly. I usually answer
manually in this case but I might have forgotten.

About the patch, I felt it was good enough for merging, and I want to
avoid applying such patches right before freezing our branches. Hence,
I tend to be more aggressive earlier in the release cycles because I
hate when my patches get delayed infinitely. The other side is a more
careful approach when -rc6 gets tagged so that I can drop anything which
would be crazily broken before our -next branches are stalled, leading
for an useless public revert. Of course, I am fully open to removing
this patch from -next if you ever feel it was too early and will
happily get rid of it for this release: we can move the patch for the
next release if you agree on this (especially since it touches the
ABI).

Cheers,
Miquèl

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-04-08  7:10 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-03 20:18 [PATCH] mtd: add OTP (one-time-programmable) erase ioctl Michael Walle
2021-03-08 11:27 ` Vignesh Raghavendra
2021-04-08  5:51 ` Tudor.Ambarus
2021-04-08  6:55   ` Michael Walle
2021-04-08  7:06     ` Miquel Raynal

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).