[PATCH 2/4] remoteproc: imx_rproc: fix TCM io memory type
Peng Fan
peng.fan at nxp.com
Tue Jul 6 19:20:37 PDT 2021
> 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.
>
> 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: 40df0a91b2a5 ("remoteproc: add is_iomem to da_to_va")
The i.MX8MN/Q is later that the patch, please update the fix.
Regards,
Peng.
> Signed-off-by: Dong Aisheng <aisheng.dong at 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
More information about the linux-arm-kernel
mailing list