diff options
author | Álvaro Fernández Rojas <noltari@gmail.com> | 2022-05-16 23:40:32 +0200 |
---|---|---|
committer | Álvaro Fernández Rojas <noltari@gmail.com> | 2022-05-17 15:11:22 +0200 |
commit | 20ea6adbf199097c4f5f591ffee088340630dae4 (patch) | |
tree | d6719d95e136611a1c25bbf7789652d6d402779d /target/linux/bcm27xx/patches-5.15/950-0901-drm-vc4-drv-Register-a-different-driver-on-BCM2711.patch | |
parent | bca05bd072180dc38ef740b37ded9572a6db1981 (diff) | |
download | upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.gz upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.bz2 upstream-20ea6adbf199097c4f5f591ffee088340630dae4.zip |
bcm27xx: add support for linux v5.15
Build system: x86_64
Build-tested: bcm2708, bcm2709, bcm2710, bcm2711
Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B
Signed-off-by: Marty Jones <mj8263788@gmail.com>
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
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.patch | 128 |
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; + |