Re: [PATCH RESEND v4 v5 4/4] drm/vc4: Notify the firmware when DRM is in charge

Thomas Zimmermann
2022-01-11T09:38:41Z

[-- Attachment #1.1: Type: text/plain, Size: 2555 bytes --]

Hi

Am 15.12.21 um 10:51 schrieb Maxime Ripard:
> 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 | 22 ++++++++++++++++++++++
> 1 file changed, 22 insertions(+)
>
> diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
> index 86c61ee120b7..a03053c8e22c 100644
> --- 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"
> @@ -215,6 +217,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;
> @@ -251,10 +254,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;
> + }
> +

The code is

Acked-by: Thomas Zimmermann <tzimmermann@suse.de>

Just for my understanding:

You retrieve the firmware before killing simpledrm simply to keep the
display on if it fails, right?

What's the possible error that would justify a retry (via EPROBE_DEFER)?

Best regards
Thomas

> 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;

--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]