drm/i915: Extract context backing object allocation
This is preparatory work for Execlists: we plan to use it later to allocate our own context objects (since Logical Ring Contexts do not have the same kind of backing objects). No functional changes. Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Oscar Mateo <oscar.mateo@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
95fa2eeecf
commit
aa0c13daad
1 changed files with 35 additions and 19 deletions
|
@ -198,6 +198,36 @@ void i915_gem_context_free(struct kref *ctx_ref)
|
||||||
kfree(ctx);
|
kfree(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct drm_i915_gem_object *
|
||||||
|
i915_gem_alloc_context_obj(struct drm_device *dev, size_t size)
|
||||||
|
{
|
||||||
|
struct drm_i915_gem_object *obj;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
obj = i915_gem_alloc_object(dev, size);
|
||||||
|
if (obj == NULL)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to make the context utilize L3 as well as LLC.
|
||||||
|
*
|
||||||
|
* On VLV we don't have L3 controls in the PTEs so we
|
||||||
|
* shouldn't touch the cache level, especially as that
|
||||||
|
* would make the object snooped which might have a
|
||||||
|
* negative performance impact.
|
||||||
|
*/
|
||||||
|
if (INTEL_INFO(dev)->gen >= 7 && !IS_VALLEYVIEW(dev)) {
|
||||||
|
ret = i915_gem_object_set_cache_level(obj, I915_CACHE_L3_LLC);
|
||||||
|
/* Failure shouldn't ever happen this early */
|
||||||
|
if (WARN_ON(ret)) {
|
||||||
|
drm_gem_object_unreference(&obj->base);
|
||||||
|
return ERR_PTR(ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
static struct i915_hw_ppgtt *
|
static struct i915_hw_ppgtt *
|
||||||
create_vm_for_ctx(struct drm_device *dev, struct intel_context *ctx)
|
create_vm_for_ctx(struct drm_device *dev, struct intel_context *ctx)
|
||||||
{
|
{
|
||||||
|
@ -234,27 +264,13 @@ __create_hw_context(struct drm_device *dev,
|
||||||
list_add_tail(&ctx->link, &dev_priv->context_list);
|
list_add_tail(&ctx->link, &dev_priv->context_list);
|
||||||
|
|
||||||
if (dev_priv->hw_context_size) {
|
if (dev_priv->hw_context_size) {
|
||||||
ctx->obj = i915_gem_alloc_object(dev, dev_priv->hw_context_size);
|
struct drm_i915_gem_object *obj =
|
||||||
if (ctx->obj == NULL) {
|
i915_gem_alloc_context_obj(dev, dev_priv->hw_context_size);
|
||||||
ret = -ENOMEM;
|
if (IS_ERR(obj)) {
|
||||||
|
ret = PTR_ERR(obj);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
ctx->obj = obj;
|
||||||
/*
|
|
||||||
* Try to make the context utilize L3 as well as LLC.
|
|
||||||
*
|
|
||||||
* On VLV we don't have L3 controls in the PTEs so we
|
|
||||||
* shouldn't touch the cache level, especially as that
|
|
||||||
* would make the object snooped which might have a
|
|
||||||
* negative performance impact.
|
|
||||||
*/
|
|
||||||
if (INTEL_INFO(dev)->gen >= 7 && !IS_VALLEYVIEW(dev)) {
|
|
||||||
ret = i915_gem_object_set_cache_level(ctx->obj,
|
|
||||||
I915_CACHE_L3_LLC);
|
|
||||||
/* Failure shouldn't ever happen this early */
|
|
||||||
if (WARN_ON(ret))
|
|
||||||
goto err_out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Default context will never have a file_priv */
|
/* Default context will never have a file_priv */
|
||||||
|
|
Loading…
Add table
Reference in a new issue