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: