drm/i915: Fix current tiling check for relaxed fencing
As we may bind an object with the correct alignment, but with an invalid
size, it may pass the current checks on whether the object may be reused
with a fence.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
index 0597a73..a517b48 100644
--- a/drivers/gpu/drm/i915/i915_gem_tiling.c
+++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
@@ -245,6 +245,17 @@
if (INTEL_INFO(obj->dev)->gen >= 4)
return true;
+ if (!obj_priv->gtt_space)
+ return true;
+
+ if (INTEL_INFO(obj->dev)->gen == 3) {
+ if (obj_priv->gtt_offset & ~I915_FENCE_START_MASK)
+ return false;
+ } else {
+ if (obj_priv->gtt_offset & ~I830_FENCE_START_MASK)
+ return false;
+ }
+
/*
* Previous chips need to be aligned to the size of the smallest
* fence register that can contain the object.
@@ -257,16 +268,11 @@
while (size < obj_priv->base.size)
size <<= 1;
- if (obj_priv->gtt_offset & (size - 1))
+ if (obj_priv->gtt_space->size != size)
return false;
- if (INTEL_INFO(obj->dev)->gen == 3) {
- if (obj_priv->gtt_offset & ~I915_FENCE_START_MASK)
- return false;
- } else {
- if (obj_priv->gtt_offset & ~I830_FENCE_START_MASK)
- return false;
- }
+ if (obj_priv->gtt_offset & (size - 1))
+ return false;
return true;
}