1 #ifndef __MEDIA_INFO_H__
2 #define __MEDIA_INFO_H__
3 
4 #ifndef MSM_MEDIA_ALIGN
5 #define MSM_MEDIA_ALIGN(__sz, __align) (((__sz) + (__align-1)) & (~(__align-1)))
6 #endif
7 
8 #ifndef MSM_MEDIA_ROUNDUP
9 #define MSM_MEDIA_ROUNDUP(__sz, __r) (((__sz) + ((__r) - 1)) / (__r))
10 #endif
11 
12 enum color_fmts {
13 	/* Venus NV12:
14 	 * YUV 4:2:0 image with a plane of 8 bit Y samples followed
15 	 * by an interleaved U/V plane containing 8 bit 2x2 subsampled
16 	 * colour difference samples.
17 	 *
18 	 * <-------- Y/UV_Stride -------->
19 	 * <------- Width ------->
20 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  ^           ^
21 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
22 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  Height      |
23 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |          Y_Scanlines
24 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
25 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
26 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
27 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  V           |
28 	 * . . . . . . . . . . . . . . . .              |
29 	 * . . . . . . . . . . . . . . . .              |
30 	 * . . . . . . . . . . . . . . . .              |
31 	 * . . . . . . . . . . . . . . . .              V
32 	 * U V U V U V U V U V U V . . . .  ^
33 	 * U V U V U V U V U V U V . . . .  |
34 	 * U V U V U V U V U V U V . . . .  |
35 	 * U V U V U V U V U V U V . . . .  UV_Scanlines
36 	 * . . . . . . . . . . . . . . . .  |
37 	 * . . . . . . . . . . . . . . . .  V
38 	 * . . . . . . . . . . . . . . . .  --> Buffer size alignment
39 	 *
40 	 * Y_Stride : Width aligned to 128
41 	 * UV_Stride : Width aligned to 128
42 	 * Y_Scanlines: Height aligned to 32
43 	 * UV_Scanlines: Height/2 aligned to 16
44 	 * Extradata: Arbitrary (software-imposed) padding
45 	 * Total size = align((Y_Stride * Y_Scanlines
46 	 *          + UV_Stride * UV_Scanlines + Extradata), 4096)
47 	 */
48 	COLOR_FMT_NV12,
49 
50 	/* Venus NV21:
51 	 * YUV 4:2:0 image with a plane of 8 bit Y samples followed
52 	 * by an interleaved V/U plane containing 8 bit 2x2 subsampled
53 	 * colour difference samples.
54 	 *
55 	 * <-------- Y/UV_Stride -------->
56 	 * <------- Width ------->
57 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  ^           ^
58 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
59 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  Height      |
60 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |          Y_Scanlines
61 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
62 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
63 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
64 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  V           |
65 	 * . . . . . . . . . . . . . . . .              |
66 	 * . . . . . . . . . . . . . . . .              |
67 	 * . . . . . . . . . . . . . . . .              |
68 	 * . . . . . . . . . . . . . . . .              V
69 	 * V U V U V U V U V U V U . . . .  ^
70 	 * V U V U V U V U V U V U . . . .  |
71 	 * V U V U V U V U V U V U . . . .  |
72 	 * V U V U V U V U V U V U . . . .  UV_Scanlines
73 	 * . . . . . . . . . . . . . . . .  |
74 	 * . . . . . . . . . . . . . . . .  V
75 	 * . . . . . . . . . . . . . . . .  --> Padding & Buffer size alignment
76 	 *
77 	 * Y_Stride : Width aligned to 128
78 	 * UV_Stride : Width aligned to 128
79 	 * Y_Scanlines: Height aligned to 32
80 	 * UV_Scanlines: Height/2 aligned to 16
81 	 * Extradata: Arbitrary (software-imposed) padding
82 	 * Total size = align((Y_Stride * Y_Scanlines
83 	 *          + UV_Stride * UV_Scanlines + Extradata), 4096)
84 	 */
85 	COLOR_FMT_NV21,
86 	/* Venus NV12_MVTB:
87 	 * Two YUV 4:2:0 images/views one after the other
88 	 * in a top-bottom layout, same as NV12
89 	 * with a plane of 8 bit Y samples followed
90 	 * by an interleaved U/V plane containing 8 bit 2x2 subsampled
91 	 * colour difference samples.
92 	 *
93 	 *
94 	 * <-------- Y/UV_Stride -------->
95 	 * <------- Width ------->
96 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  ^           ^               ^
97 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
98 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  Height      |               |
99 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |          Y_Scanlines      |
100 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
101 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
102 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
103 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  V           |               |
104 	 * . . . . . . . . . . . . . . . .              |             View_1
105 	 * . . . . . . . . . . . . . . . .              |               |
106 	 * . . . . . . . . . . . . . . . .              |               |
107 	 * . . . . . . . . . . . . . . . .              V               |
108 	 * U V U V U V U V U V U V . . . .  ^                           |
109 	 * U V U V U V U V U V U V . . . .  |                           |
110 	 * U V U V U V U V U V U V . . . .  |                           |
111 	 * U V U V U V U V U V U V . . . .  UV_Scanlines                |
112 	 * . . . . . . . . . . . . . . . .  |                           |
113 	 * . . . . . . . . . . . . . . . .  V                           V
114 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  ^           ^               ^
115 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
116 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  Height      |               |
117 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |          Y_Scanlines      |
118 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
119 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
120 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
121 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  V           |               |
122 	 * . . . . . . . . . . . . . . . .              |             View_2
123 	 * . . . . . . . . . . . . . . . .              |               |
124 	 * . . . . . . . . . . . . . . . .              |               |
125 	 * . . . . . . . . . . . . . . . .              V               |
126 	 * U V U V U V U V U V U V . . . .  ^                           |
127 	 * U V U V U V U V U V U V . . . .  |                           |
128 	 * U V U V U V U V U V U V . . . .  |                           |
129 	 * U V U V U V U V U V U V . . . .  UV_Scanlines                |
130 	 * . . . . . . . . . . . . . . . .  |                           |
131 	 * . . . . . . . . . . . . . . . .  V                           V
132 	 * . . . . . . . . . . . . . . . .  --> Buffer size alignment
133 	 *
134 	 * Y_Stride : Width aligned to 128
135 	 * UV_Stride : Width aligned to 128
136 	 * Y_Scanlines: Height aligned to 32
137 	 * UV_Scanlines: Height/2 aligned to 16
138 	 * View_1 begin at: 0 (zero)
139 	 * View_2 begin at: Y_Stride * Y_Scanlines + UV_Stride * UV_Scanlines
140 	 * Extradata: Arbitrary (software-imposed) padding
141 	 * Total size = align((2*(Y_Stride * Y_Scanlines)
142 	 *          + 2*(UV_Stride * UV_Scanlines) + Extradata), 4096)
143 	 */
144 	COLOR_FMT_NV12_MVTB,
145 	/* Venus NV12 UBWC:
146 	 * Compressed Macro-tile format for NV12.
147 	 * Contains 4 planes in the following order -
148 	 * (A) Y_Meta_Plane
149 	 * (B) Y_UBWC_Plane
150 	 * (C) UV_Meta_Plane
151 	 * (D) UV_UBWC_Plane
152 	 *
153 	 * Y_Meta_Plane consists of meta information to decode compressed
154 	 * tile data in Y_UBWC_Plane.
155 	 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
156 	 * UBWC decoder block will use the Y_Meta_Plane data together with
157 	 * Y_UBWC_Plane data to produce loss-less uncompressed 8 bit Y samples.
158 	 *
159 	 * UV_Meta_Plane consists of meta information to decode compressed
160 	 * tile data in UV_UBWC_Plane.
161 	 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
162 	 * UBWC decoder block will use UV_Meta_Plane data together with
163 	 * UV_UBWC_Plane data to produce loss-less uncompressed 8 bit 2x2
164 	 * subsampled color difference samples.
165 	 *
166 	 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
167 	 * and randomly accessible. There is no dependency between tiles.
168 	 *
169 	 * <----- Y_Meta_Stride ---->
170 	 * <-------- Width ------>
171 	 * M M M M M M M M M M M M . .      ^           ^
172 	 * M M M M M M M M M M M M . .      |           |
173 	 * M M M M M M M M M M M M . .      Height      |
174 	 * M M M M M M M M M M M M . .      |         Meta_Y_Scanlines
175 	 * M M M M M M M M M M M M . .      |           |
176 	 * M M M M M M M M M M M M . .      |           |
177 	 * M M M M M M M M M M M M . .      |           |
178 	 * M M M M M M M M M M M M . .      V           |
179 	 * . . . . . . . . . . . . . .                  |
180 	 * . . . . . . . . . . . . . .                  |
181 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
182 	 * . . . . . . . . . . . . . .                  V
183 	 * <--Compressed tile Y Stride--->
184 	 * <------- Width ------->
185 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  ^           ^
186 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
187 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  Height      |
188 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |        Macro_tile_Y_Scanlines
189 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
190 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
191 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
192 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  V           |
193 	 * . . . . . . . . . . . . . . . .              |
194 	 * . . . . . . . . . . . . . . . .              |
195 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
196 	 * . . . . . . . . . . . . . . . .              V
197 	 * <----- UV_Meta_Stride ---->
198 	 * M M M M M M M M M M M M . .      ^
199 	 * M M M M M M M M M M M M . .      |
200 	 * M M M M M M M M M M M M . .      |
201 	 * M M M M M M M M M M M M . .      M_UV_Scanlines
202 	 * . . . . . . . . . . . . . .      |
203 	 * . . . . . . . . . . . . . .      V
204 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
205 	 * <--Compressed tile UV Stride--->
206 	 * U* V* U* V* U* V* U* V* . . . .  ^
207 	 * U* V* U* V* U* V* U* V* . . . .  |
208 	 * U* V* U* V* U* V* U* V* . . . .  |
209 	 * U* V* U* V* U* V* U* V* . . . .  UV_Scanlines
210 	 * . . . . . . . . . . . . . . . .  |
211 	 * . . . . . . . . . . . . . . . .  V
212 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
213 	 *
214 	 * Y_Stride = align(Width, 128)
215 	 * UV_Stride = align(Width, 128)
216 	 * Y_Scanlines = align(Height, 32)
217 	 * UV_Scanlines = align(Height/2, 16)
218 	 * Y_UBWC_Plane_size = align(Y_Stride * Y_Scanlines, 4096)
219 	 * UV_UBWC_Plane_size = align(UV_Stride * UV_Scanlines, 4096)
220 	 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
221 	 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
222 	 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
223 	 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
224 	 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
225 	 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
226 	 * Extradata = 8k
227 	 *
228 	 * Total size = align( Y_UBWC_Plane_size + UV_UBWC_Plane_size +
229 	 *           Y_Meta_Plane_size + UV_Meta_Plane_size + Extradata, 4096)
230 	 */
231 	COLOR_FMT_NV12_UBWC,
232 	/* Venus NV12 10-bit UBWC:
233 	 * Compressed Macro-tile format for NV12.
234 	 * Contains 4 planes in the following order -
235 	 * (A) Y_Meta_Plane
236 	 * (B) Y_UBWC_Plane
237 	 * (C) UV_Meta_Plane
238 	 * (D) UV_UBWC_Plane
239 	 *
240 	 * Y_Meta_Plane consists of meta information to decode compressed
241 	 * tile data in Y_UBWC_Plane.
242 	 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
243 	 * UBWC decoder block will use the Y_Meta_Plane data together with
244 	 * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples.
245 	 *
246 	 * UV_Meta_Plane consists of meta information to decode compressed
247 	 * tile data in UV_UBWC_Plane.
248 	 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
249 	 * UBWC decoder block will use UV_Meta_Plane data together with
250 	 * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2
251 	 * subsampled color difference samples.
252 	 *
253 	 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
254 	 * and randomly accessible. There is no dependency between tiles.
255 	 *
256 	 * <----- Y_Meta_Stride ----->
257 	 * <-------- Width ------>
258 	 * M M M M M M M M M M M M . .      ^           ^
259 	 * M M M M M M M M M M M M . .      |           |
260 	 * M M M M M M M M M M M M . .      Height      |
261 	 * M M M M M M M M M M M M . .      |         Meta_Y_Scanlines
262 	 * M M M M M M M M M M M M . .      |           |
263 	 * M M M M M M M M M M M M . .      |           |
264 	 * M M M M M M M M M M M M . .      |           |
265 	 * M M M M M M M M M M M M . .      V           |
266 	 * . . . . . . . . . . . . . .                  |
267 	 * . . . . . . . . . . . . . .                  |
268 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
269 	 * . . . . . . . . . . . . . .                  V
270 	 * <--Compressed tile Y Stride--->
271 	 * <------- Width ------->
272 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  ^           ^
273 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
274 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  Height      |
275 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |        Macro_tile_Y_Scanlines
276 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
277 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
278 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
279 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  V           |
280 	 * . . . . . . . . . . . . . . . .              |
281 	 * . . . . . . . . . . . . . . . .              |
282 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
283 	 * . . . . . . . . . . . . . . . .              V
284 	 * <----- UV_Meta_Stride ---->
285 	 * M M M M M M M M M M M M . .      ^
286 	 * M M M M M M M M M M M M . .      |
287 	 * M M M M M M M M M M M M . .      |
288 	 * M M M M M M M M M M M M . .      M_UV_Scanlines
289 	 * . . . . . . . . . . . . . .      |
290 	 * . . . . . . . . . . . . . .      V
291 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
292 	 * <--Compressed tile UV Stride--->
293 	 * U* V* U* V* U* V* U* V* . . . .  ^
294 	 * U* V* U* V* U* V* U* V* . . . .  |
295 	 * U* V* U* V* U* V* U* V* . . . .  |
296 	 * U* V* U* V* U* V* U* V* . . . .  UV_Scanlines
297 	 * . . . . . . . . . . . . . . . .  |
298 	 * . . . . . . . . . . . . . . . .  V
299 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
300 	 *
301 	 *
302 	 * Y_Stride = align(Width * 4/3, 128)
303 	 * UV_Stride = align(Width * 4/3, 128)
304 	 * Y_Scanlines = align(Height, 32)
305 	 * UV_Scanlines = align(Height/2, 16)
306 	 * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096)
307 	 * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096)
308 	 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
309 	 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
310 	 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
311 	 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
312 	 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
313 	 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
314 	 * Extradata = 8k
315 	 */
316 	COLOR_FMT_NV12_BPP10_UBWC,
317 };
318 
VENUS_EXTRADATA_SIZE(int width,int height)319 static inline unsigned int VENUS_EXTRADATA_SIZE(int width, int height)
320 {
321 	(void)height;
322 	(void)width;
323 
324 	/*
325 	 * In the future, calculate the size based on the w/h but just
326 	 * hardcode it for now since 8K satisfies all current usecases.
327 	 */
328 	return 8 * 1024;
329 }
330 
VENUS_Y_STRIDE(int color_fmt,int width)331 static inline unsigned int VENUS_Y_STRIDE(int color_fmt, int width)
332 {
333 	unsigned int alignment, stride = 0;
334 	if (!width)
335 		goto invalid_input;
336 
337 	switch (color_fmt) {
338 	case COLOR_FMT_NV21:
339 	case COLOR_FMT_NV12:
340 	case COLOR_FMT_NV12_MVTB:
341 	case COLOR_FMT_NV12_UBWC:
342 		alignment = 128;
343 		stride = MSM_MEDIA_ALIGN(width, alignment);
344 		break;
345 	case COLOR_FMT_NV12_BPP10_UBWC:
346 		alignment = 128;
347 		stride = MSM_MEDIA_ALIGN(width * 4/3, alignment);
348 		break;
349 	default:
350 		break;
351 	}
352 invalid_input:
353 	return stride;
354 }
355 
VENUS_UV_STRIDE(int color_fmt,int width)356 static inline unsigned int VENUS_UV_STRIDE(int color_fmt, int width)
357 {
358 	unsigned int alignment, stride = 0;
359 	if (!width)
360 		goto invalid_input;
361 
362 	switch (color_fmt) {
363 	case COLOR_FMT_NV21:
364 	case COLOR_FMT_NV12:
365 	case COLOR_FMT_NV12_MVTB:
366 	case COLOR_FMT_NV12_UBWC:
367 		alignment = 128;
368 		stride = MSM_MEDIA_ALIGN(width, alignment);
369 		break;
370 	case COLOR_FMT_NV12_BPP10_UBWC:
371 		alignment = 128;
372 		stride = MSM_MEDIA_ALIGN(width * 4/3, alignment);
373 		break;
374 	default:
375 		break;
376 	}
377 invalid_input:
378 	return stride;
379 }
380 
VENUS_Y_SCANLINES(int color_fmt,int height)381 static inline unsigned int VENUS_Y_SCANLINES(int color_fmt, int height)
382 {
383 	unsigned int alignment, sclines = 0;
384 	if (!height)
385 		goto invalid_input;
386 
387 	switch (color_fmt) {
388 	case COLOR_FMT_NV21:
389 	case COLOR_FMT_NV12:
390 	case COLOR_FMT_NV12_MVTB:
391 	case COLOR_FMT_NV12_UBWC:
392 	case COLOR_FMT_NV12_BPP10_UBWC:
393 		alignment = 32;
394 		sclines = MSM_MEDIA_ALIGN(height, alignment);
395 		break;
396 	default:
397 		break;
398 	}
399 invalid_input:
400 	return sclines;
401 }
402 
VENUS_UV_SCANLINES(int color_fmt,int height)403 static inline unsigned int VENUS_UV_SCANLINES(int color_fmt, int height)
404 {
405 	unsigned int alignment, sclines = 0;
406 	if (!height)
407 		goto invalid_input;
408 
409 	switch (color_fmt) {
410 	case COLOR_FMT_NV21:
411 	case COLOR_FMT_NV12:
412 	case COLOR_FMT_NV12_MVTB:
413 	case COLOR_FMT_NV12_UBWC:
414 	case COLOR_FMT_NV12_BPP10_UBWC:
415 		alignment = 16;
416 		sclines = MSM_MEDIA_ALIGN(((height + 1) >> 1), alignment);
417 		break;
418 	default:
419 		break;
420 	}
421 invalid_input:
422 	return sclines;
423 }
424 
VENUS_Y_META_STRIDE(int color_fmt,int width)425 static inline unsigned int VENUS_Y_META_STRIDE(int color_fmt, int width)
426 {
427 	int y_tile_width = 0, y_meta_stride = 0;
428 
429 	if (!width)
430 		goto invalid_input;
431 
432 	switch (color_fmt) {
433 	case COLOR_FMT_NV12_UBWC:
434 		y_tile_width = 32;
435 		break;
436 	case COLOR_FMT_NV12_BPP10_UBWC:
437 		y_tile_width = 48;
438 		break;
439 	default:
440 		goto invalid_input;
441 	}
442 
443 	y_meta_stride = MSM_MEDIA_ROUNDUP(width, y_tile_width);
444 	y_meta_stride = MSM_MEDIA_ALIGN(y_meta_stride, 64);
445 
446 invalid_input:
447 	return y_meta_stride;
448 }
449 
VENUS_Y_META_SCANLINES(int color_fmt,int height)450 static inline unsigned int VENUS_Y_META_SCANLINES(int color_fmt, int height)
451 {
452 	int y_tile_height = 0, y_meta_scanlines = 0;
453 
454 	if (!height)
455 		goto invalid_input;
456 
457 	switch (color_fmt) {
458 	case COLOR_FMT_NV12_UBWC:
459 		y_tile_height = 8;
460 		break;
461 	case COLOR_FMT_NV12_BPP10_UBWC:
462 		y_tile_height = 4;
463 		break;
464 	default:
465 		goto invalid_input;
466 	}
467 
468 	y_meta_scanlines = MSM_MEDIA_ROUNDUP(height, y_tile_height);
469 	y_meta_scanlines = MSM_MEDIA_ALIGN(y_meta_scanlines, 16);
470 
471 invalid_input:
472 	return y_meta_scanlines;
473 }
474 
VENUS_UV_META_STRIDE(int color_fmt,int width)475 static inline unsigned int VENUS_UV_META_STRIDE(int color_fmt, int width)
476 {
477 	int uv_tile_width = 0, uv_meta_stride = 0;
478 
479 	if (!width)
480 		goto invalid_input;
481 
482 	switch (color_fmt) {
483 	case COLOR_FMT_NV12_UBWC:
484 		uv_tile_width = 16;
485 		break;
486 	case COLOR_FMT_NV12_BPP10_UBWC:
487 		uv_tile_width = 24;
488 		break;
489 	default:
490 		goto invalid_input;
491 	}
492 
493 	uv_meta_stride = MSM_MEDIA_ROUNDUP(width, uv_tile_width);
494 	uv_meta_stride = MSM_MEDIA_ALIGN(uv_meta_stride, 64);
495 
496 invalid_input:
497 	return uv_meta_stride;
498 }
499 
VENUS_UV_META_SCANLINES(int color_fmt,int height)500 static inline unsigned int VENUS_UV_META_SCANLINES(int color_fmt, int height)
501 {
502 	int uv_tile_height = 0, uv_meta_scanlines = 0;
503 
504 	if (!height)
505 		goto invalid_input;
506 
507 	switch (color_fmt) {
508 	case COLOR_FMT_NV12_UBWC:
509 		uv_tile_height = 8;
510 		break;
511 	case COLOR_FMT_NV12_BPP10_UBWC:
512 		uv_tile_height = 4;
513 		break;
514 	default:
515 		goto invalid_input;
516 	}
517 
518 	uv_meta_scanlines = MSM_MEDIA_ROUNDUP(height, uv_tile_height);
519 	uv_meta_scanlines = MSM_MEDIA_ALIGN(uv_meta_scanlines, 16);
520 
521 invalid_input:
522 	return uv_meta_scanlines;
523 }
524 
VENUS_BUFFER_SIZE(int color_fmt,int width,int height)525 static inline unsigned int VENUS_BUFFER_SIZE(
526 	int color_fmt, int width, int height)
527 {
528 	const unsigned int extra_size = VENUS_EXTRADATA_SIZE(width, height);
529 	unsigned int uv_alignment = 0, size = 0;
530 	unsigned int y_plane, uv_plane, y_stride,
531 		uv_stride, y_sclines, uv_sclines;
532 	unsigned int y_ubwc_plane = 0, uv_ubwc_plane = 0;
533 	unsigned int y_meta_stride = 0, y_meta_scanlines = 0;
534 	unsigned int uv_meta_stride = 0, uv_meta_scanlines = 0;
535 	unsigned int y_meta_plane = 0, uv_meta_plane = 0;
536 
537 	if (!width || !height)
538 		goto invalid_input;
539 
540 	y_stride = VENUS_Y_STRIDE(color_fmt, width);
541 	uv_stride = VENUS_UV_STRIDE(color_fmt, width);
542 	y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
543 	uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
544 	switch (color_fmt) {
545 	case COLOR_FMT_NV21:
546 	case COLOR_FMT_NV12:
547 		uv_alignment = 4096;
548 		y_plane = y_stride * y_sclines;
549 		uv_plane = uv_stride * uv_sclines + uv_alignment;
550 		size = y_plane + uv_plane + extra_size;
551 		size = MSM_MEDIA_ALIGN(size, 4096);
552 		break;
553 	case COLOR_FMT_NV12_MVTB:
554 		uv_alignment = 4096;
555 		y_plane = y_stride * y_sclines;
556 		uv_plane = uv_stride * uv_sclines + uv_alignment;
557 		size = y_plane + uv_plane;
558 		size = 2 * size + extra_size;
559 		size = MSM_MEDIA_ALIGN(size, 4096);
560 		break;
561 	case COLOR_FMT_NV12_UBWC:
562 	case COLOR_FMT_NV12_BPP10_UBWC:
563 		y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
564 		uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096);
565 		y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
566 		y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
567 		y_meta_plane = MSM_MEDIA_ALIGN(
568 				y_meta_stride * y_meta_scanlines, 4096);
569 		uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
570 		uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
571 		uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride *
572 					uv_meta_scanlines, 4096);
573 
574 		size = y_ubwc_plane + uv_ubwc_plane + y_meta_plane +
575 				uv_meta_plane + extra_size;
576 		size = MSM_MEDIA_ALIGN(size, 4096);
577 		break;
578 	default:
579 		break;
580 	}
581 invalid_input:
582 	return size;
583 }
584 
VENUS_VIEW2_OFFSET(int color_fmt,int width,int height)585 static inline unsigned int VENUS_VIEW2_OFFSET(
586 	int color_fmt, int width, int height)
587 {
588 	unsigned int offset = 0;
589 	unsigned int y_plane, uv_plane, y_stride,
590 		uv_stride, y_sclines, uv_sclines;
591 	if (!width || !height)
592 		goto invalid_input;
593 
594 	y_stride = VENUS_Y_STRIDE(color_fmt, width);
595 	uv_stride = VENUS_UV_STRIDE(color_fmt, width);
596 	y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
597 	uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
598 	switch (color_fmt) {
599 	case COLOR_FMT_NV12_MVTB:
600 		y_plane = y_stride * y_sclines;
601 		uv_plane = uv_stride * uv_sclines;
602 		offset = y_plane + uv_plane;
603 		break;
604 	default:
605 		break;
606 	}
607 invalid_input:
608 	return offset;
609 }
610 
611 #endif
612