Thread (13 messages) flat view 13 messages, 5 authors, 2021-07-13

Re: [PATCH 2/4] remoteproc: imx_rproc: fix TCM io memory type

From: Dong Aisheng <hidden>
Date: 2021-07-07 06:09:16
Also in: linux-remoteproc

On Wed, Jul 7, 2021 at 10:20 AM Peng Fan [off-list ref] wrote:
quoted
Subject: [PATCH 2/4] remoteproc: imx_rproc: fix TCM io memory type

is_iomem was introduced in the commit 40df0a91b2a5 ("remoteproc: add
is_iomem to da_to_va"), but the driver seemed missed to provide the io type
correctly.
This patch updates remoteproc driver to indicate the TCM on IMX are io
memories. Without the change, remoteroc kick will fail.
All ATT_OWN memory are mapped using devm_ioremap, so only mark
TCM as io memories is not enough.

You could force all as iomem or update to use other map variants.
Will update, thanks.

Regards
Aisheng
quoted
Cc: Bjorn Andersson <redacted>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Peng Fan <peng.fan@nxp.com>
Fixes: 40df0a91b2a5 ("remoteproc: add is_iomem to da_to_va")
The i.MX8MN/Q is later that the patch, please update the fix.

Regards,
Peng.
quoted
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
---
 drivers/remoteproc/imx_rproc.c | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/drivers/remoteproc/imx_rproc.c
b/drivers/remoteproc/imx_rproc.c index d88f76f5305e..752f8ab258cf
100644
--- a/drivers/remoteproc/imx_rproc.c
+++ b/drivers/remoteproc/imx_rproc.c
@@ -71,6 +71,7 @@ struct imx_rproc_mem {
 /* att flags */
 /* M4 own area. Can be mapped at probe */
 #define ATT_OWN              BIT(1)
+#define ATT_IOMEM    BIT(2)

 /* address translation table */
 struct imx_rproc_att {
@@ -117,7 +118,7 @@ struct imx_rproc {
 static const struct imx_rproc_att imx_rproc_att_imx8mn[] = {
      /* dev addr , sys addr  , size      , flags */
      /* ITCM   */
-     { 0x00000000, 0x007E0000, 0x00020000, ATT_OWN },
+     { 0x00000000, 0x007E0000, 0x00020000, ATT_OWN | ATT_IOMEM },
      /* OCRAM_S */
      { 0x00180000, 0x00180000, 0x00009000, 0 },
      /* OCRAM */
@@ -131,7 +132,7 @@ static const struct imx_rproc_att
imx_rproc_att_imx8mn[] = {
      /* DDR (Code) - alias */
      { 0x10000000, 0x40000000, 0x0FFE0000, 0 },
      /* DTCM */
-     { 0x20000000, 0x00800000, 0x00020000, ATT_OWN },
+     { 0x20000000, 0x00800000, 0x00020000, ATT_OWN | ATT_IOMEM },
      /* OCRAM_S - alias */
      { 0x20180000, 0x00180000, 0x00008000, ATT_OWN },
      /* OCRAM */
@@ -147,7 +148,7 @@ static const struct imx_rproc_att
imx_rproc_att_imx8mn[] = {  static const struct imx_rproc_att
imx_rproc_att_imx8mq[] = {
      /* dev addr , sys addr  , size      , flags */
      /* TCML - alias */
-     { 0x00000000, 0x007e0000, 0x00020000, 0 },
+     { 0x00000000, 0x007e0000, 0x00020000, ATT_IOMEM},
      /* OCRAM_S */
      { 0x00180000, 0x00180000, 0x00008000, 0 },
      /* OCRAM */
@@ -159,9 +160,9 @@ static const struct imx_rproc_att
imx_rproc_att_imx8mq[] = {
      /* DDR (Code) - alias */
      { 0x10000000, 0x80000000, 0x0FFE0000, 0 },
      /* TCML */
-     { 0x1FFE0000, 0x007E0000, 0x00020000, ATT_OWN },
+     { 0x1FFE0000, 0x007E0000, 0x00020000, ATT_OWN  | ATT_IOMEM},
      /* TCMU */
-     { 0x20000000, 0x00800000, 0x00020000, ATT_OWN },
+     { 0x20000000, 0x00800000, 0x00020000, ATT_OWN  | ATT_IOMEM},
      /* OCRAM_S */
      { 0x20180000, 0x00180000, 0x00008000, ATT_OWN },
      /* OCRAM */
@@ -199,12 +200,12 @@ static const struct imx_rproc_att
imx_rproc_att_imx7d[] = {
      /* OCRAM_PXP (Code) - alias */
      { 0x00940000, 0x00940000, 0x00008000, 0 },
      /* TCML (Code) */
-     { 0x1FFF8000, 0x007F8000, 0x00008000, ATT_OWN },
+     { 0x1FFF8000, 0x007F8000, 0x00008000, ATT_OWN | ATT_IOMEM },
      /* DDR (Code) - alias, first part of DDR (Data) */
      { 0x10000000, 0x80000000, 0x0FFF0000, 0 },

      /* TCMU (Data) */
-     { 0x20000000, 0x00800000, 0x00008000, ATT_OWN },
+     { 0x20000000, 0x00800000, 0x00008000, ATT_OWN | ATT_IOMEM },
      /* OCRAM (Data) */
      { 0x20200000, 0x00900000, 0x00020000, 0 },
      /* OCRAM_EPDC (Data) */
@@ -218,18 +219,18 @@ static const struct imx_rproc_att
imx_rproc_att_imx7d[] = {  static const struct imx_rproc_att
imx_rproc_att_imx6sx[] = {
      /* dev addr , sys addr  , size      , flags */
      /* TCML (M4 Boot Code) - alias */
-     { 0x00000000, 0x007F8000, 0x00008000, 0 },
+     { 0x00000000, 0x007F8000, 0x00008000, ATT_IOMEM },
      /* OCRAM_S (Code) */
      { 0x00180000, 0x008F8000, 0x00004000, 0 },
      /* OCRAM_S (Code) - alias */
      { 0x00180000, 0x008FC000, 0x00004000, 0 },
      /* TCML (Code) */
-     { 0x1FFF8000, 0x007F8000, 0x00008000, ATT_OWN },
+     { 0x1FFF8000, 0x007F8000, 0x00008000, ATT_OWN | ATT_IOMEM },
      /* DDR (Code) - alias, first part of DDR (Data) */
      { 0x10000000, 0x80000000, 0x0FFF8000, 0 },

      /* TCMU (Data) */
-     { 0x20000000, 0x00800000, 0x00008000, ATT_OWN },
+     { 0x20000000, 0x00800000, 0x00008000, ATT_OWN | ATT_IOMEM },
      /* OCRAM_S (Data) - alias? */
      { 0x208F8000, 0x008F8000, 0x00004000, 0 },
      /* DDR (Data) */
@@ -341,7 +342,7 @@ static int imx_rproc_stop(struct rproc *rproc)  }

 static int imx_rproc_da_to_sys(struct imx_rproc *priv, u64 da,
-                            size_t len, u64 *sys)
+                            size_t len, u64 *sys, bool *is_iomem)
 {
      const struct imx_rproc_dcfg *dcfg = priv->dcfg;
      int i;
@@ -354,6 +355,8 @@ static int imx_rproc_da_to_sys(struct imx_rproc *priv,
u64 da,
                      unsigned int offset = da - att->da;

                      *sys = att->sa + offset;
+                     if (is_iomem)
+                             *is_iomem = att->flags & ATT_IOMEM;
                      return 0;
              }
      }
@@ -377,7 +380,7 @@ static void *imx_rproc_da_to_va(struct rproc *rproc,
u64 da, size_t len, bool *i
       * On device side we have many aliases, so we need to convert device
       * address (M4) to system bus address first.
       */
-     if (imx_rproc_da_to_sys(priv, da, len, &sys))
+     if (imx_rproc_da_to_sys(priv, da, len, &sys, is_iomem))
              return NULL;

      for (i = 0; i < IMX_RPROC_MEM_MAX; i++) {
--
2.25.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help