Commit 36c9137b authored by Dale Zhao's avatar Dale Zhao Committed by Alex Deucher

drm/amd/display: Add audio support for DFP type of active branch is DP case

[Why]
Per DP spec, for active protocol convertor adaptor, DP source should enable audio
for DFP type is DP, HDMI or DP++. Current is_dp_active_dongle() checking is not
precise, which treat branch device default as active dongle. As a result, we will
mistakenly disable audio for DFP type is DP case.

[How]
Make is_dp_active_dongle() checking more precise for active dongle types.
Rename active diongle type as SST branch device in case confusion.
Signed-off-by: default avatarDale Zhao <dale.zhao@amd.com>
Reviewed-by: default avatarWenjing Liu <Wenjing.Liu@amd.com>
Acked-by: default avatarWayne Lin <Wayne.Lin@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 81927e28
...@@ -762,19 +762,20 @@ static bool detect_dp(struct dc_link *link, ...@@ -762,19 +762,20 @@ static bool detect_dp(struct dc_link *link,
} }
if (link->type != dc_connection_mst_branch && if (link->type != dc_connection_mst_branch &&
is_dp_active_dongle(link)) { is_dp_branch_device(link)) {
/* DP active dongles */ /* DP SST branch */
link->type = dc_connection_active_dongle; link->type = dc_connection_sst_branch;
if (!link->dpcd_caps.sink_count.bits.SINK_COUNT) { if (!link->dpcd_caps.sink_count.bits.SINK_COUNT) {
/* /*
* active dongle unplug processing for short irq * SST branch unplug processing for short irq
*/ */
link_disconnect_sink(link); link_disconnect_sink(link);
return true; return true;
} }
if (link->dpcd_caps.dongle_type != if (is_dp_active_dongle(link) &&
DISPLAY_DONGLE_DP_HDMI_CONVERTER) (link->dpcd_caps.dongle_type !=
DISPLAY_DONGLE_DP_HDMI_CONVERTER))
*converter_disable_audio = true; *converter_disable_audio = true;
} }
} else { } else {
...@@ -974,8 +975,8 @@ static bool dc_link_detect_helper(struct dc_link *link, ...@@ -974,8 +975,8 @@ static bool dc_link_detect_helper(struct dc_link *link,
sizeof(struct dpcd_caps))) sizeof(struct dpcd_caps)))
same_dpcd = false; same_dpcd = false;
} }
/* Active dongle downstream unplug*/ /* Active SST downstream branch device unplug*/
if (link->type == dc_connection_active_dongle && if (link->type == dc_connection_sst_branch &&
link->dpcd_caps.sink_count.bits.SINK_COUNT == 0) { link->dpcd_caps.sink_count.bits.SINK_COUNT == 0) {
if (prev_sink) if (prev_sink)
/* Downstream unplug */ /* Downstream unplug */
......
...@@ -2593,13 +2593,11 @@ static bool allow_hpd_rx_irq(const struct dc_link *link) ...@@ -2593,13 +2593,11 @@ static bool allow_hpd_rx_irq(const struct dc_link *link)
/* /*
* Don't handle RX IRQ unless one of following is met: * Don't handle RX IRQ unless one of following is met:
* 1) The link is established (cur_link_settings != unknown) * 1) The link is established (cur_link_settings != unknown)
* 2) We kicked off MST detection * 2) We know we're dealing with a branch device, SST or MST
* 3) We know we're dealing with an active dongle
*/ */
if ((link->cur_link_settings.lane_count != LANE_COUNT_UNKNOWN) || if ((link->cur_link_settings.lane_count != LANE_COUNT_UNKNOWN) ||
(link->type == dc_connection_mst_branch) || is_dp_branch_device(link))
is_dp_active_dongle(link))
return true; return true;
return false; return false;
...@@ -3164,7 +3162,7 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd ...@@ -3164,7 +3162,7 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd
*out_link_loss = true; *out_link_loss = true;
} }
if (link->type == dc_connection_active_dongle && if (link->type == dc_connection_sst_branch &&
hpd_irq_dpcd_data.bytes.sink_cnt.bits.SINK_COUNT hpd_irq_dpcd_data.bytes.sink_cnt.bits.SINK_COUNT
!= link->dpcd_sink_count) != link->dpcd_sink_count)
status = true; status = true;
...@@ -3214,6 +3212,12 @@ bool is_mst_supported(struct dc_link *link) ...@@ -3214,6 +3212,12 @@ 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)
{
return (link->dpcd_caps.dongle_type >= DISPLAY_DONGLE_DP_VGA_CONVERTER) &&
(link->dpcd_caps.dongle_type <= DISPLAY_DONGLE_DP_HDMI_CONVERTER);
}
bool is_dp_branch_device(const struct dc_link *link)
{ {
return link->dpcd_caps.is_branch_dev; return link->dpcd_caps.is_branch_dev;
} }
......
...@@ -404,7 +404,7 @@ enum dc_connection_type { ...@@ -404,7 +404,7 @@ enum dc_connection_type {
dc_connection_none, dc_connection_none,
dc_connection_single, dc_connection_single,
dc_connection_mst_branch, dc_connection_mst_branch,
dc_connection_active_dongle dc_connection_sst_branch
}; };
struct dc_csc_adjustments { struct dc_csc_adjustments {
......
...@@ -75,6 +75,8 @@ void detect_edp_sink_caps(struct dc_link *link); ...@@ -75,6 +75,8 @@ void detect_edp_sink_caps(struct dc_link *link);
bool is_dp_active_dongle(const struct dc_link *link); bool is_dp_active_dongle(const struct dc_link *link);
bool is_dp_branch_device(const struct dc_link *link);
bool is_edp_ilr_optimization_required(struct dc_link *link, struct dc_crtc_timing *crtc_timing); bool is_edp_ilr_optimization_required(struct dc_link *link, struct dc_crtc_timing *crtc_timing);
void dp_enable_mst_on_sink(struct dc_link *link, bool enable); void dp_enable_mst_on_sink(struct dc_link *link, bool enable);
......
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