aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorRob Clark <rob@ti.com>2011-12-13 21:19:36 -0500
committerDave Airlie <airlied@redhat.com>2012-01-05 05:00:16 -0500
commit0a7eb243db7864640134f8c57e6856f8eb3ed7c6 (patch)
tree93580b87b27d341801f9724d0daba75e933d9412 /drivers/gpu
parenta9971157b6c550644fe19551c21f4b05f7e9475a (diff)
drm: add support for private planes
In cases where the scanout hw is sufficiently similar between "overlay" and traditional crtc layers, it might be convenient to allow the driver to create internal drm_plane helper objects used by the drm_crtc implementation, rather than duplicate code between the plane and crtc. A private plane is not exposed to userspace. Signed-off-by: Rob Clark <rob@ti.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/drm_crtc.c22
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_plane.c2
-rw-r--r--drivers/gpu/drm/i915/intel_sprite.c2
3 files changed, 19 insertions, 7 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 7710bcb4bd8d..5e818a808ace 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -557,7 +557,8 @@ EXPORT_SYMBOL(drm_encoder_cleanup);
557int drm_plane_init(struct drm_device *dev, struct drm_plane *plane, 557int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,
558 unsigned long possible_crtcs, 558 unsigned long possible_crtcs,
559 const struct drm_plane_funcs *funcs, 559 const struct drm_plane_funcs *funcs,
560 const uint32_t *formats, uint32_t format_count) 560 const uint32_t *formats, uint32_t format_count,
561 bool priv)
561{ 562{
562 mutex_lock(&dev->mode_config.mutex); 563 mutex_lock(&dev->mode_config.mutex);
563 564
@@ -577,8 +578,16 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,
577 plane->format_count = format_count; 578 plane->format_count = format_count;
578 plane->possible_crtcs = possible_crtcs; 579 plane->possible_crtcs = possible_crtcs;
579 580
580 list_add_tail(&plane->head, &dev->mode_config.plane_list); 581 /* private planes are not exposed to userspace, but depending on
581 dev->mode_config.num_plane++; 582 * display hardware, might be convenient to allow sharing programming
583 * for the scanout engine with the crtc implementation.
584 */
585 if (!priv) {
586 list_add_tail(&plane->head, &dev->mode_config.plane_list);
587 dev->mode_config.num_plane++;
588 } else {
589 INIT_LIST_HEAD(&plane->head);
590 }
582 591
583 mutex_unlock(&dev->mode_config.mutex); 592 mutex_unlock(&dev->mode_config.mutex);
584 593
@@ -593,8 +602,11 @@ void drm_plane_cleanup(struct drm_plane *plane)
593 mutex_lock(&dev->mode_config.mutex); 602 mutex_lock(&dev->mode_config.mutex);
594 kfree(plane->format_types); 603 kfree(plane->format_types);
595 drm_mode_object_put(dev, &plane->base); 604 drm_mode_object_put(dev, &plane->base);
596 list_del(&plane->head); 605 /* if not added to a list, it must be a private plane */
597 dev->mode_config.num_plane--; 606 if (!list_empty(&plane->head)) {
607 list_del(&plane->head);
608 dev->mode_config.num_plane--;
609 }
598 mutex_unlock(&dev->mode_config.mutex); 610 mutex_unlock(&dev->mode_config.mutex);
599} 611}
600EXPORT_SYMBOL(drm_plane_cleanup); 612EXPORT_SYMBOL(drm_plane_cleanup);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c b/drivers/gpu/drm/exynos/exynos_drm_plane.c
index c785e34ccff9..bdcf770aa22e 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_plane.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c
@@ -117,7 +117,7 @@ int exynos_plane_init(struct drm_device *dev, unsigned int nr)
117 117
118 /* TODO: format */ 118 /* TODO: format */
119 return drm_plane_init(dev, &exynos_plane->base, possible_crtcs, 119 return drm_plane_init(dev, &exynos_plane->base, possible_crtcs,
120 &exynos_plane_funcs, NULL, 0); 120 &exynos_plane_funcs, NULL, 0, false);
121} 121}
122 122
123int exynos_plane_set_zpos_ioctl(struct drm_device *dev, void *data, 123int exynos_plane_set_zpos_ioctl(struct drm_device *dev, void *data,
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index b26e7c46a752..d13989fda501 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -659,7 +659,7 @@ intel_plane_init(struct drm_device *dev, enum pipe pipe)
659 possible_crtcs = (1 << pipe); 659 possible_crtcs = (1 << pipe);
660 ret = drm_plane_init(dev, &intel_plane->base, possible_crtcs, 660 ret = drm_plane_init(dev, &intel_plane->base, possible_crtcs,
661 &intel_plane_funcs, snb_plane_formats, 661 &intel_plane_funcs, snb_plane_formats,
662 ARRAY_SIZE(snb_plane_formats)); 662 ARRAY_SIZE(snb_plane_formats), false);
663 if (ret) 663 if (ret)
664 kfree(intel_plane); 664 kfree(intel_plane);
665 665