vdrm: Add fixed VA parameter for mapping memory

This is necessary for implementing VK_EXT_map_memory_placed in Turnip.

Signed-off-by: Mark Collins <mark@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28928>
This commit is contained in:
Mark Collins 2024-04-25 10:18:59 +00:00
parent 603982ea80
commit 854640ea26
3 changed files with 11 additions and 9 deletions

View file

@ -44,7 +44,7 @@ virtio_bo_mmap(struct fd_bo *bo)
});
}
return vdrm_bo_map(vdrm, bo->handle, bo->size);
return vdrm_bo_map(vdrm, bo->handle, bo->size, NULL);
}
static int

View file

@ -44,7 +44,7 @@ struct vdrm_device_funcs {
uint32_t (*bo_create)(struct vdrm_device *vdev, size_t size, uint32_t blob_flags,
uint64_t blob_id, struct vdrm_ccmd_req *req);
int (*bo_wait)(struct vdrm_device *vdev, uint32_t handle);
void *(*bo_map)(struct vdrm_device *vdev, uint32_t handle, size_t size);
void *(*bo_map)(struct vdrm_device *vdev, uint32_t handle, size_t size, void *placed_addr);
int (*bo_export_dmabuf)(struct vdrm_device *vdev, uint32_t handle);
void (*bo_close)(struct vdrm_device *vdev, uint32_t handle);
@ -134,9 +134,9 @@ vdrm_bo_wait(struct vdrm_device *vdev, uint32_t handle)
}
static inline void *
vdrm_bo_map(struct vdrm_device *vdev, uint32_t handle, size_t size)
vdrm_bo_map(struct vdrm_device *vdev, uint32_t handle, size_t size, void *placed_addr)
{
return vdev->funcs->bo_map(vdev, handle, size);
return vdev->funcs->bo_map(vdev, handle, size, placed_addr);
}
static inline int

View file

@ -178,7 +178,7 @@ virtgpu_bo_create(struct vdrm_device *vdev, size_t size, uint32_t blob_flags,
}
static int
map_handle(int fd, uint32_t handle, size_t size, void **map)
map_handle(int fd, uint32_t handle, size_t size, void **map, void *placed_addr)
{
struct drm_virtgpu_map req = {
.handle = handle,
@ -191,7 +191,9 @@ map_handle(int fd, uint32_t handle, size_t size, void **map)
return ret;
}
*map = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, req.offset);
*map = mmap(placed_addr, size, PROT_READ | PROT_WRITE,
MAP_SHARED | (placed_addr != NULL ? MAP_FIXED : 0),
fd, req.offset);
if (*map == MAP_FAILED) {
mesa_loge("failed to map handle: %s", strerror(errno));
return -1;
@ -218,13 +220,13 @@ virtgpu_bo_wait(struct vdrm_device *vdev, uint32_t handle)
}
static void *
virtgpu_bo_map(struct vdrm_device *vdev, uint32_t handle, size_t size)
virtgpu_bo_map(struct vdrm_device *vdev, uint32_t handle, size_t size, void *placed_addr)
{
struct virtgpu_device *vgdev = to_virtgpu_device(vdev);
void *map;
int ret;
ret = map_handle(vgdev->fd, handle, size, &map);
ret = map_handle(vgdev->fd, handle, size, &map, placed_addr);
if (ret)
return NULL;
@ -334,7 +336,7 @@ init_shmem(struct virtgpu_device *vgdev)
vgdev->shmem_handle = args.bo_handle;
ret = map_handle(vgdev->fd, vgdev->shmem_handle, args.size, (void **)&vdev->shmem);
ret = map_handle(vgdev->fd, vgdev->shmem_handle, args.size, (void **)&vdev->shmem, NULL);
if (ret) {
gem_close(vgdev, vgdev->shmem_handle);
vgdev->shmem_handle = 0;