All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robin Murphy <robin.murphy@arm.com>
To: Paul Kocialkowski <paul.kocialkowski@bootlin.com>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org
Cc: Jernej Skrabec <jernej.skrabec@siol.net>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	Maxime Ripard <mripard@kernel.org>, Chen-Yu Tsai <wens@csie.org>,
	Rob Herring <robh+dt@kernel.org>,
	Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
	Frank Rowand <frowand.list@gmail.com>
Subject: Re: [PATCH 1/2] of: device: Allow DMA range map to be set before of_dma_configure_id
Date: Sat, 16 Jan 2021 14:57:43 +0000	[thread overview]
Message-ID: <ddf44e96-187b-91c0-822d-ade4f1e5be2b@arm.com> (raw)
In-Reply-To: <20210115175831.1184260-1-paul.kocialkowski@bootlin.com>

On 2021-01-15 17:58, Paul Kocialkowski wrote:
> A mechanism was recently introduced for the sunxi architecture where
> the DMA offset for specific devices (under the MBUS) is set by a common
> driver (sunxi_mbus). This driver calls dma_direct_set_offset to set
> the device's dma_range_map manually.
> 
> However this information was overwritten by of_dma_configure_id, which
> obtains the map from of_dma_get_range (or keeps it NULL when it fails
> and the force_dma argument is true, which is the case for platform
> devices).
> 
> As a result, the dma_range_map was always overwritten and the mechanism
> could not correctly take effect.
> 
> This adds a check to ensure that no previous DMA range map is
> overwritten and prints a warning when the map was already set while
> also being available from dt. In this case, the map that was already
> set is kept.

Hang on, the hard-coded offset is only intended to be installed when 
there *isn't* anything described in DT, in which case of_dma_get_range() 
should always bail out early without touching it anyway. This sounds 
like something's not quite right in the MBUS driver, so I don't think 
working around it in core code is really the right thing to do.

Do you have a case where one of the relevant devices inherits a 
"dma-ranges" via the regular hierarchy without indirecting via an 
"interconnects" reference? Currently you're only checking for the 
latter, so that would be one way things could go awry (although to be a 
problem, said "dma-ranges" would also have to encode something *other* 
than the appropriate MBUS offset, which implies an incorrect or at least 
inaccurately-structured DT as well).

Robin.

> Fixes: b4bdc4fbf8d0 ("soc: sunxi: Deal with the MBUS DMA offsets in a central place")
> Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
> ---
>   drivers/of/device.c | 9 ++++++++-
>   1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/of/device.c b/drivers/of/device.c
> index aedfaaafd3e7..db1b8634c2c7 100644
> --- a/drivers/of/device.c
> +++ b/drivers/of/device.c
> @@ -181,7 +181,14 @@ int of_dma_configure_id(struct device *dev, struct device_node *np,
>   
>   	arch_setup_dma_ops(dev, dma_start, size, iommu, coherent);
>   
> -	dev->dma_range_map = map;
> +	if (!dev->dma_range_map) {
> +		dev->dma_range_map = map;
> +	} else if (map) {
> +		dev_warn(dev,
> +			 "DMA range map was already set, ignoring range map from dt\n");
> +		kfree(map);
> +	}
> +
>   	return 0;
>   }
>   EXPORT_SYMBOL_GPL(of_dma_configure_id);
> 

WARNING: multiple messages have this Message-ID (diff)
From: Robin Murphy <robin.murphy@arm.com>
To: Paul Kocialkowski <paul.kocialkowski@bootlin.com>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org
Cc: Jernej Skrabec <jernej.skrabec@siol.net>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	Maxime Ripard <mripard@kernel.org>, Chen-Yu Tsai <wens@csie.org>,
	Rob Herring <robh+dt@kernel.org>,
	Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
	Frank Rowand <frowand.list@gmail.com>
Subject: Re: [PATCH 1/2] of: device: Allow DMA range map to be set before of_dma_configure_id
Date: Sat, 16 Jan 2021 14:57:43 +0000	[thread overview]
Message-ID: <ddf44e96-187b-91c0-822d-ade4f1e5be2b@arm.com> (raw)
In-Reply-To: <20210115175831.1184260-1-paul.kocialkowski@bootlin.com>

