From: Relja Vojvodic <[email protected]>

- Reworked YCbCr4:2:2 Native/Simple policy decision making with DSC
enabled based on DSC caps and stream signal type

Reviewed-by: Wenjing Liu <[email protected]>
Signed-off-by: Relja Vojvodic <[email protected]>
Signed-off-by: Chuanyu Tseng <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/dc.h                 |  2 +-
 drivers/gpu/drm/amd/display/dc/dc_dsc.h             |  1 +
 .../amd/display/dc/dml2_0/dml2_translation_helper.c |  6 +++---
 drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c         | 13 ++++++-------
 .../gpu/drm/amd/display/dc/dsc/dcn20/dcn20_dsc.c    |  2 +-
 .../gpu/drm/amd/display/dc/dsc/dcn35/dcn35_dsc.c    |  2 +-
 .../gpu/drm/amd/display/dc/dsc/dcn401/dcn401_dsc.c  |  2 +-
 .../gpu/drm/amd/display/dc/link/link_detection.c    | 10 +++++-----
 drivers/gpu/drm/amd/display/dc/link/link_dpms.c     |  3 ++-
 .../amd/display/dc/resource/dcn31/dcn31_resource.c  |  2 ++
 .../display/dc/resource/dcn315/dcn315_resource.c    |  2 ++
 11 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dc.h 
