drm/i915: Return error in i915_gem_set_to_gtt_domain if we're not in the GTT.
authorEric Anholt <eric@anholt.net>
Wed, 26 Nov 2008 21:58:13 +0000 (13:58 -0800)
committerDave Airlie <airlied@redhat.com>
Thu, 4 Dec 2008 01:24:47 +0000 (11:24 +1000)
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>
drivers/gpu/drm/i915/i915_gem.c

index 174c0c3ba0b0f25079c9ae39db250fdbfe256612..3fde82be014f3a4b2e4046826b076d7540e17afc 100644 (file)
@@ -435,6 +435,13 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
 #endif
        if (read_domains & I915_GEM_DOMAIN_GTT) {
                ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0);
+
+               /* Silently promote "you're not bound, there was nothing to do"
+                * to success, since the client was just asking us to
+                * make sure everything was done.
+                */
+               if (ret == -EINVAL)
+                       ret = 0;
        } else {
                ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0);
        }
@@ -1304,6 +1311,10 @@ i915_gem_object_set_to_gtt_domain(struct drm_gem_object *obj, int write)
        struct drm_i915_gem_object *obj_priv = obj->driver_private;
        int ret;
 
+       /* Not valid to be called on unbound objects. */
+       if (obj_priv->gtt_space == NULL)
+               return -EINVAL;
+
        i915_gem_object_flush_gpu_write_domain(obj);
        /* Wait on any GPU rendering and flushing to occur. */
        ret = i915_gem_object_wait_rendering(obj);