Commit a504ad26 authored by Hugo Hu's avatar Hugo Hu Committed by Alex Deucher

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.
Signed-off-by: default avatarHugo Hu <hugo.hu@amd.com>
Reviewed-by: default avatarHugo Hu <Hugo.Hu@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 3ae42acd
...@@ -720,9 +720,8 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) ...@@ -720,9 +720,8 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
same_dpcd = false; same_dpcd = false;
} }
/* Active dongle plug in without display or downstream unplug*/ /* Active dongle plug in without display or downstream unplug*/
if (link->type == dc_connection_active_dongle if (link->type == dc_connection_active_dongle &&
&& link->dpcd_caps.sink_count. link->dpcd_caps.sink_count.bits.SINK_COUNT == 0) {
bits.SINK_COUNT == 0) {
if (prev_sink != NULL) { if (prev_sink != NULL) {
/* Downstream unplug */ /* Downstream unplug */
dc_sink_release(prev_sink); dc_sink_release(prev_sink);
......
...@@ -2226,11 +2226,7 @@ bool is_mst_supported(struct dc_link *link) ...@@ -2226,11 +2226,7 @@ bool is_mst_supported(struct dc_link *link)
bool is_dp_active_dongle(const 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 link->dpcd_caps.is_branch_dev;
return (dongle_type == DISPLAY_DONGLE_DP_VGA_CONVERTER) ||
(dongle_type == DISPLAY_DONGLE_DP_DVI_CONVERTER) ||
(dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER);
} }
static int translate_dpcd_max_bpc(enum dpcd_downstream_port_max_bpc bpc) static int translate_dpcd_max_bpc(enum dpcd_downstream_port_max_bpc bpc)
...@@ -2264,6 +2260,9 @@ static void get_active_converter_info( ...@@ -2264,6 +2260,9 @@ static void get_active_converter_info(
return; 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) { switch (ds_port.fields.PORT_TYPE) {
case DOWNSTREAM_VGA: case DOWNSTREAM_VGA:
link->dpcd_caps.dongle_type = DISPLAY_DONGLE_DP_VGA_CONVERTER; link->dpcd_caps.dongle_type = DISPLAY_DONGLE_DP_VGA_CONVERTER;
......
...@@ -689,6 +689,8 @@ struct dpcd_caps { ...@@ -689,6 +689,8 @@ struct dpcd_caps {
/* dongle type (DP converter, CV smart dongle) */ /* dongle type (DP converter, CV smart dongle) */
enum display_dongle_type dongle_type; enum display_dongle_type dongle_type;
/* branch device or sink device */
bool is_branch_dev;
/* Dongle's downstream count. */ /* Dongle's downstream count. */
union sink_count sink_count; union sink_count sink_count;
/* If dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER, /* If dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER,
......
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