OSDN Git Service

drm/mcde: Fix RGB/BGR bug
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 17 Nov 2020 17:54:13 +0000 (18:54 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 23 Nov 2020 23:07:04 +0000 (00:07 +0100)
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.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Cc: phone-devel@vger.kernel.org
Cc: Stephan Gerhold <stephan@gerhold.net>
Link: https://patchwork.freedesktop.org/patch/msgid/20201117175413.869871-1-linus.walleij@linaro.org
drivers/gpu/drm/mcde/mcde_display.c
drivers/gpu/drm/mcde/mcde_display_regs.h

index c271e5b..48841d5 100644 (file)
@@ -243,73 +243,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 <<
@@ -700,7 +697,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:
index d3ac7ef..3dc9b99 100644 (file)
 #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