mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 11:33:28 +02:00
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: Dale Zhao <dale.zhao@amd.com> Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com> Acked-by: Wayne Lin <Wayne.Lin@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
81927e2808
commit
36c9137b1a
|
|
@ -762,19 +762,20 @@ static bool detect_dp(struct dc_link *link,
|
|||
}
|
||||
|
||||
if (link->type != dc_connection_mst_branch &&
|
||||
is_dp_active_dongle(link)) {
|
||||
/* DP active dongles */
|
||||
link->type = dc_connection_active_dongle;
|
||||
is_dp_branch_device(link)) {
|
||||
/* DP SST branch */
|
||||
link->type = dc_connection_sst_branch;
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (link->dpcd_caps.dongle_type !=
|
||||
DISPLAY_DONGLE_DP_HDMI_CONVERTER)
|
||||
if (is_dp_active_dongle(link) &&
|
||||
(link->dpcd_caps.dongle_type !=
|
||||
DISPLAY_DONGLE_DP_HDMI_CONVERTER))
|
||||
*converter_disable_audio = true;
|
||||
}
|
||||
} else {
|
||||
|
|
@ -974,8 +975,8 @@ static bool dc_link_detect_helper(struct dc_link *link,
|
|||
sizeof(struct dpcd_caps)))
|
||||
same_dpcd = false;
|
||||
}
|
||||
/* Active dongle downstream unplug*/
|
||||
if (link->type == dc_connection_active_dongle &&
|
||||
/* Active SST downstream branch device unplug*/
|
||||
if (link->type == dc_connection_sst_branch &&
|
||||
link->dpcd_caps.sink_count.bits.SINK_COUNT == 0) {
|
||||
if (prev_sink)
|
||||
/* Downstream unplug */
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
* 1) The link is established (cur_link_settings != unknown)
|
||||
* 2) We kicked off MST detection
|
||||
* 3) We know we're dealing with an active dongle
|
||||
* 2) We know we're dealing with a branch device, SST or MST
|
||||
*/
|
||||
|
||||
if ((link->cur_link_settings.lane_count != LANE_COUNT_UNKNOWN) ||
|
||||
(link->type == dc_connection_mst_branch) ||
|
||||
is_dp_active_dongle(link))
|
||||
is_dp_branch_device(link))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
if (link->type == dc_connection_active_dongle &&
|
||||
if (link->type == dc_connection_sst_branch &&
|
||||
hpd_irq_dpcd_data.bytes.sink_cnt.bits.SINK_COUNT
|
||||
!= link->dpcd_sink_count)
|
||||
status = true;
|
||||
|
|
@ -3214,6 +3212,12 @@ bool is_mst_supported(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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -404,7 +404,7 @@ enum dc_connection_type {
|
|||
dc_connection_none,
|
||||
dc_connection_single,
|
||||
dc_connection_mst_branch,
|
||||
dc_connection_active_dongle
|
||||
dc_connection_sst_branch
|
||||
};
|
||||
|
||||
struct dc_csc_adjustments {
|
||||
|
|
|
|||
|
|
@ -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_branch_device(const struct dc_link *link);
|
||||
|
||||
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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user