aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2013-11-27 15:20:34 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-12-10 16:47:33 -0500
commitf65c9168983926962b25ae19073474d60dea0442 (patch)
tree97e73144ba856dd74424d27c2bef762f1916fcf4
parentcd2e9e908a86c44c83026acd95520a2761f0d64c (diff)
drm/i915: add runtime put/get calls at the basic places
If I add code to enable runtime PM on my Haswell machine, start a desktop environment, then enable runtime PM, these functions will complain that they're trying to read/write registers while the graphics card is suspended. v2: - Simplify i915_gem_fault changes. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com> [danvet: Drop the hunk in i915_hangcheck_elapsed, it's the wrong thing to do.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c27
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c6
2 files changed, 27 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 92149bcabe98..df83fec174e9 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1380,6 +1380,8 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1380 int ret = 0; 1380 int ret = 0;
1381 bool write = !!(vmf->flags & FAULT_FLAG_WRITE); 1381 bool write = !!(vmf->flags & FAULT_FLAG_WRITE);
1382 1382
1383 intel_runtime_pm_get(dev_priv);
1384
1383 /* We don't use vmf->pgoff since that has the fake offset */ 1385 /* We don't use vmf->pgoff since that has the fake offset */
1384 page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >> 1386 page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >>
1385 PAGE_SHIFT; 1387 PAGE_SHIFT;
@@ -1427,8 +1429,10 @@ out:
1427 /* If this -EIO is due to a gpu hang, give the reset code a 1429 /* If this -EIO is due to a gpu hang, give the reset code a
1428 * chance to clean up the mess. Otherwise return the proper 1430 * chance to clean up the mess. Otherwise return the proper
1429 * SIGBUS. */ 1431 * SIGBUS. */
1430 if (i915_terminally_wedged(&dev_priv->gpu_error)) 1432 if (i915_terminally_wedged(&dev_priv->gpu_error)) {
1431 return VM_FAULT_SIGBUS; 1433 ret = VM_FAULT_SIGBUS;
1434 break;
1435 }
1432 case -EAGAIN: 1436 case -EAGAIN:
1433 /* 1437 /*
1434 * EAGAIN means the gpu is hung and we'll wait for the error 1438 * EAGAIN means the gpu is hung and we'll wait for the error
@@ -1443,15 +1447,22 @@ out:
1443 * EBUSY is ok: this just means that another thread 1447 * EBUSY is ok: this just means that another thread
1444 * already did the job. 1448 * already did the job.
1445 */ 1449 */
1446 return VM_FAULT_NOPAGE; 1450 ret = VM_FAULT_NOPAGE;
1451 break;
1447 case -ENOMEM: 1452 case -ENOMEM:
1448 return VM_FAULT_OOM; 1453 ret = VM_FAULT_OOM;
1454 break;
1449 case -ENOSPC: 1455 case -ENOSPC:
1450 return VM_FAULT_SIGBUS; 1456 ret = VM_FAULT_SIGBUS;
1457 break;
1451 default: 1458 default:
1452 WARN_ONCE(ret, "unhandled error in i915_gem_fault: %i\n", ret); 1459 WARN_ONCE(ret, "unhandled error in i915_gem_fault: %i\n", ret);
1453 return VM_FAULT_SIGBUS; 1460 ret = VM_FAULT_SIGBUS;
1461 break;
1454 } 1462 }
1463
1464 intel_runtime_pm_put(dev_priv);
1465 return ret;
1455} 1466}
1456 1467
1457/** 1468/**
@@ -4169,6 +4180,8 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj)
4169 drm_i915_private_t *dev_priv = dev->dev_private; 4180 drm_i915_private_t *dev_priv = dev->dev_private;
4170 struct i915_vma *vma, *next; 4181 struct i915_vma *vma, *next;
4171 4182
4183 intel_runtime_pm_get(dev_priv);
4184
4172 trace_i915_gem_object_destroy(obj); 4185 trace_i915_gem_object_destroy(obj);
4173 4186
4174 if (obj->phys_obj) 4187 if (obj->phys_obj)
@@ -4213,6 +4226,8 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj)
4213 4226
4214 kfree(obj->bit_17); 4227 kfree(obj->bit_17);
4215 i915_gem_object_free(obj); 4228 i915_gem_object_free(obj);
4229
4230 intel_runtime_pm_put(dev_priv);
4216} 4231}
4217 4232
4218struct i915_vma *i915_gem_obj_to_vma(struct drm_i915_gem_object *obj, 4233struct i915_vma *i915_gem_obj_to_vma(struct drm_i915_gem_object *obj,
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 9282b4c411f6..bceddf5a04bc 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -1108,6 +1108,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
1108 } 1108 }
1109 } 1109 }
1110 1110
1111 intel_runtime_pm_get(dev_priv);
1112
1111 ret = i915_mutex_lock_interruptible(dev); 1113 ret = i915_mutex_lock_interruptible(dev);
1112 if (ret) 1114 if (ret)
1113 goto pre_mutex_err; 1115 goto pre_mutex_err;
@@ -1237,6 +1239,10 @@ err:
1237 1239
1238pre_mutex_err: 1240pre_mutex_err:
1239 kfree(cliprects); 1241 kfree(cliprects);
1242
1243 /* intel_gpu_busy should also get a ref, so it will free when the device
1244 * is really idle. */
1245 intel_runtime_pm_put(dev_priv);
1240 return ret; 1246 return ret;
1241} 1247}
1242 1248