]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - drivers/gpu/drm/i915/intel_sprite.c
Merge drm-upstream/drm-next into drm-misc-next
[mirror_ubuntu-hirsute-kernel.git] / drivers / gpu / drm / i915 / intel_sprite.c
index 04428cea8f3b631a8b301d6d780457e0ea368e6a..214cc730642cbdd4c6a45958da927262227611ee 100644 (file)
@@ -131,7 +131,7 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state)
                if (scanline < min || scanline > max)
                        break;
 
-               if (timeout <= 0) {
+               if (!timeout) {
                        DRM_ERROR("Potential atomic update failure on pipe %c\n",
                                  pipe_name(crtc->pipe));
                        break;
@@ -1011,6 +1011,7 @@ intel_check_sprite_plane(struct intel_plane *plane,
                src->y2 = (src_y + src_h) << 16;
 
                if (intel_format_is_yuv(fb->format->format) &&
+                   fb->format->format != DRM_FORMAT_NV12 &&
                    (src_x % 2 || src_w % 2)) {
                        DRM_DEBUG_KMS("src x/w (%u, %u) must be a multiple of 2 for YUV planes\n",
                                      src_x, src_w);
@@ -1179,6 +1180,19 @@ static uint32_t skl_plane_formats[] = {
        DRM_FORMAT_VYUY,
 };
 
+static uint32_t skl_planar_formats[] = {
+       DRM_FORMAT_RGB565,
+       DRM_FORMAT_ABGR8888,
+       DRM_FORMAT_ARGB8888,
+       DRM_FORMAT_XBGR8888,
+       DRM_FORMAT_XRGB8888,
+       DRM_FORMAT_YUYV,
+       DRM_FORMAT_YVYU,
+       DRM_FORMAT_UYVY,
+       DRM_FORMAT_VYUY,
+       DRM_FORMAT_NV12,
+};
+
 static const uint64_t skl_plane_format_modifiers_noccs[] = {
        I915_FORMAT_MOD_Yf_TILED,
        I915_FORMAT_MOD_Y_TILED,
@@ -1318,6 +1332,7 @@ static bool skl_plane_format_mod_supported(struct drm_plane *_plane,
        case DRM_FORMAT_YVYU:
        case DRM_FORMAT_UYVY:
        case DRM_FORMAT_VYUY:
+       case DRM_FORMAT_NV12:
                if (modifier == I915_FORMAT_MOD_Yf_TILED)
                        return true;
                /* fall through */
@@ -1431,8 +1446,14 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,
                intel_plane->disable_plane = skl_disable_plane;
                intel_plane->get_hw_state = skl_plane_get_hw_state;
 
-               plane_formats = skl_plane_formats;
-               num_plane_formats = ARRAY_SIZE(skl_plane_formats);
+               if (skl_plane_has_planar(dev_priv, pipe,
+                                        PLANE_SPRITE0 + plane)) {
+                       plane_formats = skl_planar_formats;
+                       num_plane_formats = ARRAY_SIZE(skl_planar_formats);
+               } else {
+                       plane_formats = skl_plane_formats;
+                       num_plane_formats = ARRAY_SIZE(skl_plane_formats);
+               }
 
                if (intel_plane->has_ccs)
                        modifiers = skl_plane_format_modifiers_ccs;