From: Bommu Krishnaiah <krishnaiah.bommu@xxxxxxxxx> This api allow user mode to create Protected buffer and context creation. rev21: - Only allow set I915_CONTEXT_PARAM_PROTECTED_CONTENT during context creation (i915_gem_context_create_ioctl), but not allow during context set param (i915_gem_context_setparam_ioctl) rev23: - Require user space to explicitly set recoverable flag to false for protected context creation. Signed-off-by: Bommu Krishnaiah <krishnaiah.bommu@xxxxxxxxx> Cc: Telukuntla Sreedhar <sreedhar.telukuntla@xxxxxxxxx> Cc: Kondapally Kalyan <kalyan.kondapally@xxxxxxxxx> Cc: Gupta Anshuman <Anshuman.Gupta@xxxxxxxxx> Cc: Huang Sean Z <sean.z.huang@xxxxxxxxx> --- drivers/gpu/drm/i915/gem/i915_gem_context.c | 13 +++++++++ drivers/gpu/drm/i915/gem/i915_gem_context.h | 5 ++++ drivers/gpu/drm/i915/gem/i915_gem_create.c | 27 ++++++++++++++++--- .../gpu/drm/i915/gem/i915_gem_object_types.h | 5 ++++ include/uapi/drm/i915_drm.h | 10 +++++++ 5 files changed, 57 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c index 4d2f40cf237b..2af1da45ce63 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c @@ -81,6 +81,8 @@ #include "i915_trace.h" #include "i915_user_extensions.h" +#include "pxp/intel_pxp.h" + #define ALL_L3_SLICES(dev) (1 << NUM_L3_SLICES(dev)) - 1 static struct i915_global_gem_context { @@ -2052,6 +2054,7 @@ static int create_setparam(struct i915_user_extension __user *ext, void *data) { struct drm_i915_gem_context_create_ext_setparam local; const struct create_ext *arg = data; + int ret; if (copy_from_user(&local, ext, sizeof(local))) return -EFAULT; @@ -2059,6 +2062,10 @@ static int create_setparam(struct i915_user_extension __user *ext, void *data) if (local.param.ctx_id) return -EINVAL; + ret = intel_pxp_gem_context_create_param(arg->ctx, &local.param); + if (ret) + return ret; + return ctx_setparam(arg->fpriv, arg->ctx, &local.param); } @@ -2328,6 +2335,12 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data, goto err_ctx; } + if (i915_gem_context_is_protected(ext_data.ctx)) + if (!intel_pxp_gem_context_protected_param_valid(ext_data.ctx)) { + ret = -EINVAL; + goto err_ctx; + } + ret = gem_context_register(ext_data.ctx, ext_data.fpriv, &id); if (ret < 0) goto err_ctx; diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.h b/drivers/gpu/drm/i915/gem/i915_gem_context.h index b5c908f3f4f2..173154fdc311 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_context.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.h @@ -70,6 +70,11 @@ static inline void i915_gem_context_set_recoverable(struct i915_gem_context *ctx set_bit(UCONTEXT_RECOVERABLE, &ctx->user_flags); } +static inline bool i915_gem_context_is_protected(struct i915_gem_context *ctx) +{ + return test_bit(UCONTEXT_PROTECTED, &ctx->user_flags); +} + static inline void i915_gem_context_clear_recoverable(struct i915_gem_context *ctx) { clear_bit(UCONTEXT_RECOVERABLE, &ctx->user_flags); diff --git a/drivers/gpu/drm/i915/gem/i915_gem_create.c b/drivers/gpu/drm/i915/gem/i915_gem_create.c index 3ad3413c459f..c9b83217a6da 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_create.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_create.c @@ -5,6 +5,7 @@ #include "gem/i915_gem_ioctls.h" #include "gem/i915_gem_region.h" +#include "pxp/intel_pxp.h" #include "i915_drv.h" #include "i915_user_extensions.h" @@ -13,7 +14,8 @@ static int i915_gem_create(struct drm_file *file, struct intel_memory_region *mr, u64 *size_p, - u32 *handle_p) + u32 *handle_p, + u64 user_flags) { struct drm_i915_gem_object *obj; u32 handle; @@ -35,6 +37,8 @@ i915_gem_create(struct drm_file *file, GEM_BUG_ON(size != obj->base.size); + obj->user_flags = user_flags; + ret = drm_gem_handle_create(file, &obj->base, &handle); /* drop reference from allocate - handle holds it now */ i915_gem_object_put(obj); @@ -89,11 +93,12 @@ i915_gem_dumb_create(struct drm_file *file, return i915_gem_create(file, intel_memory_region_by_type(to_i915(dev), mem_type), - &args->size, &args->handle); + &args->size, &args->handle, 0); } struct create_ext { struct drm_i915_private *i915; + unsigned long user_flags; }; static int __create_setparam(struct drm_i915_gem_object_param *args, @@ -104,6 +109,17 @@ static int __create_setparam(struct drm_i915_gem_object_param *args, return -EINVAL; } + switch (lower_32_bits(args->param)) { + case I915_PARAM_PROTECTED_CONTENT: + if (args->size) { + return -EINVAL; + } else if (args->data) { + ext_data->user_flags = args->data; + return 0; + } + break; + } + return -EINVAL; } @@ -145,8 +161,13 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data, if (ret) return ret; + if (ext_data.user_flags & I915_BO_PROTECTED) { + if (!intel_pxp_gem_object_status(i915)) + return -EINVAL; + } + return i915_gem_create(file, intel_memory_region_by_type(i915, INTEL_MEMORY_SYSTEM), - &args->size, &args->handle); + &args->size, &args->handle, ext_data.user_flags); } diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h index e2d9b7e1e152..90ac955463f4 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_object_types.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_types.h @@ -161,6 +161,11 @@ struct drm_i915_gem_object { } mmo; I915_SELFTEST_DECLARE(struct list_head st_link); + /** + * @user_flags: small set of booleans set by the user + */ + unsigned long user_flags; +#define I915_BO_PROTECTED BIT(0) unsigned long flags; #define I915_BO_ALLOC_CONTIGUOUS BIT(0) diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h index aa232ded9951..17a6e3545570 100644 --- a/include/uapi/drm/i915_drm.h +++ b/include/uapi/drm/i915_drm.h @@ -1744,6 +1744,16 @@ struct drm_i915_gem_object_param { */ #define I915_OBJECT_PARAM (1ull << 32) +/* + * I915_PARAM_PROTECTED_CONTENT: + * + * If set to true (1) buffer contents is expected to be protected by + * PAVP encryption and requires decryption for scan out and processing. + * Protected buffers can only be used in PAVP protected contexts. + * A protected buffer may become invalid as a result of PAVP teardown. + */ +#define I915_PARAM_PROTECTED_CONTENT 0x1 + __u64 param; /* Data value or pointer */ -- 2.17.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx