]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/display: do not set RX back to SST mode for non 0 mst stream count
authorWenjing Liu <wenjing.liu@amd.com>
Mon, 30 Jan 2023 23:21:29 +0000 (18:21 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 14 Feb 2023 21:01:16 +0000 (16:01 -0500)
[why]
a recent regression has caused us to mistakenly switch RX back to SST mode
when there are remaining mst stream enabled to the link. We are missing
a condition check for stream count before setting RX back to SST mode.

[how]
Add stream count check condition back and do some further refactor so the
logic is easier to understand to prevent future coding error in this sequence.

Reviewed-by: Samson Tam <Samson.Tam@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@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>
drivers/gpu/drm/amd/display/dc/link/link_dpms.c
drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c
drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.h

index 0c26b3589608bba3f5c105ea5ec1bd300878af39..aa119a90cc5652a8ca5416203fe500fd38faef86 100644 (file)
@@ -1782,37 +1782,36 @@ enum dc_status link_increase_mst_payload(struct pipe_ctx *pipe_ctx, uint32_t bw_
        return DC_OK;
 }
 
-static void disable_link(struct dc_link *link, const struct link_resource *link_res,
+static void disable_link_dp(struct dc_link *link,
+               const struct link_resource *link_res,
                enum signal_type signal)
 {
-       /*
-        * TODO: implement call for dp_set_hw_test_pattern
-        * it is needed for compliance testing
-        */
+       struct dc_link_settings link_settings = link->cur_link_settings;
 
-       /* Here we need to specify that encoder output settings
-        * need to be calculated as for the set mode,
-        * it will lead to querying dynamic link capabilities
-        * which should be done before enable output
-        */
+       if (signal == SIGNAL_TYPE_DISPLAY_PORT_MST &&
+                       link->mst_stream_alloc_table.stream_count > 0)
+               /* disable MST link only when last vc payload is deallocated */
+               return;
 
+       dp_disable_link_phy(link, link_res, signal);
+
+       if (signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
+               /* set the sink to SST mode after disabling the link */
+               enable_mst_on_sink(link, false);
+
+       if (link_dp_get_encoding_format(&link_settings) ==
+                       DP_8b_10b_ENCODING) {
+               dp_set_fec_enable(link, false);
+               dp_set_fec_ready(link, link_res, false);
+       }
+}
+
+static void disable_link(struct dc_link *link,
+               const struct link_resource *link_res,
+               enum signal_type signal)
+{
        if (dc_is_dp_signal(signal)) {
-               /* SST DP, eDP */
-               struct dc_link_settings link_settings = link->cur_link_settings;
-               if (dc_is_dp_sst_signal(signal)) {
-                       dp_disable_link_phy(link, link_res, signal);
-               } else {
-                       dp_disable_link_phy_mst(link, link_res, signal);
-                       /* set the sink to SST mode after disabling the link */
-                       enable_mst_on_sink(link, false);
-               }
-               if (dc_is_dp_sst_signal(signal) ||
-                               link->mst_stream_alloc_table.stream_count == 0) {
-                       if (link_dp_get_encoding_format(&link_settings) == DP_8b_10b_ENCODING) {
-                               dp_set_fec_enable(link, false);
-                               dp_set_fec_ready(link, link_res, false);
-                       }
-               }
+               disable_link_dp(link, link_res, signal);
        } else if (signal != SIGNAL_TYPE_VIRTUAL) {
                link->dc->hwss.disable_link_output(link, link_res, signal);
        }
index ea3873dae3ad29a6c298f77be16e16e208238aa4..cd9fb8126bcf1a04265bf59df0dc5012af28c65c 100644 (file)
@@ -85,17 +85,6 @@ void dp_disable_link_phy(struct dc_link *link,
                dc->clk_mgr->funcs->notify_link_rate_change(dc->clk_mgr, link);
 }
 
-void dp_disable_link_phy_mst(struct dc_link *link,
-               const struct link_resource *link_res,
-               enum signal_type signal)
-{
-       /* MST disable link only when no stream use the link */
-       if (link->mst_stream_alloc_table.stream_count > 0)
-               return;
-
-       dp_disable_link_phy(link, link_res, signal);
-}
-
 static inline bool is_immediate_downstream(struct dc_link *link, uint32_t offset)
 {
        return (dp_parse_lttpr_repeater_count(link->dpcd_caps.lttpr_caps.phy_repeater_cnt) ==
index 6ce0b7958d51b6d33d79647edb77d20b8db316a2..dba1f29df319b137da7b9e85434f38a31d757e69 100644 (file)
@@ -38,10 +38,6 @@ void dp_disable_link_phy(struct dc_link *link,
                const struct link_resource *link_res,
                enum signal_type signal);
 
-void dp_disable_link_phy_mst(struct dc_link *link,
-               const struct link_resource *link_res,
-               enum signal_type signal);
-
 void dp_set_hw_lane_settings(
                struct dc_link *link,
                const struct link_resource *link_res,