drm/amd/display: DSC policy override when ODM combine is forced
authorNasir Osman <nasir.osman@amd.com>
Thu, 30 Mar 2023 19:08:42 +0000 (15:08 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 18 Apr 2023 20:28:52 +0000 (16:28 -0400)
[why]
When we force ODM combine with DSC, we lose several
8 bit and 10 bit modes in validation and thus
not able to use HDR. This is due to the number of
horizontal slices used in DSC not properly being
accounted for currently when 2:1 ODM Combine is forced.

[how]
Enforce at least two horizontal slices are used for DSC when
ODM combine is forced.

Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Nasir Osman <nasir.osman@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/dc_dsc.h
drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c

index 0e92a32..9491b76 100644 (file)
@@ -58,6 +58,7 @@ struct dc_dsc_config_options {
        uint32_t dsc_min_slice_height_override;
        uint32_t max_target_bpp_limit_override_x16;
        uint32_t slice_height_granularity;
+       uint32_t dsc_force_odm_hslice_override;
 };
 
 bool dc_dsc_parse_dsc_dpcd(const struct dc *dc,
index 2bdc476..b9a05bb 100644 (file)
@@ -700,7 +700,7 @@ static int inc_num_slices(union dsc_enc_slice_caps slice_caps, int num_slices)
                }
        }
 
-       if (new_num_slices == num_slices) // No biger number of slices found
+       if (new_num_slices == num_slices) // No bigger number of slices found
                new_num_slices++;
 
        return new_num_slices;
@@ -952,6 +952,13 @@ 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;
+       }
 
        if (!is_dsc_possible)
                goto done;
@@ -1163,6 +1170,7 @@ void dc_dsc_policy_set_disable_dsc_stream_overhead(bool disable)
 void dc_dsc_get_default_config_option(const struct dc *dc, struct dc_dsc_config_options *options)
 {
        options->dsc_min_slice_height_override = dc->debug.dsc_min_slice_height_override;
+       options->dsc_force_odm_hslice_override = dc->debug.force_odm_combine;
        options->max_target_bpp_limit_override_x16 = 0;
        options->slice_height_granularity = 1;
 }