[Intel-gfx] [PATCH v3 3/6] drm/i915: Use drm_rect to store the pfit window pos/size

Ville Syrjälä ville.syrjala at linux.intel.com
Thu Apr 23 15:38:46 UTC 2020


On Wed, Apr 22, 2020 at 12:20:06PM -0700, Manasi Navare wrote:
> On Wed, Apr 22, 2020 at 07:19:14PM +0300, Ville Syrjala wrote:
> > From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> > 
> > Make things a bit more abstract by replacing the pch_pfit.pos/size
> > raw register values with a drm_rect. Makes it slighly more convenient
> > to eg. compute the scaling factors.
> > 
> > v2: Use drm_rect_init()
> > 
> > Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_display.c  | 101 +++++++++++-------
> >  .../drm/i915/display/intel_display_types.h    |   3 +-
> >  drivers/gpu/drm/i915/display/intel_panel.c    |  13 ++-
> >  3 files changed, 67 insertions(+), 50 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > index 96d0768ecf5d..6bb87965801e 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -6096,10 +6096,8 @@ static int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state)
> >  	int width, height;
> >  
> >  	if (crtc_state->pch_pfit.enabled) {
> > -		u32 pfit_size = crtc_state->pch_pfit.size;
> > -
> > -		width = pfit_size >> 16;
> > -		height = pfit_size & 0xffff;
> > +		width = drm_rect_width(&crtc_state->pch_pfit.dst);
> > +		height = drm_rect_height(&crtc_state->pch_pfit.dst);
> >  	} else {
> >  		width = adjusted_mode->crtc_hdisplay;
> >  		height = adjusted_mode->crtc_vdisplay;
> > @@ -6219,11 +6217,20 @@ static void skl_pfit_enable(const 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);
> > -	enum pipe pipe = crtc->pipe;
> >  	const struct intel_crtc_scaler_state *scaler_state =
> >  		&crtc_state->scaler_state;
> > +	struct drm_rect src = {
> > +		.x2 = crtc_state->pipe_src_w << 16,
> > +		.y2 = crtc_state->pipe_src_h << 16,
> 
> Its not clear to me why we left shift by 16 for both src_w and src_h? Where can I find the format of
> how this is stored?
> 
> Other than that everything else looks good in terms of replacing with drm_rect()
> 
> Manasi
> 
<snip>
> > -	hscale = (crtc_state->pipe_src_w << 16) / pfit_w;
> > -	vscale = (crtc_state->pipe_src_h << 16) / pfit_h;

Same <<16 was here already. skl_scaler_calc_phase() wants
the scaling factor in .16 binary fixed point. Also 
drm_rect_calc_{h,v}scale() assumes the src coordinates
to be .16 and returns the result in .16 as well.

> > +	hscale = drm_rect_calc_hscale(&src, dst, 0, INT_MAX);
> > +	vscale = drm_rect_calc_vscale(&src, dst, 0, INT_MAX);
> >  
> >  	uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
> >  	uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
-- 
Ville Syrjälä
Intel


More information about the Intel-gfx mailing list