intel: enable protected context creation along with engines
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Mon, 8 May 2023 06:15:02 +0000 (09:15 +0300)
committerMarge Bot <emma+marge@anholt.net>
Mon, 8 May 2023 20:40:20 +0000 (20:40 +0000)
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22898>

src/gallium/drivers/iris/i915/iris_batch.c
src/intel/common/i915/intel_gem.c
src/intel/common/i915/intel_gem.h
src/intel/common/intel_gem.c
src/intel/common/intel_gem.h
src/intel/vulkan/i915/anv_device.c
src/intel/vulkan_hasvk/anv_device.c

index 8456fa1..9a3f274 100644 (file)
@@ -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;
index 72ccbed..b380e57 100644 (file)
@@ -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;
 
index 34176b3..b2e4856 100644 (file)
@@ -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);
index bd07ff5..b697d2f 100644 (file)
@@ -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);
 }
 
index bf7a3ff..b5ffc23 100644 (file)
@@ -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,
index ada5a85..257b933 100644 (file)
@@ -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))
index cd30c0a..af4d759 100644 (file)
@@ -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))