tu: Pass tu_queue to kernel create/destroy functions

Refactor this since we're about to create more than one kernel queue per
Vulkan queue on drm/msm.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37304>
This commit is contained in:
Connor Abbott 2025-09-11 10:12:22 -04:00 committed by Marge Bot
parent fff9f0a0e6
commit 6c296c1283
6 changed files with 30 additions and 45 deletions

View file

@ -304,18 +304,15 @@ tu_device_check_status(struct vk_device *vk_device)
}
int
tu_drm_submitqueue_new(struct tu_device *dev,
enum tu_queue_type type,
int priority,
uint32_t *queue_id)
tu_drm_submitqueue_new(struct tu_device *dev, struct tu_queue *queue)
{
return dev->instance->knl->submitqueue_new(dev, type, priority, queue_id);
return dev->instance->knl->submitqueue_new(dev, queue);
}
void
tu_drm_submitqueue_close(struct tu_device *dev, uint32_t queue_id)
tu_drm_submitqueue_close(struct tu_device *dev, struct tu_queue *queue)
{
dev->instance->knl->submitqueue_close(dev, queue_id);
dev->instance->knl->submitqueue_close(dev, queue);
}
void *

View file

@ -118,8 +118,8 @@ struct tu_knl {
int (*device_get_gpu_timestamp)(struct tu_device *dev, uint64_t *ts);
int (*device_get_suspend_count)(struct tu_device *dev, uint64_t *suspend_count);
VkResult (*device_check_status)(struct tu_device *dev);
int (*submitqueue_new)(struct tu_device *dev, enum tu_queue_type type, int priority, uint32_t *queue_id);
void (*submitqueue_close)(struct tu_device *dev, uint32_t queue_id);
int (*submitqueue_new)(struct tu_device *dev, struct tu_queue *queue);
void (*submitqueue_close)(struct tu_device *dev, struct tu_queue *queue);
VkResult (*bo_init)(struct tu_device *dev, struct vk_object_base *base,
struct tu_bo **out_bo, uint64_t size, uint64_t client_iova,
VkMemoryPropertyFlags mem_property,
@ -288,13 +288,10 @@ VkResult
tu_device_check_status(struct vk_device *vk_device);
int
tu_drm_submitqueue_new(struct tu_device *dev,
enum tu_queue_type type,
int priority,
uint32_t *queue_id);
tu_drm_submitqueue_new(struct tu_device *dev, struct tu_queue *queue);
void
tu_drm_submitqueue_close(struct tu_device *dev, uint32_t queue_id);
tu_drm_submitqueue_close(struct tu_device *dev, struct tu_queue *queue);
void *
tu_submit_create(struct tu_device *dev);

View file

@ -333,19 +333,16 @@ msm_device_check_status(struct tu_device *device)
}
static int
msm_submitqueue_new(struct tu_device *dev,
enum tu_queue_type type,
int priority,
uint32_t *queue_id)
msm_submitqueue_new(struct tu_device *dev, struct tu_queue *queue)
{
assert(priority >= 0 &&
priority < dev->physical_device->submitqueue_priority_count);
assert(queue->priority >= 0 &&
queue->priority < dev->physical_device->submitqueue_priority_count);
struct drm_msm_submitqueue req = {
.flags = type == TU_QUEUE_SPARSE ? MSM_SUBMITQUEUE_VM_BIND :
.flags = queue->type == TU_QUEUE_SPARSE ? MSM_SUBMITQUEUE_VM_BIND :
(dev->physical_device->info->chip >= 7 &&
dev->physical_device->has_preemption ?
MSM_SUBMITQUEUE_ALLOW_PREEMPT : 0),
.prio = priority,
.prio = queue->priority,
};
int ret = drmCommandWriteRead(dev->fd,
@ -353,15 +350,15 @@ msm_submitqueue_new(struct tu_device *dev,
if (ret)
return ret;
*queue_id = req.id;
queue->msm_queue_id = req.id;
return 0;
}
static void
msm_submitqueue_close(struct tu_device *dev, uint32_t queue_id)
msm_submitqueue_close(struct tu_device *dev, struct tu_queue *queue)
{
drmCommandWrite(dev->fd, DRM_MSM_SUBMITQUEUE_CLOSE,
&queue_id, sizeof(uint32_t));
&queue->msm_queue_id, sizeof(uint32_t));
}
static void

View file

@ -345,37 +345,34 @@ virtio_device_check_status(struct tu_device *device)
}
static int
virtio_submitqueue_new(struct tu_device *dev,
enum tu_queue_type type,
int priority,
uint32_t *queue_id)
virtio_submitqueue_new(struct tu_device *dev, struct tu_queue *queue)
{
MESA_TRACE_FUNC();
assert(priority >= 0 &&
priority < dev->physical_device->submitqueue_priority_count);
assert(queue->priority >= 0 &&
queue->priority < dev->physical_device->submitqueue_priority_count);
struct drm_msm_submitqueue req = {
.flags = type == TU_QUEUE_SPARSE ? MSM_SUBMITQUEUE_VM_BIND :
.flags = queue->type == TU_QUEUE_SPARSE ? MSM_SUBMITQUEUE_VM_BIND :
(dev->physical_device->info->chip >= 7 &&
dev->physical_device->has_preemption ?
MSM_SUBMITQUEUE_ALLOW_PREEMPT : 0),
.prio = priority,
.prio = queue->priority,
};
int ret = virtio_simple_ioctl(dev->vdev->vdrm, DRM_IOCTL_MSM_SUBMITQUEUE_NEW, &req);
if (ret)
return ret;
*queue_id = req.id;
queue->msm_queue_id = req.id;
return 0;
}
static void
virtio_submitqueue_close(struct tu_device *dev, uint32_t queue_id)
virtio_submitqueue_close(struct tu_device *dev, struct tu_queue *queue)
{
MESA_TRACE_FUNC();
virtio_simple_ioctl(dev->vdev->vdrm, DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE, &queue_id);
virtio_simple_ioctl(dev->vdev->vdrm, DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE, &queue->msm_queue_id);
}
static bool

View file

@ -50,10 +50,7 @@ safe_ioctl(int fd, unsigned long request, void *arg)
}
static int
kgsl_submitqueue_new(struct tu_device *dev,
enum tu_queue_type type,
int priority,
uint32_t *queue_id)
kgsl_submitqueue_new(struct tu_device *dev, struct tu_queue *queue)
{
struct kgsl_drawctxt_create req = {
.flags = KGSL_CONTEXT_SAVE_GMEM |
@ -65,16 +62,16 @@ kgsl_submitqueue_new(struct tu_device *dev,
if (ret)
return ret;
*queue_id = req.drawctxt_id;
queue->msm_queue_id = req.drawctxt_id;
return 0;
}
static void
kgsl_submitqueue_close(struct tu_device *dev, uint32_t queue_id)
kgsl_submitqueue_close(struct tu_device *dev, struct tu_queue *queue)
{
struct kgsl_drawctxt_destroy req = {
.drawctxt_id = queue_id,
.drawctxt_id = queue->msm_queue_id,
};
safe_ioctl(dev->physical_device->local_fd, IOCTL_KGSL_DRAWCTXT_DESTROY, &req);

View file

@ -366,7 +366,7 @@ tu_queue_init(struct tu_device *device,
(type == TU_QUEUE_SPARSE) ? queue_submit_sparse : queue_submit;
queue->type = type;
int ret = tu_drm_submitqueue_new(device, type, priority, &queue->msm_queue_id);
int ret = tu_drm_submitqueue_new(device, queue);
if (ret)
return vk_startup_errorf(device->instance, VK_ERROR_INITIALIZATION_FAILED,
"submitqueue create failed");
@ -380,6 +380,6 @@ void
tu_queue_finish(struct tu_queue *queue)
{
vk_queue_finish(&queue->vk);
tu_drm_submitqueue_close(queue->device, queue->msm_queue_id);
tu_drm_submitqueue_close(queue->device, queue);
}