diff mbox

[v2,49/60] drm/omap: Create all planes before CRTCs

Message ID 20180526172518.18710-50-laurent.pinchart@ideasonboard.com (mailing list archive)
State New, archived
Headers show

Commit Message

Laurent Pinchart May 26, 2018, 5:25 p.m. UTC
Creating all the planes in a single location instead of creating them
per-CRTC with remaining planes then created in a second step simplifies
the logic.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/omapdrm/omap_drv.c | 45 ++++++++++++++++----------------------
 1 file changed, 19 insertions(+), 26 deletions(-)

Comments

Sebastian Reichel June 11, 2018, 12:07 a.m. UTC | #1
Hi,

On Sat, May 26, 2018 at 08:25:07PM +0300, Laurent Pinchart wrote:
> Creating all the planes in a single location instead of creating them
> per-CRTC with remaining planes then created in a second step simplifies
> the logic.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>

-- Sebastian

>  drivers/gpu/drm/omapdrm/omap_drv.c | 45 ++++++++++++++++----------------------
>  1 file changed, 19 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 0d4c3e2db058..99ed47a17ce3 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -271,14 +271,30 @@ static int omap_modeset_init(struct drm_device *dev)
>  		return -EINVAL;
>  	}
>  
> -	/* All planes can be put to any CRTC */
> +	/* Create all planes first. They can all be put to any CRTC. */
>  	plane_crtc_mask = (1 << num_crtcs) - 1;
>  
> +	for (i = 0; i < num_ovls; i++) {
> +		enum drm_plane_type type = i < priv->num_dssdevs
> +					 ? DRM_PLANE_TYPE_PRIMARY
> +					 : DRM_PLANE_TYPE_OVERLAY;
> +		struct drm_plane *plane;
> +
> +		if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
> +			return -EINVAL;
> +
> +		plane = omap_plane_init(dev, i, type, plane_crtc_mask);
> +		if (IS_ERR(plane))
> +			return PTR_ERR(plane);
> +
> +		priv->planes[priv->num_planes++] = plane;
> +	}
> +
> +	/* Create the CRTCs, encoders and connectors. */
>  	for (i = 0; i < priv->num_dssdevs; i++) {
>  		struct omap_dss_device *dssdev = priv->dssdevs[i];
>  		struct drm_connector *connector;
>  		struct drm_encoder *encoder;
> -		struct drm_plane *plane;
>  		struct drm_crtc *crtc;
>  
>  		encoder = omap_encoder_init(dev, dssdev);
> @@ -290,12 +306,7 @@ static int omap_modeset_init(struct drm_device *dev)
>  		if (!connector)
>  			return -ENOMEM;
>  
> -		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_PRIMARY,
> -					plane_crtc_mask);
> -		if (IS_ERR(plane))
> -			return PTR_ERR(plane);
> -
> -		crtc = omap_crtc_init(dev, plane, dssdev);
> +		crtc = omap_crtc_init(dev, priv->planes[i], dssdev);
>  		if (IS_ERR(crtc))
>  			return PTR_ERR(crtc);
>  
> @@ -303,28 +314,10 @@ static int omap_modeset_init(struct drm_device *dev)
>  		encoder->possible_crtcs = 1 << i;
>  
>  		priv->crtcs[priv->num_crtcs++] = crtc;
> -		priv->planes[priv->num_planes++] = plane;
>  		priv->encoders[priv->num_encoders++] = encoder;
>  		priv->connectors[priv->num_connectors++] = connector;
>  	}
>  
> -	/*
> -	 * Create normal planes for the remaining overlays:
> -	 */
> -	for (; i < num_ovls; i++) {
> -		struct drm_plane *plane;
> -
> -		if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
> -			return -EINVAL;
> -
> -		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_OVERLAY,
> -			plane_crtc_mask);
> -		if (IS_ERR(plane))
> -			return PTR_ERR(plane);
> -
> -		priv->planes[priv->num_planes++] = plane;
> -	}
> -
>  	DBG("registered %d planes, %d crtcs, %d encoders and %d connectors\n",
>  		priv->num_planes, priv->num_crtcs, priv->num_encoders,
>  		priv->num_connectors);
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox

Patch

diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 0d4c3e2db058..99ed47a17ce3 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -271,14 +271,30 @@  static int omap_modeset_init(struct drm_device *dev)
 		return -EINVAL;
 	}
 
-	/* All planes can be put to any CRTC */
+	/* Create all planes first. They can all be put to any CRTC. */
 	plane_crtc_mask = (1 << num_crtcs) - 1;
 
+	for (i = 0; i < num_ovls; i++) {
+		enum drm_plane_type type = i < priv->num_dssdevs
+					 ? DRM_PLANE_TYPE_PRIMARY
+					 : DRM_PLANE_TYPE_OVERLAY;
+		struct drm_plane *plane;
+
+		if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
+			return -EINVAL;
+
+		plane = omap_plane_init(dev, i, type, plane_crtc_mask);
+		if (IS_ERR(plane))
+			return PTR_ERR(plane);
+
+		priv->planes[priv->num_planes++] = plane;
+	}
+
+	/* Create the CRTCs, encoders and connectors. */
 	for (i = 0; i < priv->num_dssdevs; i++) {
 		struct omap_dss_device *dssdev = priv->dssdevs[i];
 		struct drm_connector *connector;
 		struct drm_encoder *encoder;
-		struct drm_plane *plane;
 		struct drm_crtc *crtc;
 
 		encoder = omap_encoder_init(dev, dssdev);
@@ -290,12 +306,7 @@  static int omap_modeset_init(struct drm_device *dev)
 		if (!connector)
 			return -ENOMEM;
 
-		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_PRIMARY,
-					plane_crtc_mask);
-		if (IS_ERR(plane))
-			return PTR_ERR(plane);
-
-		crtc = omap_crtc_init(dev, plane, dssdev);
+		crtc = omap_crtc_init(dev, priv->planes[i], dssdev);
 		if (IS_ERR(crtc))
 			return PTR_ERR(crtc);
 
@@ -303,28 +314,10 @@  static int omap_modeset_init(struct drm_device *dev)
 		encoder->possible_crtcs = 1 << i;
 
 		priv->crtcs[priv->num_crtcs++] = crtc;
-		priv->planes[priv->num_planes++] = plane;
 		priv->encoders[priv->num_encoders++] = encoder;
 		priv->connectors[priv->num_connectors++] = connector;
 	}
 
-	/*
-	 * Create normal planes for the remaining overlays:
-	 */
-	for (; i < num_ovls; i++) {
-		struct drm_plane *plane;
-
-		if (WARN_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)))
-			return -EINVAL;
-
-		plane = omap_plane_init(dev, i, DRM_PLANE_TYPE_OVERLAY,
-			plane_crtc_mask);
-		if (IS_ERR(plane))
-			return PTR_ERR(plane);
-
-		priv->planes[priv->num_planes++] = plane;
-	}
-
 	DBG("registered %d planes, %d crtcs, %d encoders and %d connectors\n",
 		priv->num_planes, priv->num_crtcs, priv->num_encoders,
 		priv->num_connectors);