Deal with some minor idiosyncracies of TRAVIS and NUTMEG chips.

- Always use DP signal type with these chips so that the
  normal DP code paths can work with them without a major
  refactor of the code base. Properly set this.

- NUTMEG seems to only work with HBR, not RBR, so set a
  preferred link rate for this chip.
  See amdgpu_atombios_dp_get_dp_link_config() for reference.

- NUTMEG is recognized as a DP branch device but reports 0 sinks,
  which is wrong and confuses DC (it hits an early return).
  Fix that by hardcoding the sink count to 1.

- Fixup old DC code selecting a special panel mode necessary
  for NUTMEG and TRAVIS.

Signed-off-by: Timur Kristóf <[email protected]>
---
 .../drm/amd/display/dc/link/link_detection.c  | 20 +++++++++++--------
 .../link/protocols/link_edp_panel_control.c   |  8 ++------
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.c 
b/drivers/gpu/drm/amd/display/dc/link/link_detection.c
index 2ccbca570c77..aa3df3a090d5 100644
--- a/drivers/gpu/drm/amd/display/dc/link/link_detection.c
+++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.c
@@ -150,14 +150,6 @@ static enum signal_type get_basic_signal_type(struct 
graphics_object_id encoder,
                default:
                        return SIGNAL_TYPE_NONE;
                }
-       } else if (downstream.type == OBJECT_TYPE_ENCODER) {
-               switch (downstream.id) {
-               case ENCODER_ID_EXTERNAL_NUTMEG:
-               case ENCODER_ID_EXTERNAL_TRAVIS:
-                       return SIGNAL_TYPE_DISPLAY_PORT;
-               default:
-                       return SIGNAL_TYPE_NONE;
-               }
        }
 
        return SIGNAL_TYPE_NONE;
@@ -174,6 +166,10 @@ static enum signal_type 
link_detect_sink_signal_type(struct dc_link *link,
        struct audio_support *aud_support;
        struct graphics_object_id enc_id;
 
+       /* External DP bridges should use DP signal regardless of connector 
type. */
+       if (link->ext_enc_id.id)
+               return SIGNAL_TYPE_DISPLAY_PORT;
+
        if (link->is_dig_mapping_flexible)
                enc_id = (struct graphics_object_id){.id = ENCODER_ID_UNKNOWN};
        else
@@ -620,6 +616,14 @@ static bool detect_dp(struct dc_link *link,
                link->dpcd_caps.usb4_dp_tun_info.dp_tun_cap.raw = 0;
        }
 
+       if (link->ext_enc_id.id) {
+               /* Fix number of connected sinks reported by external DP bridge 
*/
+               link->dpcd_caps.sink_count.bits.SINK_COUNT = 1;
+               /* NUTMEG requires that we use HBR, doesn't work with RBR. */
+               if (link->dpcd_caps.branch_dev_id == DP_BRANCH_DEVICE_ID_00001A)
+                       link->preferred_link_setting.link_rate = LINK_RATE_HIGH;
+       }
+
        return true;
 }
 
diff --git 
a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c 
b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c
index aa02b38e183a..5b2c1a4911cf 100644
--- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c
+++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c
@@ -100,11 +100,7 @@ void dp_set_panel_mode(struct dc_link *link, enum 
dp_panel_mode panel_mode)
 
 enum dp_panel_mode dp_get_panel_mode(struct dc_link *link)
 {
-       /* We need to explicitly check that connector
-        * is not DP. Some Travis_VGA get reported
-        * by video bios as DP.
-        */
-       if (link->connector_signal != SIGNAL_TYPE_DISPLAY_PORT) {
+       if (link->ext_enc_id.id) {
 
                switch (link->dpcd_caps.branch_dev_id) {
                case DP_BRANCH_DEVICE_ID_0022B9:
@@ -124,7 +120,7 @@ enum dp_panel_mode dp_get_panel_mode(struct dc_link *link)
                        }
                        break;
                case DP_BRANCH_DEVICE_ID_00001A:
-                       /* alternate scrambler reset is required for Travis
+                       /* alternate scrambler reset is required for NUTMEG
                         * for the case when external chip does not provide
                         * sink device id, alternate scrambler scheme will
                         * be overriden later by querying Encoder feature
-- 
2.52.0

Reply via email to