I was confused when the graphics came out with blue
penguins on the DPI panel.

It turns out that the so-called "packed RGB666" mode
on the DSI formatter is incorrect: this mode is the
actual RGB888 mode, and the mode called RGB888 is
BGR888.

The claims that the MCDE had inverse RGB/BGR buffer
formats was wrong, so correct this and the buggy
register and everything is much more consistent, and
graphics look good on all targets, both DPI and
DSI.

Cc: phone-de...@vger.kernel.org
Cc: Stephan Gerhold <step...@gerhold.net>
Signed-off-by: Linus Walleij <linus.wall...@linaro.org>
---
 drivers/gpu/drm/mcde/mcde_display.c      | 23 +++++++++++------------
 drivers/gpu/drm/mcde/mcde_display_regs.h |  4 ++--
 2 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/mcde/mcde_display.c 
b/drivers/gpu/drm/mcde/mcde_display.c
index 14c76d3a8e5a..192e11c88d72 100644
--- a/drivers/gpu/drm/mcde/mcde_display.c
+++ b/drivers/gpu/drm/mcde/mcde_display.c
@@ -250,73 +250,70 @@ static int mcde_configure_extsrc(struct mcde *mcde, enum 
mcde_extsrc src,
        val = 0 << MCDE_EXTSRCXCONF_BUF_ID_SHIFT;
        val |= 1 << MCDE_EXTSRCXCONF_BUF_NB_SHIFT;
        val |= 0 << MCDE_EXTSRCXCONF_PRI_OVLID_SHIFT;
-       /*
-        * MCDE has inverse semantics from DRM on RBG/BGR which is why
-        * all the modes are inversed here.
-        */
+
        switch (format) {
        case DRM_FORMAT_ARGB8888:
                val |= MCDE_EXTSRCXCONF_BPP_ARGB8888 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
-               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_ABGR8888:
                val |= MCDE_EXTSRCXCONF_BPP_ARGB8888 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
+               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_XRGB8888:
                val |= MCDE_EXTSRCXCONF_BPP_XRGB8888 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
-               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_XBGR8888:
                val |= MCDE_EXTSRCXCONF_BPP_XRGB8888 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
+               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_RGB888:
                val |= MCDE_EXTSRCXCONF_BPP_RGB888 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
-               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_BGR888:
                val |= MCDE_EXTSRCXCONF_BPP_RGB888 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
+               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_ARGB4444:
                val |= MCDE_EXTSRCXCONF_BPP_ARGB4444 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
-               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_ABGR4444:
                val |= MCDE_EXTSRCXCONF_BPP_ARGB4444 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
+               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_XRGB4444:
                val |= MCDE_EXTSRCXCONF_BPP_RGB444 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
-               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_XBGR4444:
                val |= MCDE_EXTSRCXCONF_BPP_RGB444 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
+               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_XRGB1555:
                val |= MCDE_EXTSRCXCONF_BPP_IRGB1555 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
-               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_XBGR1555:
                val |= MCDE_EXTSRCXCONF_BPP_IRGB1555 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
+               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_RGB565:
                val |= MCDE_EXTSRCXCONF_BPP_RGB565 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
-               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_BGR565:
                val |= MCDE_EXTSRCXCONF_BPP_RGB565 <<
                        MCDE_EXTSRCXCONF_BPP_SHIFT;
+               val |= MCDE_EXTSRCXCONF_BGR;
                break;
        case DRM_FORMAT_YUV422:
                val |= MCDE_EXTSRCXCONF_BPP_YCBCR422 <<
@@ -810,7 +807,9 @@ static void mcde_configure_dsi_formatter(struct mcde *mcde,
                        MCDE_DSICONF0_PACKING_SHIFT;
                break;
        case MIPI_DSI_FMT_RGB666_PACKED:
-               val |= MCDE_DSICONF0_PACKING_RGB666_PACKED <<
+               dev_err(mcde->dev,
+                       "we cannot handle the packed RGB666 format\n");
+               val |= MCDE_DSICONF0_PACKING_RGB666 <<
                        MCDE_DSICONF0_PACKING_SHIFT;
                break;
        case MIPI_DSI_FMT_RGB565:
diff --git a/drivers/gpu/drm/mcde/mcde_display_regs.h 
b/drivers/gpu/drm/mcde/mcde_display_regs.h
index ae76da8a2138..2ad78c59d627 100644
--- a/drivers/gpu/drm/mcde/mcde_display_regs.h
+++ b/drivers/gpu/drm/mcde/mcde_display_regs.h
@@ -552,8 +552,8 @@
 #define MCDE_DSICONF0_PACKING_MASK 0x00700000
 #define MCDE_DSICONF0_PACKING_RGB565 0
 #define MCDE_DSICONF0_PACKING_RGB666 1
-#define MCDE_DSICONF0_PACKING_RGB666_PACKED 2
-#define MCDE_DSICONF0_PACKING_RGB888 3
+#define MCDE_DSICONF0_PACKING_RGB888 2
+#define MCDE_DSICONF0_PACKING_BGR888 3
 #define MCDE_DSICONF0_PACKING_HDTV 4
 
 #define MCDE_DSIVID0FRAME 0x00000E04
-- 
2.26.2

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

Reply via email to