All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel.vetter@ffwll.ch>
To: Intel Graphics Development <intel-gfx@lists.freedesktop.org>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Subject: [PATCH 12/43] drm/i915/dp: convert to encoder disable/enable
Date: Tue,  3 Jul 2012 11:28:04 +0200	[thread overview]
Message-ID: <1341307715-3886-13-git-send-email-daniel.vetter@ffwll.ch> (raw)
In-Reply-To: <1341307715-3886-1-git-send-email-daniel.vetter@ffwll.ch>

DP is the first encoder which isn't simple. As

commit d240f20f545fa4ed78ce48d1eb62ab529f2b1467
Author: Jesse Barnes <jbarnes@virtuousgeek.org>
Date:   Fri Aug 13 15:43:26 2010 -0700

    drm/i915: make sure eDP PLL is enabled at the right time

discovered, we need to enable the eDP PLL for the cpu port _before_ we
enable the pipes and planes. After a few more commits the current
solution is to enable the PLL in the dp mode_set function (because
this is the only encoder callback the crtc helper code calls before it
calls the crtc's commit function).

Now I suspect that we actually should enable/disable the entire cpu
eDP port before/after planes, but thanks to how the crtc helper code
assumes that you can disable an encoder without disabling it's crtc
right away, this won't work.

The result is that the current prepare/commit hooks don't touch the
eDP PLL, but instead it get's frobbed in dp_mode_set and in the dp
dpms function. Hence we need to keep things (at least for now)
bug-for-bug compatible by using our own special dp dpms function and
keep everything else more-or-less as-is (just using our own
infrastrucutre now).

This mess can only be cleaned once we control the entire modeset
sequence and can move around things freely.

v2: Squash unsupported dpms modes to OFF at the beginning of the DP
dpms function.

Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
 drivers/gpu/drm/i915/intel_dp.c |   88 +++++++++++++++++++-------------------
 1 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 096947d..b8abbff 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1277,10 +1277,9 @@ static void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
 	}
 }
 
-static void intel_dp_prepare(struct drm_encoder *encoder)
+static void intel_disable_dp(struct intel_encoder *encoder)
 {
-	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
-
+	struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 
 	/* Make sure the panel is off before trying to change the mode. But also
 	 * ensure that we have vdd while we switch off the panel. */
@@ -1293,62 +1292,60 @@ static void intel_dp_prepare(struct drm_encoder *encoder)
 	ironlake_edp_panel_vdd_off(intel_dp, false);
 }
 
-static void intel_dp_commit(struct drm_encoder *encoder)
+static void intel_enable_dp(struct intel_encoder *encoder)
 {
-	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
-	struct drm_device *dev = encoder->dev;
-	struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.base.crtc);
+	struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
+	struct drm_device *dev = encoder->base.dev;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	uint32_t dp_reg = I915_READ(intel_dp->output_reg);
 
 	ironlake_edp_panel_vdd_on(intel_dp);
 	intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
-	intel_dp_start_link_train(intel_dp);
-	ironlake_edp_panel_on(intel_dp);
-	ironlake_edp_panel_vdd_off(intel_dp, true);
-	intel_dp_complete_link_train(intel_dp);
+	if (!(dp_reg & DP_PORT_EN)) {
+		intel_dp_start_link_train(intel_dp);
+		ironlake_edp_panel_on(intel_dp);
+		ironlake_edp_panel_vdd_off(intel_dp, true);
+		intel_dp_complete_link_train(intel_dp);
+	} else
+		ironlake_edp_panel_vdd_off(intel_dp, false);
 	ironlake_edp_backlight_on(intel_dp);
 
 	intel_dp->dpms_mode = DRM_MODE_DPMS_ON;
-
-	if (HAS_PCH_CPT(dev))
-		intel_cpt_verify_modeset(dev, intel_crtc->pipe);
 }
 
 static void
