From 9a70754ebd5f6d5cbfb49476c577b7214d833176 Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Thu, 30 Jan 2025 11:56:18 +0000 Subject: [PATCH] panfrost: Use CSIF info for CSF registers count Instead of hardcoding 96 everywhere, we can get that information from the kernel. This is useful for newer generations that increased the count of registers present. Signed-off-by: Mary Guillemard Reviewed-by: Boris Brezillon Reviewed-by: Benjamin Lee Part-of: --- src/gallium/drivers/panfrost/pan_csf.c | 18 +++++++++++++----- src/panfrost/vulkan/csf/panvk_vX_cmd_buffer.c | 9 +++++++-- .../vulkan/csf/panvk_vX_exception_handler.c | 15 ++++++++++----- src/panfrost/vulkan/csf/panvk_vX_queue.c | 6 ++++-- src/panfrost/vulkan/csf/panvk_vX_utrace.c | 4 ++-- 5 files changed, 36 insertions(+), 16 deletions(-) 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, };