[Intel-gfx] [PATCH 2/2] drm/i915: i8xx also doesn't like multiple oustanding pageflips

Pedro Ribeiro pedrib at gmail.com
Wed Aug 4 23:03:59 CEST 2010


On 4 August 2010 20:49, Jesse Barnes <jbarnes at virtuousgeek.org> wrote:
> On Wed,  4 Aug 2010 21:22:10 +0200
> Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
>
>> My i855GM suffers from a 80k/s interrupt storm without this.
>> So add 2nd gen to the list of things that don't like more than
>> one outstanding pageflip request.
>>
>> Furthermore I've changed the busy loop into a ringbuffer wait.
>> Busy-loops that don't check whether the chip died are simply evil.
>> And performance should actually improve, because there's usually
>> a decent amount of rendering queued on the gpu, hopefully rendering
>> that MI_WAIT into a noop by the time it's executed.
>>
>> The current code holds dev->struct_mutex while executing this loop,
>> hence stalling all other gem activity anyway.
>>
>> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
>> Cc: stabel at kernel.org
>> ---
>>  drivers/gpu/drm/i915/intel_display.c |   13 ++++++++-----
>>  1 files changed, 8 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
>> index 8135ee0..7b6035e 100644
>> --- a/drivers/gpu/drm/i915/intel_display.c
>> +++ b/drivers/gpu/drm/i915/intel_display.c
>> @@ -4916,14 +4916,17 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
>>       work->pending_flip_obj = obj;
>>
>>       if (intel_crtc->plane)
>> -             flip_mask = I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT;
>> +             flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
>>       else
>> -             flip_mask = I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT;
>> +             flip_mask = MI_WAIT_FOR_PLANE_A_FLIP;
>>
>>       /* Wait for any previous flip to finish */
>> -     if (IS_GEN3(dev))
>> -             while (I915_READ(ISR) & flip_mask)
>> -                     ;
>> +     if (IS_GEN3(dev) || IS_GEN2(dev)) {
>> +             BEGIN_LP_RING(2);
>> +             OUT_RING(MI_WAIT_FOR_EVENT | flip_mask);
>> +             OUT_RING(0);
>> +             ADVANCE_LP_RING();
>> +     }
>>
>>       BEGIN_LP_RING(4);
>>       if (IS_I965G(dev)) {
>
> This looks nicer than what was there before.  Hope it still works on
> 9xx...
>
> Reviewed-by: Jesse Barnes <jbarnes at virtuousgeek.org>
>
> --
> Jesse Barnes, Intel Open Source Technology Center
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>

Just to warn: you sent the patch to the wrong address
(stabel at kernel.org instead of stable at kernel.org).

Regards,
Pedro



More information about the Intel-gfx mailing list