drm/atomic-helper: check that drivers call drm_crtc_vblank_off
At least when they have vblank support they need to call this, or the vblank core will happily call into their crtc->enable_vblank callback even when the crtc is off. Which leads to a boom when the clocks are off on most hardware (besides the inevitable confusion in the book-keeping). The consistency checks in drm_vblank.c will then make sure that vblank_off/on calls are balanced, and if drivers forget to re-enable it all the commits will stall, so I think we're covered. It'd be nice to be able to place this check outside of commit helpers, but tha's not really possible (due to nonblocking commits and all that). Placing it into atomic helpers should at least cover most drivers. Also note that vblank support is still optional (for virtual drivers, which tend to not have this), check for that. v2: Fixup the handling for vblank_put (Rob). Cc: Rob Clark <robdclark@gmail.com> Tested-by: Rob Clark <robdclark@gmail.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171017152714.6849-1-daniel.vetter@ffwll.ch
This commit is contained in:
parent
81a7bd4a3f
commit
84014b0a39
|
@ -860,6 +860,7 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
|
||||||
|
|
||||||
for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
|
for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
|
||||||
const struct drm_crtc_helper_funcs *funcs;
|
const struct drm_crtc_helper_funcs *funcs;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Shut down everything that needs a full modeset. */
|
/* Shut down everything that needs a full modeset. */
|
||||||
if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
|
if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
|
||||||
|
@ -883,6 +884,14 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
|
||||||
funcs->disable(crtc);
|
funcs->disable(crtc);
|
||||||
else
|
else
|
||||||
funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
|
funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
|
||||||
|
|
||||||
|
if (!(dev->irq_enabled && dev->num_crtcs))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ret = drm_crtc_vblank_get(crtc);
|
||||||
|
WARN_ONCE(ret != -EINVAL, "driver forgot to call drm_crtc_vblank_off()\n");
|
||||||
|
if (ret == 0)
|
||||||
|
drm_crtc_vblank_put(crtc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue