aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2710-drm-amd-display-Don-t-use-dc_link-in-link_encoder.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2710-drm-amd-display-Don-t-use-dc_link-in-link_encoder.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2710-drm-amd-display-Don-t-use-dc_link-in-link_encoder.patch352
1 files changed, 352 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2710-drm-amd-display-Don-t-use-dc_link-in-link_encoder.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2710-drm-amd-display-Don-t-use-dc_link-in-link_encoder.patch
new file mode 100644
index 00000000..13473241
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2710-drm-amd-display-Don-t-use-dc_link-in-link_encoder.patch
@@ -0,0 +1,352 @@
+From 941748c25814dde8d2ab72272826d7e66ff524ea Mon Sep 17 00:00:00 2001
+From: Andrew Jiang <Andrew.Jiang@amd.com>
+Date: Tue, 26 Sep 2017 19:45:43 -0400
+Subject: [PATCH 2710/4131] 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: Andrew Jiang <Andrew.Jiang@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Harry Wentland <harry.wentland@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_link.c | 2 +-
+ drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c | 11 +++---
+ .../gpu/drm/amd/display/dc/dce/dce_link_encoder.c | 34 +++++++---------
+ .../gpu/drm/amd/display/dc/dce/dce_link_encoder.h | 5 +--
+ .../amd/display/dc/dce110/dce110_hw_sequencer.c | 46 ++++++++++++----------
+ .../amd/display/dc/dce110/dce110_hw_sequencer.h | 4 +-
+ .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 3 ++
+ .../gpu/drm/amd/display/dc/inc/hw/link_encoder.h | 2 +-
+ drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h | 2 +-
+ .../amd/display/dc/virtual/virtual_link_encoder.c | 3 +-
+ 10 files changed, 57 insertions(+), 55 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 a6a762a..3b394a5 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+@@ -1798,7 +1798,7 @@ static void disable_link(struct dc_link *link, enum signal_type signal)
+ else
+ dp_disable_link_phy_mst(link, signal);
+ } 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(
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
+index 9a33b47..f290256 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c
+@@ -89,7 +89,7 @@ void dp_enable_link_phy(
+
+ if (dc_is_dp_sst_signal(signal)) {
+ 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,
+ link_settings,
+@@ -140,10 +140,10 @@ void dp_disable_link_phy(struct dc_link *link, enum signal_type signal)
+ if (signal == SIGNAL_TYPE_EDP) {
+ link->dc->hwss.edp_backlight_control(link, false);
+ edp_receiver_ready_T9(link);
+- link->link_enc->funcs->disable_output(link->link_enc, signal, link);
+- link->dc->hwss.edp_power_control(link->link_enc, false);
++ link->link_enc->funcs->disable_output(link->link_enc, signal);
++ link->dc->hwss.edp_power_control(link, false);
+ } 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.*/
+ memset(&link->cur_link_settings, 0,
+@@ -286,8 +286,7 @@ void dp_retrain_link_dp_test(struct dc_link *link,
+
+ link->link_enc->funcs->disable_output(
+ link->link_enc,
+- SIGNAL_TYPE_DISPLAY_PORT,
+- link);
++ SIGNAL_TYPE_DISPLAY_PORT);
+
+ /* Clear current link setting. */
+ memset(&link->cur_link_settings, 0,
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
+index fe88852..bad70c6 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
+@@ -845,8 +845,6 @@ void dce110_link_encoder_hw_init(
+
+ 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);
+
+@@ -1033,8 +1031,7 @@ void dce110_link_encoder_enable_dp_mst_output(
+ */
+ void dce110_link_encoder_disable_output(
+ struct link_encoder *enc,
+- enum signal_type signal,
+- struct dc_link *link)
++ enum signal_type signal)
+ {
+ struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
+ struct dc_context *ctx = enc110->base.ctx;
+@@ -1045,8 +1042,6 @@ void dce110_link_encoder_disable_output(
+ /* OF_SKIP_POWER_DOWN_INACTIVE_ENCODER */
+ 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.
+ * Disabling PHY without powering down RX may cause
+ * symbol lock loss, on which we will get DP Sink interrupt. */
+@@ -1078,19 +1073,20 @@ void dce110_link_encoder_disable_output(
+ if (dc_is_dp_signal(signal))
+ link_encoder_disable(enc110);
+
+- if (enc110->base.connector.id == CONNECTOR_ID_EDP) {
+- /* power down eDP panel */
+- /* TODO: Power control cause regression, we should implement
+- * it properly, for now just comment it.
+- *
+- * link_encoder_edp_wait_for_hpd_ready(
+- link_enc,
+- link_enc->connector,
+- false);
+-
+- * link_encoder_edp_power_control(
+- link_enc, false); */
+- }
++ /*
++ * TODO: Power control cause regression, we should implement
++ * it properly, for now just comment it.
++ */
++// if (enc110->base.connector.id == CONNECTOR_ID_EDP) {
++// /* power down eDP panel */
++// link_encoder_edp_wait_for_hpd_ready(
++// enc,
++// enc->connector,
++// false);
++//
++// link_encoder_edp_power_control(
++// enc, false);
++// }
+ }
+
+ void dce110_link_encoder_dp_set_lane_settings(
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
+index 494067d..8ca9afe 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
+@@ -228,9 +228,8 @@ void dce110_link_encoder_enable_dp_mst_output(
+
+ /* disable PHY output */
+ void dce110_link_encoder_disable_output(
+- struct link_encoder *link_enc,
+- enum signal_type signal,
+- struct dc_link *link);
++ struct link_encoder *enc,
++ enum signal_type signal);
+
+ /* set DP lane settings */
+ void dce110_link_encoder_dp_set_lane_settings(
+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 b4504f1..4135de2 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
+@@ -814,11 +814,11 @@ static enum bp_result link_transmitter_control(
+ * eDP only.
+ */
+ void hwss_edp_wait_for_hpd_ready(
+- struct link_encoder *enc,
+- bool power_up)
++ struct dc_link *link,
++ bool power_up)
+ {
+- struct dc_context *ctx = enc->ctx;
+- struct graphics_object_id connector = enc->connector;
++ struct dc_context *ctx = link->ctx;
++ struct graphics_object_id connector = link->link_enc->connector;
+ struct gpio *hpd;
+ bool edp_hpd_high = false;
+ uint32_t time_elapsed = 0;
+@@ -882,16 +882,16 @@ void hwss_edp_wait_for_hpd_ready(
+ }
+
+ void hwss_edp_power_control(
+- struct link_encoder *enc,
+- bool power_up)
++ struct dc_link *link,
++ bool power_up)
+ {
+- struct dc_context *ctx = enc->ctx;
++ struct dc_context *ctx = link->ctx;
+ struct dce_hwseq *hwseq = ctx->dc->hwseq;
+ struct bp_transmitter_control cntl = { 0 };
+ 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) {
+ BREAK_TO_DEBUGGER();
+ return;
+@@ -907,11 +907,11 @@ void hwss_edp_power_control(
+ cntl.action = power_up ?
+ TRANSMITTER_CONTROL_POWER_ON :
+ TRANSMITTER_CONTROL_POWER_OFF;
+- cntl.transmitter = enc->transmitter;
+- cntl.connector_obj_id = enc->connector;
++ cntl.transmitter = link->link_enc->transmitter;
++ cntl.connector_obj_id = link->link_enc->connector;
+ cntl.coherent = false;
+ 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);
+
+@@ -925,7 +925,7 @@ void hwss_edp_power_control(
+ __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*/
+@@ -934,14 +934,14 @@ void hwss_edp_power_control(
+ * eDP only. Control the backlight of the eDP panel
+ */
+ void hwss_edp_backlight_control(
+- struct dc_link *link,
+- bool enable)
++ struct dc_link *link,
++ bool enable)
+ {
+- struct dce_hwseq *hws = link->dc->hwseq;
+- struct dc_context *ctx = link->dc->ctx;
++ struct dc_context *ctx = link->ctx;
++ struct dce_hwseq *hws = ctx->dc->hwseq;
+ 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) {
+ BREAK_TO_DEBUGGER();
+ return;
+@@ -982,7 +982,7 @@ void hwss_edp_backlight_control(
+ * Enable it in the future if necessary.
+ */
+ /* 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)
+@@ -1398,12 +1398,14 @@ static void power_down_encoders(struct dc *dc)
+
+ if (!dc->links[i]->wa_flags.dp_keep_receiver_powered)
+ dp_receiver_power_ctrl(dc->links[i], false);
+- if (connector_id == CONNECTOR_ID_EDP)
++ if (connector_id == CONNECTOR_ID_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, signal, dc->links[i]);
++ dc->links[i]->link_enc, signal);
+ }
+ }
+
+@@ -2539,6 +2541,10 @@ static void init_hw(struct dc *dc)
+ * required signal (which may be different from the
+ * default signal on connector). */
+ 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);
+ }
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h
+index 4d72bb9..2dd6ac6 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h
++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h
+@@ -70,8 +70,8 @@ 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 hwss_edp_power_control(
+- struct link_encoder *enc,
+- bool power_up);
++ struct dc_link *link,
++ bool power_up);
+
+ void hwss_edp_backlight_control(
+ struct dc_link *link,
+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 dc37551..51b7cfe 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
+@@ -723,6 +723,9 @@ static void dcn10_init_hw(struct dc *dc)
+ */
+ 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);
+ }
+
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h b/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h
+index 3d33bcd..8a08f0a 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h
+@@ -111,7 +111,7 @@ struct link_encoder_funcs {
+ const struct dc_link_settings *link_settings,
+ enum clock_source_id clock_source);
+ 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,
+ const struct link_training_settings *link_settings);
+ void (*dp_set_phy_pattern)(struct link_encoder *enc,
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h
+index cebbba3..f3c5468 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h
+@@ -184,7 +184,7 @@ struct hw_sequencer_funcs {
+ void (*ready_shared_resources)(struct dc *dc, struct dc_state *context);
+ void (*optimize_shared_resources)(struct dc *dc);
+ void (*edp_power_control)(
+- struct link_encoder *enc,
++ struct dc_link *link,
+ bool enable);
+ void (*edp_backlight_control)(
+ struct dc_link *link,
+diff --git a/drivers/gpu/drm/amd/display/dc/virtual/virtual_link_encoder.c b/drivers/gpu/drm/amd/display/dc/virtual/virtual_link_encoder.c
+index 88c2bde..57a54a7 100644
+--- a/drivers/gpu/drm/amd/display/dc/virtual/virtual_link_encoder.c
++++ b/drivers/gpu/drm/amd/display/dc/virtual/virtual_link_encoder.c
+@@ -58,8 +58,7 @@ static void virtual_link_encoder_enable_dp_mst_output(
+
+ static void virtual_link_encoder_disable_output(
+ struct link_encoder *link_enc,
+- enum signal_type signal,
+- struct dc_link *link) {}
++ enum signal_type signal) {}
+
+ static void virtual_link_encoder_dp_set_lane_settings(
+ struct link_encoder *enc,
+--
+2.7.4
+