From 88b92dc3d3774de20d42aa6e27aaf4704093b063 Mon Sep 17 00:00:00 2001 From: Mohamed Ahmed Date: Tue, 14 Oct 2025 14:39:43 +0300 Subject: [PATCH] nouveau/winsys: Retrieve and store the PTE kind in the nouveau_ws_bo Previously, for imports we wouldn't carry over the PTE kind with the import, which worked fine up till now. However, compression depends on the PTE kind being correct otherwise there will be a mismatch between both sides. The GEM info object we get from the kernel already has the PTE kind embedded in the tile flags object, so all we have to do is retrieve it and store in the bo object, and then the lower layers can retrieve the kind from the bo directly. Reviewed-by: Mel Henning Part-of: --- src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c | 7 +++---- src/nouveau/winsys/nouveau_bo.c | 2 ++ src/nouveau/winsys/nouveau_bo.h | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c index e17600ce70e..3046da1d560 100644 --- a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c +++ b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c @@ -28,10 +28,11 @@ create_mem_or_close_bo(struct nvkmd_nouveau_dev *dev, enum nvkmd_mem_flags mem_flags, struct nouveau_ws_bo *bo, enum nvkmd_va_flags va_flags, - uint8_t pte_kind, uint64_t va_align_B, + uint64_t va_align_B, struct nvkmd_mem **mem_out) { const uint64_t size_B = bo->size; + const uint8_t pte_kind = bo->pte_kind; VkResult result; struct nvkmd_nouveau_mem *mem = CALLOC_STRUCT(nvkmd_nouveau_mem); @@ -162,8 +163,7 @@ nvkmd_nouveau_alloc_tiled_mem(struct nvkmd_dev *_dev, va_flags |= NVKMD_VA_GART; return create_mem_or_close_bo(dev, log_obj, flags, bo, - va_flags, pte_kind, va_align_B, - mem_out); + va_flags, va_align_B, mem_out); } VkResult @@ -197,7 +197,6 @@ nvkmd_nouveau_import_dma_buf(struct nvkmd_dev *_dev, return create_mem_or_close_bo(dev, log_obj, flags, bo, 0 /* va_flags */, - 0 /* pte_kind */, 0 /* va_align_B */, mem_out); } diff --git a/src/nouveau/winsys/nouveau_bo.c b/src/nouveau/winsys/nouveau_bo.c index aa3318cf33d..2859b751071 100644 --- a/src/nouveau/winsys/nouveau_bo.c +++ b/src/nouveau/winsys/nouveau_bo.c @@ -134,6 +134,7 @@ nouveau_ws_bo_new_tiled_locked(struct nouveau_ws_device *dev, bo->dev = dev; bo->flags = flags; bo->refcnt = 1; + bo->pte_kind = pte_kind; _mesa_hash_table_insert(dev->bos, (void *)(uintptr_t)bo->handle, bo); @@ -210,6 +211,7 @@ nouveau_ws_bo_from_dma_buf_locked(struct nouveau_ws_device *dev, int fd) bo->dev = dev; bo->flags = flags; bo->refcnt = 1; + bo->pte_kind = (info.tile_flags & 0x0000ff00) >> 8; _mesa_hash_table_insert(dev->bos, (void *)(uintptr_t)handle, bo); diff --git a/src/nouveau/winsys/nouveau_bo.h b/src/nouveau/winsys/nouveau_bo.h index d5d7de349e3..cbc674b172b 100644 --- a/src/nouveau/winsys/nouveau_bo.h +++ b/src/nouveau/winsys/nouveau_bo.h @@ -40,6 +40,7 @@ struct nouveau_ws_bo { uint32_t handle; enum nouveau_ws_bo_flags flags; atomic_uint_fast32_t refcnt; + uint8_t pte_kind; }; void nouveau_ws_bo_bind_vma(struct nouveau_ws_device *dev,