diff --git a/src/gallium/drivers/panfrost/pan_csf.c b/src/gallium/drivers/panfrost/pan_csf.c index 45974c63590..074c522f4d4 100644 --- a/src/gallium/drivers/panfrost/pan_csf.c +++ b/src/gallium/drivers/panfrost/pan_csf.c @@ -98,6 +98,8 @@ csf_oom_handler_init(struct panfrost_context *ctx) { struct panfrost_bo *cs_bo = NULL, *reg_save_bo = NULL; struct panfrost_device *dev = pan_device(ctx->base.screen); + const struct drm_panthor_csif_info *csif_info = + panthor_kmod_get_csif_props(dev->kmod.dev); cs_bo = panfrost_bo_create(dev, 4096, 0, "Temporary CS buffer"); @@ -114,8 +116,8 @@ csf_oom_handler_init(struct panfrost_context *ctx) }; struct cs_builder b; const struct cs_builder_conf conf = { - .nr_registers = 96, - .nr_kernel_registers = 4, + .nr_registers = csif_info->cs_reg_count, + .nr_kernel_registers = MAX2(csif_info->unpreserved_cs_reg_count, 4), .reg_perm = (dev->debug & PAN_DBG_CS) ? csf_reg_perm_cb : NULL, }; cs_builder_init(&b, &conf, queue); @@ -251,9 +253,12 @@ GENX(csf_init_batch)(struct panfrost_batch *batch) if (!queue.gpu) return -1; + const struct drm_panthor_csif_info *csif_info = + panthor_kmod_get_csif_props(dev->kmod.dev); + const struct cs_builder_conf conf = { - .nr_registers = 96, - .nr_kernel_registers = 4, + .nr_registers = csif_info->cs_reg_count, + .nr_kernel_registers = MAX2(csif_info->unpreserved_cs_reg_count, 4), .alloc_buffer = csf_alloc_cs_buffer, .cookie = batch, .ls_tracker = batch->csf.cs.ls_tracker, @@ -1473,8 +1478,11 @@ GENX(csf_init_context)(struct panfrost_context *ctx) .gpu = cs_bo->ptr.gpu, .capacity = panfrost_bo_size(cs_bo) / sizeof(uint64_t), }; + const struct drm_panthor_csif_info *csif_info = + panthor_kmod_get_csif_props(dev->kmod.dev); const struct cs_builder_conf bconf = { - .nr_registers = 96, + .nr_registers = csif_info->cs_reg_count, + .nr_kernel_registers = MAX2(csif_info->unpreserved_cs_reg_count, 4), .nr_kernel_registers = 4, }; struct cs_builder b; diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c index 2dfa71d1634..8b89ef7731e 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c @@ -26,6 +26,8 @@ * DEALINGS IN THE SOFTWARE. */ +#include "drm-uapi/panthor_drm.h" + #include "genxml/gen_macros.h" #include "panvk_buffer.h" @@ -683,14 +685,17 @@ init_cs_builders(struct panvk_cmd_buffer *cmdbuf) [PANVK_SUBQUEUE_COMPUTE] = panvk_cs_compute_reg_perm, }; + const struct drm_panthor_csif_info *csif_info = + panthor_kmod_get_csif_props(dev->kmod.dev); + for (uint32_t i = 0; i < ARRAY_SIZE(cmdbuf->state.cs); i++) { struct cs_builder *b = &cmdbuf->state.cs[i].builder; /* Lazy allocation of the root CS. */ struct cs_buffer root_cs = {0}; struct cs_builder_conf conf = { - .nr_registers = 96, - .nr_kernel_registers = 4, + .nr_registers = csif_info->cs_reg_count, + .nr_kernel_registers = MAX2(csif_info->unpreserved_cs_reg_count, 4), .alloc_buffer = alloc_cs_buffer, .cookie = cmdbuf, }; diff --git a/src/panfrost/vulkan/csf/panvk_vX_exception_handler.c b/src/panfrost/vulkan/csf/panvk_vX_exception_handler.c index 7c5c1e47b7d..3fca1a85c5a 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_exception_handler.c +++ b/src/panfrost/vulkan/csf/panvk_vX_exception_handler.c @@ -4,6 +4,7 @@ * * SPDX-License-Identifier: MIT */ +#include "drm-uapi/panthor_drm.h" #include "panvk_cmd_buffer.h" #include "panvk_device.h" @@ -24,17 +25,20 @@ tiler_oom_reg_perm_cb(struct cs_builder *b, unsigned reg) } static size_t -generate_tiler_oom_handler(struct cs_buffer handler_mem, bool has_zs_ext, +generate_tiler_oom_handler(struct panvk_device *dev, + struct cs_buffer handler_mem, bool has_zs_ext, uint32_t rt_count, bool tracing_enabled, uint32_t *dump_region_size) { assert(rt_count >= 1 && rt_count <= MAX_RTS); uint32_t fbd_size = get_fbd_size(has_zs_ext, rt_count); + const struct drm_panthor_csif_info *csif_info = + panthor_kmod_get_csif_props(dev->kmod.dev); struct cs_builder b; struct cs_builder_conf conf = { - .nr_registers = 96, - .nr_kernel_registers = 4, + .nr_registers = csif_info->cs_reg_count, + .nr_kernel_registers = MAX2(csif_info->unpreserved_cs_reg_count, 4), .reg_perm = tiler_oom_reg_perm_cb, }; cs_builder_init(&b, &conf, handler_mem); @@ -169,8 +173,9 @@ panvk_per_arch(init_tiler_oom)(struct panvk_device *device) }; uint32_t dump_region_size; - size_t handler_length = generate_tiler_oom_handler( - handler_mem, zs_ext, rt_count, tracing_enabled, &dump_region_size); + size_t handler_length = + generate_tiler_oom_handler(device, handler_mem, zs_ext, rt_count, + tracing_enabled, &dump_region_size); /* All handlers must have the same length */ assert(idx == 0 || handler_length == device->tiler_oom.handler_stride); diff --git a/src/panfrost/vulkan/csf/panvk_vX_queue.c b/src/panfrost/vulkan/csf/panvk_vX_queue.c index b40219c9a0a..636f7472e07 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_queue.c +++ b/src/panfrost/vulkan/csf/panvk_vX_queue.c @@ -395,9 +395,11 @@ init_subqueue(struct panvk_queue *queue, enum panvk_subqueue_id subqueue) .gpu = panvk_priv_mem_dev_addr(queue->tiler_heap.desc) + 4096, .capacity = 64 * 1024 / sizeof(uint64_t), }; + const struct drm_panthor_csif_info *csif_info = + panthor_kmod_get_csif_props(dev->kmod.dev); const struct cs_builder_conf conf = { - .nr_registers = 96, - .nr_kernel_registers = 4, + .nr_registers = csif_info->cs_reg_count, + .nr_kernel_registers = MAX2(csif_info->unpreserved_cs_reg_count, 4), }; struct cs_builder b; diff --git a/src/panfrost/vulkan/csf/panvk_vX_utrace.c b/src/panfrost/vulkan/csf/panvk_vX_utrace.c index 3e3ccc53fe8..024a006f769 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_utrace.c +++ b/src/panfrost/vulkan/csf/panvk_vX_utrace.c @@ -149,8 +149,8 @@ panvk_per_arch(utrace_clone_init_builder)(struct cs_builder *b, struct panvk_pool *pool) { const struct cs_builder_conf builder_conf = { - .nr_registers = 96, - .nr_kernel_registers = 4, + .nr_registers = b->conf.nr_registers, + .nr_kernel_registers = b->conf.nr_kernel_registers, .alloc_buffer = alloc_clone_buffer, .cookie = pool, };