Merge tag 'amd-drm-next-5.20-2022-07-14' of https://gitlab.freedesktop.org/agd5f...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / amd / display / dc / core / dc_link_dp.c
index 710797b2f0df592f296a40e8501d8562f4b0ac70..dfc74aea2852a36cf11e46572f78d5ba86b3a321 100644 (file)
@@ -3880,15 +3880,13 @@ static bool decide_mst_link_settings(const struct dc_link *link, struct dc_link_
        return true;
 }
 
-void decide_link_settings(struct dc_stream_state *stream,
+bool decide_link_settings(struct dc_stream_state *stream,
        struct dc_link_settings *link_setting)
 {
-       struct dc_link *link;
-       uint32_t req_bw;
-
-       req_bw = dc_bandwidth_in_kbps_from_timing(&stream->timing);
+       struct dc_link *link = stream->link;
+       uint32_t req_bw = dc_bandwidth_in_kbps_from_timing(&stream->timing);
 
-       link = stream->link;
+       memset(link_setting, 0, sizeof(*link_setting));
 
        /* if preferred is specified through AMDDP, use it, if it's enough
         * to drive the mode
@@ -3897,16 +3895,15 @@ void decide_link_settings(struct dc_stream_state *stream,
                        LANE_COUNT_UNKNOWN &&
                        link->preferred_link_setting.link_rate !=
                                        LINK_RATE_UNKNOWN) {
-               *link_setting =  link->preferred_link_setting;
-               return;
+               *link_setting = link->preferred_link_setting;
+               return true;
        }
 
        /* MST doesn't perform link training for now
         * TODO: add MST specific link training routine
         */
        if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
-               if (decide_mst_link_settings(link, link_setting))
-                       return;
+               decide_mst_link_settings(link, link_setting);
        } else if (link->connector_signal == SIGNAL_TYPE_EDP) {
                /* enable edp link optimization for DSC eDP case */
                if (stream->timing.flags.DSC) {
@@ -3924,17 +3921,16 @@ void decide_link_settings(struct dc_stream_state *stream,
                                decide_edp_link_settings(link, &tmp_link_setting, orig_req_bw);
                                max_link_rate = tmp_link_setting.link_rate;
                        }
-                       if (decide_edp_link_settings_with_dsc(link, link_setting, req_bw, max_link_rate))
-                               return;
-               } else if (decide_edp_link_settings(link, link_setting, req_bw))
-                       return;
-       } else if (decide_dp_link_settings(link, link_setting, req_bw))
-               return;
-
-       BREAK_TO_DEBUGGER();
-       ASSERT(link->verified_link_cap.lane_count != LANE_COUNT_UNKNOWN);
+                       decide_edp_link_settings_with_dsc(link, link_setting, req_bw, max_link_rate);
+               } else {
+                       decide_edp_link_settings(link, link_setting, req_bw);
+               }
+       } else {
+               decide_dp_link_settings(link, link_setting, req_bw);
+       }
 
-       *link_setting = link->verified_link_cap;
+       return link_setting->lane_count != LANE_COUNT_UNKNOWN &&
+                       link_setting->link_rate != LINK_RATE_UNKNOWN;
 }
 
 /*************************Short Pulse IRQ***************************/
@@ -4509,7 +4505,6 @@ void dc_link_dp_handle_link_loss(struct dc_link *link)
 {
        int i;
        struct pipe_ctx *pipe_ctx;
-       struct dc_link_settings prev_link_settings = link->preferred_link_setting;
 
        for (i = 0; i < MAX_PIPES; i++) {
                pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i];
@@ -4520,10 +4515,6 @@ void dc_link_dp_handle_link_loss(struct dc_link *link)
        if (pipe_ctx == NULL || pipe_ctx->stream == NULL)
                return;
 
-       /* toggle stream state with the preference for current link settings */
-       dc_link_set_preferred_training_settings((struct dc *)link->dc,
-                                       &link->cur_link_settings, NULL, link, true);
-
        for (i = 0; i < MAX_PIPES; i++) {
                pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i];
                if (pipe_ctx && pipe_ctx->stream && !pipe_ctx->stream->dpms_off &&
@@ -4539,10 +4530,6 @@ void dc_link_dp_handle_link_loss(struct dc_link *link)
                        core_link_enable_stream(link->dc->current_state, pipe_ctx);
                }
        }
-
-       /* restore previous link settings preference */
-       dc_link_set_preferred_training_settings((struct dc *)link->dc,
-                                       &prev_link_settings, NULL, link, true);
 }
 
 bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd_irq_dpcd_data, bool *out_link_loss,
@@ -4890,7 +4877,7 @@ static void get_active_converter_info(
                                                        hdmi_color_caps.bits.MAX_BITS_PER_COLOR_COMPONENT);
 
 #if defined(CONFIG_DRM_AMD_DC_DCN)
-                                       if (link->dc->caps.hdmi_frl_pcon_support) {
+                                       if (link->dc->caps.dp_hdmi21_pcon_support) {
                                                union hdmi_encoded_link_bw hdmi_encoded_link_bw;
 
                                                link->dpcd_caps.dongle_caps.dp_hdmi_frl_max_link_bw_in_kbps =
@@ -5553,7 +5540,7 @@ static bool retrieve_link_cap(struct dc_link *link)
                 * only if required.
                 */
                if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA &&
-                               !link->dc->debug.dpia_debug.bits.disable_force_tbt3_work_around &&
+                               link->dc->debug.dpia_debug.bits.enable_force_tbt3_work_around &&
                                link->dpcd_caps.is_branch_dev &&
                                link->dpcd_caps.branch_dev_id == DP_BRANCH_DEVICE_ID_90CC24 &&
                                link->dpcd_caps.branch_hw_revision == DP_BRANCH_HW_REV_10 &&
@@ -6971,13 +6958,14 @@ bool is_dp_128b_132b_signal(struct pipe_ctx *pipe_ctx)
                        dc_is_dp_signal(pipe_ctx->stream->signal));
 }
 
-void edp_panel_backlight_power_on(struct dc_link *link)
+void edp_panel_backlight_power_on(struct dc_link *link, bool wait_for_hpd)
 {
        if (link->connector_signal != SIGNAL_TYPE_EDP)
                return;
 
        link->dc->hwss.edp_power_control(link, true);
-       link->dc->hwss.edp_wait_for_hpd_ready(link, true);
+       if (wait_for_hpd)
+               link->dc->hwss.edp_wait_for_hpd_ready(link, true);
        if (link->dc->hwss.edp_backlight_control)
                link->dc->hwss.edp_backlight_control(link, true);
 }