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

Thomas Zimmermann tzimmermann at suse.de
Tue Jan 11 01:38:36 PST 2022


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 at 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 at 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20220111/b59d9a1d/attachment.sig>


More information about the linux-arm-kernel mailing list