[RFCv3 07/14] drm: Specify primary plane at CRTC initialization (v2)

Daniel Vetter daniel at ffwll.ch
Wed Mar 19 04:41:05 PDT 2014


On Tue, Mar 18, 2014 at 05:22:52PM -0700, Matt Roper wrote:
> Add primary plane as a parameter to drm_crtc_init() and update all
> existing DRM drivers to use a helper-provided primary plane.
> 
> v2: Update msm & omap drivers to use existing "private" planes as primary
>     planes instead of helper  [Rob Clark]
> 
> Tested-by: Rob Clark <robdclark at gmail.com>
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>

Again massive pile of changes all over drivers. I think we need to have
again two functions to pull this off and let drivers transition at their
own pace. For this I'd suggest

1) Do a s/drm_crtc_init/drm_legacy_crtc_init/ sed job over the entire
tree, get this patch merged into drm-next this week for 3.15. This will
cause some major havoc with the imx staging changes, so maybe do that
patch on top of linux-next and merge it shortly before -rc1. We need to
coordinate with Dave Airlie about this.

Plan be would be to add a new drm_brave_new_world_crtc_init, and I just
can't come up with a good name. Maybe drm_universal_planes_crtc_init or
something like that. Ugly in any case.

I think good naming suggestings here would be awesome, since it would
allow us to avoid the big flag-day patch above.

2) Add sensible default behaviour to drm_crtc_init/drm_legacy_crtc_init,
which allows drivers to transition to explicit primary planes at easy.

3) Transition drivers, but only where needed.

I didn't really spot anything in the patch itself.

Cheers, Daniel

> ---
>  drivers/gpu/drm/armada/armada_crtc.c       | 4 +++-
>  drivers/gpu/drm/ast/ast_mode.c             | 4 +++-
>  drivers/gpu/drm/bochs/bochs_kms.c          | 4 +++-
>  drivers/gpu/drm/cirrus/cirrus_mode.c       | 4 +++-
>  drivers/gpu/drm/drm_crtc.c                 | 9 ++++++++-
>  drivers/gpu/drm/exynos/exynos_drm_crtc.c   | 4 +++-
>  drivers/gpu/drm/gma500/psb_intel_display.c | 4 +++-
>  drivers/gpu/drm/i915/intel_display.c       | 4 +++-
>  drivers/gpu/drm/mgag200/mgag200_mode.c     | 4 +++-
>  drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c   | 5 ++++-
>  drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c   | 5 ++++-
>  drivers/gpu/drm/nouveau/dispnv04/crtc.c    | 4 +++-
>  drivers/gpu/drm/nouveau/nv50_display.c     | 4 +++-
>  drivers/gpu/drm/omapdrm/omap_crtc.c        | 2 +-
>  drivers/gpu/drm/qxl/qxl_display.c          | 4 +++-
>  drivers/gpu/drm/radeon/radeon_display.c    | 4 +++-
>  drivers/gpu/drm/rcar-du/rcar_du_crtc.c     | 4 +++-
>  drivers/gpu/drm/shmobile/shmob_drm_crtc.c  | 3 ++-
>  drivers/gpu/drm/tegra/dc.c                 | 4 +++-
>  drivers/gpu/drm/tilcdc/tilcdc_crtc.c       | 4 +++-
>  drivers/gpu/drm/udl/udl_modeset.c          | 4 +++-
>  drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c        | 4 +++-
>  drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c       | 4 +++-
>  drivers/staging/imx-drm/imx-drm-core.c     | 4 +++-
>  include/drm/drm_crtc.h                     | 5 +++++
>  25 files changed, 81 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c
> index d8e3982..0a14d24 100644
> --- a/drivers/gpu/drm/armada/armada_crtc.c
> +++ b/drivers/gpu/drm/armada/armada_crtc.c
> @@ -1030,6 +1030,7 @@ int armada_drm_crtc_create(struct drm_device *dev, unsigned num,
>  {
>  	struct armada_private *priv = dev->dev_private;
>  	struct armada_crtc *dcrtc;
> +	struct drm_plane *primary;
>  	void __iomem *base;
>  	int ret;
>  
> @@ -1086,7 +1087,8 @@ int armada_drm_crtc_create(struct drm_device *dev, unsigned num,
>  
>  	priv->dcrtc[dcrtc->num] = dcrtc;
>  
> -	drm_crtc_init(dev, &dcrtc->crtc, &armada_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, &dcrtc->crtc, primary, &armada_crtc_funcs);
>  	drm_crtc_helper_add(&dcrtc->crtc, &armada_crtc_helper_funcs);
>  
>  	drm_object_attach_property(&dcrtc->crtc.base, priv->csc_yuv_prop,
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index cca063b..44f0d32 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -626,13 +626,15 @@ static const struct drm_crtc_funcs ast_crtc_funcs = {
>  static int ast_crtc_init(struct drm_device *dev)
>  {
>  	struct ast_crtc *crtc;
> +	struct drm_plane *primary;
>  	int i;
>  
>  	crtc = kzalloc(sizeof(struct ast_crtc), GFP_KERNEL);
>  	if (!crtc)
>  		return -ENOMEM;
>  
> -	drm_crtc_init(dev, &crtc->base, &ast_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, &crtc->base, primary, &ast_crtc_funcs);
>  	drm_mode_crtc_set_gamma_size(&crtc->base, 256);
>  	drm_crtc_helper_add(&crtc->base, &ast_crtc_helper_funcs);
>  
> diff --git a/drivers/gpu/drm/bochs/bochs_kms.c b/drivers/gpu/drm/bochs/bochs_kms.c
> index 62ec7d4..182f5c9 100644
> --- a/drivers/gpu/drm/bochs/bochs_kms.c
> +++ b/drivers/gpu/drm/bochs/bochs_kms.c
> @@ -129,8 +129,10 @@ static void bochs_crtc_init(struct drm_device *dev)
>  {
>  	struct bochs_device *bochs = dev->dev_private;
>  	struct drm_crtc *crtc = &bochs->crtc;
> +	struct drm_plane *primary;
>  
> -	drm_crtc_init(dev, crtc, &bochs_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, crtc, primary, &bochs_crtc_funcs);
>  	drm_mode_crtc_set_gamma_size(crtc, 256);
>  	drm_crtc_helper_add(crtc, &bochs_helper_funcs);
>  }
> diff --git a/drivers/gpu/drm/cirrus/cirrus_mode.c b/drivers/gpu/drm/cirrus/cirrus_mode.c
> index 530f78f..449246f 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_mode.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_mode.c
> @@ -381,6 +381,7 @@ static void cirrus_crtc_init(struct drm_device *dev)
>  {
>  	struct cirrus_device *cdev = dev->dev_private;
>  	struct cirrus_crtc *cirrus_crtc;
> +	struct drm_plane *primary;
>  	int i;
>  
>  	cirrus_crtc = kzalloc(sizeof(struct cirrus_crtc) +
> @@ -390,7 +391,8 @@ static void cirrus_crtc_init(struct drm_device *dev)
>  	if (cirrus_crtc == NULL)
>  		return;
>  
> -	drm_crtc_init(dev, &cirrus_crtc->base, &cirrus_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, &cirrus_crtc->base, primary, &cirrus_crtc_funcs);
>  
>  	drm_mode_crtc_set_gamma_size(&cirrus_crtc->base, CIRRUS_LUT_SIZE);
>  	cdev->mode_info.crtc = cirrus_crtc;
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 8e869d6..0feb66cc 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -697,6 +697,7 @@ EXPORT_SYMBOL(drm_framebuffer_remove);
>   * drm_crtc_init - Initialise a new CRTC object
>   * @dev: DRM device
>   * @crtc: CRTC object to init
> + * @primary: Primary plane for CRTC
>   * @funcs: callbacks for the new CRTC
>   *
>   * Inits a new object created as base part of a driver crtc object.
> @@ -705,7 +706,8 @@ EXPORT_SYMBOL(drm_framebuffer_remove);
>   * Zero on success, error code on failure.
>   */
>  int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
> -		   const struct drm_crtc_funcs *funcs)
> +		  struct drm_plane *primary,
> +		  const struct drm_crtc_funcs *funcs)
>  {
>  	int ret;
>  
> @@ -726,6 +728,9 @@ int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
>  	list_add_tail(&crtc->head, &dev->mode_config.crtc_list);
>  	dev->mode_config.num_crtc++;
>  
> +	crtc->primary = primary;
> +	primary->possible_crtcs = 1 << drm_crtc_index(crtc);
> +
>   out:
>  	drm_modeset_unlock_all(dev);
>  
> @@ -2439,6 +2444,8 @@ int drm_mode_set_config_internal(struct drm_mode_set *set)
>  
>  	ret = crtc->funcs->set_config(set);
>  	if (ret == 0) {
> +		crtc->primary->crtc = crtc;
> +
>  		/* crtc->fb must be updated by ->set_config, enforces this. */
>  		WARN_ON(fb != crtc->fb);
>  	}
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> index 6f3400f..507abd5 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> @@ -323,6 +323,7 @@ int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr)
>  	struct exynos_drm_crtc *exynos_crtc;
>  	struct exynos_drm_private *private = dev->dev_private;
>  	struct drm_crtc *crtc;
> +	struct drm_plane *primary;
>  
>  	exynos_crtc = kzalloc(sizeof(*exynos_crtc), GFP_KERNEL);
>  	if (!exynos_crtc)
> @@ -342,7 +343,8 @@ int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr)
>  
>  	private->crtc[nr] = crtc;
>  
> -	drm_crtc_init(dev, crtc, &exynos_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, crtc, primary, &exynos_crtc_funcs);
>  	drm_crtc_helper_add(crtc, &exynos_crtc_helper_funcs);
>  
>  	exynos_drm_crtc_attach_mode_property(crtc);
> diff --git a/drivers/gpu/drm/gma500/psb_intel_display.c b/drivers/gpu/drm/gma500/psb_intel_display.c
> index c8841ac..c8f833d 100644
> --- a/drivers/gpu/drm/gma500/psb_intel_display.c
> +++ b/drivers/gpu/drm/gma500/psb_intel_display.c
> @@ -491,6 +491,7 @@ void psb_intel_crtc_init(struct drm_device *dev, int pipe,
>  {
>  	struct drm_psb_private *dev_priv = dev->dev_private;
>  	struct gma_crtc *gma_crtc;
> +	struct drm_plane *primary;
>  	int i;
>  	uint16_t *r_base, *g_base, *b_base;
>  
> @@ -511,7 +512,8 @@ void psb_intel_crtc_init(struct drm_device *dev, int pipe,
>  	}
>  
>  	/* Set the CRTC operations from the chip specific data */
> -	drm_crtc_init(dev, &gma_crtc->base, dev_priv->ops->crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, &gma_crtc->base, primary, dev_priv->ops->crtc_funcs);
>  
>  	/* Set the CRTC clock functions from chip specific data */
>  	gma_crtc->clock_funcs = dev_priv->ops->clock_funcs;
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 048052a..21d12a9 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -10586,13 +10586,15 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
>  {
>  	drm_i915_private_t *dev_priv = dev->dev_private;
>  	struct intel_crtc *intel_crtc;
> +	struct drm_plane *primary;
>  	int i;
>  
>  	intel_crtc = kzalloc(sizeof(*intel_crtc), GFP_KERNEL);
>  	if (intel_crtc == NULL)
>  		return;
>  
> -	drm_crtc_init(dev, &intel_crtc->base, &intel_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, &intel_crtc->base, primary, &intel_crtc_funcs);
>  
>  	drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256);
>  	for (i = 0; i < 256; i++) {
> diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
> index 9683747..1418414 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_mode.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
> @@ -1314,6 +1314,7 @@ static const struct drm_crtc_helper_funcs mga_helper_funcs = {
>  static void mga_crtc_init(struct mga_device *mdev)
>  {
>  	struct mga_crtc *mga_crtc;
> +	struct drm_plane *primary;
>  	int i;
>  
>  	mga_crtc = kzalloc(sizeof(struct mga_crtc) +
> @@ -1323,7 +1324,8 @@ static void mga_crtc_init(struct mga_device *mdev)
>  	if (mga_crtc == NULL)
>  		return;
>  
> -	drm_crtc_init(mdev->dev, &mga_crtc->base, &mga_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(mdev->dev);
> +	drm_crtc_init(mdev->dev, &mga_crtc->base, primary, &mga_crtc_funcs);
>  
>  	drm_mode_crtc_set_gamma_size(&mga_crtc->base, MGAG200_LUT_SIZE);
>  	mdev->mode_info.crtc = mga_crtc;
> diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
> index 84c5b13..b10f681 100644
> --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
> +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
> @@ -740,6 +740,9 @@ void mdp4_crtc_attach(struct drm_crtc *crtc, struct drm_plane *plane)
>  
>  void mdp4_crtc_detach(struct drm_crtc *crtc, struct drm_plane *plane)
>  {
> +	/* don't actually detatch our primary plane: */
> +	if (to_mdp4_crtc(crtc)->plane == plane)
> +		return;
>  	set_attach(crtc, mdp4_plane_pipe(plane), NULL);
>  }
>  
> @@ -791,7 +794,7 @@ struct drm_crtc *mdp4_crtc_init(struct drm_device *dev,
>  
>  	INIT_FENCE_CB(&mdp4_crtc->pageflip_cb, pageflip_cb);
>  
> -	drm_crtc_init(dev, crtc, &mdp4_crtc_funcs);
> +	drm_crtc_init(dev, crtc, plane, &mdp4_crtc_funcs);
>  	drm_crtc_helper_add(crtc, &mdp4_crtc_helper_funcs);
>  
>  	mdp4_plane_install_properties(mdp4_crtc->plane, &crtc->base);
> diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> index f279402..7dc3d71 100644
> --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
> @@ -524,6 +524,9 @@ void mdp5_crtc_attach(struct drm_crtc *crtc, struct drm_plane *plane)
>  
>  void mdp5_crtc_detach(struct drm_crtc *crtc, struct drm_plane *plane)
>  {
> +	/* don't actually detatch our primary plane: */
> +	if (to_mdp5_crtc(crtc)->plane == plane)
> +		return;
>  	set_attach(crtc, mdp5_plane_pipe(plane), NULL);
>  }
>  
> @@ -559,7 +562,7 @@ struct drm_crtc *mdp5_crtc_init(struct drm_device *dev,
>  
>  	INIT_FENCE_CB(&mdp5_crtc->pageflip_cb, pageflip_cb);
>  
> -	drm_crtc_init(dev, crtc, &mdp5_crtc_funcs);
> +	drm_crtc_init(dev, crtc, plane, &mdp5_crtc_funcs);
>  	drm_crtc_helper_add(crtc, &mdp5_crtc_helper_funcs);
>  
>  	mdp5_plane_install_properties(mdp5_crtc->plane, &crtc->base);
> diff --git a/drivers/gpu/drm/nouveau/dispnv04/crtc.c b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
> index 0e3270c..b55be84 100644
> --- a/drivers/gpu/drm/nouveau/dispnv04/crtc.c
> +++ b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
> @@ -1106,6 +1106,7 @@ int
>  nv04_crtc_create(struct drm_device *dev, int crtc_num)
>  {
>  	struct nouveau_crtc *nv_crtc;
> +	struct drm_plane *primary;
>  	int ret, i;
>  
>  	nv_crtc = kzalloc(sizeof(*nv_crtc), GFP_KERNEL);
> @@ -1122,7 +1123,8 @@ nv04_crtc_create(struct drm_device *dev, int crtc_num)
>  	nv_crtc->index = crtc_num;
>  	nv_crtc->last_dpms = NV_DPMS_CLEARED;
>  
> -	drm_crtc_init(dev, &nv_crtc->base, &nv04_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, &nv_crtc->base, primary, &nv04_crtc_funcs);
>  	drm_crtc_helper_add(&nv_crtc->base, &nv04_crtc_helper_funcs);
>  	drm_mode_crtc_set_gamma_size(&nv_crtc->base, 256);
>  
> diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
> index 2dccafc..5706842 100644
> --- a/drivers/gpu/drm/nouveau/nv50_display.c
> +++ b/drivers/gpu/drm/nouveau/nv50_display.c
> @@ -1348,6 +1348,7 @@ nv50_crtc_create(struct drm_device *dev, struct nouveau_object *core, int index)
>  	struct nv50_disp *disp = nv50_disp(dev);
>  	struct nv50_head *head;
>  	struct drm_crtc *crtc;
> +	struct drm_plane *primary;
>  	int ret, i;
>  
>  	head = kzalloc(sizeof(*head), GFP_KERNEL);
> @@ -1369,7 +1370,8 @@ nv50_crtc_create(struct drm_device *dev, struct nouveau_object *core, int index)
>  	}
>  
>  	crtc = &head->base.base;
> -	drm_crtc_init(dev, crtc, &nv50_crtc_func);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, crtc, primary, &nv50_crtc_func);
>  	drm_crtc_helper_add(crtc, &nv50_crtc_hfunc);
>  	drm_mode_crtc_set_gamma_size(crtc, 256);
>  
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 4313bb0..fdf9dc0 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -677,7 +677,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>  	info->trans_key_type = OMAP_DSS_COLOR_KEY_GFX_DST;
>  	info->trans_enabled = false;
>  
> -	drm_crtc_init(dev, crtc, &omap_crtc_funcs);
> +	drm_crtc_init(dev, crtc, plane, &omap_crtc_funcs);
>  	drm_crtc_helper_add(crtc, &omap_crtc_helper_funcs);
>  
>  	omap_plane_install_properties(omap_crtc->plane, &crtc->base);
> diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
> index 798bde2..24b6112 100644
> --- a/drivers/gpu/drm/qxl/qxl_display.c
> +++ b/drivers/gpu/drm/qxl/qxl_display.c
> @@ -636,12 +636,14 @@ static const struct drm_crtc_helper_funcs qxl_crtc_helper_funcs = {
>  static int qdev_crtc_init(struct drm_device *dev, int crtc_id)
>  {
>  	struct qxl_crtc *qxl_crtc;
> +	struct drm_plane *primary;
>  
>  	qxl_crtc = kzalloc(sizeof(struct qxl_crtc), GFP_KERNEL);
>  	if (!qxl_crtc)
>  		return -ENOMEM;
>  
> -	drm_crtc_init(dev, &qxl_crtc->base, &qxl_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, &qxl_crtc->base, primary, &qxl_crtc_funcs);
>  	qxl_crtc->index = crtc_id;
>  	drm_mode_crtc_set_gamma_size(&qxl_crtc->base, 256);
>  	drm_crtc_helper_add(&qxl_crtc->base, &qxl_crtc_helper_funcs);
> diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
> index fbd8b93..a29d217 100644
> --- a/drivers/gpu/drm/radeon/radeon_display.c
> +++ b/drivers/gpu/drm/radeon/radeon_display.c
> @@ -552,13 +552,15 @@ static void radeon_crtc_init(struct drm_device *dev, int index)
>  {
>  	struct radeon_device *rdev = dev->dev_private;
>  	struct radeon_crtc *radeon_crtc;
> +	struct drm_plane *primary;
>  	int i;
>  
>  	radeon_crtc = kzalloc(sizeof(struct radeon_crtc) + (RADEONFB_CONN_LIMIT * sizeof(struct drm_connector *)), GFP_KERNEL);
>  	if (radeon_crtc == NULL)
>  		return;
>  
> -	drm_crtc_init(dev, &radeon_crtc->base, &radeon_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, &radeon_crtc->base, primary, &radeon_crtc_funcs);
>  
>  	drm_mode_crtc_set_gamma_size(&radeon_crtc->base, 256);
>  	radeon_crtc->crtc_id = index;
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> index fbf4be3..151ffaa 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
> @@ -540,6 +540,7 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
>  	struct platform_device *pdev = to_platform_device(rcdu->dev);
>  	struct rcar_du_crtc *rcrtc = &rcdu->crtcs[index];
>  	struct drm_crtc *crtc = &rcrtc->crtc;
> +	struct drm_plane *primary;
>  	unsigned int irqflags;
>  	char clk_name[5];
>  	char *name;
> @@ -568,7 +569,8 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int index)
>  
>  	rcrtc->plane->crtc = crtc;
>  
> -	ret = drm_crtc_init(rcdu->ddev, crtc, &crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	ret = drm_crtc_init(rcdu->ddev, crtc, primary, &crtc_funcs);
>  	if (ret < 0)
>  		return ret;
>  
> diff --git a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
> index 0428076..e806553 100644
> --- a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
> +++ b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
> @@ -512,11 +512,12 @@ static const struct drm_crtc_funcs crtc_funcs = {
>  int shmob_drm_crtc_create(struct shmob_drm_device *sdev)
>  {
>  	struct drm_crtc *crtc = &sdev->crtc.crtc;
> +	struct drm_plane *primary;
>  	int ret;
>  
>  	sdev->crtc.dpms = DRM_MODE_DPMS_OFF;
>  
> -	ret = drm_crtc_init(sdev->ddev, crtc, &crtc_funcs);
> +	ret = drm_crtc_init(sdev->ddev, crtc, primary, &crtc_funcs);
>  	if (ret < 0)
>  		return ret;
>  
> diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c
> index 76e5b22..5e2ee9d 100644
> --- a/drivers/gpu/drm/tegra/dc.c
> +++ b/drivers/gpu/drm/tegra/dc.c
> @@ -1099,9 +1099,11 @@ static int tegra_dc_init(struct host1x_client *client)
>  {
>  	struct tegra_drm *tegra = dev_get_drvdata(client->parent);
>  	struct tegra_dc *dc = host1x_client_to_dc(client);
> +	struct drm_plane *primary;
>  	int err;
>  
> -	drm_crtc_init(tegra->drm, &dc->base, &tegra_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(tegra->drm, &dc->base, primary, &tegra_crtc_funcs);
>  	drm_mode_crtc_set_gamma_size(&dc->base, 256);
>  	drm_crtc_helper_add(&dc->base, &tegra_crtc_helper_funcs);
>  
> diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
> index d36efc1..310314c 100644
> --- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
> +++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
> @@ -651,6 +651,7 @@ struct drm_crtc *tilcdc_crtc_create(struct drm_device *dev)
>  {
>  	struct tilcdc_crtc *tilcdc_crtc;
>  	struct drm_crtc *crtc;
> +	struct drm_plane *primary;
>  	int ret;
>  
>  	tilcdc_crtc = kzalloc(sizeof(*tilcdc_crtc), GFP_KERNEL);
> @@ -671,7 +672,8 @@ struct drm_crtc *tilcdc_crtc_create(struct drm_device *dev)
>  		goto fail;
>  	}
>  
> -	ret = drm_crtc_init(dev, crtc, &tilcdc_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	ret = drm_crtc_init(dev, crtc, primary, &tilcdc_crtc_funcs);
>  	if (ret < 0)
>  		goto fail;
>  
> diff --git a/drivers/gpu/drm/udl/udl_modeset.c b/drivers/gpu/drm/udl/udl_modeset.c
> index 2ae1eb7..1255944 100644
> --- a/drivers/gpu/drm/udl/udl_modeset.c
> +++ b/drivers/gpu/drm/udl/udl_modeset.c
> @@ -389,12 +389,14 @@ static const struct drm_crtc_funcs udl_crtc_funcs = {
>  static int udl_crtc_init(struct drm_device *dev)
>  {
>  	struct drm_crtc *crtc;
> +	struct drm_plane *primary;
>  
>  	crtc = kzalloc(sizeof(struct drm_crtc) + sizeof(struct drm_connector *), GFP_KERNEL);
>  	if (crtc == NULL)
>  		return -ENOMEM;
>  
> -	drm_crtc_init(dev, crtc, &udl_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, crtc, primary, &udl_crtc_funcs);
>  	drm_crtc_helper_add(crtc, &udl_helper_funcs);
>  
>  	return 0;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
> index a055a26..001ec81 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
> @@ -343,6 +343,7 @@ static int vmw_ldu_init(struct vmw_private *dev_priv, unsigned unit)
>  	struct drm_connector *connector;
>  	struct drm_encoder *encoder;
>  	struct drm_crtc *crtc;
> +	struct drm_plane *primary;
>  
>  	ldu = kzalloc(sizeof(*ldu), GFP_KERNEL);
>  	if (!ldu)
> @@ -373,7 +374,8 @@ static int vmw_ldu_init(struct vmw_private *dev_priv, unsigned unit)
>  
>  	(void) drm_sysfs_connector_add(connector);
>  
> -	drm_crtc_init(dev, crtc, &vmw_legacy_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, crtc, primary, &vmw_legacy_crtc_funcs);
>  
>  	drm_mode_crtc_set_gamma_size(crtc, 256);
>  
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
> index 22406c8..585da43 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
> @@ -439,6 +439,7 @@ static int vmw_sou_init(struct vmw_private *dev_priv, unsigned unit)
>  	struct drm_connector *connector;
>  	struct drm_encoder *encoder;
>  	struct drm_crtc *crtc;
> +	struct drm_plane *primary;
>  
>  	sou = kzalloc(sizeof(*sou), GFP_KERNEL);
>  	if (!sou)
> @@ -469,7 +470,8 @@ static int vmw_sou_init(struct vmw_private *dev_priv, unsigned unit)
>  
>  	(void) drm_sysfs_connector_add(connector);
>  
> -	drm_crtc_init(dev, crtc, &vmw_screen_object_crtc_funcs);
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(dev, crtc, primary, &vmw_screen_object_crtc_funcs);
>  
>  	drm_mode_crtc_set_gamma_size(crtc, 256);
>  
> diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
> index 236ed66..8c7b1d3 100644
> --- a/drivers/staging/imx-drm/imx-drm-core.c
> +++ b/drivers/staging/imx-drm/imx-drm-core.c
> @@ -475,6 +475,7 @@ int imx_drm_add_crtc(struct drm_crtc *crtc,
>  {
>  	struct imx_drm_device *imxdrm = __imx_drm_device();
>  	struct imx_drm_crtc *imx_drm_crtc;
> +	struct drm_plane *primary;
>  	int ret;
>  
>  	mutex_lock(&imxdrm->mutex);
> @@ -520,7 +521,8 @@ int imx_drm_add_crtc(struct drm_crtc *crtc,
>  	drm_crtc_helper_add(crtc,
>  			imx_drm_crtc->imx_drm_helper_funcs.crtc_helper_funcs);
>  
> -	drm_crtc_init(imxdrm->drm, crtc,
> +	primary = drm_primary_helper_create_plane(dev);
> +	drm_crtc_init(imxdrm->drm, crtc, primary,
>  			imx_drm_crtc->imx_drm_helper_funcs.crtc_funcs);
>  
>  	drm_mode_group_reinit(imxdrm->drm);
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 74f4943..4dc84f8 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -270,6 +270,7 @@ struct drm_crtc_funcs {
>   * @dev: parent DRM device
>   * @head: list management
>   * @base: base KMS object for ID tracking etc.
> + * @primary: primary plane for this CRTC
>   * @enabled: is this CRTC enabled?
>   * @mode: current mode timings
>   * @hwmode: mode timings as programmed to hw regs
> @@ -305,6 +306,9 @@ struct drm_crtc {
>  
>  	struct drm_mode_object base;
>  
> +	/* primary plane for CRTC */
> +	struct drm_plane *primary;
> +
>  	/* framebuffer the connector is currently bound to */
>  	struct drm_framebuffer *fb;
>  
> @@ -907,6 +911,7 @@ extern void drm_warn_on_modeset_not_all_locked(struct drm_device *dev);
>  
>  extern int drm_crtc_init(struct drm_device *dev,
>  			 struct drm_crtc *crtc,
> +			 struct drm_plane *primary,
>  			 const struct drm_crtc_funcs *funcs);
>  extern void drm_crtc_cleanup(struct drm_crtc *crtc);
>  extern unsigned int drm_crtc_index(struct drm_crtc *crtc);
> -- 
> 1.8.5.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the dri-devel mailing list