devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/3] drm/vc4: Use the firmware to stop the display pipeline
@ 2021-12-03 13:51 Maxime Ripard
  2021-12-03 13:51 ` [PATCH v2 1/3] firmware: raspberrypi: Add RPI_FIRMWARE_NOTIFY_DISPLAY_DONE Maxime Ripard
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Maxime Ripard @ 2021-12-03 13:51 UTC (permalink / raw)
  To: Ray Jui, Scott Branden, Maarten Lankhorst, Thomas Zimmermann,
	Maxime Ripard, Rob Herring, Frank Rowand, Florian Fainelli,
	Nicolas Saenz Julienne, Daniel Vetter, David Airlie
  Cc: Dave Stevenson, Phil Elwell, Tim Gover, Dom Cobley,
	linux-rpi-kernel, devicetree, linux-arm-kernel, dri-devel,
	bcm-kernel-feedback-list

Hi,

The VC4 driver has had limited support to disable the HDMI controllers and
pixelvalves at boot if the firmware has enabled them.

However, this proved to be limited, and a bit unreliable so a new firmware
command has been introduced some time ago to make it free all its resources and
disable any display output it might have enabled.

This series takes advantage of that command to call it once the transition from
simplefb to the KMS driver has been done.

Let me know what you think,
Maxime

---

Changes from v2:
  - Use of_find_compatible_node instead of a phandle
  - Use devm_rpi_firmware_get

Maxime Ripard (3):
  firmware: raspberrypi: Add RPI_FIRMWARE_NOTIFY_DISPLAY_DONE
  drm/vc4: Remove conflicting framebuffers before callind bind_all
  drm/vc4: Notify the firmware when DRM is in charge

 drivers/gpu/drm/vc4/vc4_drv.c              | 27 ++++++++++++++++++----
 drivers/gpu/drm/vc4/vc4_drv.h              |  2 ++
 include/soc/bcm2835/raspberrypi-firmware.h |  1 +
 3 files changed, 26 insertions(+), 4 deletions(-)

-- 
2.33.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/3] firmware: raspberrypi: Add RPI_FIRMWARE_NOTIFY_DISPLAY_DONE
  2021-12-03 13:51 [PATCH v2 0/3] drm/vc4: Use the firmware to stop the display pipeline Maxime Ripard
@ 2021-12-03 13:51 ` Maxime Ripard
  2021-12-03 13:51 ` [PATCH v2 2/3] drm/vc4: Remove conflicting framebuffers before callind bind_all Maxime Ripard
  2021-12-03 13:51 ` [PATCH v2 3/3] drm/vc4: Notify the firmware when DRM is in charge Maxime Ripard
  2 siblings, 0 replies; 5+ messages in thread
From: Maxime Ripard @ 2021-12-03 13:51 UTC (permalink / raw)
  To: Ray Jui, Scott Branden, Maarten Lankhorst, Thomas Zimmermann,
	Maxime Ripard, Rob Herring, Frank Rowand, Florian Fainelli,
	Nicolas Saenz Julienne, Daniel Vetter, David Airlie
  Cc: Dave Stevenson, Phil Elwell, Tim Gover, Dom Cobley,
	linux-rpi-kernel, devicetree, linux-arm-kernel, dri-devel,
	bcm-kernel-feedback-list

The RPI_FIRMWARE_NOTIFY_DISPLAY_DONE firmware call allows to tell the
firmware the kernel is in charge of the display now and the firmware can
free whatever resources it was using.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>
---
 include/soc/bcm2835/raspberrypi-firmware.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
