Module: Mesa
Branch: main
Commit: 5f7c2b0e1676100ff3098731424165afa5edf7aa
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=5f7c2b0e1676100ff3098731424165afa5edf7aa

Author: José Roberto de Souza <[email protected]>
Date:   Thu Oct 27 09:55:39 2022 -0700

intel/common: Add and use intel_gem_create_context_ext()

v2:
- added flag mask bit to enable context protected and recoverable
v3:
- added enum intel_gem_create_context_flags

Signed-off-by: José Roberto de Souza <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18974>

---

 src/gallium/drivers/iris/iris_bufmgr.c | 30 +++---------------------------
 src/intel/common/intel_gem.c           | 28 +++++++++++++++++++++-------
 src/intel/common/intel_gem.h           |  7 +++++++
 3 files changed, 31 insertions(+), 34 deletions(-)

diff --git a/src/gallium/drivers/iris/iris_bufmgr.c 
b/src/gallium/drivers/iris/iris_bufmgr.c
index 5e65a6def61..c720d08a6ea 100644
--- a/src/gallium/drivers/iris/iris_bufmgr.c
+++ b/src/gallium/drivers/iris/iris_bufmgr.c
@@ -2216,36 +2216,12 @@ iris_create_hw_context(struct iris_bufmgr *bufmgr, bool 
protected)
    uint32_t ctx_id;
 
    if (protected) {
-      struct drm_i915_gem_context_create_ext_setparam recoverable_param = {
-         .param = {
-            .param = I915_CONTEXT_PARAM_RECOVERABLE,
-            .value = false,
-         },
-      };
-      struct drm_i915_gem_context_create_ext_setparam protected_param = {
-         .param = {
-            .param = I915_CONTEXT_PARAM_PROTECTED_CONTENT,
-            .value = true,
-         },
-      };
-      struct drm_i915_gem_context_create_ext create = {
-         .flags = I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS,
-      };
-
-      intel_gem_add_ext(&create.extensions,
-                        I915_CONTEXT_CREATE_EXT_SETPARAM,
-                        &recoverable_param.base);
-      intel_gem_add_ext(&create.extensions,
-                        I915_CONTEXT_CREATE_EXT_SETPARAM,
-                        &protected_param.base);
-
-      int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, 
&create);
-      if (ret == -1) {
+      if (!intel_gem_create_context_ext(bufmgr->fd,
+                                        
INTEL_GEM_CREATE_CONTEXT_EXT_PROTECTED_FLAG,
+                                        &ctx_id)) {
          DBG("DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT failed: %s\n", 
strerror(errno));
          return 0;
       }
-
-      ctx_id = create.ctx_id;
    } else {
       struct drm_i915_gem_context_create create = { };
       int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, 
&create);
diff --git a/src/intel/common/intel_gem.c b/src/intel/common/intel_gem.c
index 6550c02afc4..ea0b7b8a17b 100644
--- a/src/intel/common/intel_gem.c
+++ b/src/intel/common/intel_gem.c
@@ -155,18 +155,19 @@ bool intel_gem_read_render_timestamp(int fd, uint64_t 
*value)
 }
 
 bool
-intel_gem_supports_protected_context(int fd)
+intel_gem_create_context_ext(int fd, enum intel_gem_create_context_flags flags,
+                             uint32_t *ctx_id)
 {
    struct drm_i915_gem_context_create_ext_setparam recoverable_param = {
       .param = {
          .param = I915_CONTEXT_PARAM_RECOVERABLE,
-         .value = false,
+         .value = flags & INTEL_GEM_CREATE_CONTEXT_EXT_RECOVERABLE_FLAG,
       },
    };
    struct drm_i915_gem_context_create_ext_setparam protected_param = {
       .param = {
          .param = I915_CONTEXT_PARAM_PROTECTED_CONTENT,
-         .value = true,
+         .value = flags & INTEL_GEM_CREATE_CONTEXT_EXT_PROTECTED_FLAG,
       },
    };
    struct drm_i915_gem_context_create_ext create = {
@@ -180,14 +181,27 @@ intel_gem_supports_protected_context(int fd)
                      I915_CONTEXT_CREATE_EXT_SETPARAM,
                      &protected_param.base);
 
-   int ret = intel_ioctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &create);
-   if (ret == -1)
+   if (intel_ioctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &create))
       return false;
 
+   *ctx_id = create.ctx_id;
+   return true;
+}
+
+bool
+intel_gem_supports_protected_context(int fd)
+{
+   uint32_t ctx_id;
+   bool ret = intel_gem_create_context_ext(fd,
+                                           
INTEL_GEM_CREATE_CONTEXT_EXT_PROTECTED_FLAG,
+                                           &ctx_id);
+   if (!ret)
+      return ret;
+
    struct drm_i915_gem_context_destroy destroy = {
-      .ctx_id = create.ctx_id,
+      .ctx_id = ctx_id,
    };
    intel_ioctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_DESTROY, &destroy);
 
-   return ret == 0;
+   return ret;
 }
diff --git a/src/intel/common/intel_gem.h b/src/intel/common/intel_gem.h
index 252f3e3ae05..eb40172ed94 100644
--- a/src/intel/common/intel_gem.h
+++ b/src/intel/common/intel_gem.h
@@ -39,6 +39,7 @@ extern "C" {
 #include <sys/ioctl.h>
 
 #include "intel_engine.h"
+#include "util/macros.h"
 
 static inline uint64_t
 intel_canonical_address(uint64_t v)
@@ -168,6 +169,12 @@ bool intel_gem_read_render_timestamp(int fd, uint64_t 
*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);
 
 static inline void

Reply via email to