Message ID | 20180601183915.951-1-ville.syrjala@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, 2018-06-01 at 21:39 +0300, Ville Syrjala wrote: > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > There's not much point in following the primary vs. sprite split > for the SKL+ universal plane init code. The only difference is > of our own doing in the form of the .check_plane(). Let's make > a small exception for that little detail and otherwise share > the same code to initialize all the universal planes. > > Eventually we should eliminate the mess around .check_plane() > as well, but for now let's be happy with some code reduction. > > v2: Remember to set up plane->has_fbc > Make skl_plane_has_ccs() static > v3: Rebase due to NV12, rename some variables > v4: Don't leave the color_encoding/range props behind > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> > --- > drivers/gpu/drm/i915/intel_display.c | 220 +++-------------------- > ------------ > drivers/gpu/drm/i915/intel_drv.h | 12 +- > drivers/gpu/drm/i915/intel_sprite.c | 201 +++++++++++++++++++++++ > --------- > 3 files changed, 167 insertions(+), 266 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_display.c > b/drivers/gpu/drm/i915/intel_display.c > index 13de4e9e276a..2549fec31c79 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -73,55 +73,6 @@ static const uint64_t i9xx_format_modifiers[] = { > DRM_FORMAT_MOD_INVALID > }; > > -static const uint32_t skl_primary_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, > -}; > - > -static const uint32_t skl_pri_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, > -}; > - > -static const uint64_t skl_format_modifiers_noccs[] = { > - I915_FORMAT_MOD_Yf_TILED, > - I915_FORMAT_MOD_Y_TILED, > - I915_FORMAT_MOD_X_TILED, > - DRM_FORMAT_MOD_LINEAR, > - DRM_FORMAT_MOD_INVALID > -}; > - > -static const uint64_t skl_format_modifiers_ccs[] = { > - I915_FORMAT_MOD_Yf_TILED_CCS, > - I915_FORMAT_MOD_Y_TILED_CCS, > - I915_FORMAT_MOD_Yf_TILED, > - I915_FORMAT_MOD_Y_TILED, > - I915_FORMAT_MOD_X_TILED, > - DRM_FORMAT_MOD_LINEAR, > - DRM_FORMAT_MOD_INVALID > -}; > - > /* Cursor formats */ > static const uint32_t intel_cursor_formats[] = { > DRM_FORMAT_ARGB8888, > @@ -13273,57 +13224,6 @@ static bool > i965_plane_format_mod_supported(struct drm_plane *_plane, > } > } > > -static bool skl_plane_format_mod_supported(struct drm_plane *_plane, > - u32 format, u64 modifier) > -{ > - struct intel_plane *plane = to_intel_plane(_plane); > - > - switch (modifier) { > - case DRM_FORMAT_MOD_LINEAR: > - case I915_FORMAT_MOD_X_TILED: > - case I915_FORMAT_MOD_Y_TILED: > - case I915_FORMAT_MOD_Yf_TILED: > - break; > - case I915_FORMAT_MOD_Y_TILED_CCS: > - case I915_FORMAT_MOD_Yf_TILED_CCS: > - if (!plane->has_ccs) > - return false; > - break; > - default: > - return false; > - } > - > - switch (format) { > - case DRM_FORMAT_XRGB8888: > - case DRM_FORMAT_XBGR8888: > - case DRM_FORMAT_ARGB8888: > - case DRM_FORMAT_ABGR8888: > - if (modifier == I915_FORMAT_MOD_Yf_TILED_CCS || > - modifier == I915_FORMAT_MOD_Y_TILED_CCS) > - return true; > - /* fall through */ > - case DRM_FORMAT_RGB565: > - case DRM_FORMAT_XRGB2101010: > - case DRM_FORMAT_XBGR2101010: > - case DRM_FORMAT_YUYV: > - 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 */ > - case DRM_FORMAT_C8: > - if (modifier == DRM_FORMAT_MOD_LINEAR || > - modifier == I915_FORMAT_MOD_X_TILED || > - modifier == I915_FORMAT_MOD_Y_TILED) > - return true; > - /* fall through */ > - default: > - return false; > - } > -} > - > static bool intel_cursor_format_mod_supported(struct drm_plane > *_plane, > u32 format, u64 > modifier) > { > @@ -13331,17 +13231,6 @@ static bool > intel_cursor_format_mod_supported(struct drm_plane *_plane, > format == DRM_FORMAT_ARGB8888; > } > > -static const struct drm_plane_funcs skl_plane_funcs = { > - .update_plane = drm_atomic_helper_update_plane, > - .disable_plane = drm_atomic_helper_disable_plane, > - .destroy = intel_plane_destroy, > - .atomic_get_property = intel_plane_atomic_get_property, > - .atomic_set_property = intel_plane_atomic_set_property, > - .atomic_duplicate_state = intel_plane_duplicate_state, > - .atomic_destroy_state = intel_plane_destroy_state, > - .format_mod_supported = skl_plane_format_mod_supported, > -}; > - > static const struct drm_plane_funcs i965_plane_funcs = { > .update_plane = drm_atomic_helper_update_plane, > .disable_plane = drm_atomic_helper_disable_plane, > @@ -13506,39 +13395,6 @@ static bool i9xx_plane_has_fbc(struct > drm_i915_private *dev_priv, > return i9xx_plane == PLANE_A; > } > > -static bool skl_plane_has_fbc(struct drm_i915_private *dev_priv, > - enum pipe pipe, enum plane_id > plane_id) > -{ > - if (!HAS_FBC(dev_priv)) > - return false; > - > - return pipe == PIPE_A && plane_id == PLANE_PRIMARY; > -} > - > -bool skl_plane_has_planar(struct drm_i915_private *dev_priv, > - enum pipe pipe, enum plane_id plane_id) > -{ > - if (plane_id == PLANE_PRIMARY) { > - if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv)) > - return false; > - else if ((INTEL_GEN(dev_priv) == 9 && pipe == > PIPE_C) && > - !IS_GEMINILAKE(dev_priv)) > - return false; > - } else if (plane_id >= PLANE_SPRITE0) { > - if (plane_id == PLANE_CURSOR) > - return false; > - if (IS_GEMINILAKE(dev_priv) || INTEL_GEN(dev_priv) > == 10) { > - if (plane_id != PLANE_SPRITE0) > - return false; > - } else { > - if (plane_id != PLANE_SPRITE0 || pipe == > PIPE_C || > - IS_SKYLAKE(dev_priv) || > IS_BROXTON(dev_priv)) > - return false; > - } > - } > - return true; > -} > - > static struct intel_plane * > intel_primary_plane_create(struct drm_i915_private *dev_priv, enum > pipe pipe) > { > @@ -13551,14 +13407,24 @@ intel_primary_plane_create(struct > drm_i915_private *dev_priv, enum pipe pipe) > const uint64_t *modifiers; > int ret; > > + if (INTEL_GEN(dev_priv) >= 9) { > + primary = skl_universal_plane_create(dev_priv, pipe, > + PLANE_PRIMARY); > + if (IS_ERR(primary)) > + return primary; > + > + /* FIXME unify */ > + primary->check_plane = intel_check_primary_plane; > + > + return primary; > + } > + > primary = intel_plane_alloc(); > if (IS_ERR(primary)) > return primary; > > primary->can_scale = false; > primary->max_downscale = 1; > - if (INTEL_GEN(dev_priv) >= 9) > - primary->can_scale = true; > primary->pipe = pipe; > /* > * On gen2/3 only plane A can do FBC, but the panel fitter > and LVDS > @@ -13571,14 +13437,7 @@ intel_primary_plane_create(struct > drm_i915_private *dev_priv, enum pipe pipe) > primary->id = PLANE_PRIMARY; > primary->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, primary- > >id); > > - if (INTEL_GEN(dev_priv) >= 9) > - primary->has_fbc = skl_plane_has_fbc(dev_priv, > - primary->pipe, > - primary->id); > - else > - primary->has_fbc = i9xx_plane_has_fbc(dev_priv, > - primary- > >i9xx_plane); > - > + primary->has_fbc = i9xx_plane_has_fbc(dev_priv, primary- > >i9xx_plane); > if (primary->has_fbc) { > struct intel_fbc *fbc = &dev_priv->fbc; > > @@ -13587,29 +13446,7 @@ intel_primary_plane_create(struct > drm_i915_private *dev_priv, enum pipe pipe) > > primary->check_plane = intel_check_primary_plane; > > - if (INTEL_GEN(dev_priv) >= 9) { > - primary->has_ccs = skl_plane_has_ccs(dev_priv, pipe, > - PLANE_PRIMARY); > - > - if (skl_plane_has_planar(dev_priv, pipe, > PLANE_PRIMARY)) { > - intel_primary_formats = > skl_pri_planar_formats; > - num_formats = > ARRAY_SIZE(skl_pri_planar_formats); > - } else { > - intel_primary_formats = skl_primary_formats; > - num_formats = > ARRAY_SIZE(skl_primary_formats); > - } > - > - if (primary->has_ccs) > - modifiers = skl_format_modifiers_ccs; > - else > - modifiers = skl_format_modifiers_noccs; > - > - primary->update_plane = skl_update_plane; > - primary->disable_plane = skl_disable_plane; > - primary->get_hw_state = skl_plane_get_hw_state; > - > - plane_funcs = &skl_plane_funcs; > - } else if (INTEL_GEN(dev_priv) >= 4) { > + if (INTEL_GEN(dev_priv) >= 4) { > intel_primary_formats = i965_primary_formats; > num_formats = ARRAY_SIZE(i965_primary_formats); > modifiers = i9xx_format_modifiers; > @@ -13633,14 +13470,7 @@ intel_primary_plane_create(struct > drm_i915_private *dev_priv, enum pipe pipe) > > possible_crtcs = BIT(pipe); > > - if (INTEL_GEN(dev_priv) >= 9) > - ret = drm_universal_plane_init(&dev_priv->drm, > &primary->base, > - possible_crtcs, > plane_funcs, > - intel_primary_formats > , num_formats, > - modifiers, > - DRM_PLANE_TYPE_PRIMAR > Y, > - "plane 1%c", > pipe_name(pipe)); > - else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv)) > + if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv)) > ret = drm_universal_plane_init(&dev_priv->drm, > &primary->base, > possible_crtcs, > plane_funcs, > intel_primary_formats > , num_formats, > @@ -13658,16 +13488,7 @@ intel_primary_plane_create(struct > drm_i915_private *dev_priv, enum pipe pipe) > if (ret) > goto fail; > > - if (INTEL_GEN(dev_priv) >= 10) { > - supported_rotations = > - DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 | > - DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270 | > - DRM_MODE_REFLECT_X; > - } else if (INTEL_GEN(dev_priv) >= 9) { > - supported_rotations = > - DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 | > - DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270; > - } else if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) { > + if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) { > supported_rotations = > DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 | > DRM_MODE_REFLECT_X; > @@ -13683,15 +13504,6 @@ intel_primary_plane_create(struct > drm_i915_private *dev_priv, enum pipe pipe) > DRM_MODE_ROTATE_0 > , > supported_rotatio > ns); > > - if (INTEL_GEN(dev_priv) >= 9) > - drm_plane_create_color_properties(&primary->base, > - BIT(DRM_COLOR_YCBC > R_BT601) | > - BIT(DRM_COLOR_YCBC > R_BT709), > - BIT(DRM_COLOR_YCBC > R_LIMITED_RANGE) | > - BIT(DRM_COLOR_YCBC > R_FULL_RANGE), > - DRM_COLOR_YCBCR_BT > 709, > - DRM_COLOR_YCBCR_LI > MITED_RANGE); > - > drm_plane_helper_add(&primary->base, > &intel_plane_helper_funcs); > > return primary; > diff --git a/drivers/gpu/drm/i915/intel_drv.h > b/drivers/gpu/drm/i915/intel_drv.h > index 88adf31ef1c2..3d5281a3cf1e 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -2081,18 +2081,12 @@ int intel_sprite_set_colorkey_ioctl(struct > drm_device *dev, void *data, > struct drm_file *file_priv); > void intel_pipe_update_start(const struct intel_crtc_state > *new_crtc_state); > void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state); > -void skl_update_plane(struct intel_plane *plane, > - const struct intel_crtc_state *crtc_state, > - const struct intel_plane_state *plane_state); > -void skl_disable_plane(struct intel_plane *plane, struct intel_crtc > *crtc); > -bool skl_plane_get_hw_state(struct intel_plane *plane, enum pipe > *pipe); > -bool skl_plane_has_ccs(struct drm_i915_private *dev_priv, > - enum pipe pipe, enum plane_id plane_id); > bool intel_format_is_yuv(uint32_t format); > -bool skl_plane_has_planar(struct drm_i915_private *dev_priv, > - enum pipe pipe, enum plane_id plane_id); > struct intel_plane *intel_plane_alloc(void); > void intel_plane_free(struct intel_plane *plane); > +struct intel_plane * > +skl_universal_plane_create(struct drm_i915_private *dev_priv, > + enum pipe pipe, enum plane_id plane_id); > > > /* intel_tv.c */ > diff --git a/drivers/gpu/drm/i915/intel_sprite.c > b/drivers/gpu/drm/i915/intel_sprite.c > index cc78d6b14bf0..21b6ff63d15d 100644 > --- a/drivers/gpu/drm/i915/intel_sprite.c > +++ b/drivers/gpu/drm/i915/intel_sprite.c > @@ -230,7 +230,7 @@ void intel_pipe_update_end(struct > intel_crtc_state *new_crtc_state) > #endif > } > > -void > +static void > skl_update_plane(struct intel_plane *plane, > const struct intel_crtc_state *crtc_state, > const struct intel_plane_state *plane_state) > @@ -330,7 +330,7 @@ skl_update_plane(struct intel_plane *plane, > spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); > } > > -void > +static void > skl_disable_plane(struct intel_plane *plane, struct intel_crtc > *crtc) > { > struct drm_i915_private *dev_priv = to_i915(plane- > >base.dev); > @@ -348,7 +348,7 @@ skl_disable_plane(struct intel_plane *plane, > struct intel_crtc *crtc) > spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); > } > > -bool > +static bool > skl_plane_get_hw_state(struct intel_plane *plane, > enum pipe *pipe) > { > @@ -1440,8 +1440,41 @@ static const struct drm_plane_funcs > skl_plane_funcs = { > .format_mod_supported = skl_plane_format_mod_supported, > }; > > -bool skl_plane_has_ccs(struct drm_i915_private *dev_priv, > - enum pipe pipe, enum plane_id plane_id) > +static bool skl_plane_has_fbc(struct drm_i915_private *dev_priv, > + enum pipe pipe, enum plane_id > plane_id) > +{ > + if (!HAS_FBC(dev_priv)) > + return false; > + > + return pipe == PIPE_A && plane_id == PLANE_PRIMARY; > +} > + > +static bool skl_plane_has_planar(struct drm_i915_private *dev_priv, > + enum pipe pipe, enum plane_id > plane_id) > +{ > + if (plane_id == PLANE_PRIMARY) { > + if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv)) > + return false; > + else if ((INTEL_GEN(dev_priv) == 9 && pipe == > PIPE_C) && > + !IS_GEMINILAKE(dev_priv)) > + return false; > + } else if (plane_id >= PLANE_SPRITE0) { > + if (plane_id == PLANE_CURSOR) > + return false; > + if (IS_GEMINILAKE(dev_priv) || INTEL_GEN(dev_priv) > == 10) { > + if (plane_id != PLANE_SPRITE0) > + return false; > + } else { > + if (plane_id != PLANE_SPRITE0 || pipe == > PIPE_C || > + IS_SKYLAKE(dev_priv) || > IS_BROXTON(dev_priv)) > + return false; > + } > + } > + return true; > +} > + > +static bool skl_plane_has_ccs(struct drm_i915_private *dev_priv, > + enum pipe pipe, enum plane_id > plane_id) > { > if (plane_id == PLANE_CURSOR) > return false; > @@ -1486,6 +1519,98 @@ void intel_plane_free(struct intel_plane > *plane) > kfree(plane); > } > > +struct intel_plane * > +skl_universal_plane_create(struct drm_i915_private *dev_priv, > + enum pipe pipe, enum plane_id plane_id) > +{ > + struct intel_plane *plane; > + enum drm_plane_type plane_type; > + unsigned int supported_rotations; > + unsigned int possible_crtcs; > + const u64 *modifiers; > + const u32 *formats; > + int num_formats; > + int ret; > + > + plane = intel_plane_alloc(); > + if (IS_ERR(plane)) > + return plane; > + > + plane->pipe = pipe; > + plane->id = plane_id; > + plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane_id); > + > + plane->can_scale = true; > + > + plane->has_fbc = skl_plane_has_fbc(dev_priv, pipe, > plane_id); > + if (plane->has_fbc) { > + struct intel_fbc *fbc = &dev_priv->fbc; > + > + fbc->possible_framebuffer_bits |= plane- > >frontbuffer_bit; > + } > + > + plane->update_plane = skl_update_plane; > + plane->disable_plane = skl_disable_plane; > + plane->get_hw_state = skl_plane_get_hw_state; > + > + if (skl_plane_has_planar(dev_priv, pipe, plane_id)) { > + formats = skl_planar_formats; > + num_formats = ARRAY_SIZE(skl_planar_formats); > + } else { > + formats = skl_plane_formats; > + num_formats = ARRAY_SIZE(skl_plane_formats); > + } > + > + if (skl_plane_has_ccs(dev_priv, pipe, plane_id)) > + modifiers = skl_plane_format_modifiers_ccs; > + else > + modifiers = skl_plane_format_modifiers_noccs; > + > + if (plane_id == PLANE_PRIMARY) > + plane_type = DRM_PLANE_TYPE_PRIMARY; > + else > + plane_type = DRM_PLANE_TYPE_OVERLAY; > + > + possible_crtcs = BIT(pipe); > + > + ret = drm_universal_plane_init(&dev_priv->drm, &plane->base, > + possible_crtcs, > &skl_plane_funcs, > + formats, num_formats, > modifiers, > + plane_type, > + "plane %d%c", plane_id + 1, > + pipe_name(pipe)); > + if (ret) > + goto fail; > + > + supported_rotations = > + DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 | > + DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270; > + > + if (INTEL_GEN(dev_priv) >= 10) > + supported_rotations |= DRM_MODE_REFLECT_X; > + > + drm_plane_create_rotation_property(&plane->base, > + DRM_MODE_ROTATE_0, > + supported_rotations); > + > + drm_plane_create_color_properties(&plane->base, > + BIT(DRM_COLOR_YCBCR_BT601) > | > + BIT(DRM_COLOR_YCBCR_BT709) > , > + BIT(DRM_COLOR_YCBCR_LIMITE > D_RANGE) | > + BIT(DRM_COLOR_YCBCR_FULL_R > ANGE), > + DRM_COLOR_YCBCR_BT709, > + DRM_COLOR_YCBCR_LIMITED_RA > NGE); > + > + drm_plane_helper_add(&plane->base, > &intel_plane_helper_funcs); > + > + return plane; > + > +fail: > + intel_plane_free(plane); > + > + return ERR_PTR(ret); > +} > + > struct intel_plane * > intel_sprite_plane_create(struct drm_i915_private *dev_priv, > enum pipe pipe, int plane) > @@ -1499,36 +1624,23 @@ intel_sprite_plane_create(struct > drm_i915_private *dev_priv, > int num_plane_formats; > int ret; > > - intel_plane = intel_plane_alloc(); > - if (IS_ERR(intel_plane)) > - return intel_plane; > - > if (INTEL_GEN(dev_priv) >= 9) { > - intel_plane->can_scale = true; > - > - intel_plane->has_ccs = skl_plane_has_ccs(dev_priv, > pipe, > + intel_plane = skl_universal_plane_create(dev_priv, > pipe, > PLANE_SPRIT > E0 + plane); > + if (IS_ERR(intel_plane)) > + return intel_plane; > > - intel_plane->update_plane = skl_update_plane; > - intel_plane->disable_plane = skl_disable_plane; > - intel_plane->get_hw_state = skl_plane_get_hw_state; > + /* FIXME unify */ > + intel_plane->check_plane = intel_check_sprite_plane; > > - 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); > - } > + return intel_plane; > + } > > - if (intel_plane->has_ccs) > - modifiers = skl_plane_format_modifiers_ccs; > - else > - modifiers = > skl_plane_format_modifiers_noccs; > + intel_plane = intel_plane_alloc(); > + if (IS_ERR(intel_plane)) > + return intel_plane; > > - plane_funcs = &skl_plane_funcs; > - } else if (IS_VALLEYVIEW(dev_priv) || > IS_CHERRYVIEW(dev_priv)) { > + if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) { > intel_plane->can_scale = false; > intel_plane->max_downscale = 1; > > @@ -1581,16 +1693,7 @@ intel_sprite_plane_create(struct > drm_i915_private *dev_priv, > } > } > > - if (INTEL_GEN(dev_priv) >= 10) { > - supported_rotations = > - DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 | > - DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270 | > - DRM_MODE_REFLECT_X; > - } else if (INTEL_GEN(dev_priv) >= 9) { > - supported_rotations = > - DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 | > - DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270; > - } else if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) { > + if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) { > supported_rotations = > DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 | > DRM_MODE_REFLECT_X; > @@ -1606,20 +1709,12 @@ intel_sprite_plane_create(struct > drm_i915_private *dev_priv, > > possible_crtcs = BIT(pipe); > > - if (INTEL_GEN(dev_priv) >= 9) > - ret = drm_universal_plane_init(&dev_priv->drm, > &intel_plane->base, > - possible_crtcs, > plane_funcs, > - plane_formats, > num_plane_formats, > - modifiers, > - DRM_PLANE_TYPE_OVERLA > Y, > - "plane %d%c", plane + > 2, pipe_name(pipe)); > - else > - ret = drm_universal_plane_init(&dev_priv->drm, > &intel_plane->base, > - possible_crtcs, > plane_funcs, > - plane_formats, > num_plane_formats, > - modifiers, > - DRM_PLANE_TYPE_OVERLA > Y, > - "sprite %c", > sprite_name(pipe, plane)); > + ret = drm_universal_plane_init(&dev_priv->drm, &intel_plane- > >base, > + possible_crtcs, plane_funcs, > + plane_formats, > num_plane_formats, > + modifiers, > + DRM_PLANE_TYPE_OVERLAY, > + "sprite %c", > sprite_name(pipe, plane)); > if (ret) > goto fail; > -- Best Regards, Lisovskiy Stanislav
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 13de4e9e276a..2549fec31c79 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -73,55 +73,6 @@ static const uint64_t i9xx_format_modifiers[] = { DRM_FORMAT_MOD_INVALID }; -static const uint32_t skl_primary_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, -}; - -static const uint32_t skl_pri_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, -}; - -static const uint64_t skl_format_modifiers_noccs[] = { - I915_FORMAT_MOD_Yf_TILED, - I915_FORMAT_MOD_Y_TILED, - I915_FORMAT_MOD_X_TILED, - DRM_FORMAT_MOD_LINEAR, - DRM_FORMAT_MOD_INVALID -}; - -static const uint64_t skl_format_modifiers_ccs[] = { - I915_FORMAT_MOD_Yf_TILED_CCS, - I915_FORMAT_MOD_Y_TILED_CCS, - I915_FORMAT_MOD_Yf_TILED, - I915_FORMAT_MOD_Y_TILED, - I915_FORMAT_MOD_X_TILED, - DRM_FORMAT_MOD_LINEAR, - DRM_FORMAT_MOD_INVALID -}; - /* Cursor formats */ static const uint32_t intel_cursor_formats[] = { DRM_FORMAT_ARGB8888, @@ -13273,57 +13224,6 @@ static bool i965_plane_format_mod_supported(struct drm_plane *_plane, } } -static bool skl_plane_format_mod_supported(struct drm_plane *_plane, - u32 format, u64 modifier) -{ - struct intel_plane *plane = to_intel_plane(_plane); - - switch (modifier) { - case DRM_FORMAT_MOD_LINEAR: - case I915_FORMAT_MOD_X_TILED: - case I915_FORMAT_MOD_Y_TILED: - case I915_FORMAT_MOD_Yf_TILED: - break; - case I915_FORMAT_MOD_Y_TILED_CCS: - case I915_FORMAT_MOD_Yf_TILED_CCS: - if (!plane->has_ccs) - return false; - break; - default: - return false; - } - - switch (format) { - case DRM_FORMAT_XRGB8888: - case DRM_FORMAT_XBGR8888: - case DRM_FORMAT_ARGB8888: - case DRM_FORMAT_ABGR8888: - if (modifier == I915_FORMAT_MOD_Yf_TILED_CCS || - modifier == I915_FORMAT_MOD_Y_TILED_CCS) - return true; - /* fall through */ - case DRM_FORMAT_RGB565: - case DRM_FORMAT_XRGB2101010: - case DRM_FORMAT_XBGR2101010: - case DRM_FORMAT_YUYV: - 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 */ - case DRM_FORMAT_C8: - if (modifier == DRM_FORMAT_MOD_LINEAR || - modifier == I915_FORMAT_MOD_X_TILED || - modifier == I915_FORMAT_MOD_Y_TILED) - return true; - /* fall through */ - default: - return false; - } -} - static bool intel_cursor_format_mod_supported(struct drm_plane *_plane, u32 format, u64 modifier) { @@ -13331,17 +13231,6 @@ static bool intel_cursor_format_mod_supported(struct drm_plane *_plane, format == DRM_FORMAT_ARGB8888; } -static const struct drm_plane_funcs skl_plane_funcs = { - .update_plane = drm_atomic_helper_update_plane, - .disable_plane = drm_atomic_helper_disable_plane, - .destroy = intel_plane_destroy, - .atomic_get_property = intel_plane_atomic_get_property, - .atomic_set_property = intel_plane_atomic_set_property, - .atomic_duplicate_state = intel_plane_duplicate_state, - .atomic_destroy_state = intel_plane_destroy_state, - .format_mod_supported = skl_plane_format_mod_supported, -}; - static const struct drm_plane_funcs i965_plane_funcs = { .update_plane = drm_atomic_helper_update_plane, .disable_plane = drm_atomic_helper_disable_plane, @@ -13506,39 +13395,6 @@ static bool i9xx_plane_has_fbc(struct drm_i915_private *dev_priv, return i9xx_plane == PLANE_A; } -static bool skl_plane_has_fbc(struct drm_i915_private *dev_priv, - enum pipe pipe, enum plane_id plane_id) -{ - if (!HAS_FBC(dev_priv)) - return false; - - return pipe == PIPE_A && plane_id == PLANE_PRIMARY; -} - -bool skl_plane_has_planar(struct drm_i915_private *dev_priv, - enum pipe pipe, enum plane_id plane_id) -{ - if (plane_id == PLANE_PRIMARY) { - if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv)) - return false; - else if ((INTEL_GEN(dev_priv) == 9 && pipe == PIPE_C) && - !IS_GEMINILAKE(dev_priv)) - return false; - } else if (plane_id >= PLANE_SPRITE0) { - if (plane_id == PLANE_CURSOR) - return false; - if (IS_GEMINILAKE(dev_priv) || INTEL_GEN(dev_priv) == 10) { - if (plane_id != PLANE_SPRITE0) - return false; - } else { - if (plane_id != PLANE_SPRITE0 || pipe == PIPE_C || - IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv)) - return false; - } - } - return true; -} - static struct intel_plane * intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe) { @@ -13551,14 +13407,24 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe) const uint64_t *modifiers; int ret; + if (INTEL_GEN(dev_priv) >= 9) { + primary = skl_universal_plane_create(dev_priv, pipe, + PLANE_PRIMARY); + if (IS_ERR(primary)) + return primary; + + /* FIXME unify */ + primary->check_plane = intel_check_primary_plane; + + return primary; + } + primary = intel_plane_alloc(); if (IS_ERR(primary)) return primary; primary->can_scale = false; primary->max_downscale = 1; - if (INTEL_GEN(dev_priv) >= 9) - primary->can_scale = true; primary->pipe = pipe; /* * On gen2/3 only plane A can do FBC, but the panel fitter and LVDS @@ -13571,14 +13437,7 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe) primary->id = PLANE_PRIMARY; primary->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, primary->id); - if (INTEL_GEN(dev_priv) >= 9) - primary->has_fbc = skl_plane_has_fbc(dev_priv, - primary->pipe, - primary->id); - else - primary->has_fbc = i9xx_plane_has_fbc(dev_priv, - primary->i9xx_plane); - + primary->has_fbc = i9xx_plane_has_fbc(dev_priv, primary->i9xx_plane); if (primary->has_fbc) { struct intel_fbc *fbc = &dev_priv->fbc; @@ -13587,29 +13446,7 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe) primary->check_plane = intel_check_primary_plane; - if (INTEL_GEN(dev_priv) >= 9) { - primary->has_ccs = skl_plane_has_ccs(dev_priv, pipe, - PLANE_PRIMARY); - - if (skl_plane_has_planar(dev_priv, pipe, PLANE_PRIMARY)) { - intel_primary_formats = skl_pri_planar_formats; - num_formats = ARRAY_SIZE(skl_pri_planar_formats); - } else { - intel_primary_formats = skl_primary_formats; - num_formats = ARRAY_SIZE(skl_primary_formats); - } - - if (primary->has_ccs) - modifiers = skl_format_modifiers_ccs; - else - modifiers = skl_format_modifiers_noccs; - - primary->update_plane = skl_update_plane; - primary->disable_plane = skl_disable_plane; - primary->get_hw_state = skl_plane_get_hw_state; - - plane_funcs = &skl_plane_funcs; - } else if (INTEL_GEN(dev_priv) >= 4) { + if (INTEL_GEN(dev_priv) >= 4) { intel_primary_formats = i965_primary_formats; num_formats = ARRAY_SIZE(i965_primary_formats); modifiers = i9xx_format_modifiers; @@ -13633,14 +13470,7 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe) possible_crtcs = BIT(pipe); - if (INTEL_GEN(dev_priv) >= 9) - ret = drm_universal_plane_init(&dev_priv->drm, &primary->base, - possible_crtcs, plane_funcs, - intel_primary_formats, num_formats, - modifiers, - DRM_PLANE_TYPE_PRIMARY, - "plane 1%c", pipe_name(pipe)); - else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv)) + if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv)) ret = drm_universal_plane_init(&dev_priv->drm, &primary->base, possible_crtcs, plane_funcs, intel_primary_formats, num_formats, @@ -13658,16 +13488,7 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe) if (ret) goto fail; - if (INTEL_GEN(dev_priv) >= 10) { - supported_rotations = - DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 | - DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270 | - DRM_MODE_REFLECT_X; - } else if (INTEL_GEN(dev_priv) >= 9) { - supported_rotations = - DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 | - DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270; - } else if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) { + if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) { supported_rotations = DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 | DRM_MODE_REFLECT_X; @@ -13683,15 +13504,6 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe) DRM_MODE_ROTATE_0, supported_rotations); - if (INTEL_GEN(dev_priv) >= 9) - drm_plane_create_color_properties(&primary->base, - BIT(DRM_COLOR_YCBCR_BT601) | - BIT(DRM_COLOR_YCBCR_BT709), - BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | - BIT(DRM_COLOR_YCBCR_FULL_RANGE), - DRM_COLOR_YCBCR_BT709, - DRM_COLOR_YCBCR_LIMITED_RANGE); - drm_plane_helper_add(&primary->base, &intel_plane_helper_funcs); return primary; diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 88adf31ef1c2..3d5281a3cf1e 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -2081,18 +2081,12 @@ int intel_sprite_set_colorkey_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state); void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state); -void skl_update_plane(struct intel_plane *plane, - const struct intel_crtc_state *crtc_state, - const struct intel_plane_state *plane_state); -void skl_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc); -bool skl_plane_get_hw_state(struct intel_plane *plane, enum pipe *pipe); -bool skl_plane_has_ccs(struct drm_i915_private *dev_priv, - enum pipe pipe, enum plane_id plane_id); bool intel_format_is_yuv(uint32_t format); -bool skl_plane_has_planar(struct drm_i915_private *dev_priv, - enum pipe pipe, enum plane_id plane_id); struct intel_plane *intel_plane_alloc(void); void intel_plane_free(struct intel_plane *plane); +struct intel_plane * +skl_universal_plane_create(struct drm_i915_private *dev_priv, + enum pipe pipe, enum plane_id plane_id); /* intel_tv.c */ diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index cc78d6b14bf0..21b6ff63d15d 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c @@ -230,7 +230,7 @@ void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state) #endif } -void +static void skl_update_plane(struct intel_plane *plane, const struct intel_crtc_state *crtc_state, const struct intel_plane_state *plane_state) @@ -330,7 +330,7 @@ skl_update_plane(struct intel_plane *plane, spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); } -void +static void skl_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc) { struct drm_i915_private *dev_priv = to_i915(plane->base.dev); @@ -348,7 +348,7 @@ skl_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc) spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); } -bool +static bool skl_plane_get_hw_state(struct intel_plane *plane, enum pipe *pipe) { @@ -1440,8 +1440,41 @@ static const struct drm_plane_funcs skl_plane_funcs = { .format_mod_supported = skl_plane_format_mod_supported, }; -bool skl_plane_has_ccs(struct drm_i915_private *dev_priv, - enum pipe pipe, enum plane_id plane_id) +static bool skl_plane_has_fbc(struct drm_i915_private *dev_priv, + enum pipe pipe, enum plane_id plane_id) +{ + if (!HAS_FBC(dev_priv)) + return false; + + return pipe == PIPE_A && plane_id == PLANE_PRIMARY; +} + +static bool skl_plane_has_planar(struct drm_i915_private *dev_priv, + enum pipe pipe, enum plane_id plane_id) +{ + if (plane_id == PLANE_PRIMARY) { + if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv)) + return false; + else if ((INTEL_GEN(dev_priv) == 9 && pipe == PIPE_C) && + !IS_GEMINILAKE(dev_priv)) + return false; + } else if (plane_id >= PLANE_SPRITE0) { + if (plane_id == PLANE_CURSOR) + return false; + if (IS_GEMINILAKE(dev_priv) || INTEL_GEN(dev_priv) == 10) { + if (plane_id != PLANE_SPRITE0) + return false; + } else { + if (plane_id != PLANE_SPRITE0 || pipe == PIPE_C || + IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv)) + return false; + } + } + return true; +} + +static bool skl_plane_has_ccs(struct drm_i915_private *dev_priv, + enum pipe pipe, enum plane_id plane_id) { if (plane_id == PLANE_CURSOR) return false; @@ -1486,6 +1519,98 @@ void intel_plane_free(struct intel_plane *plane) kfree(plane); } +struct intel_plane * +skl_universal_plane_create(struct drm_i915_private *dev_priv, + enum pipe pipe, enum plane_id plane_id) +{ + struct intel_plane *plane; + enum drm_plane_type plane_type; + unsigned int supported_rotations; + unsigned int possible_crtcs; + const u64 *modifiers; + const u32 *formats; + int num_formats; + int ret; + + plane = intel_plane_alloc(); + if (IS_ERR(plane)) + return plane; + + plane->pipe = pipe; + plane->id = plane_id; + plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane_id); + + plane->can_scale = true; + + plane->has_fbc = skl_plane_has_fbc(dev_priv, pipe, plane_id); + if (plane->has_fbc) { + struct intel_fbc *fbc = &dev_priv->fbc; + + fbc->possible_framebuffer_bits |= plane->frontbuffer_bit; + } + + plane->update_plane = skl_update_plane; + plane->disable_plane = skl_disable_plane; + plane->get_hw_state = skl_plane_get_hw_state; + + if (skl_plane_has_planar(dev_priv, pipe, plane_id)) { + formats = skl_planar_formats; + num_formats = ARRAY_SIZE(skl_planar_formats); + } else { + formats = skl_plane_formats; + num_formats = ARRAY_SIZE(skl_plane_formats); + } + + if (skl_plane_has_ccs(dev_priv, pipe, plane_id)) + modifiers = skl_plane_format_modifiers_ccs; + else + modifiers = skl_plane_format_modifiers_noccs; + + if (plane_id == PLANE_PRIMARY) + plane_type = DRM_PLANE_TYPE_PRIMARY; + else + plane_type = DRM_PLANE_TYPE_OVERLAY; + + possible_crtcs = BIT(pipe); + + ret = drm_universal_plane_init(&dev_priv->drm, &plane->base, + possible_crtcs, &skl_plane_funcs, + formats, num_formats, modifiers, + plane_type, + "plane %d%c", plane_id + 1, + pipe_name(pipe)); + if (ret) + goto fail; + + supported_rotations = + DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 | + DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270; + + if (INTEL_GEN(dev_priv) >= 10) + supported_rotations |= DRM_MODE_REFLECT_X; + + drm_plane_create_rotation_property(&plane->base, + DRM_MODE_ROTATE_0, + supported_rotations); + + drm_plane_create_color_properties(&plane->base, + BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709), + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE), + DRM_COLOR_YCBCR_BT709, + DRM_COLOR_YCBCR_LIMITED_RANGE); + + drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs); + + return plane; + +fail: + intel_plane_free(plane); + + return ERR_PTR(ret); +} + struct intel_plane * intel_sprite_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe, int plane) @@ -1499,36 +1624,23 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv, int num_plane_formats; int ret; - intel_plane = intel_plane_alloc(); - if (IS_ERR(intel_plane)) - return intel_plane; - if (INTEL_GEN(dev_priv) >= 9) { - intel_plane->can_scale = true; - - intel_plane->has_ccs = skl_plane_has_ccs(dev_priv, pipe, + intel_plane = skl_universal_plane_create(dev_priv, pipe, PLANE_SPRITE0 + plane); + if (IS_ERR(intel_plane)) + return intel_plane; - intel_plane->update_plane = skl_update_plane; - intel_plane->disable_plane = skl_disable_plane; - intel_plane->get_hw_state = skl_plane_get_hw_state; + /* FIXME unify */ + intel_plane->check_plane = intel_check_sprite_plane; - 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); - } + return intel_plane; + } - if (intel_plane->has_ccs) - modifiers = skl_plane_format_modifiers_ccs; - else - modifiers = skl_plane_format_modifiers_noccs; + intel_plane = intel_plane_alloc(); + if (IS_ERR(intel_plane)) + return intel_plane; - plane_funcs = &skl_plane_funcs; - } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) { + if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) { intel_plane->can_scale = false; intel_plane->max_downscale = 1; @@ -1581,16 +1693,7 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv, } } - if (INTEL_GEN(dev_priv) >= 10) { - supported_rotations = - DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 | - DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270 | - DRM_MODE_REFLECT_X; - } else if (INTEL_GEN(dev_priv) >= 9) { - supported_rotations = - DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 | - DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270; - } else if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) { + if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) { supported_rotations = DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 | DRM_MODE_REFLECT_X; @@ -1606,20 +1709,12 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv, possible_crtcs = BIT(pipe); - if (INTEL_GEN(dev_priv) >= 9) - ret = drm_universal_plane_init(&dev_priv->drm, &intel_plane->base, - possible_crtcs, plane_funcs, - plane_formats, num_plane_formats, - modifiers, - DRM_PLANE_TYPE_OVERLAY, - "plane %d%c", plane + 2, pipe_name(pipe)); - else - ret = drm_universal_plane_init(&dev_priv->drm, &intel_plane->base, - possible_crtcs, plane_funcs, - plane_formats, num_plane_formats, - modifiers, - DRM_PLANE_TYPE_OVERLAY, - "sprite %c", sprite_name(pipe, plane)); + ret = drm_universal_plane_init(&dev_priv->drm, &intel_plane->base, + possible_crtcs, plane_funcs, + plane_formats, num_plane_formats, + modifiers, + DRM_PLANE_TYPE_OVERLAY, + "sprite %c", sprite_name(pipe, plane)); if (ret) goto fail;