[PATCH 26/36] drm/i915: Introduce enum scaler

Ville Syrjala ville.syrjala at linux.intel.com
Wed Dec 18 16:10:43 UTC 2019


From: Ville Syrjälä <ville.syrjala at linux.intel.com>

Make it easier to refer to scalers by giving them a proper type.

Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_atomic.c   | 12 ++---
 .../gpu/drm/i915/display/intel_atomic_plane.c |  2 +-
 drivers/gpu/drm/i915/display/intel_display.c  | 53 +++++++++----------
 drivers/gpu/drm/i915/display/intel_display.h  | 16 ++++++
 .../drm/i915/display/intel_display_types.h    | 11 ++--
 drivers/gpu/drm/i915/display/intel_sprite.c   |  6 +--
 drivers/gpu/drm/i915/i915_debugfs.c           |  2 +-
 7 files changed, 57 insertions(+), 45 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c b/drivers/gpu/drm/i915/display/intel_atomic.c
index 468c76e3847d..0b72b6a27c72 100644
--- a/drivers/gpu/drm/i915/display/intel_atomic.c
+++ b/drivers/gpu/drm/i915/display/intel_atomic.c
@@ -284,13 +284,13 @@ static void intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_sta
 				      int num_scalers_need, struct intel_crtc *intel_crtc,
 				      const char *name, int idx,
 				      struct intel_plane_state *plane_state,
