anv: Add gem_create_userptr() to KMD backend
Xe support of userptr will be implemented in the next patch, this is just moving the i915 and stub functions to KMD backend. Signed-off-by: José Roberto de Souza <jose.souza@intel.com> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23787>
This commit is contained in:
committed by
Marge Bot
parent
46958bcb74
commit
7e7ab39424
@@ -1634,7 +1634,7 @@ anv_device_import_bo_from_host_ptr(struct anv_device *device,
|
||||
anv_bo_alloc_flags_to_bo_flags(device, alloc_flags);
|
||||
assert(bo_flags == (bo_flags & ANV_BO_CACHE_SUPPORTED_FLAGS));
|
||||
|
||||
uint32_t gem_handle = anv_gem_userptr(device, host_ptr, size);
|
||||
uint32_t gem_handle = device->kmd_backend->gem_create_userptr(device, host_ptr, size);
|
||||
if (!gem_handle)
|
||||
return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE);
|
||||
|
||||
|
||||
@@ -55,25 +55,6 @@ anv_gem_munmap(struct anv_device *device, void *p, uint64_t size)
|
||||
munmap(p, size);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
anv_gem_userptr(struct anv_device *device, void *mem, size_t size)
|
||||
{
|
||||
struct drm_i915_gem_userptr userptr = {
|
||||
.user_ptr = (__u64)((unsigned long) mem),
|
||||
.user_size = size,
|
||||
.flags = 0,
|
||||
};
|
||||
|
||||
if (device->physical->info.has_userptr_probe)
|
||||
userptr.flags |= I915_USERPTR_PROBE;
|
||||
|
||||
int ret = intel_ioctl(device->fd, DRM_IOCTL_I915_GEM_USERPTR, &userptr);
|
||||
if (ret == -1)
|
||||
return 0;
|
||||
|
||||
return userptr.handle;
|
||||
}
|
||||
|
||||
int
|
||||
anv_gem_set_caching(struct anv_device *device,
|
||||
uint32_t gem_handle, uint32_t caching)
|
||||
|
||||
@@ -102,8 +102,8 @@ anv_gem_munmap(struct anv_device *device, void *p, uint64_t size)
|
||||
munmap(p, size);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
anv_gem_userptr(struct anv_device *device, void *mem, size_t size)
|
||||
static uint32_t
|
||||
stub_gem_create_userptr(struct anv_device *device, void *mem, uint64_t size)
|
||||
{
|
||||
int fd = os_create_anonymous_file(size, "fake bo");
|
||||
if (fd == -1)
|
||||
@@ -168,6 +168,7 @@ const struct anv_kmd_backend *anv_stub_kmd_backend_get(void)
|
||||
{
|
||||
static const struct anv_kmd_backend stub_backend = {
|
||||
.gem_create = stub_gem_create,
|
||||
.gem_create_userptr = stub_gem_create_userptr,
|
||||
.gem_close = stub_gem_close,
|
||||
.gem_mmap = stub_gem_mmap,
|
||||
.gem_vm_bind = stub_gem_vm_bind,
|
||||
|
||||
@@ -49,6 +49,7 @@ struct anv_kmd_backend {
|
||||
uint16_t num_regions, uint64_t size,
|
||||
enum anv_bo_alloc_flags alloc_flags,
|
||||
uint64_t *actual_size);
|
||||
uint32_t (*gem_create_userptr)(struct anv_device *device, void *mem, uint64_t size);
|
||||
void (*gem_close)(struct anv_device *device, uint32_t handle);
|
||||
/* Returns MAP_FAILED on error */
|
||||
void *(*gem_mmap)(struct anv_device *device, struct anv_bo *bo,
|
||||
|
||||
@@ -1403,7 +1403,6 @@ void *
|
||||
anv_gem_mmap(struct anv_device *device, struct anv_bo *bo, uint64_t offset,
|
||||
uint64_t size, VkMemoryPropertyFlags property_flags);
|
||||
void anv_gem_munmap(struct anv_device *device, void *p, uint64_t size);
|
||||
uint32_t anv_gem_userptr(struct anv_device *device, void *mem, size_t size);
|
||||
int anv_gem_wait(struct anv_device *device, uint32_t gem_handle, int64_t *timeout_ns);
|
||||
int anv_gem_set_tiling(struct anv_device *device, uint32_t gem_handle,
|
||||
uint32_t stride, uint32_t tiling);
|
||||
|
||||
@@ -179,11 +179,31 @@ i915_gem_vm_unbind(struct anv_device *device, struct anv_bo *bo)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
i915_gem_create_userptr(struct anv_device *device, void *mem, uint64_t size)
|
||||
{
|
||||
struct drm_i915_gem_userptr userptr = {
|
||||
.user_ptr = (__u64)((unsigned long) mem),
|
||||
.user_size = size,
|
||||
.flags = 0,
|
||||
};
|
||||
|
||||
if (device->physical->info.has_userptr_probe)
|
||||
userptr.flags |= I915_USERPTR_PROBE;
|
||||
|
||||
int ret = intel_ioctl(device->fd, DRM_IOCTL_I915_GEM_USERPTR, &userptr);
|
||||
if (ret == -1)
|
||||
return 0;
|
||||
|
||||
return userptr.handle;
|
||||
}
|
||||
|
||||
const struct anv_kmd_backend *
|
||||
anv_i915_kmd_backend_get(void)
|
||||
{
|
||||
static const struct anv_kmd_backend i915_backend = {
|
||||
.gem_create = i915_gem_create,
|
||||
.gem_create_userptr = i915_gem_create_userptr,
|
||||
.gem_close = i915_gem_close,
|
||||
.gem_mmap = i915_gem_mmap,
|
||||
.gem_vm_bind = i915_gem_vm_bind,
|
||||
|
||||
@@ -135,11 +135,18 @@ static int xe_gem_vm_unbind(struct anv_device *device, struct anv_bo *bo)
|
||||
return xe_gem_vm_bind_op(device, bo, XE_VM_BIND_OP_UNMAP);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
xe_gem_create_userptr(struct anv_device *device, void *mem, uint64_t size)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct anv_kmd_backend *
|
||||
anv_xe_kmd_backend_get(void)
|
||||
{
|
||||
static const struct anv_kmd_backend xe_backend = {
|
||||
.gem_create = xe_gem_create,
|
||||
.gem_create_userptr = xe_gem_create_userptr,
|
||||
.gem_close = xe_gem_close,
|
||||
.gem_mmap = xe_gem_mmap,
|
||||
.gem_vm_bind = xe_gem_vm_bind,
|
||||
|
||||
Reference in New Issue
Block a user