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