diff --git a/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c b/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c index 7735407e007..7dcc8417bc1 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c +++ b/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c @@ -865,7 +865,6 @@ panvk_queue_submit_init_utrace(struct panvk_queue_submit *submit, const struct vk_queue_submit *vk_submit) { MESA_TRACE_FUNC(); - struct panvk_device *dev = submit->dev; if (!submit->utrace.queue_mask) return; @@ -876,6 +875,7 @@ panvk_queue_submit_init_utrace(struct panvk_queue_submit *submit, */ struct panvk_utrace_flush_data *next = submit->utrace.data_storage; submit->utrace.data[submit->utrace.last_subqueue] = next++; + submit->utrace.data[submit->utrace.last_subqueue]->free_self = true; u_foreach_bit(i, submit->utrace.queue_mask) { if (i != submit->utrace.last_subqueue) @@ -886,13 +886,9 @@ panvk_queue_submit_init_utrace(struct panvk_queue_submit *submit, .subqueue = i, .sync = wait ? submit->queue->utrace.sync : NULL, .wait_value = wait ? submit->queue->utrace.next_value : 0, + .free_self = false, }; } - - if (submit->utrace.needs_clone) { - struct panvk_pool *clone_pool = &submit->utrace.data_storage->clone_pool; - panvk_per_arch(utrace_clone_init_pool)(clone_pool, dev); - } } static void @@ -964,17 +960,30 @@ panvk_queue_submit_init_cmdbufs(struct panvk_queue_submit *submit, if (!u_trace_has_points(ut)) continue; - const bool free_data = ut == submit->utrace.last_ut; + /* The last subqueue frees the flush data itself. */ + bool free_data = ut == submit->utrace.last_ut; struct u_trace clone_ut; if (!(cmdbuf->flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT)) { u_trace_init(&clone_ut, &dev->utrace.utctx); - struct panvk_pool *clone_pool = - &submit->utrace.data_storage->clone_pool; + const uint64_t root_buf_size = sizeof(uint64_t) * 1024; + struct panvk_utrace_buf *cs_root_buf = + panvk_utrace_create_buffer(&dev->utrace.utctx, root_buf_size); + assert(cs_root_buf); + /* For every sq, the cs buffer needs to be freed. */ + free_data = true; + + const struct cs_buffer cs_root = (struct cs_buffer){ + .cpu = cs_root_buf->host, + .gpu = cs_root_buf->dev, + .capacity = root_buf_size / sizeof(uint64_t), + }; + + submit->utrace.data[j]->clone_cs_root = cs_root_buf; struct cs_builder clone_builder; - panvk_per_arch(utrace_clone_init_builder)(&clone_builder, - clone_pool); + panvk_per_arch(utrace_clone_init_builder)(&clone_builder, dev, + &cs_root); u_trace_clone_append( u_trace_begin_iterator(ut), u_trace_end_iterator(ut), &clone_ut, diff --git a/src/panfrost/vulkan/csf/panvk_vX_utrace.c b/src/panfrost/vulkan/csf/panvk_vX_utrace.c index d7c18d5a3c1..1ca0a308b0a 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_utrace.c +++ b/src/panfrost/vulkan/csf/panvk_vX_utrace.c @@ -240,48 +240,19 @@ panvk_per_arch(utrace_copy_buffer)(struct u_trace_context *utctx, cmd_copy_data(b, dst_addr, src_addr, size_B, false); } -void -panvk_per_arch(utrace_clone_init_pool)(struct panvk_pool *pool, - struct panvk_device *dev) -{ - const struct panvk_pool_properties pool_props = { - .slab_size = 64 * 1024, - .label = "utrace clone pool", - .owns_bos = true, - }; - panvk_pool_init(pool, dev, NULL, NULL, &pool_props); -} - -static struct cs_buffer -alloc_clone_buffer(void *cookie) -{ - struct panvk_pool *pool = cookie; - const uint32_t size = 4 * 1024; - const uint32_t alignment = 64; - - struct pan_ptr ptr = pan_pool_alloc_aligned(&pool->base, size, alignment); - - return (struct cs_buffer){ - .cpu = ptr.cpu, - .gpu = ptr.gpu, - .capacity = size, - }; -} - void panvk_per_arch(utrace_clone_init_builder)(struct cs_builder *b, - struct panvk_pool *pool) + struct panvk_device *dev, + const struct cs_buffer *cs_root) { const struct drm_panthor_csif_info *csif_info = - panthor_kmod_get_csif_props(pool->dev->kmod.dev); + panthor_kmod_get_csif_props(dev->kmod.dev); const struct cs_builder_conf builder_conf = { .nr_registers = csif_info->cs_reg_count, .nr_kernel_registers = MAX2(csif_info->unpreserved_cs_reg_count, 4), - .alloc_buffer = alloc_clone_buffer, - .cookie = pool, .ls_sb_slot = SB_ID(LS), }; - cs_builder_init(b, &builder_conf, (struct cs_buffer){0}); + cs_builder_init(b, &builder_conf, *cs_root); } void diff --git a/src/panfrost/vulkan/panvk_utrace.c b/src/panfrost/vulkan/panvk_utrace.c index 9a542799480..63fc82dcb69 100644 --- a/src/panfrost/vulkan/panvk_utrace.c +++ b/src/panfrost/vulkan/panvk_utrace.c @@ -111,8 +111,11 @@ panvk_utrace_delete_flush_data(struct u_trace_context *utctx, void *flush_data) { struct panvk_utrace_flush_data *data = flush_data; - if (data->clone_pool.dev) - panvk_pool_cleanup(&data->clone_pool); + if (data->clone_cs_root) { + panvk_utrace_delete_buffer(utctx, data->clone_cs_root); + data->clone_cs_root = NULL; + } - free(data); + if (data->free_self) + free(data); } diff --git a/src/panfrost/vulkan/panvk_utrace.h b/src/panfrost/vulkan/panvk_utrace.h index 13fde739837..02ca5ec0c75 100644 --- a/src/panfrost/vulkan/panvk_utrace.h +++ b/src/panfrost/vulkan/panvk_utrace.h @@ -20,7 +20,8 @@ struct panvk_utrace_flush_data { struct vk_sync *sync; uint64_t wait_value; - struct panvk_pool clone_pool; + struct panvk_utrace_buf *clone_cs_root; + bool free_self; }; struct panvk_utrace_buf { @@ -68,11 +69,11 @@ void panvk_per_arch(utrace_copy_buffer)(struct u_trace_context *utctx, uint64_t to_offset, uint64_t size_B); struct cs_builder; +struct cs_buffer; -void panvk_per_arch(utrace_clone_init_pool)(struct panvk_pool *pool, - struct panvk_device *dev); void panvk_per_arch(utrace_clone_init_builder)(struct cs_builder *b, - struct panvk_pool *pool); + struct panvk_device *dev, + const struct cs_buffer *cs_root); void panvk_per_arch(utrace_clone_finish_builder)(struct cs_builder *b); #else /* PAN_ARCH >= 10 */