f07e572f64
bcm2708: boot tested on RPi B+ v1.2 bcm2709: boot tested on RPi 3B v1.2 and RPi 4B v1.1 4G bcm2710: boot tested on RPi 3B v1.2 bcm2711: boot tested on RPi 4B v1.1 4G Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
68 lines
2.3 KiB
Diff
68 lines
2.3 KiB
Diff
From 1fbbd377bd1c6b4e3342d03091f19089ccb7fcbe Mon Sep 17 00:00:00 2001
|
|
From: Jonathan Bell <jonathan@raspberrypi.org>
|
|
Date: Tue, 28 May 2019 13:56:06 +0100
|
|
Subject: [PATCH] drm: vc4: handle the case where there are no
|
|
available displays
|
|
|
|
It's reasonable for the firmware to return zero as the number of
|
|
attached displays. Handle this case as otherwise drm thinks that
|
|
the DSI panel is attached, which is nonsense.
|
|
|
|
Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
|
---
|
|
drivers/gpu/drm/vc4/vc4_firmware_kms.c | 32 +++++++++++++++-----------
|
|
1 file changed, 18 insertions(+), 14 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/vc4/vc4_firmware_kms.c
|
|
+++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c
|
|
@@ -1303,13 +1303,13 @@ static int vc4_fkms_bind(struct device *
|
|
RPI_FIRMWARE_FRAMEBUFFER_GET_NUM_DISPLAYS,
|
|
&num_displays, sizeof(u32));
|
|
|
|
- /* If we fail to get the number of displays, or it returns 0, then
|
|
+ /* If we fail to get the number of displays, then
|
|
* assume old firmware that doesn't have the mailbox call, so just
|
|
* set one display
|
|
*/
|
|
- if (ret || num_displays == 0) {
|
|
+ if (ret) {
|
|
num_displays = 1;
|
|
- DRM_WARN("Unable to determine number of displays's. Assuming 1\n");
|
|
+ DRM_WARN("Unable to determine number of displays - assuming 1\n");
|
|
ret = 0;
|
|
}
|
|
|
|
@@ -1338,17 +1338,21 @@ static int vc4_fkms_bind(struct device *
|
|
display_num);
|
|
}
|
|
|
|
- /* Map the SMI interrupt reg */
|
|
- crtc_list[0]->regs = vc4_ioremap_regs(pdev, 0);
|
|
- if (IS_ERR(crtc_list[0]->regs))
|
|
- DRM_ERROR("Oh dear, failed to map registers\n");
|
|
-
|
|
- writel(0, crtc_list[0]->regs + SMICS);
|
|
- ret = devm_request_irq(dev, platform_get_irq(pdev, 0),
|
|
- vc4_crtc_irq_handler, 0, "vc4 firmware kms",
|
|
- crtc_list);
|
|
- if (ret)
|
|
- DRM_ERROR("Oh dear, failed to register IRQ\n");
|
|
+ if (num_displays > 0) {
|
|
+ /* Map the SMI interrupt reg */
|
|
+ crtc_list[0]->regs = vc4_ioremap_regs(pdev, 0);
|
|
+ if (IS_ERR(crtc_list[0]->regs))
|
|
+ DRM_ERROR("Oh dear, failed to map registers\n");
|
|
+
|
|
+ writel(0, crtc_list[0]->regs + SMICS);
|
|
+ ret = devm_request_irq(dev, platform_get_irq(pdev, 0),
|
|
+ vc4_crtc_irq_handler, 0,
|
|
+ "vc4 firmware kms", crtc_list);
|
|
+ if (ret)
|
|
+ DRM_ERROR("Oh dear, failed to register IRQ\n");
|
|
+ } else {
|
|
+ DRM_WARN("No displays found. Consider forcing hotplug if HDMI is attached\n");
|
|
+ }
|
|
|
|
platform_set_drvdata(pdev, crtc_list);
|
|
|