Scheduling jpeg idle_work for JPEG/VCN power gating during GPU reset can
trigger a register access assert before the GPU reset semaphore is
released, causing the following error during reset resume:

210] Workqueue: events amdgpu_jpeg_idle_work_handler [amdgpu]
[ 1576.787453] RIP: 0010:amdgpu_device_skip_hw_access+0x73/0x90 [amdgpu]
[ 1576.787656] Code: 85 c0 75 2a 8b 05 71 56 97 f0 85 c0 74 d3 48 8b bb d0 e7 
07 00 be ff ff ff ff 48 81 c7 88 00 00 00 e8 f1 50 39 ef 85 c0 75 b7 <0f> 0b eb 
b3 48 8b bb d0 e7 07 00 48 83 c7 18 e8 39 fe 36 ee eb a1
[ 1576.787661] RSP: 0018:ffffccf700e6bcf0 EFLAGS: 00010246
[ 1576.787668] RAX: 0000000000000000 RBX: ffff89cf52d80000 RCX: 0000000000000002
[ 1576.787673] RDX: 0000000000000000 RSI: ffff89cf04f56bc8 RDI: ffff89cf02fe8f98
[ 1576.787677] RBP: ffffccf700e6bd00 R08: 0000000000000000 R09: 0000000000000001
[ 1576.787681] R10: ffffccf700e6bdb0 R11: ffffffffc1635c96 R12: 0000000000000000
[ 1576.787686] R13: 00000000000084d2 R14: 000000000003ff01 R15: 0000000000000000
[ 1576.787690] FS:  0000000000000000(0000) GS:ffff89d29a37d000(0000) 
knlGS:0000000000000000
[ 1576.787695] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 1576.787700] CR2: 00007fea0cc1ca50 CR3: 00000002e6c42000 CR4: 0000000000350ef0
[ 1576.787704] Call Trace:
[ 1576.787709]  <TASK>
[ 1576.787717]  amdgpu_device_wreg+0x26/0x50 [amdgpu]
[ 1576.787925]  jpeg_v4_0_stop+0x47/0x140 [amdgpu]
[ 1576.788170]  jpeg_v4_0_set_powergating_state+0x53/0x70 [amdgpu]
[ 1576.788410]  amdgpu_device_ip_set_powergating_state+0x67/0xc0 [amdgpu]
[ 1576.788642]  amdgpu_jpeg_idle_work_handler+0x105/0x120 [amdgpu]
[ 1576.788887]  process_one_work+0x23e/0x6f0
[ 1576.788917]  worker_thread+0x1c4/0x380
[ 1576.788931]  kthread+0x10c/0x150
[ 1576.788937]  ? __pfx_worker_thread+0x10/0x10
[ 1576.788943]  ? __pfx_kthread+0x10/0x10
[ 1576.788954]  ret_from_fork+0x314/0x390
[ 1576.788960]  ? __pfx_kthread+0x10/0x10
[ 1576.788969]  ret_from_fork_asm+0x1a/0x30
[ 1576.789003]  </TASK>

Signed-off-by: Prike Liang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c | 5 ++++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c  | 3 ++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c
index 208566ffe898..a66da05cc3f7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c
@@ -145,7 +145,10 @@ void amdgpu_jpeg_ring_begin_use(struct amdgpu_ring *ring)
 
 void amdgpu_jpeg_ring_end_use(struct amdgpu_ring *ring)
 {
-       if (atomic_dec_and_test(&ring->adev->jpeg.total_submission_cnt))
+       struct amdgpu_device *adev = ring->adev;
+
+       if (atomic_dec_and_test(&ring->adev->jpeg.total_submission_cnt) &&
+          !amdgpu_in_reset(adev))
                schedule_delayed_work(&ring->adev->jpeg.idle_work,
                                      JPEG_IDLE_TIMEOUT);
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 17db7264269e..6cf08e35dc9b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -549,7 +549,8 @@ void amdgpu_vcn_ring_end_use(struct amdgpu_ring *ring)
            !adev->vcn.inst[ring->me].using_unified_queue)
                
atomic_dec(&ring->adev->vcn.inst[ring->me].dpg_enc_submission_cnt);
 
-       if 
(atomic_dec_and_test(&ring->adev->vcn.inst[ring->me].total_submission_cnt))
+       if 
(atomic_dec_and_test(&ring->adev->vcn.inst[ring->me].total_submission_cnt) &&
+           !amdgpu_in_reset(adev))
                schedule_delayed_work(&ring->adev->vcn.inst[ring->me].idle_work,
                                      VCN_IDLE_TIMEOUT);
 }
-- 
2.34.1

Reply via email to