Skip to content

Commit 09d49e1

Browse files
jokim-amdalexdeucher
authored andcommitted
drm/amdkfd: fix and enable debugging for gfx11
There are a couple of fixes required to enable gfx11 debugging. First, ADD_QUEUE.trap_en is an inappropriate place to toggle a per-process register so move it to SET_SHADER_DEBUGGER.trap_en. When ADD_QUEUE.skip_process_ctx_clear is set, MES will prioritize the SET_SHADER_DEBUGGER.trap_en setting. Second, to preserve correct save/restore priviledged wave states in coordination with the trap enablement setting, resume suspended waves early in the disable call. Signed-off-by: Jonathan Kim <jonathan.kim@amd.com> Reviewed-by: Felix Kuehling <felix.kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent fe56c6e commit 09d49e1

7 files changed

Lines changed: 25 additions & 17 deletions

File tree

drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,8 @@ int amdgpu_mes_set_shader_debugger(struct amdgpu_device *adev,
928928
uint64_t process_context_addr,
929929
uint32_t spi_gdbg_per_vmid_cntl,
930930
const uint32_t *tcp_watch_cntl,
931-
uint32_t flags)
931+
uint32_t flags,
932+
bool trap_en)
932933
{
933934
struct mes_misc_op_input op_input = {0};
934935
int r;
@@ -945,6 +946,10 @@ int amdgpu_mes_set_shader_debugger(struct amdgpu_device *adev,
945946
memcpy(op_input.set_shader_debugger.tcp_watch_cntl, tcp_watch_cntl,
946947
sizeof(op_input.set_shader_debugger.tcp_watch_cntl));
947948

949+
if (((adev->mes.sched_version & AMDGPU_MES_API_VERSION_MASK) >>
950+
AMDGPU_MES_API_VERSION_SHIFT) >= 14)
951+
op_input.set_shader_debugger.trap_en = trap_en;
952+
948953
amdgpu_mes_lock(&adev->mes);
949954

950955
r = adev->mes.funcs->misc_op(&adev->mes, &op_input);

drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ struct mes_misc_op_input {
294294
} flags;
295295
uint32_t spi_gdbg_per_vmid_cntl;
296296
uint32_t tcp_watch_cntl[4];
297+
uint32_t trap_en;
297298
} set_shader_debugger;
298299
};
299300
};
@@ -361,7 +362,8 @@ int amdgpu_mes_set_shader_debugger(struct amdgpu_device *adev,
361362
uint64_t process_context_addr,
362363
uint32_t spi_gdbg_per_vmid_cntl,
363364
const uint32_t *tcp_watch_cntl,
364-
uint32_t flags);
365+
uint32_t flags,
366+
bool trap_en);
365367

366368
int amdgpu_mes_add_ring(struct amdgpu_device *adev, int gang_id,
367369
int queue_type, int idx,

drivers/gpu/drm/amd/amdgpu/mes_v11_0.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ static int mes_v11_0_misc_op(struct amdgpu_mes *mes,
347347
memcpy(misc_pkt.set_shader_debugger.tcp_watch_cntl,
348348
input->set_shader_debugger.tcp_watch_cntl,
349349
sizeof(misc_pkt.set_shader_debugger.tcp_watch_cntl));
350+
misc_pkt.set_shader_debugger.trap_en = input->set_shader_debugger.trap_en;
350351
break;
351352
default:
352353
DRM_ERROR("unsupported misc op (%d) \n", input->op);

drivers/gpu/drm/amd/amdkfd/kfd_debug.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -349,12 +349,13 @@ int kfd_dbg_set_mes_debug_mode(struct kfd_process_device *pdd)
349349
{
350350
uint32_t spi_dbg_cntl = pdd->spi_dbg_override | pdd->spi_dbg_launch_mode;
351351
uint32_t flags = pdd->process->dbg_flags;
352+
bool sq_trap_en = !!spi_dbg_cntl;
352353

353354
if (!kfd_dbg_is_per_vmid_supported(pdd->dev))
354355
return 0;
355356

356357
return amdgpu_mes_set_shader_debugger(pdd->dev->adev, pdd->proc_ctx_gpu_addr, spi_dbg_cntl,
357-
pdd->watch_points, flags);
358+
pdd->watch_points, flags, sq_trap_en);
358359
}
359360

360361
#define KFD_DEBUGGER_INVALID_WATCH_POINT_ID -1
@@ -557,6 +558,10 @@ void kfd_dbg_trap_deactivate(struct kfd_process *target, bool unwind, int unwind
557558

558559
if (!unwind) {
559560
uint32_t flags = 0;
561+
int resume_count = resume_queues(target, 0, NULL);
562+
563+
if (resume_count)
564+
pr_debug("Resumed %d queues\n", resume_count);
560565

561566
cancel_work_sync(&target->debug_event_workarea);
562567
kfd_dbg_clear_process_address_watch(target);
@@ -598,13 +603,6 @@ void kfd_dbg_trap_deactivate(struct kfd_process *target, bool unwind, int unwind
598603
}
599604

600605
kfd_dbg_set_workaround(target, false);
601-
602-
if (!unwind) {
603-
int resume_count = resume_queues(target, 0, NULL);
604-
605-
if (resume_count)
606-
pr_debug("Resumed %d queues\n", resume_count);
607-
}
608606
}
609607

610608
static void kfd_dbg_clean_exception_status(struct kfd_process *target)

drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,7 @@ static int add_queue_mes(struct device_queue_manager *dqm, struct queue *q,
227227
queue_input.tba_addr = qpd->tba_addr;
228228
queue_input.tma_addr = qpd->tma_addr;
229229
queue_input.trap_en = KFD_GC_VERSION(q->device) < IP_VERSION(11, 0, 0) ||
230-
KFD_GC_VERSION(q->device) >= IP_VERSION(12, 0, 0) ||
231-
q->properties.is_dbg_wa;
230+
KFD_GC_VERSION(q->device) >= IP_VERSION(12, 0, 0);
232231
queue_input.skip_process_ctx_clear = qpd->pqm->process->debug_trap_enabled;
233232

234233
queue_type = convert_to_mes_queue_type(q->properties.type);

drivers/gpu/drm/amd/amdkfd/kfd_topology.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1863,13 +1863,15 @@ static void kfd_topology_set_dbg_firmware_support(struct kfd_topology_device *de
18631863
{
18641864
bool firmware_supported = true;
18651865

1866-
/*
1867-
* FIXME: GFX11 FW currently not sufficient to deal with CWSR WA.
1868-
* Updated FW with API changes coming soon.
1869-
*/
18701866
if (KFD_GC_VERSION(dev->gpu) >= IP_VERSION(11, 0, 0) &&
18711867
KFD_GC_VERSION(dev->gpu) < IP_VERSION(12, 0, 0)) {
1872-
firmware_supported = false;
1868+
uint32_t mes_api_rev = (dev->gpu->adev->mes.sched_version &
1869+
AMDGPU_MES_API_VERSION_MASK) >>
1870+
AMDGPU_MES_API_VERSION_SHIFT;
1871+
uint32_t mes_rev = dev->gpu->adev->mes.sched_version &
1872+
AMDGPU_MES_VERSION_MASK;
1873+
1874+
firmware_supported = (mes_api_rev >= 14) && (mes_rev >= 64);
18731875
goto out;
18741876
}
18751877

drivers/gpu/drm/amd/include/mes_v11_api_def.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,7 @@ struct SET_SHADER_DEBUGGER {
575575
} flags;
576576
uint32_t spi_gdbg_per_vmid_cntl;
577577
uint32_t tcp_watch_cntl[4]; /* TCP_WATCHx_CNTL */
578+
uint32_t trap_en;
578579
};
579580

580581
union MESAPI__MISC {

0 commit comments

Comments
 (0)