[PATCH V4 3/6] remoteproc: imx_rproc: fix TCM io memory type
Mathieu Poirier
mathieu.poirier at linaro.org
Mon Sep 20 09:59:20 PDT 2021
On Fri, Sep 10, 2021 at 05:06:18PM +0800, Peng Fan (OSS) wrote:
> From: Dong Aisheng <aisheng.dong at nxp.com>
>
> 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, remoteproc kick will fail.
If the kick fails on all these platforms, why was patch 40df0a91b2a5 ever
submitted at all? To me this is a serious problem that should have been caught
before it got sent to the mailing list.
I have applied this patch but based on the blatant problems this patchset
underscores, how can I trust future patches coming from NXP?
>
> Cc: Bjorn Andersson <bjorn.andersson at linaro.org>
> Cc: Mathieu Poirier <mathieu.poirier at linaro.org>
> Cc: Peng Fan <peng.fan at nxp.com>
> Reviewed-and-tested-by: Peng Fan <peng.fan at nxp.com>
> Fixes: 79806d32d5aa ("remoteproc: imx_rproc: support i.MX8MN/P")
> Signed-off-by: Dong Aisheng <aisheng.dong at nxp.com>
> Signed-off-by: Peng Fan <peng.fan at nxp.com>
> ---
> 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 d88f76f5305eb..71dcc6dd32e40 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;
> --
> 2.25.1
>
More information about the linux-arm-kernel
mailing list