nouveau/winsys: Add a fixed_addr to nouveau_ws_bo_map

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27599>
This commit is contained in:
Faith Ekstrand 2024-02-13 11:49:06 -06:00 committed by Marge Bot
parent be9685e4e7
commit 4092685057
4 changed files with 17 additions and 8 deletions

View file

@ -206,7 +206,7 @@ nvk_AllocateMemory(VkDevice device,
if (dev->ws_dev->debug_flags & NVK_DEBUG_ZERO_MEMORY) {
if (type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
void *map = nouveau_ws_bo_map(mem->bo, NOUVEAU_WS_BO_RDWR);
void *map = nouveau_ws_bo_map(mem->bo, NOUVEAU_WS_BO_RDWR, NULL);
if (map == NULL) {
result = vk_errorf(dev, VK_ERROR_OUT_OF_HOST_MEMORY,
"Memory map failed");
@ -307,7 +307,7 @@ nvk_MapMemory2KHR(VkDevice device,
"Memory object already mapped.");
}
mem->map = nouveau_ws_bo_map(mem->bo, NOUVEAU_WS_BO_RDWR);
mem->map = nouveau_ws_bo_map(mem->bo, NOUVEAU_WS_BO_RDWR, NULL);
if (mem->map == NULL) {
return vk_errorf(dev, VK_ERROR_MEMORY_MAP_FAILED,
"Memory object couldn't be mapped.");

View file

@ -111,7 +111,7 @@ nvk_heap_grow_locked(struct nvk_device *dev, struct nvk_heap *heap)
void *map = NULL;
if (heap->map_flags) {
map = nouveau_ws_bo_map(bo, heap->map_flags);
map = nouveau_ws_bo_map(bo, heap->map_flags, NULL);
if (map == NULL) {
nouveau_ws_bo_destroy(bo);
return vk_errorf(dev, VK_ERROR_OUT_OF_HOST_MEMORY,

View file

@ -163,7 +163,7 @@ nouveau_ws_bo_new_mapped(struct nouveau_ws_device *dev,
if (!bo)
return NULL;
void *map = nouveau_ws_bo_map(bo, map_flags);
void *map = nouveau_ws_bo_map(bo, map_flags, NULL);
if (map == NULL) {
nouveau_ws_bo_destroy(bo);
return NULL;
@ -359,16 +359,23 @@ nouveau_ws_bo_destroy(struct nouveau_ws_bo *bo)
}
void *
nouveau_ws_bo_map(struct nouveau_ws_bo *bo, enum nouveau_ws_bo_map_flags flags)
nouveau_ws_bo_map(struct nouveau_ws_bo *bo,
enum nouveau_ws_bo_map_flags flags,
void *fixed_addr)
{
size_t prot = 0;
int prot = 0, map_flags = 0;
if (flags & NOUVEAU_WS_BO_RD)
prot |= PROT_READ;
if (flags & NOUVEAU_WS_BO_WR)
prot |= PROT_WRITE;
void *res = mmap(NULL, bo->size, prot, MAP_SHARED, bo->dev->fd, bo->map_handle);
map_flags = MAP_SHARED;
if (fixed_addr != NULL)
map_flags |= MAP_FIXED;
void *res = mmap(fixed_addr, bo->size, prot, map_flags,
bo->dev->fd, bo->map_handle);
if (res == MAP_FAILED)
return NULL;

View file

@ -71,7 +71,9 @@ struct nouveau_ws_bo *nouveau_ws_bo_new_mapped(struct nouveau_ws_device *,
struct nouveau_ws_bo *nouveau_ws_bo_from_dma_buf(struct nouveau_ws_device *,
int fd);
void nouveau_ws_bo_destroy(struct nouveau_ws_bo *);
void *nouveau_ws_bo_map(struct nouveau_ws_bo *, enum nouveau_ws_bo_map_flags);
void *nouveau_ws_bo_map(struct nouveau_ws_bo *,
enum nouveau_ws_bo_map_flags,
void *fixed_addr);
bool nouveau_ws_bo_wait(struct nouveau_ws_bo *, enum nouveau_ws_bo_map_flags flags);
int nouveau_ws_bo_dma_buf(struct nouveau_ws_bo *, int *fd);