Pass watchpoint addresses through amdgpu_mes_set_shader_debugger() so
MES programs TCP_WATCH registers at dispatch time.

Assisted-by: claude-code:claude-sonnet-4
Signed-off-by: David Belanger <[email protected]>
Reviewed-by: Michael Chen <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 3 +++
 drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h | 2 ++
 drivers/gpu/drm/amd/amdkfd/kfd_debug.c  | 6 +++++-
 drivers/gpu/drm/amd/amdkfd/kfd_priv.h   | 1 +
 4 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
index 05bbbd1afb630..53d7cb1402d80 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
@@ -695,6 +695,7 @@ int amdgpu_mes_set_shader_debugger(struct amdgpu_device 
*adev,
                                uint64_t process_context_addr,
                                uint32_t spi_gdbg_per_vmid_cntl,
                                const uint32_t *tcp_watch_cntl,
+                               const uint64_t *watch_addresses,
                                uint32_t flags,
                                bool trap_en,
                                uint32_t xcc_id)
@@ -720,6 +721,8 @@ int amdgpu_mes_set_shader_debugger(struct amdgpu_device 
*adev,
        op_input.set_shader_debugger.spi_gdbg_per_vmid_cntl = 
spi_gdbg_per_vmid_cntl;
        memcpy(op_input.set_shader_debugger.tcp_watch_cntl, tcp_watch_cntl,
                        sizeof(op_input.set_shader_debugger.tcp_watch_cntl));
+       memcpy(op_input.set_shader_debugger.watch_addresses, watch_addresses,
+                       sizeof(op_input.set_shader_debugger.watch_addresses));
 
        if (((adev->mes.sched_version & AMDGPU_MES_API_VERSION_MASK) >>
                        AMDGPU_MES_API_VERSION_SHIFT) >= 14)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h
index b967b6c0b4c75..0c4cd663de9ff 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h
@@ -435,6 +435,7 @@ struct mes_misc_op_input {
                        } flags;
                        uint32_t spi_gdbg_per_vmid_cntl;
                        uint32_t tcp_watch_cntl[4];
+                       uint64_t watch_addresses[4];
                        uint32_t trap_en;
                } set_shader_debugger;
 
@@ -623,6 +624,7 @@ int amdgpu_mes_set_shader_debugger(struct amdgpu_device 
*adev,
                                uint64_t process_context_addr,
                                uint32_t spi_gdbg_per_vmid_cntl,
                                const uint32_t *tcp_watch_cntl,
+                               const uint64_t *watch_addresses,
                                uint32_t flags,
                                bool trap_en,
                                uint32_t xcc_id);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_debug.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_debug.c
index 8bed0d0f9bd26..71b34a57c2cc2 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_debug.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_debug.c
@@ -374,7 +374,9 @@ int kfd_dbg_set_mes_debug_mode(struct kfd_process_device 
*pdd, bool sq_trap_en)
 
        return amdgpu_mes_set_shader_debugger(pdd->dev->adev,
                                        pdd->proc_ctx_gpu_addr, spi_dbg_cntl,
-                                       pdd->watch_points, flags, sq_trap_en,
+                                       pdd->watch_points,
+                                       pdd->watch_addresses,
+                                       flags, sq_trap_en,
                                        ffs(pdd->dev->xcc_mask) - 1);
 }
 
@@ -449,6 +451,7 @@ int kfd_dbg_trap_clear_dev_address_watch(struct 
kfd_process_device *pdd,
        pdd->watch_points[watch_id] = pdd->dev->kfd2kgd->clear_address_watch(
                                                        pdd->dev->adev,
                                                        watch_id);
+       pdd->watch_addresses[watch_id] = 0;
        amdgpu_gfx_off_ctrl(pdd->dev->adev, true);
 
        if (!pdd->dev->kfd->shared_resources.enable_mes)
@@ -485,6 +488,7 @@ int kfd_dbg_trap_set_dev_address_watch(struct 
kfd_process_device *pdd,
        }
 
        amdgpu_gfx_off_ctrl(pdd->dev->adev, false);
+       pdd->watch_addresses[*watch_id] = watch_address;
        for_each_inst(xcc_id, xcc_mask)
                pdd->watch_points[*watch_id] = 
pdd->dev->kfd2kgd->set_address_watch(
                                pdd->dev->adev,
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h 
b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index 7a365fca68e4f..c0207f44493cb 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -870,6 +870,7 @@ struct kfd_process_device {
        uint32_t spi_dbg_override;
        uint32_t spi_dbg_launch_mode;
        uint32_t watch_points[4];
+       uint64_t watch_addresses[4];
        uint32_t alloc_watch_ids;
 
        /*
-- 
2.55.0

Reply via email to