| From ce0210c12433031aba3bbacd75f4c02ab77f2004 Mon Sep 17 00:00:00 2001 |
| From: Neil Armstrong <narmstrong@baylibre.com> |
| Date: Mon, 14 Jan 2019 16:31:18 +0100 |
| Subject: drm/meson: Fix atomic mode switching regression |
| |
| From: Neil Armstrong <narmstrong@baylibre.com> |
| |
| commit ce0210c12433031aba3bbacd75f4c02ab77f2004 upstream. |
| |
| Since commit 2bcd3ecab773 when switching mode from X11 (ubuntu mate for |
| example) the display gets blurry, looking like an invalid framebuffer width. |
| |
| This commit fixed atomic crtc modesetting in a totally wrong way and |
| introduced a local unnecessary ->enabled crtc state. |
| |
| This commit reverts the crctc _begin() and _enable() changes and simply |
| adds drm_atomic_helper_commit_tail_rpm as helper. |
| |
| Reported-by: Tony McKahan <tonymckahan@gmail.com> |
| Suggested-by: Daniel Vetter <daniel@ffwll.ch> |
| Fixes: 2bcd3ecab773 ("drm/meson: Fixes for drm_crtc_vblank_on/off support") |
| Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> |
| Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| [narmstrong: fixed blank line issue from checkpatch] |
| Link: https://patchwork.freedesktop.org/patch/msgid/20190114153118.8024-1-narmstrong@baylibre.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/meson/meson_crtc.c | 23 ++--------------------- |
| drivers/gpu/drm/meson/meson_drv.c | 5 +++++ |
| 2 files changed, 7 insertions(+), 21 deletions(-) |
| |
| --- a/drivers/gpu/drm/meson/meson_crtc.c |
| +++ b/drivers/gpu/drm/meson/meson_crtc.c |
| @@ -45,7 +45,6 @@ struct meson_crtc { |
| struct drm_crtc base; |
| struct drm_pending_vblank_event *event; |
| struct meson_drm *priv; |
| - bool enabled; |
| }; |
| #define to_meson_crtc(x) container_of(x, struct meson_crtc, base) |
| |
| @@ -81,7 +80,8 @@ static const struct drm_crtc_funcs meson |
| |
| }; |
| |
| -static void meson_crtc_enable(struct drm_crtc *crtc) |
| +static void meson_crtc_atomic_enable(struct drm_crtc *crtc, |
| + struct drm_crtc_state *old_state) |
| { |
| struct meson_crtc *meson_crtc = to_meson_crtc(crtc); |
| struct drm_crtc_state *crtc_state = crtc->state; |
| @@ -103,20 +103,6 @@ static void meson_crtc_enable(struct drm |
| |
| drm_crtc_vblank_on(crtc); |
| |
| - meson_crtc->enabled = true; |
| -} |
| - |
| -static void meson_crtc_atomic_enable(struct drm_crtc *crtc, |
| - struct drm_crtc_state *old_state) |
| -{ |
| - struct meson_crtc *meson_crtc = to_meson_crtc(crtc); |
| - struct meson_drm *priv = meson_crtc->priv; |
| - |
| - DRM_DEBUG_DRIVER("\n"); |
| - |
| - if (!meson_crtc->enabled) |
| - meson_crtc_enable(crtc); |
| - |
| priv->viu.osd1_enabled = true; |
| } |
| |
| @@ -142,8 +128,6 @@ static void meson_crtc_atomic_disable(st |
| |
| crtc->state->event = NULL; |
| } |
| - |
| - meson_crtc->enabled = false; |
| } |
| |
| static void meson_crtc_atomic_begin(struct drm_crtc *crtc, |
| @@ -152,9 +136,6 @@ static void meson_crtc_atomic_begin(stru |
| struct meson_crtc *meson_crtc = to_meson_crtc(crtc); |
| unsigned long flags; |
| |
| - if (crtc->state->enable && !meson_crtc->enabled) |
| - meson_crtc_enable(crtc); |
| - |
| if (crtc->state->event) { |
| WARN_ON(drm_crtc_vblank_get(crtc) != 0); |
| |
| --- a/drivers/gpu/drm/meson/meson_drv.c |
| +++ b/drivers/gpu/drm/meson/meson_drv.c |
| @@ -82,6 +82,10 @@ static const struct drm_mode_config_func |
| .fb_create = drm_gem_fb_create, |
| }; |
| |
| +static const struct drm_mode_config_helper_funcs meson_mode_config_helpers = { |
| + .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm, |
| +}; |
| + |
| static irqreturn_t meson_irq(int irq, void *arg) |
| { |
| struct drm_device *dev = arg; |
| @@ -246,6 +250,7 @@ static int meson_drv_bind_master(struct |
| drm->mode_config.max_width = 3840; |
| drm->mode_config.max_height = 2160; |
| drm->mode_config.funcs = &meson_mode_config_funcs; |
| + drm->mode_config.helper_private = &meson_mode_config_helpers; |
| |
| /* Hardware Initialization */ |
| |