aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_atomic_helper.c
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2014-11-26 18:58:04 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-11-27 15:39:11 +0100
commite5b5341c28c66a122982d3d8822a4f9a0938f923 (patch)
tree5bc62458e106e8e1acd5ce83864b13506267de8a /drivers/gpu/drm/drm_atomic_helper.c
parentdrm: Handle atomic state properly in kms getfoo ioctl (diff)
downloadlinux-dev-e5b5341c28c66a122982d3d8822a4f9a0938f923.tar.xz
linux-dev-e5b5341c28c66a122982d3d8822a4f9a0938f923.zip
drm/atomic: clear plane's CRTC and FB when shutting down
Otherwise we'd still end up w/ the plane attached to the CRTC, and seemingly active, but without an FB. Which ends up going *boom* in the drivers. Slightly modified version of Daniel's irc suggestion. Note that the big problem isn't drivers going *boom* here (since we already have the situation of planes being left enabled when the crtc goes down). The real issue is that the core assumes the primary plane always goes down when calling ->set_config with a NULL mode. Ignoring that assumption leads to the legacy state pointers plane->fb/crtc getting out of sync with atomic, and that then leads to the subsequent *boom* all over the place. CC: Daniel Vetter <daniel@ffwll.ch> Signed-off-by: Rob Clark <robdclark@gmail.com> [danvet: Drop my opinion of what's going sidewides here into the commit message as a note.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to '')
-rw-r--r--drivers/gpu/drm/drm_atomic_helper.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 2ee509c92034..4a78a773151c 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -1452,11 +1452,24 @@ retry:
goto fail;
}
+ primary_state = drm_atomic_get_plane_state(state, crtc->primary);
+ if (IS_ERR(primary_state)) {
+ ret = PTR_ERR(primary_state);
+ goto fail;
+ }
+
if (!set->mode) {
WARN_ON(set->fb);
WARN_ON(set->num_connectors);
crtc_state->enable = false;
+
+ ret = drm_atomic_set_crtc_for_plane(state, crtc->primary, NULL);
+ if (ret != 0)
+ goto fail;
+
+ drm_atomic_set_fb_for_plane(primary_state, NULL);
+
goto commit;
}
@@ -1466,12 +1479,6 @@ retry:
crtc_state->enable = true;
drm_mode_copy(&crtc_state->mode, set->mode);
- primary_state = drm_atomic_get_plane_state(state, crtc->primary);
- if (IS_ERR(primary_state)) {
- ret = PTR_ERR(primary_state);
- goto fail;
- }
-
ret = drm_atomic_set_crtc_for_plane(state, crtc->primary, crtc);
if (ret != 0)
goto fail;