diff mbox series

mtd: spi-nor-core: Implement spi_nor_read_sfdp_dma_unsafe() for sfdp parse

Message ID 20220603070132.29734-1-vaishnav.a@ti.com
State Accepted
Commit 961c3e9f124c97350c470f65239e0d85aacf413b
Delegated to: Jagannadha Sutradharudu Teki
Headers show
Series mtd: spi-nor-core: Implement spi_nor_read_sfdp_dma_unsafe() for sfdp parse | expand

Commit Message

Vaishnav Achath June 3, 2022, 7:01 a.m. UTC
During SFDP header parse and BFPT parse, structures in stack are used
to perform spi_nor_read_sfdp() which expects a dma-safe buffer.

This commit introduces spi_nor_read_sfdp_dma_unsafe() to wrap
spi_nor_read_sfdp() using a kmalloc'ed bounce buffer which is
the same implementation in Linux (drivers/mtd/spi-nor/sfdp.c).

Signed-off-by: Vaishnav Achath <vaishnav.a@ti.com>
---
 drivers/mtd/spi/spi-nor-core.c | 34 ++++++++++++++++++++++++++++++++--
 1 file changed, 32 insertions(+), 2 deletions(-)

Comments

Pratyush Yadav June 28, 2022, 10:01 a.m. UTC | #1
On 03/06/22 12:31PM, Vaishnav Achath wrote:
> During SFDP header parse and BFPT parse, structures in stack are used
> to perform spi_nor_read_sfdp() which expects a dma-safe buffer.
> 
> This commit introduces spi_nor_read_sfdp_dma_unsafe() to wrap
> spi_nor_read_sfdp() using a kmalloc'ed bounce buffer which is
> the same implementation in Linux (drivers/mtd/spi-nor/sfdp.c).
> 
> Signed-off-by: Vaishnav Achath <vaishnav.a@ti.com>

Reviewed-by: Pratyush Yadav <p.yadav@ti.com>
Jagan Teki July 10, 2022, 5:37 a.m. UTC | #2
On Fri, Jun 3, 2022 at 12:31 PM Vaishnav Achath <vaishnav.a@ti.com> wrote:
>
> During SFDP header parse and BFPT parse, structures in stack are used
> to perform spi_nor_read_sfdp() which expects a dma-safe buffer.
>
> This commit introduces spi_nor_read_sfdp_dma_unsafe() to wrap
> spi_nor_read_sfdp() using a kmalloc'ed bounce buffer which is
> the same implementation in Linux (drivers/mtd/spi-nor/sfdp.c).
>
> Signed-off-by: Vaishnav Achath <vaishnav.a@ti.com>
> ---

Applied to u-boot-spi/master
Tom Rini Dec. 12, 2023, 2:04 p.m. UTC | #3
On Sun, Jul 10, 2022 at 11:07:41AM +0530, Jagan Teki wrote:
> On Fri, Jun 3, 2022 at 12:31 PM Vaishnav Achath <vaishnav.a@ti.com> wrote:
> >
> > During SFDP header parse and BFPT parse, structures in stack are used
> > to perform spi_nor_read_sfdp() which expects a dma-safe buffer.
> >
> > This commit introduces spi_nor_read_sfdp_dma_unsafe() to wrap
> > spi_nor_read_sfdp() using a kmalloc'ed bounce buffer which is
> > the same implementation in Linux (drivers/mtd/spi-nor/sfdp.c).
> >
> > Signed-off-by: Vaishnav Achath <vaishnav.a@ti.com>
> > ---
> 
> Applied to u-boot-spi/master

Where did this end up? Thanks.
Jagan Teki Dec. 12, 2023, 5:19 p.m. UTC | #4
On Tue, Dec 12, 2023 at 7:34 PM Tom Rini <trini@konsulko.com> wrote:
>
> On Sun, Jul 10, 2022 at 11:07:41AM +0530, Jagan Teki wrote:
> > On Fri, Jun 3, 2022 at 12:31 PM Vaishnav Achath <vaishnav.a@ti.com> wrote:
> > >
> > > During SFDP header parse and BFPT parse, structures in stack are used
> > > to perform spi_nor_read_sfdp() which expects a dma-safe buffer.
> > >
> > > This commit introduces spi_nor_read_sfdp_dma_unsafe() to wrap
> > > spi_nor_read_sfdp() using a kmalloc'ed bounce buffer which is
> > > the same implementation in Linux (drivers/mtd/spi-nor/sfdp.c).
> > >
> > > Signed-off-by: Vaishnav Achath <vaishnav.a@ti.com>
> > > ---
> >
> > Applied to u-boot-spi/master
>
> Where did this end up? Thanks.

I have CI, will send PR. soon.

Jagan.
diff mbox series

Patch

diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c
index 3b7c817c02..90d05da1d8 100644
--- a/drivers/mtd/spi/spi-nor-core.c
+++ b/drivers/mtd/spi/spi-nor-core.c
@@ -2022,6 +2022,36 @@  read_err:
 	return ret;
 }
 
+/**
+ * spi_nor_read_sfdp_dma_unsafe() - read Serial Flash Discoverable Parameters.
+ * @nor:	pointer to a 'struct spi_nor'
+ * @addr:	offset in the SFDP area to start reading data from
+ * @len:	number of bytes to read
+ * @buf:	buffer where the SFDP data are copied into
+ *
+ * Wrap spi_nor_read_sfdp() using a kmalloc'ed bounce buffer as @buf is now not
+ * guaranteed to be dma-safe.
+ *
+ * Return: -ENOMEM if kmalloc() fails, the return code of spi_nor_read_sfdp()
+ *          otherwise.
+ */
+static int spi_nor_read_sfdp_dma_unsafe(struct spi_nor *nor, u32 addr,
+					size_t len, void *buf)
+{
+	void *dma_safe_buf;
+	int ret;
+
+	dma_safe_buf = kmalloc(len, GFP_KERNEL);
+	if (!dma_safe_buf)
+		return -ENOMEM;
+
+	ret = spi_nor_read_sfdp(nor, addr, len, dma_safe_buf);
+	memcpy(buf, dma_safe_buf, len);
+	kfree(dma_safe_buf);
+
+	return ret;
+}
+
 /* Fast Read settings. */
 
 static void
@@ -2195,7 +2225,7 @@  static int spi_nor_parse_bfpt(struct spi_nor *nor,
 		    bfpt_header->length * sizeof(u32));
 	addr = SFDP_PARAM_HEADER_PTP(bfpt_header);
 	memset(&bfpt, 0, sizeof(bfpt));
-	err = spi_nor_read_sfdp(nor,  addr, len, &bfpt);
+	err = spi_nor_read_sfdp_dma_unsafe(nor,  addr, len, &bfpt);
 	if (err < 0)
 		return err;
 
@@ -2480,7 +2510,7 @@  static int spi_nor_parse_sfdp(struct spi_nor *nor,
 	int i, err;
 
 	/* Get the SFDP header. */
-	err = spi_nor_read_sfdp(nor, 0, sizeof(header), &header);
+	err = spi_nor_read_sfdp_dma_unsafe(nor, 0, sizeof(header), &header);
 	if (err < 0)
 		return err;