drm/amd/display: Use 16ms AUX read interval for LTTPR with old sinks
authorGeorge Shen <george.shen@amd.com>
Mon, 7 Apr 2025 16:35:57 +0000 (12:35 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 22 Apr 2025 12:51:44 +0000 (08:51 -0400)
[Why/How]
LTTPR are required to program DPCD 0000Eh to 0x4 (16ms) upon AUX read
reply to this register. Since old Sinks witih DPCD rev 1.1 and earlier
may not support this register, assume the mandatory value is programmed
by the LTTPR to avoid AUX timeout issues.

Reviewed-by: Wenjing Liu <wenjing.liu@amd.com>
Signed-off-by: George Shen <george.shen@amd.com>
Signed-off-by: Zaeem Mohamed <zaeem.mohamed@amd.com>
Tested-by: Mark Broadworth <mark.broadworth@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c

index 34d2e097ca2e6b24217d8aff25cd45646bc154ec..5a5d48fadbf27b9332795ad034110f005520b60a 100644 (file)
 #define DC_LOGGER \
        link->ctx->logger
 
+static void get_default_8b_10b_lttpr_aux_rd_interval(
+               union training_aux_rd_interval *training_rd_interval)
+{
+       /* LTTPR are required to program DPCD 0000Eh to 0x4 (16ms) upon AUX
+        * read reply to this register. Since old sinks with DPCD rev 1.1
+        * and earlier may not support this register, assume the mandatory
+        * value is programmed by the LTTPR to avoid AUX timeout issues.
+        */
+       training_rd_interval->raw = 0x4;
+}
+
 static int32_t get_cr_training_aux_rd_interval(struct dc_link *link,
                const struct dc_link_settings *link_settings,
                enum lttpr_mode lttpr_mode)
@@ -43,17 +54,22 @@ static int32_t get_cr_training_aux_rd_interval(struct dc_link *link,
        uint32_t wait_in_micro_secs = 100;
 
        memset(&training_rd_interval, 0, sizeof(training_rd_interval));
-       if (link_dp_get_encoding_format(link_settings) == DP_8b_10b_ENCODING &&
-                       link->dpcd_caps.dpcd_rev.raw >= DPCD_REV_12) {
-               core_link_read_dpcd(
-                               link,
-                               DP_TRAINING_AUX_RD_INTERVAL,
-                               (uint8_t *)&training_rd_interval,
-                               sizeof(training_rd_interval));
-               if (lttpr_mode != LTTPR_MODE_NON_TRANSPARENT)
-                       wait_in_micro_secs = 400;
-               if (training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL)
-                       wait_in_micro_secs = training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL * 4000;
+       if (link_dp_get_encoding_format(link_settings) == DP_8b_10b_ENCODING) {
+               if (link->dpcd_caps.dpcd_rev.raw >= DPCD_REV_12)
+                       core_link_read_dpcd(
+                                       link,
+                                       DP_TRAINING_AUX_RD_INTERVAL,
+                                       (uint8_t *)&training_rd_interval,
+                                       sizeof(training_rd_interval));
+               else if (dp_is_lttpr_present(link))
+                       get_default_8b_10b_lttpr_aux_rd_interval(&training_rd_interval);
+
+               if (training_rd_interval.raw != 0) {
+                       if (lttpr_mode != LTTPR_MODE_NON_TRANSPARENT)
+                               wait_in_micro_secs = 400;
+                       if (training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL)
+                               wait_in_micro_secs = training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL * 4000;
+               }
        }
        return wait_in_micro_secs;
 }
@@ -71,13 +87,15 @@ static uint32_t get_eq_training_aux_rd_interval(
                                DP_128B132B_TRAINING_AUX_RD_INTERVAL,
                                (uint8_t *)&training_rd_interval,
                                sizeof(training_rd_interval));
-       } else if (link_dp_get_encoding_format(link_settings) == DP_8b_10b_ENCODING &&
-                       link->dpcd_caps.dpcd_rev.raw >= DPCD_REV_12) {
-               core_link_read_dpcd(
-                               link,
-                               DP_TRAINING_AUX_RD_INTERVAL,
-                               (uint8_t *)&training_rd_interval,
-                               sizeof(training_rd_interval));
+       } else if (link_dp_get_encoding_format(link_settings) == DP_8b_10b_ENCODING) {
+               if (link->dpcd_caps.dpcd_rev.raw >= DPCD_REV_12)
+                       core_link_read_dpcd(
+                                       link,
+                                       DP_TRAINING_AUX_RD_INTERVAL,
+                                       (uint8_t *)&training_rd_interval,
+                                       sizeof(training_rd_interval));
+               else if (dp_is_lttpr_present(link))
+                       get_default_8b_10b_lttpr_aux_rd_interval(&training_rd_interval);
        }
 
        switch (training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL) {