1*61890ccaSMoudy Ho /* SPDX-License-Identifier: GPL-2.0-only */
2*61890ccaSMoudy Ho /*
3*61890ccaSMoudy Ho  * Copyright (c) 2022 MediaTek Inc.
4*61890ccaSMoudy Ho  * Author: Ping-Hsun Wu <ping-hsun.wu@mediatek.com>
5*61890ccaSMoudy Ho  */
6*61890ccaSMoudy Ho 
7*61890ccaSMoudy Ho #ifndef __MTK_MDP3_REGS_H__
8*61890ccaSMoudy Ho #define __MTK_MDP3_REGS_H__
9*61890ccaSMoudy Ho 
10*61890ccaSMoudy Ho #include <linux/videodev2.h>
11*61890ccaSMoudy Ho #include <media/videobuf2-core.h>
12*61890ccaSMoudy Ho #include "mtk-img-ipi.h"
13*61890ccaSMoudy Ho 
14*61890ccaSMoudy Ho /*
15*61890ccaSMoudy Ho  * MDP native color code
16*61890ccaSMoudy Ho  * Plane count: 1, 2, 3
17*61890ccaSMoudy Ho  * H-subsample: 0, 1, 2
18*61890ccaSMoudy Ho  * V-subsample: 0, 1
19*61890ccaSMoudy Ho  * Color group: 0-RGB, 1-YUV, 2-raw
20*61890ccaSMoudy Ho  */
21*61890ccaSMoudy Ho #define MDP_COLOR(PACKED, LOOSE, VIDEO, PLANE, HF, VF, BITS, GROUP, SWAP, ID)\
22*61890ccaSMoudy Ho 	(((PACKED) << 27) | ((LOOSE) << 26) | ((VIDEO) << 23) |\
23*61890ccaSMoudy Ho 	 ((PLANE) << 21) | ((HF) << 19) | ((VF) << 18) | ((BITS) << 8) |\
24*61890ccaSMoudy Ho 	 ((GROUP) << 6) | ((SWAP) << 5) | ((ID) << 0))
25*61890ccaSMoudy Ho 
26*61890ccaSMoudy Ho #define MDP_COLOR_IS_10BIT_PACKED(c)	((0x08000000 & (c)) >> 27)
27*61890ccaSMoudy Ho #define MDP_COLOR_IS_10BIT_LOOSE(c)	(((0x0c000000 & (c)) >> 26) == 1)
28*61890ccaSMoudy Ho #define MDP_COLOR_IS_10BIT_TILE(c)	(((0x0c000000 & (c)) >> 26) == 3)
29*61890ccaSMoudy Ho #define MDP_COLOR_IS_UFP(c)		((0x02000000 & (c)) >> 25)
30*61890ccaSMoudy Ho #define MDP_COLOR_IS_INTERLACED(c)	((0x01000000 & (c)) >> 24)
31*61890ccaSMoudy Ho #define MDP_COLOR_IS_BLOCK_MODE(c)	((0x00800000 & (c)) >> 23)
32*61890ccaSMoudy Ho #define MDP_COLOR_GET_PLANE_COUNT(c)	((0x00600000 & (c)) >> 21)
33*61890ccaSMoudy Ho #define MDP_COLOR_GET_H_SUBSAMPLE(c)	((0x00180000 & (c)) >> 19)
34*61890ccaSMoudy Ho #define MDP_COLOR_GET_V_SUBSAMPLE(c)	((0x00040000 & (c)) >> 18)
35*61890ccaSMoudy Ho #define MDP_COLOR_BITS_PER_PIXEL(c)	((0x0003ff00 & (c)) >>  8)
36*61890ccaSMoudy Ho #define MDP_COLOR_GET_GROUP(c)		((0x000000c0 & (c)) >>  6)
37*61890ccaSMoudy Ho #define MDP_COLOR_IS_SWAPPED(c)		((0x00000020 & (c)) >>  5)
38*61890ccaSMoudy Ho #define MDP_COLOR_GET_UNIQUE_ID(c)	((0x0000001f & (c)) >>  0)
39*61890ccaSMoudy Ho #define MDP_COLOR_GET_HW_FORMAT(c)	((0x0000001f & (c)) >>  0)
40*61890ccaSMoudy Ho 
41*61890ccaSMoudy Ho #define MDP_COLOR_IS_RGB(c)		(MDP_COLOR_GET_GROUP(c) == 0)
42*61890ccaSMoudy Ho #define MDP_COLOR_IS_YUV(c)		(MDP_COLOR_GET_GROUP(c) == 1)
43*61890ccaSMoudy Ho 
44*61890ccaSMoudy Ho enum mdp_color {
45*61890ccaSMoudy Ho 	MDP_COLOR_UNKNOWN	= 0,
46*61890ccaSMoudy Ho 
47*61890ccaSMoudy Ho 	//MDP_COLOR_FULLG8,
48*61890ccaSMoudy Ho 	MDP_COLOR_FULLG8_RGGB	= MDP_COLOR(0, 0, 0, 1, 0, 0,  8, 2,  0, 21),
49*61890ccaSMoudy Ho 	MDP_COLOR_FULLG8_GRBG	= MDP_COLOR(0, 0, 0, 1, 0, 1,  8, 2,  0, 21),
50*61890ccaSMoudy Ho 	MDP_COLOR_FULLG8_GBRG	= MDP_COLOR(0, 0, 0, 1, 1, 0,  8, 2,  0, 21),
51*61890ccaSMoudy Ho 	MDP_COLOR_FULLG8_BGGR	= MDP_COLOR(0, 0, 0, 1, 1, 1,  8, 2,  0, 21),
52*61890ccaSMoudy Ho 	MDP_COLOR_FULLG8	= MDP_COLOR_FULLG8_BGGR,
53*61890ccaSMoudy Ho 
54*61890ccaSMoudy Ho 	//MDP_COLOR_FULLG10,
55*61890ccaSMoudy Ho 	MDP_COLOR_FULLG10_RGGB	= MDP_COLOR(0, 0, 0, 1, 0, 0, 10, 2,  0, 21),
56*61890ccaSMoudy Ho 	MDP_COLOR_FULLG10_GRBG	= MDP_COLOR(0, 0, 0, 1, 0, 1, 10, 2,  0, 21),
57*61890ccaSMoudy Ho 	MDP_COLOR_FULLG10_GBRG	= MDP_COLOR(0, 0, 0, 1, 1, 0, 10, 2,  0, 21),
58*61890ccaSMoudy Ho 	MDP_COLOR_FULLG10_BGGR	= MDP_COLOR(0, 0, 0, 1, 1, 1, 10, 2,  0, 21),
59*61890ccaSMoudy Ho 	MDP_COLOR_FULLG10	= MDP_COLOR_FULLG10_BGGR,
60*61890ccaSMoudy Ho 
61*61890ccaSMoudy Ho 	//MDP_COLOR_FULLG12,
62*61890ccaSMoudy Ho 	MDP_COLOR_FULLG12_RGGB	= MDP_COLOR(0, 0, 0, 1, 0, 0, 12, 2,  0, 21),
63*61890ccaSMoudy Ho 	MDP_COLOR_FULLG12_GRBG	= MDP_COLOR(0, 0, 0, 1, 0, 1, 12, 2,  0, 21),
64*61890ccaSMoudy Ho 	MDP_COLOR_FULLG12_GBRG	= MDP_COLOR(0, 0, 0, 1, 1, 0, 12, 2,  0, 21),
65*61890ccaSMoudy Ho 	MDP_COLOR_FULLG12_BGGR	= MDP_COLOR(0, 0, 0, 1, 1, 1, 12, 2,  0, 21),
66*61890ccaSMoudy Ho 	MDP_COLOR_FULLG12	= MDP_COLOR_FULLG12_BGGR,
67*61890ccaSMoudy Ho 
68*61890ccaSMoudy Ho 	//MDP_COLOR_FULLG14,
69*61890ccaSMoudy Ho 	MDP_COLOR_FULLG14_RGGB	= MDP_COLOR(0, 0, 0, 1, 0, 0, 14, 2,  0, 21),
70*61890ccaSMoudy Ho 	MDP_COLOR_FULLG14_GRBG	= MDP_COLOR(0, 0, 0, 1, 0, 1, 14, 2,  0, 21),
71*61890ccaSMoudy Ho 	MDP_COLOR_FULLG14_GBRG	= MDP_COLOR(0, 0, 0, 1, 1, 0, 14, 2,  0, 21),
72*61890ccaSMoudy Ho 	MDP_COLOR_FULLG14_BGGR	= MDP_COLOR(0, 0, 0, 1, 1, 1, 14, 2,  0, 21),
73*61890ccaSMoudy Ho 	MDP_COLOR_FULLG14	= MDP_COLOR_FULLG14_BGGR,
74*61890ccaSMoudy Ho 
75*61890ccaSMoudy Ho 	MDP_COLOR_UFO10		= MDP_COLOR(0, 0, 0, 1, 0, 0, 10, 2,  0, 24),
76*61890ccaSMoudy Ho 
77*61890ccaSMoudy Ho 	//MDP_COLOR_BAYER8,
78*61890ccaSMoudy Ho 	MDP_COLOR_BAYER8_RGGB	= MDP_COLOR(0, 0, 0, 1, 0, 0,  8, 2,  0, 20),
79*61890ccaSMoudy Ho 	MDP_COLOR_BAYER8_GRBG	= MDP_COLOR(0, 0, 0, 1, 0, 1,  8, 2,  0, 20),
80*61890ccaSMoudy Ho 	MDP_COLOR_BAYER8_GBRG	= MDP_COLOR(0, 0, 0, 1, 1, 0,  8, 2,  0, 20),
81*61890ccaSMoudy Ho 	MDP_COLOR_BAYER8_BGGR	= MDP_COLOR(0, 0, 0, 1, 1, 1,  8, 2,  0, 20),
82*61890ccaSMoudy Ho 	MDP_COLOR_BAYER8	= MDP_COLOR_BAYER8_BGGR,
83*61890ccaSMoudy Ho 
84*61890ccaSMoudy Ho 	//MDP_COLOR_BAYER10,
85*61890ccaSMoudy Ho 	MDP_COLOR_BAYER10_RGGB	= MDP_COLOR(0, 0, 0, 1, 0, 0, 10, 2,  0, 20),
86*61890ccaSMoudy Ho 	MDP_COLOR_BAYER10_GRBG	= MDP_COLOR(0, 0, 0, 1, 0, 1, 10, 2,  0, 20),
87*61890ccaSMoudy Ho 	MDP_COLOR_BAYER10_GBRG	= MDP_COLOR(0, 0, 0, 1, 1, 0, 10, 2,  0, 20),
88*61890ccaSMoudy Ho 	MDP_COLOR_BAYER10_BGGR	= MDP_COLOR(0, 0, 0, 1, 1, 1, 10, 2,  0, 20),
89*61890ccaSMoudy Ho 	MDP_COLOR_BAYER10	= MDP_COLOR_BAYER10_BGGR,
90*61890ccaSMoudy Ho 
91*61890ccaSMoudy Ho 	//MDP_COLOR_BAYER12,
92*61890ccaSMoudy Ho 	MDP_COLOR_BAYER12_RGGB	= MDP_COLOR(0, 0, 0, 1, 0, 0, 12, 2,  0, 20),
93*61890ccaSMoudy Ho 	MDP_COLOR_BAYER12_GRBG	= MDP_COLOR(0, 0, 0, 1, 0, 1, 12, 2,  0, 20),
94*61890ccaSMoudy Ho 	MDP_COLOR_BAYER12_GBRG	= MDP_COLOR(0, 0, 0, 1, 1, 0, 12, 2,  0, 20),
95*61890ccaSMoudy Ho 	MDP_COLOR_BAYER12_BGGR	= MDP_COLOR(0, 0, 0, 1, 1, 1, 12, 2,  0, 20),
96*61890ccaSMoudy Ho 	MDP_COLOR_BAYER12	= MDP_COLOR_BAYER12_BGGR,
97*61890ccaSMoudy Ho 
98*61890ccaSMoudy Ho 	//MDP_COLOR_BAYER14,
99*61890ccaSMoudy Ho 	MDP_COLOR_BAYER14_RGGB	= MDP_COLOR(0, 0, 0, 1, 0, 0, 14, 2,  0, 20),
100*61890ccaSMoudy Ho 	MDP_COLOR_BAYER14_GRBG	= MDP_COLOR(0, 0, 0, 1, 0, 1, 14, 2,  0, 20),
101*61890ccaSMoudy Ho 	MDP_COLOR_BAYER14_GBRG	= MDP_COLOR(0, 0, 0, 1, 1, 0, 14, 2,  0, 20),
102*61890ccaSMoudy Ho 	MDP_COLOR_BAYER14_BGGR	= MDP_COLOR(0, 0, 0, 1, 1, 1, 14, 2,  0, 20),
103*61890ccaSMoudy Ho 	MDP_COLOR_BAYER14	= MDP_COLOR_BAYER14_BGGR,
104*61890ccaSMoudy Ho 
105*61890ccaSMoudy Ho 	MDP_COLOR_RGB48		= MDP_COLOR(0, 0, 0, 1, 0, 0, 48, 0,  0, 23),
106*61890ccaSMoudy Ho 	/* For bayer+mono raw-16 */
107*61890ccaSMoudy Ho 	MDP_COLOR_RGB565_RAW	= MDP_COLOR(0, 0, 0, 1, 0, 0, 16, 2,  0, 0),
108*61890ccaSMoudy Ho 
109*61890ccaSMoudy Ho 	MDP_COLOR_BAYER8_UNPAK	= MDP_COLOR(0, 0, 0, 1, 0, 0,  8, 2,  0, 22),
110*61890ccaSMoudy Ho 	MDP_COLOR_BAYER10_UNPAK	= MDP_COLOR(0, 0, 0, 1, 0, 0, 10, 2,  0, 22),
111*61890ccaSMoudy Ho 	MDP_COLOR_BAYER12_UNPAK	= MDP_COLOR(0, 0, 0, 1, 0, 0, 12, 2,  0, 22),
112*61890ccaSMoudy Ho 	MDP_COLOR_BAYER14_UNPAK	= MDP_COLOR(0, 0, 0, 1, 0, 0, 14, 2,  0, 22),
113*61890ccaSMoudy Ho 
114*61890ccaSMoudy Ho 	/* Unified formats */
115*61890ccaSMoudy Ho 	MDP_COLOR_GREY		= MDP_COLOR(0, 0, 0, 1, 0, 0,  8, 1,  0, 7),
116*61890ccaSMoudy Ho 
117*61890ccaSMoudy Ho 	MDP_COLOR_RGB565	= MDP_COLOR(0, 0, 0, 1, 0, 0, 16, 0,  0, 0),
118*61890ccaSMoudy Ho 	MDP_COLOR_BGR565	= MDP_COLOR(0, 0, 0, 1, 0, 0, 16, 0,  1, 0),
119*61890ccaSMoudy Ho 	MDP_COLOR_RGB888	= MDP_COLOR(0, 0, 0, 1, 0, 0, 24, 0,  1, 1),
120*61890ccaSMoudy Ho 	MDP_COLOR_BGR888	= MDP_COLOR(0, 0, 0, 1, 0, 0, 24, 0,  0, 1),
121*61890ccaSMoudy Ho 	MDP_COLOR_RGBA8888	= MDP_COLOR(0, 0, 0, 1, 0, 0, 32, 0,  1, 2),
122*61890ccaSMoudy Ho 	MDP_COLOR_BGRA8888	= MDP_COLOR(0, 0, 0, 1, 0, 0, 32, 0,  0, 2),
123*61890ccaSMoudy Ho 	MDP_COLOR_ARGB8888	= MDP_COLOR(0, 0, 0, 1, 0, 0, 32, 0,  1, 3),
124*61890ccaSMoudy Ho 	MDP_COLOR_ABGR8888	= MDP_COLOR(0, 0, 0, 1, 0, 0, 32, 0,  0, 3),
125*61890ccaSMoudy Ho 
126*61890ccaSMoudy Ho 	MDP_COLOR_UYVY		= MDP_COLOR(0, 0, 0, 1, 1, 0, 16, 1,  0, 4),
127*61890ccaSMoudy Ho 	MDP_COLOR_VYUY		= MDP_COLOR(0, 0, 0, 1, 1, 0, 16, 1,  1, 4),
128*61890ccaSMoudy Ho 	MDP_COLOR_YUYV		= MDP_COLOR(0, 0, 0, 1, 1, 0, 16, 1,  0, 5),
129*61890ccaSMoudy Ho 	MDP_COLOR_YVYU		= MDP_COLOR(0, 0, 0, 1, 1, 0, 16, 1,  1, 5),
130*61890ccaSMoudy Ho 
131*61890ccaSMoudy Ho 	MDP_COLOR_I420		= MDP_COLOR(0, 0, 0, 3, 1, 1,  8, 1,  0, 8),
132*61890ccaSMoudy Ho 	MDP_COLOR_YV12		= MDP_COLOR(0, 0, 0, 3, 1, 1,  8, 1,  1, 8),
133*61890ccaSMoudy Ho 	MDP_COLOR_I422		= MDP_COLOR(0, 0, 0, 3, 1, 0,  8, 1,  0, 9),
134*61890ccaSMoudy Ho 	MDP_COLOR_YV16		= MDP_COLOR(0, 0, 0, 3, 1, 0,  8, 1,  1, 9),
135*61890ccaSMoudy Ho 	MDP_COLOR_I444		= MDP_COLOR(0, 0, 0, 3, 0, 0,  8, 1,  0, 10),
136*61890ccaSMoudy Ho 	MDP_COLOR_YV24		= MDP_COLOR(0, 0, 0, 3, 0, 0,  8, 1,  1, 10),
137*61890ccaSMoudy Ho 
138*61890ccaSMoudy Ho 	MDP_COLOR_NV12		= MDP_COLOR(0, 0, 0, 2, 1, 1,  8, 1,  0, 12),
139*61890ccaSMoudy Ho 	MDP_COLOR_NV21		= MDP_COLOR(0, 0, 0, 2, 1, 1,  8, 1,  1, 12),
140*61890ccaSMoudy Ho 	MDP_COLOR_NV16		= MDP_COLOR(0, 0, 0, 2, 1, 0,  8, 1,  0, 13),
141*61890ccaSMoudy Ho 	MDP_COLOR_NV61		= MDP_COLOR(0, 0, 0, 2, 1, 0,  8, 1,  1, 13),
142*61890ccaSMoudy Ho 	MDP_COLOR_NV24		= MDP_COLOR(0, 0, 0, 2, 0, 0,  8, 1,  0, 14),
143*61890ccaSMoudy Ho 	MDP_COLOR_NV42		= MDP_COLOR(0, 0, 0, 2, 0, 0,  8, 1,  1, 14),
144*61890ccaSMoudy Ho 
145*61890ccaSMoudy Ho 	/* MediaTek proprietary formats */
146*61890ccaSMoudy Ho 	/* UFO encoded block mode */
147*61890ccaSMoudy Ho 	MDP_COLOR_420_BLK_UFO	= MDP_COLOR(0, 0, 5, 2, 1, 1, 256, 1, 0, 12),
148*61890ccaSMoudy Ho 	/* Block mode */
149*61890ccaSMoudy Ho 	MDP_COLOR_420_BLK	= MDP_COLOR(0, 0, 1, 2, 1, 1, 256, 1, 0, 12),
150*61890ccaSMoudy Ho 	/* Block mode + field mode */
151*61890ccaSMoudy Ho 	MDP_COLOR_420_BLKI	= MDP_COLOR(0, 0, 3, 2, 1, 1, 256, 1, 0, 12),
152*61890ccaSMoudy Ho 	/* Block mode */
153*61890ccaSMoudy Ho 	MDP_COLOR_422_BLK	= MDP_COLOR(0, 0, 1, 1, 1, 0, 512, 1, 0, 4),
154*61890ccaSMoudy Ho 
155*61890ccaSMoudy Ho 	MDP_COLOR_IYU2		= MDP_COLOR(0, 0, 0, 1, 0, 0, 24,  1, 0, 25),
156*61890ccaSMoudy Ho 	MDP_COLOR_YUV444	= MDP_COLOR(0, 0, 0, 1, 0, 0, 24,  1, 0, 30),
157*61890ccaSMoudy Ho 
158*61890ccaSMoudy Ho 	/* Packed 10-bit formats */
159*61890ccaSMoudy Ho 	MDP_COLOR_RGBA1010102	= MDP_COLOR(1, 0, 0, 1, 0, 0, 32,  0, 1, 2),
160*61890ccaSMoudy Ho 	MDP_COLOR_BGRA1010102	= MDP_COLOR(1, 0, 0, 1, 0, 0, 32,  0, 0, 2),
161*61890ccaSMoudy Ho 	/* Packed 10-bit UYVY */
162*61890ccaSMoudy Ho 	MDP_COLOR_UYVY_10P	= MDP_COLOR(1, 0, 0, 1, 1, 0, 20,  1, 0, 4),
163*61890ccaSMoudy Ho 	/* Packed 10-bit NV21 */
164*61890ccaSMoudy Ho 	MDP_COLOR_NV21_10P	= MDP_COLOR(1, 0, 0, 2, 1, 1, 10,  1, 1, 12),
165*61890ccaSMoudy Ho 	/* 10-bit block mode */
166*61890ccaSMoudy Ho 	MDP_COLOR_420_BLK_10_H	= MDP_COLOR(1, 0, 1, 2, 1, 1, 320, 1, 0, 12),
167*61890ccaSMoudy Ho 	/* 10-bit HEVC tile mode */
168*61890ccaSMoudy Ho 	MDP_COLOR_420_BLK_10_V	= MDP_COLOR(1, 1, 1, 2, 1, 1, 320, 1, 0, 12),
169*61890ccaSMoudy Ho 	/* UFO encoded 10-bit block mode */
170*61890ccaSMoudy Ho 	MDP_COLOR_420_BLK_U10_H	= MDP_COLOR(1, 0, 5, 2, 1, 1, 320, 1, 0, 12),
171*61890ccaSMoudy Ho 	/* UFO encoded 10-bit HEVC tile mode */
172*61890ccaSMoudy Ho 	MDP_COLOR_420_BLK_U10_V	= MDP_COLOR(1, 1, 5, 2, 1, 1, 320, 1, 0, 12),
173*61890ccaSMoudy Ho 
174*61890ccaSMoudy Ho 	/* Loose 10-bit formats */
175*61890ccaSMoudy Ho 	MDP_COLOR_UYVY_10L	= MDP_COLOR(0, 1, 0, 1, 1, 0, 20,  1, 0, 4),
176*61890ccaSMoudy Ho 	MDP_COLOR_VYUY_10L	= MDP_COLOR(0, 1, 0, 1, 1, 0, 20,  1, 1, 4),
177*61890ccaSMoudy Ho 	MDP_COLOR_YUYV_10L	= MDP_COLOR(0, 1, 0, 1, 1, 0, 20,  1, 0, 5),
178*61890ccaSMoudy Ho 	MDP_COLOR_YVYU_10L	= MDP_COLOR(0, 1, 0, 1, 1, 0, 20,  1, 1, 5),
179*61890ccaSMoudy Ho 	MDP_COLOR_NV12_10L	= MDP_COLOR(0, 1, 0, 2, 1, 1, 10,  1, 0, 12),
180*61890ccaSMoudy Ho 	MDP_COLOR_NV21_10L	= MDP_COLOR(0, 1, 0, 2, 1, 1, 10,  1, 1, 12),
181*61890ccaSMoudy Ho 	MDP_COLOR_NV16_10L	= MDP_COLOR(0, 1, 0, 2, 1, 0, 10,  1, 0, 13),
182*61890ccaSMoudy Ho 	MDP_COLOR_NV61_10L	= MDP_COLOR(0, 1, 0, 2, 1, 0, 10,  1, 1, 13),
183*61890ccaSMoudy Ho 	MDP_COLOR_YV12_10L	= MDP_COLOR(0, 1, 0, 3, 1, 1, 10,  1, 1, 8),
184*61890ccaSMoudy Ho 	MDP_COLOR_I420_10L	= MDP_COLOR(0, 1, 0, 3, 1, 1, 10,  1, 0, 8),
185*61890ccaSMoudy Ho };
186*61890ccaSMoudy Ho 
187*61890ccaSMoudy Ho static inline bool MDP_COLOR_IS_UV_COPLANE(enum mdp_color c)
188*61890ccaSMoudy Ho {
189*61890ccaSMoudy Ho 	return (MDP_COLOR_GET_PLANE_COUNT(c) == 2 && MDP_COLOR_IS_YUV(c));
190*61890ccaSMoudy Ho }
191*61890ccaSMoudy Ho 
192*61890ccaSMoudy Ho /* Minimum Y stride that is accepted by MDP HW */
193*61890ccaSMoudy Ho static inline u32 mdp_color_get_min_y_stride(enum mdp_color c, u32 width)
194*61890ccaSMoudy Ho {
195*61890ccaSMoudy Ho 	return ((MDP_COLOR_BITS_PER_PIXEL(c) * width) + 4) >> 3;
196*61890ccaSMoudy Ho }
197*61890ccaSMoudy Ho 
198*61890ccaSMoudy Ho /* Minimum UV stride that is accepted by MDP HW */
199*61890ccaSMoudy Ho static inline u32 mdp_color_get_min_uv_stride(enum mdp_color c, u32 width)
200*61890ccaSMoudy Ho {
201*61890ccaSMoudy Ho 	u32 min_stride;
202*61890ccaSMoudy Ho 
203*61890ccaSMoudy Ho 	if (MDP_COLOR_GET_PLANE_COUNT(c) == 1)
204*61890ccaSMoudy Ho 		return 0;
205*61890ccaSMoudy Ho 	min_stride = mdp_color_get_min_y_stride(c, width)
206*61890ccaSMoudy Ho 		>> MDP_COLOR_GET_H_SUBSAMPLE(c);
207*61890ccaSMoudy Ho 	if (MDP_COLOR_IS_UV_COPLANE(c) && !MDP_COLOR_IS_BLOCK_MODE(c))
208*61890ccaSMoudy Ho 		min_stride = min_stride * 2;
209*61890ccaSMoudy Ho 	return min_stride;
210*61890ccaSMoudy Ho }
211*61890ccaSMoudy Ho 
212*61890ccaSMoudy Ho /* Minimum Y plane size that is necessary in buffer */
213*61890ccaSMoudy Ho static inline u32 mdp_color_get_min_y_size(enum mdp_color c,
214*61890ccaSMoudy Ho 					   u32 width, u32 height)
215*61890ccaSMoudy Ho {
216*61890ccaSMoudy Ho 	if (MDP_COLOR_IS_BLOCK_MODE(c))
217*61890ccaSMoudy Ho 		return ((MDP_COLOR_BITS_PER_PIXEL(c) * width) >> 8) * height;
218*61890ccaSMoudy Ho 	return mdp_color_get_min_y_stride(c, width) * height;
219*61890ccaSMoudy Ho }
220*61890ccaSMoudy Ho 
221*61890ccaSMoudy Ho /* Minimum UV plane size that is necessary in buffer */
222*61890ccaSMoudy Ho static inline u32 mdp_color_get_min_uv_size(enum mdp_color c,
223*61890ccaSMoudy Ho 					    u32 width, u32 height)
224*61890ccaSMoudy Ho {
225*61890ccaSMoudy Ho 	height = height >> MDP_COLOR_GET_V_SUBSAMPLE(c);
226*61890ccaSMoudy Ho 	if (MDP_COLOR_IS_BLOCK_MODE(c) && (MDP_COLOR_GET_PLANE_COUNT(c) > 1))
227*61890ccaSMoudy Ho 		return ((MDP_COLOR_BITS_PER_PIXEL(c) * width) >> 8) * height;
228*61890ccaSMoudy Ho 	return mdp_color_get_min_uv_stride(c, width) * height;
229*61890ccaSMoudy Ho }
230*61890ccaSMoudy Ho 
231*61890ccaSMoudy Ho /* Combine colorspace, xfer_func, ycbcr_encoding, and quantization */
232*61890ccaSMoudy Ho enum mdp_ycbcr_profile {
233*61890ccaSMoudy Ho 	/* V4L2_YCBCR_ENC_601 and V4L2_QUANTIZATION_LIM_RANGE */
234*61890ccaSMoudy Ho 	MDP_YCBCR_PROFILE_BT601,
235*61890ccaSMoudy Ho 	/* V4L2_YCBCR_ENC_709 and V4L2_QUANTIZATION_LIM_RANGE */
236*61890ccaSMoudy Ho 	MDP_YCBCR_PROFILE_BT709,
237*61890ccaSMoudy Ho 	/* V4L2_YCBCR_ENC_601 and V4L2_QUANTIZATION_FULL_RANGE */
238*61890ccaSMoudy Ho 	MDP_YCBCR_PROFILE_JPEG,
239*61890ccaSMoudy Ho 	MDP_YCBCR_PROFILE_FULL_BT601 = MDP_YCBCR_PROFILE_JPEG,
240*61890ccaSMoudy Ho 
241*61890ccaSMoudy Ho 	/* Colorspaces not support for capture */
242*61890ccaSMoudy Ho 	/* V4L2_YCBCR_ENC_BT2020 and V4L2_QUANTIZATION_LIM_RANGE */
243*61890ccaSMoudy Ho 	MDP_YCBCR_PROFILE_BT2020,
244*61890ccaSMoudy Ho 	/* V4L2_YCBCR_ENC_709 and V4L2_QUANTIZATION_FULL_RANGE */
245*61890ccaSMoudy Ho 	MDP_YCBCR_PROFILE_FULL_BT709,
246*61890ccaSMoudy Ho 	/* V4L2_YCBCR_ENC_BT2020 and V4L2_QUANTIZATION_FULL_RANGE */
247*61890ccaSMoudy Ho 	MDP_YCBCR_PROFILE_FULL_BT2020,
248*61890ccaSMoudy Ho };
249*61890ccaSMoudy Ho 
250*61890ccaSMoudy Ho #define MDP_FMT_FLAG_OUTPUT	BIT(0)
251*61890ccaSMoudy Ho #define MDP_FMT_FLAG_CAPTURE	BIT(1)
252*61890ccaSMoudy Ho 
253*61890ccaSMoudy Ho struct mdp_format {
254*61890ccaSMoudy Ho 	u32	pixelformat;
255*61890ccaSMoudy Ho 	u32	mdp_color;
256*61890ccaSMoudy Ho 	u8	depth[VIDEO_MAX_PLANES];
257*61890ccaSMoudy Ho 	u8	row_depth[VIDEO_MAX_PLANES];
258*61890ccaSMoudy Ho 	u8	num_planes;
259*61890ccaSMoudy Ho 	u8	walign;
260*61890ccaSMoudy Ho 	u8	halign;
261*61890ccaSMoudy Ho 	u8	salign;
262*61890ccaSMoudy Ho 	u32	flags;
263*61890ccaSMoudy Ho };
264*61890ccaSMoudy Ho 
265*61890ccaSMoudy Ho struct mdp_pix_limit {
266*61890ccaSMoudy Ho 	u32	wmin;
267*61890ccaSMoudy Ho 	u32	hmin;
268*61890ccaSMoudy Ho 	u32	wmax;
269*61890ccaSMoudy Ho 	u32	hmax;
270*61890ccaSMoudy Ho };
271*61890ccaSMoudy Ho 
272*61890ccaSMoudy Ho struct mdp_limit {
273*61890ccaSMoudy Ho 	struct mdp_pix_limit	out_limit;
274*61890ccaSMoudy Ho 	struct mdp_pix_limit	cap_limit;
275*61890ccaSMoudy Ho 	u32			h_scale_up_max;
276*61890ccaSMoudy Ho 	u32			v_scale_up_max;
277*61890ccaSMoudy Ho 	u32			h_scale_down_max;
278*61890ccaSMoudy Ho 	u32			v_scale_down_max;
279*61890ccaSMoudy Ho };
280*61890ccaSMoudy Ho 
281*61890ccaSMoudy Ho enum mdp_stream_type {
282*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_UNKNOWN,
283*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_BITBLT,
284*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_GPU_BITBLT,
285*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_DUAL_BITBLT,
286*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_2ND_BITBLT,
287*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_ISP_IC,
288*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_ISP_VR,
289*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_ISP_ZSD,
290*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_ISP_IP,
291*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_ISP_VSS,
292*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_ISP_ZSD_SLOW,
293*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_WPE,
294*61890ccaSMoudy Ho 	MDP_STREAM_TYPE_WPE2,
295*61890ccaSMoudy Ho };
296*61890ccaSMoudy Ho 
297*61890ccaSMoudy Ho struct mdp_crop {
298*61890ccaSMoudy Ho 	struct v4l2_rect	c;
299*61890ccaSMoudy Ho 	struct v4l2_fract	left_subpix;
300*61890ccaSMoudy Ho 	struct v4l2_fract	top_subpix;
301*61890ccaSMoudy Ho 	struct v4l2_fract	width_subpix;
302*61890ccaSMoudy Ho 	struct v4l2_fract	height_subpix;
303*61890ccaSMoudy Ho };
304*61890ccaSMoudy Ho 
305*61890ccaSMoudy Ho struct mdp_frame {
306*61890ccaSMoudy Ho 	struct v4l2_format	format;
307*61890ccaSMoudy Ho 	const struct mdp_format	*mdp_fmt;
308*61890ccaSMoudy Ho 	u32			ycbcr_prof;	/* enum mdp_ycbcr_profile */
309*61890ccaSMoudy Ho 	u32			usage;		/* enum mdp_buffer_usage */
310*61890ccaSMoudy Ho 	struct mdp_crop		crop;
311*61890ccaSMoudy Ho 	struct v4l2_rect	compose;
312*61890ccaSMoudy Ho 	s32			rotation;
313*61890ccaSMoudy Ho 	u32			hflip:1;
314*61890ccaSMoudy Ho 	u32			vflip:1;
315*61890ccaSMoudy Ho 	u32			hdr:1;
316*61890ccaSMoudy Ho 	u32			dre:1;
317*61890ccaSMoudy Ho 	u32			sharpness:1;
318*61890ccaSMoudy Ho 	u32			dither:1;
319*61890ccaSMoudy Ho };
320*61890ccaSMoudy Ho 
321*61890ccaSMoudy Ho static inline bool mdp_target_is_crop(u32 target)
322*61890ccaSMoudy Ho {
323*61890ccaSMoudy Ho 	return (target == V4L2_SEL_TGT_CROP) ||
324*61890ccaSMoudy Ho 		(target == V4L2_SEL_TGT_CROP_DEFAULT) ||
325*61890ccaSMoudy Ho 		(target == V4L2_SEL_TGT_CROP_BOUNDS);
326*61890ccaSMoudy Ho }
327*61890ccaSMoudy Ho 
328*61890ccaSMoudy Ho static inline bool mdp_target_is_compose(u32 target)
329*61890ccaSMoudy Ho {
330*61890ccaSMoudy Ho 	return (target == V4L2_SEL_TGT_COMPOSE) ||
331*61890ccaSMoudy Ho 		(target == V4L2_SEL_TGT_COMPOSE_DEFAULT) ||
332*61890ccaSMoudy Ho 		(target == V4L2_SEL_TGT_COMPOSE_BOUNDS);
333*61890ccaSMoudy Ho }
334*61890ccaSMoudy Ho 
335*61890ccaSMoudy Ho #define MDP_MAX_CAPTURES	IMG_MAX_HW_OUTPUTS
336*61890ccaSMoudy Ho 
337*61890ccaSMoudy Ho #define MDP_VPU_INIT		BIT(0)
338*61890ccaSMoudy Ho #define MDP_M2M_CTX_ERROR	BIT(1)
339*61890ccaSMoudy Ho 
340*61890ccaSMoudy Ho struct mdp_frameparam {
341*61890ccaSMoudy Ho 	struct list_head	list;
342*61890ccaSMoudy Ho 	struct mdp_m2m_ctx	*ctx;
343*61890ccaSMoudy Ho 	atomic_t		state;
344*61890ccaSMoudy Ho 	const struct mdp_limit	*limit;
345*61890ccaSMoudy Ho 	u32			type;	/* enum mdp_stream_type */
346*61890ccaSMoudy Ho 	u32			frame_no;
347*61890ccaSMoudy Ho 	struct mdp_frame	output;
348*61890ccaSMoudy Ho 	struct mdp_frame	captures[MDP_MAX_CAPTURES];
349*61890ccaSMoudy Ho 	u32			num_captures;
350*61890ccaSMoudy Ho 	enum v4l2_colorspace		colorspace;
351*61890ccaSMoudy Ho 	enum v4l2_ycbcr_encoding	ycbcr_enc;
352*61890ccaSMoudy Ho 	enum v4l2_xfer_func		xfer_func;
353*61890ccaSMoudy Ho 	enum v4l2_quantization		quant;
354*61890ccaSMoudy Ho };
355*61890ccaSMoudy Ho 
356*61890ccaSMoudy Ho int mdp_enum_fmt_mplane(struct v4l2_fmtdesc *f);
357*61890ccaSMoudy Ho const struct mdp_format *mdp_try_fmt_mplane(struct v4l2_format *f,
358*61890ccaSMoudy Ho 					    struct mdp_frameparam *param,
359*61890ccaSMoudy Ho 					    u32 ctx_id);
360*61890ccaSMoudy Ho enum mdp_ycbcr_profile mdp_map_ycbcr_prof_mplane(struct v4l2_format *f,
361*61890ccaSMoudy Ho 						 u32 mdp_color);
362*61890ccaSMoudy Ho int mdp_try_crop(struct mdp_m2m_ctx *ctx, struct v4l2_rect *r,
363*61890ccaSMoudy Ho 		 const struct v4l2_selection *s, struct mdp_frame *frame);
364*61890ccaSMoudy Ho int mdp_check_scaling_ratio(const struct v4l2_rect *crop,
365*61890ccaSMoudy Ho 			    const struct v4l2_rect *compose, s32 rotation,
366*61890ccaSMoudy Ho 	const struct mdp_limit *limit);
367*61890ccaSMoudy Ho void mdp_set_src_config(struct img_input *in,
368*61890ccaSMoudy Ho 			struct mdp_frame *frame, struct vb2_buffer *vb);
369*61890ccaSMoudy Ho void mdp_set_dst_config(struct img_output *out,
370*61890ccaSMoudy Ho 			struct mdp_frame *frame, struct vb2_buffer *vb);
371*61890ccaSMoudy Ho int mdp_frameparam_init(struct mdp_frameparam *param);
372*61890ccaSMoudy Ho 
373*61890ccaSMoudy Ho #endif  /* __MTK_MDP3_REGS_H__ */
374