[PATCH V2 2/5] remoteproc: imx_rproc: fix TCM io memory type
Dong Aisheng
dongas86 at gmail.com
Wed Jul 14 03:25:02 PDT 2021
On Wed, Jul 14, 2021 at 9:12 AM Peng Fan <peng.fan at nxp.com> wrote:
>
> > Subject: [PATCH V2 2/5] 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
>
> missed->missing
>
> > correctly.
> > This patch updates remoteproc driver to indicate the TCM on IMX are io
> > memories. Without the change, remoteroc kick will fail.
>
> remoteroc->remoteproc
>
Will fix, thanks.
> >
> > Cc: Bjorn Andersson <bjorn.andersson at linaro.org>
> > Cc: Mathieu Poirier <mathieu.poirier at linaro.org>
> > Cc: Peng Fan <peng.fan at nxp.com>
> > Fixes: d59eedc0e408 ("remoteproc: imx_rproc: support i.MX8ULP")
>
> Drop this fix. 8ULP only support ROM loaded M33 images, no
> chance to let Kernel load M33 image.
Will drop, thanks
Regards
Aisheng
>
> > Fixes: 79806d32d5aa ("remoteproc: imx_rproc: support i.MX8MN/P")
> > Signed-off-by: Dong Aisheng <aisheng.dong at nxp.com>
> > ---
> > ChangeLog:
> > v1->v2:
> > * using ioremap_wc for non TCM memory
> > ---
> > drivers/remoteproc/imx_rproc.c | 35 ++++++++++++++++++++--------------
> > 1 file changed, 21 insertions(+), 14 deletions(-)
> >
> > diff --git a/drivers/remoteproc/imx_rproc.c
> > b/drivers/remoteproc/imx_rproc.c index d88f76f5305e..71dcc6dd32e4
> > 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++) { @@ -553,8 +556,12 @@
> > static int imx_rproc_addr_init(struct imx_rproc *priv,
> > if (b >= IMX_RPROC_MEM_MAX)
> > break;
> >
> > - priv->mem[b].cpu_addr = devm_ioremap(&pdev->dev,
> > - att->sa, att->size);
> > + if (att->flags & ATT_IOMEM)
> > + priv->mem[b].cpu_addr = devm_ioremap(&pdev->dev,
> > + att->sa, att->size);
> > + else
> > + priv->mem[b].cpu_addr = devm_ioremap_wc(&pdev->dev,
> > + att->sa, att->size);
> > if (!priv->mem[b].cpu_addr) {
> > dev_err(dev, "failed to remap %#x bytes from %#x\n", att->size,
> > att->sa);
> > return -ENOMEM;
>
>
> Besides the upper comments, looks ok to me.
> Reviewed-by: Peng Fan <peng.fan at nxp.com>
>
> > --
> > 2.25.1
>
More information about the linux-arm-kernel
mailing list