drm/sun4i: mixer: Call of_dma_configure if there's an IOMMU
authorMaxime Ripard <maxime@cerno.tech>
Wed, 13 May 2020 14:07:24 +0000 (16:07 +0200)
committerMaxime Ripard <maxime@cerno.tech>
Tue, 23 Jun 2020 17:13:37 +0000 (19:13 +0200)
The main DRM device is actually a virtual device so it doesn't have the
iommus property, which is instead on the DMA masters, in this case the
mixers.

Add a call to of_dma_configure with the mixers DT node but on the DRM
virtual device to configure it in the same way than the mixers.

Reviewed-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/9a4daf438dd3f2fe07afb23688bfb793a0613d7d.1589378833.git-series.maxime@cerno.tech
(cherry picked from commit b718102dbdfd0285ad559687a30e27cc9124e592)
[Maxime: Applied to -fixes since it missed the merge window and display is
         broken without it]
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
drivers/gpu/drm/sun4i/sun8i_mixer.c

index 56cc037..cc4fb91 100644 (file)
@@ -363,6 +363,19 @@ static int sun8i_mixer_bind(struct device *dev, struct device *master,
        mixer->engine.ops = &sun8i_engine_ops;
        mixer->engine.node = dev->of_node;
 
+       if (of_find_property(dev->of_node, "iommus", NULL)) {
+               /*
+                * This assume we have the same DMA constraints for
+                * all our the mixers in our pipeline. This sounds
+                * bad, but it has always been the case for us, and
+                * DRM doesn't do per-device allocation either, so we
+                * would need to fix DRM first...
+                */
+               ret = of_dma_configure(drm->dev, dev->of_node, true);
+               if (ret)
+                       return ret;
+       }
+
        /*
         * While this function can fail, we shouldn't do anything
         * if this happens. Some early DE2 DT entries don't provide