[PATCH 10/15] drm/msm/mdp5: Advertize 180 degree rotation

ville.syrjala at linux.intel.com ville.syrjala at linux.intel.com
Fri Jul 22 13:43:11 UTC 2016


From: Ville Syrjälä <ville.syrjala at linux.intel.com>

Since the hardware can apparently do both X and Y reflection, we
can advertize also 180 degree rotation as thats just X+Y reflection.

Cc: Rob Clark <robdclark at gmail.com>
Cc: Jilai Wang <jilaiw at codeaurora.org>
Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
 drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
index 2aefb0db1874..586963016c89 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
@@ -78,6 +78,7 @@ static void mdp5_plane_install_rotation_property(struct drm_device *dev,
 	drm_plane_create_rotation_property(plane,
 					   BIT(DRM_ROTATE_0),
 					   BIT(DRM_ROTATE_0) |
+					   BIT(DRM_ROTATE_180) |
 					   BIT(DRM_REFLECT_X) |
 					   BIT(DRM_REFLECT_Y));
 }
@@ -285,6 +286,8 @@ static int mdp5_plane_atomic_check(struct drm_plane *plane,
 			plane_enabled(old_state), plane_enabled(state));
 
 	if (plane_enabled(state)) {
+		unsigned int rotation;
+
 		format = to_mdp_format(msm_framebuffer_format(state->fb));
 		if (MDP_FORMAT_IS_YUV(format) &&
 			!pipe_supports_yuv(mdp5_plane->caps)) {
@@ -305,8 +308,12 @@ static int mdp5_plane_atomic_check(struct drm_plane *plane,
 			return -EINVAL;
 		}
 
-		hflip = !!(state->rotation & BIT(DRM_REFLECT_X));
-		vflip = !!(state->rotation & BIT(DRM_REFLECT_Y));
+		rotation = drm_rotation_simplify(state->rotation,
+						 BIT(DRM_ROTATE_0) |
+						 BIT(DRM_REFLECT_X) |
+						 BIT(DRM_REFLECT_Y));
+		hflip = !!(rotation & BIT(DRM_REFLECT_X));
+		vflip = !!(rotation & BIT(DRM_REFLECT_Y));
 		if ((vflip && !(mdp5_plane->caps & MDP_PIPE_CAP_VFLIP)) ||
 			(hflip && !(mdp5_plane->caps & MDP_PIPE_CAP_HFLIP))) {
 			dev_err(plane->dev->dev,
@@ -677,6 +684,7 @@ static int mdp5_plane_mode_set(struct drm_plane *plane,
 	int pe_top[COMP_MAX], pe_bottom[COMP_MAX];
 	uint32_t hdecm = 0, vdecm = 0;
 	uint32_t pix_format;
+	unsigned int rotation;
 	bool vflip, hflip;
 	unsigned long flags;
 	int ret;
@@ -739,8 +747,12 @@ static int mdp5_plane_mode_set(struct drm_plane *plane,
 	config |= get_scale_config(format, src_h, crtc_h, false);
 	DBG("scale config = %x", config);
 
-	hflip = !!(pstate->rotation & BIT(DRM_REFLECT_X));
-	vflip = !!(pstate->rotation & BIT(DRM_REFLECT_Y));
+	rotation = drm_rotation_simplify(pstate->rotation,
+					 BIT(DRM_ROTATE_0) |
+					 BIT(DRM_REFLECT_X) |
+					 BIT(DRM_REFLECT_Y));
+	hflip = !!(rotation & BIT(DRM_REFLECT_X));
+	vflip = !!(rotation & BIT(DRM_REFLECT_Y));
 
 	spin_lock_irqsave(&mdp5_plane->pipe_lock, flags);
 
-- 
2.7.4



More information about the dri-devel mailing list