On Thu, Feb 20, 2014 at 09:26:13AM +0000, Chris Wilson wrote: > After a hang and failed reset, we cannot use the GPU to execute the page > flip instructions. Instead we can force a synchronous mmio flip. (Later, > we can reduce the synchronicity of the mmio flip by moving some of the > delays off to a worker, like the current page flip code; see vblank > tasks.) > > References: https://bugs.freedesktop.org/show_bug.cgi?id=72631 > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Reviewed-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/intel_display.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index 79ef515..d5eafd1 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -8717,6 +8717,9 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, > fb->pitches[0] != crtc->fb->pitches[0])) > return -EINVAL; > > + if (i915_terminally_wedged(&dev_priv->gpu_error)) > + goto out_hang; > + > work = kzalloc(sizeof(*work), GFP_KERNEL); > if (work == NULL) > return -ENOMEM; > @@ -8791,6 +8794,13 @@ cleanup: > free_work: > kfree(work); > > + if (ret == -EIO) { > +out_hang: > + intel_crtc_wait_for_pending_flips(crtc); > + ret = intel_pipe_set_base(crtc, crtc->x, crtc->y, fb); > + if (ret == 0 && event) > + drm_send_vblank_event(dev, intel_crtc->pipe, event); > + } > return ret; > } > > -- > 1.7.9.5 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx