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 #ifndef MSM_MEDIA_MAX
13 #define MSM_MEDIA_MAX(__a, __b) ((__a) > (__b)?(__a):(__b))
14 #endif
15
16 enum color_fmts {
17 /* Venus NV12:
18 * YUV 4:2:0 image with a plane of 8 bit Y samples followed
19 * by an interleaved U/V plane containing 8 bit 2x2 subsampled
20 * colour difference samples.
21 *
22 * <-------- Y/UV_Stride -------->
23 * <------- Width ------->
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 . . . . Height |
27 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines
28 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | |
29 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | |
30 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | |
31 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V |
32 * . . . . . . . . . . . . . . . . |
33 * . . . . . . . . . . . . . . . . |
34 * . . . . . . . . . . . . . . . . |
35 * . . . . . . . . . . . . . . . . V
36 * U V U V U V U V U V U V . . . . ^
37 * U V U V U V U V U V U V . . . . |
38 * U V U V U V U V U V U V . . . . |
39 * U V U V U V U V U V U V . . . . UV_Scanlines
40 * . . . . . . . . . . . . . . . . |
41 * . . . . . . . . . . . . . . . . V
42 * . . . . . . . . . . . . . . . . --> Buffer size alignment
43 *
44 * Y_Stride : Width aligned to 128
45 * UV_Stride : Width aligned to 128
46 * Y_Scanlines: Height aligned to 32
47 * UV_Scanlines: Height/2 aligned to 16
48 * Extradata: Arbitrary (software-imposed) padding
49 * Total size = align((Y_Stride * Y_Scanlines
50 * + UV_Stride * UV_Scanlines
51 * + max(Extradata, Y_Stride * 8), 4096)
52 */
53 COLOR_FMT_NV12,
54
55 /* Venus NV21:
56 * YUV 4:2:0 image with a plane of 8 bit Y samples followed
57 * by an interleaved V/U plane containing 8 bit 2x2 subsampled
58 * colour difference samples.
59 *
60 * <-------- Y/UV_Stride -------->
61 * <------- Width ------->
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 . . . . Height |
65 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines
66 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | |
67 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | |
68 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | |
69 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V |
70 * . . . . . . . . . . . . . . . . |
71 * . . . . . . . . . . . . . . . . |
72 * . . . . . . . . . . . . . . . . |
73 * . . . . . . . . . . . . . . . . V
74 * V U V U V U V U V U V U . . . . ^
75 * V U V U V U V U V U V U . . . . |
76 * V U V U V U V U V U V U . . . . |
77 * V U V U V U V U V U V U . . . . UV_Scanlines
78 * . . . . . . . . . . . . . . . . |
79 * . . . . . . . . . . . . . . . . V
80 * . . . . . . . . . . . . . . . . --> Padding & Buffer size alignment
81 *
82 * Y_Stride : Width aligned to 128
83 * UV_Stride : Width aligned to 128
84 * Y_Scanlines: Height aligned to 32
85 * UV_Scanlines: Height/2 aligned to 16
86 * Extradata: Arbitrary (software-imposed) padding
87 * Total size = align((Y_Stride * Y_Scanlines
88 * + UV_Stride * UV_Scanlines
89 * + max(Extradata, Y_Stride * 8), 4096)
90 */
91 COLOR_FMT_NV21,
92 /* Venus NV12_MVTB:
93 * Two YUV 4:2:0 images/views one after the other
94 * in a top-bottom layout, same as NV12
95 * with a plane of 8 bit Y samples followed
96 * by an interleaved U/V plane containing 8 bit 2x2 subsampled
97 * colour difference samples.
98 *
99 *
100 * <-------- Y/UV_Stride -------->
101 * <------- Width ------->
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 . . . . | | |
104 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | |
105 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines |
106 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | |
107 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | |
108 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | |
109 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | |
110 * . . . . . . . . . . . . . . . . | View_1
111 * . . . . . . . . . . . . . . . . | |
112 * . . . . . . . . . . . . . . . . | |
113 * . . . . . . . . . . . . . . . . V |
114 * U V U V U V U V U V U V . . . . ^ |
115 * U V U V U V U V U V U V . . . . | |
116 * U V U V U V U V U V U V . . . . | |
117 * U V U V U V U V U V U V . . . . UV_Scanlines |
118 * . . . . . . . . . . . . . . . . | |
119 * . . . . . . . . . . . . . . . . V V
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 . . . . | | |
122 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . Height | |
123 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | Y_Scanlines |
124 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | |
125 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | |
126 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . | | |
127 * Y Y Y Y Y Y Y Y Y Y Y Y . . . . V | |
128 * . . . . . . . . . . . . . . . . | View_2
129 * . . . . . . . . . . . . . . . . | |
130 * . . . . . . . . . . . . . . . . | |
131 * . . . . . . . . . . . . . . . . V |
132 * U V U V U V U V U V U V . . . . ^ |
133 * U V U V U V U V U V U V . . . . | |
134 * U V U V U V U V U V U V . . . . | |
135 * U V U V U V U V U V U V . . . . UV_Scanlines |
136 * . . . . . . . . . . . . . . . . | |
137 * . . . . . . . . . . . . . . . . V V
138 * . . . . . . . . . . . . . . . . --> Buffer size alignment
139 *
140 * Y_Stride : Width aligned to 128
141 * UV_Stride : Width aligned to 128
142 * Y_Scanlines: Height aligned to 32
143 * UV_Scanlines: Height/2 aligned to 16
144 * View_1 begin at: 0 (zero)
145 * View_2 begin at: Y_Stride * Y_Scanlines + UV_Stride * UV_Scanlines
146 * Extradata: Arbitrary (software-imposed) padding
147 * Total size = align((2*(Y_Stride * Y_Scanlines)
148 * + 2*(UV_Stride * UV_Scanlines) + Extradata), 4096)
149 */
150 COLOR_FMT_NV12_MVTB,
151 /* Venus NV12 UBWC:
152 * Compressed Macro-tile format for NV12.
153 * Contains 4 planes in the following order -
154 * (A) Y_Meta_Plane
155 * (B) Y_UBWC_Plane
156 * (C) UV_Meta_Plane
157 * (D) UV_UBWC_Plane
158 *
159 * Y_Meta_Plane consists of meta information to decode compressed
160 * tile data in Y_UBWC_Plane.
161 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
162 * UBWC decoder block will use the Y_Meta_Plane data together with
163 * Y_UBWC_Plane data to produce loss-less uncompressed 8 bit Y samples.
164 *
165 * UV_Meta_Plane consists of meta information to decode compressed
166 * tile data in UV_UBWC_Plane.
167 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
168 * UBWC decoder block will use UV_Meta_Plane data together with
169 * UV_UBWC_Plane data to produce loss-less uncompressed 8 bit 2x2
170 * subsampled color difference samples.
171 *
172 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
173 * and randomly accessible. There is no dependency between tiles.
174 *
175 * <----- Y_Meta_Stride ---->
176 * <-------- Width ------>
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 . . | |
179 * M M M M M M M M M M M M . . Height |
180 * M M M M M M M M M M M M . . | Meta_Y_Scanlines
181 * M M M M M M M M M M M M . . | |
182 * M M M M M M M M M M M M . . | |
183 * M M M M M M M M M M M M . . | |
184 * M M M M M M M M M M M M . . V |
185 * . . . . . . . . . . . . . . |
186 * . . . . . . . . . . . . . . |
187 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
188 * . . . . . . . . . . . . . . V
189 * <--Compressed tile Y Stride--->
190 * <------- Width ------->
191 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^
192 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
193 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height |
194 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_Scanlines
195 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
196 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
197 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
198 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V |
199 * . . . . . . . . . . . . . . . . |
200 * . . . . . . . . . . . . . . . . |
201 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
202 * . . . . . . . . . . . . . . . . V
203 * <----- UV_Meta_Stride ---->
204 * M M M M M M M M M M M M . . ^
205 * M M M M M M M M M M M M . . |
206 * M M M M M M M M M M M M . . |
207 * M M M M M M M M M M M M . . M_UV_Scanlines
208 * . . . . . . . . . . . . . . |
209 * . . . . . . . . . . . . . . V
210 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
211 * <--Compressed tile UV Stride--->
212 * U* V* U* V* U* V* U* V* . . . . ^
213 * U* V* U* V* U* V* U* V* . . . . |
214 * U* V* U* V* U* V* U* V* . . . . |
215 * U* V* U* V* U* V* U* V* . . . . UV_Scanlines
216 * . . . . . . . . . . . . . . . . |
217 * . . . . . . . . . . . . . . . . V
218 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
219 *
220 * Y_Stride = align(Width, 128)
221 * UV_Stride = align(Width, 128)
222 * Y_Scanlines = align(Height, 32)
223 * UV_Scanlines = align(Height/2, 16)
224 * Y_UBWC_Plane_size = align(Y_Stride * Y_Scanlines, 4096)
225 * UV_UBWC_Plane_size = align(UV_Stride * UV_Scanlines, 4096)
226 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
227 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
228 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
229 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
230 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
231 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
232 * Extradata = 8k
233 *
234 * Total size = align( Y_UBWC_Plane_size + UV_UBWC_Plane_size +
235 * Y_Meta_Plane_size + UV_Meta_Plane_size
236 * + max(Extradata, Y_Stride * 48), 4096)
237 */
238 COLOR_FMT_NV12_UBWC,
239 /* Venus NV12 10-bit UBWC:
240 * Compressed Macro-tile format for NV12.
241 * Contains 4 planes in the following order -
242 * (A) Y_Meta_Plane
243 * (B) Y_UBWC_Plane
244 * (C) UV_Meta_Plane
245 * (D) UV_UBWC_Plane
246 *
247 * Y_Meta_Plane consists of meta information to decode compressed
248 * tile data in Y_UBWC_Plane.
249 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
250 * UBWC decoder block will use the Y_Meta_Plane data together with
251 * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples.
252 *
253 * UV_Meta_Plane consists of meta information to decode compressed
254 * tile data in UV_UBWC_Plane.
255 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
256 * UBWC decoder block will use UV_Meta_Plane data together with
257 * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2
258 * subsampled color difference samples.
259 *
260 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
261 * and randomly accessible. There is no dependency between tiles.
262 *
263 * <----- Y_Meta_Stride ----->
264 * <-------- Width ------>
265 * M M M M M M M M M M M M . . ^ ^
266 * M M M M M M M M M M M M . . | |
267 * M M M M M M M M M M M M . . Height |
268 * M M M M M M M M M M M M . . | Meta_Y_Scanlines
269 * M M M M M M M M M M M M . . | |
270 * M M M M M M M M M M M M . . | |
271 * M M M M M M M M M M M M . . | |
272 * M M M M M M M M M M M M . . V |
273 * . . . . . . . . . . . . . . |
274 * . . . . . . . . . . . . . . |
275 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
276 * . . . . . . . . . . . . . . V
277 * <--Compressed tile Y Stride--->
278 * <------- Width ------->
279 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . ^ ^
280 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
281 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Height |
282 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | Macro_tile_Y_Scanlines
283 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
284 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
285 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . | |
286 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . V |
287 * . . . . . . . . . . . . . . . . |
288 * . . . . . . . . . . . . . . . . |
289 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
290 * . . . . . . . . . . . . . . . . V
291 * <----- UV_Meta_Stride ---->
292 * M M M M M M M M M M M M . . ^
293 * M M M M M M M M M M M M . . |
294 * M M M M M M M M M M M M . . |
295 * M M M M M M M M M M M M . . M_UV_Scanlines
296 * . . . . . . . . . . . . . . |
297 * . . . . . . . . . . . . . . V
298 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
299 * <--Compressed tile UV Stride--->
300 * U* V* U* V* U* V* U* V* . . . . ^
301 * U* V* U* V* U* V* U* V* . . . . |
302 * U* V* U* V* U* V* U* V* . . . . |
303 * U* V* U* V* U* V* U* V* . . . . UV_Scanlines
304 * . . . . . . . . . . . . . . . . |
305 * . . . . . . . . . . . . . . . . V
306 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
307 *
308 *
309 * Y_Stride = align(Width * 4/3, 128)
310 * UV_Stride = align(Width * 4/3, 128)
311 * Y_Scanlines = align(Height, 32)
312 * UV_Scanlines = align(Height/2, 16)
313 * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096)
314 * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096)
315 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
316 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
317 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
318 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
319 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
320 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
321 * Extradata = 8k
322 *
323 * Total size = align(Y_UBWC_Plane_size + UV_UBWC_Plane_size +
324 * Y_Meta_Plane_size + UV_Meta_Plane_size
325 * + max(Extradata, Y_Stride * 48), 4096)
326 */
327 COLOR_FMT_NV12_BPP10_UBWC,
328 /* Venus RGBA8888 format:
329 * Contains 1 plane in the following order -
330 * (A) RGBA plane
331 *
332 * <-------- RGB_Stride -------->
333 * <------- Width ------->
334 * R R R R R R R R R R R R . . . . ^ ^
335 * R R R R R R R R R R R R . . . . | |
336 * R R R R R R R R R R R R . . . . Height |
337 * R R R R R R R R R R R R . . . . | RGB_Scanlines
338 * R R R R R R R R R R R R . . . . | |
339 * R R R R R R R R R R R R . . . . | |
340 * R R R R R R R R R R R R . . . . | |
341 * R R R R R R R R R R R R . . . . V |
342 * . . . . . . . . . . . . . . . . |
343 * . . . . . . . . . . . . . . . . |
344 * . . . . . . . . . . . . . . . . |
345 * . . . . . . . . . . . . . . . . V
346 *
347 * RGB_Stride = align(Width * 4, 128)
348 * RGB_Scanlines = align(Height, 32)
349 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
350 * Extradata = 8k
351 *
352 * Total size = align(RGB_Plane_size + Extradata, 4096)
353 */
354 COLOR_FMT_RGBA8888,
355 /* Venus RGBA8888 UBWC format:
356 * Contains 2 planes in the following order -
357 * (A) Meta plane
358 * (B) RGBA plane
359 *
360 * <--- RGB_Meta_Stride ---->
361 * <-------- Width ------>
362 * M M M M M M M M M M M M . . ^ ^
363 * M M M M M M M M M M M M . . | |
364 * M M M M M M M M M M M M . . Height |
365 * M M M M M M M M M M M M . . | Meta_RGB_Scanlines
366 * M M M M M M M M M M M M . . | |
367 * M M M M M M M M M M M M . . | |
368 * M M M M M M M M M M M M . . | |
369 * M M M M M M M M M M M M . . V |
370 * . . . . . . . . . . . . . . |
371 * . . . . . . . . . . . . . . |
372 * . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
373 * . . . . . . . . . . . . . . V
374 * <-------- RGB_Stride -------->
375 * <------- Width ------->
376 * R R R R R R R R R R R R . . . . ^ ^
377 * R R R R R R R R R R R R . . . . | |
378 * R R R R R R R R R R R R . . . . Height |
379 * R R R R R R R R R R R R . . . . | RGB_Scanlines
380 * R R R R R R R R R R R R . . . . | |
381 * R R R R R R R R R R R R . . . . | |
382 * R R R R R R R R R R R R . . . . | |
383 * R R R R R R R R R R R R . . . . V |
384 * . . . . . . . . . . . . . . . . |
385 * . . . . . . . . . . . . . . . . |
386 * . . . . . . . . . . . . . . . . -------> Buffer size aligned to 4k
387 * . . . . . . . . . . . . . . . . V
388 *
389 * RGB_Stride = align(Width * 4, 128)
390 * RGB_Scanlines = align(Height, 32)
391 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
392 * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64)
393 * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16)
394 * RGB_Meta_Plane_size = align(RGB_Meta_Stride *
395 * RGB_Meta_Scanlines, 4096)
396 * Extradata = 8k
397 *
398 * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size +
399 * Extradata, 4096)
400 */
401 COLOR_FMT_RGBA8888_UBWC,
402 };
403
VENUS_EXTRADATA_SIZE(int width,int height)404 static inline unsigned int VENUS_EXTRADATA_SIZE(int width, int height)
405 {
406 (void)height;
407 (void)width;
408
409 /*
410 * In the future, calculate the size based on the w/h but just
411 * hardcode it for now since 16K satisfies all current usecases.
412 */
413 return 16 * 1024;
414 }
415
VENUS_Y_STRIDE(int color_fmt,int width)416 static inline unsigned int VENUS_Y_STRIDE(int color_fmt, int width)
417 {
418 unsigned int alignment, stride = 0;
419 if (!width)
420 goto invalid_input;
421
422 switch (color_fmt) {
423 case COLOR_FMT_NV21:
424 case COLOR_FMT_NV12:
425 case COLOR_FMT_NV12_MVTB:
426 case COLOR_FMT_NV12_UBWC:
427 alignment = 128;
428 stride = MSM_MEDIA_ALIGN(width, alignment);
429 break;
430 case COLOR_FMT_NV12_BPP10_UBWC:
431 alignment = 256;
432 stride = MSM_MEDIA_ALIGN(width, 192);
433 stride = MSM_MEDIA_ALIGN(stride * 4/3, alignment);
434 break;
435 default:
436 break;
437 }
438 invalid_input:
439 return stride;
440 }
441
VENUS_UV_STRIDE(int color_fmt,int width)442 static inline unsigned int VENUS_UV_STRIDE(int color_fmt, int width)
443 {
444 unsigned int alignment, stride = 0;
445 if (!width)
446 goto invalid_input;
447
448 switch (color_fmt) {
449 case COLOR_FMT_NV21:
450 case COLOR_FMT_NV12:
451 case COLOR_FMT_NV12_MVTB:
452 case COLOR_FMT_NV12_UBWC:
453 alignment = 128;
454 stride = MSM_MEDIA_ALIGN(width, alignment);
455 break;
456 case COLOR_FMT_NV12_BPP10_UBWC:
457 alignment = 256;
458 stride = MSM_MEDIA_ALIGN(width, 192);
459 stride = MSM_MEDIA_ALIGN(stride * 4/3, alignment);
460 break;
461 default:
462 break;
463 }
464 invalid_input:
465 return stride;
466 }
467
VENUS_Y_SCANLINES(int color_fmt,int height)468 static inline unsigned int VENUS_Y_SCANLINES(int color_fmt, int height)
469 {
470 unsigned int alignment, sclines = 0;
471 if (!height)
472 goto invalid_input;
473
474 switch (color_fmt) {
475 case COLOR_FMT_NV21:
476 case COLOR_FMT_NV12:
477 case COLOR_FMT_NV12_MVTB:
478 case COLOR_FMT_NV12_UBWC:
479 alignment = 32;
480 break;
481 case COLOR_FMT_NV12_BPP10_UBWC:
482 alignment = 16;
483 break;
484 default:
485 return 0;
486 }
487 sclines = MSM_MEDIA_ALIGN(height, alignment);
488 invalid_input:
489 return sclines;
490 }
491
VENUS_UV_SCANLINES(int color_fmt,int height)492 static inline unsigned int VENUS_UV_SCANLINES(int color_fmt, int height)
493 {
494 unsigned int alignment, sclines = 0;
495 if (!height)
496 goto invalid_input;
497
498 switch (color_fmt) {
499 case COLOR_FMT_NV21:
500 case COLOR_FMT_NV12:
501 case COLOR_FMT_NV12_MVTB:
502 case COLOR_FMT_NV12_BPP10_UBWC:
503 alignment = 16;
504 break;
505 case COLOR_FMT_NV12_UBWC:
506 alignment = 32;
507 break;
508 default:
509 goto invalid_input;
510 }
511
512 sclines = MSM_MEDIA_ALIGN(height / 2, alignment);
513
514 invalid_input:
515 return sclines;
516 }
517
VENUS_Y_META_STRIDE(int color_fmt,int width)518 static inline unsigned int VENUS_Y_META_STRIDE(int color_fmt, int width)
519 {
520 int y_tile_width = 0, y_meta_stride = 0;
521
522 if (!width)
523 goto invalid_input;
524
525 switch (color_fmt) {
526 case COLOR_FMT_NV12_UBWC:
527 y_tile_width = 32;
528 break;
529 case COLOR_FMT_NV12_BPP10_UBWC:
530 y_tile_width = 48;
531 break;
532 default:
533 goto invalid_input;
534 }
535
536 y_meta_stride = MSM_MEDIA_ROUNDUP(width, y_tile_width);
537 y_meta_stride = MSM_MEDIA_ALIGN(y_meta_stride, 64);
538
539 invalid_input:
540 return y_meta_stride;
541 }
542
VENUS_Y_META_SCANLINES(int color_fmt,int height)543 static inline unsigned int VENUS_Y_META_SCANLINES(int color_fmt, int height)
544 {
545 int y_tile_height = 0, y_meta_scanlines = 0;
546
547 if (!height)
548 goto invalid_input;
549
550 switch (color_fmt) {
551 case COLOR_FMT_NV12_UBWC:
552 y_tile_height = 8;
553 break;
554 case COLOR_FMT_NV12_BPP10_UBWC:
555 y_tile_height = 4;
556 break;
557 default:
558 goto invalid_input;
559 }
560
561 y_meta_scanlines = MSM_MEDIA_ROUNDUP(height, y_tile_height);
562 y_meta_scanlines = MSM_MEDIA_ALIGN(y_meta_scanlines, 16);
563
564 invalid_input:
565 return y_meta_scanlines;
566 }
567
VENUS_UV_META_STRIDE(int color_fmt,int width)568 static inline unsigned int VENUS_UV_META_STRIDE(int color_fmt, int width)
569 {
570 int uv_tile_width = 0, uv_meta_stride = 0;
571
572 if (!width)
573 goto invalid_input;
574
575 switch (color_fmt) {
576 case COLOR_FMT_NV12_UBWC:
577 uv_tile_width = 16;
578 break;
579 case COLOR_FMT_NV12_BPP10_UBWC:
580 uv_tile_width = 24;
581 break;
582 default:
583 goto invalid_input;
584 }
585
586 uv_meta_stride = MSM_MEDIA_ROUNDUP(width / 2, uv_tile_width);
587 uv_meta_stride = MSM_MEDIA_ALIGN(uv_meta_stride, 64);
588
589 invalid_input:
590 return uv_meta_stride;
591 }
592
VENUS_UV_META_SCANLINES(int color_fmt,int height)593 static inline unsigned int VENUS_UV_META_SCANLINES(int color_fmt, int height)
594 {
595 int uv_tile_height = 0, uv_meta_scanlines = 0;
596
597 if (!height)
598 goto invalid_input;
599
600 switch (color_fmt) {
601 case COLOR_FMT_NV12_UBWC:
602 uv_tile_height = 8;
603 break;
604 case COLOR_FMT_NV12_BPP10_UBWC:
605 uv_tile_height = 4;
606 break;
607 default:
608 goto invalid_input;
609 }
610
611 uv_meta_scanlines = MSM_MEDIA_ROUNDUP(height / 2, uv_tile_height);
612 uv_meta_scanlines = MSM_MEDIA_ALIGN(uv_meta_scanlines, 16);
613
614 invalid_input:
615 return uv_meta_scanlines;
616 }
617
VENUS_RGB_STRIDE(int color_fmt,int width)618 static inline unsigned int VENUS_RGB_STRIDE(int color_fmt, int width)
619 {
620 unsigned int alignment = 0, stride = 0;
621 if (!width)
622 goto invalid_input;
623
624 switch (color_fmt) {
625 case COLOR_FMT_RGBA8888:
626 alignment = 128;
627 break;
628 case COLOR_FMT_RGBA8888_UBWC:
629 alignment = 256;
630 break;
631 default:
632 goto invalid_input;
633 }
634
635 stride = MSM_MEDIA_ALIGN(width * 4, alignment);
636
637 invalid_input:
638 return stride;
639 }
640
VENUS_RGB_SCANLINES(int color_fmt,int height)641 static inline unsigned int VENUS_RGB_SCANLINES(int color_fmt, int height)
642 {
643 unsigned int alignment = 0, scanlines = 0;
644
645 if (!height)
646 goto invalid_input;
647
648 switch (color_fmt) {
649 case COLOR_FMT_RGBA8888:
650 alignment = 32;
651 break;
652 case COLOR_FMT_RGBA8888_UBWC:
653 alignment = 16;
654 break;
655 default:
656 goto invalid_input;
657 }
658
659 scanlines = MSM_MEDIA_ALIGN(height, alignment);
660
661 invalid_input:
662 return scanlines;
663 }
664
VENUS_RGB_META_STRIDE(int color_fmt,int width)665 static inline unsigned int VENUS_RGB_META_STRIDE(int color_fmt, int width)
666 {
667 int rgb_tile_width = 0, rgb_meta_stride = 0;
668
669 if (!width)
670 goto invalid_input;
671
672 switch (color_fmt) {
673 case COLOR_FMT_RGBA8888_UBWC:
674 rgb_tile_width = 16;
675 break;
676 default:
677 goto invalid_input;
678 }
679
680 rgb_meta_stride = MSM_MEDIA_ROUNDUP(width, rgb_tile_width);
681 rgb_meta_stride = MSM_MEDIA_ALIGN(rgb_meta_stride, 64);
682
683 invalid_input:
684 return rgb_meta_stride;
685 }
686
VENUS_RGB_META_SCANLINES(int color_fmt,int height)687 static inline unsigned int VENUS_RGB_META_SCANLINES(int color_fmt, int height)
688 {
689 int rgb_tile_height = 0, rgb_meta_scanlines = 0;
690
691 if (!height)
692 goto invalid_input;
693
694 switch (color_fmt) {
695 case COLOR_FMT_RGBA8888_UBWC:
696 rgb_tile_height = 4;
697 break;
698 default:
699 goto invalid_input;
700 }
701
702 rgb_meta_scanlines = MSM_MEDIA_ROUNDUP(height, rgb_tile_height);
703 rgb_meta_scanlines = MSM_MEDIA_ALIGN(rgb_meta_scanlines, 16);
704
705 invalid_input:
706 return rgb_meta_scanlines;
707 }
708
VENUS_BUFFER_SIZE(int color_fmt,int width,int height)709 static inline unsigned int VENUS_BUFFER_SIZE(
710 int color_fmt, int width, int height)
711 {
712 const unsigned int extra_size = VENUS_EXTRADATA_SIZE(width, height);
713 unsigned int uv_alignment = 0, size = 0;
714 unsigned int y_plane, uv_plane, y_stride,
715 uv_stride, y_sclines, uv_sclines;
716 unsigned int y_ubwc_plane = 0, uv_ubwc_plane = 0;
717 unsigned int y_meta_stride = 0, y_meta_scanlines = 0;
718 unsigned int uv_meta_stride = 0, uv_meta_scanlines = 0;
719 unsigned int y_meta_plane = 0, uv_meta_plane = 0;
720 unsigned int rgb_stride = 0, rgb_scanlines = 0;
721 unsigned int rgb_plane = 0, rgb_ubwc_plane = 0, rgb_meta_plane = 0;
722 unsigned int rgb_meta_stride = 0, rgb_meta_scanlines = 0;
723
724 if (!width || !height)
725 goto invalid_input;
726
727 y_stride = VENUS_Y_STRIDE(color_fmt, width);
728 uv_stride = VENUS_UV_STRIDE(color_fmt, width);
729 y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
730 uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
731 rgb_stride = VENUS_RGB_STRIDE(color_fmt, width);
732 rgb_scanlines = VENUS_RGB_SCANLINES(color_fmt, height);
733
734 switch (color_fmt) {
735 case COLOR_FMT_NV21:
736 case COLOR_FMT_NV12:
737 uv_alignment = 4096;
738 y_plane = y_stride * y_sclines;
739 uv_plane = uv_stride * uv_sclines + uv_alignment;
740 size = y_plane + uv_plane +
741 MSM_MEDIA_MAX(extra_size, 8 * y_stride);
742 size = MSM_MEDIA_ALIGN(size, 4096);
743 break;
744 case COLOR_FMT_NV12_MVTB:
745 uv_alignment = 4096;
746 y_plane = y_stride * y_sclines;
747 uv_plane = uv_stride * uv_sclines + uv_alignment;
748 size = y_plane + uv_plane;
749 size = 2 * size + extra_size;
750 size = MSM_MEDIA_ALIGN(size, 4096);
751 break;
752 case COLOR_FMT_NV12_UBWC:
753 case COLOR_FMT_NV12_BPP10_UBWC:
754 y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
755 uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096);
756 y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
757 y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
758 y_meta_plane = MSM_MEDIA_ALIGN(
759 y_meta_stride * y_meta_scanlines, 4096);
760 uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
761 uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
762 uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride *
763 uv_meta_scanlines, 4096);
764
765 size = y_ubwc_plane + uv_ubwc_plane + y_meta_plane +
766 uv_meta_plane +
767 MSM_MEDIA_MAX(extra_size + 8192, 48 * y_stride);
768 size = MSM_MEDIA_ALIGN(size, 4096);
769 break;
770 case COLOR_FMT_RGBA8888:
771 rgb_plane = MSM_MEDIA_ALIGN(rgb_stride * rgb_scanlines, 4096);
772 size = rgb_plane;
773 size = MSM_MEDIA_ALIGN(size, 4096);
774 break;
775 case COLOR_FMT_RGBA8888_UBWC:
776 rgb_ubwc_plane = MSM_MEDIA_ALIGN(rgb_stride * rgb_scanlines,
777 4096);
778 rgb_meta_stride = VENUS_RGB_META_STRIDE(color_fmt, width);
779 rgb_meta_scanlines = VENUS_RGB_META_SCANLINES(color_fmt,
780 height);
781 rgb_meta_plane = MSM_MEDIA_ALIGN(rgb_meta_stride *
782 rgb_meta_scanlines, 4096);
783 size = rgb_ubwc_plane + rgb_meta_plane;
784 size = MSM_MEDIA_ALIGN(size, 4096);
785 break;
786 default:
787 break;
788 }
789 invalid_input:
790 return size;
791 }
792
VENUS_VIEW2_OFFSET(int color_fmt,int width,int height)793 static inline unsigned int VENUS_VIEW2_OFFSET(
794 int color_fmt, int width, int height)
795 {
796 unsigned int offset = 0;
797 unsigned int y_plane, uv_plane, y_stride,
798 uv_stride, y_sclines, uv_sclines;
799 if (!width || !height)
800 goto invalid_input;
801
802 y_stride = VENUS_Y_STRIDE(color_fmt, width);
803 uv_stride = VENUS_UV_STRIDE(color_fmt, width);
804 y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
805 uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
806 switch (color_fmt) {
807 case COLOR_FMT_NV12_MVTB:
808 y_plane = y_stride * y_sclines;
809 uv_plane = uv_stride * uv_sclines;
810 offset = y_plane + uv_plane;
811 break;
812 default:
813 break;
814 }
815 invalid_input:
816 return offset;
817 }
818
819 #endif
820