On Tue, 19 Jun 2012 21:55:32 +0200 Daniel Vetter <daniel.vetter at ffwll.ch> wrote: > commit 8e96d9c4d9843f00ebeb4a9b33596d96602ea101 > Author: Ben Widawsky <ben at bwidawsk.net> > Date: Mon Jun 4 14:42:56 2012 -0700 > > drm/i915: reset the GPU on context fini > > broke module unload because it reset the gpu before we've stopped > touching it. Later on in the unload sequence the ringbuffer code > complained that the gpu would idle properly (because intel_gpu_reset > only resets the hw and not our sw state). > > v2: Reorder things so that we reset the gpu _before_ we release the > backing storage of the default context. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=51183 > Signed-Off-by: Daniel Vetter <daniel.vetter at ffwll.ch> Reviewed-by: Ben Widawsky <ben at bwidawsk.net> > --- > drivers/gpu/drm/i915/i915_dma.c | 2 +- > drivers/gpu/drm/i915/i915_gem_context.c | 7 +++++-- > 2 files changed, 6 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c > index f1544c5..efba4e8 100644 > --- a/drivers/gpu/drm/i915/i915_dma.c > +++ b/drivers/gpu/drm/i915/i915_dma.c > @@ -1669,7 +1669,6 @@ int i915_driver_unload(struct drm_device *dev) > if (ret) > DRM_ERROR("failed to idle hardware: %d\n", ret); > i915_gem_retire_requests(dev); > - i915_gem_context_fini(dev); > mutex_unlock(&dev->struct_mutex); > > /* Cancel the retire work handler, which should be idle now. */ > @@ -1720,6 +1719,7 @@ int i915_driver_unload(struct drm_device *dev) > mutex_lock(&dev->struct_mutex); > i915_gem_free_all_phys_object(dev); > i915_gem_cleanup_ringbuffer(dev); > + i915_gem_context_fini(dev); > mutex_unlock(&dev->struct_mutex); > i915_gem_cleanup_aliasing_ppgtt(dev); > i915_gem_cleanup_stolen(dev); > diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c > index 8fb8cd8..48e41df 100644 > --- a/drivers/gpu/drm/i915/i915_gem_context.c > +++ b/drivers/gpu/drm/i915/i915_gem_context.c > @@ -277,11 +277,14 @@ void i915_gem_context_fini(struct drm_device *dev) > if (dev_priv->hw_contexts_disabled) > return; > > + /* The only known way to stop the gpu from accessing the hw context is > + * to reset it. Do this as the very last operation to avoid confusing > + * other code, leading to spurious errors. */ > + intel_gpu_reset(dev); > + > i915_gem_object_unpin(dev_priv->ring[RCS].default_context->obj); > > do_destroy(dev_priv->ring[RCS].default_context); > - > - intel_gpu_reset(dev); > } > > void i915_gem_context_open(struct drm_device *dev, struct drm_file *file) -- Ben Widawsky, Intel Open Source Technology Center