[PATCH] drm/omap: Fix drm_handle_vblank() handling for command mode panels
Tony Lindgren
tony at atomide.com
Tue Feb 25 18:37:33 UTC 2020
When trying to run weston on droid4 with the updated sgx blobs, the LCD
is just black and not updating. Weston also displays the following on
startup:
Warning: computed repaint delay is insane: -205475 msec
Weston runs fine on the HDMI alone though, and the issue was narrowed
down to an issue with vblank as suggested by ruleh <ruleh at gmx.de>.
Turns out that for command mode displays, we're not currently calling
drm_handle_vblank() at all since omap_irq_handler() won't do it for
us since we get no vblank interrupts. Let's fix the issue by calling
drm_handle_vblank() and omap_crtc_vblank_irq() for command mode
displays from omap_crtc_framedone_irq(). And we can now remove the
old partial handling in omap_crtc_framedone_irq().
For reference, below is my current weston.ini. The repaint-window is
maxed out to force immediate repaint instead of the default 7 ms.
Otherwise it seems that the repaint is happening at about 60 fps with
es2gears_wayland compared to about 130 fps where it seems to max out.
[core]
xwayland=true
backend=drm-backend.so
repaint-window=1000
pageflip-timeout=1000
[libinput]
rotation=0
[output]
name=DSI-1
transform=90
[output]
name=HDMI-1
mode=1024x768 at 60
Fixes: 47103a80f55a ("drm/omap: add framedone interrupt support")
Cc: Ivaylo Dimitrov <ivo.g.dimitrov.75 at gmail.com>
Cc: Merlijn Wajer <merlijn at wizzup.org>
Cc: Sebastian Reichel <sre at kernel.org>
Cc: ruleh <ruleh at gmx.de>
Signed-off-by: Tony Lindgren <tony at atomide.com>
---
Only lightly tested so far, please test. Also, I'm not sure if we
should get the id from somewhere for drm_handle_vblank() instead of
just using 0?
---
drivers/gpu/drm/omapdrm/omap_crtc.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -326,21 +326,19 @@ void omap_crtc_vblank_irq(struct drm_crtc *crtc)
void omap_crtc_framedone_irq(struct drm_crtc *crtc, uint32_t irqstatus)
{
+ struct omap_crtc_state *omap_state = to_omap_crtc_state(crtc->state);
struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+ struct drm_device *dev = crtc->dev;
if (!omap_crtc->framedone_handler)
return;
- omap_crtc->framedone_handler(omap_crtc->framedone_handler_data);
-
- spin_lock(&crtc->dev->event_lock);
- /* Send the vblank event if one has been requested. */
- if (omap_crtc->event) {
- drm_crtc_send_vblank_event(crtc, omap_crtc->event);
- omap_crtc->event = NULL;
+ if (omap_state->manually_updated) {
+ drm_handle_vblank(dev, 0);
+ omap_crtc_vblank_irq(crtc);
}
- omap_crtc->pending = false;
- spin_unlock(&crtc->dev->event_lock);
+
+ omap_crtc->framedone_handler(omap_crtc->framedone_handler_data);
/* Wake up omap_atomic_complete. */
wake_up(&omap_crtc->pending_wait);
--
2.25.1
More information about the dri-devel
mailing list