return r;
 }
 
+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,
+                               uint32_t flags)
+{
+       struct mes_misc_op_input op_input = {0};
+       int r;
+
+       if (!adev->mes.funcs->misc_op) {
+               DRM_ERROR("mes set shader debugger is not supported!\n");
+               return -EINVAL;
+       }
+
+       op_input.op = MES_MISC_OP_SET_SHADER_DEBUGGER;
+       op_input.set_shader_debugger.process_context_addr = process_context_addr;
+       op_input.set_shader_debugger.flags.u32all = flags;
+       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));
+
+       amdgpu_mes_lock(&adev->mes);
+
+       r = adev->mes.funcs->misc_op(&adev->mes, &op_input);
+       if (r)
+               DRM_ERROR("failed to set_shader_debugger\n");
+
+       amdgpu_mes_unlock(&adev->mes);
+
+       return r;
+}
+
 static void
 amdgpu_mes_ring_to_queue_props(struct amdgpu_device *adev,
                               struct amdgpu_ring *ring,
 
        MES_MISC_OP_READ_REG,
        MES_MISC_OP_WRM_REG_WAIT,
        MES_MISC_OP_WRM_REG_WR_WAIT,
+       MES_MISC_OP_SET_SHADER_DEBUGGER,
 };
 
 struct mes_misc_op_input {
                        uint32_t                   reg0;
                        uint32_t                   reg1;
                } wrm_reg;
+
+               struct {
+                       uint64_t process_context_addr;
+                       union {
+                               struct {
+                                       uint64_t single_memop : 1;
+                                       uint64_t single_alu_op : 1;
+                                       uint64_t reserved: 30;
+                               };
+                               uint32_t u32all;
+                       } flags;
+                       uint32_t spi_gdbg_per_vmid_cntl;
+                       uint32_t tcp_watch_cntl[4];
+               } set_shader_debugger;
        };
 };
 
 int amdgpu_mes_reg_write_reg_wait(struct amdgpu_device *adev,
                                  uint32_t reg0, uint32_t reg1,
                                  uint32_t ref, uint32_t mask);
+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,
+                               uint32_t flags);
 
 int amdgpu_mes_add_ring(struct amdgpu_device *adev, int gang_id,
                        int queue_type, int idx,
 
                misc_pkt.wait_reg_mem.reg_offset1 = input->wrm_reg.reg0;
                misc_pkt.wait_reg_mem.reg_offset2 = input->wrm_reg.reg1;
                break;
+       case MES_MISC_OP_SET_SHADER_DEBUGGER:
+               misc_pkt.opcode = MESAPI_MISC__SET_SHADER_DEBUGGER;
+               misc_pkt.set_shader_debugger.process_context_addr =
+                               input->set_shader_debugger.process_context_addr;
+               misc_pkt.set_shader_debugger.flags.u32all =
+                               input->set_shader_debugger.flags.u32all;
+               misc_pkt.set_shader_debugger.spi_gdbg_per_vmid_cntl =
+                               input->set_shader_debugger.spi_gdbg_per_vmid_cntl;
+               memcpy(misc_pkt.set_shader_debugger.tcp_watch_cntl,
+                               input->set_shader_debugger.tcp_watch_cntl,
+                               sizeof(misc_pkt.set_shader_debugger.tcp_watch_cntl));
+               break;
        default:
                DRM_ERROR("unsupported misc op (%d) \n", input->op);
                return -EINVAL;
 
                        uint32_t is_kfd_process         : 1;
                        uint32_t trap_en                : 1;
                        uint32_t is_aql_queue           : 1;
-                       uint32_t reserved               : 20;
+                       uint32_t skip_process_ctx_clear : 1;
+                       uint32_t reserved               : 19;
                };
                struct MES_API_STATUS           api_status;
                uint64_t                        tma_addr;
        MESAPI_MISC__QUERY_STATUS,
        MESAPI_MISC__READ_REG,
        MESAPI_MISC__WAIT_REG_MEM,
+       MESAPI_MISC__SET_SHADER_DEBUGGER,
        MESAPI_MISC__MAX,
 };
 
        uint32_t context_id;
 };
 
+struct SET_SHADER_DEBUGGER {
+       uint64_t process_context_addr;
+       union {
+               struct {
+                       uint32_t single_memop : 1;  /* SQ_DEBUG.single_memop */
+                       uint32_t single_alu_op : 1; /* SQ_DEBUG.single_alu_op */
+                       uint32_t reserved : 30;
+               };
+               uint32_t u32all;
+       } flags;
+       uint32_t spi_gdbg_per_vmid_cntl;
+       uint32_t tcp_watch_cntl[4]; /* TCP_WATCHx_CNTL */
+};
+
 union MESAPI__MISC {
        struct {
                union MES_API_HEADER    header;
                        struct          QUERY_STATUS query_status;
                        struct          READ_REG read_reg;
                        struct          WAIT_REG_MEM wait_reg_mem;
+                       struct          SET_SHADER_DEBUGGER set_shader_debugger;
+                       enum MES_AMD_PRIORITY_LEVEL queue_sch_level;
+
                        uint32_t        data[MISC_DATA_MAX_SIZE_IN_DWORDS];
                };
        };