From: Dave Stevenson <dave.stevenson@raspberrypi.org>
vchiq on Pi4 is no longer under the soc node, therefore it
doesn't get the dma-ranges for the VPU.
Switch to using the configuration of the old dma controller as
that will set the dma-ranges correctly.
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
.../interface/vchiq_arm/vchiq_arm.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
Hi Laurent, Dave,
On Mon, 2020-05-04 at 12:26 +0300, Laurent Pinchart wrote:
> From: Dave Stevenson <dave.stevenson@raspberrypi.org>
>
> vchiq on Pi4 is no longer under the soc node, therefore it
> doesn't get the dma-ranges for the VPU.
This is not true in upstream's device-tree, and AFAIK, from a HW perspective,
the VPU interface didn't change interconnects, it's still connected to /soc
(highlighted by the fact that it has its DMA limitations).
Why did you found the need to move vchiq into /scb downstream?
> Switch to using the configuration of the old dma controller as
> that will set the dma-ranges correctly.
Ultimately, this is no different than copying DMA constraints from, say, the
I2C bus controller. The fact that this is a DMA controller has nothing to with
VPU's view of the system's memory (which dma-ranges symbolizes).
BTW, Laurent, I learned all about DMA trough one of your talks, it really
helped to set everything in place at the time :).
Regards,
Nicolas
> Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> ---
> .../interface/vchiq_arm/vchiq_arm.c | 17 ++++++++++++++---
> 1 file changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> index 15ccd624aaab..d1a556f16499 100644
> --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> @@ -2719,6 +2719,7 @@ vchiq_register_child(struct platform_device *pdev, const
> char *name)
> {
> struct platform_device_info pdevinfo;
> struct platform_device *child;
> + struct device_node *np;
>
> memset(&pdevinfo, 0, sizeof(pdevinfo));
>
> @@ -2734,10 +2735,20 @@ vchiq_register_child(struct platform_device *pdev,
> const char *name)
> }
>
> /*
> - * We want the dma-ranges etc to be copied from the parent VCHIQ device
> - * to be passed on to the children too.
> + * We want the dma-ranges etc to be copied from a device with the
> + * correct dma-ranges for the VPU.
> + * VCHIQ on Pi4 is now under scb which doesn't get those dma-ranges.
> + * Take the "dma" node as going to be suitable as it sees the world
> + * through the same eyes as the VPU.
> */
> - of_dma_configure(&new_dev->dev, pdev->dev.of_node, true);
> + np = of_find_node_by_path("dma");
> + if (!np)
> + np = pdev->dev.of_node;
> +
> + of_dma_configure(&child->dev, np, true);
> +
> + if (np != pdev->dev.of_node)
> + of_node_put(np);
>
> return child;
> }
@@ -2719,6 +2719,7 @@ vchiq_register_child(struct platform_device *pdev, const char *name)
{
struct platform_device_info pdevinfo;
struct platform_device *child;
+ struct device_node *np;
memset(&pdevinfo, 0, sizeof(pdevinfo));
@@ -2734,10 +2735,20 @@ vchiq_register_child(struct platform_device *pdev, const char *name)
}
/*
- * We want the dma-ranges etc to be copied from the parent VCHIQ device
- * to be passed on to the children too.
+ * We want the dma-ranges etc to be copied from a device with the
+ * correct dma-ranges for the VPU.
+ * VCHIQ on Pi4 is now under scb which doesn't get those dma-ranges.
+ * Take the "dma" node as going to be suitable as it sees the world
+ * through the same eyes as the VPU.
*/
- of_dma_configure(&new_dev->dev, pdev->dev.of_node, true);
+ np = of_find_node_by_path("dma");
+ if (!np)
+ np = pdev->dev.of_node;
+
+ of_dma_configure(&child->dev, np, true);
+
+ if (np != pdev->dev.of_node)
+ of_node_put(np);
return child;
}