Skip to content

Commit 9296da8

Browse files
fdavid-amdalexdeucher
authored andcommitted
drm/amdkfd: Checkpoint and restore queues on GFX11
The code in kfd_mqd_manager_v11.c to support criu dump and restore of queue state was missing. Added it; should be equivalent to kfd_mqd_manager_v10.c. CC: Felix Kuehling <felix.kuehling@amd.com> Reviewed-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: David Francis <David.Francis@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent ec5fa9f commit 9296da8

1 file changed

Lines changed: 41 additions & 0 deletions

File tree

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,43 @@ static int get_wave_state(struct mqd_manager *mm, void *mqd,
321321
return 0;
322322
}
323323

324+
static void checkpoint_mqd(struct mqd_manager *mm, void *mqd, void *mqd_dst, void *ctl_stack_dst)
325+
{
326+
struct v11_compute_mqd *m;
327+
328+
m = get_mqd(mqd);
329+
330+
memcpy(mqd_dst, m, sizeof(struct v11_compute_mqd));
331+
}
332+
333+
static void restore_mqd(struct mqd_manager *mm, void **mqd,
334+
struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
335+
struct queue_properties *qp,
336+
const void *mqd_src,
337+
const void *ctl_stack_src, const u32 ctl_stack_size)
338+
{
339+
uint64_t addr;
340+
struct v11_compute_mqd *m;
341+
342+
m = (struct v11_compute_mqd *) mqd_mem_obj->cpu_ptr;
343+
addr = mqd_mem_obj->gpu_addr;
344+
345+
memcpy(m, mqd_src, sizeof(*m));
346+
347+
*mqd = m;
348+
if (gart_addr)
349+
*gart_addr = addr;
350+
351+
m->cp_hqd_pq_doorbell_control =
352+
qp->doorbell_off <<
353+
CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT;
354+
pr_debug("cp_hqd_pq_doorbell_control 0x%x\n",
355+
m->cp_hqd_pq_doorbell_control);
356+
357+
qp->is_active = 0;
358+
}
359+
360+
324361
static void init_mqd_hiq(struct mqd_manager *mm, void **mqd,
325362
struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
326363
struct queue_properties *q)
@@ -458,6 +495,8 @@ struct mqd_manager *mqd_manager_init_v11(enum KFD_MQD_TYPE type,
458495
mqd->mqd_size = sizeof(struct v11_compute_mqd);
459496
mqd->get_wave_state = get_wave_state;
460497
mqd->mqd_stride = kfd_mqd_stride;
498+
mqd->checkpoint_mqd = checkpoint_mqd;
499+
mqd->restore_mqd = restore_mqd;
461500
#if defined(CONFIG_DEBUG_FS)
462501
mqd->debugfs_show_mqd = debugfs_show_mqd;
463502
#endif
@@ -502,6 +541,8 @@ struct mqd_manager *mqd_manager_init_v11(enum KFD_MQD_TYPE type,
502541
mqd->update_mqd = update_mqd_sdma;
503542
mqd->destroy_mqd = kfd_destroy_mqd_sdma;
504543
mqd->is_occupied = kfd_is_occupied_sdma;
544+
mqd->checkpoint_mqd = checkpoint_mqd;
545+
mqd->restore_mqd = restore_mqd;
505546
mqd->mqd_size = sizeof(struct v11_sdma_mqd);
506547
mqd->mqd_stride = kfd_mqd_stride;
507548
#if defined(CONFIG_DEBUG_FS)

0 commit comments

Comments
 (0)