Skip to content

Commit

Permalink
drm/atomic: clear plane's CRTC and FB when shutting down
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Rob Clark authored and Daniel Vetter committed Nov 27, 2014
1 parent abd69c5 commit e5b5341
Showing 1 changed file with 13 additions and 6 deletions.
19 changes: 13 additions & 6 deletions drivers/gpu/drm/drm_atomic_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -1452,11 +1452,24 @@ int drm_atomic_helper_set_config(struct drm_mode_set *set)
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;
}

Expand All @@ -1466,12 +1479,6 @@ int drm_atomic_helper_set_config(struct drm_mode_set *set)
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;
Expand Down

0 comments on commit e5b5341

Please sign in to comment.