|
@@ -3102,6 +3102,29 @@ static int skl_check_main_surface(const struct intel_crtc_state *crtc_state,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int
|
|
|
|
+skl_check_nv12_surface(const struct intel_crtc_state *crtc_state,
|
|
|
|
+ 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;
|
|
@@ -3185,6 +3208,9 @@ int skl_check_plane_surface(const struct intel_crtc_state *crtc_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(crtc_state, 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;
|
|
@@ -4806,8 +4832,7 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
|
|
}
|
|
}
|
|
|
|
|
|
if (plane_scaler_check && pixel_format == DRM_FORMAT_NV12 &&
|
|
if (plane_scaler_check && pixel_format == DRM_FORMAT_NV12 &&
|
|
- (src_h < SKL_MIN_YUV_420_SRC_H || (src_w % 4) != 0 ||
|
|
|
|
- (src_h % 4) != 0)) {
|
|
|
|
|
|
+ (src_h < SKL_MIN_YUV_420_SRC_H || src_w < SKL_MIN_YUV_420_SRC_W)) {
|
|
DRM_DEBUG_KMS("NV12: src dimensions not met\n");
|
|
DRM_DEBUG_KMS("NV12: src dimensions not met\n");
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|