From cb8a878b53680b30106a0c864f020fc6f6a078c3 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Mon, 8 May 2023 09:15:02 +0300 Subject: [PATCH] intel: enable protected context creation along with engines MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Lionel Landwerlin Reviewed-by: José Roberto de Souza Part-of: --- src/gallium/drivers/iris/i915/iris_batch.c | 6 +++++- src/intel/common/i915/intel_gem.c | 31 ++++++++++++++++++++++++++---- src/intel/common/i915/intel_gem.h | 1 + src/intel/common/intel_gem.c | 3 ++- src/intel/common/intel_gem.h | 10 ++++++---- src/intel/vulkan/i915/anv_device.c | 2 +- src/intel/vulkan_hasvk/anv_device.c | 2 +- 7 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/iris/i915/iris_batch.c b/src/gallium/drivers/iris/i915/iris_batch.c index 8456fa1..9a3f274 100644 --- a/src/gallium/drivers/iris/i915/iris_batch.c +++ b/src/gallium/drivers/iris/i915/iris_batch.c @@ -168,8 +168,12 @@ iris_create_engines_context(struct iris_context *ice) intel_engines_count(engines_info, INTEL_ENGINE_CLASS_COMPUTE) > 0) engine_classes[IRIS_BATCH_COMPUTE] = INTEL_ENGINE_CLASS_COMPUTE; + enum intel_gem_create_context_flags flags = 0; + if (ice->protected) + flags |= INTEL_GEM_CREATE_CONTEXT_EXT_PROTECTED_FLAG; + uint32_t engines_ctx; - if (!intel_gem_create_context_engines(fd, engines_info, num_batches, + if (!intel_gem_create_context_engines(fd, flags, engines_info, num_batches, engine_classes, &engines_ctx)) { free(engines_info); return -1; diff --git a/src/intel/common/i915/intel_gem.c b/src/intel/common/i915/intel_gem.c index 72ccbed..b380e57 100644 --- a/src/intel/common/i915/intel_gem.c +++ b/src/intel/common/i915/intel_gem.c @@ -49,6 +49,7 @@ i915_gem_destroy_context(int fd, uint32_t context_id) bool i915_gem_create_context_engines(int fd, + enum intel_gem_create_context_flags flags, const struct intel_query_engine_info *info, int num_engines, enum intel_engine_class *engine_classes, uint32_t *context_id) @@ -115,19 +116,41 @@ i915_gem_create_context_engines(int fd, uint32_t size = sizeof(engines_param.extensions); size += sizeof(engines_param.engines[0]) * num_engines; struct drm_i915_gem_context_create_ext_setparam set_engines = { - .base = { - .name = I915_CONTEXT_CREATE_EXT_SETPARAM, - }, .param = { .param = I915_CONTEXT_PARAM_ENGINES, .value = (uintptr_t)&engines_param, .size = size, } }; + struct drm_i915_gem_context_create_ext_setparam protected_param = { + .param = { + .param = I915_CONTEXT_PARAM_PROTECTED_CONTENT, + .value = flags & INTEL_GEM_CREATE_CONTEXT_EXT_PROTECTED_FLAG, + }, + }; + struct drm_i915_gem_context_create_ext_setparam recoverable_param = { + .param = { + .param = I915_CONTEXT_PARAM_RECOVERABLE, + .value = flags & INTEL_GEM_CREATE_CONTEXT_EXT_RECOVERABLE_FLAG, + }, + }; struct drm_i915_gem_context_create_ext create = { .flags = I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS, - .extensions = (uintptr_t)&set_engines, }; + + intel_gem_add_ext(&create.extensions, + I915_CONTEXT_CREATE_EXT_SETPARAM, + &set_engines.base); + intel_gem_add_ext(&create.extensions, + I915_CONTEXT_CREATE_EXT_SETPARAM, + &recoverable_param.base); + + if (flags & INTEL_GEM_CREATE_CONTEXT_EXT_PROTECTED_FLAG) { + intel_gem_add_ext(&create.extensions, + I915_CONTEXT_CREATE_EXT_SETPARAM, + &protected_param.base); + } + if (intel_ioctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &create) == -1) return false; diff --git a/src/intel/common/i915/intel_gem.h b/src/intel/common/i915/intel_gem.h index 34176b3..b2e4856 100644 --- a/src/intel/common/i915/intel_gem.h +++ b/src/intel/common/i915/intel_gem.h @@ -33,6 +33,7 @@ bool i915_gem_create_context(int fd, uint32_t *context_id); bool i915_gem_destroy_context(int fd, uint32_t context_id); bool i915_gem_create_context_engines(int fd, + enum intel_gem_create_context_flags flags, const struct intel_query_engine_info *info, int num_engines, enum intel_engine_class *engine_classes, uint32_t *context_id); diff --git a/src/intel/common/intel_gem.c b/src/intel/common/intel_gem.c index bd07ff5..b697d2f 100644 --- a/src/intel/common/intel_gem.c +++ b/src/intel/common/intel_gem.c @@ -74,11 +74,12 @@ intel_gem_destroy_context(int fd, uint32_t context_id) bool intel_gem_create_context_engines(int fd, + enum intel_gem_create_context_flags flags, const struct intel_query_engine_info *info, int num_engines, enum intel_engine_class *engine_classes, uint32_t *context_id) { - return i915_gem_create_context_engines(fd, info, num_engines, + return i915_gem_create_context_engines(fd, flags, info, num_engines, engine_classes, context_id); } diff --git a/src/intel/common/intel_gem.h b/src/intel/common/intel_gem.h index bf7a3ff..b5ffc23 100644 --- a/src/intel/common/intel_gem.h +++ b/src/intel/common/intel_gem.h @@ -167,10 +167,16 @@ intel_gem_read_render_timestamp(int fd, enum intel_kmd_type kmd_type, bool intel_gem_can_render_on_fd(int fd, enum intel_kmd_type kmd_type); /* Functions only used by i915 */ +enum intel_gem_create_context_flags { + INTEL_GEM_CREATE_CONTEXT_EXT_RECOVERABLE_FLAG = BITFIELD_BIT(0), + INTEL_GEM_CREATE_CONTEXT_EXT_PROTECTED_FLAG = BITFIELD_BIT(1), +}; + bool intel_gem_create_context(int fd, uint32_t *context_id); bool intel_gem_destroy_context(int fd, uint32_t context_id); bool intel_gem_create_context_engines(int fd, + enum intel_gem_create_context_flags flags, const struct intel_query_engine_info *info, int num_engines, enum intel_engine_class *engine_classes, uint32_t *context_id); @@ -186,10 +192,6 @@ bool intel_gem_get_param(int fd, uint32_t param, int *value); } #endif -enum intel_gem_create_context_flags { - INTEL_GEM_CREATE_CONTEXT_EXT_RECOVERABLE_FLAG = BITFIELD_BIT(0), - INTEL_GEM_CREATE_CONTEXT_EXT_PROTECTED_FLAG = BITFIELD_BIT(1), -}; bool intel_gem_create_context_ext(int fd, enum intel_gem_create_context_flags flags, uint32_t *ctx_id); bool intel_gem_supports_protected_context(int fd, diff --git a/src/intel/vulkan/i915/anv_device.c b/src/intel/vulkan/i915/anv_device.c index ada5a85e..257b933 100644 --- a/src/intel/vulkan/i915/anv_device.c +++ b/src/intel/vulkan/i915/anv_device.c @@ -150,7 +150,7 @@ anv_i915_device_setup_context(struct anv_device *device, for (uint32_t j = 0; j < queueCreateInfo->queueCount; j++) engine_classes[engine_count++] = queue_family->engine_class; } - if (!intel_gem_create_context_engines(device->fd, + if (!intel_gem_create_context_engines(device->fd, 0 /* flags */, physical_device->engine_info, engine_count, engine_classes, (uint32_t *)&device->context_id)) diff --git a/src/intel/vulkan_hasvk/anv_device.c b/src/intel/vulkan_hasvk/anv_device.c index cd30c0a..af4d759 100644 --- a/src/intel/vulkan_hasvk/anv_device.c +++ b/src/intel/vulkan_hasvk/anv_device.c @@ -2625,7 +2625,7 @@ anv_device_setup_context(struct anv_device *device, for (uint32_t j = 0; j < queueCreateInfo->queueCount; j++) engine_classes[engine_count++] = queue_family->engine_class; } - if (!intel_gem_create_context_engines(device->fd, + if (!intel_gem_create_context_engines(device->fd, 0 /* flags */, physical_device->engine_info, engine_count, engine_classes, (uint32_t *)&device->context_id)) -- 2.7.4