From: Sean Paul <seanp...@chromium.org>

This patch adds the ability for components to expose supported rotations
which will be exposed to userspace via a plane rotation property.

No functional changes in this patch.

Signed-off-by: Sean Paul <seanp...@chromium.org>
---
 drivers/gpu/drm/mediatek/mtk_drm_crtc.c     |  4 +++-
 drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 10 ++++++++++
 drivers/gpu/drm/mediatek/mtk_drm_plane.c    | 12 +++++++++++-
 drivers/gpu/drm/mediatek/mtk_drm_plane.h    |  4 +++-
 4 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c 
b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
index 04e7e4bdbdb5..f80a8ba75977 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
@@ -600,13 +600,15 @@ static int mtk_drm_crtc_init_comp_planes(struct 
drm_device *drm_dev,
                                         int comp_idx, int pipe)
 {
        int num_planes = mtk_drm_crtc_num_comp_planes(mtk_crtc, comp_idx);
+       struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[comp_idx];
        int i, ret;
 
        for (i = 0; i < num_planes; i++) {
                ret = mtk_plane_init(drm_dev,
                                &mtk_crtc->planes[mtk_crtc->layer_nr],
                                BIT(pipe),
-                               mtk_drm_crtc_plane_type(mtk_crtc->layer_nr));
+                               mtk_drm_crtc_plane_type(mtk_crtc->layer_nr),
+                               mtk_ddp_comp_supported_rotations(comp));
                if (ret)
                        return ret;
 
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h 
b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
index 3de371e28bdf..2f1e9e75b8da 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
+++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
@@ -77,6 +77,7 @@ struct mtk_ddp_comp_funcs {
        void (*stop)(struct mtk_ddp_comp *comp);
        void (*enable_vblank)(struct mtk_ddp_comp *comp, struct drm_crtc *crtc);
        void (*disable_vblank)(struct mtk_ddp_comp *comp);
+       unsigned int (*supported_rotations)(struct mtk_ddp_comp *comp);
        unsigned int (*layer_nr)(struct mtk_ddp_comp *comp);
        void (*layer_on)(struct mtk_ddp_comp *comp, unsigned int idx);
        void (*layer_off)(struct mtk_ddp_comp *comp, unsigned int idx);
@@ -133,6 +134,15 @@ static inline void mtk_ddp_comp_disable_vblank(struct 
mtk_ddp_comp *comp)
                comp->funcs->disable_vblank(comp);
 }
 
+static inline
+unsigned int mtk_ddp_comp_supported_rotations(struct mtk_ddp_comp *comp)
+{
+       if (comp->funcs && comp->funcs->supported_rotations)
+               return comp->funcs->supported_rotations(comp);
+
+       return 0;
+}
+
 static inline unsigned int mtk_ddp_comp_layer_nr(struct mtk_ddp_comp *comp)
 {
        if (comp->funcs && comp->funcs->layer_nr)
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c 
b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
index 58b02fffe321..cd7c97eb7ee6 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
@@ -138,6 +138,7 @@ static void mtk_plane_atomic_update(struct drm_plane *plane,
        state->pending.y = plane->state->dst.y1;
        state->pending.width = drm_rect_width(&plane->state->dst);
        state->pending.height = drm_rect_height(&plane->state->dst);
+       state->pending.rotation = plane->state->rotation;
        wmb(); /* Make sure the above parameters are set before update */
        state->pending.dirty = true;
 }
@@ -160,7 +161,8 @@ static const struct drm_plane_helper_funcs 
mtk_plane_helper_funcs = {
 };
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
-                  unsigned long possible_crtcs, enum drm_plane_type type)
+                  unsigned long possible_crtcs, enum drm_plane_type type,
+                  unsigned int supported_rotations)
 {
        int err;
 
@@ -172,6 +174,14 @@ int mtk_plane_init(struct drm_device *dev, struct 
drm_plane *plane,
                return err;
        }
 
+       if (supported_rotations & ~DRM_MODE_ROTATE_0) {
+               err = drm_plane_create_rotation_property(plane,
+                                                        DRM_MODE_ROTATE_0,
+                                                        supported_rotations);
+               if (err)
+                       DRM_INFO("Create rotation property failed\n");
+       }
+
        drm_plane_helper_add(plane, &mtk_plane_helper_funcs);
 
        return 0;
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.h 
b/drivers/gpu/drm/mediatek/mtk_drm_plane.h
index 6f842df722c7..760885e35b27 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_plane.h
+++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.h
@@ -20,6 +20,7 @@ struct mtk_plane_pending_state {
        unsigned int                    y;
        unsigned int                    width;
        unsigned int                    height;
+       unsigned int                    rotation;
        bool                            dirty;
 };
 
@@ -35,6 +36,7 @@ to_mtk_plane_state(struct drm_plane_state *state)
 }
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
-                  unsigned long possible_crtcs, enum drm_plane_type type);
+                  unsigned long possible_crtcs, enum drm_plane_type type,
+                  unsigned int supported_rotations);
 
 #endif
-- 
Sean Paul, Software Engineer, Google / Chromium OS

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to