From 1be7e2e89de0741e139ba48dd7f3c4639ae8e34f Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 15 Nov 2024 15:46:53 -0800 Subject: [PATCH] panvk: implement check_status on v10+ vk_common_*Wait* calls vk_device_check_status to detect device lost. This allows device lost to be reported more timely. Signed-off-by: Chia-I Wu Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/csf/panvk_queue.h | 2 ++ src/panfrost/vulkan/csf/panvk_vX_device.c | 29 +++++++++++++++++++++++ src/panfrost/vulkan/csf/panvk_vX_queue.c | 20 ++++++++++++++++ src/panfrost/vulkan/meson.build | 1 + src/panfrost/vulkan/panvk_device.h | 5 ++++ src/panfrost/vulkan/panvk_vX_device.c | 3 +++ 6 files changed, 60 insertions(+) create mode 100644 src/panfrost/vulkan/csf/panvk_vX_device.c diff --git a/src/panfrost/vulkan/csf/panvk_queue.h b/src/panfrost/vulkan/csf/panvk_queue.h index e5df67337c4..3ceec8bb58d 100644 --- a/src/panfrost/vulkan/csf/panvk_queue.h +++ b/src/panfrost/vulkan/csf/panvk_queue.h @@ -69,4 +69,6 @@ VkResult panvk_per_arch(queue_init)(struct panvk_device *device, struct panvk_queue *queue, int idx, const VkDeviceQueueCreateInfo *create_info); +VkResult panvk_per_arch(queue_check_status)(struct panvk_queue *queue); + #endif diff --git a/src/panfrost/vulkan/csf/panvk_vX_device.c b/src/panfrost/vulkan/csf/panvk_vX_device.c new file mode 100644 index 00000000000..2422d90e86d --- /dev/null +++ b/src/panfrost/vulkan/csf/panvk_vX_device.c @@ -0,0 +1,29 @@ +/* + * Copyright © 2024 Collabora Ltd. + * SPDX-License-Identifier: MIT + */ + +#include "panvk_device.h" +#include "panvk_queue.h" + +VkResult +panvk_per_arch(device_check_status)(struct vk_device *vk_dev) +{ + struct panvk_device *dev = to_panvk_device(vk_dev); + VkResult result = VK_SUCCESS; + + for (uint32_t qfi = 0; qfi < PANVK_MAX_QUEUE_FAMILIES; qfi++) { + for (uint32_t q = 0; q < dev->queue_count[qfi]; q++) { + struct panvk_queue *queue = &dev->queues[qfi][q]; + if (panvk_per_arch(queue_check_status)(queue) != VK_SUCCESS) + result = VK_ERROR_DEVICE_LOST; + } + } + + if (pan_kmod_vm_query_state(dev->kmod.vm) != PAN_KMOD_VM_USABLE) { + vk_device_set_lost(&dev->vk, "vm state: not usable"); + result = VK_ERROR_DEVICE_LOST; + } + + return result; +} diff --git a/src/panfrost/vulkan/csf/panvk_vX_queue.c b/src/panfrost/vulkan/csf/panvk_vX_queue.c index 24a286eccb2..709685dc97b 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_queue.c +++ b/src/panfrost/vulkan/csf/panvk_vX_queue.c @@ -779,3 +779,23 @@ panvk_per_arch(queue_finish)(struct panvk_queue *queue) drmSyncobjDestroy(dev->vk.drm_fd, queue->syncobj_handle); vk_queue_finish(&queue->vk); } + +VkResult +panvk_per_arch(queue_check_status)(struct panvk_queue *queue) +{ + struct panvk_device *dev = to_panvk_device(queue->vk.base.device); + struct drm_panthor_group_get_state state = { + .group_handle = queue->group_handle, + }; + + int ret = + drmIoctl(dev->vk.drm_fd, DRM_IOCTL_PANTHOR_GROUP_GET_STATE, &state); + if (!ret && !state.state) + return VK_SUCCESS; + + vk_queue_set_lost(&queue->vk, + "group state: err=%d, state=0x%x, fatal_queues=0x%x", ret, + state.state, state.fatal_queues); + + return VK_ERROR_DEVICE_LOST; +} diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index c7bbf53c570..b2e636cddf1 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -65,6 +65,7 @@ csf_files = [ 'csf/panvk_vX_cmd_draw.c', 'csf/panvk_vX_cmd_event.c', 'csf/panvk_vX_cmd_query.c', + 'csf/panvk_vX_device.c', 'csf/panvk_vX_event.c', 'csf/panvk_vX_queue.c', ] diff --git a/src/panfrost/vulkan/panvk_device.h b/src/panfrost/vulkan/panvk_device.h index 052e62578d5..9d1f83a3fa2 100644 --- a/src/panfrost/vulkan/panvk_device.h +++ b/src/panfrost/vulkan/panvk_device.h @@ -90,6 +90,11 @@ panvk_per_arch(create_device)(struct panvk_physical_device *physical_device, void panvk_per_arch(destroy_device)(struct panvk_device *device, const VkAllocationCallbacks *pAllocator); + +#if PAN_ARCH >= 10 +VkResult panvk_per_arch(device_check_status)(struct vk_device *vk_dev); +#endif + #endif #endif diff --git a/src/panfrost/vulkan/panvk_vX_device.c b/src/panfrost/vulkan/panvk_vX_device.c index a6747f67eb5..ba3e8fe7acb 100644 --- a/src/panfrost/vulkan/panvk_vX_device.c +++ b/src/panfrost/vulkan/panvk_vX_device.c @@ -250,6 +250,9 @@ panvk_per_arch(create_device)(struct panvk_physical_device *physical_device, device->vk.command_dispatch_table = &device->cmd_dispatch; device->vk.command_buffer_ops = &panvk_per_arch(cmd_buffer_ops); device->vk.shader_ops = &panvk_per_arch(device_shader_ops); +#if PAN_ARCH >= 10 + device->vk.check_status = panvk_per_arch(device_check_status); +#endif device->kmod.allocator = (struct pan_kmod_allocator){ .zalloc = panvk_kmod_zalloc,