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 <jose.souza@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Acked-by: Rohan Garg <rohan.garg@intel.com>
Acked-by: Marcin Ślusarz <marcin.slusarz@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20428>
This commit is contained in:
José Roberto de Souza 2022-10-05 11:01:32 -07:00 committed by Marge Bot
parent 8084b412ca
commit 80c89c4606
7 changed files with 247 additions and 196 deletions

View file

@ -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"
@ -762,68 +763,6 @@ anv_physical_device_init_queue_families(struct anv_physical_device *pdevice)
pdevice->queue.family_count = family_count;
}
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)
{
@ -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;

View file

@ -30,7 +30,6 @@
#include <fcntl.h>
#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)

View file

@ -118,18 +118,6 @@ anv_gem_set_caching(struct anv_device *device, uint32_t gem_handle,
return 0;
}
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)

View file

@ -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);

View file

@ -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;
}

View file

@ -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);

View file

@ -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',