From: José Roberto de Souza Date: Wed, 5 Oct 2022 18:01:32 +0000 (-0700) Subject: anv: Start to move i915 specific code from anv_device to i915/anv_device X-Git-Tag: upstream/23.3.3~14484 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;ds=sidebyside;h=80c89c4606d356e957e47adac8d0bc14fe55c902;p=platform%2Fupstream%2Fmesa.git anv: Start to move i915 specific code from anv_device to i915/anv_device More code re-organization to separate i915_drm.h specific code from the rest. No behavior changes here. Signed-off-by: José Roberto de Souza Reviewed-by: Lionel Landwerlin Acked-by: Rohan Garg Acked-by: Marcin Ślusarz Part-of: --- diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 40d8949..228cb09 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -55,10 +55,11 @@ #include "vk_deferred_operation.h" #include "vk_drm_syncobj.h" #include "common/intel_aux_map.h" -#include "common/intel_defines.h" #include "common/intel_uuid.h" #include "perf/intel_perf.h" +#include "i915/anv_device.h" + #include "genxml/gen7_pack.h" #include "genxml/genX_bits.h" @@ -763,68 +764,6 @@ anv_physical_device_init_queue_families(struct anv_physical_device *pdevice) } static VkResult -anv_i915_physical_device_get_parameters(struct anv_physical_device *device) -{ - VkResult result = VK_SUCCESS; - int val, fd = device->local_fd; - - if (!intel_gem_get_param(fd, I915_PARAM_HAS_WAIT_TIMEOUT, &val) || !val) { - result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, - "kernel missing gem wait"); - return result; - } - - if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXECBUF2, &val) || !val) { - result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, - "kernel missing execbuf2"); - return result; - } - - if (!device->info.has_llc && - (!intel_gem_get_param(fd, I915_PARAM_MMAP_VERSION, &val) || val < 1)) { - result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, - "kernel missing wc mmap"); - return result; - } - - if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_SOFTPIN, &val) || !val) { - result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, - "kernel missing softpin"); - return result; - } - - if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_FENCE_ARRAY, &val) || !val) { - result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, - "kernel missing syncobj support"); - return result; - } - - if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_ASYNC, &val)) - device->has_exec_async = val; - if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_CAPTURE, &val)) - device->has_exec_capture = val; - - /* Start with medium; sorted low to high */ - const VkQueueGlobalPriorityKHR priorities[] = { - VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR, - VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR, - VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR, - VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR, - }; - device->max_context_priority = VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR; - for (unsigned i = 0; i < ARRAY_SIZE(priorities); i++) { - if (!anv_gem_has_context_priority(fd, priorities[i])) - break; - device->max_context_priority = priorities[i]; - } - - if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_TIMELINE_FENCES, &val)) - device->has_exec_timeline = val; - - return result; -} - -static VkResult anv_physical_device_get_parameters(struct anv_physical_device *device) { return anv_i915_physical_device_get_parameters(device); @@ -3174,86 +3113,6 @@ static struct intel_mapped_pinned_buffer_alloc aux_map_allocator = { static VkResult anv_device_check_status(struct vk_device *vk_device); -static VkResult -anv_device_setup_context(struct anv_device *device, - const VkDeviceCreateInfo *pCreateInfo, - const uint32_t num_queues) -{ - struct anv_physical_device *physical_device = device->physical; - VkResult result = VK_SUCCESS; - - if (device->physical->engine_info) { - /* The kernel API supports at most 64 engines */ - assert(num_queues <= 64); - enum intel_engine_class engine_classes[64]; - int engine_count = 0; - for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) { - const VkDeviceQueueCreateInfo *queueCreateInfo = - &pCreateInfo->pQueueCreateInfos[i]; - - assert(queueCreateInfo->queueFamilyIndex < - physical_device->queue.family_count); - struct anv_queue_family *queue_family = - &physical_device->queue.families[queueCreateInfo->queueFamilyIndex]; - - for (uint32_t j = 0; j < queueCreateInfo->queueCount; j++) - engine_classes[engine_count++] = queue_family->engine_class; - } - if (!intel_gem_create_context_engines(device->fd, - physical_device->engine_info, - engine_count, engine_classes, - (uint32_t *)&device->context_id)) - result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, - "kernel context creation failed"); - } else { - assert(num_queues == 1); - if (!intel_gem_create_context(device->fd, &device->context_id)) - result = vk_error(device, VK_ERROR_INITIALIZATION_FAILED); - } - - if (result != VK_SUCCESS) - return result; - - /* Here we tell the kernel not to attempt to recover our context but - * immediately (on the next batchbuffer submission) report that the - * context is lost, and we will do the recovery ourselves. In the case - * of Vulkan, recovery means throwing VK_ERROR_DEVICE_LOST and letting - * the client clean up the pieces. - */ - anv_gem_set_context_param(device->fd, device->context_id, - I915_CONTEXT_PARAM_RECOVERABLE, false); - - /* Check if client specified queue priority. */ - const VkDeviceQueueGlobalPriorityCreateInfoKHR *queue_priority = - vk_find_struct_const(pCreateInfo->pQueueCreateInfos[0].pNext, - DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR); - - VkQueueGlobalPriorityKHR priority = - queue_priority ? queue_priority->globalPriority : - VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR; - - /* As per spec, the driver implementation may deny requests to acquire - * a priority above the default priority (MEDIUM) if the caller does not - * have sufficient privileges. In this scenario VK_ERROR_NOT_PERMITTED_KHR - * is returned. - */ - if (physical_device->max_context_priority >= VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR) { - int err = anv_gem_set_context_param(device->fd, device->context_id, - I915_CONTEXT_PARAM_PRIORITY, - priority); - if (err != 0 && priority > VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR) { - result = vk_error(device, VK_ERROR_NOT_PERMITTED_KHR); - goto fail_context; - } - } - - return result; - -fail_context: - intel_gem_destroy_context(device->fd, device->context_id); - return result; -} - VkResult anv_CreateDevice( VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, @@ -3367,7 +3226,7 @@ VkResult anv_CreateDevice( for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) num_queues += pCreateInfo->pQueueCreateInfos[i].queueCount; - result = anv_device_setup_context(device, pCreateInfo, num_queues); + result = anv_i915_device_setup_context(device, pCreateInfo, num_queues); if (result != VK_SUCCESS) goto fail_fd; diff --git a/src/intel/vulkan/anv_gem.c b/src/intel/vulkan/anv_gem.c index 80b45e3..3321528 100644 --- a/src/intel/vulkan/anv_gem.c +++ b/src/intel/vulkan/anv_gem.c @@ -30,7 +30,6 @@ #include #include "anv_private.h" -#include "common/intel_defines.h" #include "common/intel_gem.h" /** @@ -279,42 +278,6 @@ anv_gem_set_tiling(struct anv_device *device, return ret; } -bool -anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority) -{ - return !anv_gem_set_context_param(fd, 0, I915_CONTEXT_PARAM_PRIORITY, - priority); -} - -static int -vk_priority_to_i915(VkQueueGlobalPriorityKHR priority) -{ - switch (priority) { - case VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR: - return INTEL_CONTEXT_LOW_PRIORITY; - case VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR: - return INTEL_CONTEXT_MEDIUM_PRIORITY; - case VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR: - return INTEL_CONTEXT_HIGH_PRIORITY; - case VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR: - return INTEL_CONTEXT_REALTIME_PRIORITY; - default: - unreachable("Invalid priority"); - } -} - -int -anv_gem_set_context_param(int fd, uint32_t context, uint32_t param, uint64_t value) -{ - if (param == I915_CONTEXT_PARAM_PRIORITY) - value = vk_priority_to_i915(value); - - int err = 0; - if (!intel_gem_set_context_param(fd, context, param, value)) - err = -errno; - return err; -} - int anv_gem_context_get_reset_stats(int fd, int context, uint32_t *active, uint32_t *pending) diff --git a/src/intel/vulkan/anv_gem_stubs.c b/src/intel/vulkan/anv_gem_stubs.c index 89e870f..b46cf0f 100644 --- a/src/intel/vulkan/anv_gem_stubs.c +++ b/src/intel/vulkan/anv_gem_stubs.c @@ -119,18 +119,6 @@ anv_gem_set_caching(struct anv_device *device, uint32_t gem_handle, } int -anv_gem_set_context_param(int fd, uint32_t context, uint32_t param, uint64_t value) -{ - unreachable("Unused"); -} - -bool -anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority) -{ - unreachable("Unused"); -} - -int anv_gem_context_get_reset_stats(int fd, int context, uint32_t *active, uint32_t *pending) { diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 5ddb205..6a1d267 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1352,9 +1352,6 @@ int anv_gem_execbuffer(struct anv_device *device, struct drm_i915_gem_execbuffer2 *execbuf); int anv_gem_set_tiling(struct anv_device *device, uint32_t gem_handle, uint32_t stride, uint32_t tiling); -bool anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority); -int anv_gem_set_context_param(int fd, uint32_t context, uint32_t param, - uint64_t value); int anv_gem_get_tiling(struct anv_device *device, uint32_t gem_handle); int anv_gem_context_get_reset_stats(int fd, int context, uint32_t *active, uint32_t *pending); diff --git a/src/intel/vulkan/i915/anv_device.c b/src/intel/vulkan/i915/anv_device.c new file mode 100644 index 0000000..12a992c --- /dev/null +++ b/src/intel/vulkan/i915/anv_device.c @@ -0,0 +1,206 @@ +/* + * Copyright © 2022 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "i915/anv_device.h" +#include "anv_private.h" + +#include "common/intel_defines.h" + +#include "drm-uapi/i915_drm.h" + +static int +vk_priority_to_i915(VkQueueGlobalPriorityKHR priority) +{ + switch (priority) { + case VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR: + return INTEL_CONTEXT_LOW_PRIORITY; + case VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR: + return INTEL_CONTEXT_MEDIUM_PRIORITY; + case VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR: + return INTEL_CONTEXT_HIGH_PRIORITY; + case VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR: + return INTEL_CONTEXT_REALTIME_PRIORITY; + default: + unreachable("Invalid priority"); + } +} + +static int +anv_gem_set_context_param(int fd, uint32_t context, uint32_t param, uint64_t value) +{ + if (param == I915_CONTEXT_PARAM_PRIORITY) + value = vk_priority_to_i915(value); + + int err = 0; + if (!intel_gem_set_context_param(fd, context, param, value)) + err = -errno; + return err; +} + +static bool +anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority) +{ + return !anv_gem_set_context_param(fd, 0, I915_CONTEXT_PARAM_PRIORITY, + priority); +} + +VkResult +anv_i915_physical_device_get_parameters(struct anv_physical_device *device) +{ + VkResult result = VK_SUCCESS; + int val, fd = device->local_fd; + + if (!intel_gem_get_param(fd, I915_PARAM_HAS_WAIT_TIMEOUT, &val) || !val) { + result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, + "kernel missing gem wait"); + return result; + } + + if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXECBUF2, &val) || !val) { + result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, + "kernel missing execbuf2"); + return result; + } + + if (!device->info.has_llc && + (!intel_gem_get_param(fd, I915_PARAM_MMAP_VERSION, &val) || val < 1)) { + result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, + "kernel missing wc mmap"); + return result; + } + + if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_SOFTPIN, &val) || !val) { + result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, + "kernel missing softpin"); + return result; + } + + if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_FENCE_ARRAY, &val) || !val) { + result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, + "kernel missing syncobj support"); + return result; + } + + if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_ASYNC, &val)) + device->has_exec_async = val; + if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_CAPTURE, &val)) + device->has_exec_capture = val; + + /* Start with medium; sorted low to high */ + const VkQueueGlobalPriorityKHR priorities[] = { + VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR, + VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR, + VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR, + VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR, + }; + device->max_context_priority = VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR; + for (unsigned i = 0; i < ARRAY_SIZE(priorities); i++) { + if (!anv_gem_has_context_priority(fd, priorities[i])) + break; + device->max_context_priority = priorities[i]; + } + + if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_TIMELINE_FENCES, &val)) + device->has_exec_timeline = val; + + return result; +} + +VkResult +anv_i915_device_setup_context(struct anv_device *device, + const VkDeviceCreateInfo *pCreateInfo, + const uint32_t num_queues) +{ + struct anv_physical_device *physical_device = device->physical; + VkResult result = VK_SUCCESS; + + if (device->physical->engine_info) { + /* The kernel API supports at most 64 engines */ + assert(num_queues <= 64); + enum intel_engine_class engine_classes[64]; + int engine_count = 0; + for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) { + const VkDeviceQueueCreateInfo *queueCreateInfo = + &pCreateInfo->pQueueCreateInfos[i]; + + assert(queueCreateInfo->queueFamilyIndex < + physical_device->queue.family_count); + struct anv_queue_family *queue_family = + &physical_device->queue.families[queueCreateInfo->queueFamilyIndex]; + + for (uint32_t j = 0; j < queueCreateInfo->queueCount; j++) + engine_classes[engine_count++] = queue_family->engine_class; + } + if (!intel_gem_create_context_engines(device->fd, + physical_device->engine_info, + engine_count, engine_classes, + (uint32_t *)&device->context_id)) + result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, + "kernel context creation failed"); + } else { + assert(num_queues == 1); + if (!intel_gem_create_context(device->fd, &device->context_id)) + result = vk_error(device, VK_ERROR_INITIALIZATION_FAILED); + } + + if (result != VK_SUCCESS) + return result; + + /* Here we tell the kernel not to attempt to recover our context but + * immediately (on the next batchbuffer submission) report that the + * context is lost, and we will do the recovery ourselves. In the case + * of Vulkan, recovery means throwing VK_ERROR_DEVICE_LOST and letting + * the client clean up the pieces. + */ + anv_gem_set_context_param(device->fd, device->context_id, + I915_CONTEXT_PARAM_RECOVERABLE, false); + + /* Check if client specified queue priority. */ + const VkDeviceQueueGlobalPriorityCreateInfoKHR *queue_priority = + vk_find_struct_const(pCreateInfo->pQueueCreateInfos[0].pNext, + DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR); + + VkQueueGlobalPriorityKHR priority = + queue_priority ? queue_priority->globalPriority : + VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR; + + /* As per spec, the driver implementation may deny requests to acquire + * a priority above the default priority (MEDIUM) if the caller does not + * have sufficient privileges. In this scenario VK_ERROR_NOT_PERMITTED_KHR + * is returned. + */ + if (physical_device->max_context_priority >= VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR) { + int err = anv_gem_set_context_param(device->fd, device->context_id, + I915_CONTEXT_PARAM_PRIORITY, + priority); + if (err != 0 && priority > VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR) { + result = vk_error(device, VK_ERROR_NOT_PERMITTED_KHR); + goto fail_context; + } + } + + return result; + +fail_context: + intel_gem_destroy_context(device->fd, device->context_id); + return result; +} diff --git a/src/intel/vulkan/i915/anv_device.h b/src/intel/vulkan/i915/anv_device.h new file mode 100644 index 0000000..aed187e --- /dev/null +++ b/src/intel/vulkan/i915/anv_device.h @@ -0,0 +1,36 @@ +/* + * Copyright © 2022 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include "vulkan/vulkan_core.h" + +struct anv_device; +struct anv_physical_device; + +VkResult +anv_i915_physical_device_get_parameters(struct anv_physical_device *device); + +VkResult +anv_i915_device_setup_context(struct anv_device *device, + const VkDeviceCreateInfo *pCreateInfo, + const uint32_t num_queues); diff --git a/src/intel/vulkan/meson.build b/src/intel/vulkan/meson.build index b0c217b..54b09fd 100644 --- a/src/intel/vulkan/meson.build +++ b/src/intel/vulkan/meson.build @@ -132,6 +132,8 @@ foreach g : [['90', ['gfx8_cmd_buffer.c']], endforeach libanv_files = files( + 'i915/anv_device.c', + 'i915/anv_device.h', 'layers/anv_doom64.c', 'layers/anv_hitman3.c', 'anv_allocator.c',