drm/exynos: add cursor plane support
authorGustavo Padovan <gustavo.padovan@collabora.co.uk>
Fri, 4 Sep 2015 22:05:57 +0000 (19:05 -0300)
committerInki Dae <daeinki@gmail.com>
Mon, 26 Oct 2015 06:10:27 +0000 (15:10 +0900)
Set one of the planes for each crtc driver as a cursor plane enabled
window managers to fully work on exynos.

Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos5433_drm_decon.c
drivers/gpu/drm/exynos/exynos7_drm_decon.c
drivers/gpu/drm/exynos/exynos_drm_fimd.c
drivers/gpu/drm/exynos/exynos_drm_plane.c
drivers/gpu/drm/exynos/exynos_drm_plane.h
drivers/gpu/drm/exynos/exynos_drm_vidi.c
drivers/gpu/drm/exynos/exynos_mixer.c

index f467ce05f6cd7d5a6e91844b4e88caa4005500ff..1ea26dbb11199e6d922bd26c527fab0aca3c1d75 100644 (file)
@@ -24,6 +24,7 @@
 #include "exynos_drm_iommu.h"
 
 #define WINDOWS_NR     3
+#define CURSOR_WIN     2
 #define MIN_FB_WIDTH_FOR_16WORD_BURST  128
 
 struct decon_context {
@@ -500,8 +501,7 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
        ctx->pipe = priv->pipe++;
 
        for (zpos = 0; zpos < WINDOWS_NR; zpos++) {
-               type = (zpos == DEFAULT_WIN) ? DRM_PLANE_TYPE_PRIMARY :
-                                                       DRM_PLANE_TYPE_OVERLAY;
+               type = exynos_plane_get_type(zpos, CURSOR_WIN);
                ret = exynos_plane_init(drm_dev, &ctx->planes[zpos],
                                1 << ctx->pipe, type, decon_formats,
                                ARRAY_SIZE(decon_formats), zpos);
index bd0f96bbd3f6674ceb23c1d43488ba6eeb012c85..ead2b16e237d5558a47ac820fbb4d5dd66f2f86c 100644 (file)
@@ -40,6 +40,7 @@
 #define MIN_FB_WIDTH_FOR_16WORD_BURST 128
 
 #define WINDOWS_NR     2
+#define CURSOR_WIN     1
 
 struct decon_context {
        struct device                   *dev;
@@ -689,8 +690,7 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
        }
 
        for (zpos = 0; zpos < WINDOWS_NR; zpos++) {
-               type = (zpos == DEFAULT_WIN) ? DRM_PLANE_TYPE_PRIMARY :
-                                               DRM_PLANE_TYPE_OVERLAY;
+               type = exynos_plane_get_type(zpos, CURSOR_WIN);
                ret = exynos_plane_init(drm_dev, &ctx->planes[zpos],
                                        1 << ctx->pipe, type, decon_formats,
                                        ARRAY_SIZE(decon_formats), zpos);
index 7505a71c695f0a0cf0294eb1914fa4d2c5017549..bd75c1531cac8d527d018b86b5857c187725a358 100644 (file)
@@ -87,6 +87,7 @@
 
 /* FIMD has totally five hardware windows. */
 #define WINDOWS_NR     5
+#define CURSOR_WIN     4
 
 struct fimd_driver_data {
        unsigned int timing_base;
@@ -948,8 +949,7 @@ static int fimd_bind(struct device *dev, struct device *master, void *data)
        ctx->pipe = priv->pipe++;
 
        for (zpos = 0; zpos < WINDOWS_NR; zpos++) {
-               type = (zpos == DEFAULT_WIN) ? DRM_PLANE_TYPE_PRIMARY :
-                                               DRM_PLANE_TYPE_OVERLAY;
+               type = exynos_plane_get_type(zpos, CURSOR_WIN);
                ret = exynos_plane_init(drm_dev, &ctx->planes[zpos],
                                        1 << ctx->pipe, type, fimd_formats,
                                        ARRAY_SIZE(fimd_formats), zpos);
index 7148224414672c37ef96a562b5f0d7f91931411a..80b2151bb7a868c3de94ffc1d9a65990f532772e 100644 (file)
@@ -208,6 +208,17 @@ static void exynos_plane_attach_zpos_property(struct drm_plane *plane,
        drm_object_attach_property(&plane->base, prop, zpos);
 }
 
+enum drm_plane_type exynos_plane_get_type(unsigned int zpos,
+                                         unsigned int cursor_win)
+{
+               if (zpos == DEFAULT_WIN)
+                       return DRM_PLANE_TYPE_PRIMARY;
+               else if (zpos == cursor_win)
+                       return DRM_PLANE_TYPE_CURSOR;
+               else
+                       return DRM_PLANE_TYPE_OVERLAY;
+}
+
 int exynos_plane_init(struct drm_device *dev,
                      struct exynos_drm_plane *exynos_plane,
                      unsigned long possible_crtcs, enum drm_plane_type type,
index 476c9340b591cb107f6fc66f4dde0e0da217c49f..abb641e64c23c1ac5f11769586fa90c1e0f7b4f7 100644 (file)
@@ -9,6 +9,8 @@
  *
  */
 
+enum drm_plane_type exynos_plane_get_type(unsigned int zpos,
+                                         unsigned int cursor_win);
 int exynos_plane_init(struct drm_device *dev,
                      struct exynos_drm_plane *exynos_plane,
                      unsigned long possible_crtcs, enum drm_plane_type type,
index fc57687794459961db1d206dc6efb72e7b25f4e0..669362c53f4981ae8f312dc56ac635d5d0add7cd 100644 (file)
@@ -29,6 +29,7 @@
 
 /* vidi has totally three virtual windows. */
 #define WINDOWS_NR             3
+#define CURSOR_WIN             2
 
 #define ctx_from_connector(c)  container_of(c, struct vidi_context, \
                                        connector)
@@ -445,8 +446,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
        vidi_ctx_initialize(ctx, drm_dev);
 
        for (zpos = 0; zpos < WINDOWS_NR; zpos++) {
-               type = (zpos == DEFAULT_WIN) ? DRM_PLANE_TYPE_PRIMARY :
-                                               DRM_PLANE_TYPE_OVERLAY;
+               type = exynos_plane_get_type(zpos, CURSOR_WIN);
                ret = exynos_plane_init(drm_dev, &ctx->planes[zpos],
                                        1 << ctx->pipe, type, formats,
                                        ARRAY_SIZE(formats), zpos);
index f83e27da7e09f8e134414786b85b6cce3f138e0d..3f9f07279a36a946d5acd3a92783ebd043dcacee 100644 (file)
@@ -43,6 +43,7 @@
 
 #define MIXER_WIN_NR           3
 #define VP_DEFAULT_WIN         2
+#define CURSOR_WIN             1
 
 /* The pixelformats that are natively supported by the mixer. */
 #define MXR_FORMAT_RGB565      4
@@ -1196,8 +1197,6 @@ static int mixer_bind(struct device *dev, struct device *manager, void *data)
                const uint32_t *formats;
                unsigned int fcount;
 
-               type = (zpos == DEFAULT_WIN) ? DRM_PLANE_TYPE_PRIMARY :
-                                               DRM_PLANE_TYPE_OVERLAY;
                if (zpos < VP_DEFAULT_WIN) {
                        formats = mixer_formats;
                        fcount = ARRAY_SIZE(mixer_formats);
@@ -1206,6 +1205,7 @@ static int mixer_bind(struct device *dev, struct device *manager, void *data)
                        fcount = ARRAY_SIZE(vp_formats);
                }
 
+               type = exynos_plane_get_type(zpos, CURSOR_WIN);
                ret = exynos_plane_init(drm_dev, &ctx->planes[zpos],
                                        1 << ctx->pipe, type, formats, fcount,
                                        zpos);