Commit 069d418f authored by Andrew Jiang's avatar Andrew Jiang Committed by Alex Deucher

drm/amd/display: Don't use dc_link in link_encoder

dc_link is at a higher level than link_encoder, and we only want
higher-level components to be able to access lower-level ones,
not the other way around.
Signed-off-by: default avatarAndrew Jiang <Andrew.Jiang@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 83c3e57b
...@@ -1798,7 +1798,7 @@ static void disable_link(struct dc_link *link, enum signal_type signal) ...@@ -1798,7 +1798,7 @@ static void disable_link(struct dc_link *link, enum signal_type signal)
else else
dp_disable_link_phy_mst(link, signal); dp_disable_link_phy_mst(link, signal);
} else } else
link->link_enc->funcs->disable_output(link->link_enc, signal, link); link->link_enc->funcs->disable_output(link->link_enc, signal);
} }
bool dp_active_dongle_validate_timing( bool dp_active_dongle_validate_timing(
......
...@@ -89,7 +89,7 @@ void dp_enable_link_phy( ...@@ -89,7 +89,7 @@ void dp_enable_link_phy(
if (dc_is_dp_sst_signal(signal)) { if (dc_is_dp_sst_signal(signal)) {
if (signal == SIGNAL_TYPE_EDP) { if (signal == SIGNAL_TYPE_EDP) {
link->dc->hwss.edp_power_control(link->link_enc, true); link->dc->hwss.edp_power_control(link, true);
link_enc->funcs->enable_dp_output( link_enc->funcs->enable_dp_output(
link_enc, link_enc,
link_settings, link_settings,
...@@ -140,10 +140,10 @@ void dp_disable_link_phy(struct dc_link *link, enum signal_type signal) ...@@ -140,10 +140,10 @@ void dp_disable_link_phy(struct dc_link *link, enum signal_type signal)
if (signal == SIGNAL_TYPE_EDP) { if (signal == SIGNAL_TYPE_EDP) {
link->dc->hwss.edp_backlight_control(link, false); link->dc->hwss.edp_backlight_control(link, false);
edp_receiver_ready_T9(link); edp_receiver_ready_T9(link);
link->link_enc->funcs->disable_output(link->link_enc, signal, link); link->link_enc->funcs->disable_output(link->link_enc, signal);
link->dc->hwss.edp_power_control(link->link_enc, false); link->dc->hwss.edp_power_control(link, false);
} else } else
link->link_enc->funcs->disable_output(link->link_enc, signal, link); link->link_enc->funcs->disable_output(link->link_enc, signal);
/* Clear current link setting.*/ /* Clear current link setting.*/
memset(&link->cur_link_settings, 0, memset(&link->cur_link_settings, 0,
...@@ -286,8 +286,7 @@ void dp_retrain_link_dp_test(struct dc_link *link, ...@@ -286,8 +286,7 @@ void dp_retrain_link_dp_test(struct dc_link *link,
link->link_enc->funcs->disable_output( link->link_enc->funcs->disable_output(
link->link_enc, link->link_enc,
SIGNAL_TYPE_DISPLAY_PORT, SIGNAL_TYPE_DISPLAY_PORT);
link);
/* Clear current link setting. */ /* Clear current link setting. */
memset(&link->cur_link_settings, 0, memset(&link->cur_link_settings, 0,
......
...@@ -845,8 +845,6 @@ void dce110_link_encoder_hw_init( ...@@ -845,8 +845,6 @@ void dce110_link_encoder_hw_init(
ASSERT(result == BP_RESULT_OK); ASSERT(result == BP_RESULT_OK);
} else if (enc110->base.connector.id == CONNECTOR_ID_EDP) {
ctx->dc->hwss.edp_power_control(enc, true);
} }
aux_initialize(enc110); aux_initialize(enc110);
...@@ -1033,8 +1031,7 @@ void dce110_link_encoder_enable_dp_mst_output( ...@@ -1033,8 +1031,7 @@ void dce110_link_encoder_enable_dp_mst_output(
*/ */
void dce110_link_encoder_disable_output( void dce110_link_encoder_disable_output(
struct link_encoder *enc, struct link_encoder *enc,
enum signal_type signal, enum signal_type signal)
struct dc_link *link)
{ {
struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc); struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
struct dc_context *ctx = enc110->base.ctx; struct dc_context *ctx = enc110->base.ctx;
...@@ -1045,8 +1042,6 @@ void dce110_link_encoder_disable_output( ...@@ -1045,8 +1042,6 @@ void dce110_link_encoder_disable_output(
/* OF_SKIP_POWER_DOWN_INACTIVE_ENCODER */ /* OF_SKIP_POWER_DOWN_INACTIVE_ENCODER */
return; return;
} }
if (enc110->base.connector.id == CONNECTOR_ID_EDP)
ctx->dc->hwss.edp_backlight_control(link, false);
/* Power-down RX and disable GPU PHY should be paired. /* Power-down RX and disable GPU PHY should be paired.
* Disabling PHY without powering down RX may cause * Disabling PHY without powering down RX may cause
* symbol lock loss, on which we will get DP Sink interrupt. */ * symbol lock loss, on which we will get DP Sink interrupt. */
...@@ -1078,19 +1073,20 @@ void dce110_link_encoder_disable_output( ...@@ -1078,19 +1073,20 @@ void dce110_link_encoder_disable_output(
if (dc_is_dp_signal(signal)) if (dc_is_dp_signal(signal))
link_encoder_disable(enc110); link_encoder_disable(enc110);
if (enc110->base.connector.id == CONNECTOR_ID_EDP) { /*
/* power down eDP panel */ * TODO: Power control cause regression, we should implement
/* TODO: Power control cause regression, we should implement
* it properly, for now just comment it. * it properly, for now just comment it.
* */
* link_encoder_edp_wait_for_hpd_ready( // if (enc110->base.connector.id == CONNECTOR_ID_EDP) {
link_enc, // /* power down eDP panel */
link_enc->connector, // link_encoder_edp_wait_for_hpd_ready(
false); // enc,
// enc->connector,
* link_encoder_edp_power_control( // false);
link_enc, false); */ //
} // link_encoder_edp_power_control(
// enc, false);
// }
} }
void dce110_link_encoder_dp_set_lane_settings( void dce110_link_encoder_dp_set_lane_settings(
......
...@@ -228,9 +228,8 @@ void dce110_link_encoder_enable_dp_mst_output( ...@@ -228,9 +228,8 @@ void dce110_link_encoder_enable_dp_mst_output(
/* disable PHY output */ /* disable PHY output */
void dce110_link_encoder_disable_output( void dce110_link_encoder_disable_output(
struct link_encoder *link_enc, struct link_encoder *enc,
enum signal_type signal, enum signal_type signal);
struct dc_link *link);
/* set DP lane settings */ /* set DP lane settings */
void dce110_link_encoder_dp_set_lane_settings( void dce110_link_encoder_dp_set_lane_settings(
......
...@@ -814,11 +814,11 @@ static enum bp_result link_transmitter_control( ...@@ -814,11 +814,11 @@ static enum bp_result link_transmitter_control(
* eDP only. * eDP only.
*/ */
void hwss_edp_wait_for_hpd_ready( void hwss_edp_wait_for_hpd_ready(
struct link_encoder *enc, struct dc_link *link,
bool power_up) bool power_up)
{ {
struct dc_context *ctx = enc->ctx; struct dc_context *ctx = link->ctx;
struct graphics_object_id connector = enc->connector; struct graphics_object_id connector = link->link_enc->connector;
struct gpio *hpd; struct gpio *hpd;
bool edp_hpd_high = false; bool edp_hpd_high = false;
uint32_t time_elapsed = 0; uint32_t time_elapsed = 0;
...@@ -882,16 +882,16 @@ void hwss_edp_wait_for_hpd_ready( ...@@ -882,16 +882,16 @@ void hwss_edp_wait_for_hpd_ready(
} }
void hwss_edp_power_control( void hwss_edp_power_control(
struct link_encoder *enc, struct dc_link *link,
bool power_up) bool power_up)
{ {
struct dc_context *ctx = enc->ctx; struct dc_context *ctx = link->ctx;
struct dce_hwseq *hwseq = ctx->dc->hwseq; struct dce_hwseq *hwseq = ctx->dc->hwseq;
struct bp_transmitter_control cntl = { 0 }; struct bp_transmitter_control cntl = { 0 };
enum bp_result bp_result; enum bp_result bp_result;
if (dal_graphics_object_id_get_connector_id(enc->connector) if (dal_graphics_object_id_get_connector_id(link->link_enc->connector)
!= CONNECTOR_ID_EDP) { != CONNECTOR_ID_EDP) {
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
return; return;
...@@ -907,11 +907,11 @@ void hwss_edp_power_control( ...@@ -907,11 +907,11 @@ void hwss_edp_power_control(
cntl.action = power_up ? cntl.action = power_up ?
TRANSMITTER_CONTROL_POWER_ON : TRANSMITTER_CONTROL_POWER_ON :
TRANSMITTER_CONTROL_POWER_OFF; TRANSMITTER_CONTROL_POWER_OFF;
cntl.transmitter = enc->transmitter; cntl.transmitter = link->link_enc->transmitter;
cntl.connector_obj_id = enc->connector; cntl.connector_obj_id = link->link_enc->connector;
cntl.coherent = false; cntl.coherent = false;
cntl.lanes_number = LANE_COUNT_FOUR; cntl.lanes_number = LANE_COUNT_FOUR;
cntl.hpd_sel = enc->hpd_source; cntl.hpd_sel = link->link_enc->hpd_source;
bp_result = link_transmitter_control(ctx->dc_bios, &cntl); bp_result = link_transmitter_control(ctx->dc_bios, &cntl);
...@@ -925,7 +925,7 @@ void hwss_edp_power_control( ...@@ -925,7 +925,7 @@ void hwss_edp_power_control(
__func__, (power_up ? "On":"Off")); __func__, (power_up ? "On":"Off"));
} }
hwss_edp_wait_for_hpd_ready(enc, true); hwss_edp_wait_for_hpd_ready(link, true);
} }
/*todo: cloned in stream enc, fix*/ /*todo: cloned in stream enc, fix*/
...@@ -937,11 +937,11 @@ void hwss_edp_backlight_control( ...@@ -937,11 +937,11 @@ void hwss_edp_backlight_control(
struct dc_link *link, struct dc_link *link,
bool enable) bool enable)
{ {
struct dce_hwseq *hws = link->dc->hwseq; struct dc_context *ctx = link->ctx;
struct dc_context *ctx = link->dc->ctx; struct dce_hwseq *hws = ctx->dc->hwseq;
struct bp_transmitter_control cntl = { 0 }; struct bp_transmitter_control cntl = { 0 };
if (dal_graphics_object_id_get_connector_id(link->link_id) if (dal_graphics_object_id_get_connector_id(link->link_enc->connector)
!= CONNECTOR_ID_EDP) { != CONNECTOR_ID_EDP) {
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
return; return;
...@@ -982,7 +982,7 @@ void hwss_edp_backlight_control( ...@@ -982,7 +982,7 @@ void hwss_edp_backlight_control(
* Enable it in the future if necessary. * Enable it in the future if necessary.
*/ */
/* dc_service_sleep_in_milliseconds(50); */ /* dc_service_sleep_in_milliseconds(50); */
link_transmitter_control(link->dc->ctx->dc_bios, &cntl); link_transmitter_control(ctx->dc_bios, &cntl);
} }
void dce110_disable_stream(struct pipe_ctx *pipe_ctx, int option) void dce110_disable_stream(struct pipe_ctx *pipe_ctx, int option)
...@@ -1396,12 +1396,14 @@ static void power_down_encoders(struct dc *dc) ...@@ -1396,12 +1396,14 @@ static void power_down_encoders(struct dc *dc)
if (!dc->links[i]->wa_flags.dp_keep_receiver_powered) if (!dc->links[i]->wa_flags.dp_keep_receiver_powered)
dp_receiver_power_ctrl(dc->links[i], false); dp_receiver_power_ctrl(dc->links[i], false);
if (connector_id == CONNECTOR_ID_EDP) if (connector_id == CONNECTOR_ID_EDP) {
signal = SIGNAL_TYPE_EDP; signal = SIGNAL_TYPE_EDP;
hwss_edp_backlight_control(dc->links[i], false);
}
} }
dc->links[i]->link_enc->funcs->disable_output( dc->links[i]->link_enc->funcs->disable_output(
dc->links[i]->link_enc, signal, dc->links[i]); dc->links[i]->link_enc, signal);
} }
} }
...@@ -2541,6 +2543,10 @@ static void init_hw(struct dc *dc) ...@@ -2541,6 +2543,10 @@ static void init_hw(struct dc *dc)
* required signal (which may be different from the * required signal (which may be different from the
* default signal on connector). */ * default signal on connector). */
struct dc_link *link = dc->links[i]; struct dc_link *link = dc->links[i];
if (link->link_enc->connector.id == CONNECTOR_ID_EDP)
dc->hwss.edp_power_control(link, true);
link->link_enc->funcs->hw_init(link->link_enc); link->link_enc->funcs->hw_init(link->link_enc);
} }
......
...@@ -70,7 +70,7 @@ uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context); ...@@ -70,7 +70,7 @@ uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context);
void dp_receiver_power_ctrl(struct dc_link *link, bool on); void dp_receiver_power_ctrl(struct dc_link *link, bool on);
void hwss_edp_power_control( void hwss_edp_power_control(
struct link_encoder *enc, struct dc_link *link,
bool power_up); bool power_up);
void hwss_edp_backlight_control( void hwss_edp_backlight_control(
......
...@@ -723,6 +723,9 @@ static void dcn10_init_hw(struct dc *dc) ...@@ -723,6 +723,9 @@ static void dcn10_init_hw(struct dc *dc)
*/ */
struct dc_link *link = dc->links[i]; struct dc_link *link = dc->links[i];
if (link->link_enc->connector.id == CONNECTOR_ID_EDP)
dc->hwss.edp_power_control(link, true);
link->link_enc->funcs->hw_init(link->link_enc); link->link_enc->funcs->hw_init(link->link_enc);
} }
......
...@@ -111,7 +111,7 @@ struct link_encoder_funcs { ...@@ -111,7 +111,7 @@ struct link_encoder_funcs {
const struct dc_link_settings *link_settings, const struct dc_link_settings *link_settings,
enum clock_source_id clock_source); enum clock_source_id clock_source);
void (*disable_output)(struct link_encoder *link_enc, void (*disable_output)(struct link_encoder *link_enc,
enum signal_type signal, struct dc_link *link); enum signal_type signal);
void (*dp_set_lane_settings)(struct link_encoder *enc, void (*dp_set_lane_settings)(struct link_encoder *enc,
const struct link_training_settings *link_settings); const struct link_training_settings *link_settings);
void (*dp_set_phy_pattern)(struct link_encoder *enc, void (*dp_set_phy_pattern)(struct link_encoder *enc,
......
...@@ -184,7 +184,7 @@ struct hw_sequencer_funcs { ...@@ -184,7 +184,7 @@ struct hw_sequencer_funcs {
void (*ready_shared_resources)(struct dc *dc, struct dc_state *context); void (*ready_shared_resources)(struct dc *dc, struct dc_state *context);
void (*optimize_shared_resources)(struct dc *dc); void (*optimize_shared_resources)(struct dc *dc);
void (*edp_power_control)( void (*edp_power_control)(
struct link_encoder *enc, struct dc_link *link,
bool enable); bool enable);
void (*edp_backlight_control)( void (*edp_backlight_control)(
struct dc_link *link, struct dc_link *link,
......
...@@ -58,8 +58,7 @@ static void virtual_link_encoder_enable_dp_mst_output( ...@@ -58,8 +58,7 @@ static void virtual_link_encoder_enable_dp_mst_output(
static void virtual_link_encoder_disable_output( static void virtual_link_encoder_disable_output(
struct link_encoder *link_enc, struct link_encoder *link_enc,
enum signal_type signal, enum signal_type signal) {}
struct dc_link *link) {}
static void virtual_link_encoder_dp_set_lane_settings( static void virtual_link_encoder_dp_set_lane_settings(
struct link_encoder *enc, struct link_encoder *enc,
......
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