From 0e36d7112ccfe82d0fa57cb385a3c2cd2b9cdd32 Mon Sep 17 00:00:00 2001 From: Julia Zhang Date: Fri, 6 Feb 2026 14:48:00 +0800 Subject: [PATCH] radv: set TMZ bit in sdma_copy packet Pass secure and set TMZ bit in sdma_copy packet for protected image Signed-off-by: Julia Zhang Part-of: --- src/amd/common/ac_cmdbuf_sdma.h | 1 + src/amd/vulkan/meta/radv_meta_buffer.c | 5 ++++- src/amd/vulkan/radv_sdma.c | 15 +++++++++++---- src/amd/vulkan/radv_sdma.h | 2 +- src/amd/vulkan/radv_shader.c | 2 +- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/amd/common/ac_cmdbuf_sdma.h b/src/amd/common/ac_cmdbuf_sdma.h index 7e32457d98c..62ab059e89a 100644 --- a/src/amd/common/ac_cmdbuf_sdma.h +++ b/src/amd/common/ac_cmdbuf_sdma.h @@ -34,6 +34,7 @@ struct ac_sdma_surf { } offset; bool is_compressed; + bool is_secure; /* Linear */ struct { diff --git a/src/amd/vulkan/meta/radv_meta_buffer.c b/src/amd/vulkan/meta/radv_meta_buffer.c index 34bc116da8a..5559d99544a 100644 --- a/src/amd/vulkan/meta/radv_meta_buffer.c +++ b/src/amd/vulkan/meta/radv_meta_buffer.c @@ -16,6 +16,8 @@ #include "radv_cs.h" +#include "vk_command_pool.h" + struct fill_constants { uint64_t addr; uint32_t max_offset; @@ -361,7 +363,8 @@ radv_copy_memory(struct radv_cmd_buffer *cmd_buffer, uint64_t src_va, uint64_t d radv_prefer_compute_or_cp_dma(device, size, src_copy_flags, dst_copy_flags)); if (cmd_buffer->qf == RADV_QUEUE_TRANSFER) { - radv_sdma_copy_memory(device, cmd_buffer->cs, src_va, dst_va, size); + radv_sdma_copy_memory(device, cmd_buffer->cs, src_va, dst_va, size, + cmd_buffer->vk.pool->flags & VK_COMMAND_POOL_CREATE_PROTECTED_BIT); } else if (use_compute) { radv_compute_copy_memory(cmd_buffer, src_va, dst_va, size); } else if (size) { diff --git a/src/amd/vulkan/radv_sdma.c b/src/amd/vulkan/radv_sdma.c index 5a9241b4acb..3c41be48c7e 100644 --- a/src/amd/vulkan/radv_sdma.c +++ b/src/amd/vulkan/radv_sdma.c @@ -117,6 +117,7 @@ radv_sdma_get_buf_surf(const struct radv_image *const image, const VkDeviceMemor .pitch = pitch, .slice_pitch = slice_pitch, .bpp = bpe, + .is_secure = image->vk.create_flags & VK_IMAGE_CREATE_PROTECTED_BIT, }; return info; @@ -151,6 +152,7 @@ radv_sdma_get_surf(struct radv_cmd_buffer *cmd_buffer, const struct radv_image * .first_level = subresource.mipLevel, .num_levels = image->vk.mip_levels, .is_stencil = subresource.aspectMask == VK_IMAGE_ASPECT_STENCIL_BIT, + .is_secure = image->vk.create_flags & VK_IMAGE_CREATE_PROTECTED_BIT, }; info.offset.x = offset.x * radv_sdma_get_texel_scale(image); @@ -214,13 +216,13 @@ radv_sdma_emit_nop(const struct radv_device *device, struct radv_cmd_stream *cs) void radv_sdma_copy_memory(const struct radv_device *device, struct radv_cmd_stream *cs, uint64_t src_va, uint64_t dst_va, - uint64_t size) + uint64_t size, bool tmz) { const struct radv_physical_device *pdev = radv_device_physical(device); while (size > 0) { radeon_check_space(device->ws, cs->b, 7); - uint64_t bytes_written = ac_emit_sdma_copy_linear(cs->b, pdev->info.sdma_ip_version, src_va, dst_va, size, false); + uint64_t bytes_written = ac_emit_sdma_copy_linear(cs->b, pdev->info.sdma_ip_version, src_va, dst_va, size, tmz); size -= bytes_written; src_va += bytes_written; @@ -261,10 +263,12 @@ radv_sdma_emit_copy_tiled_sub_window(const struct radv_device *device, struct ra const VkExtent3D extent, const bool detile) { const struct radv_physical_device *pdev = radv_device_physical(device); + bool tmz = tiled->is_secure; + assert(!tmz || linear->is_secure); radeon_check_space(device->ws, cs->b, 17); ac_emit_sdma_copy_tiled_sub_window(cs->b, &pdev->info, linear, tiled, detile, extent.width, extent.height, - extent.depth, false); + extent.depth, tmz); } static void @@ -325,6 +329,9 @@ radv_sdma_copy_buffer_image_unaligned(const struct radv_device *device, struct r .slice_pitch = info.aligned_row_pitch * info.extent_vertical_blocks, }; + bool tmz = buf->is_secure; + assert(!tmz || img_in->is_secure); + VkExtent3D extent = base_extent; extent.depth = 1; @@ -355,7 +362,7 @@ radv_sdma_copy_buffer_image_unaligned(const struct radv_device *device, struct r const uint64_t buf_va = buf->va + slice * buf->slice_pitch * img.bpp + (row + r) * buf->pitch * img.bpp; const uint64_t tmp_va = tmp.va + r * info.aligned_row_pitch * img.bpp; radv_sdma_copy_memory(device, cs, to_image ? buf_va : tmp_va, to_image ? tmp_va : buf_va, - info.extent_horizontal_blocks * img.bpp); + info.extent_horizontal_blocks * img.bpp, tmz); } /* Wait for the copy to finish. */ diff --git a/src/amd/vulkan/radv_sdma.h b/src/amd/vulkan/radv_sdma.h index 222e6384ec4..b4a37990ddf 100644 --- a/src/amd/vulkan/radv_sdma.h +++ b/src/amd/vulkan/radv_sdma.h @@ -65,7 +65,7 @@ void radv_sdma_copy_image_t2t_scanline(const struct radv_device *device, struct const struct ac_sdma_surf *src, const struct ac_sdma_surf *dst, const VkExtent3D extent, struct radeon_winsys_bo *temp_bo); void radv_sdma_copy_memory(const struct radv_device *device, struct radv_cmd_stream *cs, uint64_t src_va, - uint64_t dst_va, uint64_t size); + uint64_t dst_va, uint64_t size, bool tmz); void radv_sdma_fill_memory(const struct radv_device *device, struct radv_cmd_stream *cs, const uint64_t va, const uint64_t size, const uint32_t value); bool radv_sdma_supports_image(const struct radv_device *device, const struct radv_image *image); diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 6c4b3bea714..eaad8a1f566 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -2725,7 +2725,7 @@ radv_shader_dma_get_submission(struct radv_device *device, struct radeon_winsys_ goto fail; } - radv_sdma_copy_memory(device, cs, radv_buffer_get_va(submission->bo), va, size); + radv_sdma_copy_memory(device, cs, radv_buffer_get_va(submission->bo), va, size, false); radv_cs_add_buffer(ws, cs->b, submission->bo); radv_cs_add_buffer(ws, cs->b, bo);