[PATCH 27/27] Revert "drm/amd/display: Add helper for blanking all dp displays"
Paul Menzel
pmenzel at molgen.mpg.de
Mon Oct 18 23:25:13 UTC 2021
Dear Augustin,
Am 15.10.21 um 20:43 schrieb Agustin Gutierrez:
> This reverts commit 50ac5b14c74c5706796cb6378f25a2121dba5b2d.
>
> This patch introduced a couple of dmesg warnings,
Please give one example warning for people searching through the git
history.
> this is not a valid approach anymore.
Nit: Please make it it’s own sentence.
> For this reason, we are reverting this patch, and we need to revert
> the workaround patch.
What is the workaround patch?
Kind regards,
Paul
> Cc: Hanghong Ma <hanghong.ma at amd.com>
> Cc: Mark Broadworth <mark.broadworth at amd.com>
> Signed-off-by: Agustin Gutierrez <agustin.gutierrez at amd.com>
> ---
> drivers/gpu/drm/amd/display/dc/core/dc_link.c | 45 -------------------
> drivers/gpu/drm/amd/display/dc/dc_link.h | 1 -
> .../display/dc/dce110/dce110_hw_sequencer.c | 24 ++++++++--
> .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 41 +++++++++++++++--
> .../drm/amd/display/dc/dcn30/dcn30_hwseq.c | 39 ++++++++++++++--
> .../drm/amd/display/dc/dcn31/dcn31_hwseq.c | 40 +++++++++++++++--
> 6 files changed, 131 insertions(+), 59 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
> index c01309a1cbf2..e5d6cbd7ea78 100644
> --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
> +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
> @@ -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)
> diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h
> index 69b008bafbbc..a73d64b1fd33 100644
> --- a/drivers/gpu/drm/amd/display/dc/dc_link.h
> +++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
> @@ -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.
> diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
> index 8108f9ae2638..af3e68d3e747 100644
> --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
> +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
> @@ -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;
>
> diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
> index aa2d430f2a1a..44d27579d898 100644
> --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
> +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
> @@ -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
> diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
> index 2936a334cd64..df2717116604 100644
> --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
> +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
> @@ -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
> diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
> index 186d08aec812..7308c4c744ba 100644
> --- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
> +++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
> @@ -72,7 +72,8 @@ 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;
> + int edp_num;
>
> if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)
> dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);
> @@ -190,9 +191,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
>
More information about the amd-gfx
mailing list