|
@@ -839,37 +839,14 @@ static int gen6_do_reset(struct drm_device *dev)
|
|
|
|
|
|
int intel_gpu_reset(struct drm_device *dev)
|
|
|
{
|
|
|
- struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
- int ret = -ENODEV;
|
|
|
-
|
|
|
switch (INTEL_INFO(dev)->gen) {
|
|
|
case 7:
|
|
|
- case 6:
|
|
|
- ret = gen6_do_reset(dev);
|
|
|
- break;
|
|
|
- case 5:
|
|
|
- ret = ironlake_do_reset(dev);
|
|
|
- break;
|
|
|
- case 4:
|
|
|
- ret = i965_do_reset(dev);
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- ret = i8xx_do_reset(dev);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- /* Also reset the gpu hangman. */
|
|
|
- if (dev_priv->gpu_error.stop_rings) {
|
|
|
- DRM_INFO("Simulated gpu hang, resetting stop_rings\n");
|
|
|
- dev_priv->gpu_error.stop_rings = 0;
|
|
|
- if (ret == -ENODEV) {
|
|
|
- DRM_ERROR("Reset not implemented, but ignoring "
|
|
|
- "error for simulated gpu hangs\n");
|
|
|
- ret = 0;
|
|
|
- }
|
|
|
+ case 6: return gen6_do_reset(dev);
|
|
|
+ case 5: return ironlake_do_reset(dev);
|
|
|
+ case 4: return i965_do_reset(dev);
|
|
|
+ case 2: return i8xx_do_reset(dev);
|
|
|
+ default: return -ENODEV;
|
|
|
}
|
|
|
-
|
|
|
- return ret;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -890,6 +867,7 @@ int intel_gpu_reset(struct drm_device *dev)
|
|
|
int i915_reset(struct drm_device *dev)
|
|
|
{
|
|
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
|
+ bool simulated;
|
|
|
int ret;
|
|
|
|
|
|
if (!i915_try_reset)
|
|
@@ -899,13 +877,26 @@ int i915_reset(struct drm_device *dev)
|
|
|
|
|
|
i915_gem_reset(dev);
|
|
|
|
|
|
- ret = -ENODEV;
|
|
|
- if (get_seconds() - dev_priv->gpu_error.last_reset < 5)
|
|
|
+ simulated = dev_priv->gpu_error.stop_rings != 0;
|
|
|
+
|
|
|
+ if (!simulated && get_seconds() - dev_priv->gpu_error.last_reset < 5) {
|
|
|
DRM_ERROR("GPU hanging too fast, declaring wedged!\n");
|
|
|
- else
|
|
|
+ ret = -ENODEV;
|
|
|
+ } else {
|
|
|
ret = intel_gpu_reset(dev);
|
|
|
|
|
|
- dev_priv->gpu_error.last_reset = get_seconds();
|
|
|
+ /* Also reset the gpu hangman. */
|
|
|
+ if (simulated) {
|
|
|
+ DRM_INFO("Simulated gpu hang, resetting stop_rings\n");
|
|
|
+ dev_priv->gpu_error.stop_rings = 0;
|
|
|
+ if (ret == -ENODEV) {
|
|
|
+ DRM_ERROR("Reset not implemented, but ignoring "
|
|
|
+ "error for simulated gpu hangs\n");
|
|
|
+ ret = 0;
|
|
|
+ }
|
|
|
+ } else
|
|
|
+ dev_priv->gpu_error.last_reset = get_seconds();
|
|
|
+ }
|
|
|
if (ret) {
|
|
|
DRM_ERROR("Failed to reset chip.\n");
|
|
|
mutex_unlock(&dev->struct_mutex);
|