For passing flags (e.g. SVM) when creating a context.

Signed-off-by: Jesse Barnes <jbar...@virtuousgeek.org>
---
 drivers/gpu/drm/i915/i915_dma.c         |  1 +
 drivers/gpu/drm/i915/i915_drv.h         |  2 ++
 drivers/gpu/drm/i915/i915_gem_context.c | 63 +++++++++++++++++++++++++++------
 include/uapi/drm/i915_drm.h             | 18 ++++++++++
 4 files changed, 73 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index f0eaa6f..b868084 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1300,6 +1300,7 @@ const struct drm_ioctl_desc i915_ioctls[] = {
        DRM_IOCTL_DEF_DRV(I915_GEM_USERPTR, i915_gem_userptr_ioctl, 
DRM_UNLOCKED|DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_GETPARAM, 
i915_gem_context_getparam_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_SETPARAM, 
i915_gem_context_setparam_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_CREATE2, 
i915_gem_context_create2_ioctl, DRM_UNLOCKED),
 };
 
 int i915_max_ioctl = ARRAY_SIZE(i915_ioctls);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 1287007..20beb51 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3139,6 +3139,8 @@ static inline bool i915_gem_context_is_default(const 
struct intel_context *c)
 
 int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
                                  struct drm_file *file);
+int i915_gem_context_create2_ioctl(struct drm_device *dev, void *data,
+                                  struct drm_file *file);
 int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
                                   struct drm_file *file);
 int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c 
b/drivers/gpu/drm/i915/i915_gem_context.c
index 74aa0c9..e9ec2f3 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -238,14 +238,18 @@ err_out:
  */
 static struct intel_context *
 i915_gem_create_context(struct drm_device *dev,
-                       struct drm_i915_file_private *file_priv)
+                       struct drm_i915_file_private *file_priv, u32 flags)
 {
        const bool is_global_default_ctx = file_priv == NULL;
        struct intel_context *ctx;
+       bool create_vm = false;
        int ret = 0;
 
        BUG_ON(!mutex_is_locked(&dev->struct_mutex));
 
+       if (flags & (I915_GEM_CONTEXT_FULL_PPGTT | I915_GEM_CONTEXT_ENABLE_SVM))
+               create_vm = true;
+
        ctx = __create_hw_context(dev, file_priv);
        if (IS_ERR(ctx))
                return ctx;
@@ -266,7 +270,7 @@ i915_gem_create_context(struct drm_device *dev,
                }
        }
 
