aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0901-drm-vc4-drv-Register-a-different-driver-on-BCM2711.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0901-drm-vc4-drv-Register-a-different-driver-on-BCM2711.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0901-drm-vc4-drv-Register-a-different-driver-on-BCM2711.patch128
1 files changed, 128 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0901-drm-vc4-drv-Register-a-different-driver-on-BCM2711.patch b/target/linux/bcm27xx/patches-5.15/950-0901-drm-vc4-drv-Register-a-different-driver-on-BCM2711.patch
new file mode 100644
index 0000000000..515a3b59a4
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0901-drm-vc4-drv-Register-a-different-driver-on-BCM2711.patch
@@ -0,0 +1,128 @@
+From bf001e8bacbf627525ec90027bfea19b788d6d8e Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime@cerno.tech>
+Date: Thu, 21 Apr 2022 11:08:22 +0200
+Subject: [PATCH] drm/vc4: drv: Register a different driver on BCM2711
+
+Prior to the BCM2711/RaspberryPi4, the GPU was a part of the display
+components of the SoC. It was thus a part of the vc4 driver.
+
+However, with the BCM2711, it got split out and thus the v3d driver was
+created. The vc4 driver now only handles the display part.
+
+We didn't properly split out the code when doing the BCM2711 support
+though, and most of the code around buffer allocations is still
+involved, even though it doesn't have the backing hardware anymore.
+
+Let's start the split out by creating a new drm_driver that only reports
+and uses what we support on the BCM2711. The ioctl were properly
+filtered already, but we were still exposing a .gem_create_object hook,
+as well as having an .open and .postclose hooks which are only relevant
+on older generations.
+
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+---
+ drivers/gpu/drm/vc4/vc4_drv.c | 51 ++++++++++++++++++++++++++++-------
+ 1 file changed, 42 insertions(+), 9 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -78,6 +78,19 @@ int vc4_dumb_fixup_args(struct drm_mode_
+ return 0;
+ }
+
++static int vc4_dumb_create(struct drm_file *file_priv,
++ struct drm_device *dev,
++ struct drm_mode_create_dumb *args)
++{
++ int ret;
++
++ ret = vc4_dumb_fixup_args(args);
++ if (ret)
++ return ret;
++
++ return drm_gem_cma_dumb_create_internal(file_priv, dev, args);
++}
++
+ static int vc4_get_param_ioctl(struct drm_device *dev, void *data,
+ struct drm_file *file_priv)
+ {
+@@ -175,7 +188,7 @@ static const struct drm_ioctl_desc vc4_d
+ DRM_IOCTL_DEF_DRV(VC4_PERFMON_GET_VALUES, vc4_perfmon_get_values_ioctl, DRM_RENDER_ALLOW),
+ };
+
+-static struct drm_driver vc4_drm_driver = {
++static const struct drm_driver vc4_drm_driver = {
+ .driver_features = (DRIVER_MODESET |
+ DRIVER_ATOMIC |
+ DRIVER_GEM |
+@@ -204,6 +217,27 @@ static struct drm_driver vc4_drm_driver
+ .patchlevel = DRIVER_PATCHLEVEL,
+ };
+
++static const struct drm_driver vc5_drm_driver = {
++ .driver_features = (DRIVER_MODESET |
++ DRIVER_ATOMIC |
++ DRIVER_GEM),
++
++#if defined(CONFIG_DEBUG_FS)
++ .debugfs_init = vc4_debugfs_init,
++#endif
++
++ DRM_GEM_CMA_DRIVER_OPS_WITH_DUMB_CREATE(vc4_dumb_create),
++
++ .fops = &vc4_drm_fops,
++
++ .name = DRIVER_NAME,
++ .desc = DRIVER_DESC,
++ .date = DRIVER_DATE,
++ .major = DRIVER_MAJOR,
++ .minor = DRIVER_MINOR,
++ .patchlevel = DRIVER_PATCHLEVEL,
++};
++
+ static int compare_dev(struct device *dev, void *data)
+ {
+ return dev == data;
+@@ -254,6 +288,7 @@ static bool firmware_kms(void)
+ static int vc4_drm_bind(struct device *dev)
+ {
+ struct platform_device *pdev = to_platform_device(dev);
++ const struct drm_driver *driver;
+ struct rpi_firmware *firmware = NULL;
+ struct drm_device *drm;
+ struct vc4_dev *vc4;
+@@ -265,12 +300,10 @@ static int vc4_drm_bind(struct device *d
+ dev->coherent_dma_mask = DMA_BIT_MASK(32);
+
+ is_vc5 = of_device_is_compatible(dev->of_node, "brcm,bcm2711-vc5");
+-
+- /* If VC4 V3D is missing, don't advertise render nodes. */
+- node = of_find_matching_node_and_match(NULL, vc4_v3d_dt_match, NULL);
+- if (!node || !of_device_is_available(node))
+- vc4_drm_driver.driver_features &= ~DRIVER_RENDER;
+- of_node_put(node);
++ if (is_vc5)
++ driver = &vc5_drm_driver;
++ else
++ driver = &vc4_drm_driver;
+
+ node = of_find_matching_node_and_match(NULL, vc4_dma_range_matches,
+ NULL);
+@@ -282,7 +315,7 @@ static int vc4_drm_bind(struct device *d
+ return ret;
+ }
+
+- vc4 = devm_drm_dev_alloc(dev, &vc4_drm_driver, struct vc4_dev, base);
++ vc4 = devm_drm_dev_alloc(dev, driver, struct vc4_dev, base);
+ if (IS_ERR(vc4))
+ return PTR_ERR(vc4);
+ vc4->is_vc5 = is_vc5;
+@@ -314,7 +347,7 @@ static int vc4_drm_bind(struct device *d
+ return -EPROBE_DEFER;
+ }
+
+- ret = drm_aperture_remove_framebuffers(false, &vc4_drm_driver);
++ ret = drm_aperture_remove_framebuffers(false, driver);
+ if (ret)
+ return ret;
+