Commit f316a42c authored by Ben Gamari's avatar Ben Gamari Committed by Jesse Barnes

drm/i915: Hookup chip reset in error handler

This patch uses the previously introduced chip reset logic to reset the
chip when an error event is detected.
Signed-off-by: default avatarBen Gamari <bgamari.foss@gmail.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent 11ed50ec
...@@ -302,12 +302,25 @@ static void i915_error_work_func(struct work_struct *work) ...@@ -302,12 +302,25 @@ static void i915_error_work_func(struct work_struct *work)
drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t, drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t,
error_work); error_work);
struct drm_device *dev = dev_priv->dev; struct drm_device *dev = dev_priv->dev;
char *event_string = "ERROR=1"; char *error_event[] = { "ERROR=1", NULL };
char *envp[] = { event_string, NULL }; char *reset_event[] = { "RESET=1", NULL };
char *reset_done_event[] = { "ERROR=0", NULL };
DRM_DEBUG("generating error event\n"); DRM_DEBUG("generating error event\n");
kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, error_event);
kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, envp); if (dev_priv->mm.wedged) {
if (IS_I965G(dev)) {
DRM_DEBUG("resetting chip\n");
kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_event);
if (!i965_reset(dev, GDRST_RENDER)) {
dev_priv->mm.wedged = 0;
kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_done_event);
}
} else {
printk("reboot required\n");
}
}
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment