Commit c494e579 authored by Agustin Gutierrez's avatar Agustin Gutierrez Committed by Alex Deucher

Revert "drm/amd/display: Add helper for blanking all dp displays"

This reverts commit 1445d967.

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: default avatarAgustin Gutierrez <agustin.gutierrez@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e848c714
...@@ -1988,51 +1988,6 @@ static enum dc_status enable_link_dp_mst( ...@@ -1988,51 +1988,6 @@ static enum dc_status enable_link_dp_mst(
return enable_link_dp(state, pipe_ctx); 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, static bool get_ext_hdmi_settings(struct pipe_ctx *pipe_ctx,
enum engine_id eng_id, enum engine_id eng_id,
struct ext_hdmi_settings *settings) struct ext_hdmi_settings *settings)
......
...@@ -277,7 +277,6 @@ bool dc_link_setup_psr(struct dc_link *dc_link, ...@@ -277,7 +277,6 @@ bool dc_link_setup_psr(struct dc_link *dc_link,
struct psr_context *psr_context); struct psr_context *psr_context);
void dc_link_get_psr_residency(const struct dc_link *link, uint32_t *residency); 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. /* Request DC to detect if there is a Panel connected.
* boot - If this call is during initial boot. * boot - If this call is during initial boot.
......
...@@ -1649,13 +1649,31 @@ static enum dc_status apply_single_controller_ctx_to_hw( ...@@ -1649,13 +1649,31 @@ static enum dc_status apply_single_controller_ctx_to_hw(
static void power_down_encoders(struct dc *dc) static void power_down_encoders(struct dc *dc)
{ {
int i; int i, j;
blank_all_dp_displays(dc, false);
for (i = 0; i < dc->link_count; i++) { for (i = 0; i < dc->link_count; i++) {
enum signal_type signal = dc->links[i]->connector_signal; 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) if (signal != SIGNAL_TYPE_EDP)
signal = SIGNAL_TYPE_NONE; signal = SIGNAL_TYPE_NONE;
......
...@@ -1366,7 +1366,7 @@ void dcn10_init_pipes(struct dc *dc, struct dc_state *context) ...@@ -1366,7 +1366,7 @@ void dcn10_init_pipes(struct dc *dc, struct dc_state *context)
void dcn10_init_hw(struct dc *dc) void dcn10_init_hw(struct dc *dc)
{ {
int i; int i, j;
struct abm *abm = dc->res_pool->abm; struct abm *abm = dc->res_pool->abm;
struct dmcu *dmcu = dc->res_pool->dmcu; struct dmcu *dmcu = dc->res_pool->dmcu;
struct dce_hwseq *hws = dc->hwseq; struct dce_hwseq *hws = dc->hwseq;
...@@ -1462,8 +1462,43 @@ void dcn10_init_hw(struct dc *dc) ...@@ -1462,8 +1462,43 @@ void dcn10_init_hw(struct dc *dc)
dmub_enable_outbox_notification(dc); dmub_enable_outbox_notification(dc);
/* we want to turn off all dp displays before doing detection */ /* we want to turn off all dp displays before doing detection */
if (dc->config.power_down_display_on_boot) if (dc->config.power_down_display_on_boot) {
blank_all_dp_displays(dc, true); 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 /* 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 * mode set, so we need to skip powering down pipes until we know which
......
...@@ -437,7 +437,7 @@ void dcn30_init_hw(struct dc *dc) ...@@ -437,7 +437,7 @@ void dcn30_init_hw(struct dc *dc)
struct dce_hwseq *hws = dc->hwseq; struct dce_hwseq *hws = dc->hwseq;
struct dc_bios *dcb = dc->ctx->dc_bios; struct dc_bios *dcb = dc->ctx->dc_bios;
struct resource_pool *res_pool = dc->res_pool; struct resource_pool *res_pool = dc->res_pool;
int i; int i, j;
int edp_num; int edp_num;
uint32_t backlight = MAX_BACKLIGHT_LEVEL; uint32_t backlight = MAX_BACKLIGHT_LEVEL;
...@@ -534,8 +534,41 @@ void dcn30_init_hw(struct dc *dc) ...@@ -534,8 +534,41 @@ void dcn30_init_hw(struct dc *dc)
hws->funcs.dsc_pg_control(hws, res_pool->dscs[i]->inst, false); hws->funcs.dsc_pg_control(hws, res_pool->dscs[i]->inst, false);
/* we want to turn off all dp displays before doing detection */ /* we want to turn off all dp displays before doing detection */
if (dc->config.power_down_display_on_boot) if (dc->config.power_down_display_on_boot) {
blank_all_dp_displays(dc, true); 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 /* 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 * mode set, so we need to skip powering down pipes until we know which
......
...@@ -72,7 +72,7 @@ void dcn31_init_hw(struct dc *dc) ...@@ -72,7 +72,7 @@ void dcn31_init_hw(struct dc *dc)
struct dc_bios *dcb = dc->ctx->dc_bios; struct dc_bios *dcb = dc->ctx->dc_bios;
struct resource_pool *res_pool = dc->res_pool; struct resource_pool *res_pool = dc->res_pool;
uint32_t backlight = MAX_BACKLIGHT_LEVEL; uint32_t backlight = MAX_BACKLIGHT_LEVEL;
int i; int i, j;
if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks) if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)
dc->clk_mgr->funcs->init_clocks(dc->clk_mgr); dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);
...@@ -190,9 +190,40 @@ void dcn31_init_hw(struct dc *dc) ...@@ -190,9 +190,40 @@ void dcn31_init_hw(struct dc *dc)
dmub_enable_outbox_notification(dc); dmub_enable_outbox_notification(dc);
/* we want to turn off all dp displays before doing detection */ /* we want to turn off all dp displays before doing detection */
if (dc->config.power_down_display_on_boot) if (dc->config.power_down_display_on_boot) {
blank_all_dp_displays(dc, true); 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 /* 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 * mode set, so we need to skip powering down pipes until we know which
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment