diff options
author | Paulo Zanoni <paulo.r.zanoni@intel.com> | 2013-11-27 15:20:34 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-12-10 16:47:33 -0500 |
commit | f65c9168983926962b25ae19073474d60dea0442 (patch) | |
tree | 97e73144ba856dd74424d27c2bef762f1916fcf4 | |
parent | cd2e9e908a86c44c83026acd95520a2761f0d64c (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.c | 27 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 6 |
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 | ||
4218 | struct i915_vma *i915_gem_obj_to_vma(struct drm_i915_gem_object *obj, | 4233 | struct 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 | ||
1238 | pre_mutex_err: | 1240 | pre_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 | ||