diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-5.4/950-0291-drm-vc4-Resolve-the-vblank-warnings-on-mode-switchin.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.4/950-0291-drm-vc4-Resolve-the-vblank-warnings-on-mode-switchin.patch | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.4/950-0291-drm-vc4-Resolve-the-vblank-warnings-on-mode-switchin.patch b/target/linux/bcm27xx/patches-5.4/950-0291-drm-vc4-Resolve-the-vblank-warnings-on-mode-switchin.patch new file mode 100644 index 0000000000..e50bdee8ae --- /dev/null +++ b/target/linux/bcm27xx/patches-5.4/950-0291-drm-vc4-Resolve-the-vblank-warnings-on-mode-switchin.patch @@ -0,0 +1,100 @@ +From a82d716ab4c2ab5f198f3461e32614defb52c724 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson <dave.stevenson@raspberrypi.org> +Date: Thu, 25 Jul 2019 17:27:44 +0100 +Subject: [PATCH] drm/vc4: Resolve the vblank warnings on mode + switching + +The details over when and how a driver is to service the +vblank events are sketchy, and the fkms driver was triggering +a kernel warning every time the crtc was enabled or disabled. + +Copy the event handling as used by the vc4-kms driver slightly +more closely, and we avoid the warnings. + +https://github.com/raspberrypi/linux/issues/3020 + +Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org> +--- + drivers/gpu/drm/vc4/vc4_firmware_kms.c | 48 ++++++++++++++++++-------- + 1 file changed, 33 insertions(+), 15 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_firmware_kms.c ++++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c +@@ -964,6 +964,7 @@ static void vc4_crtc_mode_set_nofb(struc + + static void vc4_crtc_disable(struct drm_crtc *crtc, struct drm_crtc_state *old_state) + { ++ struct drm_device *dev = crtc->dev; + struct drm_plane *plane; + + DRM_DEBUG_KMS("[CRTC:%d] vblanks off.\n", +@@ -979,6 +980,35 @@ static void vc4_crtc_disable(struct drm_ + + drm_atomic_crtc_for_each_plane(plane, crtc) + vc4_plane_atomic_disable(plane, plane->state); ++ ++ /* ++ * Make sure we issue a vblank event after disabling the CRTC if ++ * someone was waiting it. ++ */ ++ if (crtc->state->event) { ++ unsigned long flags; ++ ++ spin_lock_irqsave(&dev->event_lock, flags); ++ drm_crtc_send_vblank_event(crtc, crtc->state->event); ++ crtc->state->event = NULL; ++ spin_unlock_irqrestore(&dev->event_lock, flags); ++ } ++} ++ ++static void vc4_crtc_consume_event(struct drm_crtc *crtc) ++{ ++ struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); ++ struct drm_device *dev = crtc->dev; ++ unsigned long flags; ++ ++ crtc->state->event->pipe = drm_crtc_index(crtc); ++ ++ WARN_ON(drm_crtc_vblank_get(crtc) != 0); ++ ++ spin_lock_irqsave(&dev->event_lock, flags); ++ vc4_crtc->event = crtc->state->event; ++ crtc->state->event = NULL; ++ spin_unlock_irqrestore(&dev->event_lock, flags); + } + + static void vc4_crtc_enable(struct drm_crtc *crtc, struct drm_crtc_state *old_state) +@@ -988,6 +1018,7 @@ static void vc4_crtc_enable(struct drm_c + DRM_DEBUG_KMS("[CRTC:%d] vblanks on.\n", + crtc->base.id); + drm_crtc_vblank_on(crtc); ++ vc4_crtc_consume_event(crtc); + + /* Unblank the planes (if they're supposed to be displayed). */ + drm_atomic_crtc_for_each_plane(plane, crtc) +@@ -1059,23 +1090,10 @@ static int vc4_crtc_atomic_check(struct + static void vc4_crtc_atomic_flush(struct drm_crtc *crtc, + struct drm_crtc_state *old_state) + { +- struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); +- struct drm_device *dev = crtc->dev; +- + DRM_DEBUG_KMS("[CRTC:%d] crtc_atomic_flush.\n", + crtc->base.id); +- if (crtc->state->event) { +- unsigned long flags; +- +- crtc->state->event->pipe = drm_crtc_index(crtc); +- +- WARN_ON(drm_crtc_vblank_get(crtc) != 0); +- +- spin_lock_irqsave(&dev->event_lock, flags); +- vc4_crtc->event = crtc->state->event; +- crtc->state->event = NULL; +- spin_unlock_irqrestore(&dev->event_lock, flags); +- } ++ if (crtc->state->active && old_state->active && crtc->state->event) ++ vc4_crtc_consume_event(crtc); + } + + static void vc4_crtc_handle_page_flip(struct vc4_crtc *vc4_crtc) |