aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-09-19 07:38:26 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2010-09-21 06:19:54 -0400
commitf803aa5532d14efc463abbeae10faa115c457a07 (patch)
tree67d70179b08c2619edf336d374e3f0dda440f25c /drivers/gpu
parent77f01230223a08792f5320ebba27af9cbb81b0cf (diff)
drm/i915: Clean up bo lists on all hung gpus
Previously we only tidied up the active bo lists for chipsets were we would attempt to reset the GPU. However, this action is necessary for the system to continue and reclaim the dead bo for all chipsets. Pointed out, in passing, by Owain Ainsworth. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c15
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c18
3 files changed, 16 insertions, 19 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 38e889bfd99..2ddac06d596 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -368,7 +368,7 @@ static int ironlake_do_reset(struct drm_device *dev, u8 flags)
368 * - re-init interrupt state 368 * - re-init interrupt state
369 * - re-init display 369 * - re-init display
370 */ 370 */
371int i965_reset(struct drm_device *dev, u8 flags) 371int i915_reset(struct drm_device *dev, u8 flags)
372{ 372{
373 drm_i915_private_t *dev_priv = dev->dev_private; 373 drm_i915_private_t *dev_priv = dev->dev_private;
374 /* 374 /*
@@ -401,14 +401,19 @@ int i965_reset(struct drm_device *dev, u8 flags)
401 * well as the reset bit (GR/bit 0). Setting the GR bit 401 * well as the reset bit (GR/bit 0). Setting the GR bit
402 * triggers the reset; when done, the hardware will clear it. 402 * triggers the reset; when done, the hardware will clear it.
403 */ 403 */
404 if (IS_IRONLAKE(dev)) 404 ret = -ENODEV;
405 switch (INTEL_INFO(dev)->gen) {
406 case 5:
405 ret = ironlake_do_reset(dev, flags); 407 ret = ironlake_do_reset(dev, flags);
406 else 408 break;
409 case 4:
407 ret = i965_do_reset(dev, flags); 410 ret = i965_do_reset(dev, flags);
411 break;
412 }
408 if (ret) { 413 if (ret) {
409 WARN(true, "i915: Failed to reset chip\n"); 414 DRM_ERROR("Failed to reset chip.\n");
410 mutex_unlock(&dev->struct_mutex); 415 mutex_unlock(&dev->struct_mutex);
411 return -EIO; 416 return ret;
412 } 417 }
413 418
414 /* Ok, now get things going again... */ 419 /* Ok, now get things going again... */
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index ae05008a590..b57e049a462 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -874,7 +874,7 @@ extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,
874extern int i915_emit_box(struct drm_device *dev, 874extern int i915_emit_box(struct drm_device *dev,
875 struct drm_clip_rect *boxes, 875 struct drm_clip_rect *boxes,
876 int i, int DR1, int DR4); 876 int i, int DR1, int DR4);
877extern int i965_reset(struct drm_device *dev, u8 flags); 877extern int i915_reset(struct drm_device *dev, u8 flags);
878extern unsigned long i915_chipset_val(struct drm_i915_private *dev_priv); 878extern unsigned long i915_chipset_val(struct drm_i915_private *dev_priv);
879extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv); 879extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv);
880extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv); 880extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv);
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index a5197e13d94..b1e7655288d 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -397,19 +397,11 @@ static void i915_error_work_func(struct work_struct *work)
397 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, error_event); 397 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, error_event);
398 398
399 if (atomic_read(&dev_priv->mm.wedged)) { 399 if (atomic_read(&dev_priv->mm.wedged)) {
400 switch (INTEL_INFO(dev)->gen) { 400 DRM_DEBUG_DRIVER("resetting chip\n");
401 case 5: 401 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_event);
402 case 4: 402 if (!i915_reset(dev, GRDOM_RENDER)) {
403 DRM_DEBUG_DRIVER("resetting chip\n"); 403 atomic_set(&dev_priv->mm.wedged, 0);
404 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_event); 404 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_done_event);
405 if (!i965_reset(dev, GRDOM_RENDER)) {
406 atomic_set(&dev_priv->mm.wedged, 0);
407 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_done_event);
408 }
409 break;
410 default:
411 DRM_DEBUG_DRIVER("reboot required\n");
412 break;
413 } 405 }
414 } 406 }
415} 407}