-				      int *scaler_id)
+				      enum scaler *scaler_id)
 {
 	struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
-	int j;
+	enum scaler j;
 	u32 mode;
 
-	if (*scaler_id < 0) {
+	if (*scaler_id == INVALID_SCALER) {
 		/* find a free scaler */
 		for (j = 0; j < intel_crtc->num_scalers; j++) {
 			if (scaler_state->scalers[j].in_use)
@@ -302,7 +302,7 @@ static void intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_sta
 		}
 	}
 
-	if (WARN(*scaler_id < 0, "Cannot find scaler for %s:%d\n", name, idx))
+	if (WARN(*scaler_id == INVALID_SCALER, "Cannot find scaler for %s:%d\n", name, idx))
 		return;
 
 	/* set scaler mode */
@@ -334,11 +334,11 @@ static void intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_sta
 	} else if (num_scalers_need == 1 && intel_crtc->num_scalers > 1) {
 		/*
 		 * when only 1 scaler is in use on a pipe with 2 scalers
-		 * scaler 0 operates in high quality (HQ) mode.
+		 * scaler 1 operates in high quality (HQ) mode.
 		 * In this case use scaler 0 to take advantage of HQ mode
 		 */
 		scaler_state->scalers[*scaler_id].in_use = 0;
-		*scaler_id = 0;
+		*scaler_id = SCALER_1;
 		scaler_state->scalers[0].in_use = 1;
 		mode = SKL_PS_SCALER_MODE_HQ;
 	} else {
diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
index 9429b8e17270..040d0ea92ab0 100644
--- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
+++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
@@ -48,7 +48,7 @@ static void intel_plane_state_reset(struct intel_plane_state *plane_state,
 
 	__drm_atomic_helper_plane_state_reset(&plane_state->uapi, &plane->base);
 
-	plane_state->scaler_id = -1;
+	plane_state->scaler_id = INVALID_SCALER;
 }
 
 struct intel_plane *intel_plane_alloc(void)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 4eb5a7763d3d..f85dcd137c87 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -4062,14 +4062,14 @@ static bool i9xx_plane_get_hw_state(struct intel_plane *plane,
 	return ret;
 }
 
-static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id)
+static void skl_detach_scaler(struct intel_crtc *intel_crtc, enum scaler scaler_id)
 {
 	struct drm_device *dev = intel_crtc->base.dev;
 	struct drm_i915_private *dev_priv = to_i915(dev);
 
-	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);
+	I915_WRITE(SKL_PS_CTRL(intel_crtc->pipe, scaler_id), 0);
+	I915_WRITE(SKL_PS_WIN_POS(intel_crtc->pipe, scaler_id), 0);
+	I915_WRITE(SKL_PS_WIN_SZ(intel_crtc->pipe, scaler_id), 0);
 }
 
 /*
@@ -4080,7 +4080,7 @@ static void skl_detach_scalers(const struct intel_crtc_state *crtc_state)
 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
 	const struct intel_crtc_scaler_state *scaler_state =
 		&crtc_state->scaler_state;
-	int i;
+	enum scaler i;
 
 	/* loop through and disable scalers that aren't in use */
 	for (i = 0; i < intel_crtc->num_scalers; i++) {
@@ -5709,7 +5709,7 @@ static int skl_scaler_check_pipe_src_size(const struct intel_crtc_state *crtc_st
 
 static int
 skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
-		  unsigned int scaler_user, int *scaler_id,
+		  unsigned int scaler_user, enum scaler *scaler_id,
 		  int src_w, int src_h, int dst_w, int dst_h,
 		  const struct drm_format_info *format, bool need_scaler)
 {
@@ -5750,10 +5750,10 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
 	 * Here scaler state in crtc_state is set free so that
 	 * scaler can be assigned to other user. Actual register
 	 * update to free the scaler is done in plane/panel-fit programming.
-	 * For this purpose crtc/plane_state->scaler_id isn't reset here.
+	 * For this purpose crtc/plane_state->scaler isn't reset here.
 	 */
 	if (force_detach || !need_scaler) {
-		if (*scaler_id >= 0) {
+		if (*scaler_id != INVALID_SCALER) {
 			scaler_state->scaler_users &= ~(1 << scaler_user);
 			scaler_state->scalers[*scaler_id].in_use = 0;
 
@@ -5761,7 +5761,7 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
 				"Staged freeing scaler id %d scaler_users = 0x%x\n",
 				intel_crtc->pipe, scaler_user, *scaler_id,
 				scaler_state->scaler_users);
-			*scaler_id = -1;
+			*scaler_id = INVALID_SCALER;
 		}
 		return 0;
 	}
@@ -5846,7 +5846,7 @@ static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state,
 				drm_rect_height(&plane_state->uapi.dst),
 				fb ? fb->format : NULL, need_scaler);
 
-	if (ret || plane_state->scaler_id < 0)
+	if (ret || plane_state->scaler_id == INVALID_SCALER)
 		return ret;
 
 	/* check colorkey */
@@ -5903,7 +5903,7 @@ static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state,
 void skylake_scaler_disable(const struct intel_crtc_state *old_crtc_state)
 {
 	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
-	int i;
+	enum scaler i;
 
 	for (i = 0; i < crtc->num_scalers; i++)
 		skl_detach_scaler(crtc, i);
@@ -5920,6 +5920,7 @@ static void skylake_pfit_enable(const struct intel_crtc_state *crtc_state)
 		.y2 = crtc_state->pipe_src_h << 16,
 	};
 	const struct drm_rect *dst = &crtc_state->pch_pfit.dst;
+	enum scaler scaler_id = scaler_state->scaler_id;
 	u16 uv_rgb_hphase, uv_rgb_vphase;
 	enum pipe pipe = crtc->pipe;
 	int width = drm_rect_width(dst);
@@ -5927,12 +5928,11 @@ static void skylake_pfit_enable(const struct intel_crtc_state *crtc_state)
 	int x = dst->x1;
 	int y = dst->y1;
 	int hscale, vscale;
-	int id;
 
 	if (!crtc_state->pch_pfit.enabled)
 		return;
 
-	if (WARN_ON(crtc_state->scaler_state.scaler_id < 0))
+	if (WARN_ON(scaler_id == INVALID_SCALER))
 		return;
 
 	drm_rect_calc_hscale(&src, dst, 0, INT_MAX, &hscale);
@@ -5941,15 +5941,14 @@ static void skylake_pfit_enable(const struct intel_crtc_state *crtc_state)
 	uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
 	uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
 
-	id = scaler_state->scaler_id;
-	I915_WRITE(SKL_PS_CTRL(pipe, id), PS_SCALER_EN |
-		   PS_FILTER_MEDIUM | scaler_state->scalers[id].mode);
-	I915_WRITE(SKL_PS_VPHASE(pipe, id),
+	I915_WRITE(SKL_PS_CTRL(pipe, scaler_id), PS_SCALER_EN |
+		   PS_FILTER_MEDIUM | scaler_state->scalers[scaler_id].mode);
+	I915_WRITE(SKL_PS_VPHASE(pipe, scaler_id),
 		   PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase));
-	I915_WRITE(SKL_PS_HPHASE(pipe, id),
+	I915_WRITE(SKL_PS_HPHASE(pipe, scaler_id),
 		   PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase));
-	I915_WRITE(SKL_PS_WIN_POS(pipe, id), x << 16 | y);
-	I915_WRITE(SKL_PS_WIN_SZ(pipe, id), width << 16 | height);
+	I915_WRITE(SKL_PS_WIN_POS(pipe, scaler_id), x << 16 | y);
+	I915_WRITE(SKL_PS_WIN_SZ(pipe, scaler_id), width << 16 | height);
 }
 
 static void ironlake_pfit_enable(const struct intel_crtc_state *crtc_state)
