Commit e85376cb authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Jani Nikula

drm/i915: Fix broken mst get_hw_state.

connector->encoder is initialized as NULL. Fix this by setting it in
during pre enable. MST connectors are not read out during initial hw
readout, and have no fixed encoder mappings. So it's harmless to
return false when the connector has never been assigned to an encoder.
Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarAnder Conselvan de Oliveira <conselvan2@gmail.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 4e3d1e26
...@@ -6305,7 +6305,7 @@ static void intel_connector_check_state(struct intel_connector *connector) ...@@ -6305,7 +6305,7 @@ static void intel_connector_check_state(struct intel_connector *connector)
connector->base.name); connector->base.name);
if (connector->get_hw_state(connector)) { if (connector->get_hw_state(connector)) {
struct drm_encoder *encoder = &connector->encoder->base; struct intel_encoder *encoder = connector->encoder;
struct drm_connector_state *conn_state = connector->base.state; struct drm_connector_state *conn_state = connector->base.state;
I915_STATE_WARN(!crtc, I915_STATE_WARN(!crtc,
...@@ -6317,13 +6317,13 @@ static void intel_connector_check_state(struct intel_connector *connector) ...@@ -6317,13 +6317,13 @@ static void intel_connector_check_state(struct intel_connector *connector)
I915_STATE_WARN(!crtc->state->active, I915_STATE_WARN(!crtc->state->active,
"connector is active, but attached crtc isn't\n"); "connector is active, but attached crtc isn't\n");
if (!encoder) if (!encoder || encoder->type == INTEL_OUTPUT_DP_MST)
return; return;
I915_STATE_WARN(conn_state->best_encoder != encoder, I915_STATE_WARN(conn_state->best_encoder != &encoder->base,
"atomic encoder doesn't match attached encoder\n"); "atomic encoder doesn't match attached encoder\n");
I915_STATE_WARN(conn_state->crtc != encoder->crtc, I915_STATE_WARN(conn_state->crtc != encoder->base.crtc,
"attached encoder crtc differs from connector crtc\n"); "attached encoder crtc differs from connector crtc\n");
} else { } else {
I915_STATE_WARN(crtc && crtc->state->active, I915_STATE_WARN(crtc && crtc->state->active,
......
...@@ -173,6 +173,11 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder) ...@@ -173,6 +173,11 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder)
return; return;
} }
/* MST encoders are bound to a crtc, not to a connector,
* force the mapping here for get_hw_state.
*/
found->encoder = encoder;
DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
intel_mst->port = found->port; intel_mst->port = found->port;
...@@ -400,7 +405,7 @@ static const struct drm_encoder_funcs intel_dp_mst_enc_funcs = { ...@@ -400,7 +405,7 @@ static const struct drm_encoder_funcs intel_dp_mst_enc_funcs = {
static bool intel_dp_mst_get_hw_state(struct intel_connector *connector) static bool intel_dp_mst_get_hw_state(struct intel_connector *connector)
{ {
if (connector->encoder) { if (connector->encoder && connector->base.state->crtc) {
enum pipe pipe; enum pipe pipe;
if (!connector->encoder->get_hw_state(connector->encoder, &pipe)) if (!connector->encoder->get_hw_state(connector->encoder, &pipe))
return false; return false;
......
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