Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9885ef8 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-intel-next-fixes-2018-10-25' of...

Merge tag 'drm-intel-next-fixes-2018-10-25' of git://anongit.freedesktop.org/drm/drm-intel

 into drm-next

- Fix to avoid link retraining workaround on eDP (the other is a comment change)

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181025131836.GA2296@jlahtine-desk.ger.corp.intel.com
parents 43e0f873 f9776280
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -308,6 +308,26 @@ update_connector_routing(struct drm_atomic_state *state,
		return 0;
	}

	crtc_state = drm_atomic_get_new_crtc_state(state,
						   new_connector_state->crtc);
	/*
	 * For compatibility with legacy users, we want to make sure that
	 * we allow DPMS On->Off modesets on unregistered connectors. Modesets
	 * which would result in anything else must be considered invalid, to
	 * avoid turning on new displays on dead connectors.
	 *
	 * Since the connector can be unregistered at any point during an
	 * atomic check or commit, this is racy. But that's OK: all we care
	 * about is ensuring that userspace can't do anything but shut off the
	 * display on a connector that was destroyed after its been notified,
	 * not before.
	 */
	if (drm_connector_is_unregistered(connector) && crtc_state->active) {
		DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] is not registered\n",
				 connector->base.id, connector->name);
		return -EINVAL;
	}

	funcs = connector->helper_private;

	if (funcs->atomic_best_encoder)
@@ -352,7 +372,6 @@ update_connector_routing(struct drm_atomic_state *state,

	set_best_encoder(state, new_connector_state, new_encoder);

	crtc_state = drm_atomic_get_new_crtc_state(state, new_connector_state->crtc);
	crtc_state->connectors_changed = true;

	DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n",
+6 −5
Original line number Diff line number Diff line
@@ -379,7 +379,8 @@ void drm_connector_cleanup(struct drm_connector *connector)
	/* The connector should have been removed from userspace long before
	 * it is finally destroyed.
	 */
	if (WARN_ON(connector->registered))
	if (WARN_ON(connector->registration_state ==
		    DRM_CONNECTOR_REGISTERED))
		drm_connector_unregister(connector);

	if (connector->tile_group) {
@@ -436,7 +437,7 @@ int drm_connector_register(struct drm_connector *connector)
		return 0;

	mutex_lock(&connector->mutex);
	if (connector->registered)
	if (connector->registration_state != DRM_CONNECTOR_INITIALIZING)
		goto unlock;

	ret = drm_sysfs_connector_add(connector);
@@ -456,7 +457,7 @@ int drm_connector_register(struct drm_connector *connector)

	drm_mode_object_register(connector->dev, &connector->base);

	connector->registered = true;
	connector->registration_state = DRM_CONNECTOR_REGISTERED;
	goto unlock;

err_debugfs:
@@ -478,7 +479,7 @@ EXPORT_SYMBOL(drm_connector_register);
void drm_connector_unregister(struct drm_connector *connector)
{
	mutex_lock(&connector->mutex);
	if (!connector->registered) {
	if (connector->registration_state != DRM_CONNECTOR_REGISTERED) {
		mutex_unlock(&connector->mutex);
		return;
	}
@@ -489,7 +490,7 @@ void drm_connector_unregister(struct drm_connector *connector)
	drm_sysfs_connector_remove(connector);
	drm_debugfs_connector_remove(connector);

	connector->registered = false;
	connector->registration_state = DRM_CONNECTOR_UNREGISTERED;
	mutex_unlock(&connector->mutex);
}
EXPORT_SYMBOL(drm_connector_unregister);
+7 −13
Original line number Diff line number Diff line
@@ -5102,19 +5102,13 @@ intel_dp_long_pulse(struct intel_connector *connector,
		 */
		status = connector_status_disconnected;
		goto out;
	} else {
	}

	/*
		 * If display is now connected check links status,
		 * there has been known issues of link loss triggering
		 * long pulse.
		 *
		 * Some sinks (eg. ASUS PB287Q) seem to perform some
		 * weird HPD ping pong during modesets. So we can apparently
		 * end up with HPD going low during a modeset, and then
		 * going back up soon after. And once that happens we must
		 * retrain the link to get a picture. That's in case no
		 * userspace component reacted to intermittent HPD dip.
	 * Some external monitors do not signal loss of link synchronization
	 * with an IRQ_HPD, so force a link status check.
	 */
	if (!intel_dp_is_edp(intel_dp)) {
		struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;

		intel_dp_retrain_link(encoder, ctx);
+4 −4
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
	pipe_config->pbn = mst_pbn;

	/* Zombie connectors can't have VCPI slots */
	if (READ_ONCE(connector->registered)) {
	if (!drm_connector_is_unregistered(connector)) {
		slots = drm_dp_atomic_find_vcpi_slots(state,
						      &intel_dp->mst_mgr,
						      port,
@@ -313,7 +313,7 @@ static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
	struct edid *edid;
	int ret;

	if (!READ_ONCE(connector->registered))
	if (drm_connector_is_unregistered(connector))
		return intel_connector_update_modes(connector, NULL);

	edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port);
@@ -329,7 +329,7 @@ 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 (!READ_ONCE(connector->registered))
	if (drm_connector_is_unregistered(connector))
		return connector_status_disconnected;
	return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr,
				      intel_connector->port);
@@ -372,7 +372,7 @@ intel_dp_mst_mode_valid(struct drm_connector *connector,
	int bpp = 24; /* MST uses fixed bpp */
	int max_rate, mode_rate, max_lanes, max_link_clock;

	if (!READ_ONCE(connector->registered))
	if (drm_connector_is_unregistered(connector))
		return MODE_ERROR;

	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
+4 −10
Original line number Diff line number Diff line
@@ -881,22 +881,16 @@ nv50_mstc_atomic_best_encoder(struct drm_connector *connector,
{
	struct nv50_head *head = nv50_head(connector_state->crtc);
	struct nv50_mstc *mstc = nv50_mstc(connector);
	if (mstc->port) {
		struct nv50_mstm *mstm = mstc->mstm;
		return &mstm->msto[head->base.index]->encoder;
	}
	return NULL;

	return &mstc->mstm->msto[head->base.index]->encoder;
}

static struct drm_encoder *
nv50_mstc_best_encoder(struct drm_connector *connector)
{
	struct nv50_mstc *mstc = nv50_mstc(connector);
	if (mstc->port) {
		struct nv50_mstm *mstm = mstc->mstm;
		return &mstm->msto[0]->encoder;
	}
	return NULL;

	return &mstc->mstm->msto[0]->encoder;
}

static enum drm_mode_status
Loading