diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_context.c | 59 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 50 |
2 files changed, 50 insertions, 59 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 8bd0c4966913..d46a69d3d390 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c | |||
@@ -151,45 +151,6 @@ void i915_gem_context_free(struct kref *ctx_ref) | |||
151 | kfree(ctx); | 151 | kfree(ctx); |
152 | } | 152 | } |
153 | 153 | ||
154 | static struct drm_i915_gem_object * | ||
155 | alloc_context_obj(struct drm_i915_private *dev_priv, u64 size) | ||
156 | { | ||
157 | struct drm_i915_gem_object *obj; | ||
158 | int ret; | ||
159 | |||
160 | lockdep_assert_held(&dev_priv->drm.struct_mutex); | ||
161 | |||
162 | obj = i915_gem_object_create(dev_priv, size); | ||
163 | if (IS_ERR(obj)) | ||
164 | return obj; | ||
165 | |||
166 | /* | ||
167 | * Try to make the context utilize L3 as well as LLC. | ||
168 | * | ||
169 | * On VLV we don't have L3 controls in the PTEs so we | ||
170 | * shouldn't touch the cache level, especially as that | ||
171 | * would make the object snooped which might have a | ||
172 | * negative performance impact. | ||
173 | * | ||
174 | * Snooping is required on non-llc platforms in execlist | ||
175 | * mode, but since all GGTT accesses use PAT entry 0 we | ||
176 | * get snooping anyway regardless of cache_level. | ||
177 | * | ||
178 | * This is only applicable for Ivy Bridge devices since | ||
179 | * later platforms don't have L3 control bits in the PTE. | ||
180 | */ | ||
181 | if (IS_IVYBRIDGE(dev_priv)) { | ||
182 | ret = i915_gem_object_set_cache_level(obj, I915_CACHE_L3_LLC); | ||
183 | /* Failure shouldn't ever happen this early */ | ||
184 | if (WARN_ON(ret)) { | ||
185 | i915_gem_object_put(obj); | ||
186 | return ERR_PTR(ret); | ||
187 | } | ||
188 | } | ||
189 | |||
190 | return obj; | ||
191 | } | ||
192 | |||
193 | static void context_close(struct i915_gem_context *ctx) | 154 | static void context_close(struct i915_gem_context *ctx) |
194 | { | 155 | { |
195 | i915_gem_context_set_closed(ctx); | 156 | i915_gem_context_set_closed(ctx); |
@@ -266,26 +227,6 @@ __create_hw_context(struct drm_i915_private *dev_priv, | |||
266 | list_add_tail(&ctx->link, &dev_priv->context_list); | 227 | list_add_tail(&ctx->link, &dev_priv->context_list); |
267 | ctx->i915 = dev_priv; | 228 | ctx->i915 = dev_priv; |
268 | 229 | ||
269 | if (dev_priv->hw_context_size) { | ||
270 | struct drm_i915_gem_object *obj; | ||
271 | struct i915_vma *vma; | ||
272 | |||
273 | obj = alloc_context_obj(dev_priv, dev_priv->hw_context_size); | ||
274 | if (IS_ERR(obj)) { | ||
275 | ret = PTR_ERR(obj); | ||
276 | goto err_out; | ||
277 | } | ||
278 | |||
279 | vma = i915_vma_instance(obj, &dev_priv->ggtt.base, NULL); | ||
280 | if (IS_ERR(vma)) { | ||
281 | i915_gem_object_put(obj); | ||
282 | ret = PTR_ERR(vma); | ||
283 | goto err_out; | ||
284 | } | ||
285 | |||
286 | ctx->engine[RCS].state = vma; | ||
287 | } | ||
288 | |||
289 | /* Default context will never have a file_priv */ | 230 | /* Default context will never have a file_priv */ |
290 | ret = DEFAULT_CONTEXT_HANDLE; | 231 | ret = DEFAULT_CONTEXT_HANDLE; |
291 | if (file_priv) { | 232 | if (file_priv) { |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 6836efb7e3d2..61f612454ce7 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -1437,6 +1437,44 @@ static int context_pin(struct i915_gem_context *ctx) | |||
1437 | PIN_GLOBAL | PIN_HIGH); | 1437 | PIN_GLOBAL | PIN_HIGH); |
1438 | } | 1438 | } |
1439 | 1439 | ||
1440 | static struct i915_vma * | ||
1441 | alloc_context_vma(struct intel_engine_cs *engine) | ||
1442 | { | ||
1443 | struct drm_i915_private *i915 = engine->i915; | ||
1444 | struct drm_i915_gem_object *obj; | ||
1445 | struct i915_vma *vma; | ||
1446 | |||
1447 | obj = i915_gem_object_create(i915, i915->hw_context_size); | ||
1448 | if (IS_ERR(obj)) | ||
1449 | return ERR_CAST(obj); | ||
1450 | |||
1451 | /* | ||
1452 | * Try to make the context utilize L3 as well as LLC. | ||
1453 | * | ||
1454 | * On VLV we don't have L3 controls in the PTEs so we | ||
1455 | * shouldn't touch the cache level, especially as that | ||
1456 | * would make the object snooped which might have a | ||
1457 | * negative performance impact. | ||
1458 | * | ||
1459 | * Snooping is required on non-llc platforms in execlist | ||
1460 | * mode, but since all GGTT accesses use PAT entry 0 we | ||
1461 | * get snooping anyway regardless of cache_level. | ||
1462 | * | ||
1463 | * This is only applicable for Ivy Bridge devices since | ||
1464 | * later platforms don't have L3 control bits in the PTE. | ||
1465 | */ | ||
1466 | if (IS_IVYBRIDGE(i915)) { | ||
1467 | /* Ignore any error, regard it as a simple optimisation */ | ||
1468 | i915_gem_object_set_cache_level(obj, I915_CACHE_L3_LLC); | ||
1469 | } | ||
1470 | |||
1471 | vma = i915_vma_instance(obj, &i915->ggtt.base, NULL); | ||
1472 | if (IS_ERR(vma)) | ||
1473 | i915_gem_object_put(obj); | ||
1474 | |||
1475 | return vma; | ||
1476 | } | ||
1477 | |||
1440 | static int intel_ring_context_pin(struct intel_engine_cs *engine, | 1478 | static int intel_ring_context_pin(struct intel_engine_cs *engine, |
1441 | struct i915_gem_context *ctx) | 1479 | struct i915_gem_context *ctx) |
1442 | { | 1480 | { |
@@ -1449,6 +1487,18 @@ static int intel_ring_context_pin(struct intel_engine_cs *engine, | |||
1449 | return 0; | 1487 | return 0; |
1450 | GEM_BUG_ON(!ce->pin_count); /* no overflow please! */ | 1488 | GEM_BUG_ON(!ce->pin_count); /* no overflow please! */ |
1451 | 1489 | ||
1490 | if (engine->id == RCS && !ce->state && engine->i915->hw_context_size) { | ||
1491 | struct i915_vma *vma; | ||
1492 | |||
1493 | vma = alloc_context_vma(engine); | ||
1494 | if (IS_ERR(vma)) { | ||
1495 | ret = PTR_ERR(vma); | ||
1496 | goto error; | ||
1497 | } | ||
1498 | |||
1499 | ce->state = vma; | ||
1500 | } | ||
1501 | |||
1452 | if (ce->state) { | 1502 | if (ce->state) { |
1453 | ret = context_pin(ctx); | 1503 | ret = context_pin(ctx); |
1454 | if (ret) | 1504 | if (ret) |