drm/amd/display: Add audio support for DFP type of active branch is DP case
authorDale Zhao <dale.zhao@amd.com>
Mon, 19 Apr 2021 08:38:55 +0000 (16:38 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 10 May 2021 22:06:44 +0000 (18:06 -0400)
[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>
drivers/gpu/drm/amd/display/dc/core/dc_link.c
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
drivers/gpu/drm/amd/display/dc/dc_types.h
drivers/gpu/drm/amd/display/dc/inc/dc_link_dp.h

index 488f5a14d0f211a8fad1fd5fea1f93f129420dfd..3fb0cebd693828b767c155ee66ad96b31d98b0c1 100644 (file)
@@ -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 */
index 3ff3d9e9098370a198dbe983c8a6c597441b87d0..ffb4f9027d5e87ddd680f81680e2aa726ebd5dd5 100644 (file)
@@ -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;
 }
index 78bc10aeb201df8e25f95272cedb82944a99c812..535da8db70b6c0416252ecc019a1200e0e234d31 100644 (file)
@@ -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 {
index 3ae05c96d55723c4bac6f60529d2564e1334d5d1..699de64a7e44f869d08b2bfd7973ecdac886a1f3 100644 (file)
@@ -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);