diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-08-15 05:48:53 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-08-15 06:01:01 -0400 |
commit | f23eda8cb444b4c45a9bd61768f8bcce9adee8a0 (patch) | |
tree | 12d53fbc57c08c4135784af20d19b6814ddb2702 /drivers/gpu/drm/i915/i915_gem_tiling.c | |
parent | a83718b6819d99d01a34ed1ef1a01598eb45c61b (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.c | 51 |
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. */ |
120 | static bool | 120 | static int |
121 | i915_gem_object_fence_ok(struct drm_i915_gem_object *obj, int tiling_mode) | 121 | i915_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 | |||
157 | bad: | ||
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 | /** |