Commit 1f6f92a3 authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915: Relocate SKL+ NV12 src width w/a

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: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181018195921.9898-1-ville.syrjala@linux.intel.comReviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
parent cd956bfc
...@@ -3049,28 +3049,6 @@ static int skl_check_main_surface(struct intel_plane_state *plane_state) ...@@ -3049,28 +3049,6 @@ static int skl_check_main_surface(struct intel_plane_state *plane_state)
return 0; 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) static int skl_check_nv12_aux_surface(struct intel_plane_state *plane_state)
{ {
const struct drm_framebuffer *fb = plane_state->base.fb; const struct drm_framebuffer *fb = plane_state->base.fb;
...@@ -3153,9 +3131,6 @@ int skl_check_plane_surface(struct intel_plane_state *plane_state) ...@@ -3153,9 +3131,6 @@ int skl_check_plane_surface(struct intel_plane_state *plane_state)
* the main surface setup depends on it. * the main surface setup depends on it.
*/ */
if (fb->format->format == DRM_FORMAT_NV12) { 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); ret = skl_check_nv12_aux_surface(plane_state);
if (ret) if (ret)
return ret; return ret;
......
...@@ -1342,6 +1342,23 @@ static int skl_plane_check_dst_coordinates(const struct intel_crtc_state *crtc_s ...@@ -1342,6 +1342,23 @@ static int skl_plane_check_dst_coordinates(const struct intel_crtc_state *crtc_s
return 0; 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 &&
(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, static int skl_plane_check(struct intel_crtc_state *crtc_state,
struct intel_plane_state *plane_state) struct intel_plane_state *plane_state)
{ {
...@@ -1380,6 +1397,10 @@ static int skl_plane_check(struct intel_crtc_state *crtc_state, ...@@ -1380,6 +1397,10 @@ static int skl_plane_check(struct intel_crtc_state *crtc_state,
if (ret) if (ret)
return ret; return ret;
ret = skl_plane_check_nv12_rotation(plane_state);
if (ret)
return ret;
ret = skl_check_plane_surface(plane_state); ret = skl_check_plane_surface(plane_state);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment