summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_tiling.c
diff options
context:
space:
mode:
authorChris Wilson2010-11-15 06:25:58 +0100
committerChris Wilson2010-11-15 07:48:46 +0100
commitdf15315899c0641412bd54b29565a70b078a6ac8 (patch)
treec7204b201c929055f2d8b28fdabe0ddf191d3841 /drivers/gpu/drm/i915/i915_gem_tiling.c
parentdrm/i915: fix relaxed tiling for gen <= 3 && !g33 (diff)
downloadkernel-qcow2-linux-df15315899c0641412bd54b29565a70b078a6ac8.tar.gz
kernel-qcow2-linux-df15315899c0641412bd54b29565a70b078a6ac8.tar.xz
kernel-qcow2-linux-df15315899c0641412bd54b29565a70b078a6ac8.zip
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>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_tiling.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_tiling.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
index 0597a737ebad..a517b48d441d 100644
--- a/drivers/gpu/drm/i915/i915_gem_tiling.c
+++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
@@ -245,6 +245,17 @@ i915_gem_object_fence_ok(struct drm_gem_object *obj, int tiling_mode)
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 @@ i915_gem_object_fence_ok(struct drm_gem_object *obj, int tiling_mode)
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;
}