All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: [PATCH v3 02/20] drm/i915: Do not update pfit state when toggling crtc enabled.
Date: Mon, 13 Jul 2015 16:30:15 +0200	[thread overview]
Message-ID: <1436797833-11493-3-git-send-email-maarten.lankhorst@linux.intel.com> (raw)
In-Reply-To: <1436797833-11493-1-git-send-email-maarten.lankhorst@linux.intel.com>

There's not much point for calculating the changes for the old
state. Instead just disable all scalers when disabling. It's
probably good enough to just disable the crtc_scaler, but just in
case there's a bug disable all scalers.

This means intel_atomic_setup_scalers is only called in the crtc
check function now, so all the transitional code can be removed.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_atomic.c  | 14 ++------
 drivers/gpu/drm/i915/intel_display.c | 68 +++++++++++++++++++++++-------------
 drivers/gpu/drm/i915/intel_dp.c      |  2 +-
 drivers/gpu/drm/i915/intel_drv.h     |  2 +-
 4 files changed, 48 insertions(+), 38 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c
index 5c79a31603af..b92b8581efc2 100644
--- a/drivers/gpu/drm/i915/intel_atomic.c
+++ b/drivers/gpu/drm/i915/intel_atomic.c
@@ -272,17 +272,12 @@ int intel_atomic_setup_scalers(struct drm_device *dev,
 	struct drm_plane *plane = NULL;
 	struct intel_plane *intel_plane;
 	struct intel_plane_state *plane_state = NULL;
-	struct intel_crtc_scaler_state *scaler_state;
-	struct drm_atomic_state *drm_state;
+	struct intel_crtc_scaler_state *scaler_state =
+		&crtc_state->scaler_state;
+	struct drm_atomic_state *drm_state = crtc_state->base.state;
 	int num_scalers_need;
 	int i, j;
 
-	if (INTEL_INFO(dev)->gen < 9 || !intel_crtc || !crtc_state)
-		return 0;
-
-	scaler_state = &crtc_state->scaler_state;
-	drm_state = crtc_state->base.state;
-
 	num_scalers_need = hweight32(scaler_state->scaler_users);
 	DRM_DEBUG_KMS("crtc_state = %p need = %d avail = %d scaler_users = 0x%x\n",
 		crtc_state, num_scalers_need, intel_crtc->num_scalers,
@@ -326,9 +321,6 @@ int intel_atomic_setup_scalers(struct drm_device *dev,
 		} else {
 			name = "PLANE";
 
-			if (!drm_state)
-				continue;
-
 			/* plane scaler case: assign as a plane scaler */
 			/* find the plane that set the bit as scaler_user */
 			plane = drm_state->planes[i];
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index f9b1db734502..6eed925f3300 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2909,29 +2909,32 @@ unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane,
 	return i915_gem_obj_ggtt_offset_view(obj, view);
 }
 
+static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id)
+{
+	struct drm_device *dev = intel_crtc->base.dev;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+
+	I915_WRITE(SKL_PS_CTRL(intel_crtc->pipe, id), 0);
+	I915_WRITE(SKL_PS_WIN_POS(intel_crtc->pipe, id), 0);
+	I915_WRITE(SKL_PS_WIN_SZ(intel_crtc->pipe, id), 0);
+	DRM_DEBUG_KMS("CRTC:%d Disabled scaler id %u.%u\n",
+		intel_crtc->base.base.id, intel_crtc->pipe, id);
+}
+
 /*
  * This function detaches (aka. unbinds) unused scalers in hardware
  */
 static void skl_detach_scalers(struct intel_crtc *intel_crtc)
 {
-	struct drm_device *dev;
-	struct drm_i915_private *dev_priv;
 	struct intel_crtc_scaler_state *scaler_state;
 	int i;
 
-	dev = intel_crtc->base.dev;
-	dev_priv = dev->dev_private;
 	scaler_state = &intel_crtc->config->scaler_state;
 
 	/* loop through and disable scalers that aren't in use */
 	for (i = 0; i < intel_crtc->num_scalers; i++) {
-		if (!scaler_state->scalers[i].in_use) {
-			I915_WRITE(SKL_PS_CTRL(intel_crtc->pipe, i), 0);
-			I915_WRITE(SKL_PS_WIN_POS(intel_crtc->pipe, i), 0);
-			I915_WRITE(SKL_PS_WIN_SZ(intel_crtc->pipe, i), 0);
-			DRM_DEBUG_KMS("CRTC:%d Disabled scaler id %u.%u\n",
-				intel_crtc->base.base.id, intel_crtc->pipe, i);
-		}
+		if (!scaler_state->scalers[i].in_use)
+			skl_detach_scaler(intel_crtc, i);
 	}
 }
 
@@ -4362,13 +4365,12 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
  * skl_update_scaler_crtc - Stages update to scaler state for a given crtc.
  *
  * @state: crtc's scaler state
- * @force_detach: whether to forcibly disable scaler
  *
  * Return
  *     0 - scaler_usage updated successfully
  *    error - requested scaling cannot be supported or other error condition
  */
-int skl_update_scaler_crtc(struct intel_crtc_state *state, int force_detach)
+int skl_update_scaler_crtc(struct intel_crtc_state *state)
 {
 	struct intel_crtc *intel_crtc = to_intel_crtc(state->base.crtc);
 	struct drm_display_mode *adjusted_mode =
@@ -4377,7 +4379,7 @@ int skl_update_scaler_crtc(struct intel_crtc_state *state, int force_detach)
 	DRM_DEBUG_KMS("Updating scaler for [CRTC:%i] scaler_user index %u.%u\n",
 		      intel_crtc->base.base.id, intel_crtc->pipe, SKL_CRTC_INDEX);
 
-	return skl_update_scaler(state, force_detach, SKL_CRTC_INDEX,
+	return skl_update_scaler(state, !state->base.active, SKL_CRTC_INDEX,
 		&state->scaler_state.scaler_id, DRM_ROTATE_0,
 		state->pipe_src_w, state->pipe_src_h,
 		adjusted_mode->hdisplay, adjusted_mode->vdisplay);
@@ -4451,7 +4453,15 @@ static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state,
 	return 0;
 }
 
-static void skylake_pfit_update(struct intel_crtc *crtc, int enable)
+static void skylake_scaler_disable(struct intel_crtc *crtc)
+{
+	int i;
+
+	for (i = 0; i < crtc->num_scalers; i++)
+		skl_detach_scaler(crtc, i);
+}
+
+static void skylake_pfit_enable(struct intel_crtc *crtc)
 {
 	struct drm_device *dev = crtc->base.dev;
 	struct drm_i915_private *dev_priv = dev->dev_private;
@@ -4461,13 +4471,6 @@ static void skylake_pfit_update(struct intel_crtc *crtc, int enable)
 
 	DRM_DEBUG_KMS("for crtc_state = %p\n", crtc->config);
 
-	/* To update pfit, first update scaler state */
-	skl_update_scaler_crtc(crtc->config, !enable);
-	intel_atomic_setup_scalers(crtc->base.dev, crtc, crtc->config);
-	skl_detach_scalers(crtc);
-	if (!enable)
-		return;
-
 	if (crtc->config->pch_pfit.enabled) {
 		int id;
 
@@ -4942,7 +4945,7 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
 	intel_ddi_enable_pipe_clock(intel_crtc);
 
 	if (INTEL_INFO(dev)->gen == 9)
-		skylake_pfit_update(intel_crtc, 1);
+		skylake_pfit_enable(intel_crtc);
 	else if (INTEL_INFO(dev)->gen < 9)
 		ironlake_pfit_enable(intel_crtc);
 	else
@@ -5079,7 +5082,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
 	intel_ddi_disable_transcoder_func(dev_priv, cpu_transcoder);
 
 	if (INTEL_INFO(dev)->gen == 9)
-		skylake_pfit_update(intel_crtc, 0);
+		skylake_scaler_disable(intel_crtc);
 	else if (INTEL_INFO(dev)->gen < 9)
 		ironlake_pfit_disable(intel_crtc);
 	else
@@ -11836,7 +11839,17 @@ static int intel_crtc_atomic_check(struct drm_crtc *crtc,
 			return ret;
 	}
 
-	return intel_atomic_setup_scalers(dev, intel_crtc, pipe_config);
+	ret = 0;
+	if (INTEL_INFO(dev)->gen >= 9) {
+		if (mode_changed)
+			ret = skl_update_scaler_crtc(pipe_config);
+
+		if (!ret)
+			ret = intel_atomic_setup_scalers(dev, intel_crtc,
+							 pipe_config);
+	}
+
+	return ret;
 }
 
 static const struct drm_crtc_helper_funcs intel_helper_funcs = {
@@ -15357,6 +15370,11 @@ static void readout_plane_state(struct intel_crtc *crtc,
 			continue;
 
 		drm_plane_state = p->base.state;
+
+		/* Plane scaler state is not touched here. The first atomic
+		 * commit will restore all plane scalers to its old state.
+		 */
+
 		if (active && p->base.type == DRM_PLANE_TYPE_PRIMARY) {
 			visible = primary_get_hw_state(crtc);
 			to_intel_plane_state(drm_plane_state)->visible = visible;
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index fcc64e5ef9c8..f1b9f939b435 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1384,7 +1384,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
 
 		if (INTEL_INFO(dev)->gen >= 9) {
 			int ret;
-			ret = skl_update_scaler_crtc(pipe_config, 0);
+			ret = skl_update_scaler_crtc(pipe_config);
 			if (ret)
 				return ret;
 		}
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index b9c01c5b881f..09a0a9222a3a 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1149,7 +1149,7 @@ void intel_mode_from_pipe_config(struct drm_display_mode *mode,
 void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc);
 void intel_modeset_preclose(struct drm_device *dev, struct drm_file *file);
 
-int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state, int force_detach);
+int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state);
 int skl_max_scale(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state);
 
 unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane,
-- 
2.1.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  parent reply	other threads:[~2015-07-13 14:30 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-13 14:30 [PATCH v3 00/20] Convert to atomic, part 4 Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 01/20] drm/i915: Only update state on crtc's that are part of the atomic state Maarten Lankhorst
2015-07-13 14:30 ` Maarten Lankhorst [this message]
2015-07-13 14:30 ` [PATCH v3 03/20] drm/i915: Do not use plane_config in intel_fbdev.c Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 04/20] drm/i915: Allow fuzzy matching in pipe_config_compare, v2 Maarten Lankhorst
2015-07-14  9:49   ` Daniel Vetter
2015-07-14 10:17     ` [PATCH v3.1 " Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 05/20] drm/i915: Update missing properties in find_initial_plane_obj Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 06/20] drm/i915: Remove plane_config from struct intel_crtc Maarten Lankhorst
2015-07-13 16:30   ` Daniel Stone
2015-07-14  8:27     ` Maarten Lankhorst
2015-07-14 11:23       ` Daniel Stone
2015-07-14 10:33     ` [PATCH v3.1 06/20] drm/i915: Remove plane_config from struct intel_crtc, v2 Maarten Lankhorst
2015-07-14 12:02       ` Daniel Vetter
2015-07-13 14:30 ` [PATCH v3 07/20] drm/i915: Rework plane readout Maarten Lankhorst
2015-07-14  9:53   ` Daniel Vetter
2015-07-14 10:30     ` Maarten Lankhorst
2015-07-14 10:35       ` Daniel Vetter
2015-07-13 14:30 ` [PATCH v3 08/20] drm/i915: fill in more mode members Maarten Lankhorst
2015-07-14  9:50   ` Daniel Vetter
2015-07-14 10:31     ` Maarten Lankhorst
2015-07-14 11:21     ` Daniel Stone
2015-07-14 11:40       ` Maarten Lankhorst
2015-07-14 12:12         ` [PATCH v3.1 " Maarten Lankhorst
2015-07-14 12:12           ` Daniel Stone
2015-07-14 12:42         ` [PATCH v3 " Daniel Vetter
2015-07-13 14:30 ` [PATCH v3 09/20] drm/i915: Fill in more crtc state, v3 Maarten Lankhorst
2015-07-14  9:49   ` Daniel Vetter
2015-07-14 11:42     ` Maarten Lankhorst
2015-07-14 11:42     ` [PATCH 1/3] drm/i915: Fix reference leak in intel_modeset_readout_hw_state Maarten Lankhorst
2015-07-14 11:47       ` Daniel Stone
2015-07-14 11:45     ` [PATCH 2/3] drm/i915: Zero the mode in intel_sanitize_crtc when force disabling Maarten Lankhorst
2015-07-14 11:47       ` Daniel Stone
2015-07-14 11:46     ` [PATCH 3/3] drm/i915: Calculate vblank timestamping constants before enabling vblank Maarten Lankhorst
2015-07-14 11:47       ` Daniel Stone
2015-07-13 14:30 ` [PATCH v3 10/20] drm/i915: Set csc coefficients in intel_sanitize_crtc Maarten Lankhorst
2015-07-13 16:21   ` Daniel Stone
2015-07-14  8:50     ` Maarten Lankhorst
2015-07-14  9:55       ` Daniel Vetter
2015-07-14 10:12         ` Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 11/20] drm/i915: Readout initial hw mode Maarten Lankhorst
2015-07-14 13:58   ` [PATCH v3.1 " Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 12/20] drm/i915: Convert resume to atomic Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 13/20] drm/i915: Get rid of unused transitional members Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 14/20] drm/i915: Update power domains on readout Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 15/20] drm/i915: Always reset in intel_crtc_restore_mode Maarten Lankhorst
2015-07-14  9:56   ` Daniel Vetter
2015-07-14 14:19     ` [PATCH v3.1 15/20] drm/i915: Always force a modeset in intel_crtc_restore_mode, v2 Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 16/20] drm/i915: Make intel_display_suspend atomic, try 2 Maarten Lankhorst
2015-07-14 16:14   ` Daniel Vetter
2015-07-15  4:05     ` Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 17/20] drm/i915: Use full atomic modeset Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 18/20] drm/i915: Call plane update functions directly from intel_atomic_commit Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 19/20] drm/i915: always disable irqs in intel_pipe_update_start Maarten Lankhorst
2015-07-13 17:16   ` Daniel Stone
2015-07-14  7:57     ` Maarten Lankhorst
2015-07-15  6:38     ` Maarten Lankhorst
2015-07-13 14:30 ` [PATCH v3 20/20] drm/i915: Remove use of runtime pm in atomic commit functions Maarten Lankhorst
2015-07-13 17:35 ` [PATCH v3 00/20] Convert to atomic, part 4 Daniel Stone
2015-07-16 17:43 ` Daniel Stone

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=1436797833-11493-3-git-send-email-maarten.lankhorst@linux.intel.com \
    --to=maarten.lankhorst@linux.intel.com \
    --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.