diff mbox

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

Message ID 1395188579-17191-8-git-send-email-matthew.d.roper@intel.com
State Superseded
Headers show

Commit Message

Matt Roper March 19, 2014, 12:22 a.m. UTC
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@gmail.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 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(-)

Comments

Daniel Vetter March 19, 2014, 11:41 a.m. UTC | #1
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@gmail.com>
> Signed-off-by: Matt Roper <matthew.d.roper@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@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
Inki Dae March 20, 2014, 5:43 a.m. UTC | #2
Hi,

2014-03-19 9:22 GMT+09:00 Matt Roper <matthew.d.roper@intel.com>:
> 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@gmail.com>
> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> ---
>  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);

Your patch would make kms requests to be broken. Exynos drm uses a
wrapper structure, exynos_plane, including original drm_plane, and
also a overlay object specific to exynos should be sent to crtc driver
through exynos_plane.

And re-factoring patch series for exynos drm framework will go to
-next soon. So how about that other maintainers can adopt your primary
plane feature individually later? For this, I guess you would need to
keep backward compatibility. We would really need the testing enough
for such feature and big changes.

Thanks,
Inki Dae

>         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@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
Daniel Vetter March 20, 2014, 3:38 p.m. UTC | #3
On Thu, Mar 20, 2014 at 02:43:11PM +0900, Inki Dae wrote:
> Your patch would make kms requests to be broken. Exynos drm uses a
> wrapper structure, exynos_plane, including original drm_plane, and
> also a overlay object specific to exynos should be sent to crtc driver
> through exynos_plane.
> 
> And re-factoring patch series for exynos drm framework will go to
> -next soon. So how about that other maintainers can adopt your primary
> plane feature individually later? For this, I guess you would need to
> keep backward compatibility. We would really need the testing enough
> for such feature and big changes.

All my review thus far has been aimed at reducing subsystem-wide changes
to drivers. I think we can do the full primary plane conversion without
touching drivers at all. Of course there's a bit of cleanup, but driver
maintainers can merge that at their own pace (and so avoid ugly conflicts
with ongoing work).

I'm still working on how to reduce the impact for the cursor plane
conversion as much as possible, but that's going to be fairly hard
unfortunately.
-Daniel
diff mbox

Patch

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);