]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/vc4: drv: Adopt the dma configuration from the HVS or V3D component
authorDave Stevenson <dave.stevenson@raspberrypi.com>
Mon, 13 Jun 2022 14:47:28 +0000 (16:47 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:24:20 +0000 (14:24 +0200)
[ Upstream commit f273cf20ff541641b92de55c5e5f21b86fc8a7bb ]

vc4_drv isn't necessarily under the /soc node in DT as it is a
virtual device, but it is the one that does the allocations.
The DMA addresses are consumed by primarily the HVS or V3D, and
those require VideoCore cache alias address mapping, and so will be
under /soc.

During probe find the a suitable device node for HVS or V3D,
and adopt the DMA configuration of that node.

Cc: <stable@vger.kernel.org>
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Link: https://lore.kernel.org/r/20220613144800.326124-2-maxime@cerno.tech
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/vc4/vc4_drv.c

index f6c16c5aee683617944cc57648528de40db41bdb..6e52801e2d9914d69d5654d3d71867454bd0dda5 100644 (file)
@@ -214,6 +214,15 @@ static void vc4_match_add_drivers(struct device *dev,
        }
 }
 
+const struct of_device_id vc4_dma_range_matches[] = {
+       { .compatible = "brcm,bcm2711-hvs" },
+       { .compatible = "brcm,bcm2835-hvs" },
+       { .compatible = "brcm,bcm2835-v3d" },
+       { .compatible = "brcm,cygnus-v3d" },
+       { .compatible = "brcm,vc4-v3d" },
+       {}
+};
+
 static int vc4_drm_bind(struct device *dev)
 {
        struct platform_device *pdev = to_platform_device(dev);
@@ -231,6 +240,16 @@ static int vc4_drm_bind(struct device *dev)
                vc4_drm_driver.driver_features &= ~DRIVER_RENDER;
        of_node_put(node);
 
+       node = of_find_matching_node_and_match(NULL, vc4_dma_range_matches,
+                                              NULL);
+       if (node) {
+               ret = of_dma_configure(dev, node, true);
+               of_node_put(node);
+
+               if (ret)
+                       return ret;
+       }
+
        vc4 = devm_drm_dev_alloc(dev, &vc4_drm_driver, struct vc4_dev, base);
        if (IS_ERR(vc4))
                return PTR_ERR(vc4);