From: Jimmy Kizito <jimmy.kiz...@amd.com>

[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.kiz...@amd.com>
Reviewed-by: Jun Lei <jun....@amd.com>
Acked-by: Stylon Wang <stylon.w...@amd.com>
---
 drivers/gpu/drm/amd/display/dc/core/dc_link.c | 27 ++++++++++++++++---
 drivers/gpu/drm/amd/display/dc/dc_link.h      |  1 +
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index 3fb0cebd6938..a2e7747ee387 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -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;
diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h 
b/drivers/gpu/drm/amd/display/dc/dc_link.h
index fc5622ffec3d..5196df1ebad1 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
@@ -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;
 
-- 
2.25.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to