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 	/*
154 	 * The buffer can be of 2 types:
155 	 * (1) Venus NV12 UBWC Progressive
156 	 * (2) Venus NV12 UBWC Interlaced
157 	 *
158 	 * (1) Venus NV12 UBWC Progressive Buffer Format:
159 	 * Compressed Macro-tile format for NV12.
160 	 * Contains 4 planes in the following order -
161 	 * (A) Y_Meta_Plane
162 	 * (B) Y_UBWC_Plane
163 	 * (C) UV_Meta_Plane
164 	 * (D) UV_UBWC_Plane
165 	 *
166 	 * Y_Meta_Plane consists of meta information to decode compressed
167 	 * tile data in Y_UBWC_Plane.
168 	 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
169 	 * UBWC decoder block will use the Y_Meta_Plane data together with
170 	 * Y_UBWC_Plane data to produce loss-less uncompressed 8 bit Y samples.
171 	 *
172 	 * UV_Meta_Plane consists of meta information to decode compressed
173 	 * tile data in UV_UBWC_Plane.
174 	 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
175 	 * UBWC decoder block will use UV_Meta_Plane data together with
176 	 * UV_UBWC_Plane data to produce loss-less uncompressed 8 bit 2x2
177 	 * subsampled color difference samples.
178 	 *
179 	 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
180 	 * and randomly accessible. There is no dependency between tiles.
181 	 *
182 	 * <----- Y_Meta_Stride ---->
183 	 * <-------- Width ------>
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 . .      Height      |
187 	 * M M M M M M M M M M M M . .      |         Meta_Y_Scanlines
188 	 * M M M M M M M M M M M M . .      |           |
189 	 * M M M M M M M M M M M M . .      |           |
190 	 * M M M M M M M M M M M M . .      |           |
191 	 * M M M M M M M M M M M M . .      V           |
192 	 * . . . . . . . . . . . . . .                  |
193 	 * . . . . . . . . . . . . . .                  |
194 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
195 	 * . . . . . . . . . . . . . .                  V
196 	 * <--Compressed tile Y Stride--->
197 	 * <------- Width ------->
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* . . . .  Height      |
201 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |        Macro_tile_Y_Scanlines
202 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
203 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
204 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
205 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  V           |
206 	 * . . . . . . . . . . . . . . . .              |
207 	 * . . . . . . . . . . . . . . . .              |
208 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
209 	 * . . . . . . . . . . . . . . . .              V
210 	 * <----- UV_Meta_Stride ---->
211 	 * M M M M M M M M M M M M . .      ^
212 	 * M M M M M M M M M M M M . .      |
213 	 * M M M M M M M M M M M M . .      |
214 	 * M M M M M M M M M M M M . .      M_UV_Scanlines
215 	 * . . . . . . . . . . . . . .      |
216 	 * . . . . . . . . . . . . . .      V
217 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
218 	 * <--Compressed tile UV Stride--->
219 	 * U* V* U* V* U* V* U* V* . . . .  ^
220 	 * U* V* U* V* U* V* U* V* . . . .  |
221 	 * U* V* U* V* U* V* U* V* . . . .  |
222 	 * U* V* U* V* U* V* U* V* . . . .  UV_Scanlines
223 	 * . . . . . . . . . . . . . . . .  |
224 	 * . . . . . . . . . . . . . . . .  V
225 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
226 	 *
227 	 * Y_Stride = align(Width, 128)
228 	 * UV_Stride = align(Width, 128)
229 	 * Y_Scanlines = align(Height, 32)
230 	 * UV_Scanlines = align(Height/2, 16)
231 	 * Y_UBWC_Plane_size = align(Y_Stride * Y_Scanlines, 4096)
232 	 * UV_UBWC_Plane_size = align(UV_Stride * UV_Scanlines, 4096)
233 	 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
234 	 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
235 	 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
236 	 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
237 	 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
238 	 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
239 	 * Extradata = 8k
240 	 *
241 	 * Total size = align( Y_UBWC_Plane_size + UV_UBWC_Plane_size +
242 	 *           Y_Meta_Plane_size + UV_Meta_Plane_size
243 	 *           + max(Extradata, Y_Stride * 48), 4096)
244 	 *
245 	 *
246 	 * (2) Venus NV12 UBWC Interlaced Buffer Format:
247 	 * Compressed Macro-tile format for NV12 interlaced.
248 	 * Contains 8 planes in the following order -
249 	 * (A) Y_Meta_Top_Field_Plane
250 	 * (B) Y_UBWC_Top_Field_Plane
251 	 * (C) UV_Meta_Top_Field_Plane
252 	 * (D) UV_UBWC_Top_Field_Plane
253 	 * (E) Y_Meta_Bottom_Field_Plane
254 	 * (F) Y_UBWC_Bottom_Field_Plane
255 	 * (G) UV_Meta_Bottom_Field_Plane
256 	 * (H) UV_UBWC_Bottom_Field_Plane
257 	 * Y_Meta_Top_Field_Plane consists of meta information to decode
258 	 * compressed tile data for Y_UBWC_Top_Field_Plane.
259 	 * Y_UBWC_Top_Field_Plane consists of Y data in compressed macro-tile
260 	 * format for top field of an interlaced frame.
261 	 * UBWC decoder block will use the Y_Meta_Top_Field_Plane data together
262 	 * with Y_UBWC_Top_Field_Plane data to produce loss-less uncompressed
263 	 * 8 bit Y samples for top field of an interlaced frame.
264 	 *
265 	 * UV_Meta_Top_Field_Plane consists of meta information to decode
266 	 * compressed tile data in UV_UBWC_Top_Field_Plane.
267 	 * UV_UBWC_Top_Field_Plane consists of UV data in compressed macro-tile
268 	 * format for top field of an interlaced frame.
269 	 * UBWC decoder block will use UV_Meta_Top_Field_Plane data together
270 	 * with UV_UBWC_Top_Field_Plane data to produce loss-less uncompressed
271 	 * 8 bit subsampled color difference samples for top field of an
272 	 * interlaced frame.
273 	 *
274 	 * Each tile in Y_UBWC_Top_Field_Plane/UV_UBWC_Top_Field_Plane is
275 	 * independently decodable and randomly accessible. There is no
276 	 * dependency between tiles.
277 	 *
278 	 * Y_Meta_Bottom_Field_Plane consists of meta information to decode
279 	 * compressed tile data for Y_UBWC_Bottom_Field_Plane.
280 	 * Y_UBWC_Bottom_Field_Plane consists of Y data in compressed macro-tile
281 	 * format for bottom field of an interlaced frame.
282 	 * UBWC decoder block will use the Y_Meta_Bottom_Field_Plane data
283 	 * together with Y_UBWC_Bottom_Field_Plane data to produce loss-less
284 	 * uncompressed 8 bit Y samples for bottom field of an interlaced frame.
285 	 *
286 	 * UV_Meta_Bottom_Field_Plane consists of meta information to decode
287 	 * compressed tile data in UV_UBWC_Bottom_Field_Plane.
288 	 * UV_UBWC_Bottom_Field_Plane consists of UV data in compressed
289 	 * macro-tile format for bottom field of an interlaced frame.
290 	 * UBWC decoder block will use UV_Meta_Bottom_Field_Plane data together
291 	 * with UV_UBWC_Bottom_Field_Plane data to produce loss-less
292 	 * uncompressed 8 bit subsampled color difference samples for bottom
293 	 * field of an interlaced frame.
294 	 *
295 	 * Each tile in Y_UBWC_Bottom_Field_Plane/UV_UBWC_Bottom_Field_Plane is
296 	 * independently decodable and randomly accessible. There is no
297 	 * dependency between tiles.
298 	 *
299 	 * <-----Y_TF_Meta_Stride---->
300 	 * <-------- Width ------>
301 	 * M M M M M M M M M M M M . .      ^           ^
302 	 * M M M M M M M M M M M M . .      |           |
303 	 * M M M M M M M M M M M M . . Half_height      |
304 	 * M M M M M M M M M M M M . .      |         Meta_Y_TF_Scanlines
305 	 * M M M M M M M M M M M M . .      |           |
306 	 * M M M M M M M M M M M M . .      |           |
307 	 * M M M M M M M M M M M M . .      |           |
308 	 * M M M M M M M M M M M M . .      V           |
309 	 * . . . . . . . . . . . . . .                  |
310 	 * . . . . . . . . . . . . . .                  |
311 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
312 	 * . . . . . . . . . . . . . .                  V
313 	 * <-Compressed tile Y_TF Stride->
314 	 * <------- Width ------->
315 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  ^           ^
316 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
317 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Half_height  |
318 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |        Macro_tile_Y_TF_Scanlines
319 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
320 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
321 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
322 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  V           |
323 	 * . . . . . . . . . . . . . . . .              |
324 	 * . . . . . . . . . . . . . . . .              |
325 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
326 	 * . . . . . . . . . . . . . . . .              V
327 	 * <----UV_TF_Meta_Stride---->
328 	 * M M M M M M M M M M M M . .      ^
329 	 * M M M M M M M M M M M M . .      |
330 	 * M M M M M M M M M M M M . .      |
331 	 * M M M M M M M M M M M M . .      M_UV_TF_Scanlines
332 	 * . . . . . . . . . . . . . .      |
333 	 * . . . . . . . . . . . . . .      V
334 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
335 	 * <-Compressed tile UV_TF Stride->
336 	 * U* V* U* V* U* V* U* V* . . . .  ^
337 	 * U* V* U* V* U* V* U* V* . . . .  |
338 	 * U* V* U* V* U* V* U* V* . . . .  |
339 	 * U* V* U* V* U* V* U* V* . . . .  UV_TF_Scanlines
340 	 * . . . . . . . . . . . . . . . .  |
341 	 * . . . . . . . . . . . . . . . .  V
342 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
343 	 * <-----Y_BF_Meta_Stride---->
344 	 * <-------- Width ------>
345 	 * M M M M M M M M M M M M . .      ^           ^
346 	 * M M M M M M M M M M M M . .      |           |
347 	 * M M M M M M M M M M M M . . Half_height      |
348 	 * M M M M M M M M M M M M . .      |         Meta_Y_BF_Scanlines
349 	 * M M M M M M M M M M M M . .      |           |
350 	 * M M M M M M M M M M M M . .      |           |
351 	 * M M M M M M M M M M M M . .      |           |
352 	 * M M M M M M M M M M M M . .      V           |
353 	 * . . . . . . . . . . . . . .                  |
354 	 * . . . . . . . . . . . . . .                  |
355 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
356 	 * . . . . . . . . . . . . . .                  V
357 	 * <-Compressed tile Y_BF Stride->
358 	 * <------- Width ------->
359 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  ^           ^
360 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
361 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . . Half_height  |
362 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |        Macro_tile_Y_BF_Scanlines
363 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
364 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
365 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
366 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  V           |
367 	 * . . . . . . . . . . . . . . . .              |
368 	 * . . . . . . . . . . . . . . . .              |
369 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
370 	 * . . . . . . . . . . . . . . . .              V
371 	 * <----UV_BF_Meta_Stride---->
372 	 * M M M M M M M M M M M M . .      ^
373 	 * M M M M M M M M M M M M . .      |
374 	 * M M M M M M M M M M M M . .      |
375 	 * M M M M M M M M M M M M . .      M_UV_BF_Scanlines
376 	 * . . . . . . . . . . . . . .      |
377 	 * . . . . . . . . . . . . . .      V
378 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
379 	 * <-Compressed tile UV_BF Stride->
380 	 * U* V* U* V* U* V* U* V* . . . .  ^
381 	 * U* V* U* V* U* V* U* V* . . . .  |
382 	 * U* V* U* V* U* V* U* V* . . . .  |
383 	 * U* V* U* V* U* V* U* V* . . . .  UV_BF_Scanlines
384 	 * . . . . . . . . . . . . . . . .  |
385 	 * . . . . . . . . . . . . . . . .  V
386 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
387 	 *
388 	 * Half_height = (Height+1)>>1
389 	 * Y_TF_Stride = align(Width, 128)
390 	 * UV_TF_Stride = align(Width, 128)
391 	 * Y_TF_Scanlines = align(Half_height, 32)
392 	 * UV_TF_Scanlines = align((Half_height+1)/2, 32)
393 	 * Y_UBWC_TF_Plane_size = align(Y_TF_Stride * Y_TF_Scanlines, 4096)
394 	 * UV_UBWC_TF_Plane_size = align(UV_TF_Stride * UV_TF_Scanlines, 4096)
395 	 * Y_TF_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
396 	 * Y_TF_Meta_Scanlines = align(roundup(Half_height, Y_TileHeight), 16)
397 	 * Y_TF_Meta_Plane_size =
398 	 *     align(Y_TF_Meta_Stride * Y_TF_Meta_Scanlines, 4096)
399 	 * UV_TF_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
400 	 * UV_TF_Meta_Scanlines = align(roundup(Half_height, UV_TileHeight), 16)
401 	 * UV_TF_Meta_Plane_size =
402 	 *     align(UV_TF_Meta_Stride * UV_TF_Meta_Scanlines, 4096)
403 	 * Y_BF_Stride = align(Width, 128)
404 	 * UV_BF_Stride = align(Width, 128)
405 	 * Y_BF_Scanlines = align(Half_height, 32)
406 	 * UV_BF_Scanlines = align((Half_height+1)/2, 32)
407 	 * Y_UBWC_BF_Plane_size = align(Y_BF_Stride * Y_BF_Scanlines, 4096)
408 	 * UV_UBWC_BF_Plane_size = align(UV_BF_Stride * UV_BF_Scanlines, 4096)
409 	 * Y_BF_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
410 	 * Y_BF_Meta_Scanlines = align(roundup(Half_height, Y_TileHeight), 16)
411 	 * Y_BF_Meta_Plane_size =
412 	 *     align(Y_BF_Meta_Stride * Y_BF_Meta_Scanlines, 4096)
413 	 * UV_BF_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
414 	 * UV_BF_Meta_Scanlines = align(roundup(Half_height, UV_TileHeight), 16)
415 	 * UV_BF_Meta_Plane_size =
416 	 *     align(UV_BF_Meta_Stride * UV_BF_Meta_Scanlines, 4096)
417 	 * Extradata = 8k
418 	 *
419 	 * Total size = align( Y_UBWC_TF_Plane_size + UV_UBWC_TF_Plane_size +
420 	 *           Y_TF_Meta_Plane_size + UV_TF_Meta_Plane_size +
421 	 *			 Y_UBWC_BF_Plane_size + UV_UBWC_BF_Plane_size +
422 	 *           Y_BF_Meta_Plane_size + UV_BF_Meta_Plane_size +
423 	 *           + max(Extradata, Y_TF_Stride * 48), 4096)
424 	 */
425 	COLOR_FMT_NV12_UBWC,
426 	/* Venus NV12 10-bit UBWC:
427 	 * Compressed Macro-tile format for NV12.
428 	 * Contains 4 planes in the following order -
429 	 * (A) Y_Meta_Plane
430 	 * (B) Y_UBWC_Plane
431 	 * (C) UV_Meta_Plane
432 	 * (D) UV_UBWC_Plane
433 	 *
434 	 * Y_Meta_Plane consists of meta information to decode compressed
435 	 * tile data in Y_UBWC_Plane.
436 	 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
437 	 * UBWC decoder block will use the Y_Meta_Plane data together with
438 	 * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples.
439 	 *
440 	 * UV_Meta_Plane consists of meta information to decode compressed
441 	 * tile data in UV_UBWC_Plane.
442 	 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
443 	 * UBWC decoder block will use UV_Meta_Plane data together with
444 	 * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2
445 	 * subsampled color difference samples.
446 	 *
447 	 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
448 	 * and randomly accessible. There is no dependency between tiles.
449 	 *
450 	 * <----- Y_Meta_Stride ----->
451 	 * <-------- Width ------>
452 	 * M M M M M M M M M M M M . .      ^           ^
453 	 * M M M M M M M M M M M M . .      |           |
454 	 * M M M M M M M M M M M M . .      Height      |
455 	 * M M M M M M M M M M M M . .      |         Meta_Y_Scanlines
456 	 * M M M M M M M M M M M M . .      |           |
457 	 * M M M M M M M M M M M M . .      |           |
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 . .      V           |
460 	 * . . . . . . . . . . . . . .                  |
461 	 * . . . . . . . . . . . . . .                  |
462 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
463 	 * . . . . . . . . . . . . . .                  V
464 	 * <--Compressed tile Y Stride--->
465 	 * <------- Width ------->
466 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  ^           ^
467 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
468 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  Height      |
469 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |        Macro_tile_Y_Scanlines
470 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
471 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
472 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
473 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  V           |
474 	 * . . . . . . . . . . . . . . . .              |
475 	 * . . . . . . . . . . . . . . . .              |
476 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
477 	 * . . . . . . . . . . . . . . . .              V
478 	 * <----- UV_Meta_Stride ---->
479 	 * M M M M M M M M M M M M . .      ^
480 	 * M M M M M M M M M M M M . .      |
481 	 * M M M M M M M M M M M M . .      |
482 	 * M M M M M M M M M M M M . .      M_UV_Scanlines
483 	 * . . . . . . . . . . . . . .      |
484 	 * . . . . . . . . . . . . . .      V
485 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
486 	 * <--Compressed tile UV Stride--->
487 	 * U* V* U* V* U* V* U* V* . . . .  ^
488 	 * U* V* U* V* U* V* U* V* . . . .  |
489 	 * U* V* U* V* U* V* U* V* . . . .  |
490 	 * U* V* U* V* U* V* U* V* . . . .  UV_Scanlines
491 	 * . . . . . . . . . . . . . . . .  |
492 	 * . . . . . . . . . . . . . . . .  V
493 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
494 	 *
495 	 *
496 	 * Y_Stride = align(Width * 4/3, 128)
497 	 * UV_Stride = align(Width * 4/3, 128)
498 	 * Y_Scanlines = align(Height, 32)
499 	 * UV_Scanlines = align(Height/2, 16)
500 	 * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096)
501 	 * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096)
502 	 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
503 	 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
504 	 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
505 	 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
506 	 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
507 	 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
508 	 * Extradata = 8k
509 	 *
510 	 * Total size = align(Y_UBWC_Plane_size + UV_UBWC_Plane_size +
511 	 *           Y_Meta_Plane_size + UV_Meta_Plane_size
512 	 *           + max(Extradata, Y_Stride * 48), 4096)
513 	 */
514 	COLOR_FMT_NV12_BPP10_UBWC,
515 	/* Venus RGBA8888 format:
516 	 * Contains 1 plane in the following order -
517 	 * (A) RGBA plane
518 	 *
519 	 * <-------- RGB_Stride -------->
520 	 * <------- Width ------->
521 	 * R R R R R R R R R R R R . . . .  ^           ^
522 	 * R R R R R R R R R R R R . . . .  |           |
523 	 * R R R R R R R R R R R R . . . .  Height      |
524 	 * R R R R R R R R R R R R . . . .  |       RGB_Scanlines
525 	 * R R R R R R R R R R R R . . . .  |           |
526 	 * R R R R R R R R R R R R . . . .  |           |
527 	 * R R R R R R R R R R R R . . . .  |           |
528 	 * R R R R R R R R R R R R . . . .  V           |
529 	 * . . . . . . . . . . . . . . . .              |
530 	 * . . . . . . . . . . . . . . . .              |
531 	 * . . . . . . . . . . . . . . . .              |
532 	 * . . . . . . . . . . . . . . . .              V
533 	 *
534 	 * RGB_Stride = align(Width * 4, 128)
535 	 * RGB_Scanlines = align(Height, 32)
536 	 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
537 	 * Extradata = 8k
538 	 *
539 	 * Total size = align(RGB_Plane_size + Extradata, 4096)
540 	 */
541 	COLOR_FMT_RGBA8888,
542 	/* Venus RGBA8888 UBWC format:
543 	 * Contains 2 planes in the following order -
544 	 * (A) Meta plane
545 	 * (B) RGBA plane
546 	 *
547 	 * <--- RGB_Meta_Stride ---->
548 	 * <-------- Width ------>
549 	 * M M M M M M M M M M M M . .      ^           ^
550 	 * M M M M M M M M M M M M . .      |           |
551 	 * M M M M M M M M M M M M . .      Height      |
552 	 * M M M M M M M M M M M M . .      |       Meta_RGB_Scanlines
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 . .      |           |
555 	 * M M M M M M M M M M M M . .      |           |
556 	 * M M M M M M M M M M M M . .      V           |
557 	 * . . . . . . . . . . . . . .                  |
558 	 * . . . . . . . . . . . . . .                  |
559 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
560 	 * . . . . . . . . . . . . . .                  V
561 	 * <-------- RGB_Stride -------->
562 	 * <------- Width ------->
563 	 * R R R R R R R R R R R R . . . .  ^           ^
564 	 * R R R R R R R R R R R R . . . .  |           |
565 	 * R R R R R R R R R R R R . . . .  Height      |
566 	 * R R R R R R R R R R R R . . . .  |       RGB_Scanlines
567 	 * R R R R R R R R R R R R . . . .  |           |
568 	 * R R R R R R R R R R R R . . . .  |           |
569 	 * R R R R R R R R R R R R . . . .  |           |
570 	 * R R R R R R R R R R R R . . . .  V           |
571 	 * . . . . . . . . . . . . . . . .              |
572 	 * . . . . . . . . . . . . . . . .              |
573 	 * . . . . . . . . . . . . . . . .    -------> Buffer size aligned to 4k
574 	 * . . . . . . . . . . . . . . . .              V
575 	 *
576 	 * RGB_Stride = align(Width * 4, 128)
577 	 * RGB_Scanlines = align(Height, 32)
578 	 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
579 	 * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64)
580 	 * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16)
581 	 * RGB_Meta_Plane_size = align(RGB_Meta_Stride *
582 	 *		RGB_Meta_Scanlines, 4096)
583 	 * Extradata = 8k
584 	 *
585 	 * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size +
586 	 *		Extradata, 4096)
587 	 */
588 	COLOR_FMT_RGBA8888_UBWC,
589 	/* Venus RGBA1010102 UBWC format:
590 	 * Contains 2 planes in the following order -
591 	 * (A) Meta plane
592 	 * (B) RGBA plane
593 	 *
594 	 * <--- RGB_Meta_Stride ---->
595 	 * <-------- Width ------>
596 	 * M M M M M M M M M M M M . .      ^           ^
597 	 * M M M M M M M M M M M M . .      |           |
598 	 * M M M M M M M M M M M M . .      Height      |
599 	 * M M M M M M M M M M M M . .      |       Meta_RGB_Scanlines
600 	 * M M M M M M M M M M M M . .      |           |
601 	 * M M M M M M M M M M M M . .      |           |
602 	 * M M M M M M M M M M M M . .      |           |
603 	 * M M M M M M M M M M M M . .      V           |
604 	 * . . . . . . . . . . . . . .                  |
605 	 * . . . . . . . . . . . . . .                  |
606 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
607 	 * . . . . . . . . . . . . . .                  V
608 	 * <-------- RGB_Stride -------->
609 	 * <------- Width ------->
610 	 * R R R R R R R R R R R R . . . .  ^           ^
611 	 * R R R R R R R R R R R R . . . .  |           |
612 	 * R R R R R R R R R R R R . . . .  Height      |
613 	 * R R R R R R R R R R R R . . . .  |       RGB_Scanlines
614 	 * R R R R R R R R R R R R . . . .  |           |
615 	 * R R R R R R R R R R R R . . . .  |           |
616 	 * R R R R R R R R R R R R . . . .  |           |
617 	 * R R R R R R R R R R R R . . . .  V           |
618 	 * . . . . . . . . . . . . . . . .              |
619 	 * . . . . . . . . . . . . . . . .              |
620 	 * . . . . . . . . . . . . . . . .    -------> Buffer size aligned to 4k
621 	 * . . . . . . . . . . . . . . . .              V
622 	 *
623 	 * RGB_Stride = align(Width * 4, 256)
624 	 * RGB_Scanlines = align(Height, 16)
625 	 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
626 	 * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64)
627 	 * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16)
628 	 * RGB_Meta_Plane_size = align(RGB_Meta_Stride *
629 	 *		RGB_Meta_Scanlines, 4096)
630 	 * Extradata = 8k
631 	 *
632 	 * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size +
633 	 *		Extradata, 4096)
634 	 */
635 	COLOR_FMT_RGBA1010102_UBWC,
636 	/* Venus RGB565 UBWC format:
637 	 * Contains 2 planes in the following order -
638 	 * (A) Meta plane
639 	 * (B) RGB plane
640 	 *
641 	 * <--- RGB_Meta_Stride ---->
642 	 * <-------- Width ------>
643 	 * M M M M M M M M M M M M . .      ^           ^
644 	 * M M M M M M M M M M M M . .      |           |
645 	 * M M M M M M M M M M M M . .      Height      |
646 	 * M M M M M M M M M M M M . .      |       Meta_RGB_Scanlines
647 	 * M M M M M M M M M M M M . .      |           |
648 	 * M M M M M M M M M M M M . .      |           |
649 	 * M M M M M M M M M M M M . .      |           |
650 	 * M M M M M M M M M M M M . .      V           |
651 	 * . . . . . . . . . . . . . .                  |
652 	 * . . . . . . . . . . . . . .                  |
653 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
654 	 * . . . . . . . . . . . . . .                  V
655 	 * <-------- RGB_Stride -------->
656 	 * <------- Width ------->
657 	 * R R R R R R R R R R R R . . . .  ^           ^
658 	 * R R R R R R R R R R R R . . . .  |           |
659 	 * R R R R R R R R R R R R . . . .  Height      |
660 	 * R R R R R R R R R R R R . . . .  |       RGB_Scanlines
661 	 * R R R R R R R R R R R R . . . .  |           |
662 	 * R R R R R R R R R R R R . . . .  |           |
663 	 * R R R R R R R R R R R R . . . .  |           |
664 	 * R R R R R R R R R R R R . . . .  V           |
665 	 * . . . . . . . . . . . . . . . .              |
666 	 * . . . . . . . . . . . . . . . .              |
667 	 * . . . . . . . . . . . . . . . .    -------> Buffer size aligned to 4k
668 	 * . . . . . . . . . . . . . . . .              V
669 	 *
670 	 * RGB_Stride = align(Width * 2, 128)
671 	 * RGB_Scanlines = align(Height, 16)
672 	 * RGB_Plane_size = align(RGB_Stride * RGB_Scanlines, 4096)
673 	 * RGB_Meta_Stride = align(roundup(Width, RGB_TileWidth), 64)
674 	 * RGB_Meta_Scanline = align(roundup(Height, RGB_TileHeight), 16)
675 	 * RGB_Meta_Plane_size = align(RGB_Meta_Stride *
676 	 *		RGB_Meta_Scanlines, 4096)
677 	 * Extradata = 8k
678 	 *
679 	 * Total size = align(RGB_Meta_Plane_size + RGB_Plane_size +
680 	 *		Extradata, 4096)
681 	 */
682 	COLOR_FMT_RGB565_UBWC,
683 	/* P010 UBWC:
684 	 * Compressed Macro-tile format for NV12.
685 	 * Contains 4 planes in the following order -
686 	 * (A) Y_Meta_Plane
687 	 * (B) Y_UBWC_Plane
688 	 * (C) UV_Meta_Plane
689 	 * (D) UV_UBWC_Plane
690 	 *
691 	 * Y_Meta_Plane consists of meta information to decode compressed
692 	 * tile data in Y_UBWC_Plane.
693 	 * Y_UBWC_Plane consists of Y data in compressed macro-tile format.
694 	 * UBWC decoder block will use the Y_Meta_Plane data together with
695 	 * Y_UBWC_Plane data to produce loss-less uncompressed 10 bit Y samples.
696 	 *
697 	 * UV_Meta_Plane consists of meta information to decode compressed
698 	 * tile data in UV_UBWC_Plane.
699 	 * UV_UBWC_Plane consists of UV data in compressed macro-tile format.
700 	 * UBWC decoder block will use UV_Meta_Plane data together with
701 	 * UV_UBWC_Plane data to produce loss-less uncompressed 10 bit 2x2
702 	 * subsampled color difference samples.
703 	 *
704 	 * Each tile in Y_UBWC_Plane/UV_UBWC_Plane is independently decodable
705 	 * and randomly accessible. There is no dependency between tiles.
706 	 *
707 	 * <----- Y_Meta_Stride ----->
708 	 * <-------- Width ------>
709 	 * M M M M M M M M M M M M . .      ^           ^
710 	 * M M M M M M M M M M M M . .      |           |
711 	 * M M M M M M M M M M M M . .      Height      |
712 	 * M M M M M M M M M M M M . .      |         Meta_Y_Scanlines
713 	 * M M M M M M M M M M M M . .      |           |
714 	 * M M M M M M M M M M M M . .      |           |
715 	 * M M M M M M M M M M M M . .      |           |
716 	 * M M M M M M M M M M M M . .      V           |
717 	 * . . . . . . . . . . . . . .                  |
718 	 * . . . . . . . . . . . . . .                  |
719 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
720 	 * . . . . . . . . . . . . . .                  V
721 	 * <--Compressed tile Y Stride--->
722 	 * <------- Width ------->
723 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  ^           ^
724 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
725 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  Height      |
726 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |        Macro_tile_Y_Scanlines
727 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
728 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
729 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  |           |
730 	 * Y* Y* Y* Y* Y* Y* Y* Y* . . . .  V           |
731 	 * . . . . . . . . . . . . . . . .              |
732 	 * . . . . . . . . . . . . . . . .              |
733 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
734 	 * . . . . . . . . . . . . . . . .              V
735 	 * <----- UV_Meta_Stride ---->
736 	 * M M M M M M M M M M M M . .      ^
737 	 * M M M M M M M M M M M M . .      |
738 	 * M M M M M M M M M M M M . .      |
739 	 * M M M M M M M M M M M M . .      M_UV_Scanlines
740 	 * . . . . . . . . . . . . . .      |
741 	 * . . . . . . . . . . . . . .      V
742 	 * . . . . . . . . . . . . . .      -------> Buffer size aligned to 4k
743 	 * <--Compressed tile UV Stride--->
744 	 * U* V* U* V* U* V* U* V* . . . .  ^
745 	 * U* V* U* V* U* V* U* V* . . . .  |
746 	 * U* V* U* V* U* V* U* V* . . . .  |
747 	 * U* V* U* V* U* V* U* V* . . . .  UV_Scanlines
748 	 * . . . . . . . . . . . . . . . .  |
749 	 * . . . . . . . . . . . . . . . .  V
750 	 * . . . . . . . . . . . . . . . .  -------> Buffer size aligned to 4k
751 	 *
752 	 *
753 	 * Y_Stride = align(Width * 2, 256)
754 	 * UV_Stride = align(Width * 2, 256)
755 	 * Y_Scanlines = align(Height, 16)
756 	 * UV_Scanlines = align(Height/2, 16)
757 	 * Y_UBWC_Plane_Size = align(Y_Stride * Y_Scanlines, 4096)
758 	 * UV_UBWC_Plane_Size = align(UV_Stride * UV_Scanlines, 4096)
759 	 * Y_Meta_Stride = align(roundup(Width, Y_TileWidth), 64)
760 	 * Y_Meta_Scanlines = align(roundup(Height, Y_TileHeight), 16)
761 	 * Y_Meta_Plane_size = align(Y_Meta_Stride * Y_Meta_Scanlines, 4096)
762 	 * UV_Meta_Stride = align(roundup(Width, UV_TileWidth), 64)
763 	 * UV_Meta_Scanlines = align(roundup(Height, UV_TileHeight), 16)
764 	 * UV_Meta_Plane_size = align(UV_Meta_Stride * UV_Meta_Scanlines, 4096)
765 	 * Extradata = 8k
766 	 *
767 	 * Total size = align(Y_UBWC_Plane_size + UV_UBWC_Plane_size +
768 	 *           Y_Meta_Plane_size + UV_Meta_Plane_size
769 	 *           + max(Extradata, Y_Stride * 48), 4096)
770 	 */
771 	COLOR_FMT_P010_UBWC,
772 	/* Venus P010:
773 	 * YUV 4:2:0 image with a plane of 10 bit Y samples followed
774 	 * by an interleaved U/V plane containing 10 bit 2x2 subsampled
775 	 * colour difference samples.
776 	 *
777 	 * <-------- Y/UV_Stride -------->
778 	 * <------- Width ------->
779 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  ^           ^
780 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
781 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  Height      |
782 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |          Y_Scanlines
783 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
784 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
785 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  |           |
786 	 * Y Y Y Y Y Y Y Y Y Y Y Y . . . .  V           |
787 	 * . . . . . . . . . . . . . . . .              |
788 	 * . . . . . . . . . . . . . . . .              |
789 	 * . . . . . . . . . . . . . . . .              |
790 	 * . . . . . . . . . . . . . . . .              V
791 	 * U V U V U V U V U V U V . . . .  ^
792 	 * U V U V U V U V U V U V . . . .  |
793 	 * U V U V U V U V U V U V . . . .  |
794 	 * U V U V U V U V U V U V . . . .  UV_Scanlines
795 	 * . . . . . . . . . . . . . . . .  |
796 	 * . . . . . . . . . . . . . . . .  V
797 	 * . . . . . . . . . . . . . . . .  --> Buffer size alignment
798 	 *
799 	 * Y_Stride : Width * 2 aligned to 128
800 	 * UV_Stride : Width * 2 aligned to 128
801 	 * Y_Scanlines: Height aligned to 32
802 	 * UV_Scanlines: Height/2 aligned to 16
803 	 * Extradata: Arbitrary (software-imposed) padding
804 	 * Total size = align((Y_Stride * Y_Scanlines
805 	 *          + UV_Stride * UV_Scanlines
806 	 *          + max(Extradata, Y_Stride * 8), 4096)
807 	 */
808 	COLOR_FMT_P010,
809 };
810 
811 #define COLOR_FMT_RGBA1010102_UBWC	COLOR_FMT_RGBA1010102_UBWC
812 #define COLOR_FMT_RGB565_UBWC		COLOR_FMT_RGB565_UBWC
813 #define COLOR_FMT_P010_UBWC		COLOR_FMT_P010_UBWC
814 #define COLOR_FMT_P010		COLOR_FMT_P010
815 
816 static inline unsigned int VENUS_EXTRADATA_SIZE(int width, int height)
817 {
818 	(void)height;
819 	(void)width;
820 
821 	/*
822 	 * In the future, calculate the size based on the w/h but just
823 	 * hardcode it for now since 16K satisfies all current usecases.
824 	 */
825 	return 16 * 1024;
826 }
827 
828 /*
829  * Function arguments:
830  * @color_fmt
831  * @width
832  * Progressive: width
833  * Interlaced: width
834  */
835 static inline unsigned int VENUS_Y_STRIDE(int color_fmt, int width)
836 {
837 	unsigned int alignment, stride = 0;
838 
839 	if (!width)
840 		goto invalid_input;
841 
842 	switch (color_fmt) {
843 	case COLOR_FMT_NV21:
844 	case COLOR_FMT_NV12:
845 	case COLOR_FMT_NV12_MVTB:
846 	case COLOR_FMT_NV12_UBWC:
847 		alignment = 128;
848 		stride = MSM_MEDIA_ALIGN(width, alignment);
849 		break;
850 	case COLOR_FMT_NV12_BPP10_UBWC:
851 		alignment = 256;
852 		stride = MSM_MEDIA_ALIGN(width, 192);
853 		stride = MSM_MEDIA_ALIGN(stride * 4/3, alignment);
854 		break;
855 	case COLOR_FMT_P010_UBWC:
856 		alignment = 256;
857 		stride = MSM_MEDIA_ALIGN(width * 2, alignment);
858 		break;
859 	case COLOR_FMT_P010:
860 		alignment = 128;
861 		stride = MSM_MEDIA_ALIGN(width*2, alignment);
862 		break;
863 	default:
864 		break;
865 	}
866 invalid_input:
867 	return stride;
868 }
869 
870 /*
871  * Function arguments:
872  * @color_fmt
873  * @width
874  * Progressive: width
875  * Interlaced: width
876  */
877 static inline unsigned int VENUS_UV_STRIDE(int color_fmt, int width)
878 {
879 	unsigned int alignment, stride = 0;
880 
881 	if (!width)
882 		goto invalid_input;
883 
884 	switch (color_fmt) {
885 	case COLOR_FMT_NV21:
886 	case COLOR_FMT_NV12:
887 	case COLOR_FMT_NV12_MVTB:
888 	case COLOR_FMT_NV12_UBWC:
889 		alignment = 128;
890 		stride = MSM_MEDIA_ALIGN(width, alignment);
891 		break;
892 	case COLOR_FMT_NV12_BPP10_UBWC:
893 		alignment = 256;
894 		stride = MSM_MEDIA_ALIGN(width, 192);
895 		stride = MSM_MEDIA_ALIGN(stride * 4/3, alignment);
896 		break;
897 	case COLOR_FMT_P010_UBWC:
898 		alignment = 256;
899 		stride = MSM_MEDIA_ALIGN(width * 2, alignment);
900 		break;
901 	case COLOR_FMT_P010:
902 		alignment = 128;
903 		stride = MSM_MEDIA_ALIGN(width*2, alignment);
904 		break;
905 	default:
906 		break;
907 	}
908 invalid_input:
909 	return stride;
910 }
911 
912 /*
913  * Function arguments:
914  * @color_fmt
915  * @height
916  * Progressive: height
917  * Interlaced: (height+1)>>1
918  */
919 static inline unsigned int VENUS_Y_SCANLINES(int color_fmt, int height)
920 {
921 	unsigned int alignment, sclines = 0;
922 
923 	if (!height)
924 		goto invalid_input;
925 
926 	switch (color_fmt) {
927 	case COLOR_FMT_NV21:
928 	case COLOR_FMT_NV12:
929 	case COLOR_FMT_NV12_MVTB:
930 	case COLOR_FMT_NV12_UBWC:
931 	case COLOR_FMT_P010:
932 		alignment = 32;
933 		break;
934 	case COLOR_FMT_NV12_BPP10_UBWC:
935 	case COLOR_FMT_P010_UBWC:
936 		alignment = 16;
937 		break;
938 	default:
939 		return 0;
940 	}
941 	sclines = MSM_MEDIA_ALIGN(height, alignment);
942 invalid_input:
943 	return sclines;
944 }
945 
946 /*
947  * Function arguments:
948  * @color_fmt
949  * @height
950  * Progressive: height
951  * Interlaced: (height+1)>>1
952  */
953 static inline unsigned int VENUS_UV_SCANLINES(int color_fmt, int height)
954 {
955 	unsigned int alignment, sclines = 0;
956 
957 	if (!height)
958 		goto invalid_input;
959 
960 	switch (color_fmt) {
961 	case COLOR_FMT_NV21:
962 	case COLOR_FMT_NV12:
963 	case COLOR_FMT_NV12_MVTB:
964 	case COLOR_FMT_NV12_BPP10_UBWC:
965 	case COLOR_FMT_P010_UBWC:
966 	case COLOR_FMT_P010:
967 		alignment = 16;
968 		break;
969 	case COLOR_FMT_NV12_UBWC:
970 		alignment = 32;
971 		break;
972 	default:
973 		goto invalid_input;
974 	}
975 
976 	sclines = MSM_MEDIA_ALIGN((height+1)>>1, alignment);
977 
978 invalid_input:
979 	return sclines;
980 }
981 
982 /*
983  * Function arguments:
984  * @color_fmt
985  * @width
986  * Progressive: width
987  * Interlaced: width
988  */
989 static inline unsigned int VENUS_Y_META_STRIDE(int color_fmt, int width)
990 {
991 	int y_tile_width = 0, y_meta_stride = 0;
992 
993 	if (!width)
994 		goto invalid_input;
995 
996 	switch (color_fmt) {
997 	case COLOR_FMT_NV12_UBWC:
998 	case COLOR_FMT_P010_UBWC:
999 		y_tile_width = 32;
1000 		break;
1001 	case COLOR_FMT_NV12_BPP10_UBWC:
1002 		y_tile_width = 48;
1003 		break;
1004 	default:
1005 		goto invalid_input;
1006 	}
1007 
1008 	y_meta_stride = MSM_MEDIA_ROUNDUP(width, y_tile_width);
1009 	y_meta_stride = MSM_MEDIA_ALIGN(y_meta_stride, 64);
1010 
1011 invalid_input:
1012 	return y_meta_stride;
1013 }
1014 
1015 /*
1016  * Function arguments:
1017  * @color_fmt
1018  * @height
1019  * Progressive: height
1020  * Interlaced: (height+1)>>1
1021  */
1022 static inline unsigned int VENUS_Y_META_SCANLINES(int color_fmt, int height)
1023 {
1024 	int y_tile_height = 0, y_meta_scanlines = 0;
1025 
1026 	if (!height)
1027 		goto invalid_input;
1028 
1029 	switch (color_fmt) {
1030 	case COLOR_FMT_NV12_UBWC:
1031 		y_tile_height = 8;
1032 		break;
1033 	case COLOR_FMT_NV12_BPP10_UBWC:
1034 	case COLOR_FMT_P010_UBWC:
1035 		y_tile_height = 4;
1036 		break;
1037 	default:
1038 		goto invalid_input;
1039 	}
1040 
1041 	y_meta_scanlines = MSM_MEDIA_ROUNDUP(height, y_tile_height);
1042 	y_meta_scanlines = MSM_MEDIA_ALIGN(y_meta_scanlines, 16);
1043 
1044 invalid_input:
1045 	return y_meta_scanlines;
1046 }
1047 
1048 /*
1049  * Function arguments:
1050  * @color_fmt
1051  * @width
1052  * Progressive: width
1053  * Interlaced: width
1054  */
1055 static inline unsigned int VENUS_UV_META_STRIDE(int color_fmt, int width)
1056 {
1057 	int uv_tile_width = 0, uv_meta_stride = 0;
1058 
1059 	if (!width)
1060 		goto invalid_input;
1061 
1062 	switch (color_fmt) {
1063 	case COLOR_FMT_NV12_UBWC:
1064 	case COLOR_FMT_P010_UBWC:
1065 		uv_tile_width = 16;
1066 		break;
1067 	case COLOR_FMT_NV12_BPP10_UBWC:
1068 		uv_tile_width = 24;
1069 		break;
1070 	default:
1071 		goto invalid_input;
1072 	}
1073 
1074 	uv_meta_stride = MSM_MEDIA_ROUNDUP((width+1)>>1, uv_tile_width);
1075 	uv_meta_stride = MSM_MEDIA_ALIGN(uv_meta_stride, 64);
1076 
1077 invalid_input:
1078 	return uv_meta_stride;
1079 }
1080 
1081 /*
1082  * Function arguments:
1083  * @color_fmt
1084  * @height
1085  * Progressive: height
1086  * Interlaced: (height+1)>>1
1087  */
1088 static inline unsigned int VENUS_UV_META_SCANLINES(int color_fmt, int height)
1089 {
1090 	int uv_tile_height = 0, uv_meta_scanlines = 0;
1091 
1092 	if (!height)
1093 		goto invalid_input;
1094 
1095 	switch (color_fmt) {
1096 	case COLOR_FMT_NV12_UBWC:
1097 		uv_tile_height = 8;
1098 		break;
1099 	case COLOR_FMT_NV12_BPP10_UBWC:
1100 	case COLOR_FMT_P010_UBWC:
1101 		uv_tile_height = 4;
1102 		break;
1103 	default:
1104 		goto invalid_input;
1105 	}
1106 
1107 	uv_meta_scanlines = MSM_MEDIA_ROUNDUP((height+1)>>1, uv_tile_height);
1108 	uv_meta_scanlines = MSM_MEDIA_ALIGN(uv_meta_scanlines, 16);
1109 
1110 invalid_input:
1111 	return uv_meta_scanlines;
1112 }
1113 
1114 static inline unsigned int VENUS_RGB_STRIDE(int color_fmt, int width)
1115 {
1116 	unsigned int alignment = 0, stride = 0, bpp = 4;
1117 
1118 	if (!width)
1119 		goto invalid_input;
1120 
1121 	switch (color_fmt) {
1122 	case COLOR_FMT_RGBA8888:
1123 		alignment = 128;
1124 		break;
1125 	case COLOR_FMT_RGB565_UBWC:
1126 		alignment = 256;
1127 		bpp = 2;
1128 		break;
1129 	case COLOR_FMT_RGBA8888_UBWC:
1130 	case COLOR_FMT_RGBA1010102_UBWC:
1131 		alignment = 256;
1132 		break;
1133 	default:
1134 		goto invalid_input;
1135 	}
1136 
1137 	stride = MSM_MEDIA_ALIGN(width * bpp, alignment);
1138 
1139 invalid_input:
1140 	return stride;
1141 }
1142 
1143 static inline unsigned int VENUS_RGB_SCANLINES(int color_fmt, int height)
1144 {
1145 	unsigned int alignment = 0, scanlines = 0;
1146 
1147 	if (!height)
1148 		goto invalid_input;
1149 
1150 	switch (color_fmt) {
1151 	case COLOR_FMT_RGBA8888:
1152 		alignment = 32;
1153 		break;
1154 	case COLOR_FMT_RGBA8888_UBWC:
1155 	case COLOR_FMT_RGBA1010102_UBWC:
1156 	case COLOR_FMT_RGB565_UBWC:
1157 		alignment = 16;
1158 		break;
1159 	default:
1160 		goto invalid_input;
1161 	}
1162 
1163 	scanlines = MSM_MEDIA_ALIGN(height, alignment);
1164 
1165 invalid_input:
1166 	return scanlines;
1167 }
1168 
1169 static inline unsigned int VENUS_RGB_META_STRIDE(int color_fmt, int width)
1170 {
1171 	int rgb_tile_width = 0, rgb_meta_stride = 0;
1172 
1173 	if (!width)
1174 		goto invalid_input;
1175 
1176 	switch (color_fmt) {
1177 	case COLOR_FMT_RGBA8888_UBWC:
1178 	case COLOR_FMT_RGBA1010102_UBWC:
1179 	case COLOR_FMT_RGB565_UBWC:
1180 		rgb_tile_width = 16;
1181 		break;
1182 	default:
1183 		goto invalid_input;
1184 	}
1185 
1186 	rgb_meta_stride = MSM_MEDIA_ROUNDUP(width, rgb_tile_width);
1187 	rgb_meta_stride = MSM_MEDIA_ALIGN(rgb_meta_stride, 64);
1188 
1189 invalid_input:
1190 	return rgb_meta_stride;
1191 }
1192 
1193 static inline unsigned int VENUS_RGB_META_SCANLINES(int color_fmt, int height)
1194 {
1195 	int rgb_tile_height = 0, rgb_meta_scanlines = 0;
1196 
1197 	if (!height)
1198 		goto invalid_input;
1199 
1200 	switch (color_fmt) {
1201 	case COLOR_FMT_RGBA8888_UBWC:
1202 	case COLOR_FMT_RGBA1010102_UBWC:
1203 	case COLOR_FMT_RGB565_UBWC:
1204 		rgb_tile_height = 4;
1205 		break;
1206 	default:
1207 		goto invalid_input;
1208 	}
1209 
1210 	rgb_meta_scanlines = MSM_MEDIA_ROUNDUP(height, rgb_tile_height);
1211 	rgb_meta_scanlines = MSM_MEDIA_ALIGN(rgb_meta_scanlines, 16);
1212 
1213 invalid_input:
1214 	return rgb_meta_scanlines;
1215 }
1216 
1217 /*
1218  * Function arguments:
1219  * @color_fmt
1220  * @width
1221  * Progressive: width
1222  * Interlaced: width
1223  * @height
1224  * Progressive: height
1225  * Interlaced: height
1226  */
1227 static inline unsigned int VENUS_BUFFER_SIZE(
1228 	int color_fmt, int width, int height)
1229 {
1230 	const unsigned int extra_size = VENUS_EXTRADATA_SIZE(width, height);
1231 	unsigned int uv_alignment = 0, size = 0;
1232 	unsigned int y_plane, uv_plane, y_stride,
1233 		uv_stride, y_sclines, uv_sclines;
1234 	unsigned int y_ubwc_plane = 0, uv_ubwc_plane = 0;
1235 	unsigned int y_meta_stride = 0, y_meta_scanlines = 0;
1236 	unsigned int uv_meta_stride = 0, uv_meta_scanlines = 0;
1237 	unsigned int y_meta_plane = 0, uv_meta_plane = 0;
1238 	unsigned int rgb_stride = 0, rgb_scanlines = 0;
1239 	unsigned int rgb_plane = 0, rgb_ubwc_plane = 0, rgb_meta_plane = 0;
1240 	unsigned int rgb_meta_stride = 0, rgb_meta_scanlines = 0;
1241 
1242 	if (!width || !height)
1243 		goto invalid_input;
1244 
1245 	y_stride = VENUS_Y_STRIDE(color_fmt, width);
1246 	uv_stride = VENUS_UV_STRIDE(color_fmt, width);
1247 	y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
1248 	uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
1249 	rgb_stride = VENUS_RGB_STRIDE(color_fmt, width);
1250 	rgb_scanlines = VENUS_RGB_SCANLINES(color_fmt, height);
1251 
1252 	switch (color_fmt) {
1253 	case COLOR_FMT_NV21:
1254 	case COLOR_FMT_NV12:
1255 	case COLOR_FMT_P010:
1256 		uv_alignment = 4096;
1257 		y_plane = y_stride * y_sclines;
1258 		uv_plane = uv_stride * uv_sclines + uv_alignment;
1259 		size = y_plane + uv_plane +
1260 				MSM_MEDIA_MAX(extra_size, 8 * y_stride);
1261 		size = MSM_MEDIA_ALIGN(size, 4096);
1262 		break;
1263 	case COLOR_FMT_NV12_MVTB:
1264 		uv_alignment = 4096;
1265 		y_plane = y_stride * y_sclines;
1266 		uv_plane = uv_stride * uv_sclines + uv_alignment;
1267 		size = y_plane + uv_plane;
1268 		size = 2 * size + extra_size;
1269 		size = MSM_MEDIA_ALIGN(size, 4096);
1270 		break;
1271 	case COLOR_FMT_NV12_UBWC:
1272 		y_sclines = VENUS_Y_SCANLINES(color_fmt, (height+1)>>1);
1273 		y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
1274 		uv_sclines = VENUS_UV_SCANLINES(color_fmt, (height+1)>>1);
1275 		uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096);
1276 		y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
1277 		y_meta_scanlines =
1278 			VENUS_Y_META_SCANLINES(color_fmt, (height+1)>>1);
1279 		y_meta_plane = MSM_MEDIA_ALIGN(
1280 			y_meta_stride * y_meta_scanlines, 4096);
1281 		uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
1282 		uv_meta_scanlines =
1283 			VENUS_UV_META_SCANLINES(color_fmt, (height+1)>>1);
1284 		uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride *
1285 			uv_meta_scanlines, 4096);
1286 
1287 		size = (y_ubwc_plane + uv_ubwc_plane + y_meta_plane +
1288 			uv_meta_plane)*2 +
1289 			MSM_MEDIA_MAX(extra_size + 8192, 48 * y_stride);
1290 		size = MSM_MEDIA_ALIGN(size, 4096);
1291 		break;
1292 	case COLOR_FMT_NV12_BPP10_UBWC:
1293 		y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
1294 		uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096);
1295 		y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
1296 		y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
1297 		y_meta_plane = MSM_MEDIA_ALIGN(
1298 				y_meta_stride * y_meta_scanlines, 4096);
1299 		uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
1300 		uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
1301 		uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride *
1302 					uv_meta_scanlines, 4096);
1303 
1304 		size = y_ubwc_plane + uv_ubwc_plane + y_meta_plane +
1305 			uv_meta_plane +
1306 			MSM_MEDIA_MAX(extra_size + 8192, 48 * y_stride);
1307 		size = MSM_MEDIA_ALIGN(size, 4096);
1308 		break;
1309 	case COLOR_FMT_P010_UBWC:
1310 		y_ubwc_plane = MSM_MEDIA_ALIGN(y_stride * y_sclines, 4096);
1311 		uv_ubwc_plane = MSM_MEDIA_ALIGN(uv_stride * uv_sclines, 4096);
1312 		y_meta_stride = VENUS_Y_META_STRIDE(color_fmt, width);
1313 		y_meta_scanlines = VENUS_Y_META_SCANLINES(color_fmt, height);
1314 		y_meta_plane = MSM_MEDIA_ALIGN(
1315 				y_meta_stride * y_meta_scanlines, 4096);
1316 		uv_meta_stride = VENUS_UV_META_STRIDE(color_fmt, width);
1317 		uv_meta_scanlines = VENUS_UV_META_SCANLINES(color_fmt, height);
1318 		uv_meta_plane = MSM_MEDIA_ALIGN(uv_meta_stride *
1319 					uv_meta_scanlines, 4096);
1320 
1321 		size = y_ubwc_plane + uv_ubwc_plane + y_meta_plane +
1322 			uv_meta_plane;
1323 		size = MSM_MEDIA_ALIGN(size, 4096);
1324 		break;
1325 	case COLOR_FMT_RGBA8888:
1326 		rgb_plane = MSM_MEDIA_ALIGN(rgb_stride  * rgb_scanlines, 4096);
1327 		size = rgb_plane;
1328 		size =  MSM_MEDIA_ALIGN(size, 4096);
1329 		break;
1330 	case COLOR_FMT_RGBA8888_UBWC:
1331 	case COLOR_FMT_RGBA1010102_UBWC:
1332 	case COLOR_FMT_RGB565_UBWC:
1333 		rgb_ubwc_plane = MSM_MEDIA_ALIGN(rgb_stride * rgb_scanlines,
1334 							4096);
1335 		rgb_meta_stride = VENUS_RGB_META_STRIDE(color_fmt, width);
1336 		rgb_meta_scanlines = VENUS_RGB_META_SCANLINES(color_fmt,
1337 					height);
1338 		rgb_meta_plane = MSM_MEDIA_ALIGN(rgb_meta_stride *
1339 					rgb_meta_scanlines, 4096);
1340 		size = rgb_ubwc_plane + rgb_meta_plane;
1341 		size = MSM_MEDIA_ALIGN(size, 4096);
1342 		break;
1343 	default:
1344 		break;
1345 	}
1346 invalid_input:
1347 	return size;
1348 }
1349 
1350 static inline unsigned int VENUS_VIEW2_OFFSET(
1351 	int color_fmt, int width, int height)
1352 {
1353 	unsigned int offset = 0;
1354 	unsigned int y_plane, uv_plane, y_stride,
1355 		uv_stride, y_sclines, uv_sclines;
1356 	if (!width || !height)
1357 		goto invalid_input;
1358 
1359 	y_stride = VENUS_Y_STRIDE(color_fmt, width);
1360 	uv_stride = VENUS_UV_STRIDE(color_fmt, width);
1361 	y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
1362 	uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
1363 	switch (color_fmt) {
1364 	case COLOR_FMT_NV12_MVTB:
1365 		y_plane = y_stride * y_sclines;
1366 		uv_plane = uv_stride * uv_sclines;
1367 		offset = y_plane + uv_plane;
1368 		break;
1369 	default:
1370 		break;
1371 	}
1372 invalid_input:
1373 	return offset;
1374 }
1375 
1376 #endif
1377