]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/i915/intel_sprite.c
drm/i915: Refactor icl_is_hdr_plane
[linux.git] / drivers / gpu / drm / i915 / intel_sprite.c
index 5170a0f5fe7b6b39ed36e750b853475a7a4a5b0d..1d1be183480f272f0b47ad1a14db4d8402fdd88f 100644 (file)
@@ -29,7 +29,6 @@
  * registers; newer ones are much simpler and we can use the new DRM plane
  * support.
  */
-#include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_fourcc.h>
 #include "i915_drv.h"
 #include <drm/drm_color_mgmt.h>
 
+bool is_planar_yuv_format(u32 pixelformat)
+{
+       switch (pixelformat) {
+       case DRM_FORMAT_NV12:
+       case DRM_FORMAT_P010:
+       case DRM_FORMAT_P012:
+       case DRM_FORMAT_P016:
+               return true;
+       default:
+               return false;
+       }
+}
+
 int intel_usecs_to_scanlines(const struct drm_display_mode *adjusted_mode,
                             int usecs)
 {
@@ -322,8 +334,8 @@ skl_program_scaler(struct intel_plane *plane,
                &crtc_state->scaler_state.scalers[scaler_id];
        int crtc_x = plane_state->base.dst.x1;
        int crtc_y = plane_state->base.dst.y1;
-       uint32_t crtc_w = drm_rect_width(&plane_state->base.dst);
-       uint32_t crtc_h = drm_rect_height(&plane_state->base.dst);
+       u32 crtc_w = drm_rect_width(&plane_state->base.dst);
+       u32 crtc_h = drm_rect_height(&plane_state->base.dst);
        u16 y_hphase, uv_rgb_hphase;
        u16 y_vphase, uv_rgb_vphase;
        int hscale, vscale;
@@ -336,8 +348,8 @@ skl_program_scaler(struct intel_plane *plane,
                                      0, INT_MAX);
 
        /* TODO: handle sub-pixel coordinates */
-       if (plane_state->base.fb->format->format == DRM_FORMAT_NV12 &&
-           !icl_is_hdr_plane(plane)) {
+       if (is_planar_yuv_format(plane_state->base.fb->format->format) &&
+           !icl_is_hdr_plane(dev_priv, plane->id)) {
                y_hphase = skl_scaler_calc_phase(1, hscale, false);
                y_vphase = skl_scaler_calc_phase(1, vscale, false);
 
@@ -478,16 +490,23 @@ skl_program_plane(struct intel_plane *plane,
        u32 aux_stride = skl_plane_stride(plane_state, 1);
        int crtc_x = plane_state->base.dst.x1;
        int crtc_y = plane_state->base.dst.y1;
-       uint32_t x = plane_state->color_plane[color_plane].x;
-       uint32_t y = plane_state->color_plane[color_plane].y;
-       uint32_t src_w = drm_rect_width(&plane_state->base.src) >> 16;
-       uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16;
+       u32 x = plane_state->color_plane[color_plane].x;
+       u32 y = plane_state->color_plane[color_plane].y;
+       u32 src_w = drm_rect_width(&plane_state->base.src) >> 16;
+       u32 src_h = drm_rect_height(&plane_state->base.src) >> 16;
        struct intel_plane *linked = plane_state->linked_plane;
        const struct drm_framebuffer *fb = plane_state->base.fb;
        u8 alpha = plane_state->base.alpha >> 8;
+       u32 plane_color_ctl = 0;
        unsigned long irqflags;
        u32 keymsk, keymax;
 
+       plane_ctl |= skl_plane_ctl_crtc(crtc_state);
+
+       if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
+               plane_color_ctl = plane_state->color_ctl |
+                       glk_plane_color_ctl_crtc(crtc_state);
+
        /* Sizes are 0 based */
        src_w--;
        src_h--;
@@ -512,7 +531,7 @@ skl_program_plane(struct intel_plane *plane,
        I915_WRITE_FW(PLANE_AUX_DIST(pipe, plane_id),
                      (plane_state->color_plane[1].offset - surf_addr) | aux_stride);
 
-       if (icl_is_hdr_plane(plane)) {
+       if (icl_is_hdr_plane(dev_priv, plane_id)) {
                u32 cus_ctl = 0;
 
                if (linked) {
@@ -534,10 +553,9 @@ skl_program_plane(struct intel_plane *plane,
        }
 
        if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
-               I915_WRITE_FW(PLANE_COLOR_CTL(pipe, plane_id),
-                             plane_state->color_ctl);
+               I915_WRITE_FW(PLANE_COLOR_CTL(pipe, plane_id), plane_color_ctl);
 
-       if (fb->format->is_yuv && icl_is_hdr_plane(plane))
+       if (fb->format->is_yuv && icl_is_hdr_plane(dev_priv, plane_id))
                icl_program_input_csc(plane, crtc_state, plane_state);
 
        skl_write_plane_wm(plane, crtc_state);
@@ -619,17 +637,19 @@ skl_plane_get_hw_state(struct intel_plane *plane,
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum intel_display_power_domain power_domain;
        enum plane_id plane_id = plane->id;
+       intel_wakeref_t wakeref;
        bool ret;
 
        power_domain = POWER_DOMAIN_PIPE(plane->pipe);
-       if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+       wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
+       if (!wakeref)
                return false;
 
        ret = I915_READ(PLANE_CTL(plane->pipe, plane_id)) & PLANE_CTL_ENABLE;
 
        *pipe = plane->pipe;
 
-       intel_display_power_put(dev_priv, power_domain);
+       intel_display_power_put(dev_priv, power_domain, wakeref);
 
        return ret;
 }
@@ -732,6 +752,11 @@ vlv_update_clrc(const struct intel_plane_state *plane_state)
                      SP_SH_SIN(sh_sin) | SP_SH_COS(sh_cos));
 }
 
+static u32 vlv_sprite_ctl_crtc(const struct intel_crtc_state *crtc_state)
+{
+       return SP_GAMMA_ENABLE;
+}
+
 static u32 vlv_sprite_ctl(const struct intel_crtc_state *crtc_state,
                          const struct intel_plane_state *plane_state)
 {
@@ -740,7 +765,7 @@ static u32 vlv_sprite_ctl(const struct intel_crtc_state *crtc_state,
        const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
        u32 sprctl;
 
-       sprctl = SP_ENABLE | SP_GAMMA_ENABLE;
+       sprctl = SP_ENABLE;
 
        switch (fb->format->format) {
        case DRM_FORMAT_YUYV:
@@ -807,17 +832,19 @@ vlv_update_plane(struct intel_plane *plane,
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum pipe pipe = plane->pipe;
        enum plane_id plane_id = plane->id;
-       u32 sprctl = plane_state->ctl;
        u32 sprsurf_offset = plane_state->color_plane[0].offset;
        u32 linear_offset;
        const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
        int crtc_x = plane_state->base.dst.x1;
        int crtc_y = plane_state->base.dst.y1;
-       uint32_t crtc_w = drm_rect_width(&plane_state->base.dst);
-       uint32_t crtc_h = drm_rect_height(&plane_state->base.dst);
-       uint32_t x = plane_state->color_plane[0].x;
-       uint32_t y = plane_state->color_plane[0].y;
+       u32 crtc_w = drm_rect_width(&plane_state->base.dst);
+       u32 crtc_h = drm_rect_height(&plane_state->base.dst);
+       u32 x = plane_state->color_plane[0].x;
+       u32 y = plane_state->color_plane[0].y;
        unsigned long irqflags;
+       u32 sprctl;
+
+       sprctl = plane_state->ctl | vlv_sprite_ctl_crtc(crtc_state);
 
        /* Sizes are 0 based */
        crtc_w--;
@@ -883,21 +910,36 @@ vlv_plane_get_hw_state(struct intel_plane *plane,
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum intel_display_power_domain power_domain;
        enum plane_id plane_id = plane->id;
+       intel_wakeref_t wakeref;
        bool ret;
 
        power_domain = POWER_DOMAIN_PIPE(plane->pipe);
-       if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+       wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
+       if (!wakeref)
                return false;
 
        ret = I915_READ(SPCNTR(plane->pipe, plane_id)) & SP_ENABLE;
 
        *pipe = plane->pipe;
 
-       intel_display_power_put(dev_priv, power_domain);
+       intel_display_power_put(dev_priv, power_domain, wakeref);
 
        return ret;
 }
 
+static u32 ivb_sprite_ctl_crtc(const struct intel_crtc_state *crtc_state)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
+       u32 sprctl = 0;
+
+       sprctl |= SPRITE_GAMMA_ENABLE;
+
+       if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
+               sprctl |= SPRITE_PIPE_CSC_ENABLE;
+
+       return sprctl;
+}
+
 static u32 ivb_sprite_ctl(const struct intel_crtc_state *crtc_state,
                          const struct intel_plane_state *plane_state)
 {
@@ -908,14 +950,11 @@ static u32 ivb_sprite_ctl(const struct intel_crtc_state *crtc_state,
        const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
        u32 sprctl;
 
-       sprctl = SPRITE_ENABLE | SPRITE_GAMMA_ENABLE;
+       sprctl = SPRITE_ENABLE;
 
        if (IS_IVYBRIDGE(dev_priv))
                sprctl |= SPRITE_TRICKLE_FEED_DISABLE;
 
-       if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
-               sprctl |= SPRITE_PIPE_CSC_ENABLE;
-
        switch (fb->format->format) {
        case DRM_FORMAT_XBGR8888:
                sprctl |= SPRITE_FORMAT_RGBX888 | SPRITE_RGB_ORDER_RGBX;
@@ -967,20 +1006,22 @@ ivb_update_plane(struct intel_plane *plane,
 {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum pipe pipe = plane->pipe;
-       u32 sprctl = plane_state->ctl, sprscale = 0;
        u32 sprsurf_offset = plane_state->color_plane[0].offset;
        u32 linear_offset;
        const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
        int crtc_x = plane_state->base.dst.x1;
        int crtc_y = plane_state->base.dst.y1;
-       uint32_t crtc_w = drm_rect_width(&plane_state->base.dst);
-       uint32_t crtc_h = drm_rect_height(&plane_state->base.dst);
-       uint32_t x = plane_state->color_plane[0].x;
-       uint32_t y = plane_state->color_plane[0].y;
-       uint32_t src_w = drm_rect_width(&plane_state->base.src) >> 16;
-       uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16;
+       u32 crtc_w = drm_rect_width(&plane_state->base.dst);
+       u32 crtc_h = drm_rect_height(&plane_state->base.dst);
+       u32 x = plane_state->color_plane[0].x;
+       u32 y = plane_state->color_plane[0].y;
+       u32 src_w = drm_rect_width(&plane_state->base.src) >> 16;
+       u32 src_h = drm_rect_height(&plane_state->base.src) >> 16;
+       u32 sprctl, sprscale = 0;
        unsigned long irqflags;
 
+       sprctl = plane_state->ctl | ivb_sprite_ctl_crtc(crtc_state);
+
        /* Sizes are 0 based */
        src_w--;
        src_h--;
@@ -1052,17 +1093,19 @@ ivb_plane_get_hw_state(struct intel_plane *plane,
 {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum intel_display_power_domain power_domain;
+       intel_wakeref_t wakeref;
        bool ret;
 
        power_domain = POWER_DOMAIN_PIPE(plane->pipe);
-       if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+       wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
+       if (!wakeref)
                return false;
 
        ret =  I915_READ(SPRCTL(plane->pipe)) & SPRITE_ENABLE;
 
        *pipe = plane->pipe;
 
-       intel_display_power_put(dev_priv, power_domain);
+       intel_display_power_put(dev_priv, power_domain, wakeref);
 
        return ret;
 }
@@ -1075,6 +1118,11 @@ g4x_sprite_max_stride(struct intel_plane *plane,
        return 16384;
 }
 
+static u32 g4x_sprite_ctl_crtc(const struct intel_crtc_state *crtc_state)
+{
+       return DVS_GAMMA_ENABLE;
+}
+
 static u32 g4x_sprite_ctl(const struct intel_crtc_state *crtc_state,
                          const struct intel_plane_state *plane_state)
 {
@@ -1085,9 +1133,9 @@ static u32 g4x_sprite_ctl(const struct intel_crtc_state *crtc_state,
        const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
        u32 dvscntr;
 
-       dvscntr = DVS_ENABLE | DVS_GAMMA_ENABLE;
+       dvscntr = DVS_ENABLE;
 
-       if (IS_GEN6(dev_priv))
+       if (IS_GEN(dev_priv, 6))
                dvscntr |= DVS_TRICKLE_FEED_DISABLE;
 
        switch (fb->format->format) {
@@ -1141,20 +1189,22 @@ g4x_update_plane(struct intel_plane *plane,
 {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum pipe pipe = plane->pipe;
-       u32 dvscntr = plane_state->ctl, dvsscale = 0;
        u32 dvssurf_offset = plane_state->color_plane[0].offset;
        u32 linear_offset;
        const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
        int crtc_x = plane_state->base.dst.x1;
        int crtc_y = plane_state->base.dst.y1;
-       uint32_t crtc_w = drm_rect_width(&plane_state->base.dst);
-       uint32_t crtc_h = drm_rect_height(&plane_state->base.dst);
-       uint32_t x = plane_state->color_plane[0].x;
-       uint32_t y = plane_state->color_plane[0].y;
-       uint32_t src_w = drm_rect_width(&plane_state->base.src) >> 16;
-       uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16;
+       u32 crtc_w = drm_rect_width(&plane_state->base.dst);
+       u32 crtc_h = drm_rect_height(&plane_state->base.dst);
+       u32 x = plane_state->color_plane[0].x;
+       u32 y = plane_state->color_plane[0].y;
+       u32 src_w = drm_rect_width(&plane_state->base.src) >> 16;
+       u32 src_h = drm_rect_height(&plane_state->base.src) >> 16;
+       u32 dvscntr, dvsscale = 0;
        unsigned long irqflags;
 
+       dvscntr = plane_state->ctl | g4x_sprite_ctl_crtc(crtc_state);
+
        /* Sizes are 0 based */
        src_w--;
        src_h--;
@@ -1218,17 +1268,19 @@ g4x_plane_get_hw_state(struct intel_plane *plane,
 {
        struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
        enum intel_display_power_domain power_domain;
+       intel_wakeref_t wakeref;
        bool ret;
 
        power_domain = POWER_DOMAIN_PIPE(plane->pipe);
-       if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+       wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
+       if (!wakeref)
                return false;
 
        ret = I915_READ(DVSCNTR(plane->pipe)) & DVS_ENABLE;
 
        *pipe = plane->pipe;
 
-       intel_display_power_put(dev_priv, power_domain);
+       intel_display_power_put(dev_priv, power_domain, wakeref);
 
        return ret;
 }
@@ -1512,10 +1564,10 @@ static int skl_plane_check_nv12_rotation(const struct intel_plane_state *plane_s
        int src_w = drm_rect_width(&plane_state->base.src) >> 16;
 
        /* Display WA #1106 */
-       if (fb->format->format == DRM_FORMAT_NV12 && src_w & 3 &&
+       if (is_planar_yuv_format(fb->format->format) && 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");
+               DRM_DEBUG_KMS("src width must be multiple of 4 for rotated planar YUV\n");
                return -EINVAL;
        }
 
@@ -1699,7 +1751,7 @@ int intel_sprite_set_colorkey_ioctl(struct drm_device *dev, void *data,
        return ret;
 }
 
-static const uint32_t g4x_plane_formats[] = {
+static const u32 g4x_plane_formats[] = {
        DRM_FORMAT_XRGB8888,
        DRM_FORMAT_YUYV,
        DRM_FORMAT_YVYU,
@@ -1707,13 +1759,13 @@ static const uint32_t g4x_plane_formats[] = {
        DRM_FORMAT_VYUY,
 };
 
-static const uint64_t i9xx_plane_format_modifiers[] = {
+static const u64 i9xx_plane_format_modifiers[] = {
        I915_FORMAT_MOD_X_TILED,
        DRM_FORMAT_MOD_LINEAR,
        DRM_FORMAT_MOD_INVALID
 };
 
-static const uint32_t snb_plane_formats[] = {
+static const u32 snb_plane_formats[] = {
        DRM_FORMAT_XBGR8888,
        DRM_FORMAT_XRGB8888,
        DRM_FORMAT_YUYV,
@@ -1722,7 +1774,7 @@ static const uint32_t snb_plane_formats[] = {
        DRM_FORMAT_VYUY,
 };
 
-static const uint32_t vlv_plane_formats[] = {
+static const u32 vlv_plane_formats[] = {
        DRM_FORMAT_RGB565,
        DRM_FORMAT_ABGR8888,
        DRM_FORMAT_ARGB8888,
@@ -1736,7 +1788,7 @@ static const uint32_t vlv_plane_formats[] = {
        DRM_FORMAT_VYUY,
 };
 
-static const uint32_t skl_plane_formats[] = {
+static const u32 skl_plane_formats[] = {
        DRM_FORMAT_C8,
        DRM_FORMAT_RGB565,
        DRM_FORMAT_XRGB8888,
@@ -1751,7 +1803,28 @@ static const uint32_t skl_plane_formats[] = {
        DRM_FORMAT_VYUY,
 };
 
-static const uint32_t skl_planar_formats[] = {
+static const uint32_t icl_plane_formats[] = {
+       DRM_FORMAT_C8,
+       DRM_FORMAT_RGB565,
+       DRM_FORMAT_XRGB8888,
+       DRM_FORMAT_XBGR8888,
+       DRM_FORMAT_ARGB8888,
+       DRM_FORMAT_ABGR8888,
+       DRM_FORMAT_XRGB2101010,
+       DRM_FORMAT_XBGR2101010,
+       DRM_FORMAT_YUYV,
+       DRM_FORMAT_YVYU,
+       DRM_FORMAT_UYVY,
+       DRM_FORMAT_VYUY,
+       DRM_FORMAT_Y210,
+       DRM_FORMAT_Y212,
+       DRM_FORMAT_Y216,
+       DRM_FORMAT_Y410,
+       DRM_FORMAT_Y412,
+       DRM_FORMAT_Y416,
+};
+
+static const u32 skl_planar_formats[] = {
        DRM_FORMAT_C8,
        DRM_FORMAT_RGB565,
        DRM_FORMAT_XRGB8888,
@@ -1767,7 +1840,51 @@ static const uint32_t skl_planar_formats[] = {
        DRM_FORMAT_NV12,
 };
 
-static const uint64_t skl_plane_format_modifiers_noccs[] = {
+static const uint32_t glk_planar_formats[] = {
+       DRM_FORMAT_C8,
+       DRM_FORMAT_RGB565,
+       DRM_FORMAT_XRGB8888,
+       DRM_FORMAT_XBGR8888,
+       DRM_FORMAT_ARGB8888,
+       DRM_FORMAT_ABGR8888,
+       DRM_FORMAT_XRGB2101010,
+       DRM_FORMAT_XBGR2101010,
+       DRM_FORMAT_YUYV,
+       DRM_FORMAT_YVYU,
+       DRM_FORMAT_UYVY,
+       DRM_FORMAT_VYUY,
+       DRM_FORMAT_NV12,
+       DRM_FORMAT_P010,
+       DRM_FORMAT_P012,
+       DRM_FORMAT_P016,
+};
+
+static const uint32_t icl_planar_formats[] = {
+       DRM_FORMAT_C8,
+       DRM_FORMAT_RGB565,
+       DRM_FORMAT_XRGB8888,
+       DRM_FORMAT_XBGR8888,
+       DRM_FORMAT_ARGB8888,
+       DRM_FORMAT_ABGR8888,
+       DRM_FORMAT_XRGB2101010,
+       DRM_FORMAT_XBGR2101010,
+       DRM_FORMAT_YUYV,
+       DRM_FORMAT_YVYU,
+       DRM_FORMAT_UYVY,
+       DRM_FORMAT_VYUY,
+       DRM_FORMAT_NV12,
+       DRM_FORMAT_P010,
+       DRM_FORMAT_P012,
+       DRM_FORMAT_P016,
+       DRM_FORMAT_Y210,
+       DRM_FORMAT_Y212,
+       DRM_FORMAT_Y216,
+       DRM_FORMAT_Y410,
+       DRM_FORMAT_Y412,
+       DRM_FORMAT_Y416,
+};
+
+static const u64 skl_plane_format_modifiers_noccs[] = {
        I915_FORMAT_MOD_Yf_TILED,
        I915_FORMAT_MOD_Y_TILED,
        I915_FORMAT_MOD_X_TILED,
@@ -1775,7 +1892,7 @@ static const uint64_t skl_plane_format_modifiers_noccs[] = {
        DRM_FORMAT_MOD_INVALID
 };
 
-static const uint64_t skl_plane_format_modifiers_ccs[] = {
+static const u64 skl_plane_format_modifiers_ccs[] = {
        I915_FORMAT_MOD_Yf_TILED_CCS,
        I915_FORMAT_MOD_Y_TILED_CCS,
        I915_FORMAT_MOD_Yf_TILED,
@@ -1906,6 +2023,15 @@ static bool skl_plane_format_mod_supported(struct drm_plane *_plane,
        case DRM_FORMAT_UYVY:
        case DRM_FORMAT_VYUY:
        case DRM_FORMAT_NV12:
+       case DRM_FORMAT_P010:
+       case DRM_FORMAT_P012:
+       case DRM_FORMAT_P016:
+       case DRM_FORMAT_Y210:
+       case DRM_FORMAT_Y212:
+       case DRM_FORMAT_Y216:
+       case DRM_FORMAT_Y410:
+       case DRM_FORMAT_Y412:
+       case DRM_FORMAT_Y416:
                if (modifier == I915_FORMAT_MOD_Yf_TILED)
                        return true;
                /* fall through */
@@ -1983,7 +2109,7 @@ static bool skl_plane_has_planar(struct drm_i915_private *dev_priv,
        if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv))
                return false;
 
-       if (IS_GEN9(dev_priv) && !IS_GEMINILAKE(dev_priv) && pipe == PIPE_C)
+       if (IS_GEN(dev_priv, 9) && !IS_GEMINILAKE(dev_priv) && pipe == PIPE_C)
                return false;
 
        if (plane_id != PLANE_PRIMARY && plane_id != PLANE_SPRITE0)
@@ -2046,8 +2172,19 @@ skl_universal_plane_create(struct drm_i915_private *dev_priv,
                plane->update_slave = icl_update_slave;
 
        if (skl_plane_has_planar(dev_priv, pipe, plane_id)) {
-               formats = skl_planar_formats;
-               num_formats = ARRAY_SIZE(skl_planar_formats);
+               if (INTEL_GEN(dev_priv) >= 11) {
+                       formats = icl_planar_formats;
+                       num_formats = ARRAY_SIZE(icl_planar_formats);
+               } else if (INTEL_GEN(dev_priv) == 10 || IS_GEMINILAKE(dev_priv)) {
+                       formats = glk_planar_formats;
+                       num_formats = ARRAY_SIZE(glk_planar_formats);
+               } else {
+                       formats = skl_planar_formats;
+                       num_formats = ARRAY_SIZE(skl_planar_formats);
+               }
+       } else if (INTEL_GEN(dev_priv) >= 11) {
+               formats = icl_plane_formats;
+               num_formats = ARRAY_SIZE(icl_plane_formats);
        } else {
                formats = skl_plane_formats;
                num_formats = ARRAY_SIZE(skl_plane_formats);
@@ -2163,7 +2300,7 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,
                plane->check_plane = g4x_sprite_check;
 
                modifiers = i9xx_plane_format_modifiers;
-               if (IS_GEN6(dev_priv)) {
+               if (IS_GEN(dev_priv, 6)) {
                        formats = snb_plane_formats;
                        num_formats = ARRAY_SIZE(snb_plane_formats);