From: Wenjing Liu <wenjing....@amd.com>

[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.dh...@amd.com>
Acked-by: Wayne Lin <wayne....@amd.com>
Signed-off-by: Wenjing Liu <wenjing....@amd.com>
---
 drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c | 30 ++++++++++++++++-----
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c 
b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
index 7c2d74f4efd8..db795b1a94f0 100644
--- a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
+++ b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
@@ -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;
 
-- 
2.37.3

Reply via email to