OSDN Git Service

Revert "drm/amd/display: Add helper for blanking all dp displays"
authorAgustin Gutierrez <agustin.gutierrez@amd.com>
Fri, 15 Oct 2021 18:05:19 +0000 (14:05 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 19 Oct 2021 21:32:51 +0000 (17:32 -0400)
This reverts commit 1445d967fb915156aed0e79ca80c239cb2d414ce.

This patch introduced a couple of dmesg warnings, this is not a valid
approach anymore. For this reason, we are reverting this patch, and we
need to revert the workaround patch.

v2: squash in unused variable removal (Alex)

Cc: Hanghong Ma <hanghong.ma@amd.com>
Cc: Mark Broadworth <mark.broadworth@amd.com>
Signed-off-by: Agustin Gutierrez <agustin.gutierrez@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link.c
drivers/gpu/drm/amd/display/dc/dc_link.h
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c

index c01309a..e5d6cbd 100644 (file)
@@ -1988,51 +1988,6 @@ static enum dc_status enable_link_dp_mst(
        return enable_link_dp(state, pipe_ctx);
 }
 
-void blank_all_dp_displays(struct dc *dc, bool hw_init)
-{
-       unsigned int i, j, fe;
-       uint8_t dpcd_power_state = '\0';
-       enum dc_status status = DC_ERROR_UNEXPECTED;
-
-       for (i = 0; i < dc->link_count; i++) {
-               enum signal_type signal = dc->links[i]->connector_signal;
-
-               if ((signal == SIGNAL_TYPE_EDP) ||
-                       (signal == SIGNAL_TYPE_DISPLAY_PORT)) {
-                       if (hw_init && signal != SIGNAL_TYPE_EDP) {
-                               /* DP 2.0 spec requires that we read LTTPR caps first */
-                               dp_retrieve_lttpr_cap(dc->links[i]);
-                               /* if any of the displays are lit up turn them off */
-                               status = core_link_read_dpcd(dc->links[i], DP_SET_POWER,
-                                                       &dpcd_power_state, sizeof(dpcd_power_state));
-                       }
-
-                       if ((signal != SIGNAL_TYPE_EDP && status == DC_OK && dpcd_power_state == DP_POWER_STATE_D0) ||
-                                       (!hw_init && dc->links[i]->link_enc &&
-                                       dc->links[i]->link_enc->funcs->is_dig_enabled(dc->links[i]->link_enc))) {
-                               if (dc->links[i]->link_enc->funcs->get_dig_frontend) {
-                                       fe = dc->links[i]->link_enc->funcs->get_dig_frontend(dc->links[i]->link_enc);
-                                       if (fe == ENGINE_ID_UNKNOWN)
-                                               continue;
-
-                                       for (j = 0; j < dc->res_pool->stream_enc_count; j++) {
-                                               if (fe == dc->res_pool->stream_enc[j]->id) {
-                                                       dc->res_pool->stream_enc[j]->funcs->dp_blank(dc->links[i],
-                                                                       dc->res_pool->stream_enc[j]);
-                                                       break;
-                                               }
-                                       }
-                               }
-
-                               if (!dc->links[i]->wa_flags.dp_keep_receiver_powered ||
-                                       (hw_init && signal != SIGNAL_TYPE_EDP))
-                                       dp_receiver_power_ctrl(dc->links[i], false);
-                       }
-               }
-       }
-
-}
-
 static bool get_ext_hdmi_settings(struct pipe_ctx *pipe_ctx,
                enum engine_id eng_id,
                struct ext_hdmi_settings *settings)
index 69b008b..a73d64b 100644 (file)
@@ -277,7 +277,6 @@ bool dc_link_setup_psr(struct dc_link *dc_link,
                struct psr_context *psr_context);
 
 void dc_link_get_psr_residency(const struct dc_link *link, uint32_t *residency);
-void blank_all_dp_displays(struct dc *dc, bool hw_init);
 
 /* Request DC to detect if there is a Panel connected.
  * boot - If this call is during initial boot.
index 8108f9a..af3e68d 100644 (file)
@@ -1649,13 +1649,31 @@ static enum dc_status apply_single_controller_ctx_to_hw(
 
 static void power_down_encoders(struct dc *dc)
 {
-       int i;
-
-       blank_all_dp_displays(dc, false);
+       int i, j;
 
        for (i = 0; i < dc->link_count; i++) {
                enum signal_type signal = dc->links[i]->connector_signal;
 
+               if ((signal == SIGNAL_TYPE_EDP) ||
+                       (signal == SIGNAL_TYPE_DISPLAY_PORT)) {
+                       if (dc->links[i]->link_enc->funcs->get_dig_frontend &&
+                               dc->links[i]->link_enc->funcs->is_dig_enabled(dc->links[i]->link_enc)) {
+                               unsigned int fe = dc->links[i]->link_enc->funcs->get_dig_frontend(
+                                                                       dc->links[i]->link_enc);
+
+                               for (j = 0; j < dc->res_pool->stream_enc_count; j++) {
+                                       if (fe == dc->res_pool->stream_enc[j]->id) {
+                                               dc->res_pool->stream_enc[j]->funcs->dp_blank(dc->links[i],
+                                                                       dc->res_pool->stream_enc[j]);
+                                               break;
+                                       }
+                               }
+                       }
+
+                       if (!dc->links[i]->wa_flags.dp_keep_receiver_powered)
+                               dp_receiver_power_ctrl(dc->links[i], false);
+               }
+
                if (signal != SIGNAL_TYPE_EDP)
                        signal = SIGNAL_TYPE_NONE;
 
index aa2d430..44d2757 100644 (file)
@@ -1366,7 +1366,7 @@ void dcn10_init_pipes(struct dc *dc, struct dc_state *context)
 
 void dcn10_init_hw(struct dc *dc)
 {
-       int i;
+       int i, j;
        struct abm *abm = dc->res_pool->abm;
        struct dmcu *dmcu = dc->res_pool->dmcu;
        struct dce_hwseq *hws = dc->hwseq;
@@ -1462,8 +1462,43 @@ void dcn10_init_hw(struct dc *dc)
                dmub_enable_outbox_notification(dc);
 
        /* we want to turn off all dp displays before doing detection */
-       if (dc->config.power_down_display_on_boot)
-               blank_all_dp_displays(dc, true);
+       if (dc->config.power_down_display_on_boot) {
+               uint8_t dpcd_power_state = '\0';
+               enum dc_status status = DC_ERROR_UNEXPECTED;
+
+               for (i = 0; i < dc->link_count; i++) {
+                       if (dc->links[i]->connector_signal != SIGNAL_TYPE_DISPLAY_PORT)
+                               continue;
+
+                       /* DP 2.0 requires that LTTPR Caps be read first */
+                       dp_retrieve_lttpr_cap(dc->links[i]);
+
+                       /*
+                        * If any of the displays are lit up turn them off.
+                        * The reason is that some MST hubs cannot be turned off
+                        * completely until we tell them to do so.
+                        * If not turned off, then displays connected to MST hub
+                        * won't light up.
+                        */
+                       status = core_link_read_dpcd(dc->links[i], DP_SET_POWER,
+                                                       &dpcd_power_state, sizeof(dpcd_power_state));
+                       if (status == DC_OK && dpcd_power_state == DP_POWER_STATE_D0) {
+                               /* blank dp stream before power off receiver*/
+                               if (dc->links[i]->link_enc->funcs->get_dig_frontend) {
+                                       unsigned int fe = dc->links[i]->link_enc->funcs->get_dig_frontend(dc->links[i]->link_enc);
+
+                                       for (j = 0; j < dc->res_pool->stream_enc_count; j++) {
+                                               if (fe == dc->res_pool->stream_enc[j]->id) {
+                                                       dc->res_pool->stream_enc[j]->funcs->dp_blank(dc->links[i],
+                                                                               dc->res_pool->stream_enc[j]);
+                                                       break;
+                                               }
+                                       }
+                               }
+                               dp_receiver_power_ctrl(dc->links[i], false);
+                       }
+               }
+       }
 
        /* If taking control over from VBIOS, we may want to optimize our first
         * mode set, so we need to skip powering down pipes until we know which
index 2936a33..df27171 100644 (file)
@@ -437,7 +437,7 @@ void dcn30_init_hw(struct dc *dc)
        struct dce_hwseq *hws = dc->hwseq;
        struct dc_bios *dcb = dc->ctx->dc_bios;
        struct resource_pool *res_pool = dc->res_pool;
-       int i;
+       int i, j;
        int edp_num;
        uint32_t backlight = MAX_BACKLIGHT_LEVEL;
 
@@ -534,8 +534,41 @@ void dcn30_init_hw(struct dc *dc)
                        hws->funcs.dsc_pg_control(hws, res_pool->dscs[i]->inst, false);
 
        /* we want to turn off all dp displays before doing detection */
-       if (dc->config.power_down_display_on_boot)
-               blank_all_dp_displays(dc, true);
+       if (dc->config.power_down_display_on_boot) {
+               uint8_t dpcd_power_state = '\0';
+               enum dc_status status = DC_ERROR_UNEXPECTED;
+
+               for (i = 0; i < dc->link_count; i++) {
+                       if (dc->links[i]->connector_signal != SIGNAL_TYPE_DISPLAY_PORT)
+                               continue;
+                       /* DP 2.0 states that LTTPR regs must be read first */
+                       dp_retrieve_lttpr_cap(dc->links[i]);
+
+                       /* if any of the displays are lit up turn them off */
+                       status = core_link_read_dpcd(dc->links[i], DP_SET_POWER,
+                                                    &dpcd_power_state, sizeof(dpcd_power_state));
+                       if (status == DC_OK && dpcd_power_state == DP_POWER_STATE_D0) {
+                               /* blank dp stream before power off receiver*/
+                               if (dc->links[i]->link_enc->funcs->get_dig_frontend) {
+                                       unsigned int fe;
+
+                                       fe = dc->links[i]->link_enc->funcs->get_dig_frontend(
+                                                                               dc->links[i]->link_enc);
+                                       if (fe == ENGINE_ID_UNKNOWN)
+                                               continue;
+
+                                       for (j = 0; j < dc->res_pool->stream_enc_count; j++) {
+                                               if (fe == dc->res_pool->stream_enc[j]->id) {
+                                                       dc->res_pool->stream_enc[j]->funcs->dp_blank(dc->links[i],
+                                                                               dc->res_pool->stream_enc[j]);
+                                                       break;
+                                               }
+                                       }
+                               }
+                               dp_receiver_power_ctrl(dc->links[i], false);
+                       }
+               }
+       }
 
        /* If taking control over from VBIOS, we may want to optimize our first
         * mode set, so we need to skip powering down pipes until we know which
index 186d08a..9a6ad1c 100644 (file)
@@ -72,7 +72,7 @@ void dcn31_init_hw(struct dc *dc)
        struct dc_bios *dcb = dc->ctx->dc_bios;
        struct resource_pool *res_pool = dc->res_pool;
        uint32_t backlight = MAX_BACKLIGHT_LEVEL;
-       int i;
+       int i, j;
 
        if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)
                dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);
@@ -190,9 +190,40 @@ void dcn31_init_hw(struct dc *dc)
                dmub_enable_outbox_notification(dc);
 
        /* we want to turn off all dp displays before doing detection */
-       if (dc->config.power_down_display_on_boot)
-               blank_all_dp_displays(dc, true);
-
+       if (dc->config.power_down_display_on_boot) {
+               uint8_t dpcd_power_state = '\0';
+               enum dc_status status = DC_ERROR_UNEXPECTED;
+
+               for (i = 0; i < dc->link_count; i++) {
+                       if (dc->links[i]->connector_signal != SIGNAL_TYPE_DISPLAY_PORT)
+                               continue;
+
+                       /* if any of the displays are lit up turn them off */
+                       status = core_link_read_dpcd(dc->links[i], DP_SET_POWER,
+                                                    &dpcd_power_state, sizeof(dpcd_power_state));
+                       if (status == DC_OK && dpcd_power_state == DP_POWER_STATE_D0) {
+                               /* blank dp stream before power off receiver*/
+                               if (dc->links[i]->ep_type == DISPLAY_ENDPOINT_PHY &&
+                                               dc->links[i]->link_enc->funcs->get_dig_frontend) {
+                                       unsigned int fe;
+
+                                       fe = dc->links[i]->link_enc->funcs->get_dig_frontend(
+                                                                               dc->links[i]->link_enc);
+                                       if (fe == ENGINE_ID_UNKNOWN)
+                                               continue;
+
+                                       for (j = 0; j < dc->res_pool->stream_enc_count; j++) {
+                                               if (fe == dc->res_pool->stream_enc[j]->id) {
+                                                       dc->res_pool->stream_enc[j]->funcs->dp_blank(dc->links[i],
+                                                                               dc->res_pool->stream_enc[j]);
+                                                       break;
+                                               }
+                                       }
+                               }
+                               dp_receiver_power_ctrl(dc->links[i], false);
+                       }
+               }
+       }
 
        /* If taking control over from VBIOS, we may want to optimize our first
         * mode set, so we need to skip powering down pipes until we know which