@@ -10041,8 +10040,8 @@ static void skylake_get_pfit_config(struct intel_crtc_state *crtc_state)
 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 	struct intel_crtc_scaler_state *scaler_state = &crtc_state->scaler_state;
-	int id = -1;
-	int i;
+	enum scaler scaler_id = INVALID_SCALER;
+	enum scaler i;
 
 	/* find scaler attached to this pipe */
 	for (i = 0; i < crtc->num_scalers; i++) {
@@ -10052,7 +10051,7 @@ static void skylake_get_pfit_config(struct intel_crtc_state *crtc_state)
 		if ((tmp & (PS_SCALER_EN | PS_PLANE_SEL_MASK)) != PS_SCALER_EN)
 			continue;
 
-		id = i;
+		scaler_id = i;
 		crtc_state->pch_pfit.enabled = true;
 
 		ilk_get_pfit_pos_size(crtc_state,
@@ -10063,8 +10062,8 @@ static void skylake_get_pfit_config(struct intel_crtc_state *crtc_state)
 		break;
 	}
 
-	scaler_state->scaler_id = id;
-	if (id >= 0)
+	scaler_state->scaler_id = scaler_id;
+	if (scaler_id != INVALID_SCALER)
 		scaler_state->scaler_users |= (1 << SKL_CRTC_INDEX);
 	else
 		scaler_state->scaler_users &= ~(1 << SKL_CRTC_INDEX);
@@ -11818,7 +11817,7 @@ static void intel_crtc_state_reset(struct intel_crtc_state *crtc_state,
 	crtc_state->master_transcoder = INVALID_TRANSCODER;
 	crtc_state->hsw_workaround_pipe = INVALID_PIPE;
 	crtc_state->output_format = INTEL_OUTPUT_FORMAT_INVALID;
-	crtc_state->scaler_state.scaler_id = -1;
+	crtc_state->scaler_state.scaler_id = INVALID_SCALER;
 }
 
 /* Returns the currently programmed mode of the given encoder. */
@@ -12635,7 +12634,7 @@ static void intel_dump_pipe_config(const struct intel_crtc_state *pipe_config,
 		      pipe_config->pixel_rate);
 
 	if (INTEL_GEN(dev_priv) >= 9)
-		DRM_DEBUG_KMS("num_scalers: %d, scaler_users: 0x%x, scaler_id: %d\n",
+		DRM_DEBUG_KMS("num_scalers: %d, scaler_users: 0x%x, scaler: %d\n",
 			      crtc->num_scalers,
 			      pipe_config->scaler_state.scaler_users,
 		              pipe_config->scaler_state.scaler_id);
diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
index 0443ea1d2415..7550e4644665 100644
--- a/drivers/gpu/drm/i915/display/intel_display.h
+++ b/drivers/gpu/drm/i915/display/intel_display.h
@@ -146,6 +146,22 @@ static inline bool transcoder_is_dsi(enum transcoder transcoder)
 	return transcoder == TRANSCODER_DSI_A || transcoder == TRANSCODER_DSI_C;
 }
 
+/*
+ * SKL+ pipe scaler:
+ * Each pipe has one or two scalers which can be
+ * assigned to either scale the pipe (similar to
+ * the old dedicated panel fitter) or to scale
+ * any universal plane.
+ */
+enum scaler {
+	INVALID_SCALER = -1,
+
+	SCALER_1 = 0,
+	SCALER_2,
+
+	I915_MAX_SCALERS,
+};
+
 /*
  * Global legacy plane identifier. Valid only for primary/sprite
  * planes on pre-g4x, and only for primary planes on g4x-bdw.
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 4eeabbcc4745..f4ad2bfbe6e3 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -568,14 +568,12 @@ struct intel_plane_state {
 
 	/*
 	 * scaler_id
-	 *    = -1 : not using a scaler
-	 *    >=  0 : using a scalers
 	 *
 	 * plane requiring a scaler:
 	 *   - During check_plane, its bit is set in
 	 *     crtc_state->scaler_state.scaler_users by calling helper function
 	 *     update_scaler_plane.
-	 *   - scaler_id indicates the scaler it got assigned.
+	 *   - scaler indicates the scaler it got assigned.
 	 *
 	 * plane doesn't require a scaler:
 	 *   - this can happen when scaling is no more required or plane simply
@@ -584,7 +582,7 @@ struct intel_plane_state {
 	 *     crtc_state->scaler_state.scaler_users by calling helper function
 	 *     update_scaler_plane.
 	 */
-	int scaler_id;
+	enum scaler scaler_id;
 
 	/*
 	 * planar_linked_plane:
@@ -623,8 +621,7 @@ struct intel_scaler {
 };
 
 struct intel_crtc_scaler_state {
-#define SKL_NUM_SCALERS 2
-	struct intel_scaler scalers[SKL_NUM_SCALERS];
+	struct intel_scaler scalers[I915_MAX_SCALERS];
 
 	/*
 	 * scaler_users: keeps track of users requesting scalers on this crtc.
@@ -647,7 +644,7 @@ struct intel_crtc_scaler_state {
 	unsigned scaler_users;
 
 	/* scaler used by crtc for panel fitting purpose */
-	int scaler_id;
+	enum scaler scaler_id;
 };
 
 /* drm_mode->private_flags */
diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/i915/display/intel_sprite.c
index b53035599509..ecceec936ebb 100644
--- a/drivers/gpu/drm/i915/display/intel_sprite.c
+++ b/drivers/gpu/drm/i915/display/intel_sprite.c
@@ -398,7 +398,7 @@ skl_program_scaler(struct intel_plane *plane,
 	struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
 	const struct drm_framebuffer *fb = plane_state->hw.fb;
 	enum pipe pipe = plane->pipe;
-	int scaler_id = plane_state->scaler_id;
+	enum scaler scaler_id = plane_state->scaler_id;
 	const struct intel_scaler *scaler =
 		&crtc_state->scaler_state.scalers[scaler_id];
 	int crtc_x = plane_state->uapi.dst.x1;
@@ -614,7 +614,7 @@ skl_program_plane(struct intel_plane *plane,
 		keymsk |= PLANE_KEYMSK_ALPHA_ENABLE;
 
 	/* The scaler will handle the output position */
-	if (plane_state->scaler_id >= 0) {
+	if (plane_state->scaler_id != INVALID_SCALER) {
 		crtc_x = 0;
 		crtc_y = 0;
 	}
@@ -658,7 +658,7 @@ skl_program_plane(struct intel_plane *plane,
 	I915_WRITE_FW(PLANE_SURF(pipe, plane_id),
 		      intel_plane_ggtt_offset(plane_state) + surf_addr);
 
-	if (plane_state->scaler_id >= 0)
+	if (plane_state->scaler_id != INVALID_SCALER)
 		skl_program_scaler(plane, crtc_state, plane_state);
 
 	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index d28468eaed57..073c337032ed 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2598,7 +2598,7 @@ static void intel_scaler_info(struct seq_file *m, struct intel_crtc *crtc)
 
 	/* Not all platformas have a scaler */
 	if (num_scalers) {
-		seq_printf(m, "\tnum_scalers=%d, scaler_users=%x scaler_id=%d",
+		seq_printf(m, "\tnum_scalers=%d, scaler_users=%x scaler=%d",
 			   num_scalers,
 			   crtc_state->scaler_state.scaler_users,
 			   crtc_state->scaler_state.scaler_id);
-- 
2.23.0



More information about the Intel-gfx-trybot mailing list