From: Quanyang Wang <[email protected]>

In the document "S32G2 Reference Manual" Section 38.1.4, it says that
"QuadSPI AHB region 00000000h-1FFFFFFF is non-cacheable". So we
shouldn't use ioremap_cache to map this region since the system will
consider this region as normal cacheable memory. Let's use devm_ioremap
instead of ioremap_cache to avoid the calltrace as following:

     Internal error: synchronous external abort: 96000210 [#1] PREEMPT SMP
     Modules linked in:
     CPU: 1 PID: 346 Comm: mtd_debug Not tainted 5.10.41-rt42 #46
     Hardware name: Freescale S32G274A (DT)
     pstate: 20000005 (nzCv daif -PAN -UAO -TCO BTYPE=--)
     pc : __memcpy_fromio+0x48/0x98
     lr : s32gen1_exec_op+0xfc/0x288
     sp : ffffffc01132b750
     x29: ffffffc01132b750 x28: ffffffc01132be30
     x27: 00000055a7dfd2a0 x26: 0000000000000000
     x25: 00000000030f00cc x24: ffffffc01105d000
     x23: 0000000000000000 x22: ffffff8800bec600
     x21: ffffff88036c5100 x20: ffffffc01132bb00
     x19: ffffff8800be8600 x18: 0000000000000000
     x17: 0000000000000000 x16: 0000000000000000
     x15: 0000000000000000 x14: 0000000000000000
     x13: 0000000000000001 x12: 0000000000000108
     x11: 00000000000000ee x10: 0000000000000004
     x9 : 0000000000000000 x8 : 000000007b08765a
     x7 : 00287fe501ca1225 x6 : 0000000000000010
     x5 : 0000000034f0ba34 x4 : ffffffc014000000
     x3 : ffffff8804730f10 x2 : 0000000000000010
     x1 : ffffffc014000000 x0 : ffffff8804730f00
     Call trace:
      __memcpy_fromio+0x48/0x98
      spi_mem_exec_op+0x36c/0x3a0
      spi_mem_no_dirmap_read+0x98/0xb0
      spi_mem_dirmap_read+0xb8/0x140
      spi_nor_read_data+0x114/0x180
      spi_nor_read+0x94/0x110
      mtd_read_oob_std+0x78/0x88
      mtd_read_oob+0x7c/0x138
      mtd_read+0x48/0x78
      mtdchar_read+0x114/0x2a0
      vfs_read+0xac/0x1a0
      ksys_read+0x6c/0x100
      __arm64_sys_read+0x1c/0x28
      el0_svc_common.constprop.0+0x78/0x1a0
      do_el0_svc+0x24/0x90
      el0_svc+0x14/0x20
      el0_sync_handler+0xb0/0xb8
      el0_sync+0x180/0x1c0
     Code: aa0103e4 927df0c6 910020c6 8b060003 (f9400085)

Furthermore, revert "s32-gen1: spi-fsl-qspi: Map AHB buffer at first
read from QSPI" to unify the code with other SOCs.

Signed-off-by: Quanyang Wang <[email protected]>
---
Hi Bruce,

Would you please help merge this patch to the branches:
linux-yocto v5.10/standard/nxp-sdk-5.10/nxp-s32g2xx
linux-yocto v5.10/standard/preempt-rt/nxp-sdk-5.10/nxp-s32g2xx

Thanks,
Quanyang
---
 drivers/spi/s32gen1-qspi.c | 11 -----------
 drivers/spi/spi-fsl-qspi.c | 15 +++++----------
 2 files changed, 5 insertions(+), 21 deletions(-)

diff --git a/drivers/spi/s32gen1-qspi.c b/drivers/spi/s32gen1-qspi.c
index 12608915a22e..2d456045cbd0 100644
--- a/drivers/spi/s32gen1-qspi.c
+++ b/drivers/spi/s32gen1-qspi.c
@@ -6,8 +6,6 @@
 #include <linux/mtd/spi-nor.h>
 #include <linux/types.h>
 #include <linux/mm.h>
-#include <linux/cache.h>
-#include <asm/cacheflush.h>
 #include <linux/ktime.h>
 #include <linux/math64.h>
 #include <asm/div64.h>
@@ -1018,21 +1016,12 @@ static int qspi_read_mem(struct fsl_qspi *q,
        u64 mb_int, mb_frac;
        u32 us_passed, rem;
 
-       if (!q->ahb_addr) {
-               q->ahb_addr = ioremap_cache(QUADSPI_AHB_BASE,
-                               q->devtype_data->ahb_buf_size);
-               if (!q->ahb_addr)
-                       return -ENOMEM;
-       }
-
        while (qspi_readl(q, base + QUADSPI_SR) & QUADSPI_SR_BUSY_MASK)
                ;
        mcr_reg = clear_fifos(q);
        qspi_writel(q, lut_cfg << QUADSPI_BFGENCR_SEQID_SHIFT,
                        base + QUADSPI_BFGENCR);
 
-       __inval_dcache_area((void __force *)q->ahb_addr + op->addr.val, 
op->data.nbytes);
-
        /* Read out the data directly from the AHB buffer. */
        ktime_get_ts64(&start);
        memcpy_fromio(op->data.buf.in, q->ahb_addr + op->addr.val,
diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c
index fc9e1efb566d..bc8959823654 100644
--- a/drivers/spi/spi-fsl-qspi.c
+++ b/drivers/spi/spi-fsl-qspi.c
@@ -743,13 +743,11 @@ static int fsl_qspi_probe(struct platform_device *pdev)
                                        "QuadSPI-memory");
        q->memmap_phy = res->start;
        /* Since there are 4 cs, map size required is 4 times ahb_buf_size */
-       if (!is_s32gen1_qspi(q)) {
-               q->ahb_addr = devm_ioremap(dev, q->memmap_phy,
-                               (q->devtype_data->ahb_buf_size * 4));
-               if (!q->ahb_addr) {
-                       ret = -ENOMEM;
-                       goto err_put_ctrl;
-               }
+       q->ahb_addr = devm_ioremap(dev, q->memmap_phy,
+                                  (q->devtype_data->ahb_buf_size * 4));
+       if (!q->ahb_addr) {
+               ret = -ENOMEM;
+               goto err_put_ctrl;
        }
 
        /* find the clocks */
@@ -840,9 +838,6 @@ static int fsl_qspi_remove(struct platform_device *pdev)
 {
        struct fsl_qspi *q = platform_get_drvdata(pdev);
 
-       if (q->ahb_addr)
-               iounmap(q->ahb_addr);
-
        /* disable the hardware */
        qspi_writel(q, QUADSPI_MCR_MDIS_MASK, q->iobase + QUADSPI_MCR);
        qspi_writel(q, 0x0, q->iobase + QUADSPI_RSER);
-- 
2.25.1

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#10944): 
https://lists.yoctoproject.org/g/linux-yocto/message/10944
Mute This Topic: https://lists.yoctoproject.org/mt/89156119/21656
Group Owner: [email protected]
Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to