• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef __MEDIA_INFO_H__
2 #define __MEDIA_INFO_H__
3 
4 #ifndef MSM_MEDIA_ALIGN
5 #define MSM_MEDIA_ALIGN(__sz, __align) (((__align) & ((__align) - 1)) ?\
6 	((((__sz) + (__align) - 1) / (__align)) * (__align)) :\
7 	(((__sz) + (__align) - 1) & (~((__align) - 1))))
8 #endif
9 
10 #ifndef MSM_MEDIA_ROUNDUP
11 #define MSM_MEDIA_ROUNDUP(__sz, __r) (((__sz) + ((__r) - 1)) / (__r))
12 #endif
13 
14 #ifndef MSM_MEDIA_MAX
15 #define MSM_MEDIA_MAX(__a, __b) ((__a) > (__b)?(__a):(__b))
16 #endif
17 
18 enum color_fmts {
19 	/* Venus NV12:
20 	 * YUV 4:2:0 image with a plane of 8 bit Y samples followed
21 	 * by an interleaved U/V plane containing 8 bit 2x2 subsampled
22 	 * colour difference samples.
23 	 *
24 	 * <-------- Y/UV_Stride -------->
25 	 * <------- Width ------->
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 . . . .  |           |
28 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  Height      |
29 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |          Y_Scanlines
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 . . . .  |           |
32 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
33 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  V           |
34 	 * . . . . . . . . . . . . . . . .              |
35 	 * . . . . . . . . . . . . . . . .              |
36 	 * . . . . . . . . . . . . . . . .              |
37 	 * . . . . . . . . . . . . . . . .              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 . . . .  |
40 	 * U V U V U V U V U V U V . . . .  |
41 	 * U V U V U V U V U V U V . . . .  UV_Scanlines
42 	 * . . . . . . . . . . . . . . . .  |
43 	 * . . . . . . . . . . . . . . . .  V
44 	 * . . . . . . . . . . . . . . . .  --> Buffer size alignment
45 	 *
46 	 * Y_Stride : Width aligned to 128
47 	 * UV_Stride : Width aligned to 128
48 	 * Y_Scanlines: Height aligned to 32
49 	 * UV_Scanlines: Height/2 aligned to 16
50 	 * Extradata: Arbitrary (software-imposed) padding
51 	 * Total size = align((Y_Stride * Y_Scanlines
52 	 *          + UV_Stride * UV_Scanlines
53 	 *          + max(Extradata, Y_Stride * 8), 4096)
54 	 */
55 	COLOR_FMT_NV12,
56 
57 	/* Venus NV21:
58 	 * YUV 4:2:0 image with a plane of 8 bit Y samples followed
59 	 * by an interleaved V/U plane containing 8 bit 2x2 subsampled
60 	 * colour difference samples.
61 	 *
62 	 * <-------- Y/UV_Stride -------->
63 	 * <------- Width ------->
64 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  ^           ^
65 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
66 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  Height      |
67 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |          Y_Scanlines
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 . . . .  |           |
70 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
71 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  V           |
72 	 * . . . . . . . . . . . . . . . .              |
73 	 * . . . . . . . . . . . . . . . .              |
74 	 * . . . . . . . . . . . . . . . .              |
75 	 * . . . . . . . . . . . . . . . .              V
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 . . . .  |
78 	 * V U V U V U V U V U V U . . . .  |
79 	 * V U V U V U V U V U V U . . . .  UV_Scanlines
80 	 * . . . . . . . . . . . . . . . .  |
81 	 * . . . . . . . . . . . . . . . .  V
82 	 * . . . . . . . . . . . . . . . .  --> Padding & Buffer size alignment
83 	 *
84 	 * Y_Stride : Width aligned to 128
85 	 * UV_Stride : Width aligned to 128
86 	 * Y_Scanlines: Height aligned to 32
87 	 * UV_Scanlines: Height/2 aligned to 16
88 	 * Extradata: Arbitrary (software-imposed) padding
89 	 * Total size = align((Y_Stride * Y_Scanlines
90 	 *          + UV_Stride * UV_Scanlines
91 	 *          + max(Extradata, Y_Stride * 8), 4096)
92 	 */
93 	COLOR_FMT_NV21,
94 	/* Venus NV12_MVTB:
95 	 * Two YUV 4:2:0 images/views one after the other
96 	 * in a top-bottom layout, same as NV12
97 	 * with a plane of 8 bit Y samples followed
98 	 * by an interleaved U/V plane containing 8 bit 2x2 subsampled
99 	 * colour difference samples.
100 	 *
101 	 *
102 	 * <-------- Y/UV_Stride -------->
103 	 * <------- Width ------->
104 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  ^           ^               ^
105 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
106 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  Height      |               |
107 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |          Y_Scanlines      |
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 . . . .  |           |               |
110 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
111 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  V           |               |
112 	 * . . . . . . . . . . . . . . . .              |             View_1
113 	 * . . . . . . . . . . . . . . . .              |               |
114 	 * . . . . . . . . . . . . . . . .              |               |
115 	 * . . . . . . . . . . . . . . . .              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 . . . .  |                           |
118 	 * U V U V U V U V U V U V . . . .  |                           |
119 	 * U V U V U V U V U V U V . . . .  UV_Scanlines                |
120 	 * . . . . . . . . . . . . . . . .  |                           |
121 	 * . . . . . . . . . . . . . . . .  V                           V
122 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  ^           ^               ^
123 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
124 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  Height      |               |
125 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |          Y_Scanlines      |
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 . . . .  |           |               |
128 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |               |
129 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  V           |               |
130 	 * . . . . . . . . . . . . . . . .              |             View_2
131 	 * . . . . . . . . . . . . . . . .              |               |
132 	 * . . . . . . . . . . . . . . . .              |               |
133 	 * . . . . . . . . . . . . . . . .              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 . . . .  |                           |
136 	 * U V U V U V U V U V U V . . . .  |                           |
137 	 * U V U V U V U V U V U V . . . .  UV_Scanlines                |
138 	 * . . . . . . . . . . . . . . . .  |                           |
139 	 * . . . . . . . . . . . . . . . .  V                           V
140 	 * . . . . . . . . . . . . . . . .  --> Buffer size alignment
141 	 *
142 	 * Y_Stride : Width aligned to 128
143 	 * UV_Stride : Width aligned to 128
144 	 * Y_Scanlines: Height aligned to 32
145 	 * UV_Scanlines: Height/2 aligned to 16
146 	 * View_1 begin at: 0 (zero)
147 	 * View_2 begin at: Y_Stride * Y_Scanlines + UV_Stride * UV_Scanlines
148 	 * Extradata: Arbitrary (software-imposed) padding
149 	 * Total size = align((2*(Y_Stride * Y_Scanlines)
150 	 *          + 2*(UV_Stride * UV_Scanlines) + Extradata), 4096)
151 	 */
152 	COLOR_FMT_NV12_MVTB,
153 	/* Venus NV12 UBWC:
154 	 * Compressed Macro-tile format for NV12.
155 	 * Contains 4 planes in the following order -
156 	 * (A) Y_Meta_Plane
157 	 * (B) Y_UBWC_Plane
158 	 * (C) UV_Meta_Plane
159 	 * (D) UV_UBWC_Plane
160 	 *
161 	 * Y_Meta_Plane consists of meta information to decode compressed
162 	 * tile data in Y_UBWC_Plane.
163 	 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
164 	 * UBWC decoder block will use the Y_Meta_Plane data together with
165 	 * Y_UBWC_Plane data to produce loss-less uncompressed 8 bit Y samples.
166 	 *
167 	 * UV_Meta_Plane consists of meta information to decode compressed
168 	 * tile data in UV_UBWC_Plane.
169 	 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
170 	 * UBWC decoder block will use UV_Meta_Plane data together with
171 	 * UV_UBWC_Plane data to produce loss-less uncompressed 8 bit 2x2
172 	 * subsampled color difference samples.
173 	 *
174 	 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
175 	 * and randomly accessible. There is no dependency between tiles.
176 	 *
177 	 * <----- Y_Meta_Stride ---->
178 	 * <-------- Width ------>
179 	 * M M M M M M M M M M M M . .      ^           ^
180 	 * M M M M M M M M M M M M . .      |           |
181 	 * M M M M M M M M M M M M . .      Height      |
182 	 * M M M M M M M M M M M M . .      |         Meta_Y_Scanlines
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 . .      |           |
185 	 * M M M M M M M M M M M M . .      |           |
186 	 * M M M M M M M M M M M M . .      V           |
187 	 * . . . . . . . . . . . . . .                  |
188 	 * . . . . . . . . . . . . . .                  |
189 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
190 	 * . . . . . . . . . . . . . .                  V
191 	 * <--Compressed tile Y Stride--->
192 	 * <------- Width ------->
193 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  ^           ^
194 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
195 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  Height      |
196 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |        Macro_tile_Y_Scanlines
197 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
198 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
199 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
200 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  V           |
201 	 * . . . . . . . . . . . . . . . .              |
202 	 * . . . . . . . . . . . . . . . .              |
203 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
204 	 * . . . . . . . . . . . . . . . .              V
205 	 * <----- UV_Meta_Stride ---->
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 . .      |
208 	 * M M M M M M M M M M M M . .      |
209 	 * M M M M M M M M M M M M . .      M_UV_Scanlines
210 	 * . . . . . . . . . . . . . .      |
211 	 * . . . . . . . . . . . . . .      V
212 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
213 	 * <--Compressed tile UV Stride--->
214 	 * U* V* U* V* U* V* U* V* . . . .  ^
215 	 * U* V* U* V* U* V* U* V* . . . .  |
216 	 * U* V* U* V* U* V* U* V* . . . .  |
217 	 * U* V* U* V* U* V* U* V* . . . .  UV_Scanlines
218 	 * . . . . . . . . . . . . . . . .  |
219 	 * . . . . . . . . . . . . . . . .  V
220 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
221 	 *
222 	 * Y_Stride = align(Width, 128)
223 	 * UV_Stride = align(Width, 128)
224 	 * Y_Scanlines = align(Height, 32)
225 	 * UV_Scanlines = align(Height/2, 16)
226 	 * Y_UBWC_Plane_size = align(Y_Stride * Y_Scanlines, 4096)
227 	 * UV_UBWC_Plane_size = align(UV_Stride * UV_Scanlines, 4096)
228 	 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
229 	 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
230 	 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
231 	 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
232 	 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
233 	 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
234 	 * Extradata = 16k
235 	 *
236 	 * Total size = align( Y_UBWC_Plane_size + UV_UBWC_Plane_size +
237 	 *           Y_Meta_Plane_size + UV_Meta_Plane_size
238 	 *           + max(Extradata, Y_Stride * 64), 4096)
239 	 */
240 	COLOR_FMT_NV12_UBWC,
241 	/* Venus NV12 10-bit UBWC:
242 	 * Compressed Macro-tile format for NV12.
243 	 * Contains 4 planes in the following order -
244 	 * (A) Y_Meta_Plane
245 	 * (B) Y_UBWC_Plane
246 	 * (C) UV_Meta_Plane
247 	 * (D) UV_UBWC_Plane
248 	 *
249 	 * Y_Meta_Plane consists of meta information to decode compressed
250 	 * tile data in Y_UBWC_Plane.
251 	 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
252 	 * UBWC decoder block will use the Y_Meta_Plane data together with
253 	 * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples.
254 	 *
255 	 * UV_Meta_Plane consists of meta information to decode compressed
256 	 * tile data in UV_UBWC_Plane.
257 	 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
258 	 * UBWC decoder block will use UV_Meta_Plane data together with
259 	 * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2
260 	 * subsampled color difference samples.
261 	 *
262 	 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
263 	 * and randomly accessible. There is no dependency between tiles.
264 	 *
265 	 * <----- Y_Meta_Stride ----->
266 	 * <-------- Width ------>
267 	 * M M M M M M M M M M M M . .      ^           ^
268 	 * M M M M M M M M M M M M . .      |           |
269 	 * M M M M M M M M M M M M . .      Height      |
270 	 * M M M M M M M M M M M M . .      |         Meta_Y_Scanlines
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 . .      |           |
273 	 * M M M M M M M M M M M M . .      |           |
274 	 * M M M M M M M M M M M M . .      V           |
275 	 * . . . . . . . . . . . . . .                  |
276 	 * . . . . . . . . . . . . . .                  |
277 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
278 	 * . . . . . . . . . . . . . .                  V
279 	 * <--Compressed tile Y Stride--->
280 	 * <------- Width ------->
281 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  ^           ^
282 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
283 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  Height      |
284 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |        Macro_tile_Y_Scanlines
285 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
286 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
287 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
288 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  V           |
289 	 * . . . . . . . . . . . . . . . .              |
290 	 * . . . . . . . . . . . . . . . .              |
291 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
292 	 * . . . . . . . . . . . . . . . .              V
293 	 * <----- UV_Meta_Stride ---->
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 . .      |
296 	 * M M M M M M M M M M M M . .      |
297 	 * M M M M M M M M M M M M . .      M_UV_Scanlines
298 	 * . . . . . . . . . . . . . .      |
299 	 * . . . . . . . . . . . . . .      V
300 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
301 	 * <--Compressed tile UV Stride--->
302 	 * U* V* U* V* U* V* U* V* . . . .  ^
303 	 * U* V* U* V* U* V* U* V* . . . .  |
304 	 * U* V* U* V* U* V* U* V* . . . .  |
305 	 * U* V* U* V* U* V* U* V* . . . .  UV_Scanlines
306 	 * . . . . . . . . . . . . . . . .  |
307 	 * . . . . . . . . . . . . . . . .  V
308 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
309 	 *
310 	 *
311 	 * Y_Stride = align(Width * 4/3, 128)
312 	 * UV_Stride = align(Width * 4/3, 128)
313 	 * Y_Scanlines = align(Height, 32)
314 	 * UV_Scanlines = align(Height/2, 16)
315 	 * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096)
316 	 * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096)
317 	 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
318 	 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
319 	 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
320 	 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
321 	 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
322 	 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
323 	 * Extradata = 16k
324 	 *
325 	 * Total size = align(Y_UBWC_Plane_size + UV_UBWC_Plane_size +
326 	 *           Y_Meta_Plane_size + UV_Meta_Plane_size
327 	 *           + max(Extradata, Y_Stride * 64), 4096)
328 	 */
329 	COLOR_FMT_NV12_BPP10_UBWC,
330 	/* Venus RGBA8888 format:
331 	 * Contains 1 plane in the following order -
332 	 * (A) RGBA plane
333 	 *
334 	 * <-------- RGB_Stride -------->
335 	 * <------- Width ------->
336 	 * R R R R R R R R R R R R . . . .  ^           ^
337 	 * R R R R R R R R R R R R . . . .  |           |
338 	 * R R R R R R R R R R R R . . . .  Height      |
339 	 * R R R R R R R R R R R R . . . .  |       RGB_Scanlines
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 . . . .  |           |
342 	 * R R R R R R R R R R R R . . . .  |           |
343 	 * R R R R R R R R R R R R . . . .  V           |
344 	 * . . . . . . . . . . . . . . . .              |
345 	 * . . . . . . . . . . . . . . . .              |
346 	 * . . . . . . . . . . . . . . . .              |
347 	 * . . . . . . . . . . . . . . . .              V
348 	 *
349 	 * RGB_Stride = align(Width * 4, 128)
350 	 * RGB_Scanlines = align(Height, 32)
351 	 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
352 	 * Extradata = 8k
353 	 *
354 	 * Total size = align(RGB_Plane_size + Extradata, 4096)
355 	 */
356 	COLOR_FMT_RGBA8888,
357 	/* Venus RGBA8888 UBWC format:
358 	 * Contains 2 planes in the following order -
359 	 * (A) Meta plane
360 	 * (B) RGBA plane
361 	 *
362 	 * <--- RGB_Meta_Stride ---->
363 	 * <-------- Width ------>
364 	 * M M M M M M M M M M M M . .      ^           ^
365 	 * M M M M M M M M M M M M . .      |           |
366 	 * M M M M M M M M M M M M . .      Height      |
367 	 * M M M M M M M M M M M M . .      |       Meta_RGB_Scanlines
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 . .      |           |
370 	 * M M M M M M M M M M M M . .      |           |
371 	 * M M M M M M M M M M M M . .      V           |
372 	 * . . . . . . . . . . . . . .                  |
373 	 * . . . . . . . . . . . . . .                  |
374 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
375 	 * . . . . . . . . . . . . . .                  V
376 	 * <-------- RGB_Stride -------->
377 	 * <------- Width ------->
378 	 * R R R R R R R R R R R R . . . .  ^           ^
379 	 * R R R R R R R R R R R R . . . .  |           |
380 	 * R R R R R R R R R R R R . . . .  Height      |
381 	 * R R R R R R R R R R R R . . . .  |       RGB_Scanlines
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 . . . .  |           |
384 	 * R R R R R R R R R R R R . . . .  |           |
385 	 * R R R R R R R R R R R R . . . .  V           |
386 	 * . . . . . . . . . . . . . . . .              |
387 	 * . . . . . . . . . . . . . . . .              |
388 	 * . . . . . . . . . . . . . . . .    -------> Buffer size aligned to 4k
389 	 * . . . . . . . . . . . . . . . .              V
390 	 *
391 	 * RGB_Stride = align(Width * 4, 128)
392 	 * RGB_Scanlines = align(Height, 32)
393 	 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
394 	 * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64)
395 	 * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16)
396 	 * RGB_Meta_Plane_size = align(RGB_Meta_Stride *
397 	 *		RGB_Meta_Scanlines, 4096)
398 	 * Extradata = 8k
399 	 *
400 	 * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size +
401 	 *		Extradata, 4096)
402 	 */
403 	COLOR_FMT_RGBA8888_UBWC,
404 	/* Venus RGBA1010102 UBWC format:
405 	 * Contains 2 planes in the following order -
406 	 * (A) Meta plane
407 	 * (B) RGBA plane
408 	 *
409 	 * <--- RGB_Meta_Stride ---->
410 	 * <-------- Width ------>
411 	 * M M M M M M M M M M M M . .      ^           ^
412 	 * M M M M M M M M M M M M . .      |           |
413 	 * M M M M M M M M M M M M . .      Height      |
414 	 * M M M M M M M M M M M M . .      |       Meta_RGB_Scanlines
415 	 * M M M M M M M M M M M M . .      |           |
416 	 * M M M M M M M M M M M M . .      |           |
417 	 * M M M M M M M M M M M M . .      |           |
418 	 * M M M M M M M M M M M M . .      V           |
419 	 * . . . . . . . . . . . . . .                  |
420 	 * . . . . . . . . . . . . . .                  |
421 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
422 	 * . . . . . . . . . . . . . .                  V
423 	 * <-------- RGB_Stride -------->
424 	 * <------- Width ------->
425 	 * R R R R R R R R R R R R . . . .  ^           ^
426 	 * R R R R R R R R R R R R . . . .  |           |
427 	 * R R R R R R R R R R R R . . . .  Height      |
428 	 * R R R R R R R R R R R R . . . .  |       RGB_Scanlines
429 	 * R R R R R R R R R R R R . . . .  |           |
430 	 * R R R R R R R R R R R R . . . .  |           |
431 	 * R R R R R R R R R R R R . . . .  |           |
432 	 * R R R R R R R R R R R R . . . .  V           |
433 	 * . . . . . . . . . . . . . . . .              |
434 	 * . . . . . . . . . . . . . . . .              |
435 	 * . . . . . . . . . . . . . . . .    -------> Buffer size aligned to 4k
436 	 * . . . . . . . . . . . . . . . .              V
437 	 *
438 	 * RGB_Stride = align(Width * 4, 256)
439 	 * RGB_Scanlines = align(Height, 16)
440 	 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
441 	 * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64)
442 	 * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16)
443 	 * RGB_Meta_Plane_size = align(RGB_Meta_Stride *
444 	 *		RGB_Meta_Scanlines, 4096)
445 	 * Extradata = 8k
446 	 *
447 	 * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size +
448 	 *		Extradata, 4096)
449 	 */
450 	COLOR_FMT_RGBA1010102_UBWC,
451 	/* Venus RGB565 UBWC format:
452 	 * Contains 2 planes in the following order -
453 	 * (A) Meta plane
454 	 * (B) RGB plane
455 	 *
456 	 * <--- RGB_Meta_Stride ---->
457 	 * <-------- Width ------>
458 	 * M M M M M M M M M M M M . .      ^           ^
459 	 * M M M M M M M M M M M M . .      |           |
460 	 * M M M M M M M M M M M M . .      Height      |
461 	 * M M M M M M M M M M M M . .      |       Meta_RGB_Scanlines
462 	 * M M M M M M M M M M M M . .      |           |
463 	 * M M M M M M M M M M M M . .      |           |
464 	 * M M M M M M M M M M M M . .      |           |
465 	 * M M M M M M M M M M M M . .      V           |
466 	 * . . . . . . . . . . . . . .                  |
467 	 * . . . . . . . . . . . . . .                  |
468 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
469 	 * . . . . . . . . . . . . . .                  V
470 	 * <-------- RGB_Stride -------->
471 	 * <------- Width ------->
472 	 * R R R R R R R R R R R R . . . .  ^           ^
473 	 * R R R R R R R R R R R R . . . .  |           |
474 	 * R R R R R R R R R R R R . . . .  Height      |
475 	 * R R R R R R R R R R R R . . . .  |       RGB_Scanlines
476 	 * R R R R R R R R R R R R . . . .  |           |
477 	 * R R R R R R R R R R R R . . . .  |           |
478 	 * R R R R R R R R R R R R . . . .  |           |
479 	 * R R R R R R R R R R R R . . . .  V           |
480 	 * . . . . . . . . . . . . . . . .              |
481 	 * . . . . . . . . . . . . . . . .              |
482 	 * . . . . . . . . . . . . . . . .    -------> Buffer size aligned to 4k
483 	 * . . . . . . . . . . . . . . . .              V
484 	 *
485 	 * RGB_Stride = align(Width * 2, 128)
486 	 * RGB_Scanlines = align(Height, 16)
487 	 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
488 	 * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64)
489 	 * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16)
490 	 * RGB_Meta_Plane_size = align(RGB_Meta_Stride *
491 	 *		RGB_Meta_Scanlines, 4096)
492 	 * Extradata = 8k
493 	 *
494 	 * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size +
495 	 *		Extradata, 4096)
496 	 */
497 	COLOR_FMT_RGB565_UBWC,
498 	/* P010 UBWC:
499 	 * Compressed Macro-tile format for NV12.
500 	 * Contains 4 planes in the following order -
501 	 * (A) Y_Meta_Plane
502 	 * (B) Y_UBWC_Plane
503 	 * (C) UV_Meta_Plane
504 	 * (D) UV_UBWC_Plane
505 	 *
506 	 * Y_Meta_Plane consists of meta information to decode compressed
507 	 * tile data in Y_UBWC_Plane.
508 	 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
509 	 * UBWC decoder block will use the Y_Meta_Plane data together with
510 	 * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples.
511 	 *
512 	 * UV_Meta_Plane consists of meta information to decode compressed
513 	 * tile data in UV_UBWC_Plane.
514 	 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
515 	 * UBWC decoder block will use UV_Meta_Plane data together with
516 	 * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2
517 	 * subsampled color difference samples.
518 	 *
519 	 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
520 	 * and randomly accessible. There is no dependency between tiles.
521 	 *
522 	 * <----- Y_Meta_Stride ----->
523 	 * <-------- Width ------>
524 	 * M M M M M M M M M M M M . .      ^           ^
525 	 * M M M M M M M M M M M M . .      |           |
526 	 * M M M M M M M M M M M M . .      Height      |
527 	 * M M M M M M M M M M M M . .      |         Meta_Y_Scanlines
528 	 * M M M M M M M M M M M M . .      |           |
529 	 * M M M M M M M M M M M M . .      |           |
530 	 * M M M M M M M M M M M M . .      |           |
531 	 * M M M M M M M M M M M M . .      V           |
532 	 * . . . . . . . . . . . . . .                  |
533 	 * . . . . . . . . . . . . . .                  |
534 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
535 	 * . . . . . . . . . . . . . .                  V
536 	 * <--Compressed tile Y Stride--->
537 	 * <------- Width ------->
538 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  ^           ^
539 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
540 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  Height      |
541 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |        Macro_tile_Y_Scanlines
542 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
543 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
544 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
545 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  V           |
546 	 * . . . . . . . . . . . . . . . .              |
547 	 * . . . . . . . . . . . . . . . .              |
548 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
549 	 * . . . . . . . . . . . . . . . .              V
550 	 * <----- UV_Meta_Stride ---->
551 	 * M M M M M M M M M M M M . .      ^
552 	 * M M M M M M M M M M M M . .      |
553 	 * M M M M M M M M M M M M . .      |
554 	 * M M M M M M M M M M M M . .      M_UV_Scanlines
555 	 * . . . . . . . . . . . . . .      |
556 	 * . . . . . . . . . . . . . .      V
557 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
558 	 * <--Compressed tile UV Stride--->
559 	 * U* V* U* V* U* V* U* V* . . . .  ^
560 	 * U* V* U* V* U* V* U* V* . . . .  |
561 	 * U* V* U* V* U* V* U* V* . . . .  |
562 	 * U* V* U* V* U* V* U* V* . . . .  UV_Scanlines
563 	 * . . . . . . . . . . . . . . . .  |
564 	 * . . . . . . . . . . . . . . . .  V
565 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
566 	 *
567 	 *
568 	 * Y_Stride = align(Width * 2, 256)
569 	 * UV_Stride = align(Width * 2, 256)
570 	 * Y_Scanlines = align(Height, 16)
571 	 * UV_Scanlines = align(Height/2, 16)
572 	 * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096)
573 	 * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096)
574 	 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
575 	 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
576 	 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
577 	 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
578 	 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
579 	 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
580 	 * Extradata = 8k
581 	 *
582 	 * Total size = align(Y_UBWC_Plane_size + UV_UBWC_Plane_size +
583 	 *           Y_Meta_Plane_size + UV_Meta_Plane_size
584 	 *           + max(Extradata, Y_Stride * 48), 4096)
585 	 */
586 	COLOR_FMT_P010_UBWC,
587 };
588 
589 #define COLOR_FMT_RGBA1010102_UBWC	COLOR_FMT_RGBA1010102_UBWC
590 #define COLOR_FMT_RGB565_UBWC		COLOR_FMT_RGB565_UBWC
591 #define COLOR_FMT_P010_UBWC		COLOR_FMT_P010_UBWC
592 
VENUS_EXTRADATA_SIZE(int width,int height)593 static __inline__ unsigned int VENUS_EXTRADATA_SIZE(int width, int height)
594 {
595 	(void)height;
596 	(void)width;
597 
598 	/*
599 	 * In the future, calculate the size based on the w/h but just
600 	 * hardcode it for now since 16K satisfies all current usecases.
601 	 */
602 	return 16 * 1024;
603 }
604 
VENUS_Y_STRIDE(int color_fmt,int width)605 static __inline__ unsigned int VENUS_Y_STRIDE(int color_fmt, int width)
606 {
607 	unsigned int alignment, stride = 0;
608 
609 	if (!width)
610 		goto invalid_input;
611 
612 	switch (color_fmt) {
613 	case COLOR_FMT_NV21:
614 	case COLOR_FMT_NV12:
615 	case COLOR_FMT_NV12_MVTB:
616 	case COLOR_FMT_NV12_UBWC:
617 		alignment = 128;
618 		stride = MSM_MEDIA_ALIGN(width, alignment);
619 		break;
620 	case COLOR_FMT_NV12_BPP10_UBWC:
621 		alignment = 256;
622 		stride = MSM_MEDIA_ALIGN(width, 192);
623 		stride = MSM_MEDIA_ALIGN(stride * 4/3, alignment);
624 		break;
625 	case COLOR_FMT_P010_UBWC:
626 		alignment = 256;
627 		stride = MSM_MEDIA_ALIGN(width * 2, alignment);
628 		break;
629 	default:
630 		break;
631 	}
632 invalid_input:
633 	return stride;
634 }
635 
VENUS_UV_STRIDE(int color_fmt,int width)636 static __inline__ unsigned int VENUS_UV_STRIDE(int color_fmt, int width)
637 {
638 	unsigned int alignment, stride = 0;
639 
640 	if (!width)
641 		goto invalid_input;
642 
643 	switch (color_fmt) {
644 	case COLOR_FMT_NV21:
645 	case COLOR_FMT_NV12:
646 	case COLOR_FMT_NV12_MVTB:
647 	case COLOR_FMT_NV12_UBWC:
648 		alignment = 128;
649 		stride = MSM_MEDIA_ALIGN(width, alignment);
650 		break;
651 	case COLOR_FMT_NV12_BPP10_UBWC:
652 		alignment = 256;
653 		stride = MSM_MEDIA_ALIGN(width, 192);
654 		stride = MSM_MEDIA_ALIGN(stride * 4/3, alignment);
655 		break;
656 	case COLOR_FMT_P010_UBWC:
657 		alignment = 256;
658 		stride = MSM_MEDIA_ALIGN(width * 2, alignment);
659 		break;
660 	default:
661 		break;
662 	}
663 invalid_input:
664 	return stride;
665 }
666 
VENUS_Y_SCANLINES(int color_fmt,int height)667 static __inline__ unsigned int VENUS_Y_SCANLINES(int color_fmt, int height)
668 {
669 	unsigned int alignment, sclines = 0;
670 
671 	if (!height)
672 		goto invalid_input;
673 
674 	switch (color_fmt) {
675 	case COLOR_FMT_NV21:
676 	case COLOR_FMT_NV12:
677 	case COLOR_FMT_NV12_MVTB:
678 	case COLOR_FMT_NV12_UBWC:
679 		alignment = 32;
680 		break;
681 	case COLOR_FMT_NV12_BPP10_UBWC:
682 	case COLOR_FMT_P010_UBWC:
683 		alignment = 16;
684 		break;
685 	default:
686 		return 0;
687 	}
688 	sclines = MSM_MEDIA_ALIGN(height, alignment);
689 invalid_input:
690 	return sclines;
691 }
692 
VENUS_UV_SCANLINES(int color_fmt,int height)693 static __inline__ unsigned int VENUS_UV_SCANLINES(int color_fmt, int height)
694 {
695 	unsigned int alignment, sclines = 0;
696 
697 	if (!height)
698 		goto invalid_input;
699 
700 	switch (color_fmt) {
701 	case COLOR_FMT_NV21:
702 	case COLOR_FMT_NV12:
703 	case COLOR_FMT_NV12_MVTB:
704 	case COLOR_FMT_NV12_BPP10_UBWC:
705 	case COLOR_FMT_P010_UBWC:
706 		alignment = 16;
707 		break;
708 	case COLOR_FMT_NV12_UBWC:
709 		alignment = 32;
710 		break;
711 	default:
712 		goto invalid_input;
713 	}
714 
715 	sclines = MSM_MEDIA_ALIGN(height / 2, alignment);
716 
717 invalid_input:
718 	return sclines;
719 }
720 
VENUS_Y_META_STRIDE(int color_fmt,int width)721 static __inline__ unsigned int VENUS_Y_META_STRIDE(int color_fmt, int width)
722 {
723 	int y_tile_width = 0, y_meta_stride = 0;
724 
725 	if (!width)
726 		goto invalid_input;
727 
728 	switch (color_fmt) {
729 	case COLOR_FMT_NV12_UBWC:
730 	case COLOR_FMT_P010_UBWC:
731 		y_tile_width = 32;
732 		break;
733 	case COLOR_FMT_NV12_BPP10_UBWC:
734 		y_tile_width = 48;
735 		break;
736 	default:
737 		goto invalid_input;
738 	}
739 
740 	y_meta_stride = MSM_MEDIA_ROUNDUP(width, y_tile_width);
741 	y_meta_stride = MSM_MEDIA_ALIGN(y_meta_stride, 64);
742 
743 invalid_input:
744 	return y_meta_stride;
745 }
746 
VENUS_Y_META_SCANLINES(int color_fmt,int height)747 static __inline__ unsigned int VENUS_Y_META_SCANLINES(int color_fmt, int height)
748 {
749 	int y_tile_height = 0, y_meta_scanlines = 0;
750 
751 	if (!height)
752 		goto invalid_input;
753 
754 	switch (color_fmt) {
755 	case COLOR_FMT_NV12_UBWC:
756 		y_tile_height = 8;
757 		break;
758 	case COLOR_FMT_NV12_BPP10_UBWC:
759 	case COLOR_FMT_P010_UBWC:
760 		y_tile_height = 4;
761 		break;
762 	default:
763 		goto invalid_input;
764 	}
765 
766 	y_meta_scanlines = MSM_MEDIA_ROUNDUP(height, y_tile_height);
767 	y_meta_scanlines = MSM_MEDIA_ALIGN(y_meta_scanlines, 16);
768 
769 invalid_input:
770 	return y_meta_scanlines;
771 }
772 
VENUS_UV_META_STRIDE(int color_fmt,int width)773 static __inline__ unsigned int VENUS_UV_META_STRIDE(int color_fmt, int width)
774 {
775 	int uv_tile_width = 0, uv_meta_stride = 0;
776 
777 	if (!width)
778 		goto invalid_input;
779 
780 	switch (color_fmt) {
781 	case COLOR_FMT_NV12_UBWC:
782 	case COLOR_FMT_P010_UBWC:
783 		uv_tile_width = 16;
784 		break;
785 	case COLOR_FMT_NV12_BPP10_UBWC:
786 		uv_tile_width = 24;
787 		break;
788 	default:
789 		goto invalid_input;
790 	}
791 
792 	uv_meta_stride = MSM_MEDIA_ROUNDUP(width / 2, uv_tile_width);
793 	uv_meta_stride = MSM_MEDIA_ALIGN(uv_meta_stride, 64);
794 
795 invalid_input:
796 	return uv_meta_stride;
797 }
798 
VENUS_UV_META_SCANLINES(int color_fmt,int height)799 static __inline__ unsigned int VENUS_UV_META_SCANLINES(int color_fmt, int height)
800 {
801 	int uv_tile_height = 0, uv_meta_scanlines = 0;
802 
803 	if (!height)
804 		goto invalid_input;
805 
806 	switch (color_fmt) {
807 	case COLOR_FMT_NV12_UBWC:
808 		uv_tile_height = 8;
809 		break;
810 	case COLOR_FMT_NV12_BPP10_UBWC:
811 	case COLOR_FMT_P010_UBWC:
812 		uv_tile_height = 4;
813 		break;
814 	default:
815 		goto invalid_input;
816 	}
817 
818 	uv_meta_scanlines = MSM_MEDIA_ROUNDUP(height / 2, uv_tile_height);
819 	uv_meta_scanlines = MSM_MEDIA_ALIGN(uv_meta_scanlines, 16);
820 
821 invalid_input:
822 	return uv_meta_scanlines;
823 }
824 
VENUS_RGB_STRIDE(int color_fmt,int width)825 static __inline__ unsigned int VENUS_RGB_STRIDE(int color_fmt, int width)
826 {
827 	unsigned int alignment = 0, stride = 0, bpp = 4;
828 
829 	if (!width)
830 		goto invalid_input;
831 
832 	switch (color_fmt) {
833 	case COLOR_FMT_RGBA8888:
834 		alignment = 128;
835 		break;
836 	case COLOR_FMT_RGB565_UBWC:
837 		alignment = 128;
838 		bpp = 2;
839 		break;
840 	case COLOR_FMT_RGBA8888_UBWC:
841 	case COLOR_FMT_RGBA1010102_UBWC:
842 		alignment = 256;
843 		break;
844 	default:
845 		goto invalid_input;
846 	}
847 
848 	stride = MSM_MEDIA_ALIGN(width * bpp, alignment);
849 
850 invalid_input:
851 	return stride;
852 }
853 
VENUS_RGB_SCANLINES(int color_fmt,int height)854 static __inline__ unsigned int VENUS_RGB_SCANLINES(int color_fmt, int height)
855 {
856 	unsigned int alignment = 0, scanlines = 0;
857 
858 	if (!height)
859 		goto invalid_input;
860 
861 	switch (color_fmt) {
862 	case COLOR_FMT_RGBA8888:
863 		alignment = 32;
864 		break;
865 	case COLOR_FMT_RGBA8888_UBWC:
866 	case COLOR_FMT_RGBA1010102_UBWC:
867 	case COLOR_FMT_RGB565_UBWC:
868 		alignment = 16;
869 		break;
870 	default:
871 		goto invalid_input;
872 	}
873 
874 	scanlines = MSM_MEDIA_ALIGN(height, alignment);
875 
876 invalid_input:
877 	return scanlines;
878 }
879 
VENUS_RGB_META_STRIDE(int color_fmt,int width)880 static __inline__ unsigned int VENUS_RGB_META_STRIDE(int color_fmt, int width)
881 {
882 	int rgb_tile_width = 0, rgb_meta_stride = 0;
883 
884 	if (!width)
885 		goto invalid_input;
886 
887 	switch (color_fmt) {
888 	case COLOR_FMT_RGBA8888_UBWC:
889 	case COLOR_FMT_RGBA1010102_UBWC:
890 	case COLOR_FMT_RGB565_UBWC:
891 		rgb_tile_width = 16;
892 		break;
893 	default:
894 		goto invalid_input;
895 	}
896 
897 	rgb_meta_stride = MSM_MEDIA_ROUNDUP(width, rgb_tile_width);
898 	rgb_meta_stride = MSM_MEDIA_ALIGN(rgb_meta_stride, 64);
899 
900 invalid_input:
901 	return rgb_meta_stride;
902 }
903 
VENUS_RGB_META_SCANLINES(int color_fmt,int height)904 static __inline__ unsigned int VENUS_RGB_META_SCANLINES(int color_fmt, int height)
905 {
906 	int rgb_tile_height = 0, rgb_meta_scanlines = 0;
907 
908 	if (!height)
909 		goto invalid_input;
910 
911 	switch (color_fmt) {
912 	case COLOR_FMT_RGBA8888_UBWC:
913 	case COLOR_FMT_RGBA1010102_UBWC:
914 	case COLOR_FMT_RGB565_UBWC:
915 		rgb_tile_height = 4;
916 		break;
917 	default:
918 		goto invalid_input;
919 	}
920 
921 	rgb_meta_scanlines = MSM_MEDIA_ROUNDUP(height, rgb_tile_height);
922 	rgb_meta_scanlines = MSM_MEDIA_ALIGN(rgb_meta_scanlines, 16);
923 
924 invalid_input:
925 	return rgb_meta_scanlines;
926 }
927 
VENUS_BUFFER_SIZE(int color_fmt,int width,int height)928 static __inline__ unsigned int VENUS_BUFFER_SIZE(
929 	int color_fmt, int width, int height)
930 {
931 	const unsigned int extra_size = VENUS_EXTRADATA_SIZE(width, height);
932 	unsigned int uv_alignment = 0, size = 0;
933 	unsigned int y_plane, uv_plane, y_stride,
934 		uv_stride, y_sclines, uv_sclines;
935 	unsigned int y_ubwc_plane = 0, uv_ubwc_plane = 0;
936 	unsigned int y_meta_stride = 0, y_meta_scanlines = 0;
937 	unsigned int uv_meta_stride = 0, uv_meta_scanlines = 0;
938 	unsigned int y_meta_plane = 0, uv_meta_plane = 0;
939 	unsigned int rgb_stride = 0, rgb_scanlines = 0;
940 	unsigned int rgb_plane = 0, rgb_ubwc_plane = 0, rgb_meta_plane = 0;
941 	unsigned int rgb_meta_stride = 0, rgb_meta_scanlines = 0;
942 
943 	if (!width || !height)
944 		goto invalid_input;
945 
946 	y_stride = VENUS_Y_STRIDE(color_fmt, width);
947 	uv_stride = VENUS_UV_STRIDE(color_fmt, width);
948 	y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
949 	uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
950 	rgb_stride = VENUS_RGB_STRIDE(color_fmt, width);
951 	rgb_scanlines = VENUS_RGB_SCANLINES(color_fmt, height);
952 
953 	switch (color_fmt) {
954 	case COLOR_FMT_NV21:
955 	case COLOR_FMT_NV12:
956 		uv_alignment = 4096;
957 		y_plane = y_stride * y_sclines;
958 		uv_plane = uv_stride * uv_sclines + uv_alignment;
959 		size = y_plane + uv_plane +
960 				MSM_MEDIA_MAX(extra_size, 8 * y_stride);
961 		size = MSM_MEDIA_ALIGN(size, 4096);
962 		break;
963 	case COLOR_FMT_NV12_MVTB:
964 		uv_alignment = 4096;
965 		y_plane = y_stride * y_sclines;
966 		uv_plane = uv_stride * uv_sclines + uv_alignment;
967 		size = y_plane + uv_plane;
968 		size = 2 * size + extra_size;
969 		size = MSM_MEDIA_ALIGN(size, 4096);
970 		break;
971 	case COLOR_FMT_NV12_UBWC:
972 	case COLOR_FMT_NV12_BPP10_UBWC:
973 		y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
974 		uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096);
975 		y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
976 		y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
977 		y_meta_plane = MSM_MEDIA_ALIGN(
978 				y_meta_stride * y_meta_scanlines, 4096);
979 		uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
980 		uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
981 		uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride *
982 					uv_meta_scanlines, 4096);
983 
984 		size = y_ubwc_plane + uv_ubwc_plane + y_meta_plane +
985 			uv_meta_plane + MSM_MEDIA_MAX(extra_size,
986 			64 * y_stride);
987 		size = MSM_MEDIA_ALIGN(size, 4096);
988 		break;
989 	case COLOR_FMT_P010_UBWC:
990 		y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
991 		uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096);
992 		y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
993 		y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
994 		y_meta_plane = MSM_MEDIA_ALIGN(
995 				y_meta_stride * y_meta_scanlines, 4096);
996 		uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
997 		uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
998 		uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride *
999 					uv_meta_scanlines, 4096);
1000 
1001 		size = y_ubwc_plane + uv_ubwc_plane + y_meta_plane +
1002 			uv_meta_plane;
1003 		size = MSM_MEDIA_ALIGN(size, 4096);
1004 		break;
1005 	case COLOR_FMT_RGBA8888:
1006 		rgb_plane = MSM_MEDIA_ALIGN(rgb_stride  * rgb_scanlines, 4096);
1007 		size = rgb_plane;
1008 		size =  MSM_MEDIA_ALIGN(size, 4096);
1009 		break;
1010 	case COLOR_FMT_RGBA8888_UBWC:
1011 		rgb_ubwc_plane = MSM_MEDIA_ALIGN(rgb_stride * rgb_scanlines,
1012 							4096);
1013 		rgb_meta_stride = VENUS_RGB_META_STRIDE(color_fmt, width);
1014 		rgb_meta_scanlines = VENUS_RGB_META_SCANLINES(color_fmt,
1015 					height);
1016 		rgb_meta_plane = MSM_MEDIA_ALIGN(rgb_meta_stride *
1017 					rgb_meta_scanlines, 4096);
1018 		size = rgb_ubwc_plane + rgb_meta_plane;
1019 		size = MSM_MEDIA_ALIGN(size, 4096);
1020 		break;
1021 	default:
1022 		break;
1023 	}
1024 invalid_input:
1025 	return size;
1026 }
1027 
VENUS_VIEW2_OFFSET(int color_fmt,int width,int height)1028 static __inline__ unsigned int VENUS_VIEW2_OFFSET(
1029 	int color_fmt, int width, int height)
1030 {
1031 	unsigned int offset = 0;
1032 	unsigned int y_plane, uv_plane, y_stride,
1033 		uv_stride, y_sclines, uv_sclines;
1034 	if (!width || !height)
1035 		goto invalid_input;
1036 
1037 	y_stride = VENUS_Y_STRIDE(color_fmt, width);
1038 	uv_stride = VENUS_UV_STRIDE(color_fmt, width);
1039 	y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
1040 	uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
1041 	switch (color_fmt) {
1042 	case COLOR_FMT_NV12_MVTB:
1043 		y_plane = y_stride * y_sclines;
1044 		uv_plane = uv_stride * uv_sclines;
1045 		offset = y_plane + uv_plane;
1046 		break;
1047 	default:
1048 		break;
1049 	}
1050 invalid_input:
1051 	return offset;
1052 }
1053 
1054 #endif
1055