This patch adds generic check for plane state - display area dimensions,
so drivers can always assume that they get valid plane state to set.

Signed-off-by: Marek Szyprowski <m.szyprow...@samsung.com>
Reviewed-by: Gustavo Padovan <gustavo.pado...@collabora.co.uk>
---
 drivers/gpu/drm/exynos/exynos_drm_drv.h   |  3 +++
 drivers/gpu/drm/exynos/exynos_drm_plane.c | 31 +++++++++++++++++++++++++++++++
 drivers/gpu/drm/exynos/exynos_mixer.c     |  3 +++
 3 files changed, 37 insertions(+)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h 
b/drivers/gpu/drm/exynos/exynos_drm_drv.h
index 6f8a296a3115..82bbd7f4b316 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
@@ -89,6 +89,9 @@ struct exynos_drm_plane {
        struct drm_framebuffer *pending_fb;
 };
 
+#define EXYNOS_DRM_PLANE_CAP_DOUBLE    (1 << 0)
+#define EXYNOS_DRM_PLANE_CAP_SCALE     (1 << 1)
+
 /*
  * Exynos DRM plane configuration structure.
  *
diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c 
b/drivers/gpu/drm/exynos/exynos_drm_plane.c
index b620d7a76799..9eaa8627175f 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_plane.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c
@@ -173,6 +173,36 @@ static struct drm_plane_funcs exynos_plane_funcs = {
        .atomic_destroy_state = exynos_drm_plane_destroy_state,
 };
 
+static int
+exynos_drm_plane_check_size(const struct exynos_drm_plane_config *config,
+                           struct exynos_drm_plane_state *state)
+{
+       bool width_ok = false, height_ok = false;
+
+       if (config->capabilities & EXYNOS_DRM_PLANE_CAP_SCALE)
+               return 0;
+
+       if (state->src.w == state->crtc.w)
+               width_ok = true;
+
+       if (state->src.h == state->crtc.h)
+               height_ok = true;
+
+       if ((config->capabilities & EXYNOS_DRM_PLANE_CAP_DOUBLE) &&
+           state->h_ratio == (1 << 15))
+               width_ok = true;
+
+       if ((config->capabilities & EXYNOS_DRM_PLANE_CAP_DOUBLE) &&
+           state->v_ratio == (1 << 15))
+               height_ok = true;
+
+       if (width_ok & height_ok)
+               return 0;
+
+       DRM_DEBUG_KMS("scaling mode is not supported");
+       return -ENOTSUPP;
+}
+
 static int exynos_plane_atomic_check(struct drm_plane *plane,
                                     struct drm_plane_state *state)
 {
@@ -187,6 +217,7 @@ static int exynos_plane_atomic_check(struct drm_plane 
*plane,
        /* translate state into exynos_state */
        exynos_plane_mode_set(exynos_state);
 
+       ret = exynos_drm_plane_check_size(exynos_plane->config, exynos_state);
        return ret;
 }
 
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c 
b/drivers/gpu/drm/exynos/exynos_mixer.c
index a229f86d221a..4190285798ef 100644
--- a/drivers/gpu/drm/exynos/exynos_mixer.c
+++ b/drivers/gpu/drm/exynos/exynos_mixer.c
@@ -117,16 +117,19 @@ static const struct exynos_drm_plane_config 
plane_configs[MIXER_WIN_NR] = {
                .type = DRM_PLANE_TYPE_PRIMARY,
                .pixel_formats = mixer_formats,
                .num_pixel_formats = ARRAY_SIZE(mixer_formats),
+               .capabilities = EXYNOS_DRM_PLANE_CAP_DOUBLE,
        }, {
                .zpos = 1,
                .type = DRM_PLANE_TYPE_CURSOR,
                .pixel_formats = mixer_formats,
                .num_pixel_formats = ARRAY_SIZE(mixer_formats),
+               .capabilities = EXYNOS_DRM_PLANE_CAP_DOUBLE,
        }, {
                .zpos = 2,
                .type = DRM_PLANE_TYPE_OVERLAY,
                .pixel_formats = vp_formats,
                .num_pixel_formats = ARRAY_SIZE(vp_formats),
+               .capabilities = EXYNOS_DRM_PLANE_CAP_SCALE,
        },
 };
 
-- 
1.9.2

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to