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
Maxime Ripard (5): dt-bindings: display: vc4: Add optional phandle to firmware 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 ARM: dts: rpi: Add the firmware node to vc4
.../bindings/display/brcm,bcm2835-vc4.yaml | 5 ++++ arch/arm/boot/dts/bcm2835-rpi.dtsi | 4 +++ drivers/gpu/drm/vc4/vc4_drv.c | 27 ++++++++++++++++--- drivers/gpu/drm/vc4/vc4_drv.h | 2 ++ include/soc/bcm2835/raspberrypi-firmware.h | 1 + 5 files changed, 35 insertions(+), 4 deletions(-)
The firmware can free all the resources it was using to run the display engine that won't be needed once the kernel has taken over.
Thus, we need a phandle to the firmware DT node to be able to send that message when relevant.
Signed-off-by: Maxime Ripard maxime@cerno.tech --- .../devicetree/bindings/display/brcm,bcm2835-vc4.yaml | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml b/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml index 49a5e041aa49..18de6912b833 100644 --- a/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml +++ b/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml @@ -21,6 +21,11 @@ properties: - brcm,bcm2835-vc4 - brcm,cygnus-vc4
+ raspberrypi,firmware: + $ref: "/schemas/types.yaml#/definitions/phandle" + description: > + Phandle to the firmware node + required: - compatible
On Wed, Nov 17, 2021 at 03:50:36PM +0100, Maxime Ripard wrote:
The firmware can free all the resources it was using to run the display engine that won't be needed once the kernel has taken over.
Thus, we need a phandle to the firmware DT node to be able to send that message when relevant.
Why? Just use of_find_compatible_node().
Signed-off-by: Maxime Ripard maxime@cerno.tech
.../devicetree/bindings/display/brcm,bcm2835-vc4.yaml | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml b/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml index 49a5e041aa49..18de6912b833 100644 --- a/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml +++ b/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml @@ -21,6 +21,11 @@ properties: - brcm,bcm2835-vc4 - brcm,cygnus-vc4
- raspberrypi,firmware:
- $ref: "/schemas/types.yaml#/definitions/phandle"
- description: >
Phandle to the firmware node
required:
- compatible
-- 2.33.1
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,
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;
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..d09fa9c130da 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_parse_phandle(dev->of_node, "raspberrypi,firmware", 0); + if (node) { + vc4->firmware = rpi_firmware_get(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;
Add the firmware phandle to the vc4 node so that we can send it the message that we're done with the firmware display.
Signed-off-by: Maxime Ripard maxime@cerno.tech --- arch/arm/boot/dts/bcm2835-rpi.dtsi | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi index 87ddcad76083..bc5dc51ba579 100644 --- a/arch/arm/boot/dts/bcm2835-rpi.dtsi +++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi @@ -67,6 +67,10 @@ &usb { power-domains = <&power RPI_POWER_DOMAIN_USB>; };
+&vc4 { + raspberrypi,firmware = <&firmware>; +}; + &vec { power-domains = <&power RPI_POWER_DOMAIN_VEC>; status = "okay";
Hi Maxime,
On Wed, 2021-11-17 at 15:50 +0100, Maxime Ripard wrote:
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.
I think it would make sense to integrate this funtionality into 'reset/reset-raspberrypi.c' and pass it to VC4 as a reset controller. It fits the same startup situation as the one we have with the USB controller. Also, it would contain the firmware weirdness in a single spot.
Otherwise, please use 'devm_rpi_firmware_get()'.
Regards, Nicolas
Hi Nicolas,
On Tue, Nov 30, 2021 at 12:45:49PM +0100, nicolas saenz julienne wrote:
On Wed, 2021-11-17 at 15:50 +0100, Maxime Ripard wrote:
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.
I think it would make sense to integrate this funtionality into 'reset/reset-raspberrypi.c' and pass it to VC4 as a reset controller. It fits the same startup situation as the one we have with the USB controller. Also, it would contain the firmware weirdness in a single spot.
I don't really think it makes sense. It's not really made for that purpose, affects multiple devices (basically, all of the devices from the display pipeline), and can even have some side effects on clocks and memory. Plus, it can only be done once iirc, so a later call to reset the pipeline will be ineffective, even if we changed its state.
So yeah, it doesn't really fit into the reset abstraction.
Otherwise, please use 'devm_rpi_firmware_get()'.
Will do, thanks! Maxime
dri-devel@lists.freedesktop.org