[Intel-gfx] [PATCH 01/13] drm/i915: Eliminate usage of plane_wm_parameters from ILK-style WM code

Ville Syrjälä ville.syrjala at linux.intel.com
Wed Aug 26 06:23:39 PDT 2015


On Wed, Aug 26, 2015 at 12:45:32PM +0000, Conselvan De Oliveira, Ander wrote:
> On Thu, 2015-08-20 at 18:11 -0700, Matt Roper wrote:
> > Just pull the info out of the plane state structure rather than staging
> > it in an additional structure.
> > 
> > Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
> 
> Reviewed-by: Ander Conselvan de Oliveira <conselvan2 at gmail.com>
> 
> > ---
> >  drivers/gpu/drm/i915/intel_pm.c | 133 +++++++++++++++++++++-------------------
> >  1 file changed, 70 insertions(+), 63 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> > index fff0c22..c9cf7cf 100644
> > --- a/drivers/gpu/drm/i915/intel_pm.c
> > +++ b/drivers/gpu/drm/i915/intel_pm.c
> > @@ -1791,9 +1791,6 @@ struct ilk_pipe_wm_parameters {
> >  	bool active;
> >  	uint32_t pipe_htotal;
> >  	uint32_t pixel_rate;
> > -	struct intel_plane_wm_parameters pri;
> > -	struct intel_plane_wm_parameters spr;
> > -	struct intel_plane_wm_parameters cur;
> >  };
> >  
> >  struct ilk_wm_maximums {
> > @@ -1815,25 +1812,25 @@ struct intel_wm_config {
> >   * mem_value must be in 0.1us units.
> >   */
> >  static uint32_t ilk_compute_pri_wm(const struct ilk_pipe_wm_parameters *params,
> > +				   const struct intel_plane_state *pstate,
> >  				   uint32_t mem_value,
> >  				   bool is_lp)
> >  {
> > +	int bpp = pstate->base.fb ? pstate->base.fb->bits_per_pixel / 8 : 0;
> >  	uint32_t method1, method2;
> >  
> > -	if (!params->active || !params->pri.enabled)
> > +	if (!params->active || !pstate->visible)
> >  		return 0;
> >  
> > -	method1 = ilk_wm_method1(params->pixel_rate,
> > -				 params->pri.bytes_per_pixel,
> > -				 mem_value);
> > +	method1 = ilk_wm_method1(params->pixel_rate, bpp, mem_value);
> >  
> >  	if (!is_lp)
> >  		return method1;
> >  
> >  	method2 = ilk_wm_method2(params->pixel_rate,
> >  				 params->pipe_htotal,
> > -				 params->pri.horiz_pixels,
> > -				 params->pri.bytes_per_pixel,
> > +				 drm_rect_width(&pstate->dst),
> > +				 bpp,
> >  				 mem_value);
> >  
> >  	return min(method1, method2);
> > @@ -1844,20 +1841,20 @@ static uint32_t ilk_compute_pri_wm(const struct ilk_pipe_wm_parameters 
> > *params,
> >   * mem_value must be in 0.1us units.
> >   */
> >  static uint32_t ilk_compute_spr_wm(const struct ilk_pipe_wm_parameters *params,
> > +				   const struct intel_plane_state *pstate,
> >  				   uint32_t mem_value)
> >  {
> > +	int bpp = pstate->base.fb ? pstate->base.fb->bits_per_pixel / 8 : 0;
> >  	uint32_t method1, method2;
> >  
> > -	if (!params->active || !params->spr.enabled)
> > +	if (!params->active || !pstate->visible)
> >  		return 0;
> >  
> > -	method1 = ilk_wm_method1(params->pixel_rate,
> > -				 params->spr.bytes_per_pixel,
> > -				 mem_value);
> > +	method1 = ilk_wm_method1(params->pixel_rate, bpp, mem_value);
> >  	method2 = ilk_wm_method2(params->pixel_rate,
> >  				 params->pipe_htotal,
> > -				 params->spr.horiz_pixels,
> > -				 params->spr.bytes_per_pixel,
> > +				 drm_rect_width(&pstate->dst),
> > +				 bpp,
> >  				 mem_value);
> >  	return min(method1, method2);
> >  }
> > @@ -1867,28 +1864,32 @@ static uint32_t ilk_compute_spr_wm(const struct ilk_pipe_wm_parameters 
> > *params,
> >   * mem_value must be in 0.1us units.
> >   */
> >  static uint32_t ilk_compute_cur_wm(const struct ilk_pipe_wm_parameters *params,
> > +				   const struct intel_plane_state *pstate,
> >  				   uint32_t mem_value)
> >  {
> > -	if (!params->active || !params->cur.enabled)
> > +	int bpp = pstate->base.fb ? pstate->base.fb->bits_per_pixel / 8 : 0;
> > +
> > +	if (!params->active || !pstate->visible)
> >  		return 0;
> >  
> >  	return ilk_wm_method2(params->pixel_rate,
> >  			      params->pipe_htotal,
> > -			      params->cur.horiz_pixels,
> > -			      params->cur.bytes_per_pixel,
> > +			      drm_rect_width(&pstate->dst),
> > +			      bpp,
> >  			      mem_value);
> >  }
> >  
> >  /* Only for WM_LP. */
> >  static uint32_t ilk_compute_fbc_wm(const struct ilk_pipe_wm_parameters *params,
> > +				   const struct intel_plane_state *pstate,
> >  				   uint32_t pri_val)
> >  {
> > -	if (!params->active || !params->pri.enabled)
> > +	int bpp = pstate->base.fb ? pstate->base.fb->bits_per_pixel / 8 : 0;
> > +
> > +	if (!params->active || !pstate->visible)
> >  		return 0;
> >  
> > -	return ilk_wm_fbc(pri_val,
> > -			  params->pri.horiz_pixels,
> > -			  params->pri.bytes_per_pixel);
> > +	return ilk_wm_fbc(pri_val, drm_rect_width(&pstate->dst), bpp);
> >  }
> >  
> >  static unsigned int ilk_display_fifo_size(const struct drm_device *dev)
> > @@ -2053,10 +2054,12 @@ static bool ilk_validate_wm_level(int level,
> >  }
> >  
> >  static void ilk_compute_wm_level(const struct drm_i915_private *dev_priv,
> > +				 const struct intel_crtc *intel_crtc,
> >  				 int level,
> >  				 const struct ilk_pipe_wm_parameters *p,
> >  				 struct intel_wm_level *result)
> >  {
> > +	struct intel_plane *intel_plane;
> >  	uint16_t pri_latency = dev_priv->wm.pri_latency[level];
> >  	uint16_t spr_latency = dev_priv->wm.spr_latency[level];
> >  	uint16_t cur_latency = dev_priv->wm.cur_latency[level];
> > @@ -2068,10 +2071,29 @@ static void ilk_compute_wm_level(const struct drm_i915_private *dev_priv,
> >  		cur_latency *= 5;
> >  	}
> >  
> > -	result->pri_val = ilk_compute_pri_wm(p, pri_latency, level);
> > -	result->spr_val = ilk_compute_spr_wm(p, spr_latency);
> > -	result->cur_val = ilk_compute_cur_wm(p, cur_latency);
> > -	result->fbc_val = ilk_compute_fbc_wm(p, result->pri_val);
> > +	for_each_intel_plane_on_crtc(dev_priv->dev, intel_crtc, intel_plane) {
> > +		struct intel_plane_state *pstate =
> > +			to_intel_plane_state(intel_plane->base.state);
> > +
> > +		switch (intel_plane->base.type) {
> > +		case DRM_PLANE_TYPE_PRIMARY:
> > +			result->pri_val = ilk_compute_pri_wm(p, pstate,
> > +							     pri_latency,
> > +							     level);
> > +			result->fbc_val = ilk_compute_fbc_wm(p, pstate,
> > +							     result->pri_val);
> > +			break;
> > +		case DRM_PLANE_TYPE_OVERLAY:
> > +			result->spr_val = ilk_compute_spr_wm(p, pstate,
> > +							     spr_latency);
> > +			break;
> > +		case DRM_PLANE_TYPE_CURSOR:
> > +			result->cur_val = ilk_compute_cur_wm(p, pstate,
> > +							     cur_latency);
> > +			break;
> > +		}
> > +	}
> > +
> >  	result->enable = true;
> >  }
> >  
> > @@ -2333,10 +2355,7 @@ static void skl_setup_wm_latency(struct drm_device *dev)
> >  static void ilk_compute_wm_parameters(struct drm_crtc *crtc,
> >  				      struct ilk_pipe_wm_parameters *p)
> >  {
> > -	struct drm_device *dev = crtc->dev;
> >  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> > -	enum pipe pipe = intel_crtc->pipe;
> > -	struct drm_plane *plane;
> >  
> >  	if (!intel_crtc->active)
> >  		return;
> > @@ -2344,32 +2363,6 @@ static void ilk_compute_wm_parameters(struct drm_crtc *crtc,
> >  	p->active = true;
> >  	p->pipe_htotal = intel_crtc->config->base.adjusted_mode.crtc_htotal;
> >  	p->pixel_rate = ilk_pipe_pixel_rate(intel_crtc->config);
> > -
> > -	if (crtc->primary->state->fb)
> > -		p->pri.bytes_per_pixel =
> > -			crtc->primary->state->fb->bits_per_pixel / 8;
> > -	else
> > -		p->pri.bytes_per_pixel = 4;
> > -
> > -	p->cur.bytes_per_pixel = 4;
> > -	/*
> > -	 * TODO: for now, assume primary and cursor planes are always enabled.
> > -	 * Setting them to false makes the screen flicker.
> > -	 */
> > -	p->pri.enabled = true;
> > -	p->cur.enabled = true;
> > -
> > -	p->pri.horiz_pixels = intel_crtc->config->pipe_src_w;
> > -	p->cur.horiz_pixels = intel_crtc->base.cursor->state->crtc_w;
> > -
> > -	drm_for_each_legacy_plane(plane, dev) {
> > -		struct intel_plane *intel_plane = to_intel_plane(plane);
> > -
> > -		if (intel_plane->pipe == pipe) {
> > -			p->spr = intel_plane->wm;
> > -			break;
> > -		}
> > -	}
> >  }
> >  
> >  static void ilk_compute_wm_config(struct drm_device *dev,
> > @@ -2397,28 +2390,42 @@ static bool intel_compute_pipe_wm(struct drm_crtc *crtc,
> >  {
> >  	struct drm_device *dev = crtc->dev;
> >  	const struct drm_i915_private *dev_priv = dev->dev_private;
> > +	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> > +	struct intel_plane *intel_plane;
> > +	struct intel_plane_state *sprstate = NULL;
> >  	int level, max_level = ilk_wm_max_level(dev);
> >  	/* LP0 watermark maximums depend on this pipe alone */
> >  	struct intel_wm_config config = {
> >  		.num_pipes_active = 1,
> > -		.sprites_enabled = params->spr.enabled,
> > -		.sprites_scaled = params->spr.scaled,
> >  	};
> >  	struct ilk_wm_maximums max;
> >  
> > +	for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
> > +		if (intel_plane->base.type == DRM_PLANE_TYPE_OVERLAY) {
> > +			sprstate = to_intel_plane_state(intel_plane->base.state);
> > +			break;
> > +		}
> > +	}
> > +
> > +	config.sprites_enabled = sprstate->visible;
> > +	config.sprites_scaled =
> > +		drm_rect_width(&sprstate->dst) != drm_rect_width(&sprstate->src) >> 16 ||
> > +		drm_rect_height(&sprstate->dst) != drm_rect_height(&sprstate->src) >> 16;

This will now assume the rects will match when the sprite is invisible.
Not sure that would be the case, so I'd add a 'visible &&' here to make
sure we don't accidentally limite the wm level when the sprite isn't
even enabled.

> > +
> > +
> >  	pipe_wm->pipe_enabled = params->active;
> > -	pipe_wm->sprites_enabled = params->spr.enabled;
> > -	pipe_wm->sprites_scaled = params->spr.scaled;
> > +	pipe_wm->sprites_enabled = sprstate->visible;
> > +	pipe_wm->sprites_scaled = config.sprites_scaled;
> >  
> >  	/* ILK/SNB: LP2+ watermarks only w/o sprites */
> > -	if (INTEL_INFO(dev)->gen <= 6 && params->spr.enabled)
> > +	if (INTEL_INFO(dev)->gen <= 6 && sprstate->visible)
> >  		max_level = 1;
> >  
> >  	/* ILK/SNB/IVB: LP1+ watermarks only w/o scaling */
> > -	if (params->spr.scaled)
> > +	if (config.sprites_scaled)
> >  		max_level = 0;
> >  
> > -	ilk_compute_wm_level(dev_priv, 0, params, &pipe_wm->wm[0]);
> > +	ilk_compute_wm_level(dev_priv, intel_crtc, 0, params, &pipe_wm->wm[0]);
> >  
> >  	if (IS_HASWELL(dev) || IS_BROADWELL(dev))
> >  		pipe_wm->linetime = hsw_compute_linetime_wm(dev, crtc);
> > @@ -2435,7 +2442,7 @@ static bool intel_compute_pipe_wm(struct drm_crtc *crtc,
> >  	for (level = 1; level <= max_level; level++) {
> >  		struct intel_wm_level wm = {};
> >  
> > -		ilk_compute_wm_level(dev_priv, level, params, &wm);
> > +		ilk_compute_wm_level(dev_priv, intel_crtc, level, params, &wm);
> >  
> >  		/*
> >  		 * Disable any watermark level that exceeds the
> ---------------------------------------------------------------------
> Intel Finland Oy
> Registered Address: PL 281, 00181 Helsinki 
> Business Identity Code: 0357606 - 4 
> Domiciled in Helsinki 
> 
> This e-mail and any attachments may contain confidential material for
> the sole use of the intended recipient(s). Any review or distribution
> by others is strictly prohibited. If you are not the intended
> recipient, please contact the sender and delete all copies.
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrjälä
Intel OTC


More information about the Intel-gfx mailing list