From fac31bb7bde52f8907a6a2c61466f053a753e2be Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Wed, 27 Sep 2023 16:23:07 -0500 Subject: [PATCH] nvk: Take GETPARAM_EXEC_PUSH_MAX into account Reviewed-by: Danilo Krummrich Part-of: --- src/nouveau/vulkan/nvk_queue_drm_nouveau.c | 9 ++++++--- src/nouveau/winsys/nouveau_device.c | 5 +++++ src/nouveau/winsys/nouveau_device.h | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/nouveau/vulkan/nvk_queue_drm_nouveau.c b/src/nouveau/vulkan/nvk_queue_drm_nouveau.c index 87780d119e9..05486cb9afd 100644 --- a/src/nouveau/vulkan/nvk_queue_drm_nouveau.c +++ b/src/nouveau/vulkan/nvk_queue_drm_nouveau.c @@ -22,10 +22,11 @@ #define NVK_PUSH_MAX_SYNCS 16 #define NVK_PUSH_MAX_BINDS 4096 -#define NVK_PUSH_MAX_PUSH NOUVEAU_GEM_MAX_PUSH +#define NVK_PUSH_MAX_PUSH 1024 struct push_builder { struct nvk_device *dev; + uint32_t max_push; struct drm_nouveau_sync req_wait[NVK_PUSH_MAX_SYNCS]; struct drm_nouveau_sync req_sig[NVK_PUSH_MAX_SYNCS]; struct drm_nouveau_exec_push req_push[NVK_PUSH_MAX_PUSH]; @@ -40,6 +41,8 @@ push_builder_init(struct nvk_device *dev, struct push_builder *pb, bool is_vmbind) { pb->dev = dev; + pb->max_push = is_vmbind ? 0 : + MIN2(NVK_PUSH_MAX_PUSH, dev->ws_dev->max_push); pb->req = (struct drm_nouveau_exec) { .channel = dev->ws_ctx->channel, .push_count = 0, @@ -211,7 +214,7 @@ push_add_push(struct push_builder *pb, uint64_t addr, uint32_t range, if (no_prefetch) flags |= DRM_NOUVEAU_EXEC_PUSH_NO_PREFETCH; - assert(pb->req.push_count < NVK_PUSH_MAX_PUSH); + assert(pb->req.push_count < pb->max_push); pb->req_push[pb->req.push_count++] = (struct drm_nouveau_exec_push) { .va = addr, .va_len = range, @@ -332,7 +335,7 @@ nvk_queue_submit_drm_nouveau(struct nvk_queue *queue, if (push->range == 0) continue; - if (pb.req.push_count >= NVK_PUSH_MAX_PUSH) { + if (pb.req.push_count >= pb.max_push) { VkResult result = push_submit(&pb, queue, sync); if (result != VK_SUCCESS) return result; diff --git a/src/nouveau/winsys/nouveau_device.c b/src/nouveau/winsys/nouveau_device.c index b4aafb81e38..81614be2efa 100644 --- a/src/nouveau/winsys/nouveau_device.c +++ b/src/nouveau/winsys/nouveau_device.c @@ -303,6 +303,11 @@ nouveau_ws_device_new(drmDevicePtr drm_device) device->fd = fd; + if (nouveau_ws_param(fd, NOUVEAU_GETPARAM_EXEC_PUSH_MAX, &value)) + device->max_push = NOUVEAU_GEM_MAX_PUSH; + else + device->max_push = value; + if (device->info.vram_size_B == 0) device->local_mem_domain = NOUVEAU_GEM_DOMAIN_GART; else diff --git a/src/nouveau/winsys/nouveau_device.h b/src/nouveau/winsys/nouveau_device.h index 5bec8154f1a..ff8eb54b0aa 100644 --- a/src/nouveau/winsys/nouveau_device.h +++ b/src/nouveau/winsys/nouveau_device.h @@ -41,6 +41,7 @@ struct nouveau_ws_device { struct nv_device_info info; + uint32_t max_push; uint32_t local_mem_domain; enum nvk_debug debug_flags;