On 2021-01-15 17:58, Paul Kocialkowski wrote:
> A mechanism was recently introduced for the sunxi architecture where
> the DMA offset for specific devices (under the MBUS) is set by a common
> driver (sunxi_mbus). This driver calls dma_direct_set_offset to set
> the device's dma_range_map manually.
> 
> However this information was overwritten by of_dma_configure_id, which
> obtains the map from of_dma_get_range (or keeps it NULL when it fails
> and the force_dma argument is true, which is the case for platform
> devices).
> 
> As a result, the dma_range_map was always overwritten and the mechanism
> could not correctly take effect.
> 
> This adds a check to ensure that no previous DMA range map is
> overwritten and prints a warning when the map was already set while
> also being available from dt. In this case, the map that was already
> set is kept.

Hang on, the hard-coded offset is only intended to be installed when 
there *isn't* anything described in DT, in which case of_dma_get_range() 
should always bail out early without touching it anyway. This sounds 
like something's not quite right in the MBUS driver, so I don't think 
working around it in core code is really the right thing to do.

Do you have a case where one of the relevant devices inherits a 
"dma-ranges" via the regular hierarchy without indirecting via an 
"interconnects" reference? Currently you're only checking for the 
latter, so that would be one way things could go awry (although to be a 
problem, said "dma-ranges" would also have to encode something *other* 
than the appropriate MBUS offset, which implies an incorrect or at least 
inaccurately-structured DT as well).

Robin.

> Fixes: b4bdc4fbf8d0 ("soc: sunxi: Deal with the MBUS DMA offsets in a central place")
> Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
> ---
>   drivers/of/device.c | 9 ++++++++-
>   1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/of/device.c b/drivers/of/device.c
> index aedfaaafd3e7..db1b8634c2c7 100644
> --- a/drivers/of/device.c
> +++ b/drivers/of/device.c
> @@ -181,7 +181,14 @@ int of_dma_configure_id(struct device *dev, struct device_node *np,
>   
>   	arch_setup_dma_ops(dev, dma_start, size, iommu, coherent);
>   
> -	dev->dma_range_map = map;
> +	if (!dev->dma_range_map) {
> +		dev->dma_range_map = map;
> +	} else if (map) {
> +		dev_warn(dev,
> +			 "DMA range map was already set, ignoring range map from dt\n");
> +		kfree(map);
> +	}
> +
>   	return 0;
>   }
>   EXPORT_SYMBOL_GPL(of_dma_configure_id);
> 

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2021-01-16 18:03 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-15 17:58 [PATCH 1/2] of: device: Allow DMA range map to be set before of_dma_configure_id Paul Kocialkowski
2021-01-15 17:58 ` Paul Kocialkowski
2021-01-15 17:58 ` [PATCH 2/2] soc: sunxi: mbus: Remove DE2 display engine compatibles Paul Kocialkowski
2021-01-15 17:58   ` Paul Kocialkowski
2021-01-27 13:03   ` Paul Kocialkowski
2021-01-27 13:03     ` Paul Kocialkowski
2021-01-28 10:23     ` Maxime Ripard
2021-01-28 10:23       ` Maxime Ripard
2021-01-16 14:57 ` Robin Murphy [this message]
2021-01-16 14:57   ` [PATCH 1/2] of: device: Allow DMA range map to be set before of_dma_configure_id Robin Murphy
2021-01-16 17:07   ` Paul Kocialkowski
2021-01-16 17:07     ` Paul Kocialkowski
2021-01-18 13:27     ` Robin Murphy
2021-01-18 13:27       ` Robin Murphy
2021-01-19  9:04       ` Paul Kocialkowski
2021-01-19  9:04         ` Paul Kocialkowski
2021-01-27 13:01 ` Paul Kocialkowski
2021-01-27 13:01   ` Paul Kocialkowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ddf44e96-187b-91c0-822d-ade4f1e5be2b@arm.com \
    --to=robin.murphy@arm.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=devicetree@vger.kernel.org \
    --cc=frowand.list@gmail.com \
    --cc=jernej.skrabec@siol.net \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mripard@kernel.org \
    --cc=paul.kocialkowski@bootlin.com \
    --cc=robh+dt@kernel.org \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=wens@csie.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.