aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0024-drm-vc4-Notify-the-firmware-when-DRM-is-in-charge.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0024-drm-vc4-Notify-the-firmware-when-DRM-is-in-charge.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0024-drm-vc4-Notify-the-firmware-when-DRM-is-in-charge.patch69
1 files changed, 69 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0024-drm-vc4-Notify-the-firmware-when-DRM-is-in-charge.patch b/target/linux/bcm27xx/patches-5.15/950-0024-drm-vc4-Notify-the-firmware-when-DRM-is-in-charge.patch
new file mode 100644
index 0000000000..04db8fb1d5
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0024-drm-vc4-Notify-the-firmware-when-DRM-is-in-charge.patch
@@ -0,0 +1,69 @@
+From 9e9177db83609c19bbe523cc4d20119cf09ea787 Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime@cerno.tech>
+Date: Wed, 15 Dec 2021 10:51:17 +0100
+Subject: [PATCH] drm/vc4: Notify the firmware when DRM is in charge
+
+Once the call to drm_fb_helper_remove_conflicting_framebuffers() has
+been made, simplefb has been unregistered and the KMS driver is entirely
+in charge of the display.
+
+Thus, we can notify the firmware it can free whatever resource it was
+using to maintain simplefb functional.
+
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
+Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
+Link: https://patchwork.freedesktop.org/patch/msgid/20211215095117.176435-5-maxime@cerno.tech
+---
+ drivers/gpu/drm/vc4/vc4_drv.c | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -37,6 +37,8 @@
+ #include <drm/drm_fb_helper.h>
+ #include <drm/drm_vblank.h>
+
++#include <soc/bcm2835/raspberrypi-firmware.h>
++
+ #include "uapi/drm/vc4_drm.h"
+
+ #include "vc4_drv.h"
+@@ -217,6 +219,7 @@ static void vc4_match_add_drivers(struct
+ static int vc4_drm_bind(struct device *dev)
+ {
+ struct platform_device *pdev = to_platform_device(dev);
++ struct rpi_firmware *firmware = NULL;
+ struct drm_device *drm;
+ struct vc4_dev *vc4;
+ struct device_node *node;
+@@ -253,10 +256,29 @@ static int vc4_drm_bind(struct device *d
+ if (ret)
+ return ret;
+
++ node = of_find_compatible_node(NULL, NULL, "raspberrypi,bcm2835-firmware");
++ if (node) {
++ firmware = rpi_firmware_get(node);
++ of_node_put(node);
++
++ if (!firmware)
++ return -EPROBE_DEFER;
++ }
++
+ ret = drm_aperture_remove_framebuffers(false, &vc4_drm_driver);
+ if (ret)
+ return ret;
+
++ if (firmware) {
++ ret = rpi_firmware_property(firmware,
++ RPI_FIRMWARE_NOTIFY_DISPLAY_DONE,
++ NULL, 0);
++ if (ret)
++ drm_warn(drm, "Couldn't stop firmware display driver: %d\n", ret);
++
++ rpi_firmware_put(firmware);
++ }
++
+ ret = component_bind_all(dev, drm);
+ if (ret)
+ return ret;