[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