[Intel-gfx] [PATCH 1/2] drm/i915: Relocate SKL+ NV12 src width w/a
Maarten Lankhorst
maarten.lankhorst at linux.intel.com
Tue Oct 23 13:25:03 UTC 2018
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..
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.
> + (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;
More information about the Intel-gfx
mailing list