197fb5e8dSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
225fdd593SJeykumar Sankaran /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
325fdd593SJeykumar Sankaran  */
425fdd593SJeykumar Sankaran 
525fdd593SJeykumar Sankaran #define pr_fmt(fmt)	"[drm:%s:%d] " fmt, __func__, __LINE__
625fdd593SJeykumar Sankaran 
725fdd593SJeykumar Sankaran #include <uapi/drm/drm_fourcc.h>
8720cf96dSVille Syrjälä #include <drm/drm_framebuffer.h>
925fdd593SJeykumar Sankaran 
1025fdd593SJeykumar Sankaran #include "msm_media_info.h"
1125fdd593SJeykumar Sankaran #include "dpu_kms.h"
1225fdd593SJeykumar Sankaran #include "dpu_formats.h"
1325fdd593SJeykumar Sankaran 
1425fdd593SJeykumar Sankaran #define DPU_UBWC_META_MACRO_W_H		16
1525fdd593SJeykumar Sankaran #define DPU_UBWC_META_BLOCK_SIZE	256
1625fdd593SJeykumar Sankaran #define DPU_UBWC_PLANE_SIZE_ALIGNMENT	4096
1725fdd593SJeykumar Sankaran 
1825fdd593SJeykumar Sankaran #define DPU_TILE_HEIGHT_DEFAULT	1
1925fdd593SJeykumar Sankaran #define DPU_TILE_HEIGHT_TILED	4
2025fdd593SJeykumar Sankaran #define DPU_TILE_HEIGHT_UBWC	4
2125fdd593SJeykumar Sankaran #define DPU_TILE_HEIGHT_NV12	8
2225fdd593SJeykumar Sankaran 
2325fdd593SJeykumar Sankaran #define DPU_MAX_IMG_WIDTH		0x3FFF
2425fdd593SJeykumar Sankaran #define DPU_MAX_IMG_HEIGHT		0x3FFF
2525fdd593SJeykumar Sankaran 
260070e6d2SLee Jones /*
2725fdd593SJeykumar Sankaran  * DPU supported format packing, bpp, and other format
2825fdd593SJeykumar Sankaran  * information.
2925fdd593SJeykumar Sankaran  * DPU currently only supports interleaved RGB formats
3025fdd593SJeykumar Sankaran  * UBWC support for a pixel format is indicated by the flag,
3125fdd593SJeykumar Sankaran  * there is additional meta data plane for such formats
3225fdd593SJeykumar Sankaran  */
3325fdd593SJeykumar Sankaran 
3425fdd593SJeykumar Sankaran #define INTERLEAVED_RGB_FMT(fmt, a, r, g, b, e0, e1, e2, e3, uc, alpha,   \
3525fdd593SJeykumar Sankaran bp, flg, fm, np)                                                          \
3625fdd593SJeykumar Sankaran {                                                                         \
3725fdd593SJeykumar Sankaran 	.base.pixel_format = DRM_FORMAT_ ## fmt,                          \
3825fdd593SJeykumar Sankaran 	.fetch_planes = DPU_PLANE_INTERLEAVED,                            \
3925fdd593SJeykumar Sankaran 	.alpha_enable = alpha,                                            \
4025fdd593SJeykumar Sankaran 	.element = { (e0), (e1), (e2), (e3) },                            \
4125fdd593SJeykumar Sankaran 	.bits = { g, b, r, a },                                           \
4225fdd593SJeykumar Sankaran 	.chroma_sample = DPU_CHROMA_RGB,                                  \
4325fdd593SJeykumar Sankaran 	.unpack_align_msb = 0,                                            \
4425fdd593SJeykumar Sankaran 	.unpack_tight = 1,                                                \
4525fdd593SJeykumar Sankaran 	.unpack_count = uc,                                               \
4625fdd593SJeykumar Sankaran 	.bpp = bp,                                                        \
4725fdd593SJeykumar Sankaran 	.fetch_mode = fm,                                                 \
4825fdd593SJeykumar Sankaran 	.flag = {(flg)},                                                  \
4925fdd593SJeykumar Sankaran 	.num_planes = np,                                                 \
5025fdd593SJeykumar Sankaran 	.tile_height = DPU_TILE_HEIGHT_DEFAULT                            \
5125fdd593SJeykumar Sankaran }
5225fdd593SJeykumar Sankaran 
5325fdd593SJeykumar Sankaran #define INTERLEAVED_RGB_FMT_TILED(fmt, a, r, g, b, e0, e1, e2, e3, uc,    \
5425fdd593SJeykumar Sankaran alpha, bp, flg, fm, np, th)                                               \
5525fdd593SJeykumar Sankaran {                                                                         \
5625fdd593SJeykumar Sankaran 	.base.pixel_format = DRM_FORMAT_ ## fmt,                          \
5725fdd593SJeykumar Sankaran 	.fetch_planes = DPU_PLANE_INTERLEAVED,                            \
5825fdd593SJeykumar Sankaran 	.alpha_enable = alpha,                                            \
5925fdd593SJeykumar Sankaran 	.element = { (e0), (e1), (e2), (e3) },                            \
6025fdd593SJeykumar Sankaran 	.bits = { g, b, r, a },                                           \
6125fdd593SJeykumar Sankaran 	.chroma_sample = DPU_CHROMA_RGB,                                  \
6225fdd593SJeykumar Sankaran 	.unpack_align_msb = 0,                                            \
6325fdd593SJeykumar Sankaran 	.unpack_tight = 1,                                                \
6425fdd593SJeykumar Sankaran 	.unpack_count = uc,                                               \
6525fdd593SJeykumar Sankaran 	.bpp = bp,                                                        \
6625fdd593SJeykumar Sankaran 	.fetch_mode = fm,                                                 \
6725fdd593SJeykumar Sankaran 	.flag = {(flg)},                                                  \
6825fdd593SJeykumar Sankaran 	.num_planes = np,                                                 \
6925fdd593SJeykumar Sankaran 	.tile_height = th                                                 \
7025fdd593SJeykumar Sankaran }
7125fdd593SJeykumar Sankaran 
7225fdd593SJeykumar Sankaran 
7325fdd593SJeykumar Sankaran #define INTERLEAVED_YUV_FMT(fmt, a, r, g, b, e0, e1, e2, e3,              \
7425fdd593SJeykumar Sankaran alpha, chroma, count, bp, flg, fm, np)                                    \
7525fdd593SJeykumar Sankaran {                                                                         \
7625fdd593SJeykumar Sankaran 	.base.pixel_format = DRM_FORMAT_ ## fmt,                          \
7725fdd593SJeykumar Sankaran 	.fetch_planes = DPU_PLANE_INTERLEAVED,                            \
7825fdd593SJeykumar Sankaran 	.alpha_enable = alpha,                                            \
7925fdd593SJeykumar Sankaran 	.element = { (e0), (e1), (e2), (e3)},                             \
8025fdd593SJeykumar Sankaran 	.bits = { g, b, r, a },                                           \
8125fdd593SJeykumar Sankaran 	.chroma_sample = chroma,                                          \
8225fdd593SJeykumar Sankaran 	.unpack_align_msb = 0,                                            \
8325fdd593SJeykumar Sankaran 	.unpack_tight = 1,                                                \
8425fdd593SJeykumar Sankaran 	.unpack_count = count,                                            \
8525fdd593SJeykumar Sankaran 	.bpp = bp,                                                        \
8625fdd593SJeykumar Sankaran 	.fetch_mode = fm,                                                 \
8725fdd593SJeykumar Sankaran 	.flag = {(flg)},                                                  \
8825fdd593SJeykumar Sankaran 	.num_planes = np,                                                 \
8925fdd593SJeykumar Sankaran 	.tile_height = DPU_TILE_HEIGHT_DEFAULT                            \
9025fdd593SJeykumar Sankaran }
9125fdd593SJeykumar Sankaran 
9225fdd593SJeykumar Sankaran #define PSEUDO_YUV_FMT(fmt, a, r, g, b, e0, e1, chroma, flg, fm, np)      \
9325fdd593SJeykumar Sankaran {                                                                         \
9425fdd593SJeykumar Sankaran 	.base.pixel_format = DRM_FORMAT_ ## fmt,                          \
9525fdd593SJeykumar Sankaran 	.fetch_planes = DPU_PLANE_PSEUDO_PLANAR,                          \
9625fdd593SJeykumar Sankaran 	.alpha_enable = false,                                            \
9725fdd593SJeykumar Sankaran 	.element = { (e0), (e1), 0, 0 },                                  \
9825fdd593SJeykumar Sankaran 	.bits = { g, b, r, a },                                           \
9925fdd593SJeykumar Sankaran 	.chroma_sample = chroma,                                          \
10025fdd593SJeykumar Sankaran 	.unpack_align_msb = 0,                                            \
10125fdd593SJeykumar Sankaran 	.unpack_tight = 1,                                                \
10225fdd593SJeykumar Sankaran 	.unpack_count = 2,                                                \
10325fdd593SJeykumar Sankaran 	.bpp = 2,                                                         \
10425fdd593SJeykumar Sankaran 	.fetch_mode = fm,                                                 \
10525fdd593SJeykumar Sankaran 	.flag = {(flg)},                                                  \
10625fdd593SJeykumar Sankaran 	.num_planes = np,                                                 \
10725fdd593SJeykumar Sankaran 	.tile_height = DPU_TILE_HEIGHT_DEFAULT                            \
10825fdd593SJeykumar Sankaran }
10925fdd593SJeykumar Sankaran 
11025fdd593SJeykumar Sankaran #define PSEUDO_YUV_FMT_TILED(fmt, a, r, g, b, e0, e1, chroma,             \
11125fdd593SJeykumar Sankaran flg, fm, np, th)                                                          \
11225fdd593SJeykumar Sankaran {                                                                         \
11325fdd593SJeykumar Sankaran 	.base.pixel_format = DRM_FORMAT_ ## fmt,                          \
11425fdd593SJeykumar Sankaran 	.fetch_planes = DPU_PLANE_PSEUDO_PLANAR,                          \
11525fdd593SJeykumar Sankaran 	.alpha_enable = false,                                            \
11625fdd593SJeykumar Sankaran 	.element = { (e0), (e1), 0, 0 },                                  \
11725fdd593SJeykumar Sankaran 	.bits = { g, b, r, a },                                           \
11825fdd593SJeykumar Sankaran 	.chroma_sample = chroma,                                          \
11925fdd593SJeykumar Sankaran 	.unpack_align_msb = 0,                                            \
12025fdd593SJeykumar Sankaran 	.unpack_tight = 1,                                                \
12125fdd593SJeykumar Sankaran 	.unpack_count = 2,                                                \
12225fdd593SJeykumar Sankaran 	.bpp = 2,                                                         \
12325fdd593SJeykumar Sankaran 	.fetch_mode = fm,                                                 \
12425fdd593SJeykumar Sankaran 	.flag = {(flg)},                                                  \
12525fdd593SJeykumar Sankaran 	.num_planes = np,                                                 \
12625fdd593SJeykumar Sankaran 	.tile_height = th                                                 \
12725fdd593SJeykumar Sankaran }
12825fdd593SJeykumar Sankaran 
12925fdd593SJeykumar Sankaran #define PSEUDO_YUV_FMT_LOOSE(fmt, a, r, g, b, e0, e1, chroma, flg, fm, np)\
13025fdd593SJeykumar Sankaran {                                                                         \
13125fdd593SJeykumar Sankaran 	.base.pixel_format = DRM_FORMAT_ ## fmt,                          \
13225fdd593SJeykumar Sankaran 	.fetch_planes = DPU_PLANE_PSEUDO_PLANAR,                          \
13325fdd593SJeykumar Sankaran 	.alpha_enable = false,                                            \
13425fdd593SJeykumar Sankaran 	.element = { (e0), (e1), 0, 0 },                                  \
13525fdd593SJeykumar Sankaran 	.bits = { g, b, r, a },                                           \
13625fdd593SJeykumar Sankaran 	.chroma_sample = chroma,                                          \
13725fdd593SJeykumar Sankaran 	.unpack_align_msb = 1,                                            \
13825fdd593SJeykumar Sankaran 	.unpack_tight = 0,                                                \
13925fdd593SJeykumar Sankaran 	.unpack_count = 2,                                                \
14025fdd593SJeykumar Sankaran 	.bpp = 2,                                                         \
14125fdd593SJeykumar Sankaran 	.fetch_mode = fm,                                                 \
14225fdd593SJeykumar Sankaran 	.flag = {(flg)},                                                  \
14325fdd593SJeykumar Sankaran 	.num_planes = np,                                                 \
14425fdd593SJeykumar Sankaran 	.tile_height = DPU_TILE_HEIGHT_DEFAULT                            \
14525fdd593SJeykumar Sankaran }
14625fdd593SJeykumar Sankaran 
14725fdd593SJeykumar Sankaran #define PSEUDO_YUV_FMT_LOOSE_TILED(fmt, a, r, g, b, e0, e1, chroma,       \
14825fdd593SJeykumar Sankaran flg, fm, np, th)                                                          \
14925fdd593SJeykumar Sankaran {                                                                         \
15025fdd593SJeykumar Sankaran 	.base.pixel_format = DRM_FORMAT_ ## fmt,                          \
15125fdd593SJeykumar Sankaran 	.fetch_planes = DPU_PLANE_PSEUDO_PLANAR,                          \
15225fdd593SJeykumar Sankaran 	.alpha_enable = false,                                            \
15325fdd593SJeykumar Sankaran 	.element = { (e0), (e1), 0, 0 },                                  \
15425fdd593SJeykumar Sankaran 	.bits = { g, b, r, a },                                           \
15525fdd593SJeykumar Sankaran 	.chroma_sample = chroma,                                          \
15625fdd593SJeykumar Sankaran 	.unpack_align_msb = 1,                                            \
15725fdd593SJeykumar Sankaran 	.unpack_tight = 0,                                                \
15825fdd593SJeykumar Sankaran 	.unpack_count = 2,                                                \
15925fdd593SJeykumar Sankaran 	.bpp = 2,                                                         \
16025fdd593SJeykumar Sankaran 	.fetch_mode = fm,                                                 \
16125fdd593SJeykumar Sankaran 	.flag = {(flg)},                                                  \
16225fdd593SJeykumar Sankaran 	.num_planes = np,                                                 \
16325fdd593SJeykumar Sankaran 	.tile_height = th                                                 \
16425fdd593SJeykumar Sankaran }
16525fdd593SJeykumar Sankaran 
16625fdd593SJeykumar Sankaran 
16725fdd593SJeykumar Sankaran #define PLANAR_YUV_FMT(fmt, a, r, g, b, e0, e1, e2, alpha, chroma, bp,    \
16825fdd593SJeykumar Sankaran flg, fm, np)                                                      \
16925fdd593SJeykumar Sankaran {                                                                         \
17025fdd593SJeykumar Sankaran 	.base.pixel_format = DRM_FORMAT_ ## fmt,                          \
17125fdd593SJeykumar Sankaran 	.fetch_planes = DPU_PLANE_PLANAR,                                 \
17225fdd593SJeykumar Sankaran 	.alpha_enable = alpha,                                            \
17325fdd593SJeykumar Sankaran 	.element = { (e0), (e1), (e2), 0 },                               \
17425fdd593SJeykumar Sankaran 	.bits = { g, b, r, a },                                           \
17525fdd593SJeykumar Sankaran 	.chroma_sample = chroma,                                          \
17625fdd593SJeykumar Sankaran 	.unpack_align_msb = 0,                                            \
17725fdd593SJeykumar Sankaran 	.unpack_tight = 1,                                                \
17825fdd593SJeykumar Sankaran 	.unpack_count = 1,                                                \
17925fdd593SJeykumar Sankaran 	.bpp = bp,                                                        \
18025fdd593SJeykumar Sankaran 	.fetch_mode = fm,                                                 \
18125fdd593SJeykumar Sankaran 	.flag = {(flg)},                                                  \
18225fdd593SJeykumar Sankaran 	.num_planes = np,                                                 \
18325fdd593SJeykumar Sankaran 	.tile_height = DPU_TILE_HEIGHT_DEFAULT                            \
18425fdd593SJeykumar Sankaran }
18525fdd593SJeykumar Sankaran 
18625fdd593SJeykumar Sankaran /*
18725fdd593SJeykumar Sankaran  * struct dpu_media_color_map - maps drm format to media format
18825fdd593SJeykumar Sankaran  * @format: DRM base pixel format
18925fdd593SJeykumar Sankaran  * @color: Media API color related to DRM format
19025fdd593SJeykumar Sankaran  */
19125fdd593SJeykumar Sankaran struct dpu_media_color_map {
19225fdd593SJeykumar Sankaran 	uint32_t format;
19325fdd593SJeykumar Sankaran 	uint32_t color;
19425fdd593SJeykumar Sankaran };
19525fdd593SJeykumar Sankaran 
19625fdd593SJeykumar Sankaran static const struct dpu_format dpu_format_map[] = {
19725fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(ARGB8888,
19825fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
19925fdd593SJeykumar Sankaran 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
20025fdd593SJeykumar Sankaran 		true, 4, 0,
20125fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
20225fdd593SJeykumar Sankaran 
20325fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(ABGR8888,
20425fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
20525fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
20625fdd593SJeykumar Sankaran 		true, 4, 0,
20725fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
20825fdd593SJeykumar Sankaran 
20925fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(XBGR8888,
21025fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
21125fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
212d9a75a62SJayant Shekhar 		false, 4, 0,
21325fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
21425fdd593SJeykumar Sankaran 
21525fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(RGBA8888,
21625fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
21725fdd593SJeykumar Sankaran 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
21825fdd593SJeykumar Sankaran 		true, 4, 0,
21925fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
22025fdd593SJeykumar Sankaran 
22125fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(BGRA8888,
22225fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
22325fdd593SJeykumar Sankaran 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
22425fdd593SJeykumar Sankaran 		true, 4, 0,
22525fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
22625fdd593SJeykumar Sankaran 
22725fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(BGRX8888,
22825fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
22925fdd593SJeykumar Sankaran 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
23025fdd593SJeykumar Sankaran 		false, 4, 0,
23125fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
23225fdd593SJeykumar Sankaran 
23325fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(XRGB8888,
23425fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
23525fdd593SJeykumar Sankaran 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
23625fdd593SJeykumar Sankaran 		false, 4, 0,
23725fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
23825fdd593SJeykumar Sankaran 
23925fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(RGBX8888,
24025fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
24125fdd593SJeykumar Sankaran 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
24225fdd593SJeykumar Sankaran 		false, 4, 0,
24325fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
24425fdd593SJeykumar Sankaran 
24525fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(RGB888,
24625fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
24725fdd593SJeykumar Sankaran 		C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3,
24825fdd593SJeykumar Sankaran 		false, 3, 0,
24925fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
25025fdd593SJeykumar Sankaran 
25125fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(BGR888,
25225fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
25325fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3,
25425fdd593SJeykumar Sankaran 		false, 3, 0,
25525fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
25625fdd593SJeykumar Sankaran 
25725fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(RGB565,
25825fdd593SJeykumar Sankaran 		0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT,
2598fc7036eSRob Clark 		C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3,
26025fdd593SJeykumar Sankaran 		false, 2, 0,
26125fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
26225fdd593SJeykumar Sankaran 
26325fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(BGR565,
26425fdd593SJeykumar Sankaran 		0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT,
2658fc7036eSRob Clark 		C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3,
26625fdd593SJeykumar Sankaran 		false, 2, 0,
26725fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
26825fdd593SJeykumar Sankaran 
26925fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(ARGB1555,
27025fdd593SJeykumar Sankaran 		COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
27125fdd593SJeykumar Sankaran 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
27225fdd593SJeykumar Sankaran 		true, 2, 0,
27325fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
27425fdd593SJeykumar Sankaran 
27525fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(ABGR1555,
27625fdd593SJeykumar Sankaran 		COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
27725fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
27825fdd593SJeykumar Sankaran 		true, 2, 0,
27925fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
28025fdd593SJeykumar Sankaran 
28125fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(RGBA5551,
28225fdd593SJeykumar Sankaran 		COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
28325fdd593SJeykumar Sankaran 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
28425fdd593SJeykumar Sankaran 		true, 2, 0,
28525fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
28625fdd593SJeykumar Sankaran 
28725fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(BGRA5551,
28825fdd593SJeykumar Sankaran 		COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
28925fdd593SJeykumar Sankaran 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
29025fdd593SJeykumar Sankaran 		true, 2, 0,
29125fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
29225fdd593SJeykumar Sankaran 
29325fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(XRGB1555,
29425fdd593SJeykumar Sankaran 		COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
29525fdd593SJeykumar Sankaran 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
29625fdd593SJeykumar Sankaran 		false, 2, 0,
29725fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
29825fdd593SJeykumar Sankaran 
29925fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(XBGR1555,
30025fdd593SJeykumar Sankaran 		COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
30125fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
30225fdd593SJeykumar Sankaran 		false, 2, 0,
30325fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
30425fdd593SJeykumar Sankaran 
30525fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(RGBX5551,
30625fdd593SJeykumar Sankaran 		COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
30725fdd593SJeykumar Sankaran 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
30825fdd593SJeykumar Sankaran 		false, 2, 0,
30925fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
31025fdd593SJeykumar Sankaran 
31125fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(BGRX5551,
31225fdd593SJeykumar Sankaran 		COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
31325fdd593SJeykumar Sankaran 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
31425fdd593SJeykumar Sankaran 		false, 2, 0,
31525fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
31625fdd593SJeykumar Sankaran 
31725fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(ARGB4444,
31825fdd593SJeykumar Sankaran 		COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
31925fdd593SJeykumar Sankaran 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
32025fdd593SJeykumar Sankaran 		true, 2, 0,
32125fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
32225fdd593SJeykumar Sankaran 
32325fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(ABGR4444,
32425fdd593SJeykumar Sankaran 		COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
32525fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
32625fdd593SJeykumar Sankaran 		true, 2, 0,
32725fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
32825fdd593SJeykumar Sankaran 
32925fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(RGBA4444,
33025fdd593SJeykumar Sankaran 		COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
33125fdd593SJeykumar Sankaran 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
33225fdd593SJeykumar Sankaran 		true, 2, 0,
33325fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
33425fdd593SJeykumar Sankaran 
33525fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(BGRA4444,
33625fdd593SJeykumar Sankaran 		COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
33725fdd593SJeykumar Sankaran 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
33825fdd593SJeykumar Sankaran 		true, 2, 0,
33925fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
34025fdd593SJeykumar Sankaran 
34125fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(XRGB4444,
34225fdd593SJeykumar Sankaran 		COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
34325fdd593SJeykumar Sankaran 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
34425fdd593SJeykumar Sankaran 		false, 2, 0,
34525fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
34625fdd593SJeykumar Sankaran 
34725fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(XBGR4444,
34825fdd593SJeykumar Sankaran 		COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
34925fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
35025fdd593SJeykumar Sankaran 		false, 2, 0,
35125fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
35225fdd593SJeykumar Sankaran 
35325fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(RGBX4444,
35425fdd593SJeykumar Sankaran 		COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
35525fdd593SJeykumar Sankaran 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
35625fdd593SJeykumar Sankaran 		false, 2, 0,
35725fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
35825fdd593SJeykumar Sankaran 
35925fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(BGRX4444,
36025fdd593SJeykumar Sankaran 		COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
36125fdd593SJeykumar Sankaran 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
36225fdd593SJeykumar Sankaran 		false, 2, 0,
36325fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
36425fdd593SJeykumar Sankaran 
36525fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(BGRA1010102,
36625fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
36725fdd593SJeykumar Sankaran 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
36825fdd593SJeykumar Sankaran 		true, 4, DPU_FORMAT_FLAG_DX,
36925fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
37025fdd593SJeykumar Sankaran 
37125fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(RGBA1010102,
37225fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
37325fdd593SJeykumar Sankaran 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
37425fdd593SJeykumar Sankaran 		true, 4, DPU_FORMAT_FLAG_DX,
37525fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
37625fdd593SJeykumar Sankaran 
37725fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(ABGR2101010,
37825fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
37925fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
38025fdd593SJeykumar Sankaran 		true, 4, DPU_FORMAT_FLAG_DX,
38125fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
38225fdd593SJeykumar Sankaran 
38325fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(ARGB2101010,
38425fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
38525fdd593SJeykumar Sankaran 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
38625fdd593SJeykumar Sankaran 		true, 4, DPU_FORMAT_FLAG_DX,
38725fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
38825fdd593SJeykumar Sankaran 
38925fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(XRGB2101010,
39025fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
39125fdd593SJeykumar Sankaran 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
39225fdd593SJeykumar Sankaran 		false, 4, DPU_FORMAT_FLAG_DX,
39325fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
39425fdd593SJeykumar Sankaran 
39525fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(BGRX1010102,
39625fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
39725fdd593SJeykumar Sankaran 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
39825fdd593SJeykumar Sankaran 		false, 4, DPU_FORMAT_FLAG_DX,
39925fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
40025fdd593SJeykumar Sankaran 
40125fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(XBGR2101010,
40225fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
40325fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
40425fdd593SJeykumar Sankaran 		false, 4, DPU_FORMAT_FLAG_DX,
40525fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
40625fdd593SJeykumar Sankaran 
40725fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT(RGBX1010102,
40825fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
40925fdd593SJeykumar Sankaran 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
41025fdd593SJeykumar Sankaran 		false, 4, DPU_FORMAT_FLAG_DX,
41125fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 1),
41225fdd593SJeykumar Sankaran 
41325fdd593SJeykumar Sankaran 	PSEUDO_YUV_FMT(NV12,
41425fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
41525fdd593SJeykumar Sankaran 		C1_B_Cb, C2_R_Cr,
41625fdd593SJeykumar Sankaran 		DPU_CHROMA_420, DPU_FORMAT_FLAG_YUV,
41725fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 2),
41825fdd593SJeykumar Sankaran 
41925fdd593SJeykumar Sankaran 	PSEUDO_YUV_FMT(NV21,
42025fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
42125fdd593SJeykumar Sankaran 		C2_R_Cr, C1_B_Cb,
42225fdd593SJeykumar Sankaran 		DPU_CHROMA_420, DPU_FORMAT_FLAG_YUV,
42325fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 2),
42425fdd593SJeykumar Sankaran 
42525fdd593SJeykumar Sankaran 	PSEUDO_YUV_FMT(NV16,
42625fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
42725fdd593SJeykumar Sankaran 		C1_B_Cb, C2_R_Cr,
42825fdd593SJeykumar Sankaran 		DPU_CHROMA_H2V1, DPU_FORMAT_FLAG_YUV,
42925fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 2),
43025fdd593SJeykumar Sankaran 
43125fdd593SJeykumar Sankaran 	PSEUDO_YUV_FMT(NV61,
43225fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
43325fdd593SJeykumar Sankaran 		C2_R_Cr, C1_B_Cb,
43425fdd593SJeykumar Sankaran 		DPU_CHROMA_H2V1, DPU_FORMAT_FLAG_YUV,
43525fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 2),
43625fdd593SJeykumar Sankaran 
437f07c9946SJessica Zhang 	PSEUDO_YUV_FMT_LOOSE(P010,
438f07c9946SJessica Zhang 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
439f07c9946SJessica Zhang 		C1_B_Cb, C2_R_Cr,
440f07c9946SJessica Zhang 		DPU_CHROMA_420, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_YUV,
441f07c9946SJessica Zhang 		DPU_FETCH_LINEAR, 2),
442f07c9946SJessica Zhang 
44325fdd593SJeykumar Sankaran 	INTERLEAVED_YUV_FMT(VYUY,
44425fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
44525fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C0_G_Y,
44625fdd593SJeykumar Sankaran 		false, DPU_CHROMA_H2V1, 4, 2, DPU_FORMAT_FLAG_YUV,
44725fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 2),
44825fdd593SJeykumar Sankaran 
44925fdd593SJeykumar Sankaran 	INTERLEAVED_YUV_FMT(UYVY,
45025fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
45125fdd593SJeykumar Sankaran 		C1_B_Cb, C0_G_Y, C2_R_Cr, C0_G_Y,
45225fdd593SJeykumar Sankaran 		false, DPU_CHROMA_H2V1, 4, 2, DPU_FORMAT_FLAG_YUV,
45325fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 2),
45425fdd593SJeykumar Sankaran 
45525fdd593SJeykumar Sankaran 	INTERLEAVED_YUV_FMT(YUYV,
45625fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
45725fdd593SJeykumar Sankaran 		C0_G_Y, C1_B_Cb, C0_G_Y, C2_R_Cr,
45825fdd593SJeykumar Sankaran 		false, DPU_CHROMA_H2V1, 4, 2, DPU_FORMAT_FLAG_YUV,
45925fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 2),
46025fdd593SJeykumar Sankaran 
46125fdd593SJeykumar Sankaran 	INTERLEAVED_YUV_FMT(YVYU,
46225fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
46325fdd593SJeykumar Sankaran 		C0_G_Y, C2_R_Cr, C0_G_Y, C1_B_Cb,
46425fdd593SJeykumar Sankaran 		false, DPU_CHROMA_H2V1, 4, 2, DPU_FORMAT_FLAG_YUV,
46525fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 2),
46625fdd593SJeykumar Sankaran 
46725fdd593SJeykumar Sankaran 	PLANAR_YUV_FMT(YUV420,
46825fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
46925fdd593SJeykumar Sankaran 		C2_R_Cr, C1_B_Cb, C0_G_Y,
47025fdd593SJeykumar Sankaran 		false, DPU_CHROMA_420, 1, DPU_FORMAT_FLAG_YUV,
47125fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 3),
47225fdd593SJeykumar Sankaran 
47325fdd593SJeykumar Sankaran 	PLANAR_YUV_FMT(YVU420,
47425fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
47525fdd593SJeykumar Sankaran 		C1_B_Cb, C2_R_Cr, C0_G_Y,
47625fdd593SJeykumar Sankaran 		false, DPU_CHROMA_420, 1, DPU_FORMAT_FLAG_YUV,
47725fdd593SJeykumar Sankaran 		DPU_FETCH_LINEAR, 3),
47825fdd593SJeykumar Sankaran };
47925fdd593SJeykumar Sankaran 
48025fdd593SJeykumar Sankaran /*
48125fdd593SJeykumar Sankaran  * UBWC formats table:
48225fdd593SJeykumar Sankaran  * This table holds the UBWC formats supported.
48325fdd593SJeykumar Sankaran  * If a compression ratio needs to be used for this or any other format,
48425fdd593SJeykumar Sankaran  * the data will be passed by user-space.
48525fdd593SJeykumar Sankaran  */
48625fdd593SJeykumar Sankaran static const struct dpu_format dpu_format_map_ubwc[] = {
48725fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT_TILED(BGR565,
48825fdd593SJeykumar Sankaran 		0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT,
48925fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3,
49025fdd593SJeykumar Sankaran 		false, 2, DPU_FORMAT_FLAG_COMPRESSED,
49125fdd593SJeykumar Sankaran 		DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
49225fdd593SJeykumar Sankaran 
49325fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT_TILED(ABGR8888,
49425fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
49525fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
49625fdd593SJeykumar Sankaran 		true, 4, DPU_FORMAT_FLAG_COMPRESSED,
49725fdd593SJeykumar Sankaran 		DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
49825fdd593SJeykumar Sankaran 
499cb929b8fSFritz Koenig 	/* ARGB8888 and ABGR8888 purposely have the same color
500cb929b8fSFritz Koenig 	 * ordering.  The hardware only supports ABGR8888 UBWC
501cb929b8fSFritz Koenig 	 * natively.
502cb929b8fSFritz Koenig 	 */
503cb929b8fSFritz Koenig 	INTERLEAVED_RGB_FMT_TILED(ARGB8888,
504cb929b8fSFritz Koenig 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
505cb929b8fSFritz Koenig 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
506cb929b8fSFritz Koenig 		true, 4, DPU_FORMAT_FLAG_COMPRESSED,
507cb929b8fSFritz Koenig 		DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
508cb929b8fSFritz Koenig 
50925fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT_TILED(XBGR8888,
51025fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
51125fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
51225fdd593SJeykumar Sankaran 		false, 4, DPU_FORMAT_FLAG_COMPRESSED,
51325fdd593SJeykumar Sankaran 		DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
51425fdd593SJeykumar Sankaran 
515cb929b8fSFritz Koenig 	INTERLEAVED_RGB_FMT_TILED(XRGB8888,
516cb929b8fSFritz Koenig 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
517cb929b8fSFritz Koenig 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
518cb929b8fSFritz Koenig 		false, 4, DPU_FORMAT_FLAG_COMPRESSED,
519cb929b8fSFritz Koenig 		DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
520cb929b8fSFritz Koenig 
52125fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT_TILED(ABGR2101010,
52225fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
52325fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
52425fdd593SJeykumar Sankaran 		true, 4, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_COMPRESSED,
52525fdd593SJeykumar Sankaran 		DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
52625fdd593SJeykumar Sankaran 
52725fdd593SJeykumar Sankaran 	INTERLEAVED_RGB_FMT_TILED(XBGR2101010,
52825fdd593SJeykumar Sankaran 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
52925fdd593SJeykumar Sankaran 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
53025fdd593SJeykumar Sankaran 		true, 4, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_COMPRESSED,
53125fdd593SJeykumar Sankaran 		DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
53225fdd593SJeykumar Sankaran 
533da7716a2SJessica Zhang 	INTERLEAVED_RGB_FMT_TILED(XRGB2101010,
534da7716a2SJessica Zhang 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
535da7716a2SJessica Zhang 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
536da7716a2SJessica Zhang 		true, 4, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_COMPRESSED,
537da7716a2SJessica Zhang 		DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
538da7716a2SJessica Zhang 
539ffbbed63SLeonard Lausen 	/* XRGB2101010 and ARGB2101010 purposely have the same color
540ffbbed63SLeonard Lausen 	* ordering.  The hardware only supports ARGB2101010 UBWC
541ffbbed63SLeonard Lausen 	* natively.
542ffbbed63SLeonard Lausen 	*/
543ffbbed63SLeonard Lausen 	INTERLEAVED_RGB_FMT_TILED(ARGB2101010,
544ffbbed63SLeonard Lausen 		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
545ffbbed63SLeonard Lausen 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
546ffbbed63SLeonard Lausen 		true, 4, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_COMPRESSED,
547ffbbed63SLeonard Lausen 		DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC),
548ffbbed63SLeonard Lausen 
54925fdd593SJeykumar Sankaran 	PSEUDO_YUV_FMT_TILED(NV12,
55025fdd593SJeykumar Sankaran 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
55125fdd593SJeykumar Sankaran 		C1_B_Cb, C2_R_Cr,
55225fdd593SJeykumar Sankaran 		DPU_CHROMA_420, DPU_FORMAT_FLAG_YUV |
55325fdd593SJeykumar Sankaran 				DPU_FORMAT_FLAG_COMPRESSED,
55425fdd593SJeykumar Sankaran 		DPU_FETCH_UBWC, 4, DPU_TILE_HEIGHT_NV12),
555f07c9946SJessica Zhang 
556f07c9946SJessica Zhang 	PSEUDO_YUV_FMT_TILED(P010,
557f07c9946SJessica Zhang 		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
558f07c9946SJessica Zhang 		C1_B_Cb, C2_R_Cr,
559f07c9946SJessica Zhang 		DPU_CHROMA_420, DPU_FORMAT_FLAG_DX |
560f07c9946SJessica Zhang 				DPU_FORMAT_FLAG_YUV |
561f07c9946SJessica Zhang 				DPU_FORMAT_FLAG_COMPRESSED,
562f07c9946SJessica Zhang 		DPU_FETCH_UBWC, 4, DPU_TILE_HEIGHT_UBWC),
56325fdd593SJeykumar Sankaran };
56425fdd593SJeykumar Sankaran 
56525fdd593SJeykumar Sankaran /* _dpu_get_v_h_subsample_rate - Get subsample rates for all formats we support
56625fdd593SJeykumar Sankaran  *   Note: Not using the drm_format_*_subsampling since we have formats
56725fdd593SJeykumar Sankaran  */
_dpu_get_v_h_subsample_rate(enum dpu_chroma_samp_type chroma_sample,uint32_t * v_sample,uint32_t * h_sample)56825fdd593SJeykumar Sankaran static void _dpu_get_v_h_subsample_rate(
56925fdd593SJeykumar Sankaran 	enum dpu_chroma_samp_type chroma_sample,
57025fdd593SJeykumar Sankaran 	uint32_t *v_sample,
57125fdd593SJeykumar Sankaran 	uint32_t *h_sample)
57225fdd593SJeykumar Sankaran {
57325fdd593SJeykumar Sankaran 	if (!v_sample || !h_sample)
57425fdd593SJeykumar Sankaran 		return;
57525fdd593SJeykumar Sankaran 
57625fdd593SJeykumar Sankaran 	switch (chroma_sample) {
57725fdd593SJeykumar Sankaran 	case DPU_CHROMA_H2V1:
57825fdd593SJeykumar Sankaran 		*v_sample = 1;
57925fdd593SJeykumar Sankaran 		*h_sample = 2;
58025fdd593SJeykumar Sankaran 		break;
58125fdd593SJeykumar Sankaran 	case DPU_CHROMA_H1V2:
58225fdd593SJeykumar Sankaran 		*v_sample = 2;
58325fdd593SJeykumar Sankaran 		*h_sample = 1;
58425fdd593SJeykumar Sankaran 		break;
58525fdd593SJeykumar Sankaran 	case DPU_CHROMA_420:
58625fdd593SJeykumar Sankaran 		*v_sample = 2;
58725fdd593SJeykumar Sankaran 		*h_sample = 2;
58825fdd593SJeykumar Sankaran 		break;
58925fdd593SJeykumar Sankaran 	default:
59025fdd593SJeykumar Sankaran 		*v_sample = 1;
59125fdd593SJeykumar Sankaran 		*h_sample = 1;
59225fdd593SJeykumar Sankaran 		break;
59325fdd593SJeykumar Sankaran 	}
59425fdd593SJeykumar Sankaran }
59525fdd593SJeykumar Sankaran 
_dpu_format_get_media_color_ubwc(const struct dpu_format * fmt)59625fdd593SJeykumar Sankaran static int _dpu_format_get_media_color_ubwc(const struct dpu_format *fmt)
59725fdd593SJeykumar Sankaran {
59825fdd593SJeykumar Sankaran 	static const struct dpu_media_color_map dpu_media_ubwc_map[] = {
59925fdd593SJeykumar Sankaran 		{DRM_FORMAT_ABGR8888, COLOR_FMT_RGBA8888_UBWC},
600cb929b8fSFritz Koenig 		{DRM_FORMAT_ARGB8888, COLOR_FMT_RGBA8888_UBWC},
60125fdd593SJeykumar Sankaran 		{DRM_FORMAT_XBGR8888, COLOR_FMT_RGBA8888_UBWC},
602cb929b8fSFritz Koenig 		{DRM_FORMAT_XRGB8888, COLOR_FMT_RGBA8888_UBWC},
60325fdd593SJeykumar Sankaran 		{DRM_FORMAT_ABGR2101010, COLOR_FMT_RGBA1010102_UBWC},
604ffbbed63SLeonard Lausen 		{DRM_FORMAT_ARGB2101010, COLOR_FMT_RGBA1010102_UBWC},
605da7716a2SJessica Zhang 		{DRM_FORMAT_XRGB2101010, COLOR_FMT_RGBA1010102_UBWC},
60625fdd593SJeykumar Sankaran 		{DRM_FORMAT_XBGR2101010, COLOR_FMT_RGBA1010102_UBWC},
60725fdd593SJeykumar Sankaran 		{DRM_FORMAT_BGR565, COLOR_FMT_RGB565_UBWC},
60825fdd593SJeykumar Sankaran 	};
60925fdd593SJeykumar Sankaran 	int color_fmt = -1;
61025fdd593SJeykumar Sankaran 	int i;
61125fdd593SJeykumar Sankaran 
612f07c9946SJessica Zhang 	if (fmt->base.pixel_format == DRM_FORMAT_NV12 ||
613f07c9946SJessica Zhang 	    fmt->base.pixel_format == DRM_FORMAT_P010) {
61425fdd593SJeykumar Sankaran 		if (DPU_FORMAT_IS_DX(fmt)) {
61525fdd593SJeykumar Sankaran 			if (fmt->unpack_tight)
61625fdd593SJeykumar Sankaran 				color_fmt = COLOR_FMT_NV12_BPP10_UBWC;
61725fdd593SJeykumar Sankaran 			else
61825fdd593SJeykumar Sankaran 				color_fmt = COLOR_FMT_P010_UBWC;
61925fdd593SJeykumar Sankaran 		} else
62025fdd593SJeykumar Sankaran 			color_fmt = COLOR_FMT_NV12_UBWC;
62125fdd593SJeykumar Sankaran 		return color_fmt;
62225fdd593SJeykumar Sankaran 	}
62325fdd593SJeykumar Sankaran 
62425fdd593SJeykumar Sankaran 	for (i = 0; i < ARRAY_SIZE(dpu_media_ubwc_map); ++i)
62525fdd593SJeykumar Sankaran 		if (fmt->base.pixel_format == dpu_media_ubwc_map[i].format) {
62625fdd593SJeykumar Sankaran 			color_fmt = dpu_media_ubwc_map[i].color;
62725fdd593SJeykumar Sankaran 			break;
62825fdd593SJeykumar Sankaran 		}
62925fdd593SJeykumar Sankaran 	return color_fmt;
63025fdd593SJeykumar Sankaran }
63125fdd593SJeykumar Sankaran 
_dpu_format_get_plane_sizes_ubwc(const struct dpu_format * fmt,const uint32_t width,const uint32_t height,struct dpu_hw_fmt_layout * layout)63225fdd593SJeykumar Sankaran static int _dpu_format_get_plane_sizes_ubwc(
63325fdd593SJeykumar Sankaran 		const struct dpu_format *fmt,
63425fdd593SJeykumar Sankaran 		const uint32_t width,
63525fdd593SJeykumar Sankaran 		const uint32_t height,
63625fdd593SJeykumar Sankaran 		struct dpu_hw_fmt_layout *layout)
63725fdd593SJeykumar Sankaran {
63825fdd593SJeykumar Sankaran 	int i;
63925fdd593SJeykumar Sankaran 	int color;
64025fdd593SJeykumar Sankaran 	bool meta = DPU_FORMAT_IS_UBWC(fmt);
64125fdd593SJeykumar Sankaran 
64225fdd593SJeykumar Sankaran 	memset(layout, 0, sizeof(struct dpu_hw_fmt_layout));
64325fdd593SJeykumar Sankaran 	layout->format = fmt;
64425fdd593SJeykumar Sankaran 	layout->width = width;
64525fdd593SJeykumar Sankaran 	layout->height = height;
64625fdd593SJeykumar Sankaran 	layout->num_planes = fmt->num_planes;
64725fdd593SJeykumar Sankaran 
64825fdd593SJeykumar Sankaran 	color = _dpu_format_get_media_color_ubwc(fmt);
64925fdd593SJeykumar Sankaran 	if (color < 0) {
65025fdd593SJeykumar Sankaran 		DRM_ERROR("UBWC format not supported for fmt: %4.4s\n",
65125fdd593SJeykumar Sankaran 			(char *)&fmt->base.pixel_format);
65225fdd593SJeykumar Sankaran 		return -EINVAL;
65325fdd593SJeykumar Sankaran 	}
65425fdd593SJeykumar Sankaran 
65525fdd593SJeykumar Sankaran 	if (DPU_FORMAT_IS_YUV(layout->format)) {
65625fdd593SJeykumar Sankaran 		uint32_t y_sclines, uv_sclines;
65725fdd593SJeykumar Sankaran 		uint32_t y_meta_scanlines = 0;
65825fdd593SJeykumar Sankaran 		uint32_t uv_meta_scanlines = 0;
65925fdd593SJeykumar Sankaran 
66025fdd593SJeykumar Sankaran 		layout->num_planes = 2;
66125fdd593SJeykumar Sankaran 		layout->plane_pitch[0] = VENUS_Y_STRIDE(color, width);
66225fdd593SJeykumar Sankaran 		y_sclines = VENUS_Y_SCANLINES(color, height);
66325fdd593SJeykumar Sankaran 		layout->plane_size[0] = MSM_MEDIA_ALIGN(layout->plane_pitch[0] *
66425fdd593SJeykumar Sankaran 			y_sclines, DPU_UBWC_PLANE_SIZE_ALIGNMENT);
66525fdd593SJeykumar Sankaran 
66625fdd593SJeykumar Sankaran 		layout->plane_pitch[1] = VENUS_UV_STRIDE(color, width);
66725fdd593SJeykumar Sankaran 		uv_sclines = VENUS_UV_SCANLINES(color, height);
66825fdd593SJeykumar Sankaran 		layout->plane_size[1] = MSM_MEDIA_ALIGN(layout->plane_pitch[1] *
66925fdd593SJeykumar Sankaran 			uv_sclines, DPU_UBWC_PLANE_SIZE_ALIGNMENT);
67025fdd593SJeykumar Sankaran 
67125fdd593SJeykumar Sankaran 		if (!meta)
67225fdd593SJeykumar Sankaran 			goto done;
67325fdd593SJeykumar Sankaran 
67425fdd593SJeykumar Sankaran 		layout->num_planes += 2;
67525fdd593SJeykumar Sankaran 		layout->plane_pitch[2] = VENUS_Y_META_STRIDE(color, width);
67625fdd593SJeykumar Sankaran 		y_meta_scanlines = VENUS_Y_META_SCANLINES(color, height);
67725fdd593SJeykumar Sankaran 		layout->plane_size[2] = MSM_MEDIA_ALIGN(layout->plane_pitch[2] *
67825fdd593SJeykumar Sankaran 			y_meta_scanlines, DPU_UBWC_PLANE_SIZE_ALIGNMENT);
67925fdd593SJeykumar Sankaran 
68025fdd593SJeykumar Sankaran 		layout->plane_pitch[3] = VENUS_UV_META_STRIDE(color, width);
68125fdd593SJeykumar Sankaran 		uv_meta_scanlines = VENUS_UV_META_SCANLINES(color, height);
68225fdd593SJeykumar Sankaran 		layout->plane_size[3] = MSM_MEDIA_ALIGN(layout->plane_pitch[3] *
68325fdd593SJeykumar Sankaran 			uv_meta_scanlines, DPU_UBWC_PLANE_SIZE_ALIGNMENT);
68425fdd593SJeykumar Sankaran 
68525fdd593SJeykumar Sankaran 	} else {
68625fdd593SJeykumar Sankaran 		uint32_t rgb_scanlines, rgb_meta_scanlines;
68725fdd593SJeykumar Sankaran 
68825fdd593SJeykumar Sankaran 		layout->num_planes = 1;
68925fdd593SJeykumar Sankaran 
69025fdd593SJeykumar Sankaran 		layout->plane_pitch[0] = VENUS_RGB_STRIDE(color, width);
69125fdd593SJeykumar Sankaran 		rgb_scanlines = VENUS_RGB_SCANLINES(color, height);
69225fdd593SJeykumar Sankaran 		layout->plane_size[0] = MSM_MEDIA_ALIGN(layout->plane_pitch[0] *
69325fdd593SJeykumar Sankaran 			rgb_scanlines, DPU_UBWC_PLANE_SIZE_ALIGNMENT);
69425fdd593SJeykumar Sankaran 
69525fdd593SJeykumar Sankaran 		if (!meta)
69625fdd593SJeykumar Sankaran 			goto done;
69725fdd593SJeykumar Sankaran 		layout->num_planes += 2;
69825fdd593SJeykumar Sankaran 		layout->plane_pitch[2] = VENUS_RGB_META_STRIDE(color, width);
69925fdd593SJeykumar Sankaran 		rgb_meta_scanlines = VENUS_RGB_META_SCANLINES(color, height);
70025fdd593SJeykumar Sankaran 		layout->plane_size[2] = MSM_MEDIA_ALIGN(layout->plane_pitch[2] *
70125fdd593SJeykumar Sankaran 			rgb_meta_scanlines, DPU_UBWC_PLANE_SIZE_ALIGNMENT);
70225fdd593SJeykumar Sankaran 	}
70325fdd593SJeykumar Sankaran 
70425fdd593SJeykumar Sankaran done:
70525fdd593SJeykumar Sankaran 	for (i = 0; i < DPU_MAX_PLANES; i++)
70625fdd593SJeykumar Sankaran 		layout->total_size += layout->plane_size[i];
70725fdd593SJeykumar Sankaran 
70825fdd593SJeykumar Sankaran 	return 0;
70925fdd593SJeykumar Sankaran }
71025fdd593SJeykumar Sankaran 
_dpu_format_get_plane_sizes_linear(const struct dpu_format * fmt,const uint32_t width,const uint32_t height,struct dpu_hw_fmt_layout * layout,const uint32_t * pitches)71125fdd593SJeykumar Sankaran static int _dpu_format_get_plane_sizes_linear(
71225fdd593SJeykumar Sankaran 		const struct dpu_format *fmt,
71325fdd593SJeykumar Sankaran 		const uint32_t width,
71425fdd593SJeykumar Sankaran 		const uint32_t height,
71525fdd593SJeykumar Sankaran 		struct dpu_hw_fmt_layout *layout,
71625fdd593SJeykumar Sankaran 		const uint32_t *pitches)
71725fdd593SJeykumar Sankaran {
71825fdd593SJeykumar Sankaran 	int i;
71925fdd593SJeykumar Sankaran 
72025fdd593SJeykumar Sankaran 	memset(layout, 0, sizeof(struct dpu_hw_fmt_layout));
72125fdd593SJeykumar Sankaran 	layout->format = fmt;
72225fdd593SJeykumar Sankaran 	layout->width = width;
72325fdd593SJeykumar Sankaran 	layout->height = height;
72425fdd593SJeykumar Sankaran 	layout->num_planes = fmt->num_planes;
72525fdd593SJeykumar Sankaran 
72625fdd593SJeykumar Sankaran 	/* Due to memset above, only need to set planes of interest */
72725fdd593SJeykumar Sankaran 	if (fmt->fetch_planes == DPU_PLANE_INTERLEAVED) {
72825fdd593SJeykumar Sankaran 		layout->num_planes = 1;
72925fdd593SJeykumar Sankaran 		layout->plane_size[0] = width * height * layout->format->bpp;
73025fdd593SJeykumar Sankaran 		layout->plane_pitch[0] = width * layout->format->bpp;
73125fdd593SJeykumar Sankaran 	} else {
73225fdd593SJeykumar Sankaran 		uint32_t v_subsample, h_subsample;
73325fdd593SJeykumar Sankaran 		uint32_t chroma_samp;
73425fdd593SJeykumar Sankaran 		uint32_t bpp = 1;
73525fdd593SJeykumar Sankaran 
73625fdd593SJeykumar Sankaran 		chroma_samp = fmt->chroma_sample;
73725fdd593SJeykumar Sankaran 		_dpu_get_v_h_subsample_rate(chroma_samp, &v_subsample,
73825fdd593SJeykumar Sankaran 				&h_subsample);
73925fdd593SJeykumar Sankaran 
74025fdd593SJeykumar Sankaran 		if (width % h_subsample || height % v_subsample) {
74125fdd593SJeykumar Sankaran 			DRM_ERROR("mismatch in subsample vs dimensions\n");
74225fdd593SJeykumar Sankaran 			return -EINVAL;
74325fdd593SJeykumar Sankaran 		}
74425fdd593SJeykumar Sankaran 
74525fdd593SJeykumar Sankaran 		if ((fmt->base.pixel_format == DRM_FORMAT_NV12) &&
74625fdd593SJeykumar Sankaran 			(DPU_FORMAT_IS_DX(fmt)))
74725fdd593SJeykumar Sankaran 			bpp = 2;
74825fdd593SJeykumar Sankaran 		layout->plane_pitch[0] = width * bpp;
74925fdd593SJeykumar Sankaran 		layout->plane_pitch[1] = layout->plane_pitch[0] / h_subsample;
75025fdd593SJeykumar Sankaran 		layout->plane_size[0] = layout->plane_pitch[0] * height;
75125fdd593SJeykumar Sankaran 		layout->plane_size[1] = layout->plane_pitch[1] *
75225fdd593SJeykumar Sankaran 				(height / v_subsample);
75325fdd593SJeykumar Sankaran 
75425fdd593SJeykumar Sankaran 		if (fmt->fetch_planes == DPU_PLANE_PSEUDO_PLANAR) {
75525fdd593SJeykumar Sankaran 			layout->num_planes = 2;
75625fdd593SJeykumar Sankaran 			layout->plane_size[1] *= 2;
75725fdd593SJeykumar Sankaran 			layout->plane_pitch[1] *= 2;
75825fdd593SJeykumar Sankaran 		} else {
75925fdd593SJeykumar Sankaran 			/* planar */
76025fdd593SJeykumar Sankaran 			layout->num_planes = 3;
76125fdd593SJeykumar Sankaran 			layout->plane_size[2] = layout->plane_size[1];
76225fdd593SJeykumar Sankaran 			layout->plane_pitch[2] = layout->plane_pitch[1];
76325fdd593SJeykumar Sankaran 		}
76425fdd593SJeykumar Sankaran 	}
76525fdd593SJeykumar Sankaran 
76625fdd593SJeykumar Sankaran 	/*
76725fdd593SJeykumar Sankaran 	 * linear format: allow user allocated pitches if they are greater than
76825fdd593SJeykumar Sankaran 	 * the requirement.
76925fdd593SJeykumar Sankaran 	 * ubwc format: pitch values are computed uniformly across
77025fdd593SJeykumar Sankaran 	 * all the components based on ubwc specifications.
77125fdd593SJeykumar Sankaran 	 */
77225fdd593SJeykumar Sankaran 	for (i = 0; i < layout->num_planes && i < DPU_MAX_PLANES; ++i) {
77325fdd593SJeykumar Sankaran 		if (pitches && layout->plane_pitch[i] < pitches[i])
77425fdd593SJeykumar Sankaran 			layout->plane_pitch[i] = pitches[i];
77525fdd593SJeykumar Sankaran 	}
77625fdd593SJeykumar Sankaran 
77725fdd593SJeykumar Sankaran 	for (i = 0; i < DPU_MAX_PLANES; i++)
77825fdd593SJeykumar Sankaran 		layout->total_size += layout->plane_size[i];
77925fdd593SJeykumar Sankaran 
78025fdd593SJeykumar Sankaran 	return 0;
78125fdd593SJeykumar Sankaran }
78225fdd593SJeykumar Sankaran 
dpu_format_get_plane_sizes(const struct dpu_format * fmt,const uint32_t w,const uint32_t h,struct dpu_hw_fmt_layout * layout,const uint32_t * pitches)783fba33caeSJordan Crouse static int dpu_format_get_plane_sizes(
78425fdd593SJeykumar Sankaran 		const struct dpu_format *fmt,
78525fdd593SJeykumar Sankaran 		const uint32_t w,
78625fdd593SJeykumar Sankaran 		const uint32_t h,
78725fdd593SJeykumar Sankaran 		struct dpu_hw_fmt_layout *layout,
78825fdd593SJeykumar Sankaran 		const uint32_t *pitches)
78925fdd593SJeykumar Sankaran {
79025fdd593SJeykumar Sankaran 	if (!layout || !fmt) {
79125fdd593SJeykumar Sankaran 		DRM_ERROR("invalid pointer\n");
79225fdd593SJeykumar Sankaran 		return -EINVAL;
79325fdd593SJeykumar Sankaran 	}
79425fdd593SJeykumar Sankaran 
79525fdd593SJeykumar Sankaran 	if ((w > DPU_MAX_IMG_WIDTH) || (h > DPU_MAX_IMG_HEIGHT)) {
79625fdd593SJeykumar Sankaran 		DRM_ERROR("image dimensions outside max range\n");
79725fdd593SJeykumar Sankaran 		return -ERANGE;
79825fdd593SJeykumar Sankaran 	}
79925fdd593SJeykumar Sankaran 
80025fdd593SJeykumar Sankaran 	if (DPU_FORMAT_IS_UBWC(fmt) || DPU_FORMAT_IS_TILE(fmt))
80125fdd593SJeykumar Sankaran 		return _dpu_format_get_plane_sizes_ubwc(fmt, w, h, layout);
80225fdd593SJeykumar Sankaran 
80325fdd593SJeykumar Sankaran 	return _dpu_format_get_plane_sizes_linear(fmt, w, h, layout, pitches);
80425fdd593SJeykumar Sankaran }
80525fdd593SJeykumar Sankaran 
_dpu_format_populate_addrs_ubwc(struct msm_gem_address_space * aspace,struct drm_framebuffer * fb,struct dpu_hw_fmt_layout * layout)80625fdd593SJeykumar Sankaran static int _dpu_format_populate_addrs_ubwc(
80725fdd593SJeykumar Sankaran 		struct msm_gem_address_space *aspace,
80825fdd593SJeykumar Sankaran 		struct drm_framebuffer *fb,
80925fdd593SJeykumar Sankaran 		struct dpu_hw_fmt_layout *layout)
81025fdd593SJeykumar Sankaran {
81125fdd593SJeykumar Sankaran 	uint32_t base_addr = 0;
81225fdd593SJeykumar Sankaran 	bool meta;
81325fdd593SJeykumar Sankaran 
81425fdd593SJeykumar Sankaran 	if (!fb || !layout) {
81525fdd593SJeykumar Sankaran 		DRM_ERROR("invalid pointers\n");
81625fdd593SJeykumar Sankaran 		return -EINVAL;
81725fdd593SJeykumar Sankaran 	}
81825fdd593SJeykumar Sankaran 
81925fdd593SJeykumar Sankaran 	if (aspace)
82025fdd593SJeykumar Sankaran 		base_addr = msm_framebuffer_iova(fb, aspace, 0);
82125fdd593SJeykumar Sankaran 	if (!base_addr) {
82225fdd593SJeykumar Sankaran 		DRM_ERROR("failed to retrieve base addr\n");
82325fdd593SJeykumar Sankaran 		return -EFAULT;
82425fdd593SJeykumar Sankaran 	}
82525fdd593SJeykumar Sankaran 
82625fdd593SJeykumar Sankaran 	meta = DPU_FORMAT_IS_UBWC(layout->format);
82725fdd593SJeykumar Sankaran 
82825fdd593SJeykumar Sankaran 	/* Per-format logic for verifying active planes */
82925fdd593SJeykumar Sankaran 	if (DPU_FORMAT_IS_YUV(layout->format)) {
83025fdd593SJeykumar Sankaran 		/************************************************/
83125fdd593SJeykumar Sankaran 		/*      UBWC            **                      */
83225fdd593SJeykumar Sankaran 		/*      buffer          **      DPU PLANE       */
83325fdd593SJeykumar Sankaran 		/*      format          **                      */
83425fdd593SJeykumar Sankaran 		/************************************************/
83525fdd593SJeykumar Sankaran 		/* -------------------  ** -------------------- */
83625fdd593SJeykumar Sankaran 		/* |      Y meta     |  ** |    Y bitstream   | */
83725fdd593SJeykumar Sankaran 		/* |       data      |  ** |       plane      | */
83825fdd593SJeykumar Sankaran 		/* -------------------  ** -------------------- */
83925fdd593SJeykumar Sankaran 		/* |    Y bitstream  |  ** |  CbCr bitstream  | */
84025fdd593SJeykumar Sankaran 		/* |       data      |  ** |       plane      | */
84125fdd593SJeykumar Sankaran 		/* -------------------  ** -------------------- */
84225fdd593SJeykumar Sankaran 		/* |   Cbcr metadata |  ** |       Y meta     | */
84325fdd593SJeykumar Sankaran 		/* |       data      |  ** |       plane      | */
84425fdd593SJeykumar Sankaran 		/* -------------------  ** -------------------- */
84525fdd593SJeykumar Sankaran 		/* |  CbCr bitstream |  ** |     CbCr meta    | */
84625fdd593SJeykumar Sankaran 		/* |       data      |  ** |       plane      | */
84725fdd593SJeykumar Sankaran 		/* -------------------  ** -------------------- */
84825fdd593SJeykumar Sankaran 		/************************************************/
84925fdd593SJeykumar Sankaran 
85025fdd593SJeykumar Sankaran 		/* configure Y bitstream plane */
85125fdd593SJeykumar Sankaran 		layout->plane_addr[0] = base_addr + layout->plane_size[2];
85225fdd593SJeykumar Sankaran 
85325fdd593SJeykumar Sankaran 		/* configure CbCr bitstream plane */
85425fdd593SJeykumar Sankaran 		layout->plane_addr[1] = base_addr + layout->plane_size[0]
85525fdd593SJeykumar Sankaran 			+ layout->plane_size[2] + layout->plane_size[3];
85625fdd593SJeykumar Sankaran 
85725fdd593SJeykumar Sankaran 		if (!meta)
8580841851fSSean Paul 			return 0;
85925fdd593SJeykumar Sankaran 
86025fdd593SJeykumar Sankaran 		/* configure Y metadata plane */
86125fdd593SJeykumar Sankaran 		layout->plane_addr[2] = base_addr;
86225fdd593SJeykumar Sankaran 
86325fdd593SJeykumar Sankaran 		/* configure CbCr metadata plane */
86425fdd593SJeykumar Sankaran 		layout->plane_addr[3] = base_addr + layout->plane_size[0]
86525fdd593SJeykumar Sankaran 			+ layout->plane_size[2];
86625fdd593SJeykumar Sankaran 
86725fdd593SJeykumar Sankaran 	} else {
86825fdd593SJeykumar Sankaran 		/************************************************/
86925fdd593SJeykumar Sankaran 		/*      UBWC            **                      */
87025fdd593SJeykumar Sankaran 		/*      buffer          **      DPU PLANE       */
87125fdd593SJeykumar Sankaran 		/*      format          **                      */
87225fdd593SJeykumar Sankaran 		/************************************************/
87325fdd593SJeykumar Sankaran 		/* -------------------  ** -------------------- */
87425fdd593SJeykumar Sankaran 		/* |      RGB meta   |  ** |   RGB bitstream  | */
87525fdd593SJeykumar Sankaran 		/* |       data      |  ** |       plane      | */
87625fdd593SJeykumar Sankaran 		/* -------------------  ** -------------------- */
87725fdd593SJeykumar Sankaran 		/* |  RGB bitstream  |  ** |       NONE       | */
87825fdd593SJeykumar Sankaran 		/* |       data      |  ** |                  | */
87925fdd593SJeykumar Sankaran 		/* -------------------  ** -------------------- */
88025fdd593SJeykumar Sankaran 		/*                      ** |     RGB meta     | */
88125fdd593SJeykumar Sankaran 		/*                      ** |       plane      | */
88225fdd593SJeykumar Sankaran 		/*                      ** -------------------- */
88325fdd593SJeykumar Sankaran 		/************************************************/
88425fdd593SJeykumar Sankaran 
88525fdd593SJeykumar Sankaran 		layout->plane_addr[0] = base_addr + layout->plane_size[2];
88625fdd593SJeykumar Sankaran 		layout->plane_addr[1] = 0;
88725fdd593SJeykumar Sankaran 
88825fdd593SJeykumar Sankaran 		if (!meta)
8890841851fSSean Paul 			return 0;
89025fdd593SJeykumar Sankaran 
89125fdd593SJeykumar Sankaran 		layout->plane_addr[2] = base_addr;
89225fdd593SJeykumar Sankaran 		layout->plane_addr[3] = 0;
89325fdd593SJeykumar Sankaran 	}
89425fdd593SJeykumar Sankaran 	return 0;
89525fdd593SJeykumar Sankaran }
89625fdd593SJeykumar Sankaran 
_dpu_format_populate_addrs_linear(struct msm_gem_address_space * aspace,struct drm_framebuffer * fb,struct dpu_hw_fmt_layout * layout)89725fdd593SJeykumar Sankaran static int _dpu_format_populate_addrs_linear(
89825fdd593SJeykumar Sankaran 		struct msm_gem_address_space *aspace,
89925fdd593SJeykumar Sankaran 		struct drm_framebuffer *fb,
90025fdd593SJeykumar Sankaran 		struct dpu_hw_fmt_layout *layout)
90125fdd593SJeykumar Sankaran {
90225fdd593SJeykumar Sankaran 	unsigned int i;
90325fdd593SJeykumar Sankaran 
90425fdd593SJeykumar Sankaran 	/* Can now check the pitches given vs pitches expected */
90525fdd593SJeykumar Sankaran 	for (i = 0; i < layout->num_planes; ++i) {
90625fdd593SJeykumar Sankaran 		if (layout->plane_pitch[i] > fb->pitches[i]) {
90725fdd593SJeykumar Sankaran 			DRM_ERROR("plane %u expected pitch %u, fb %u\n",
90825fdd593SJeykumar Sankaran 				i, layout->plane_pitch[i], fb->pitches[i]);
90925fdd593SJeykumar Sankaran 			return -EINVAL;
91025fdd593SJeykumar Sankaran 		}
91125fdd593SJeykumar Sankaran 	}
91225fdd593SJeykumar Sankaran 
91325fdd593SJeykumar Sankaran 	/* Populate addresses for simple formats here */
91425fdd593SJeykumar Sankaran 	for (i = 0; i < layout->num_planes; ++i) {
91525fdd593SJeykumar Sankaran 		if (aspace)
91625fdd593SJeykumar Sankaran 			layout->plane_addr[i] =
91725fdd593SJeykumar Sankaran 				msm_framebuffer_iova(fb, aspace, i);
91825fdd593SJeykumar Sankaran 		if (!layout->plane_addr[i]) {
91925fdd593SJeykumar Sankaran 			DRM_ERROR("failed to retrieve base addr\n");
92025fdd593SJeykumar Sankaran 			return -EFAULT;
92125fdd593SJeykumar Sankaran 		}
92225fdd593SJeykumar Sankaran 	}
92325fdd593SJeykumar Sankaran 
92425fdd593SJeykumar Sankaran 	return 0;
92525fdd593SJeykumar Sankaran }
92625fdd593SJeykumar Sankaran 
dpu_format_populate_layout(struct msm_gem_address_space * aspace,struct drm_framebuffer * fb,struct dpu_hw_fmt_layout * layout)92725fdd593SJeykumar Sankaran int dpu_format_populate_layout(
92825fdd593SJeykumar Sankaran 		struct msm_gem_address_space *aspace,
92925fdd593SJeykumar Sankaran 		struct drm_framebuffer *fb,
93025fdd593SJeykumar Sankaran 		struct dpu_hw_fmt_layout *layout)
93125fdd593SJeykumar Sankaran {
932*5d1b072aSDmitry Baryshkov 	int ret;
93325fdd593SJeykumar Sankaran 
93425fdd593SJeykumar Sankaran 	if (!fb || !layout) {
93525fdd593SJeykumar Sankaran 		DRM_ERROR("invalid arguments\n");
93625fdd593SJeykumar Sankaran 		return -EINVAL;
93725fdd593SJeykumar Sankaran 	}
93825fdd593SJeykumar Sankaran 
93925fdd593SJeykumar Sankaran 	if ((fb->width > DPU_MAX_IMG_WIDTH) ||
94025fdd593SJeykumar Sankaran 			(fb->height > DPU_MAX_IMG_HEIGHT)) {
94125fdd593SJeykumar Sankaran 		DRM_ERROR("image dimensions outside max range\n");
94225fdd593SJeykumar Sankaran 		return -ERANGE;
94325fdd593SJeykumar Sankaran 	}
94425fdd593SJeykumar Sankaran 
94525fdd593SJeykumar Sankaran 	layout->format = to_dpu_format(msm_framebuffer_format(fb));
94625fdd593SJeykumar Sankaran 
94725fdd593SJeykumar Sankaran 	/* Populate the plane sizes etc via get_format */
94825fdd593SJeykumar Sankaran 	ret = dpu_format_get_plane_sizes(layout->format, fb->width, fb->height,
94925fdd593SJeykumar Sankaran 			layout, fb->pitches);
95025fdd593SJeykumar Sankaran 	if (ret)
95125fdd593SJeykumar Sankaran 		return ret;
95225fdd593SJeykumar Sankaran 
95325fdd593SJeykumar Sankaran 	/* Populate the addresses given the fb */
95425fdd593SJeykumar Sankaran 	if (DPU_FORMAT_IS_UBWC(layout->format) ||
95525fdd593SJeykumar Sankaran 			DPU_FORMAT_IS_TILE(layout->format))
95625fdd593SJeykumar Sankaran 		ret = _dpu_format_populate_addrs_ubwc(aspace, fb, layout);
95725fdd593SJeykumar Sankaran 	else
95825fdd593SJeykumar Sankaran 		ret = _dpu_format_populate_addrs_linear(aspace, fb, layout);
95925fdd593SJeykumar Sankaran 
96025fdd593SJeykumar Sankaran 	return ret;
96125fdd593SJeykumar Sankaran }
96225fdd593SJeykumar Sankaran 
dpu_format_check_modified_format(const struct msm_kms * kms,const struct msm_format * msm_fmt,const struct drm_mode_fb_cmd2 * cmd,struct drm_gem_object ** bos)96325fdd593SJeykumar Sankaran int dpu_format_check_modified_format(
96425fdd593SJeykumar Sankaran 		const struct msm_kms *kms,
96525fdd593SJeykumar Sankaran 		const struct msm_format *msm_fmt,
96625fdd593SJeykumar Sankaran 		const struct drm_mode_fb_cmd2 *cmd,
96725fdd593SJeykumar Sankaran 		struct drm_gem_object **bos)
96825fdd593SJeykumar Sankaran {
96905c452c1SMaxime Ripard 	const struct drm_format_info *info;
97025fdd593SJeykumar Sankaran 	const struct dpu_format *fmt;
97125fdd593SJeykumar Sankaran 	struct dpu_hw_fmt_layout layout;
97225fdd593SJeykumar Sankaran 	uint32_t bos_total_size = 0;
97305c452c1SMaxime Ripard 	int ret, i;
97425fdd593SJeykumar Sankaran 
97525fdd593SJeykumar Sankaran 	if (!msm_fmt || !cmd || !bos) {
97625fdd593SJeykumar Sankaran 		DRM_ERROR("invalid arguments\n");
97725fdd593SJeykumar Sankaran 		return -EINVAL;
97825fdd593SJeykumar Sankaran 	}
97925fdd593SJeykumar Sankaran 
98025fdd593SJeykumar Sankaran 	fmt = to_dpu_format(msm_fmt);
98105c452c1SMaxime Ripard 	info = drm_format_info(fmt->base.pixel_format);
98205c452c1SMaxime Ripard 	if (!info)
98305c452c1SMaxime Ripard 		return -EINVAL;
98425fdd593SJeykumar Sankaran 
98525fdd593SJeykumar Sankaran 	ret = dpu_format_get_plane_sizes(fmt, cmd->width, cmd->height,
98625fdd593SJeykumar Sankaran 			&layout, cmd->pitches);
98725fdd593SJeykumar Sankaran 	if (ret)
98825fdd593SJeykumar Sankaran 		return ret;
98925fdd593SJeykumar Sankaran 
99005c452c1SMaxime Ripard 	for (i = 0; i < info->num_planes; i++) {
99125fdd593SJeykumar Sankaran 		if (!bos[i]) {
99225fdd593SJeykumar Sankaran 			DRM_ERROR("invalid handle for plane %d\n", i);
99325fdd593SJeykumar Sankaran 			return -EINVAL;
99425fdd593SJeykumar Sankaran 		}
99525fdd593SJeykumar Sankaran 		if ((i == 0) || (bos[i] != bos[0]))
99625fdd593SJeykumar Sankaran 			bos_total_size += bos[i]->size;
99725fdd593SJeykumar Sankaran 	}
99825fdd593SJeykumar Sankaran 
99925fdd593SJeykumar Sankaran 	if (bos_total_size < layout.total_size) {
100025fdd593SJeykumar Sankaran 		DRM_ERROR("buffers total size too small %u expected %u\n",
100125fdd593SJeykumar Sankaran 				bos_total_size, layout.total_size);
100225fdd593SJeykumar Sankaran 		return -EINVAL;
100325fdd593SJeykumar Sankaran 	}
100425fdd593SJeykumar Sankaran 
100525fdd593SJeykumar Sankaran 	return 0;
100625fdd593SJeykumar Sankaran }
100725fdd593SJeykumar Sankaran 
dpu_get_dpu_format_ext(const uint32_t format,const uint64_t modifier)100825fdd593SJeykumar Sankaran const struct dpu_format *dpu_get_dpu_format_ext(
100925fdd593SJeykumar Sankaran 		const uint32_t format,
101025fdd593SJeykumar Sankaran 		const uint64_t modifier)
101125fdd593SJeykumar Sankaran {
101225fdd593SJeykumar Sankaran 	uint32_t i = 0;
101325fdd593SJeykumar Sankaran 	const struct dpu_format *fmt = NULL;
101425fdd593SJeykumar Sankaran 	const struct dpu_format *map = NULL;
101525fdd593SJeykumar Sankaran 	ssize_t map_size = 0;
101625fdd593SJeykumar Sankaran 
101725fdd593SJeykumar Sankaran 	/*
101825fdd593SJeykumar Sankaran 	 * Currently only support exactly zero or one modifier.
101925fdd593SJeykumar Sankaran 	 * All planes use the same modifier.
102025fdd593SJeykumar Sankaran 	 */
10215b702d78SStephen Boyd 	DRM_DEBUG_ATOMIC("plane format modifier 0x%llX\n", modifier);
102225fdd593SJeykumar Sankaran 
102325fdd593SJeykumar Sankaran 	switch (modifier) {
102425fdd593SJeykumar Sankaran 	case 0:
102525fdd593SJeykumar Sankaran 		map = dpu_format_map;
102625fdd593SJeykumar Sankaran 		map_size = ARRAY_SIZE(dpu_format_map);
102725fdd593SJeykumar Sankaran 		break;
102825fdd593SJeykumar Sankaran 	case DRM_FORMAT_MOD_QCOM_COMPRESSED:
102925fdd593SJeykumar Sankaran 		map = dpu_format_map_ubwc;
103025fdd593SJeykumar Sankaran 		map_size = ARRAY_SIZE(dpu_format_map_ubwc);
10315b702d78SStephen Boyd 		DRM_DEBUG_ATOMIC("found fmt: %4.4s  DRM_FORMAT_MOD_QCOM_COMPRESSED\n",
103225fdd593SJeykumar Sankaran 				(char *)&format);
103325fdd593SJeykumar Sankaran 		break;
103425fdd593SJeykumar Sankaran 	default:
103525fdd593SJeykumar Sankaran 		DPU_ERROR("unsupported format modifier %llX\n", modifier);
103625fdd593SJeykumar Sankaran 		return NULL;
103725fdd593SJeykumar Sankaran 	}
103825fdd593SJeykumar Sankaran 
103925fdd593SJeykumar Sankaran 	for (i = 0; i < map_size; i++) {
104025fdd593SJeykumar Sankaran 		if (format == map[i].base.pixel_format) {
104125fdd593SJeykumar Sankaran 			fmt = &map[i];
104225fdd593SJeykumar Sankaran 			break;
104325fdd593SJeykumar Sankaran 		}
104425fdd593SJeykumar Sankaran 	}
104525fdd593SJeykumar Sankaran 
104625fdd593SJeykumar Sankaran 	if (fmt == NULL)
104725fdd593SJeykumar Sankaran 		DPU_ERROR("unsupported fmt: %4.4s modifier 0x%llX\n",
104825fdd593SJeykumar Sankaran 			(char *)&format, modifier);
104925fdd593SJeykumar Sankaran 	else
10505b702d78SStephen Boyd 		DRM_DEBUG_ATOMIC("fmt %4.4s mod 0x%llX ubwc %d yuv %d\n",
105125fdd593SJeykumar Sankaran 				(char *)&format, modifier,
105225fdd593SJeykumar Sankaran 				DPU_FORMAT_IS_UBWC(fmt),
105325fdd593SJeykumar Sankaran 				DPU_FORMAT_IS_YUV(fmt));
105425fdd593SJeykumar Sankaran 
105525fdd593SJeykumar Sankaran 	return fmt;
105625fdd593SJeykumar Sankaran }
105725fdd593SJeykumar Sankaran 
dpu_get_msm_format(struct msm_kms * kms,const uint32_t format,const uint64_t modifiers)105825fdd593SJeykumar Sankaran const struct msm_format *dpu_get_msm_format(
105925fdd593SJeykumar Sankaran 		struct msm_kms *kms,
106025fdd593SJeykumar Sankaran 		const uint32_t format,
106125fdd593SJeykumar Sankaran 		const uint64_t modifiers)
106225fdd593SJeykumar Sankaran {
106325fdd593SJeykumar Sankaran 	const struct dpu_format *fmt = dpu_get_dpu_format_ext(format,
106425fdd593SJeykumar Sankaran 			modifiers);
106525fdd593SJeykumar Sankaran 	if (fmt)
106625fdd593SJeykumar Sankaran 		return &fmt->base;
106725fdd593SJeykumar Sankaran 	return NULL;
106825fdd593SJeykumar Sankaran }
1069