Re: [PATCH 05/21 v2] drm/i915: Initialize skylake scalers

Matt Roper
2015-03-25T05:14:01Z

On Fri, Mar 20, 2015 at 05:04:26PM -0700, Chandra Konduru wrote:
> Initializing scalers with supported values during crtc init.
>
> v2:
> -initialize single copy of min/max values (Matt)
>
> Signed-off-by: Chandra Konduru <chandra.konduru@intel.com>
> ---
> drivers/gpu/drm/i915/intel_display.c | 53 ++++++++++++++++++++++++++++++++++
> 1 file changed, 53 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 89299b6..e6ea9e0 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -103,6 +103,8 @@ static void chv_prepare_pll(struct intel_crtc *crtc,
> const struct intel_crtc_state *pipe_config);
> static void intel_begin_crtc_commit(struct drm_crtc *crtc);
> static void intel_finish_crtc_commit(struct drm_crtc *crtc);
> +static void skl_init_scalers(struct drm_device *dev, int pipe,
> + struct intel_crtc_state *crtc_state);
>
> static struct intel_encoder *intel_find_encoder(struct intel_connector *connector, int pipe)
> {
> @@ -12750,6 +12752,54 @@ static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
> return &cursor->base;
> }
>
> +static void skl_init_scalers(struct drm_device *dev, int pipe,
> + struct intel_crtc_state *crtc_state)
> +{
> + int i;
> + struct intel_scaler *intel_scaler;
> + struct intel_crtc_scaler_state *scaler_state = &crtc_state->scaler_state;
> + if (INTEL_INFO(dev)->gen < 9)
> + return;

It's probably better to move this guard out to the callsite so that we
can more easily extend this for future platforms. Unless you plan to
just extend this function in the future, in which case we should
probably drop the 'skl_' prefix.

Matt

> +
> + scaler_state->num_scalers = SKL_NUM_SCALERS;
> + for (i = 0; i < SKL_NUM_SCALERS; i++) {
> + intel_scaler = &scaler_state->scalers[i];
> + intel_scaler->in_use = 0;
> + intel_scaler->id = i;
> +
> + intel_scaler->mode = PS_SCALER_MODE_DYN;
> + intel_scaler->filter = PS_FILTER_MEDIUM;
> + }
> +
> + /* down scaling ratio: 2.99 --> 1, i.e., 34% of original */
> + scaler_state->min_hsr = 34;
> + scaler_state->min_vsr = 34;
> + scaler_state->max_hsr = 500;
> + scaler_state->max_vsr = 500;
> +
> + /* down scaling ratio: 2.99x2.99 --> 1x1, i.e., 12% of original */
> + scaler_state->min_hvsr = 12;
> + scaler_state->max_hvsr = 2500;
> +
> + /* src_w & dst_w range 8 - 4096 */
> + scaler_state->min_src_w = 8;
> + scaler_state->max_src_w = 4096;
> + scaler_state->min_dst_w = 8;
> + scaler_state->max_dst_w = 4096;
> +
> + /* src_h & dst_h range 8 - 2304 */
> + scaler_state->min_src_h = 8;
> + scaler_state->max_src_h = 2304;
> + scaler_state->min_dst_h = 8;
> + scaler_state->max_dst_h = 2304;
> +
> + /* pipe C has one scaler */
> + if (pipe == PIPE_C) {
> + scaler_state->num_scalers = 1;
> + }
> + scaler_state->scaler_id = -1;
> +}
> +
> static void intel_crtc_init(struct drm_device *dev, int pipe)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> @@ -12769,6 +12819,9 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
> intel_crtc_set_state(intel_crtc, crtc_state);
> crtc_state->base.crtc = &intel_crtc->base;
>
> + /* initialize shared scalers */
> + skl_init_scalers(dev, pipe, crtc_state);
> +
> primary = intel_primary_plane_create(dev, pipe);
> if (!primary)
> goto fail;
> --
> 1.7.9.5
>

--
Matt Roper
Graphics Software Engineer
IoTG Platform Enabling & Development
Intel Corporation
(916) 356-2795