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