drm/i915: Allow relocation deltas outside of target bo
Chris Wilson [Tue, 1 Mar 2011 15:24:41 +0000 (15:24 +0000)]
Userspace has a legitimate requirement to use a delta that points to
outside of the target bo, and so we need to enable this. (As this is an
abi break, albeit a relaxation of the current restrictions, mark the change
with a new flag.)

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
include/drm/i915_drm.h

index ffa2196..5115069 100644 (file)
@@ -772,6 +772,9 @@ static int i915_getparam(struct drm_device *dev, void *data,
        case I915_PARAM_HAS_EXEC_CONSTANTS:
                value = INTEL_INFO(dev)->gen >= 4;
                break;
+       case I915_PARAM_HAS_RELAXED_DELTA:
+               value = 1;
+               break;
        default:
                DRM_DEBUG_DRIVER("Unknown parameter %d\n",
                                 param->param);
index 71a4a3b..1c3b76a 100644 (file)
@@ -350,16 +350,6 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
                return ret;
        }
 
-       /* and points to somewhere within the target object. */
-       if (unlikely(reloc->delta >= target_obj->size)) {
-               DRM_ERROR("Relocation beyond target object bounds: "
-                         "obj %p target %d delta %d size %d.\n",
-                         obj, reloc->target_handle,
-                         (int) reloc->delta,
-                         (int) target_obj->size);
-               return ret;
-       }
-
        reloc->delta += target_offset;
        if (obj->base.write_domain == I915_GEM_DOMAIN_CPU) {
                uint32_t page_offset = reloc->offset & ~PAGE_MASK;
index 0039f1f..c4d6dbf 100644 (file)
@@ -290,6 +290,7 @@ typedef struct drm_i915_irq_wait {
 #define I915_PARAM_HAS_RELAXED_FENCING  12
 #define I915_PARAM_HAS_COHERENT_RINGS   13
 #define I915_PARAM_HAS_EXEC_CONSTANTS   14
+#define I915_PARAM_HAS_RELAXED_DELTA    15
 
 typedef struct drm_i915_getparam {
        int param;