drm/vc4: Notify the firmware when DRM is in charge
authorMaxime Ripard <maxime@cerno.tech>
Wed, 15 Dec 2021 09:51:17 +0000 (10:51 +0100)
committerDom Cobley <popcornmix@gmail.com>
Mon, 21 Mar 2022 16:03:45 +0000 (16:03 +0000)
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

index 3c0c7e77b4c8841ded949d073e7e45749a27e42e..2150637e40dc919f615cc41f52d92efca0aa759e 100644 (file)
@@ -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 device *dev,
 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 *dev)
        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;