]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Fix UVD dpb min size calculation for H264
authorDavid Rosca <david.rosca@amd.com>
Thu, 30 Jul 2026 15:56:17 +0000 (17:56 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 12 Aug 2026 14:22:10 +0000 (10:22 -0400)
This should use actual number of references from the decode
message, instead of maximum derived from level.

Signed-off-by: David Rosca <david.rosca@amd.com>
Acked-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 64b525edb7e7bdfcdc77883c5e413804e2396856)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c

index 08b199518e22faa445b0103314c6f5a377488486..c29554e75e770ae0b0a0a958e65610d55004c8c9 100644 (file)
@@ -646,11 +646,9 @@ static int amdgpu_uvd_cs_msg_decode(struct amdgpu_device *adev, uint32_t *msg,
        unsigned int height = msg[7];
        unsigned int dpb_size = msg[9];
        unsigned int pitch = msg[28];
-       unsigned int level = msg[57];
 
        unsigned int width_in_mb = width / 16;
        unsigned int height_in_mb = ALIGN(height / 16, 2);
-       unsigned int fs_in_mb = width_in_mb * height_in_mb;
 
        unsigned int image_size, tmp, min_dpb_size, num_dpb_buffer;
        unsigned int min_ctx_size = ~0;
@@ -669,35 +667,9 @@ static int amdgpu_uvd_cs_msg_decode(struct amdgpu_device *adev, uint32_t *msg,
 
        switch (stream_type) {
        case 0: /* H264 */
-               switch (level) {
-               case 30:
-                       num_dpb_buffer = 8100 / fs_in_mb;
-                       break;
-               case 31:
-                       num_dpb_buffer = 18000 / fs_in_mb;
-                       break;
-               case 32:
-                       num_dpb_buffer = 20480 / fs_in_mb;
-                       break;
-               case 41:
-                       num_dpb_buffer = 32768 / fs_in_mb;
-                       break;
-               case 42:
-                       num_dpb_buffer = 34816 / fs_in_mb;
-                       break;
-               case 50:
-                       num_dpb_buffer = 110400 / fs_in_mb;
-                       break;
-               case 51:
-                       num_dpb_buffer = 184320 / fs_in_mb;
-                       break;
-               default:
-                       num_dpb_buffer = 184320 / fs_in_mb;
-                       break;
-               }
-               num_dpb_buffer++;
+               num_dpb_buffer = ((msg[61] >> 16) & 0xff) + 1;
                if (num_dpb_buffer > 17)
-                       num_dpb_buffer = 17;
+                       return -EINVAL;
 
                /* reference picture buffer */
                min_dpb_size = image_size * num_dpb_buffer;
@@ -747,35 +719,9 @@ static int amdgpu_uvd_cs_msg_decode(struct amdgpu_device *adev, uint32_t *msg,
                break;
 
        case 7: /* H264 Perf */
-               switch (level) {
-               case 30:
-                       num_dpb_buffer = 8100 / fs_in_mb;
-                       break;
-               case 31:
-                       num_dpb_buffer = 18000 / fs_in_mb;
-                       break;
-               case 32:
-                       num_dpb_buffer = 20480 / fs_in_mb;
-                       break;
-               case 41:
-                       num_dpb_buffer = 32768 / fs_in_mb;
-                       break;
-               case 42:
-                       num_dpb_buffer = 34816 / fs_in_mb;
-                       break;
-               case 50:
-                       num_dpb_buffer = 110400 / fs_in_mb;
-                       break;
-               case 51:
-                       num_dpb_buffer = 184320 / fs_in_mb;
-                       break;
-               default:
-                       num_dpb_buffer = 184320 / fs_in_mb;
-                       break;
-               }
-               num_dpb_buffer++;
+               num_dpb_buffer = ((msg[61] >> 16) & 0xff) + 1;
                if (num_dpb_buffer > 17)
-                       num_dpb_buffer = 17;
+                       return -EINVAL;
 
                /* reference picture buffer */
                min_dpb_size = image_size * num_dpb_buffer;