drm/amd/display: take ODM slice count into account when deciding DSC slice

[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>
This commit is contained in:
Wenjing Liu
2024-04-12 15:58:05 -04:00
committed by Alex Deucher
parent 6aa96aa8ff
commit 3d1967ec9b

View 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;