drm/sun4i: Add separate DE3 VI layer formats
authorJernej Skrabec <jernej.skrabec@siol.net>
Mon, 24 Feb 2020 17:38:56 +0000 (18:38 +0100)
committerJernej Skrabec <jernej.skrabec@siol.net>
Tue, 3 Mar 2020 21:44:03 +0000 (22:44 +0100)
DE3 VI layers support alpha blending, but DE2 VI layers do not.
Additionally, DE3 VI layers support 10-bit RGB and YUV formats.

Make a separate list for DE3.

Fixes: c50519e6db4d ("drm/sun4i: Add basic support for DE3")
Acked-by: Maxime Ripard <mripard@kernel.org>
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
Link: https://patchwork.freedesktop.org/patch/msgid/20200224173901.174016-3-jernej.skrabec@siol.net
drivers/gpu/drm/sun4i/sun8i_mixer.c
drivers/gpu/drm/sun4i/sun8i_mixer.h
drivers/gpu/drm/sun4i/sun8i_vi_layer.c

index 3a78dbb..655445b 100644 (file)
@@ -149,6 +149,30 @@ static const struct de2_fmt_info de2_formats[] = {
                .csc = SUN8I_CSC_MODE_OFF,
        },
        {
+               .drm_fmt = DRM_FORMAT_ARGB2101010,
+               .de2_fmt = SUN8I_MIXER_FBFMT_ARGB2101010,
+               .rgb = true,
+               .csc = SUN8I_CSC_MODE_OFF,
+       },
+       {
+               .drm_fmt = DRM_FORMAT_ABGR2101010,
+               .de2_fmt = SUN8I_MIXER_FBFMT_ABGR2101010,
+               .rgb = true,
+               .csc = SUN8I_CSC_MODE_OFF,
+       },
+       {
+               .drm_fmt = DRM_FORMAT_RGBA1010102,
+               .de2_fmt = SUN8I_MIXER_FBFMT_RGBA1010102,
+               .rgb = true,
+               .csc = SUN8I_CSC_MODE_OFF,
+       },
+       {
+               .drm_fmt = DRM_FORMAT_BGRA1010102,
+               .de2_fmt = SUN8I_MIXER_FBFMT_BGRA1010102,
+               .rgb = true,
+               .csc = SUN8I_CSC_MODE_OFF,
+       },
+       {
                .drm_fmt = DRM_FORMAT_UYVY,
                .de2_fmt = SUN8I_MIXER_FBFMT_UYVY,
                .rgb = false,
@@ -232,6 +256,18 @@ static const struct de2_fmt_info de2_formats[] = {
                .rgb = false,
                .csc = SUN8I_CSC_MODE_YVU2RGB,
        },
+       {
+               .drm_fmt = DRM_FORMAT_P010,
+               .de2_fmt = SUN8I_MIXER_FBFMT_P010_YUV,
+               .rgb = false,
+               .csc = SUN8I_CSC_MODE_YUV2RGB,
+       },
+       {
+               .drm_fmt = DRM_FORMAT_P210,
+               .de2_fmt = SUN8I_MIXER_FBFMT_P210_YUV,
+               .rgb = false,
+               .csc = SUN8I_CSC_MODE_YUV2RGB,
+       },
 };
 
 const struct de2_fmt_info *sun8i_mixer_format_info(u32 format)
index c6cc940..345b28b 100644 (file)
 #define SUN8I_MIXER_FBFMT_ABGR1555     17
 #define SUN8I_MIXER_FBFMT_RGBA5551     18
 #define SUN8I_MIXER_FBFMT_BGRA5551     19
+#define SUN8I_MIXER_FBFMT_ARGB2101010  20
+#define SUN8I_MIXER_FBFMT_ABGR2101010  21
+#define SUN8I_MIXER_FBFMT_RGBA1010102  22
+#define SUN8I_MIXER_FBFMT_BGRA1010102  23
 
 #define SUN8I_MIXER_FBFMT_YUYV         0
 #define SUN8I_MIXER_FBFMT_UYVY         1
 /* format 12 is semi-planar YUV411 UVUV */
 /* format 13 is semi-planar YUV411 VUVU */
 #define SUN8I_MIXER_FBFMT_YUV411       14
