drm/amd/display: Conditionally enable 6.75 GBps link rate
authorArtem Grishin <Artem.Grishin@amd.com>
Wed, 15 Mar 2023 22:17:59 +0000 (18:17 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 31 Mar 2023 15:18:54 +0000 (11:18 -0400)
[Why]
The 6.75 GBps link rate is part of the new eDP specification
version 1.5 is going to be supported in the future.

Since this standard is very new and there are no existing 6.75 GBps
panels on the market yet, we should put a condition in the driver
on enabling this feature until we can validate it with real hardware.

[How]
- Add boolean flag support_eDP1_5 in struct dc_debug_options.
- Enable the 6.75 link rate in reduce_link_rate(...) only when
  the flag is true.

Reviewed-by: Charlene Liu <Charlene.Liu@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Artem Grishin <Artem.Grishin@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/dc.h
drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c

index 2d2621a..1b77d50 100644 (file)
@@ -874,6 +874,7 @@ struct dc_debug_options {
        bool temp_mst_deallocation_sequence;
        bool override_dispclk_programming;
        bool disable_fpo_optimizations;
+       bool support_eDP1_5;
 };
 
 struct gpu_info_soc_bounding_box_v1_0;
index 7d7edbb..c840ef1 100644 (file)
@@ -447,8 +447,12 @@ static enum dc_lane_count reduce_lane_count(enum dc_lane_count lane_count)
        }
 }
 
-static enum dc_link_rate reduce_link_rate(enum dc_link_rate link_rate)
+static enum dc_link_rate reduce_link_rate(const struct dc_link *link, enum dc_link_rate link_rate)
 {
+       // NEEDSWORK: provide some details about why this function never returns some of the
+       // obscure link rates such as 4.32 Gbps or 3.24 Gbps and if such behavior is intended.
+       //
+
        switch (link_rate) {
        case LINK_RATE_UHBR20:
                return LINK_RATE_UHBR13_5;
@@ -457,13 +461,22 @@ static enum dc_link_rate reduce_link_rate(enum dc_link_rate link_rate)
        case LINK_RATE_UHBR10:
                return LINK_RATE_HIGH3;
        case LINK_RATE_HIGH3:
+               if (link->connector_signal == SIGNAL_TYPE_EDP && link->dc->debug.support_eDP1_5)
+                       return LINK_RATE_RATE_8;
+               return LINK_RATE_HIGH2;
+       case LINK_RATE_RATE_8:
                return LINK_RATE_HIGH2;
        case LINK_RATE_HIGH2:
                return LINK_RATE_HIGH;
+       case LINK_RATE_RATE_6:
+       case LINK_RATE_RBR2:
+               return LINK_RATE_HIGH;
        case LINK_RATE_HIGH:
                return LINK_RATE_LOW;
+       case LINK_RATE_RATE_3:
+       case LINK_RATE_RATE_2:
+               return LINK_RATE_LOW;
        case LINK_RATE_LOW:
-               return LINK_RATE_UNKNOWN;
        default:
                return LINK_RATE_UNKNOWN;
        }
@@ -586,7 +599,7 @@ bool decide_fallback_link_setting(
        case LINK_TRAINING_LQA_FAIL:
        {
                if (!reached_minimum_link_rate(cur->link_rate)) {
-                       cur->link_rate = reduce_link_rate(cur->link_rate);
+                       cur->link_rate = reduce_link_rate(link, cur->link_rate);
                } else if (!reached_minimum_lane_count(cur->lane_count)) {
                        cur->link_rate = max->link_rate;
                        if (training_result == LINK_TRAINING_CR_FAIL_LANE0)
@@ -608,7 +621,7 @@ bool decide_fallback_link_setting(
                if (!reached_minimum_lane_count(cur->lane_count)) {
                        cur->lane_count = reduce_lane_count(cur->lane_count);
                } else if (!reached_minimum_link_rate(cur->link_rate)) {
-                       cur->link_rate = reduce_link_rate(cur->link_rate);
+                       cur->link_rate = reduce_link_rate(link, cur->link_rate);
                        /* Reduce max link rate to avoid potential infinite loop.
                         * Needed so that any subsequent CR_FAIL fallback can't
                         * re-set the link rate higher than the link rate from
@@ -624,7 +637,7 @@ bool decide_fallback_link_setting(
        case LINK_TRAINING_EQ_FAIL_CR:
        {
                if (!reached_minimum_link_rate(cur->link_rate)) {
-                       cur->link_rate = reduce_link_rate(cur->link_rate);
+                       cur->link_rate = reduce_link_rate(link, cur->link_rate);
                        /* Reduce max link rate to avoid potential infinite loop.
                         * Needed so that any subsequent CR_FAIL fallback can't
                         * re-set the link rate higher than the link rate from