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

Author: José Roberto de Souza <jose.so...@intel.com>
Date:   Tue Nov 21 10:19:31 2023 -0800

iris: Check for maximum allowed priority in Xe KMD

Previous code was settting whatever priority was requested even if
Xe KMD would not allow it causing warnings in dmesg:

xe 0000:00:02.0: [drm:exec_queue_set_priority [xe]] Ioctl argument check failed 
at drivers/gpu/drm/xe/xe_exec_queue.c:235: value > 
xe_exec_queue_device_get_max_priority(xe)
xe 0000:00:02.0: [drm:xe_exec_queue_set_property_ioctl [xe]] Ioctl argument 
check failed at drivers/gpu/drm/xe/xe_exec_queue.c:912: ret

Now it will query the maximum allowed priority and set the priority
closed to what application requested.

Signed-off-by: José Roberto de Souza <jose.so...@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwer...@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26325>

---

 src/gallium/drivers/iris/xe/iris_batch.c | 30 +++++++++++++++++++++---------
 1 file changed, 21 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/iris/xe/iris_batch.c 
b/src/gallium/drivers/iris/xe/iris_batch.c
index 944ceaea38d..0c0fc208cb9 100644
--- a/src/gallium/drivers/iris/xe/iris_batch.c
+++ b/src/gallium/drivers/iris/xe/iris_batch.c
@@ -28,6 +28,7 @@
 
 #include "common/intel_gem.h"
 #include "common/intel_engine.h"
+#include "common/xe/intel_device_query.h"
 #include "common/xe/intel_engine.h"
 
 #include "drm-uapi/xe_drm.h"
@@ -62,6 +63,20 @@ iris_xe_init_batch(struct iris_bufmgr *bufmgr,
    if (!instances)
       return false;
 
+   enum drm_sched_priority requested_priority = 
iris_context_priority_to_drm_sched_priority(priority);
+   enum drm_sched_priority allowed_priority = DRM_SCHED_PRIORITY_MIN;
+   if (requested_priority > DRM_SCHED_PRIORITY_MIN) {
+      struct drm_xe_query_config *config;
+
+      config = xe_device_query_alloc_fetch(iris_bufmgr_get_fd(bufmgr),
+                                           DRM_XE_DEVICE_QUERY_CONFIG, NULL);
+      if (config)
+         allowed_priority = 
config->info[DRM_XE_QUERY_CONFIG_MAX_EXEC_QUEUE_PRIORITY];
+      free(config);
+   }
+   if (requested_priority < allowed_priority)
+      allowed_priority = requested_priority;
+
    uint32_t count = 0;
    for (uint32_t i = 0; i < engines_info->num_engines; i++) {
       const struct intel_engine_class_instance engine = 
engines_info->engines[i];
@@ -72,16 +87,17 @@ iris_xe_init_batch(struct iris_bufmgr *bufmgr,
       instances[count].engine_instance = engine.engine_instance;
       instances[count++].gt_id = engine.gt_id;
    }
-
+   struct drm_xe_ext_set_property ext = {
+      .base.name = DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY,
+      .property = DRM_XE_EXEC_QUEUE_SET_PROPERTY_PRIORITY,
+      .value = allowed_priority,
+   };
    struct drm_xe_exec_queue_create create = {
          .instances = (uintptr_t)instances,
          .vm_id = iris_bufmgr_get_global_vm_id(bufmgr),
          .width = 1,
          .num_placements = count,
-   };
-   struct drm_xe_exec_queue_set_property exec_queue_property = {
-      .property = DRM_XE_EXEC_QUEUE_SET_PROPERTY_PRIORITY,
-      .value = iris_context_priority_to_drm_sched_priority(priority),
+         .extensions = (uintptr_t)&ext,
    };
    int ret = intel_ioctl(iris_bufmgr_get_fd(bufmgr),
                          DRM_IOCTL_XE_EXEC_QUEUE_CREATE, &create);
@@ -89,10 +105,6 @@ iris_xe_init_batch(struct iris_bufmgr *bufmgr,
    if (ret)
       goto error_create_exec_queue;
 
-   exec_queue_property.exec_queue_id = create.exec_queue_id;
-   intel_ioctl(iris_bufmgr_get_fd(bufmgr), 
DRM_IOCTL_XE_EXEC_QUEUE_SET_PROPERTY,
-               &exec_queue_property);
-
    /* TODO: handle "protected" context/exec_queue */
    *exec_queue_id = create.exec_queue_id;
 error_create_exec_queue:

Reply via email to