+/* format 15 doesn't exist */
+/* format 16 is P010 YVU */
+#define SUN8I_MIXER_FBFMT_P010_YUV     17
+/* format 18 is P210 YVU */
+#define SUN8I_MIXER_FBFMT_P210_YUV     19
+/* format 20 is packed YVU444 10-bit */
+/* format 21 is packed YUV444 10-bit */
 
 /*
  * Sub-engines listed bellow are unused for now. The EN registers are here only
index 6a244d6..6c0084a 100644 (file)
@@ -436,24 +436,76 @@ static const u32 sun8i_vi_layer_formats[] = {
        DRM_FORMAT_YVU422,
 };
 
+static const u32 sun8i_vi_layer_de3_formats[] = {
+       DRM_FORMAT_ABGR1555,
+       DRM_FORMAT_ABGR2101010,
+       DRM_FORMAT_ABGR4444,
+       DRM_FORMAT_ABGR8888,
+       DRM_FORMAT_ARGB1555,
+       DRM_FORMAT_ARGB2101010,
+       DRM_FORMAT_ARGB4444,
+       DRM_FORMAT_ARGB8888,
+       DRM_FORMAT_BGR565,
+       DRM_FORMAT_BGR888,
+       DRM_FORMAT_BGRA1010102,
+       DRM_FORMAT_BGRA5551,
+       DRM_FORMAT_BGRA4444,
+       DRM_FORMAT_BGRA8888,
+       DRM_FORMAT_BGRX8888,
+       DRM_FORMAT_RGB565,
+       DRM_FORMAT_RGB888,
+       DRM_FORMAT_RGBA1010102,
+       DRM_FORMAT_RGBA4444,
+       DRM_FORMAT_RGBA5551,
+       DRM_FORMAT_RGBA8888,
+       DRM_FORMAT_RGBX8888,
+       DRM_FORMAT_XBGR8888,
+       DRM_FORMAT_XRGB8888,
+
+       DRM_FORMAT_NV16,
+       DRM_FORMAT_NV12,
+       DRM_FORMAT_NV21,
+       DRM_FORMAT_NV61,
+       DRM_FORMAT_P010,
+       DRM_FORMAT_P210,
+       DRM_FORMAT_UYVY,
+       DRM_FORMAT_VYUY,
+       DRM_FORMAT_YUYV,
+       DRM_FORMAT_YVYU,
+       DRM_FORMAT_YUV411,
+       DRM_FORMAT_YUV420,
+       DRM_FORMAT_YUV422,
+       DRM_FORMAT_YVU411,
+       DRM_FORMAT_YVU420,
+       DRM_FORMAT_YVU422,
+};
+
 struct sun8i_vi_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
                                               struct sun8i_mixer *mixer,
                                               int index)
 {
        u32 supported_encodings, supported_ranges;
+       unsigned int plane_cnt, format_count;
        struct sun8i_vi_layer *layer;
-       unsigned int plane_cnt;
+       const u32 *formats;
        int ret;
 
        layer = devm_kzalloc(drm->dev, sizeof(*layer), GFP_KERNEL);
        if (!layer)
                return ERR_PTR(-ENOMEM);
 
+       if (mixer->cfg->is_de3) {
+               formats = sun8i_vi_layer_de3_formats;
+               format_count = ARRAY_SIZE(sun8i_vi_layer_de3_formats);
+       } else {
+               formats = sun8i_vi_layer_formats;
+               format_count = ARRAY_SIZE(sun8i_vi_layer_formats);
+       }
+
        /* possible crtcs are set later */
        ret = drm_universal_plane_init(drm, &layer->plane, 0,
                                       &sun8i_vi_layer_funcs,
-                                      sun8i_vi_layer_formats,
-                                      ARRAY_SIZE(sun8i_vi_layer_formats),
+                                      formats, format_count,
                                       NULL, DRM_PLANE_TYPE_OVERLAY, NULL);
        if (ret) {
                dev_err(drm->dev, "Couldn't initialize layer\n");