-intel_dp_dpms(struct drm_encoder *encoder, int mode)
+intel_dp_dpms(struct drm_connector *connector, int mode)
 {
-	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
-	struct drm_device *dev = encoder->dev;
-	struct drm_i915_private *dev_priv = dev->dev_private;
-	uint32_t dp_reg = I915_READ(intel_dp->output_reg);
+	struct intel_dp *intel_dp = intel_attached_dp(connector);
 
-	if (mode != DRM_MODE_DPMS_ON) {
-		/* Switching the panel off requires vdd. */
-		ironlake_edp_panel_vdd_on(intel_dp);
-		ironlake_edp_backlight_off(intel_dp);
-		ironlake_edp_panel_off(intel_dp);
+	/* DP supports only 2 dpms states. */
+	if (mode != DRM_MODE_DPMS_ON)
+		mode = DRM_MODE_DPMS_OFF;
 
-		intel_dp_sink_dpms(intel_dp, mode);
-		intel_dp_link_down(intel_dp);
-		ironlake_edp_panel_vdd_off(intel_dp, false);
+	if (mode == connector->dpms)
+		return;
+
+	connector->dpms = mode;
+
+	/* Only need to change hw state when actually enabled */
+	if (!intel_dp->base.base.crtc) {
+		intel_dp->base.connectors_active = false;
+		return;
+	}
+
+	if (mode != DRM_MODE_DPMS_ON) {
+		intel_encoder_dpms(&intel_dp->base, mode);
+		WARN_ON(intel_dp->dpms_mode != DRM_MODE_DPMS_OFF);
 
 		if (is_cpu_edp(intel_dp))
-			ironlake_edp_pll_off(encoder);
+			ironlake_edp_pll_off(&intel_dp->base.base);
 	} else {
 		if (is_cpu_edp(intel_dp))
-			ironlake_edp_pll_on(encoder);
+			ironlake_edp_pll_on(&intel_dp->base.base);
 
-		ironlake_edp_panel_vdd_on(intel_dp);
-		intel_dp_sink_dpms(intel_dp, mode);
-		if (!(dp_reg & DP_PORT_EN)) {
-			intel_dp_start_link_train(intel_dp);
-			ironlake_edp_panel_on(intel_dp);
-			ironlake_edp_panel_vdd_off(intel_dp, true);
-			intel_dp_complete_link_train(intel_dp);
-		} else
-			ironlake_edp_panel_vdd_off(intel_dp, false);
-		ironlake_edp_backlight_on(intel_dp);
+		intel_encoder_dpms(&intel_dp->base, mode);
+		WARN_ON(intel_dp->dpms_mode != DRM_MODE_DPMS_ON);
 	}
-	intel_dp->dpms_mode = mode;
 }
 
 /*
@@ -2361,15 +2358,15 @@ static void intel_dp_encoder_destroy(struct drm_encoder *encoder)
 }
 
 static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = {
-	.dpms = intel_dp_dpms,
 	.mode_fixup = intel_dp_mode_fixup,
-	.prepare = intel_dp_prepare,
+	.prepare = intel_encoder_noop,
 	.mode_set = intel_dp_mode_set,
-	.commit = intel_dp_commit,
+	.commit = intel_encoder_noop,
+	.disable = intel_encoder_disable,
 };
 
 static const struct drm_connector_funcs intel_dp_connector_funcs = {
-	.dpms = drm_helper_connector_dpms,
+	.dpms = intel_dp_dpms,
 	.detect = intel_dp_detect,
 	.fill_modes = drm_helper_probe_single_connector_modes,
 	.set_property = intel_dp_set_property,
@@ -2507,6 +2504,9 @@ intel_dp_init(struct drm_device *dev, int output_reg)
 	intel_connector_attach_encoder(intel_connector, intel_encoder);
 	drm_sysfs_connector_add(connector);
 
+	intel_encoder->enable = intel_enable_dp;
+	intel_encoder->disable = intel_disable_dp;
+
 	/* Set up the DDC bus. */
 	switch (output_reg) {
 		case DP_A:
-- 
1.7.7.6

  parent reply	other threads:[~2012-07-03 10:34 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-03  9:27 [PATCH 00/43] [RFC] modeset rework, part 1 Daniel Vetter
2012-07-03  9:27 ` [PATCH 01/43] drm/i915: introduce for_each_encoder_on_crtc Daniel Vetter
2012-07-04 21:29   ` Paulo Zanoni
2012-07-05  7:50     ` [PATCH] " Daniel Vetter
2012-07-05 13:08       ` Daniel Vetter
2012-07-03  9:27 ` [PATCH 02/43] drm/i915: add crtc->enable/disable vfuncs insted of dpms Daniel Vetter
2012-07-03  9:27 ` [PATCH 03/43] drm/i915: rip out crtc prepare/commit indirection Daniel Vetter
2012-07-03  9:27 ` [PATCH 04/43] drm/i915: add direct encoder disable/enable infrastructure Daniel Vetter
2012-07-03  9:27 ` [PATCH 05/43] drm/i915: add missing gen2 pipe A quirk entries Daniel Vetter
2012-07-03  9:27 ` [PATCH 06/43] drm/i915: rip out the overlay pipe A workaround Daniel Vetter
2012-07-03  9:27 ` [PATCH 07/43] drm/i915: prepare load-detect pipe code for dpms changes Daniel Vetter
2012-07-03  9:28 ` [PATCH 08/43] drm/i915/hdmi: convert to encoder->disable/enable Daniel Vetter
2012-07-26 17:12   ` Paulo Zanoni
2012-07-03  9:28 ` [PATCH 09/43] drm/i915/tv: convert to encoder enable/disable Daniel Vetter
2012-07-03  9:28 ` [PATCH 10/43] drm/i915/lvds: ditch ->prepare special case Daniel Vetter
2012-07-03  9:28 ` [PATCH 11/43] drm/i915/lvds: convert to encoder disable/enable Daniel Vetter
2012-07-03  9:28 ` Daniel Vetter [this message]
2012-07-03  9:28 ` [PATCH 13/43] drm/i915: create VLV_DSIPLAY_BASE #define Daniel Vetter
2012-07-03  9:28 ` [PATCH 14/43] drm/i915: group ADPA #defines together Daniel Vetter
2012-07-03  9:28 ` [PATCH 15/43] drm/i915: add inte_crt->adpa_reg Daniel Vetter
2012-07-03  9:28 ` [PATCH 16/43] drm/i915/crt: convert to encoder disable/enable Daniel Vetter
2012-07-03  9:28 ` [PATCH 17/43] drm/i915/sdvo: convert to encoder disabl/enable Daniel Vetter
2012-07-03  9:28 ` [PATCH 18/43] drm/i915: simplify dvo dpms interface Daniel Vetter
2012-07-03  9:28 ` [PATCH 19/43] drm/i915: simplify possible_clones computation Daniel Vetter
2012-07-03  9:28 ` [PATCH 20/43] drm/i915: add port parameter to intel_hdmi_init Daniel Vetter
2012-07-03  9:28 ` [PATCH 21/43] drm/i915: convert dpms functions of dvo/sdvo/crt Daniel Vetter
2012-07-03  9:28 ` [PATCH 22/43] drm/i915: rip out encoder->disable/enable checks Daniel Vetter
2012-07-03  9:28 ` [PATCH 23/43] drm/i915: clean up encoder_prepare/commit Daniel Vetter
2012-07-03  9:28 ` [PATCH 24/43] drm/fb helper: don't call drm_crtc_helper_set_config Daniel Vetter
2012-07-03  9:28 ` [PATCH 25/43] drm: remove the list_head from drm_mode_set Daniel Vetter
2012-07-03  9:28 ` [PATCH 26/43] drm/i915: copy&paste drm_crtc_helper_set_config Daniel Vetter
2012-07-03  9:28 ` [PATCH 27/43] drm/i915: call set_base directly Daniel Vetter
2012-07-03  9:28 ` [PATCH 28/43] drm/i915: inline intel_best_encoder Daniel Vetter
2012-07-03  9:28 ` [PATCH 29/43] drm/i915: copy&paste drm_crtc_helper_set_mode Daniel Vetter
2012-07-25 21:14   ` Paulo Zanoni
2012-07-03  9:28 ` [PATCH 30/43] drm/i915: simplify intel_crtc_prepare_encoders Daniel Vetter
2012-07-03  9:28 ` [PATCH 31/43] drm/i915: rip out encoder->prepare/commit Daniel Vetter
2012-07-03  9:28 ` [PATCH 32/43] drm/i915: call crtc functions directly Daniel Vetter
2012-07-03  9:28 ` [PATCH 33/43] drm/i915: WARN when trying to enabled an unused crtc Daniel Vetter
2012-07-03  9:28 ` [PATCH 34/43] drm/i915: Add interfaces to read out encoder/connector hw state Daniel Vetter
2012-07-03  9:28 ` [PATCH 35/43] drm/i915/dp: implement get_hw_state Daniel Vetter
2012-07-03  9:28 ` [PATCH 36/43] drm/i915/hdmi: " Daniel Vetter
2012-07-03  9:28 ` [PATCH 37/43] drm/i915/tv: " Daniel Vetter
2012-07-03  9:28 ` [PATCH 38/43] drm/i915/lvds: " Daniel Vetter
2012-07-03  9:28 ` [PATCH 39/43] drm/i915/crt: " Daniel Vetter
2012-07-03  9:28 ` [PATCH 40/43] drm/i915/sdvo: " Daniel Vetter
2012-07-03  9:28 ` [PATCH 41/43] drm/i915/dvo: " Daniel Vetter
2012-07-03  9:28 ` [PATCH 42/43] drm/i915: read out the modeset hw state at load and resume time Daniel Vetter
2012-07-03  9:28 ` [PATCH 43/43] drm/i915: check connector hw/sw state Daniel Vetter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1341307715-3886-13-git-send-email-daniel.vetter@ffwll.ch \
    --to=daniel.vetter@ffwll.ch \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.