[Intel-gfx] [PATCH 12/14] drm/i915: Keep vblanks enabled during the entire pipe update
Chris Wilson
chris at chris-wilson.co.uk
Fri Mar 17 21:28:22 UTC 2017
On Fri, Mar 17, 2017 at 11:18:06PM +0200, ville.syrjala at linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> We currently hold a vblank referenced while trying to evade the
> vblank, but we drop it as soon as we've done that. After all the
> planes have been committed we are quite likely to grab a new vblank
> reference for delivering the flip event. This causes the vblank
> interrupt to do a enable->enable->disable ping-pong during many
> commits. If we instead hang on to the original vblank reference
> across the entire commit we can eliminate that ping-pong.
Does it make sense to take an an extra vblank_get() only if we have an
event to deliver?
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/intel_sprite.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
> index 26c8bdcd7e72..337e884252e5 100644
> --- a/drivers/gpu/drm/i915/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> @@ -137,8 +137,6 @@ void intel_pipe_update_start(struct intel_crtc *crtc)
>
> finish_wait(wq, &wait);
>
if (crtc->base.state->event)
drm_crtc_vblank_get(&crtc->base);
drm_crtc_vblank_put(&crtc->base);
> crtc->debug.scanline_start = scanline;
> crtc->debug.start_vbl_time = ktime_get();
> crtc->debug.start_vbl_count = intel_crtc_get_vblank_counter(crtc);
> @@ -185,6 +183,15 @@ void intel_pipe_update_end(struct intel_crtc *crtc, struct intel_flip_work *work
> crtc->base.state->event = NULL;
>
> + /*
> + * The reference was taken in intel_pipe_update_start(). It could
> + * have been dropped as soon as the vblank was evaded, but we hold
> + * on to it until this time to avoid the extra vblank interrupt
> + * enable->disable->enable ping-pong whenever we have to deliver
> + * an event.
> + */
> + drm_crtc_vblank_put(&crtc->base);
}
> local_irq_enable();
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list