From: Oscar Mateo <oscar.mateo@xxxxxxxxx> Users can create contexts either implicitly by opening an fd, or explicitly by the context create ioctl. In either case, this context needs to be corectly populated with "advanced" stuff. For the moment we consider all the user contexts to be of the render type (probably true for the create context ioctl at this moment, but a gross oversimplification for the fd case that we will fix later on). Also, we need to make sure the corresponding ringbuffer and backup pages are correctly destroyed (note that, in the case of the global default contexts, freeing was already taken care of by the ring cleanup code). Signed-off-by: Oscar Mateo <oscar.mateo@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_gem_context.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index cb43272..6baa5ab 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c @@ -184,6 +184,11 @@ void i915_gem_context_free(struct kref *ctx_ref) struct i915_hw_context *ctx = container_of(ctx_ref, typeof(*ctx), ref); struct i915_hw_ppgtt *ppgtt = NULL; + struct drm_device *dev = ctx->obj->base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + + if (dev_priv->lrc_enabled) + gen8_gem_context_free(ctx); /* We refcount even the aliasing PPGTT to keep the code symmetric */ if (USES_PPGTT(ctx->obj->base.dev)) @@ -535,8 +540,13 @@ int i915_gem_context_open(struct drm_device *dev, struct drm_file *file) idr_init(&file_priv->context_idr); mutex_lock(&dev->struct_mutex); - file_priv->private_default_ctx = - i915_gem_create_context(dev, file_priv, USES_FULL_PPGTT(dev)); + if (dev_priv->lrc_enabled) + file_priv->private_default_ctx = gen8_gem_create_context(dev, + &dev_priv->ring[RCS], file_priv, + USES_FULL_PPGTT(dev)); + else + file_priv->private_default_ctx = i915_gem_create_context(dev, + file_priv, USES_FULL_PPGTT(dev)); mutex_unlock(&dev->struct_mutex); if (IS_ERR(file_priv->private_default_ctx)) { @@ -782,6 +792,7 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data, { struct drm_i915_gem_context_create *args = data; struct drm_i915_file_private *file_priv = file->driver_priv; + struct drm_i915_private *dev_priv = dev->dev_private; struct i915_hw_context *ctx; int ret; @@ -792,7 +803,12 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data, if (ret) return ret; - ctx = i915_gem_create_context(dev, file_priv, USES_FULL_PPGTT(dev)); + if (dev_priv->lrc_enabled) + ctx = gen8_gem_create_context(dev, &dev_priv->ring[RCS], + file_priv, USES_FULL_PPGTT(dev)); + else + ctx = i915_gem_create_context(dev, file_priv, + USES_FULL_PPGTT(dev)); mutex_unlock(&dev->struct_mutex); if (IS_ERR(ctx)) return PTR_ERR(ctx); -- 1.9.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx