Skip to content

Commit b5e1a38

Browse files
jiadozhualexdeucher
authored andcommitted
drm/amdgpu/gfx9: remap queue after reset successfully
Kiq command unmap_queues only does the dequeueing action. We have to map the queue back with clean mqd. Acked-by: Vitaly Prosyak <vitaly.prosyak@amd.com> Signed-off-by: Jiadong Zhu <Jiadong.Zhu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 5fb4d2a commit b5e1a38

File tree

1 file changed

+27
-9
lines changed

1 file changed

+27
-9
lines changed

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

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3742,7 +3742,7 @@ static int gfx_v9_0_kiq_init_queue(struct amdgpu_ring *ring)
37423742
return 0;
37433743
}
37443744

3745-
static int gfx_v9_0_kcq_init_queue(struct amdgpu_ring *ring)
3745+
static int gfx_v9_0_kcq_init_queue(struct amdgpu_ring *ring, bool restore)
37463746
{
37473747
struct amdgpu_device *adev = ring->adev;
37483748
struct v9_mqd *mqd = ring->mqd_ptr;
@@ -3754,8 +3754,8 @@ static int gfx_v9_0_kcq_init_queue(struct amdgpu_ring *ring)
37543754
*/
37553755
tmp_mqd = (struct v9_mqd *)adev->gfx.mec.mqd_backup[mqd_idx];
37563756

3757-
if (!tmp_mqd->cp_hqd_pq_control ||
3758-
(!amdgpu_in_reset(adev) && !adev->in_suspend)) {
3757+
if (!restore && (!tmp_mqd->cp_hqd_pq_control ||
3758+
(!amdgpu_in_reset(adev) && !adev->in_suspend))) {
37593759
memset((void *)mqd, 0, sizeof(struct v9_mqd_allocation));
37603760
((struct v9_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;
37613761
((struct v9_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;
@@ -3819,7 +3819,7 @@ static int gfx_v9_0_kcq_resume(struct amdgpu_device *adev)
38193819
goto done;
38203820
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
38213821
if (!r) {
3822-
r = gfx_v9_0_kcq_init_queue(ring);
3822+
r = gfx_v9_0_kcq_init_queue(ring, false);
38233823
amdgpu_bo_kunmap(ring->mqd_obj);
38243824
ring->mqd_ptr = NULL;
38253825
}
@@ -7147,11 +7147,29 @@ static int gfx_v9_0_reset_kcq(struct amdgpu_ring *ring,
71477147
if (r)
71487148
return r;
71497149

7150-
/* reset the ring */
7151-
ring->wptr = 0;
7152-
*ring->wptr_cpu_addr = 0;
7153-
amdgpu_ring_clear_ring(ring);
7154-
7150+
r = amdgpu_bo_reserve(ring->mqd_obj, false);
7151+
if (unlikely(r != 0)){
7152+
DRM_ERROR("fail to resv mqd_obj\n");
7153+
return r;
7154+
}
7155+
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
7156+
if (!r) {
7157+
r = gfx_v9_0_kcq_init_queue(ring, true);
7158+
amdgpu_bo_kunmap(ring->mqd_obj);
7159+
ring->mqd_ptr = NULL;
7160+
}
7161+
amdgpu_bo_unreserve(ring->mqd_obj);
7162+
if (r){
7163+
DRM_ERROR("fail to unresv mqd_obj\n");
7164+
return r;
7165+
}
7166+
r = amdgpu_ring_alloc(kiq_ring, kiq->pmf->map_queues_size);
7167+
kiq->pmf->kiq_map_queues(kiq_ring, ring);
7168+
r = amdgpu_ring_test_ring(kiq_ring);
7169+
if (r){
7170+
DRM_ERROR("fail to remap queue\n");
7171+
return r;
7172+
}
71557173
return amdgpu_ring_test_ring(ring);
71567174
}
71577175

0 commit comments

Comments
 (0)