aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4057-drm-amd-display-check-phy-dpalt-lane-count-config.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4057-drm-amd-display-check-phy-dpalt-lane-count-config.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4057-drm-amd-display-check-phy-dpalt-lane-count-config.patch120
1 files changed, 120 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4057-drm-amd-display-check-phy-dpalt-lane-count-config.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4057-drm-amd-display-check-phy-dpalt-lane-count-config.patch
new file mode 100644
index 00000000..4b5fdc85
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4057-drm-amd-display-check-phy-dpalt-lane-count-config.patch
@@ -0,0 +1,120 @@
+From 0c542eaba5d96996e04bf61828430f1a9ab6fa87 Mon Sep 17 00:00:00 2001
+From: Lewis Huang <Lewis.Huang@amd.com>
+Date: Thu, 5 Sep 2019 15:33:58 +0800
+Subject: [PATCH 4057/4256] drm/amd/display: check phy dpalt lane count config
+
+[Why]
+Type-c PHY config is not align with dpcd lane count.
+When those values didn't match, it cause driver do
+link training with 4 lane but phy only can output 2 lane.
+The link trainig always fail.
+
+[How]
+1. Modify get_max_link_cap function. According DPALT_DP4
+to update max lane count.
+2. Add dp_mst_verify_link_cap to handle MST case because
+we didn't call dp_mst_verify_link_cap for MST case.
+
+Signed-off-by: Lewis Huang <Lewis.Huang@amd.com>
+Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com>
+Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_link.c | 3 ++-
+ drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 16 ++++++++++++++++
+ .../amd/display/dc/dcn10/dcn10_link_encoder.h | 1 +
+ drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h | 3 +++
+ .../gpu/drm/amd/display/dc/inc/hw/link_encoder.h | 4 ++++
+ 5 files changed, 26 insertions(+), 1 deletion(-)
+
+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 80ddde0f0262..f352f6028293 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+@@ -870,7 +870,8 @@ bool dc_link_detect_helper(struct dc_link *link, enum dc_detect_reason reason)
+ * empty which leads to allocate_mst_payload() has "0"
+ * pbn_per_slot value leading to exception on dc_fixpt_div()
+ */
+- link->verified_link_cap = link->reported_link_cap;
++ dp_verify_mst_link_cap(link);
++
+ if (prev_sink != NULL)
+ dc_sink_release(prev_sink);
+ return false;
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+index 7c78caf7a602..701b73926616 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+@@ -1409,6 +1409,9 @@ static struct dc_link_settings get_max_link_cap(struct dc_link *link)
+ if (link->link_enc->features.flags.bits.IS_HBR3_CAPABLE)
+ max_link_cap.link_rate = LINK_RATE_HIGH3;
+
++ if (link->link_enc->funcs->get_max_link_cap)
++ link->link_enc->funcs->get_max_link_cap(link->link_enc, &max_link_cap);
++
+ /* Lower link settings based on sink's link cap */
+ if (link->reported_link_cap.lane_count < max_link_cap.lane_count)
+ max_link_cap.lane_count =
+@@ -1670,6 +1673,19 @@ bool dp_verify_link_cap_with_retries(
+ return success;
+ }
+
++bool dp_verify_mst_link_cap(
++ struct dc_link *link)
++{
++ struct dc_link_settings max_link_cap = {0};
++
++ max_link_cap = get_max_link_cap(link);
++ link->verified_link_cap = get_common_supported_link_settings(
++ link->reported_link_cap,
++ max_link_cap);
++
++ return true;
++}
++
+ static struct dc_link_settings get_common_supported_link_settings(
+ struct dc_link_settings link_setting_a,
+ struct dc_link_settings link_setting_b)
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
+index 8bf5f0f2301d..0c12395cfa36 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
+@@ -337,6 +337,7 @@ struct dcn10_link_enc_registers {
+ type RDPCS_TX_FIFO_ERROR_MASK;\
+ type RDPCS_DPALT_DISABLE_TOGGLE_MASK;\
+ type RDPCS_DPALT_4LANE_TOGGLE_MASK;\
++ type RDPCS_PHY_DPALT_DP4;\
+ type RDPCS_PHY_DPALT_DISABLE;\
+ type RDPCS_PHY_DPALT_DISABLE_ACK;\
+ type RDPCS_PHY_DP_MPLLB_V2I;\
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h b/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
+index 08a4df2c61a8..967706e7898e 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h
+@@ -43,6 +43,9 @@ bool dp_verify_link_cap_with_retries(
+ struct dc_link_settings *known_limit_link_setting,
+ int attempts);
+
++bool dp_verify_mst_link_cap(
++ struct dc_link *link);
++
+ bool dp_validate_mode_timing(
+ struct dc_link *link,
+ const struct dc_crtc_timing *timing);
+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 abb4e4237fb6..b21909216fb6 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
+@@ -184,6 +184,10 @@ struct link_encoder_funcs {
+ bool (*fec_is_active)(struct link_encoder *enc);
+ #endif
+ bool (*is_in_alt_mode) (struct link_encoder *enc);
++
++ void (*get_max_link_cap)(struct link_encoder *enc,
++ struct dc_link_settings *link_settings);
++
+ enum signal_type (*get_dig_mode)(
+ struct link_encoder *enc);
+ };
+--
+2.17.1
+