index 73ad784fca96..811ea668c4a1 100644
--- a/include/soc/bcm2835/raspberrypi-firmware.h
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
@@ -91,6 +91,7 @@ enum rpi_firmware_property_tag {
 	RPI_FIRMWARE_GET_POE_HAT_VAL =                        0x00030049,
 	RPI_FIRMWARE_SET_POE_HAT_VAL =                        0x00030050,
 	RPI_FIRMWARE_NOTIFY_XHCI_RESET =                      0x00030058,
+	RPI_FIRMWARE_NOTIFY_DISPLAY_DONE =                    0x00030066,
 
 	/* Dispmanx TAGS */
 	RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE =                   0x00040001,
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/3] drm/vc4: Remove conflicting framebuffers before callind bind_all
  2021-12-03 13:51 [PATCH v2 0/3] drm/vc4: Use the firmware to stop the display pipeline Maxime Ripard
  2021-12-03 13:51 ` [PATCH v2 1/3] firmware: raspberrypi: Add RPI_FIRMWARE_NOTIFY_DISPLAY_DONE Maxime Ripard
@ 2021-12-03 13:51 ` Maxime Ripard
  2021-12-03 13:51 ` [PATCH v2 3/3] drm/vc4: Notify the firmware when DRM is in charge Maxime Ripard
  2 siblings, 0 replies; 5+ messages in thread
From: Maxime Ripard @ 2021-12-03 13:51 UTC (permalink / raw)
  To: Ray Jui, Scott Branden, Maarten Lankhorst, Thomas Zimmermann,
	Maxime Ripard, Rob Herring, Frank Rowand, Florian Fainelli,
	Nicolas Saenz Julienne, Daniel Vetter, David Airlie
  Cc: Dave Stevenson, Phil Elwell, Tim Gover, Dom Cobley,
	linux-rpi-kernel, devicetree, linux-arm-kernel, dri-devel,
	bcm-kernel-feedback-list

The bind hooks will modify their controller registers, so simplefb is
going to be unusable anyway. Let's avoid any transient state where it
could still be in the system but no longer functionnal.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>
---
 drivers/gpu/drm/vc4/vc4_drv.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
index 16abc3a3d601..8ab89f805826 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.c
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
@@ -251,6 +251,10 @@ static int vc4_drm_bind(struct device *dev)
 	if (ret)
 		return ret;
 
+	ret = drm_aperture_remove_framebuffers(false, &vc4_drm_driver);
+	if (ret)
+		return ret;
+
 	ret = component_bind_all(dev, drm);
 	if (ret)
 		return ret;
@@ -259,10 +263,6 @@ static int vc4_drm_bind(struct device *dev)
 	if (ret)
 		goto unbind_all;
 
-	ret = drm_aperture_remove_framebuffers(false, &vc4_drm_driver);
-	if (ret)
-		goto unbind_all;
-
 	ret = vc4_kms_load(drm);
 	if (ret < 0)
 		goto unbind_all;
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 3/3] drm/vc4: Notify the firmware when DRM is in charge
  2021-12-03 13:51 [PATCH v2 0/3] drm/vc4: Use the firmware to stop the display pipeline Maxime Ripard
  2021-12-03 13:51 ` [PATCH v2 1/3] firmware: raspberrypi: Add RPI_FIRMWARE_NOTIFY_DISPLAY_DONE Maxime Ripard
  2021-12-03 13:51 ` [PATCH v2 2/3] drm/vc4: Remove conflicting framebuffers before callind bind_all Maxime Ripard
@ 2021-12-03 13:51 ` Maxime Ripard
  2021-12-10  9:55   ` nicolas saenz julienne
  2 siblings, 1 reply; 5+ messages in thread
From: Maxime Ripard @ 2021-12-03 13:51 UTC (permalink / raw)
  To: Ray Jui, Scott Branden, Maarten Lankhorst, Thomas Zimmermann,
	Maxime Ripard, Rob Herring, Frank Rowand, Florian Fainelli,
	Nicolas Saenz Julienne, Daniel Vetter, David Airlie
  Cc: Dave Stevenson, Phil Elwell, Tim Gover, Dom Cobley,
	linux-rpi-kernel, devicetree, linux-arm-kernel, dri-devel,
	bcm-kernel-feedback-list

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 | 19 +++++++++++++++++++
 drivers/gpu/drm/vc4/vc4_drv.h |  2 ++
 2 files changed, 21 insertions(+)

diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
index 8ab89f805826..38d55a47c831 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"
@@ -251,10 +253,27 @@ static int vc4_drm_bind(struct device *dev)
 	if (ret)
 		return ret;
 
+	node = of_find_compatible_node(NULL, NULL, "raspberrypi,bcm2835-firmware");
+	if (node) {
+		vc4->firmware = devm_rpi_firmware_get(dev, node);
+		of_node_put(node);
+
+		if (!vc4->firmware)
+			return -EPROBE_DEFER;
+	}
+
 	ret = drm_aperture_remove_framebuffers(false, &vc4_drm_driver);
 	if (ret)
 		return ret;
 
+	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;
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index 4329e09d357c..b840654c53a9 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -76,6 +76,8 @@ struct vc4_dev {
 
 	unsigned int irq;
 
+	struct rpi_firmware *firmware;
+
 	struct vc4_hvs *hvs;
 	struct vc4_v3d *v3d;
 	struct vc4_dpi *dpi;
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 3/3] drm/vc4: Notify the firmware when DRM is in charge
  2021-12-03 13:51 ` [PATCH v2 3/3] drm/vc4: Notify the firmware when DRM is in charge Maxime Ripard
