Skip to content

Commit d59bddc

Browse files
George Shenalexdeucher
authored andcommitted
drm/amd/display: Use 16ms AUX read interval for LTTPR with old sinks
[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> (cherry picked from commit 1594b60)
1 parent 870bea2 commit d59bddc

File tree

1 file changed

+36
-18
lines changed

1 file changed

+36
-18
lines changed

drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@
3535
#define DC_LOGGER \
3636
link->ctx->logger
3737

38+
static void get_default_8b_10b_lttpr_aux_rd_interval(
39+
union training_aux_rd_interval *training_rd_interval)
40+
{
41+
/* LTTPR are required to program DPCD 0000Eh to 0x4 (16ms) upon AUX
42+
* read reply to this register. Since old sinks with DPCD rev 1.1
43+
* and earlier may not support this register, assume the mandatory
44+
* value is programmed by the LTTPR to avoid AUX timeout issues.
45+
*/
46+
training_rd_interval->raw = 0x4;
47+
}
48+
3849
static int32_t get_cr_training_aux_rd_interval(struct dc_link *link,
3950
const struct dc_link_settings *link_settings,
4051
enum lttpr_mode lttpr_mode)
@@ -43,17 +54,22 @@ static int32_t get_cr_training_aux_rd_interval(struct dc_link *link,
4354
uint32_t wait_in_micro_secs = 100;
4455

4556
memset(&training_rd_interval, 0, sizeof(training_rd_interval));
46-
if (link_dp_get_encoding_format(link_settings) == DP_8b_10b_ENCODING &&
47-
link->dpcd_caps.dpcd_rev.raw >= DPCD_REV_12) {
48-
core_link_read_dpcd(
49-
link,
50-
DP_TRAINING_AUX_RD_INTERVAL,
51-
(uint8_t *)&training_rd_interval,
52-
sizeof(training_rd_interval));
53-
if (lttpr_mode != LTTPR_MODE_NON_TRANSPARENT)
54-
wait_in_micro_secs = 400;
55-
if (training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL)
56-
wait_in_micro_secs = training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL * 4000;
57+
if (link_dp_get_encoding_format(link_settings) == DP_8b_10b_ENCODING) {
58+
if (link->dpcd_caps.dpcd_rev.raw >= DPCD_REV_12)
59+
core_link_read_dpcd(
60+
link,
61+
DP_TRAINING_AUX_RD_INTERVAL,
62+
(uint8_t *)&training_rd_interval,
63+
sizeof(training_rd_interval));
64+
else if (dp_is_lttpr_present(link))
65+
get_default_8b_10b_lttpr_aux_rd_interval(&training_rd_interval);
66+
67+
if (training_rd_interval.raw != 0) {
68+
if (lttpr_mode != LTTPR_MODE_NON_TRANSPARENT)
69+
wait_in_micro_secs = 400;
70+
if (training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL)
71+
wait_in_micro_secs = training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL * 4000;
72+
}
5773
}
5874
return wait_in_micro_secs;
5975
}
@@ -71,13 +87,15 @@ static uint32_t get_eq_training_aux_rd_interval(
7187
DP_128B132B_TRAINING_AUX_RD_INTERVAL,
7288
(uint8_t *)&training_rd_interval,
7389
sizeof(training_rd_interval));
74-
} else if (link_dp_get_encoding_format(link_settings) == DP_8b_10b_ENCODING &&
75-
link->dpcd_caps.dpcd_rev.raw >= DPCD_REV_12) {
76-
core_link_read_dpcd(
77-
link,
78-
DP_TRAINING_AUX_RD_INTERVAL,
79-
(uint8_t *)&training_rd_interval,
80-
sizeof(training_rd_interval));
90+
} else if (link_dp_get_encoding_format(link_settings) == DP_8b_10b_ENCODING) {
91+
if (link->dpcd_caps.dpcd_rev.raw >= DPCD_REV_12)
92+
core_link_read_dpcd(
93+
link,
94+
DP_TRAINING_AUX_RD_INTERVAL,
95+
(uint8_t *)&training_rd_interval,
96+
sizeof(training_rd_interval));
97+
else if (dp_is_lttpr_present(link))
98+
get_default_8b_10b_lttpr_aux_rd_interval(&training_rd_interval);
8199
}
82100

83101
switch (training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL) {

0 commit comments

Comments
 (0)