Commit 20fbb14b authored by Jani Nikula's avatar Jani Nikula

drm/i915/mst: improve debug logging of DP MST mode detect

Rename intel_dp_can_mst() to intel_dp_mst_detect(), and move all DP MST
detect debug logging there. Debug log the sink's MST capability,
including single-stream sideband messaging support, and the decision
whether to enable MST mode or not. Do this regardless of whether we're
actually enabling MST or not.

We need to detect MST in intel_dp_detect_dpcd() before the earlier
returns, but try not to change the logic otherwise.

v2:
- Use "MST", "SST w/ sideband messaging", and "SST" for logging (Ville)
- Return MST mode from intel_dp_mst_detect()
- Do MST detect before early returns from intel_dp_detect_dpcd()

Cc: Arun R Murthy <arun.r.murthy@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/db08536daec0a6062539319d71c10ee1277e3876.1710839496.git.jani.nikula@intel.comSigned-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 281a2cc7
...@@ -4039,31 +4039,50 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp) ...@@ -4039,31 +4039,50 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
intel_dp->downstream_ports) == 0; intel_dp->downstream_ports) == 0;
} }
static bool static const char *intel_dp_mst_mode_str(enum drm_dp_mst_mode mst_mode)
intel_dp_can_mst(struct intel_dp *intel_dp) {
if (mst_mode == DRM_DP_MST)
return "MST";
else if (mst_mode == DRM_DP_SST_SIDEBAND_MSG)
return "SST w/ sideband messaging";
else
return "SST";
}
static enum drm_dp_mst_mode
intel_dp_mst_detect(struct intel_dp *intel_dp)
{ {
struct drm_i915_private *i915 = dp_to_i915(intel_dp); struct drm_i915_private *i915 = dp_to_i915(intel_dp);
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
enum drm_dp_mst_mode sink_mst_mode;
enum drm_dp_mst_mode mst_detect;
sink_mst_mode = drm_dp_read_mst_cap(&intel_dp->aux, intel_dp->dpcd);
if (i915->display.params.enable_dp_mst &&
intel_dp_mst_source_support(intel_dp) &&
sink_mst_mode == DRM_DP_MST)
mst_detect = DRM_DP_MST;
else
mst_detect = DRM_DP_SST;
return i915->display.params.enable_dp_mst && drm_dbg_kms(&i915->drm,
intel_dp_mst_source_support(intel_dp) && "[ENCODER:%d:%s] MST support: port: %s, sink: %s, modparam: %s -> enable: %s\n",
drm_dp_read_mst_cap(&intel_dp->aux, intel_dp->dpcd) == DRM_DP_MST; encoder->base.base.id, encoder->base.name,
str_yes_no(intel_dp_mst_source_support(intel_dp)),
intel_dp_mst_mode_str(sink_mst_mode),
str_yes_no(i915->display.params.enable_dp_mst),
intel_dp_mst_mode_str(mst_detect));
return mst_detect;
} }
static void static void
intel_dp_configure_mst(struct intel_dp *intel_dp) intel_dp_configure_mst(struct intel_dp *intel_dp)
{ {
struct drm_i915_private *i915 = dp_to_i915(intel_dp); struct drm_i915_private *i915 = dp_to_i915(intel_dp);
struct intel_encoder *encoder =
&dp_to_dig_port(intel_dp)->base;
bool sink_can_mst = drm_dp_read_mst_cap(&intel_dp->aux, intel_dp->dpcd) == DRM_DP_MST; bool sink_can_mst = drm_dp_read_mst_cap(&intel_dp->aux, intel_dp->dpcd) == DRM_DP_MST;
drm_dbg_kms(&i915->drm,
"[ENCODER:%d:%s] MST support: port: %s, sink: %s, modparam: %s\n",
encoder->base.base.id, encoder->base.name,
str_yes_no(intel_dp_mst_source_support(intel_dp)),
str_yes_no(sink_can_mst),
str_yes_no(i915->display.params.enable_dp_mst));
if (!intel_dp_mst_source_support(intel_dp)) if (!intel_dp_mst_source_support(intel_dp))
return; return;
...@@ -5420,6 +5439,7 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp) ...@@ -5420,6 +5439,7 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp)
{ {
struct drm_i915_private *i915 = dp_to_i915(intel_dp); struct drm_i915_private *i915 = dp_to_i915(intel_dp);
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
enum drm_dp_mst_mode mst_detect;
u8 *dpcd = intel_dp->dpcd; u8 *dpcd = intel_dp->dpcd;
u8 type; u8 type;
...@@ -5431,6 +5451,8 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp) ...@@ -5431,6 +5451,8 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp)
if (!intel_dp_get_dpcd(intel_dp)) if (!intel_dp_get_dpcd(intel_dp))
return connector_status_disconnected; return connector_status_disconnected;
mst_detect = intel_dp_mst_detect(intel_dp);
/* if there's no downstream port, we're done */ /* if there's no downstream port, we're done */
if (!drm_dp_is_branch(dpcd)) if (!drm_dp_is_branch(dpcd))
return connector_status_connected; return connector_status_connected;
...@@ -5442,7 +5464,7 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp) ...@@ -5442,7 +5464,7 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp)
connector_status_connected : connector_status_disconnected; connector_status_connected : connector_status_disconnected;
} }
if (intel_dp_can_mst(intel_dp)) if (mst_detect == DRM_DP_MST)
return connector_status_connected; return connector_status_connected;
/* If no HPD, poke DDC gently */ /* If no HPD, poke DDC gently */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment