drm: Initialize struct drm_crtc_state.no_vblank from device settings
At the end of a commit, atomic helpers can generate a fake VBLANK event automatically. Originally implemented for writeback connectors, the functionality can be used by any driver and/or hardware without proper VBLANK interrupt. The patch updates the documentation to make this behaviour official: settings struct drm_crtc_state.no_vblank to true enables automatic generation of fake VBLANK events. The new interface drm_dev_has_vblank() returns true if vblanking has been initialized for a device, or false otherwise. Atomic helpers use this function when initializing no_vblank in the CRTC state in drm_atomic_helper_check_modeset(). If vblanking has been initialized for a device, no_blank is disabled. Otherwise it's enabled. Hence, atomic helpers will automatically send out fake VBLANK events with any driver that did not initialize vblanking. v5: * more precise documentation and commit message v4: * replace drm_crtc_has_vblank() with drm_dev_has_vblank() * add drm_dev_has_vblank() in this patch * move driver changes into separate patches v3: * squash all related changes patches into this patch Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/20200129120531.6891-2-tzimmermann@suse.de
This commit is contained in:
@@ -583,6 +583,7 @@ mode_valid(struct drm_atomic_state *state)
|
||||
* &drm_crtc_state.connectors_changed is set when a connector is added or
|
||||
* removed from the CRTC. &drm_crtc_state.active_changed is set when
|
||||
* &drm_crtc_state.active changes, which is used for DPMS.
|
||||
* &drm_crtc_state.no_vblank is set from the result of drm_dev_has_vblank().
|
||||
* See also: drm_atomic_crtc_needs_modeset()
|
||||
*
|
||||
* IMPORTANT:
|
||||
@@ -649,6 +650,11 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (drm_dev_has_vblank(dev))
|
||||
new_crtc_state->no_vblank = false;
|
||||
else
|
||||
new_crtc_state->no_vblank = true;
|
||||
}
|
||||
|
||||
ret = handle_conflicting_encoders(state, false);
|
||||
@@ -2215,7 +2221,9 @@ EXPORT_SYMBOL(drm_atomic_helper_wait_for_dependencies);
|
||||
* when a job is queued, and any change to the pipeline that does not touch the
|
||||
* connector is leading to timeouts when calling
|
||||
* drm_atomic_helper_wait_for_vblanks() or
|
||||
* drm_atomic_helper_wait_for_flip_done().
|
||||
* drm_atomic_helper_wait_for_flip_done(). In addition to writeback
|
||||
* connectors, this function can also fake VBLANK events for CRTCs without
|
||||
* VBLANK interrupt.
|
||||
*
|
||||
* This is part of the atomic helper support for nonblocking commits, see
|
||||
* drm_atomic_helper_setup_commit() for an overview.
|
||||
|
Reference in New Issue
Block a user