]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: fix JPEG v4.0.5 queue reset failure in DPG mode
authorJesse Zhang <Jesse.Zhang@amd.com>
Wed, 29 Jul 2026 08:57:08 +0000 (16:57 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 6 Aug 2026 18:31:27 +0000 (14:31 -0400)
Like jpeg_v5_0_0, in DPG mode the ring reset path only clears the
JPEG_PG_MODE bit and never resets a hung JRBC, so the post-reset ring test
times out and the driver falls back to a full MODE1 reset.

Temporarily force the static power-gating path during the reset so the
stop/start sequence power-cycles the JPEG block (JMI soft reset + power
off/on), matching the jpeg_v4_0 reset.

Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 75a308eef4503a9d2bf297bef5a9317d2209e696)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c

index a43582b9c876c7750b614d4e66b7c9adbba6356a..3f61d5367d9469f6e6dff08c1cfcd0a46b50534b 100644 (file)
@@ -772,15 +772,28 @@ static int jpeg_v4_0_5_ring_reset(struct amdgpu_ring *ring,
                                  unsigned int vmid,
                                  struct amdgpu_fence *timedout_fence)
 {
+       struct amdgpu_device *adev = ring->adev;
+       u32 pg_flags = adev->pg_flags;
        int r;
 
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
-       r = jpeg_v4_0_5_stop(ring->adev);
-       if (r)
-               return r;
-       r = jpeg_v4_0_5_start(ring->adev);
+
+       /*
+        * The DPG stop path only clears the JPEG_PG_MODE bit and never resets a
+        * hung JRBC, so the post-reset ring test times out and the driver falls
+        * back to a full MODE1 reset. Temporarily force the static power-gating
+        * path so the stop/start sequence actually power-cycles the JPEG block
+        * (JMI soft reset + static power off/on), matching the working jpeg_v4_0
+        * reset.
+        */
+       adev->pg_flags &= ~AMD_PG_SUPPORT_JPEG_DPG;
+       r = jpeg_v4_0_5_stop(adev);
+       if (!r)
+               r = jpeg_v4_0_5_start(adev);
+       adev->pg_flags = pg_flags;
        if (r)
                return r;
+
        return amdgpu_ring_reset_helper_end(ring, timedout_fence);
 }