aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1696-drm-amd-display-Handle-branch-device-with-DFP-count-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1696-drm-amd-display-Handle-branch-device-with-DFP-count-.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1696-drm-amd-display-Handle-branch-device-with-DFP-count-.patch87
1 files changed, 87 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1696-drm-amd-display-Handle-branch-device-with-DFP-count-.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1696-drm-amd-display-Handle-branch-device-with-DFP-count-.patch
new file mode 100644
index 00000000..8391c98c
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1696-drm-amd-display-Handle-branch-device-with-DFP-count-.patch
@@ -0,0 +1,87 @@
+From b5f6dcdb52e49a175ecddcba04f5653fc623f172 Mon Sep 17 00:00:00 2001
+From: Hugo Hu <hugo.hu@amd.com>
+Date: Mon, 25 Feb 2019 19:16:52 +0800
+Subject: [PATCH 1696/2940] drm/amd/display: Handle branch device with DFP
+ count = 0 case.
+
+[Why]
+When you have a SST branch device the driver, Even no sink device connected,
+it also send HPD with a valid EDID. Driver will config it to DP sink.
+Therefore, there're two displays in display setting.
+
+DPCD 0x05, DFP_PRESENT = 1 (branch device),
+DFP_TYPE = 00 (Display Port)
+
+[How]
+Driver determine DPCD 0x05 DFP_PRESENT = 1(branch) as an active dongle
+And check DFP count.
+
+Change-Id: Iccfc7b08a72b6ab732afab1ff66ab9aa5dbc28f8
+Signed-off-by: Hugo Hu <hugo.hu@amd.com>
+Reviewed-by: Hugo Hu <Hugo.Hu@amd.com>
+Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_link.c | 5 ++---
+ drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 9 ++++-----
+ drivers/gpu/drm/amd/display/dc/dc.h | 2 ++
+ 3 files changed, 8 insertions(+), 8 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 f9e18e49a00f..6b00900790eb 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+@@ -720,9 +720,8 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
+ same_dpcd = false;
+ }
+ /* Active dongle plug in without display or downstream unplug*/
+- if (link->type == dc_connection_active_dongle
+- && link->dpcd_caps.sink_count.
+- bits.SINK_COUNT == 0) {
++ if (link->type == dc_connection_active_dongle &&
++ link->dpcd_caps.sink_count.bits.SINK_COUNT == 0) {
+ if (prev_sink != NULL) {
+ /* Downstream unplug */
+ dc_sink_release(prev_sink);
+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 72a88b1808fe..063d019a3f6f 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
+@@ -2226,11 +2226,7 @@ bool is_mst_supported(struct dc_link *link)
+
+ bool is_dp_active_dongle(const struct dc_link *link)
+ {
+- enum display_dongle_type dongle_type = link->dpcd_caps.dongle_type;
+-
+- return (dongle_type == DISPLAY_DONGLE_DP_VGA_CONVERTER) ||
+- (dongle_type == DISPLAY_DONGLE_DP_DVI_CONVERTER) ||
+- (dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER);
++ return link->dpcd_caps.is_branch_dev;
+ }
+
+ static int translate_dpcd_max_bpc(enum dpcd_downstream_port_max_bpc bpc)
+@@ -2264,6 +2260,9 @@ static void get_active_converter_info(
+ return;
+ }
+
++ /* DPCD 0x5 bit 0 = 1, it indicate it's branch device */
++ link->dpcd_caps.is_branch_dev = ds_port.fields.PORT_PRESENT;
++
+ switch (ds_port.fields.PORT_TYPE) {
+ case DOWNSTREAM_VGA:
+ link->dpcd_caps.dongle_type = DISPLAY_DONGLE_DP_VGA_CONVERTER;
+diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
+index 5f484489afe9..2d7fcaf9bce0 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc.h
++++ b/drivers/gpu/drm/amd/display/dc/dc.h
+@@ -704,6 +704,8 @@ struct dpcd_caps {
+
+ /* dongle type (DP converter, CV smart dongle) */
+ enum display_dongle_type dongle_type;
++ /* branch device or sink device */
++ bool is_branch_dev;
+ /* Dongle's downstream count. */
+ union sink_count sink_count;
+ /* If dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER,
+--
+2.17.1
+