[PATCH 28/49] drm/i915/bdw: Start creating & destroying user LR contexts

oscar.mateo
2014-03-27T17:09:40Z

From: Oscar Mateo <oscar.mateo@intel.com>

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@intel.com>
---
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