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
