[Intel-gfx] [PATCH 1/2] drm/i915: Relocate SKL+ NV12 src width w/a

Ville Syrjälä ville.syrjala at linux.intel.com
Tue Oct 23 13:40:59 UTC 2018


On Tue, Oct 23, 2018 at 03:25:03PM +0200, Maarten Lankhorst wrote:
> Op 18-10-18 om 21:59 schreef Ville Syrjala:
> > From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> >
> > The SKL+ NV12 src width alignment w/a is still living in an odd place.
> > Everything else was already relocated closer to the main plane check
> > function. Move this workaround as well.
> >
> > As a bonus we avoid the funky rotated vs. not mess with the src
> > coordinates as this now gets checked before we rotate the coordinates.
> >
> > Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> > ---
> >  drivers/gpu/drm/i915/intel_display.c | 25 -------------------------
> >  drivers/gpu/drm/i915/intel_sprite.c  | 21 +++++++++++++++++++++
> >  2 files changed, 21 insertions(+), 25 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > index fc7e3b0bd95c..940d514cf9d7 100644
> > --- a/drivers/gpu/drm/i915/intel_display.c
> > +++ b/drivers/gpu/drm/i915/intel_display.c
> > @@ -3049,28 +3049,6 @@ static int skl_check_main_surface(struct intel_plane_state *plane_state)
> >  	return 0;
> >  }
> >  
> > -static int
> > -skl_check_nv12_surface(struct intel_plane_state *plane_state)
> > -{
> > -	/* Display WA #1106 */
> > -	if (plane_state->base.rotation !=
> > -	    (DRM_MODE_REFLECT_X | DRM_MODE_ROTATE_90) &&
> > -	    plane_state->base.rotation != DRM_MODE_ROTATE_270)
> > -		return 0;
> > -
> > -	/*
> > -	 * src coordinates are rotated here.
> > -	 * We check height but report it as width
> > -	 */
> > -	if (((drm_rect_height(&plane_state->base.src) >> 16) % 4) != 0) {
> > -		DRM_DEBUG_KMS("src width must be multiple "
> > -			      "of 4 for rotated NV12\n");
> > -		return -EINVAL;
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> >  static int skl_check_nv12_aux_surface(struct intel_plane_state *plane_state)
> >  {
> >  	const struct drm_framebuffer *fb = plane_state->base.fb;
> > @@ -3153,9 +3131,6 @@ int skl_check_plane_surface(struct intel_plane_state *plane_state)
> >  	 * the main surface setup depends on it.
> >  	 */
> >  	if (fb->format->format == DRM_FORMAT_NV12) {
> > -		ret = skl_check_nv12_surface(plane_state);
> > -		if (ret)
> > -			return ret;
> >  		ret = skl_check_nv12_aux_surface(plane_state);
> >  		if (ret)
> >  			return ret;
> > diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
> > index 7cd59eee5cad..0fe6c664e83c 100644
> > --- a/drivers/gpu/drm/i915/intel_sprite.c
> > +++ b/drivers/gpu/drm/i915/intel_sprite.c
> > @@ -1342,6 +1342,23 @@ static int skl_plane_check_dst_coordinates(const struct intel_crtc_state *crtc_s
> >  	return 0;
> >  }
> >  
> > +static int skl_plane_check_nv12_rotation(const struct intel_plane_state *plane_state)
> > +{
> > +	const struct drm_framebuffer *fb = plane_state->base.fb;
> > +	unsigned int rotation = plane_state->base.rotation;
> > +	int src_w = drm_rect_width(&plane_state->base.src) >> 16;
> > +
> > +	/* Display WA #1106 */
> > +	if (fb->format->format == DRM_FORMAT_NV12 && src_w & 3 &&
> Could we put more nv12 checks here? I want to pull the scaler SRC W/H checks in as well..

Hmm. The way those are done atm is a bit funky, but there isa the 
nv12 vs. not-nv12 limits to consider there as well. Not really sure
what the best approach is.

> 
> Probably stylize it a bit with an early return for !NV12, so all checks come after that. :)
> 
> ~Maarten
> 
> Other than that patch 1-2 look good, so have a r-b with or without those suggested changes.

Thanks. I think I'll smash these in as is for now and think a bit more
about the scaler stuff.

> > +	    (rotation == DRM_MODE_ROTATE_270 ||
> > +	     rotation == (DRM_MODE_REFLECT_X | DRM_MODE_ROTATE_90))) {
> > +		DRM_DEBUG_KMS("src width must be multiple of 4 for rotated NV12\n");
> > +		return -EINVAL;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> >  static int skl_plane_check(struct intel_crtc_state *crtc_state,
> >  			   struct intel_plane_state *plane_state)
> >  {
> > @@ -1380,6 +1397,10 @@ static int skl_plane_check(struct intel_crtc_state *crtc_state,
> >  	if (ret)
> >  		return ret;
> >  
> > +	ret = skl_plane_check_nv12_rotation(plane_state);
> > +	if (ret)
> > +		return ret;
> > +
> >  	ret = skl_check_plane_surface(plane_state);
> >  	if (ret)
> >  		return ret;
> 

-- 
Ville Syrjälä
Intel


More information about the Intel-gfx mailing list