]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/mediatek: Add support for 180-degree rotation in the display driver
authorJason-JH.Lin <jason-jh.lin@mediatek.com>
Mon, 18 Nov 2024 02:51:26 +0000 (10:51 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 Jan 2025 16:15:50 +0000 (17:15 +0100)
[ Upstream commit 5c9d7e79ba154e8e1f0bfdeb7b495f454c1a3eba ]

mediatek-drm driver reported the capability of 180-degree rotation by
adding `DRM_MODE_ROTATE_180` to the plane property, as flip-x combined
with flip-y equals a 180-degree rotation. However, we did not handle
the rotation property in the driver and lead to rotation issues.

Fixes: 74608d8feefd ("drm/mediatek: Add DRM_MODE_ROTATE_0 to rotation property")
Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: CK Hu <ck.hu@mediatek.com>
Link: https://patchwork.kernel.org/project/dri-devel/patch/20241118025126.30808-1-jason-jh.lin@mediatek.com/
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/mediatek/mtk_disp_ovl.c

index c54d56fb7b4c575598418da3669b6b9c65958dd2..77397bf0b5b457ee7807e875c65c2910335288c4 100644 (file)
@@ -302,6 +302,7 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
        unsigned int addr = pending->addr;
        unsigned int pitch = pending->pitch & 0xffff;
        unsigned int fmt = pending->format;
+       unsigned int rotation = pending->rotation;
        unsigned int offset = (pending->y << 16) | pending->x;
        unsigned int src_size = (pending->height << 16) | pending->width;
        unsigned int con;
@@ -315,12 +316,19 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
        if (state->base.fb && state->base.fb->format->has_alpha)
                con |= OVL_CON_AEN | OVL_CON_ALPHA;
 
-       if (pending->rotation & DRM_MODE_REFLECT_Y) {
+       /*
+        * Treat rotate 180 as flip x + flip y, and XOR the original rotation value
+        * to flip x + flip y to support both in the same time.
+        */
+       if (rotation & DRM_MODE_ROTATE_180)
+               rotation ^= DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y;
+
+       if (rotation & DRM_MODE_REFLECT_Y) {
                con |= OVL_CON_VIRT_FLIP;
                addr += (pending->height - 1) * pending->pitch;
        }
 
-       if (pending->rotation & DRM_MODE_REFLECT_X) {
+       if (rotation & DRM_MODE_REFLECT_X) {
                con |= OVL_CON_HORZ_FLIP;
                addr += pending->pitch - 1;
        }