From 0abd7fa58a89a315b9c551d271af6e92f13b4df2 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 5 Jul 2024 18:07:15 -0500 Subject: [PATCH] nvk/nvmkd: Plumb parent pointers through everywhere Part-of: --- .../vulkan/nvkmd/nouveau/nvkmd_nouveau.h | 2 -- .../vulkan/nvkmd/nouveau/nvkmd_nouveau_ctx.c | 2 ++ .../vulkan/nvkmd/nouveau/nvkmd_nouveau_dev.c | 1 + .../vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c | 1 + .../vulkan/nvkmd/nouveau/nvkmd_nouveau_va.c | 17 ++++++++++------- src/nouveau/vulkan/nvkmd/nvkmd.h | 5 +++++ 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau.h b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau.h index 0a0af67d9d6..514afa5bd04 100644 --- a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau.h +++ b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau.h @@ -86,8 +86,6 @@ VkResult nvkmd_nouveau_import_dma_buf(struct nvkmd_dev *dev, struct nvkmd_nouveau_va { struct nvkmd_va base; - - struct nvkmd_nouveau_dev *dev; }; NVKMD_DECL_SUBCLASS(va, nouveau); diff --git a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_ctx.c b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_ctx.c index 79f5243faaa..b416b9b13b6 100644 --- a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_ctx.c +++ b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_ctx.c @@ -54,6 +54,7 @@ nvkmd_nouveau_create_exec_ctx(struct nvkmd_dev *_dev, return vk_error(log_obj, VK_ERROR_OUT_OF_HOST_MEMORY); ctx->base.ops = &nvkmd_nouveau_exec_ctx_ops; + ctx->base.dev = &dev->base; ctx->ws_dev = dev->ws_dev; STATIC_ASSERT(NVKMD_ENGINE_COPY == (int)NOUVEAU_WS_ENGINE_COPY); @@ -275,6 +276,7 @@ nvkmd_nouveau_create_bind_ctx(struct nvkmd_dev *_dev, return vk_error(log_obj, VK_ERROR_OUT_OF_HOST_MEMORY); ctx->base.ops = &nvkmd_nouveau_bind_ctx_ops; + ctx->base.dev = &dev->base; ctx->ws_dev = dev->ws_dev; ctx->req = (struct drm_nouveau_vm_bind) { diff --git a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_dev.c b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_dev.c index e88d3f62462..ab3fa9b5cb3 100644 --- a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_dev.c +++ b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_dev.c @@ -22,6 +22,7 @@ nvkmd_nouveau_create_dev(struct nvkmd_pdev *_pdev, return vk_error(log_obj, VK_ERROR_OUT_OF_HOST_MEMORY); dev->base.ops = &nvkmd_nouveau_dev_ops; + dev->base.pdev = &pdev->base; drmDevicePtr drm_device = NULL; int ret = drmGetDeviceFromDevId(pdev->base.drm.render_dev, 0, &drm_device); diff --git a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c index 7618481928d..2ccabb100e7 100644 --- a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c +++ b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c @@ -38,6 +38,7 @@ create_mem_or_close_bo(struct nvkmd_nouveau_dev *dev, } mem->base.ops = &nvkmd_nouveau_mem_ops; + mem->base.dev = &dev->base; mem->base.refcnt = 1; mem->base.flags = flags; mem->base.size_B = size_B; diff --git a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_va.c b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_va.c index f5c58c4e999..07c7f0cf437 100644 --- a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_va.c +++ b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_va.c @@ -149,10 +149,10 @@ nvkmd_nouveau_alloc_va(struct nvkmd_dev *_dev, } va->base.ops = &nvkmd_nouveau_va_ops; + va->base.dev = &dev->base; va->base.flags = flags; va->base.pte_kind = pte_kind; va->base.size_B = size_B; - va->dev = dev; *va_out = &va->base; @@ -169,6 +169,7 @@ fail_alloc: static void nvkmd_nouveau_va_free(struct nvkmd_va *_va) { + struct nvkmd_nouveau_dev *dev = nvkmd_nouveau_dev(_va->dev); struct nvkmd_nouveau_va *va = nvkmd_nouveau_va(_va); VkResult result = VK_SUCCESS; @@ -180,7 +181,7 @@ nvkmd_nouveau_va_free(struct nvkmd_va *_va) .addr = va->base.addr, .range = va->base.size_B, }; - result |= vm_bind(va->dev, NULL, &bind); + result |= vm_bind(dev, NULL, &bind); } if (va->base.flags & NVKMD_VA_SPARSE) { @@ -190,12 +191,12 @@ nvkmd_nouveau_va_free(struct nvkmd_va *_va) .range = va->base.size_B, .flags = DRM_NOUVEAU_VM_BIND_SPARSE, }; - result |= vm_bind(va->dev, NULL, &bind); + result |= vm_bind(dev, NULL, &bind); } /* If unbinding fails, we leak the VA range */ if (result == VK_SUCCESS) - free_heap_addr(va->dev, va->base.flags, va->base.addr, va->base.size_B); + free_heap_addr(dev, va->base.flags, va->base.addr, va->base.size_B); FREE(va); } @@ -208,10 +209,11 @@ nvkmd_nouveau_va_bind_mem(struct nvkmd_va *_va, uint64_t mem_offset_B, uint64_t range_B) { + struct nvkmd_nouveau_dev *dev = nvkmd_nouveau_dev(_va->dev); struct nvkmd_nouveau_va *va = nvkmd_nouveau_va(_va); struct nvkmd_nouveau_mem *mem = nvkmd_nouveau_mem(_mem); - assert(mem->bo->dev == va->dev->ws_dev); + assert(_mem->dev == _va->dev); struct drm_nouveau_vm_bind_op bind = { .op = DRM_NOUVEAU_VM_BIND_OP_MAP, @@ -221,7 +223,7 @@ nvkmd_nouveau_va_bind_mem(struct nvkmd_va *_va, .bo_offset = mem_offset_B, .flags = va->base.pte_kind, }; - return vm_bind(va->dev, log_obj, &bind); + return vm_bind(dev, log_obj, &bind); } static VkResult @@ -230,6 +232,7 @@ nvkmd_nouveau_va_unbind(struct nvkmd_va *_va, uint64_t va_offset_B, uint64_t range_B) { + struct nvkmd_nouveau_dev *dev = nvkmd_nouveau_dev(_va->dev); struct nvkmd_nouveau_va *va = nvkmd_nouveau_va(_va); struct drm_nouveau_vm_bind_op bind = { @@ -237,7 +240,7 @@ nvkmd_nouveau_va_unbind(struct nvkmd_va *_va, .addr = va->base.addr + va_offset_B, .range = range_B, }; - return vm_bind(va->dev, log_obj, &bind); + return vm_bind(dev, log_obj, &bind); } const struct nvkmd_va_ops nvkmd_nouveau_va_ops = { diff --git a/src/nouveau/vulkan/nvkmd/nvkmd.h b/src/nouveau/vulkan/nvkmd/nvkmd.h index aa0605a2a5e..95a07b61a49 100644 --- a/src/nouveau/vulkan/nvkmd/nvkmd.h +++ b/src/nouveau/vulkan/nvkmd/nvkmd.h @@ -147,6 +147,7 @@ struct nvkmd_dev_ops { struct nvkmd_dev { const struct nvkmd_dev_ops *ops; + struct nvkmd_pdev *pdev; }; struct nvkmd_mem_ops { @@ -169,6 +170,7 @@ struct nvkmd_mem_ops { struct nvkmd_mem { const struct nvkmd_mem_ops *ops; + struct nvkmd_dev *dev; uint32_t refcnt; @@ -197,6 +199,8 @@ struct nvkmd_va_ops { struct nvkmd_va { const struct nvkmd_va_ops *ops; + struct nvkmd_dev *dev; + enum nvkmd_va_flags flags; uint8_t pte_kind; uint64_t addr; @@ -256,6 +260,7 @@ struct nvkmd_ctx_ops { struct nvkmd_ctx { const struct nvkmd_ctx_ops *ops; + struct nvkmd_dev *dev; }; /*