diff options
Diffstat (limited to 'drivers/gpu/drm/drm_crtc.c')
| -rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 22 | 
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 7710bcb4bd8..5e818a808ac 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -557,7 +557,8 @@ EXPORT_SYMBOL(drm_encoder_cleanup);  int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,  		   unsigned long possible_crtcs,  		   const struct drm_plane_funcs *funcs, -		   const uint32_t *formats, uint32_t format_count) +		   const uint32_t *formats, uint32_t format_count, +		   bool priv)  {  	mutex_lock(&dev->mode_config.mutex); @@ -577,8 +578,16 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,  	plane->format_count = format_count;  	plane->possible_crtcs = possible_crtcs; -	list_add_tail(&plane->head, &dev->mode_config.plane_list); -	dev->mode_config.num_plane++; +	/* private planes are not exposed to userspace, but depending on +	 * display hardware, might be convenient to allow sharing programming +	 * for the scanout engine with the crtc implementation. +	 */ +	if (!priv) { +		list_add_tail(&plane->head, &dev->mode_config.plane_list); +		dev->mode_config.num_plane++; +	} else { +		INIT_LIST_HEAD(&plane->head); +	}  	mutex_unlock(&dev->mode_config.mutex); @@ -593,8 +602,11 @@ void drm_plane_cleanup(struct drm_plane *plane)  	mutex_lock(&dev->mode_config.mutex);  	kfree(plane->format_types);  	drm_mode_object_put(dev, &plane->base); -	list_del(&plane->head); -	dev->mode_config.num_plane--; +	/* if not added to a list, it must be a private plane */ +	if (!list_empty(&plane->head)) { +		list_del(&plane->head); +		dev->mode_config.num_plane--; +	}  	mutex_unlock(&dev->mode_config.mutex);  }  EXPORT_SYMBOL(drm_plane_cleanup);  |