-       if (USES_FULL_PPGTT(dev)) {
+       if (create_vm) {
                struct i915_hw_ppgtt *ppgtt = i915_ppgtt_create(dev, file_priv);
 
                if (IS_ERR_OR_NULL(ppgtt)) {
@@ -325,6 +329,7 @@ int i915_gem_context_init(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_context *ctx;
+       u32 flags = 0;
        int i;
 
        /* Init should only be called once per module load. Eventually the
@@ -352,7 +357,10 @@ int i915_gem_context_init(struct drm_device *dev)
                }
        }
 
-       ctx = i915_gem_create_context(dev, NULL);
+       if (USES_FULL_PPGTT(dev))
+               flags |= I915_GEM_CONTEXT_FULL_PPGTT;
+
+       ctx = i915_gem_create_context(dev, NULL, flags);
        if (IS_ERR(ctx)) {
                DRM_ERROR("Failed to create default global context (error 
%ld)\n",
                          PTR_ERR(ctx));
@@ -452,7 +460,8 @@ int i915_gem_context_open(struct drm_device *dev, struct 
drm_file *file)
        idr_init(&file_priv->context_idr);
 
        mutex_lock(&dev->struct_mutex);
-       ctx = i915_gem_create_context(dev, file_priv);
+       ctx = i915_gem_create_context(dev, file_priv, USES_FULL_PPGTT(dev) ?
+                                     I915_GEM_CONTEXT_FULL_PPGTT : 0);
        mutex_unlock(&dev->struct_mutex);
 
        if (IS_ERR(ctx)) {
@@ -820,13 +829,15 @@ static bool contexts_enabled(struct drm_device *dev)
        return i915.enable_execlists || to_i915(dev)->hw_context_size;
 }
 
-int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
+int i915_gem_context_create2_ioctl(struct drm_device *dev, void *data,
                                  struct drm_file *file)
 {
-       struct drm_i915_gem_context_create *args = data;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_gem_context_create2 *args = data;
        struct drm_i915_file_private *file_priv = file->driver_priv;
        struct intel_context *ctx;
-       int ret;
+       u32 flags = args->flags;
+       int ret = 0;
 
        if (!contexts_enabled(dev))
                return -ENODEV;
@@ -835,14 +846,44 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, 
void *data,
        if (ret)
                return ret;
 
-       ctx = i915_gem_create_context(dev, file_priv);
-       mutex_unlock(&dev->struct_mutex);
-       if (IS_ERR(ctx))
-               return PTR_ERR(ctx);
+       if (USES_FULL_PPGTT(dev))
+               flags |= I915_GEM_CONTEXT_FULL_PPGTT;
+
+       if ((flags & I915_GEM_CONTEXT_ENABLE_SVM) &&
+           !dev_priv->svm.svm_available) {
+               ret = -ENODEV;
+               goto out_unlock;
+       }
+
+       ctx = i915_gem_create_context(dev, file_priv, flags);
+       if (IS_ERR(ctx)) {
+               ret = PTR_ERR(ctx);
+               goto out_unlock;
+       }
 
        args->ctx_id = ctx->user_handle;
        DRM_DEBUG_DRIVER("HW context %d created\n", args->ctx_id);
 
+out_unlock:
+       mutex_unlock(&dev->struct_mutex);
+       return ret;
+}
+
+int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
+                                 struct drm_file *file)
+{
+       struct drm_i915_gem_context_create *args = data;
+       struct drm_i915_gem_context_create2 tmp;
+       int ret;
+
+       tmp.flags = 0;
+
+       ret = i915_gem_context_create2_ioctl(dev, &tmp, file);
+       if (ret)
+               return ret;
+
+       args->ctx_id = tmp.ctx_id;
+
        return 0;
 }
 
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index fd5aa47..bac2fb2 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -230,6 +230,7 @@ typedef struct _drm_i915_sarea {
 #define DRM_I915_GEM_USERPTR           0x33
 #define DRM_I915_GEM_CONTEXT_GETPARAM  0x34
 #define DRM_I915_GEM_CONTEXT_SETPARAM  0x35
+#define DRM_I915_GEM_CONTEXT_CREATE2   0x36
 
 #define DRM_IOCTL_I915_INIT            DRM_IOW( DRM_COMMAND_BASE + 
DRM_I915_INIT, drm_i915_init_t)
 #define DRM_IOCTL_I915_FLUSH           DRM_IO ( DRM_COMMAND_BASE + 
DRM_I915_FLUSH)
@@ -283,6 +284,7 @@ typedef struct _drm_i915_sarea {
 #define DRM_IOCTL_I915_GEM_USERPTR                     DRM_IOWR 
(DRM_COMMAND_BASE + DRM_I915_GEM_USERPTR, struct drm_i915_gem_userptr)
 #define DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM    DRM_IOWR (DRM_COMMAND_BASE + 
DRM_I915_GEM_CONTEXT_GETPARAM, struct drm_i915_gem_context_param)
 #define DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM    DRM_IOWR (DRM_COMMAND_BASE + 
DRM_I915_GEM_CONTEXT_SETPARAM, struct drm_i915_gem_context_param)
+#define DRM_IOCTL_I915_GEM_CONTEXT_CREATE2     DRM_IOWR (DRM_COMMAND_BASE + 
DRM_I915_GEM_CONTEXT_CREATE2, struct drm_i915_gem_context_create2)
 
 /* Allow drivers to submit batchbuffers directly to hardware, relying
  * on the security mechanisms provided by hardware.
@@ -1072,6 +1074,22 @@ struct drm_i915_gem_context_create {
        __u32 pad;
 };
 
+/*
+ * SVM handling
+ *
+ * A context can opt in to SVM support (thereby using its CPU page tables
+ * when accessing data from the GPU) by using the %I915_ENABLE_SVM flag
+ * and passing an existing context id.  This is a one way transition; SVM
+ * contexts can not be downgraded into PPGTT contexts once converted.
+ */
+#define I915_GEM_CONTEXT_ENABLE_SVM            (1<<0)
+#define I915_GEM_CONTEXT_FULL_PPGTT            (1<<1)
+struct drm_i915_gem_context_create2 {
+       /*  output: id of new context*/
+       __u32 ctx_id;
+       __u32 flags;
+};
+
 struct drm_i915_gem_context_destroy {
        __u32 ctx_id;
        __u32 pad;
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to