|
@@ -14307,6 +14307,20 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
|
|
goto err;
|
|
|
}
|
|
|
break;
|
|
|
+ case DRM_FORMAT_NV12:
|
|
|
+ if (mode_cmd->modifier[0] == I915_FORMAT_MOD_Y_TILED_CCS ||
|
|
|
+ mode_cmd->modifier[0] == I915_FORMAT_MOD_Yf_TILED_CCS) {
|
|
|
+ DRM_DEBUG_KMS("RC not to be enabled with NV12\n");
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+ if (INTEL_GEN(dev_priv) < 9 || IS_SKYLAKE(dev_priv) ||
|
|
|
+ IS_BROXTON(dev_priv)) {
|
|
|
+ DRM_DEBUG_KMS("unsupported pixel format: %s\n",
|
|
|
+ drm_get_format_name(mode_cmd->pixel_format,
|
|
|
+ &format_name));
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+ break;
|
|
|
default:
|
|
|
DRM_DEBUG_KMS("unsupported pixel format: %s\n",
|
|
|
drm_get_format_name(mode_cmd->pixel_format, &format_name));
|
|
@@ -14319,6 +14333,14 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
|
|
|
|
|
drm_helper_mode_fill_fb_struct(&dev_priv->drm, fb, mode_cmd);
|
|
|
|
|
|
+ if (fb->format->format == DRM_FORMAT_NV12 &&
|
|
|
+ (fb->width < SKL_MIN_YUV_420_SRC_W ||
|
|
|
+ fb->height < SKL_MIN_YUV_420_SRC_H ||
|
|
|
+ (fb->width % 4) != 0 || (fb->height % 4) != 0)) {
|
|
|
+ DRM_DEBUG_KMS("src dimensions not correct for NV12\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
for (i = 0; i < fb->format->num_planes; i++) {
|
|
|
u32 stride_alignment;
|
|
|
|