From 854640ea261cf4479dafa81e0f4e056a837d6bc1 Mon Sep 17 00:00:00 2001 From: Mark Collins Date: Thu, 25 Apr 2024 10:18:59 +0000 Subject: [PATCH] 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 Part-of: --- src/freedreno/drm/virtio/virtio_bo.c | 2 +- src/virtio/vdrm/vdrm.h | 6 +++--- src/virtio/vdrm/vdrm_virtgpu.c | 12 +++++++----- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/freedreno/drm/virtio/virtio_bo.c b/src/freedreno/drm/virtio/virtio_bo.c index f892473977f..11e7f29c4e8 100644 --- a/src/freedreno/drm/virtio/virtio_bo.c +++ b/src/freedreno/drm/virtio/virtio_bo.c @@ -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 diff --git a/src/virtio/vdrm/vdrm.h b/src/virtio/vdrm/vdrm.h index 7bcdaad457f..2b08780b1f0 100644 --- a/src/virtio/vdrm/vdrm.h +++ b/src/virtio/vdrm/vdrm.h @@ -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 diff --git a/src/virtio/vdrm/vdrm_virtgpu.c b/src/virtio/vdrm/vdrm_virtgpu.c index 8f12a2e9951..f5310ab9fb5 100644 --- a/src/virtio/vdrm/vdrm_virtgpu.c +++ b/src/virtio/vdrm/vdrm_virtgpu.c @@ -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;