[Intel-gfx] [PATCH] drm/i915: don't queue flips during a flip pending event
Eric Anholt
eric at anholt.net
Fri Apr 30 00:52:36 CEST 2010
On Mon, 5 Apr 2010 14:08:31 -0700, Jesse Barnes <jbarnes at virtuousgeek.org> wrote:
> Hardware will set the flip pending ISR bit as soon as it receives the
> flip instruction, and (supposedly) clear it once the flip completes
> (e.g. at the next vblank). If we try to send down a flip instruction
> while the ISR bit is set, the hardware can become very confused, and we
> may never receive the corresponding flip pending interrupt, effectively
> hanging the chip.
>
> Fixes fdo bug #27040.
>
> Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
> ---
> drivers/gpu/drm/i915/intel_display.c | 10 ++++++++++
> 1 files changed, 10 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 6f5e7f5..24853e1 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -4235,6 +4235,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
> unsigned long flags;
> int pipesrc_reg = (intel_crtc->pipe == 0) ? PIPEASRC : PIPEBSRC;
> int ret, pipesrc;
> + u32 flip_mask;
> RING_LOCALS;
>
> work = kzalloc(sizeof *work, GFP_KERNEL);
> @@ -4285,6 +4286,15 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
> atomic_inc(&obj_priv->pending_flip);
> work->pending_flip_obj = obj;
>
> + if (intel_crtc->plane)
> + flip_mask = I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT;
> + else
> + flip_mask = I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT;
> +
> + /* Wait for any previous flip to finish */
> + while (I915_READ(ISR) & flip_mask)
> + ;
> +
I'm confused about how this patch works. It looks like there's a race
where the ISR bit could get set at this point after the loop checking
it, and you would lose. The whole thing seems very dubious -- why does
the state of the ISR at the time you queue a flip matter? I could
imagine there being an issue with the state of the ISR at the point that
a flip packet is processed, but this doesn't handle that (seems like
only throttling flips to avoid outstanding flips would)
> BEGIN_LP_RING(4);
> if (IS_I965G(dev)) {
> OUT_RING(MI_DISPLAY_FLIP |
> --
> 1.6.6.1
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20100429/46052d9b/attachment.sig>
More information about the Intel-gfx
mailing list