drm/vc4: Notify the firmware when DRM is in charge
authorMaxime Ripard <maxime@cerno.tech>
Wed, 23 Jun 2021 09:54:58 +0000 (11:54 +0200)
committerPhil Elwell <8911409+pelwell@users.noreply.github.com>
Fri, 2 Jul 2021 12:03:14 +0000 (13:03 +0100)
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>
drivers/gpu/drm/vc4/vc4_drv.c

index 9b9d088..0d343e0 100644 (file)
@@ -36,6 +36,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"
@@ -305,8 +307,25 @@ static int vc4_drm_bind(struct device *dev)
        if (ret)
                return ret;
 
+       node = of_parse_phandle(dev->of_node, "raspberrypi,firmware", 0);
+       if (node) {
+               vc4->firmware = rpi_firmware_get(dev->of_node);
+               of_node_put(node);
+
+               if (!vc4->firmware)
+                       return -EPROBE_DEFER;
+       }
+
        drm_fb_helper_remove_conflicting_framebuffers(NULL, "vc4drmfb", false);
 
+       if (vc4->firmware) {
+               ret = rpi_firmware_property(vc4->firmware,
+                                           RPI_FIRMWARE_NOTIFY_DISPLAY_DONE,
+                                           NULL, 0);
+               if (ret)
+                       drm_warn(drm, "Couldn't stop firmware display driver: %d\n", ret);
+       }
+
        ret = component_bind_all(dev, drm);
        if (ret)
                return ret;