b/drivers/gpu/drm/amd/display/dc/dc.h
index 1dd0a2cf786c..2bb4c7751c01 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -563,6 +563,7 @@ struct dc_config {
        bool frame_update_cmd_version2;
        struct spl_sharpness_range dcn_sharpness_range;
        struct spl_sharpness_range dcn_override_sharpness_range;
+       bool no_native422_support;
 };
 
 enum visual_confirm {
@@ -987,7 +988,6 @@ struct link_service;
  * causing an issue or not.
  */
 struct dc_debug_options {
-       bool native422_support;
        bool disable_dsc;
        enum visual_confirm visual_confirm;
        int visual_confirm_rect_height;
diff --git a/drivers/gpu/drm/amd/display/dc/dc_dsc.h 
b/drivers/gpu/drm/amd/display/dc/dc_dsc.h
index 9d18f1c08079..101bce6b8de6 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_dsc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_dsc.h
@@ -52,6 +52,7 @@ struct dc_dsc_policy {
        uint32_t max_target_bpp;
        uint32_t min_target_bpp;
        bool enable_dsc_when_not_needed;
+       bool ycbcr422_simple;
 };
 
 struct dc_dsc_config_options {
diff --git a/drivers/gpu/drm/amd/display/dc/dml2_0/dml2_translation_helper.c 
b/drivers/gpu/drm/amd/display/dc/dml2_0/dml2_translation_helper.c
index d834cb595afa..e25b88f2d6b9 100644
--- a/drivers/gpu/drm/amd/display/dc/dml2_0/dml2_translation_helper.c
+++ b/drivers/gpu/drm/amd/display/dc/dml2_0/dml2_translation_helper.c
@@ -1174,12 +1174,12 @@ static unsigned int map_plane_to_dml_display_cfg(const 
struct dml2_context *dml2
                const struct dc_state *context, const struct dml_display_cfg_st 
*dml_dispcfg, unsigned int stream_id, int plane_index)
 {
        unsigned int plane_id;
-       int i = 0;
-       int location = -1;
+       unsigned int i = 0;
+       unsigned int location = UINT_MAX;
 
        if (!get_plane_id(context->bw_ctx.dml2, context, plane, stream_id, 
plane_index, &plane_id)) {
                ASSERT(false);
-               return -1;
+               return UINT_MAX;
        }
 
        for (i = 0; i < __DML2_WRAPPER_MAX_STREAMS_PLANES__; i++) {
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 5b3584ad5b6b..8dfb6dd14eb2 100644
--- a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
+++ b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
@@ -680,9 +680,6 @@ static void get_dsc_enc_caps(
        } else {
                build_dsc_enc_caps(dsc, dsc_enc_caps);
        }
-
-       if (dsc->ctx->dc->debug.native422_support)
-               dsc_enc_caps->color_formats.bits.YCBCR_NATIVE_422 = 1;
 }
 
 /* Returns 'false' if no intersection was found for at least one capability.
@@ -1100,13 +1097,14 @@ static bool setup_dsc_config(
                branch_max_throughput_mps = 
dsc_sink_caps->branch_overall_throughput_0_mps;
                break;
        case PIXEL_ENCODING_YCBCR422:
-               is_dsc_possible = 
(bool)dsc_common_caps.color_formats.bits.YCBCR_NATIVE_422;
-               sink_per_slice_throughput_mps = 
dsc_sink_caps->throughput_mode_1_mps;
-               branch_max_throughput_mps = 
dsc_sink_caps->branch_overall_throughput_1_mps;
-               if (!is_dsc_possible) {
+               if (policy.ycbcr422_simple) {
                        is_dsc_possible = 
(bool)dsc_common_caps.color_formats.bits.YCBCR_SIMPLE_422;
                        dsc_cfg->ycbcr422_simple = is_dsc_possible;
                        sink_per_slice_throughput_mps = 
dsc_sink_caps->throughput_mode_0_mps;
+               } else {
+                       is_dsc_possible = 
(bool)dsc_common_caps.color_formats.bits.YCBCR_NATIVE_422;
+                       sink_per_slice_throughput_mps = 
dsc_sink_caps->throughput_mode_1_mps;
+                       branch_max_throughput_mps = 
dsc_sink_caps->branch_overall_throughput_1_mps;
                }
                break;
        case PIXEL_ENCODING_YCBCR420:
@@ -1406,6 +1404,7 @@ void dc_dsc_get_policy_for_timing(const struct 
dc_crtc_timing *timing,
                policy->min_target_bpp = 8;
                /* DP specs limits to 3 x bpc */
                policy->max_target_bpp = 3 * bpc;
+               policy->ycbcr422_simple = true;
                break;
        case PIXEL_ENCODING_YCBCR420:
                /* DP specs limits to 6 */
diff --git a/drivers/gpu/drm/amd/display/dc/dsc/dcn20/dcn20_dsc.c 
b/drivers/gpu/drm/amd/display/dc/dsc/dcn20/dcn20_dsc.c
index 242f1e6f0d8f..6e1e759462bf 100644
--- a/drivers/gpu/drm/amd/display/dc/dsc/dcn20/dcn20_dsc.c
+++ b/drivers/gpu/drm/amd/display/dc/dsc/dcn20/dcn20_dsc.c
@@ -100,7 +100,7 @@ void dsc2_get_enc_caps(struct dsc_enc_caps *dsc_enc_caps, 
int pixel_clock_100Hz)
        dsc_enc_caps->color_formats.bits.RGB = 1;
        dsc_enc_caps->color_formats.bits.YCBCR_444 = 1;
        dsc_enc_caps->color_formats.bits.YCBCR_SIMPLE_422 = 1;
-       dsc_enc_caps->color_formats.bits.YCBCR_NATIVE_422 = 0;
+       dsc_enc_caps->color_formats.bits.YCBCR_NATIVE_422 = 1;
        dsc_enc_caps->color_formats.bits.YCBCR_NATIVE_420 = 1;
 
        dsc_enc_caps->color_depth.bits.COLOR_DEPTH_8_BPC = 1;
diff --git a/drivers/gpu/drm/amd/display/dc/dsc/dcn35/dcn35_dsc.c 
b/drivers/gpu/drm/amd/display/dc/dsc/dcn35/dcn35_dsc.c
index e712985f7abd..17acb64a9d80 100644
--- a/drivers/gpu/drm/amd/display/dc/dsc/dcn35/dcn35_dsc.c
+++ b/drivers/gpu/drm/amd/display/dc/dsc/dcn35/dcn35_dsc.c
@@ -128,7 +128,7 @@ void dsc35_get_single_enc_caps(struct dsc_enc_caps 
*dsc_enc_caps, unsigned int m
        dsc_enc_caps->color_formats.bits.RGB = 1;
        dsc_enc_caps->color_formats.bits.YCBCR_444 = 1;
        dsc_enc_caps->color_formats.bits.YCBCR_SIMPLE_422 = 1;
-       dsc_enc_caps->color_formats.bits.YCBCR_NATIVE_422 = 0;
+       dsc_enc_caps->color_formats.bits.YCBCR_NATIVE_422 = 1;
        dsc_enc_caps->color_formats.bits.YCBCR_NATIVE_420 = 1;
 
        dsc_enc_caps->color_depth.bits.COLOR_DEPTH_8_BPC = 1;
diff --git a/drivers/gpu/drm/amd/display/dc/dsc/dcn401/dcn401_dsc.c 
b/drivers/gpu/drm/amd/display/dc/dsc/dcn401/dcn401_dsc.c
index c1bdbb38c690..bbb8b5b18a4e 100644
--- a/drivers/gpu/drm/amd/display/dc/dsc/dcn401/dcn401_dsc.c
+++ b/drivers/gpu/drm/amd/display/dc/dsc/dcn401/dcn401_dsc.c
@@ -78,7 +78,7 @@ static void dsc401_get_single_enc_caps(struct dsc_enc_caps 
*dsc_enc_caps, unsign
        dsc_enc_caps->color_formats.bits.RGB = 1;
        dsc_enc_caps->color_formats.bits.YCBCR_444 = 1;
        dsc_enc_caps->color_formats.bits.YCBCR_SIMPLE_422 = 1;
-       dsc_enc_caps->color_formats.bits.YCBCR_NATIVE_422 = 0;
+       dsc_enc_caps->color_formats.bits.YCBCR_NATIVE_422 = 1;
        dsc_enc_caps->color_formats.bits.YCBCR_NATIVE_420 = 1;
 
        dsc_enc_caps->color_depth.bits.COLOR_DEPTH_8_BPC = 1;
diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.c 
b/drivers/gpu/drm/amd/display/dc/link/link_detection.c
index f992c2d16748..7f1761080aba 100644
--- a/drivers/gpu/drm/amd/display/dc/link/link_detection.c
+++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.c
@@ -781,7 +781,6 @@ static void 
restore_phy_clocks_for_destructive_link_verification(const struct dc
 }
 
 static void verify_link_capability_destructive(struct dc_link *link,
-               struct dc_sink *sink,
                enum dc_detect_reason reason)
 {
        bool should_prepare_phy_clocks =
@@ -855,11 +854,11 @@ static bool 
should_verify_link_capability_destructively(struct dc_link *link,
        return destrictive;
 }
 
-static void verify_link_capability(struct dc_link *link, struct dc_sink *sink,
+static void verify_link_capability(struct dc_link *link,
                enum dc_detect_reason reason)
 {
        if (should_verify_link_capability_destructively(link, reason))
-               verify_link_capability_destructive(link, sink, reason);
+               verify_link_capability_destructive(link, reason);
        else
                verify_link_capability_non_destructive(link);
 }
@@ -1453,8 +1452,9 @@ bool link_detect(struct dc_link *link, enum 
dc_detect_reason reason)
 
        is_local_sink_detect_success = detect_link_and_local_sink(link, reason);
 
-       if (is_local_sink_detect_success && link->local_sink)
-               verify_link_capability(link, link->local_sink, reason);
+       if (is_local_sink_detect_success && link->local_sink) {
+               verify_link_capability(link, reason);
+       }
 
        DC_LOG_DC("%s: link_index=%d is_local_sink_detect_success=%d 
pre_link_type=%d link_type=%d\n", __func__,
                                link->link_index, is_local_sink_detect_success, 
pre_link_type, link->type);
diff --git a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c 
b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c
index b4f46408a000..e12c25896364 100644
--- a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c
+++ b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c
@@ -181,7 +181,8 @@ void link_set_all_streams_dpms_off_for_link(struct dc_link 
*link)
        /* link can be also enabled by vbios. In this case it is not recorded
         * in pipe_ctx. Disable link phy here to make sure it is completely off
         */
-       dp_disable_link_phy(link, &link_res, link->connector_signal);
+       if (dc_is_dp_signal(link->connector_signal))
+               dp_disable_link_phy(link, &link_res, link->connector_signal);
 }
 
 void link_resume(struct dc_link *link)
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c
index a064d1fbce52..95c7ecdb3496 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c
@@ -1967,6 +1967,8 @@ static bool dcn31_resource_construct(
        dc->config.use_pipe_ctx_sync_logic = true;
        dc->config.disable_hbr_audio_dp2 = true;
 
+       dc->config.no_native422_support = true;
+
        /* read VBIOS LTTPR caps */
        {
                if (ctx->dc_bios->funcs->get_lttpr_caps) {
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c 
b/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c
index 67102b4c881f..e488fa6f32e6 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c
@@ -1929,6 +1929,8 @@ static bool dcn315_resource_construct(
        dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
        dc->caps.color.mpc.ocsc = 1;
 
+       dc->config.no_native422_support = true;
+
        /* read VBIOS LTTPR caps */
        {
                if (ctx->dc_bios->funcs->get_lttpr_caps) {
-- 
2.43.0

Reply via email to