@ 2021-12-10  9:55   ` nicolas saenz julienne
  0 siblings, 0 replies; 5+ messages in thread
From: nicolas saenz julienne @ 2021-12-10  9:55 UTC (permalink / raw)
  To: Maxime Ripard, Ray Jui, Scott Branden, Maarten Lankhorst,
	Thomas Zimmermann, Rob Herring, Frank Rowand, Florian Fainelli,
	Daniel Vetter, David Airlie
  Cc: Dave Stevenson, Phil Elwell, Tim Gover, Dom Cobley,
	linux-rpi-kernel, devicetree, linux-arm-kernel, dri-devel,
	bcm-kernel-feedback-list

Hi Maxime,

On Fri, 2021-12-03 at 14:51 +0100, Maxime Ripard wrote:
> 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 | 19 +++++++++++++++++++
>  drivers/gpu/drm/vc4/vc4_drv.h |  2 ++
>  2 files changed, 21 insertions(+)
> 
> diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
> index 8ab89f805826..38d55a47c831 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"
> @@ -251,10 +253,27 @@ static int vc4_drm_bind(struct device *dev)
>  	if (ret)
>  		return ret;
>  
> +	node = of_find_compatible_node(NULL, NULL, "raspberrypi,bcm2835-firmware");
> +	if (node) {
> +		vc4->firmware = devm_rpi_firmware_get(dev, node);

I'm really sorry for contradicting myself, but I think it makes more sense to
do rpi_firmware_get() here...

> +		of_node_put(node);
> +
> +		if (!vc4->firmware)
> +			return -EPROBE_DEFER;
> +	}
> +
>  	ret = drm_aperture_remove_framebuffers(false, &vc4_drm_driver);
>  	if (ret)
>  		return ret;
>  
> +	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);
> +	}
> +

...and rpi_firmware_put() here. IIUC after this the fw handle isn't needed
anymore.

Other than that, the series looks fine to me.

Regards,
Nicolas

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-12-10  9:55 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-03 13:51 [PATCH v2 0/3] drm/vc4: Use the firmware to stop the display pipeline Maxime Ripard
2021-12-03 13:51 ` [PATCH v2 1/3] firmware: raspberrypi: Add RPI_FIRMWARE_NOTIFY_DISPLAY_DONE Maxime Ripard
2021-12-03 13:51 ` [PATCH v2 2/3] drm/vc4: Remove conflicting framebuffers before callind bind_all Maxime Ripard
2021-12-03 13:51 ` [PATCH v2 3/3] drm/vc4: Notify the firmware when DRM is in charge Maxime Ripard
2021-12-10  9:55   ` nicolas saenz julienne

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).