diff options
author | Eric Anholt <eric@anholt.net> | 2008-11-26 16:58:13 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2008-12-03 20:24:47 -0500 |
commit | 0235439232cb6f8a54f8976aa8330c1c98ebad0b (patch) | |
tree | 15acdd628efe011f127d7b8ecc2fb65ce4131705 /drivers/gpu | |
parent | ac94a962b24a88ea5d00f4697550d9982f300751 (diff) |
drm/i915: Return error in i915_gem_set_to_gtt_domain if we're not in the GTT.
It's only for flushing caches appropriately for GTT access, not for actually
getting it there. Prevents potential smashing of cpu read/write domains on
unbound objects.
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 174c0c3ba0b0..3fde82be014f 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -435,6 +435,13 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, | |||
435 | #endif | 435 | #endif |
436 | if (read_domains & I915_GEM_DOMAIN_GTT) { | 436 | if (read_domains & I915_GEM_DOMAIN_GTT) { |
437 | ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0); | 437 | ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0); |
438 | |||
439 | /* Silently promote "you're not bound, there was nothing to do" | ||
440 | * to success, since the client was just asking us to | ||
441 | * make sure everything was done. | ||
442 | */ | ||
443 | if (ret == -EINVAL) | ||
444 | ret = 0; | ||
438 | } else { | 445 | } else { |
439 | ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0); | 446 | ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0); |
440 | } | 447 | } |
@@ -1304,6 +1311,10 @@ i915_gem_object_set_to_gtt_domain(struct drm_gem_object *obj, int write) | |||
1304 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | 1311 | struct drm_i915_gem_object *obj_priv = obj->driver_private; |
1305 | int ret; | 1312 | int ret; |
1306 | 1313 | ||
1314 | /* Not valid to be called on unbound objects. */ | ||
1315 | if (obj_priv->gtt_space == NULL) | ||
1316 | return -EINVAL; | ||
1317 | |||
1307 | i915_gem_object_flush_gpu_write_domain(obj); | 1318 | i915_gem_object_flush_gpu_write_domain(obj); |
1308 | /* Wait on any GPU rendering and flushing to occur. */ | 1319 | /* Wait on any GPU rendering and flushing to occur. */ |
1309 | ret = i915_gem_object_wait_rendering(obj); | 1320 | ret = i915_gem_object_wait_rendering(obj); |