From: Nasir Osman <nasir.os...@amd.com>

[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.kazlaus...@amd.com>
Acked-by: Qingqing Zhuo <qingqing.z...@amd.com>
Signed-off-by: Nasir Osman <nasir.os...@amd.com>
---
 drivers/gpu/drm/amd/display/dc/dc_dsc.h     |  1 +
 drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c | 10 +++++++++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dc_dsc.h 
b/drivers/gpu/drm/amd/display/dc/dc_dsc.h
index 0e92a322c2ed..9491b76d61f5 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_dsc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_dsc.h
@@ -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,
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 2bdc47615543..b9a05bb025db 100644
--- a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
+++ b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
@@ -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;
 }
-- 
2.34.1

Reply via email to