diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 47 | 
1 files changed, 20 insertions, 27 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 2c999725b3d4..7a34090cef34 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c @@ -33,7 +33,6 @@  static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,  					struct intel_crtc_state *pipe_config)  { -	struct drm_device *dev = encoder->base.dev;  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);  	struct intel_digital_port *intel_dig_port = intel_mst->primary;  	struct intel_dp *intel_dp = &intel_dig_port->dp; @@ -90,9 +89,6 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,  	pipe_config->dp_m_n.tu = slots; -	if (IS_HASWELL(dev) || IS_BROADWELL(dev)) -		hsw_dp_set_ddi_pll_sel(pipe_config); -  	return true;  } @@ -106,7 +102,7 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder)  	DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); -	drm_dp_mst_reset_vcpi_slots(&intel_dp->mst_mgr, intel_mst->port); +	drm_dp_mst_reset_vcpi_slots(&intel_dp->mst_mgr, intel_mst->connector->port);  	ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);  	if (ret) { @@ -127,10 +123,11 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder)  	/* and this can also fail */  	drm_dp_update_payload_part2(&intel_dp->mst_mgr); -	drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, intel_mst->port); +	drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, intel_mst->connector->port);  	intel_dp->active_mst_links--; -	intel_mst->port = NULL; + +	intel_mst->connector = NULL;  	if (intel_dp->active_mst_links == 0) {  		intel_dig_port->base.post_disable(&intel_dig_port->base);  		intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF); @@ -170,7 +167,8 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder)  	found->encoder = encoder;  	DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); -	intel_mst->port = found->port; + +	intel_mst->connector = found;  	if (intel_dp->active_mst_links == 0) {  		intel_prepare_ddi_buffer(&intel_dig_port->base); @@ -188,7 +186,7 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder)  	}  	ret = drm_dp_mst_allocate_vcpi(&intel_dp->mst_mgr, -				       intel_mst->port, +				       intel_mst->connector->port,  				       intel_crtc->config->pbn, &slots);  	if (ret == false) {  		DRM_ERROR("failed to allocate vcpi\n"); @@ -229,7 +227,7 @@ static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder,  {  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);  	*pipe = intel_mst->pipe; -	if (intel_mst->port) +	if (intel_mst->connector)  		return true;  	return false;  } @@ -290,10 +288,11 @@ static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)  	struct edid *edid;  	int ret; -	edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port); -	if (!edid) -		return 0; +	if (!intel_dp) { +		return intel_connector_update_modes(connector, NULL); +	} +	edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port);  	ret = intel_connector_update_modes(connector, edid);  	kfree(edid); @@ -306,6 +305,8 @@ intel_dp_mst_detect(struct drm_connector *connector, bool force)  	struct intel_connector *intel_connector = to_intel_connector(connector);  	struct intel_dp *intel_dp = intel_connector->mst_port; +	if (!intel_dp) +		return connector_status_disconnected;  	return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr, intel_connector->port);  } @@ -371,6 +372,8 @@ static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *c  	struct intel_dp *intel_dp = intel_connector->mst_port;  	struct intel_crtc *crtc = to_intel_crtc(state->crtc); +	if (!intel_dp) +		return NULL;  	return &intel_dp->mst_encoders[crtc->pipe]->base.base;  } @@ -378,6 +381,8 @@ static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connecto  {  	struct intel_connector *intel_connector = to_intel_connector(connector);  	struct intel_dp *intel_dp = intel_connector->mst_port; +	if (!intel_dp) +		return NULL;  	return &intel_dp->mst_encoders[0]->base.base;  } @@ -488,23 +493,11 @@ static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,  	/* need to nuke the connector */  	drm_modeset_lock_all(dev); -	if (connector->state->crtc) { -		struct drm_mode_set set; -		int ret; - -		memset(&set, 0, sizeof(set)); -		set.crtc = connector->state->crtc, - -		ret = drm_atomic_helper_set_config(&set); - -		WARN(ret, "Disabling mst crtc failed with %i\n", ret); -	} -  	intel_connector_remove_from_fbdev(intel_connector); -	drm_connector_cleanup(connector); +	intel_connector->mst_port = NULL;  	drm_modeset_unlock_all(dev); -	kfree(intel_connector); +	drm_connector_unreference(&intel_connector->base);  	DRM_DEBUG_KMS("\n");  }  |