drm/i915: Introduce intel_plane_alloc()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 5 Oct 2018 12:58:14 +0000 (15:58 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 8 Oct 2018 10:52:54 +0000 (13:52 +0300)
Pull the common plane+plane_state allocation into a small helper.
Reduces the amount of boilerplate in the plane initialization
functions.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181005125817.22576-9-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_sprite.c

index d2246ec..b95675b 100644 (file)
@@ -13759,8 +13759,7 @@ bool skl_plane_has_planar(struct drm_i915_private *dev_priv,
 static struct intel_plane *
 intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
 {
-       struct intel_plane *primary = NULL;
-       struct intel_plane_state *state = NULL;
+       struct intel_plane *primary;
        const struct drm_plane_funcs *plane_funcs;
        const uint32_t *intel_primary_formats;
        unsigned int supported_rotations;
@@ -13769,19 +13768,9 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
        const uint64_t *modifiers;
        int ret;
 
-       primary = kzalloc(sizeof(*primary), GFP_KERNEL);
-       if (!primary) {
-               ret = -ENOMEM;
-               goto fail;
-       }
-
-       state = intel_create_plane_state(&primary->base);
-       if (!state) {
-               ret = -ENOMEM;
-               goto fail;
-       }
-
-       primary->base.state = &state->base;
+       primary = intel_plane_alloc();
+       if (IS_ERR(primary))
+               return primary;
 
        primary->pipe = pipe;
        /*
@@ -13932,8 +13921,7 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
        return primary;
 
 fail:
-       kfree(state);
-       kfree(primary);
+       intel_plane_free(primary);
 
        return ERR_PTR(ret);
 }
@@ -13942,24 +13930,13 @@ static struct intel_plane *
 intel_cursor_plane_create(struct drm_i915_private *dev_priv,
                          enum pipe pipe)
 {
-       struct intel_plane *cursor = NULL;
-       struct intel_plane_state *state = NULL;
        unsigned int possible_crtcs;
+       struct intel_plane *cursor;
        int ret;
 
-       cursor = kzalloc(sizeof(*cursor), GFP_KERNEL);
-       if (!cursor) {
-               ret = -ENOMEM;
-               goto fail;
-       }
-
-       state = intel_create_plane_state(&cursor->base);
-       if (!state) {
-               ret = -ENOMEM;
-               goto fail;
-       }
-
-       cursor->base.state = &state->base;
+       cursor = intel_plane_alloc();
+       if (IS_ERR(cursor))
+               return cursor;
 
        cursor->pipe = pipe;
        cursor->i9xx_plane = (enum i9xx_plane_id) pipe;
@@ -14009,8 +13986,7 @@ intel_cursor_plane_create(struct drm_i915_private *dev_priv,
        return cursor;
 
 fail:
-       kfree(state);
-       kfree(cursor);
+       intel_plane_free(cursor);
 
        return ERR_PTR(ret);
 }
index 43190c6..0e0f763 100644 (file)
@@ -2141,6 +2141,8 @@ int skl_plane_check(struct intel_crtc_state *crtc_state,
 int intel_plane_check_stride(const struct intel_plane_state *plane_state);
 int intel_plane_check_src_coordinates(struct intel_plane_state *plane_state);
 int chv_plane_check_rotation(const struct intel_plane_state *plane_state);
+struct intel_plane *intel_plane_alloc(void);
+void intel_plane_free(struct intel_plane *plane);
 
 /* intel_tv.c */
 void intel_tv_init(struct drm_i915_private *dev_priv);
index 5860530..8390b58 100644 (file)
@@ -1793,12 +1793,40 @@ bool skl_plane_has_ccs(struct drm_i915_private *dev_priv,
                 plane_id == PLANE_SPRITE0);
 }
 
+struct intel_plane *intel_plane_alloc(void)
+{
+       struct intel_plane_state *plane_state;
+       struct intel_plane *plane;
+
+       plane = kzalloc(sizeof(*plane), GFP_KERNEL);
+       if (!plane)
+               return ERR_PTR(-ENOMEM);
+
+       plane_state = intel_create_plane_state(&plane->base);
+       if (!plane_state) {
+               kfree(plane);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       plane->base.state = &plane_state->base;
+
+       return plane;
+}
+
+void intel_plane_free(struct intel_plane *plane)
+{
+       struct intel_plane_state *plane_state =
+               to_intel_plane_state(plane->base.state);
+
+       kfree(plane_state);
+       kfree(plane);
+}
+
 struct intel_plane *
 intel_sprite_plane_create(struct drm_i915_private *dev_priv,
                          enum pipe pipe, int plane)
 {
-       struct intel_plane *intel_plane = NULL;
-       struct intel_plane_state *state = NULL;
+       struct intel_plane *intel_plane;
        const struct drm_plane_funcs *plane_funcs;
        unsigned long possible_crtcs;
        const uint32_t *plane_formats;
@@ -1807,18 +1835,9 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,
        int num_plane_formats;
        int ret;
 
-       intel_plane = kzalloc(sizeof(*intel_plane), GFP_KERNEL);
-       if (!intel_plane) {
-               ret = -ENOMEM;
-               goto fail;
-       }
-
-       state = intel_create_plane_state(&intel_plane->base);
-       if (!state) {
-               ret = -ENOMEM;
-               goto fail;
-       }
-       intel_plane->base.state = &state->base;
+       intel_plane = intel_plane_alloc();
+       if (IS_ERR(intel_plane))
+               return intel_plane;
 
        if (INTEL_GEN(dev_priv) >= 9) {
                intel_plane->has_ccs = skl_plane_has_ccs(dev_priv, pipe,
@@ -1957,8 +1976,7 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,
        return intel_plane;
 
 fail:
-       kfree(state);
-       kfree(intel_plane);
+       intel_plane_free(intel_plane);
 
        return ERR_PTR(ret);
 }