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

Commit 1b509259 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Jani Nikula
Browse files

drm/i915: use intel_crtc_control everywhere, v3.



Having a single path for everything makes it a lot easier to keep
crtc_state->active in sync with intel_crtc->active.

A crtc cannot be changed to active when not enabled, because it means
no mode is set and no connectors are connected.

This should also make intel_crtc->active match crtc_state->active.

Changes since v1:
- Reworded commit message, there's no intel_crtc_toggle.
Changes since v2:
- Change some callers of intel_crtc_control to intel_display_suspend.

Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 6b72d486
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -3630,12 +3630,18 @@ static void hsw_trans_edp_pipe_A_crc_wa(struct drm_device *dev)
	 */
	if (crtc->config->cpu_transcoder == TRANSCODER_EDP &&
	    !crtc->config->pch_pfit.enabled) {
		bool active = crtc->active;

		if (active)
			intel_crtc_control(&crtc->base, false);

		crtc->config->pch_pfit.force_thru = true;

		intel_display_power_get(dev_priv,
					POWER_DOMAIN_PIPE_PANEL_FITTER(PIPE_A));

		intel_crtc_reset(crtc);
		if (active)
			intel_crtc_control(&crtc->base, true);
	}
	drm_modeset_unlock_all(dev);
}
@@ -3654,12 +3660,18 @@ static void hsw_undo_trans_edp_pipe_A_crc_wa(struct drm_device *dev)
	 * routing.
	 */
	if (crtc->config->pch_pfit.force_thru) {
		crtc->config->pch_pfit.force_thru = false;
		bool active = crtc->active;

		intel_crtc_reset(crtc);
		if (active)
			intel_crtc_control(&crtc->base, false);

		crtc->config->pch_pfit.force_thru = false;

		intel_display_power_put(dev_priv,
					POWER_DOMAIN_PIPE_PANEL_FITTER(PIPE_A));

		if (active)
			intel_crtc_control(&crtc->base, true);
	}
	drm_modeset_unlock_all(dev);
}
+20 −34
Original line number Diff line number Diff line
@@ -3175,19 +3175,6 @@ static void intel_update_primary_planes(struct drm_device *dev)
	}
}

void intel_crtc_reset(struct intel_crtc *crtc)
{
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);

	if (!crtc->active)
		return;

	intel_crtc_disable_planes(&crtc->base);
	dev_priv->display.crtc_disable(&crtc->base);
	dev_priv->display.crtc_enable(&crtc->base);
	intel_crtc_enable_planes(&crtc->base);
}

void intel_prepare_reset(struct drm_device *dev)
{
	/* no reset support for gen2 */
@@ -3199,7 +3186,6 @@ void intel_prepare_reset(struct drm_device *dev)
		return;

	drm_modeset_lock_all(dev);

	/*
	 * Disabling the crtcs gracefully seems nicer. Also the
	 * g33 docs say we should at least disable all the planes.
@@ -6305,8 +6291,14 @@ void intel_crtc_control(struct drm_crtc *crtc, bool enable)
	enum intel_display_power_domain domain;
	unsigned long domains;

	if (enable == intel_crtc->active)
		return;

	if (enable && !crtc->state->enable)
		return;

	crtc->state->active = enable;
	if (enable) {
		if (!intel_crtc->active) {
		domains = get_crtc_power_domains(crtc);
		for_each_power_domain(domain, domains)
			intel_display_power_get(dev_priv, domain);
@@ -6314,9 +6306,7 @@ void intel_crtc_control(struct drm_crtc *crtc, bool enable)

		dev_priv->display.crtc_enable(crtc);
		intel_crtc_enable_planes(crtc);
		}
	} else {
		if (intel_crtc->active) {
		intel_crtc_disable_planes(crtc);
		dev_priv->display.crtc_disable(crtc);

@@ -6326,7 +6316,6 @@ void intel_crtc_control(struct drm_crtc *crtc, bool enable)
		intel_crtc->enabled_power_domains = 0;
	}
}
}

/**
 * Sets the power management mode of the pipe and plane.
@@ -6341,8 +6330,6 @@ void intel_crtc_update_dpms(struct drm_crtc *crtc)
		enable |= intel_encoder->connectors_active;

	intel_crtc_control(crtc, enable);

	crtc->state->active = enable;
}

void intel_encoder_destroy(struct drm_encoder *encoder)
@@ -15240,8 +15227,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
		plane = crtc->plane;
		to_intel_plane_state(crtc->base.primary->state)->visible = true;
		crtc->plane = !plane;
		intel_crtc_disable_planes(&crtc->base);
		dev_priv->display.crtc_disable(&crtc->base);
		intel_crtc_control(&crtc->base, false);
		crtc->plane = plane;

		/* ... and break all links. */
+0 −1
Original line number Diff line number Diff line
@@ -995,7 +995,6 @@ void intel_mark_idle(struct drm_device *dev);
void intel_crtc_restore_mode(struct drm_crtc *crtc);
void intel_display_suspend(struct drm_device *dev);
void intel_crtc_control(struct drm_crtc *crtc, bool enable);
void intel_crtc_reset(struct intel_crtc *crtc);
void intel_crtc_update_dpms(struct drm_crtc *crtc);
void intel_encoder_destroy(struct drm_encoder *encoder);
int intel_connector_init(struct intel_connector *);