drm/amd/display: Update DPRX detection.
authorJimmy Kizito <Jimmy.Kizito@amd.com>
Thu, 1 Apr 2021 16:59:54 +0000 (12:59 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 10 May 2021 22:09:45 +0000 (18:09 -0400)
[Why]
Some extra provisions are required during DPRX detection for links which
lack physical HPD and AUX/DDC pins.

[How]
Avoid attempting to access nonexistent physical pins during DPRX
detection.

Signed-off-by: Jimmy Kizito <Jimmy.Kizito@amd.com>
Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Acked-by: Stylon Wang <stylon.wang@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/dc_link.h

index 3fb0ceb..a2e7747 100644 (file)
@@ -247,6 +247,16 @@ bool dc_link_detect_sink(struct dc_link *link, enum dc_connection_type *type)
                link->dc->hwss.edp_wait_for_hpd_ready(link, true);
        }
 
+       /* Link may not have physical HPD pin. */
+       if (link->ep_type != DISPLAY_ENDPOINT_PHY) {
+               if (link->hpd_status)
+                       *type = dc_connection_single;
+               else
+                       *type = dc_connection_none;
+
+               return true;
+       }
+
        /* todo: may need to lock gpio access */
        hpd_pin = get_hpd_gpio(link->ctx->dc_bios, link->link_id,
                               link->ctx->gpio_service);
@@ -432,8 +442,18 @@ bool dc_link_is_dp_sink_present(struct dc_link *link)
 static enum signal_type link_detect_sink(struct dc_link *link,
                                         enum dc_detect_reason reason)
 {
-       enum signal_type result = get_basic_signal_type(link->link_enc->id,
-                                                       link->link_id);
+       enum signal_type result;
+       struct graphics_object_id enc_id;
+
+       if (link->is_dig_mapping_flexible)
+               enc_id = (struct graphics_object_id){.id = ENCODER_ID_UNKNOWN};
+       else
+               enc_id = link->link_enc->id;
+       result = get_basic_signal_type(enc_id, link->link_id);
+
+       /* Use basic signal type for link without physical connector. */
+       if (link->ep_type != DISPLAY_ENDPOINT_PHY)
+               return result;
 
        /* Internal digital encoder will detect only dongles
         * that require digital signal
@@ -955,7 +975,8 @@ static bool dc_link_detect_helper(struct dc_link *link,
 
                case SIGNAL_TYPE_DISPLAY_PORT: {
                        /* wa HPD high coming too early*/
-                       if (link->link_enc->features.flags.bits.DP_IS_USB_C == 1) {
+                       if (link->ep_type == DISPLAY_ENDPOINT_PHY &&
+                           link->link_enc->features.flags.bits.DP_IS_USB_C == 1) {
                                /* if alt mode times out, return false */
                                if (!wait_for_entering_dp_alt_mode(link))
                                        return false;
index 054bab4..41a09ea 100644 (file)
@@ -113,6 +113,7 @@ struct dc_link {
        /* TODO: Rename. Flag an endpoint as having a programmable mapping to a
         * DIG encoder. */
        bool is_dig_mapping_flexible;
+       bool hpd_status; /* HPD status of link without physical HPD pin. */
 
        bool edp_sink_present;