]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: take ODM slice count into account when deciding DSC slice
authorWenjing Liu <wenjing.liu@amd.com>
Fri, 12 Apr 2024 19:58:05 +0000 (15:58 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 30 Apr 2024 13:54:05 +0000 (09:54 -0400)
[why]
DSC slice must be divisible by ODM slice count.

[how]
If DSC slice count is not a multiple of ODM slice count, increase DSC
slice until it is. Otherwise fail to compute DSC configuration.

Reviewed-by: Chaitanya Dhere <chaitanya.dhere@amd.com>
Acked-by: Wayne Lin <wayne.lin@amd.com>
Signed-off-by: Wenjing Liu <wenjing.liu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c

index 80ed905ebfe6eab7846b09ac08dfe5348627a52b..dd7091628b3c7a9df2b694323f30e7fa654f7a81 100644 (file)
@@ -922,14 +922,30 @@ static bool setup_dsc_config(
                else
                        is_dsc_possible = false;
        }
-       // When we force 2:1 ODM, we can't have 1 slice to divide amongst 2 separate DSC instances
-       // need to enforce at minimum 2 horizontal slices
-       if (options->dsc_force_odm_hslice_override) {
-               num_slices_h = fit_num_slices_up(dsc_common_caps.slice_caps, 2);
-               if (num_slices_h == 0)
-                       is_dsc_possible = false;
+       // When we force ODM, num dsc h slices must be divisible by num odm h slices
+       switch (options->dsc_force_odm_hslice_override) {
+       case 0:
+       case 1:
+               break;
+       case 2:
+               if (num_slices_h < 2)
+                       num_slices_h = fit_num_slices_up(dsc_common_caps.slice_caps, 2);
+               break;
+       case 3:
+               if (dsc_common_caps.slice_caps.bits.NUM_SLICES_12)
+                       num_slices_h = 12;
+               else
+                       num_slices_h = 0;
+               break;
+       case 4:
+               if (num_slices_h < 4)
+                       num_slices_h = fit_num_slices_up(dsc_common_caps.slice_caps, 4);
+               break;
+       default:
+               break;
        }
-
+       if (num_slices_h == 0)
+               is_dsc_possible = false;
        if (!is_dsc_possible)
                goto done;