aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_tiling.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-08-15 05:48:53 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2016-08-15 06:01:01 -0400
commitf23eda8cb444b4c45a9bd61768f8bcce9adee8a0 (patch)
tree12d53fbc57c08c4135784af20d19b6814ddb2702 /drivers/gpu/drm/i915/i915_gem_tiling.c
parenta83718b6819d99d01a34ed1ef1a01598eb45c61b (diff)
drm/i915: Use VMA directly for checking tiling parameters
v2: Rename functions to suit their more active role Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1471254551-25805-14-git-send-email-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.c51
1 files changed, 30 insertions, 21 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
index f4b984de83b5..b2b0cb7199ac 100644
--- a/drivers/gpu/drm/i915/i915_gem_tiling.c
+++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
@@ -116,35 +116,46 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
116 return true; 116 return true;
117} 117}
118 118
119/* Is the current GTT allocation valid for the change in tiling? */ 119/* Make the current GTT allocation valid for the change in tiling. */
120static bool 120static int
121i915_gem_object_fence_ok(struct drm_i915_gem_object *obj, int tiling_mode) 121i915_gem_object_fence_prepare(struct drm_i915_gem_object *obj, int tiling_mode)
122{ 122{
123 struct drm_i915_private *dev_priv = to_i915(obj->base.dev); 123 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
124 struct i915_vma *vma;
124 u32 size; 125 u32 size;
125 126
126 if (tiling_mode == I915_TILING_NONE) 127 if (tiling_mode == I915_TILING_NONE)
127 return true; 128 return 0;
128 129
129 if (INTEL_GEN(dev_priv) >= 4) 130 if (INTEL_GEN(dev_priv) >= 4)
130 return true; 131 return 0;
132
133 vma = i915_gem_obj_to_ggtt(obj);
134 if (!vma)
135 return 0;
136
137 if (!obj->map_and_fenceable)
138 return 0;
131 139
132 if (IS_GEN3(dev_priv)) { 140 if (IS_GEN3(dev_priv)) {
133 if (i915_gem_obj_ggtt_offset(obj) & ~I915_FENCE_START_MASK) 141 if (vma->node.start & ~I915_FENCE_START_MASK)
134 return false; 142 goto bad;
135 } else { 143 } else {
136 if (i915_gem_obj_ggtt_offset(obj) & ~I830_FENCE_START_MASK) 144 if (vma->node.start & ~I830_FENCE_START_MASK)
137 return false; 145 goto bad;
138 } 146 }
139 147
140 size = i915_gem_get_ggtt_size(dev_priv, obj->base.size, tiling_mode); 148 size = i915_gem_get_ggtt_size(dev_priv, obj->base.size, tiling_mode);
141 if (i915_gem_obj_ggtt_size(obj) != size) 149 if (vma->node.size < size)
142 return false; 150 goto bad;
143 151
144 if (i915_gem_obj_ggtt_offset(obj) & (size - 1)) 152 if (vma->node.start & (size - 1))
145 return false; 153 goto bad;
146 154
147 return true; 155 return 0;
156
157bad:
158 return i915_vma_unbind(vma);
148} 159}
149 160
150/** 161/**
@@ -168,7 +179,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
168 struct drm_i915_gem_set_tiling *args = data; 179 struct drm_i915_gem_set_tiling *args = data;
169 struct drm_i915_private *dev_priv = to_i915(dev); 180 struct drm_i915_private *dev_priv = to_i915(dev);
170 struct drm_i915_gem_object *obj; 181 struct drm_i915_gem_object *obj;
171 int ret = 0; 182 int err = 0;
172 183
173 /* Make sure we don't cross-contaminate obj->tiling_and_stride */ 184 /* Make sure we don't cross-contaminate obj->tiling_and_stride */
174 BUILD_BUG_ON(I915_TILING_LAST & STRIDE_MASK); 185 BUILD_BUG_ON(I915_TILING_LAST & STRIDE_MASK);
@@ -187,7 +198,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
187 198
188 mutex_lock(&dev->struct_mutex); 199 mutex_lock(&dev->struct_mutex);
189 if (obj->pin_display || obj->framebuffer_references) { 200 if (obj->pin_display || obj->framebuffer_references) {
190 ret = -EBUSY; 201 err = -EBUSY;
191 goto err; 202 goto err;
192 } 203 }
193 204
@@ -234,11 +245,9 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
234 * has to also include the unfenced register the GPU uses 245 * has to also include the unfenced register the GPU uses
235 * whilst executing a fenced command for an untiled object. 246 * whilst executing a fenced command for an untiled object.
236 */ 247 */
237 if (obj->map_and_fenceable &&
238 !i915_gem_object_fence_ok(obj, args->tiling_mode))
239 ret = i915_vma_unbind(i915_gem_obj_to_ggtt(obj));
240 248
241 if (ret == 0) { 249 err = i915_gem_object_fence_prepare(obj, args->tiling_mode);
250 if (!err) {
242 if (obj->pages && 251 if (obj->pages &&
243 obj->madv == I915_MADV_WILLNEED && 252 obj->madv == I915_MADV_WILLNEED &&
244 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) { 253 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
@@ -281,7 +290,7 @@ err:
281 290
282 intel_runtime_pm_put(dev_priv); 291 intel_runtime_pm_put(dev_priv);
283 292
284 return ret; 293 return err;
285} 294}
286 295
287/** 296/**