Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / gpu / drm / msm / disp / dpu1 / msm_media_info.h
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 /*
817  * Function arguments:
818  * @color_fmt
819  * @width
820  * Progressive: width
821  * Interlaced: width
822  */
823 static unsigned int VENUS_Y_STRIDE(int color_fmt, int width)
824 {
825         unsigned int stride = 0;
826
827         if (!width)
828                 return 0;
829
830         switch (color_fmt) {
831         case COLOR_FMT_NV21:
832         case COLOR_FMT_NV12:
833         case COLOR_FMT_NV12_MVTB:
834         case COLOR_FMT_NV12_UBWC:
835                 stride = MSM_MEDIA_ALIGN(width, 128);
836                 break;
837         case COLOR_FMT_NV12_BPP10_UBWC:
838                 stride = MSM_MEDIA_ALIGN(width, 192);
839                 stride = MSM_MEDIA_ALIGN(stride * 4 / 3, 256);
840                 break;
841         case COLOR_FMT_P010_UBWC:
842                 stride = MSM_MEDIA_ALIGN(width * 2, 256);
843                 break;
844         case COLOR_FMT_P010:
845                 stride = MSM_MEDIA_ALIGN(width * 2, 128);
846                 break;
847         }
848
849         return stride;
850 }
851
852 /*
853  * Function arguments:
854  * @color_fmt
855  * @width
856  * Progressive: width
857  * Interlaced: width
858  */
859 static unsigned int VENUS_UV_STRIDE(int color_fmt, int width)
860 {
861         unsigned int stride = 0;
862
863         if (!width)
864                 return 0;
865
866         switch (color_fmt) {
867         case COLOR_FMT_NV21:
868         case COLOR_FMT_NV12:
869         case COLOR_FMT_NV12_MVTB:
870         case COLOR_FMT_NV12_UBWC:
871                 stride = MSM_MEDIA_ALIGN(width, 128);
872                 break;
873         case COLOR_FMT_NV12_BPP10_UBWC:
874                 stride = MSM_MEDIA_ALIGN(width, 192);
875                 stride = MSM_MEDIA_ALIGN(stride * 4 / 3, 256);
876                 break;
877         case COLOR_FMT_P010_UBWC:
878                 stride = MSM_MEDIA_ALIGN(width * 2, 256);
879                 break;
880         case COLOR_FMT_P010:
881                 stride = MSM_MEDIA_ALIGN(width * 2, 128);
882                 break;
883         }
884
885         return stride;
886 }
887
888 /*
889  * Function arguments:
890  * @color_fmt
891  * @height
892  * Progressive: height
893  * Interlaced: (height+1)>>1
894  */
895 static unsigned int VENUS_Y_SCANLINES(int color_fmt, int height)
896 {
897         unsigned int sclines = 0;
898
899         if (!height)
900                 return 0;
901
902         switch (color_fmt) {
903         case COLOR_FMT_NV21:
904         case COLOR_FMT_NV12:
905         case COLOR_FMT_NV12_MVTB:
906         case COLOR_FMT_NV12_UBWC:
907         case COLOR_FMT_P010:
908                 sclines = MSM_MEDIA_ALIGN(height, 32);
909                 break;
910         case COLOR_FMT_NV12_BPP10_UBWC:
911         case COLOR_FMT_P010_UBWC:
912                 sclines = MSM_MEDIA_ALIGN(height, 16);
913                 break;
914         }
915
916         return sclines;
917 }
918
919 /*
920  * Function arguments:
921  * @color_fmt
922  * @height
923  * Progressive: height
924  * Interlaced: (height+1)>>1
925  */
926 static unsigned int VENUS_UV_SCANLINES(int color_fmt, int height)
927 {
928         unsigned int sclines = 0;
929
930         if (!height)
931                 return 0;
932
933         switch (color_fmt) {
934         case COLOR_FMT_NV21:
935         case COLOR_FMT_NV12:
936         case COLOR_FMT_NV12_MVTB:
937         case COLOR_FMT_NV12_BPP10_UBWC:
938         case COLOR_FMT_P010_UBWC:
939         case COLOR_FMT_P010:
940                 sclines = MSM_MEDIA_ALIGN((height + 1) >> 1, 16);
941                 break;
942         case COLOR_FMT_NV12_UBWC:
943                 sclines = MSM_MEDIA_ALIGN((height + 1) >> 1, 32);
944                 break;
945         }
946
947         return sclines;
948 }
949
950 /*
951  * Function arguments:
952  * @color_fmt
953  * @width
954  * Progressive: width
955  * Interlaced: width
956  */
957 static unsigned int VENUS_Y_META_STRIDE(int color_fmt, int width)
958 {
959         int y_tile_width = 0, y_meta_stride;
960
961         if (!width)
962                 return 0;
963
964         switch (color_fmt) {
965         case COLOR_FMT_NV12_UBWC:
966         case COLOR_FMT_P010_UBWC:
967                 y_tile_width = 32;
968                 break;
969         case COLOR_FMT_NV12_BPP10_UBWC:
970                 y_tile_width = 48;
971                 break;
972         default:
973                 return 0;
974         }
975
976         y_meta_stride = MSM_MEDIA_ROUNDUP(width, y_tile_width);
977         return MSM_MEDIA_ALIGN(y_meta_stride, 64);
978 }
979
980 /*
981  * Function arguments:
982  * @color_fmt
983  * @height
984  * Progressive: height
985  * Interlaced: (height+1)>>1
986  */
987 static unsigned int VENUS_Y_META_SCANLINES(int color_fmt, int height)
988 {
989         int y_tile_height = 0, y_meta_scanlines;
990
991         if (!height)
992                 return 0;
993
994         switch (color_fmt) {
995         case COLOR_FMT_NV12_UBWC:
996                 y_tile_height = 8;
997                 break;
998         case COLOR_FMT_NV12_BPP10_UBWC:
999         case COLOR_FMT_P010_UBWC:
1000                 y_tile_height = 4;
1001                 break;
1002         default:
1003                 return 0;
1004         }
1005
1006         y_meta_scanlines = MSM_MEDIA_ROUNDUP(height, y_tile_height);
1007         return MSM_MEDIA_ALIGN(y_meta_scanlines, 16);
1008 }
1009
1010 /*
1011  * Function arguments:
1012  * @color_fmt
1013  * @width
1014  * Progressive: width
1015  * Interlaced: width
1016  */
1017 static unsigned int VENUS_UV_META_STRIDE(int color_fmt, int width)
1018 {
1019         int uv_tile_width = 0, uv_meta_stride;
1020
1021         if (!width)
1022                 return 0;
1023
1024         switch (color_fmt) {
1025         case COLOR_FMT_NV12_UBWC:
1026         case COLOR_FMT_P010_UBWC:
1027                 uv_tile_width = 16;
1028                 break;
1029         case COLOR_FMT_NV12_BPP10_UBWC:
1030                 uv_tile_width = 24;
1031                 break;
1032         default:
1033                 return 0;
1034         }
1035
1036         uv_meta_stride = MSM_MEDIA_ROUNDUP((width+1)>>1, uv_tile_width);
1037         return MSM_MEDIA_ALIGN(uv_meta_stride, 64);
1038 }
1039
1040 /*
1041  * Function arguments:
1042  * @color_fmt
1043  * @height
1044  * Progressive: height
1045  * Interlaced: (height+1)>>1
1046  */
1047 static unsigned int VENUS_UV_META_SCANLINES(int color_fmt, int height)
1048 {
1049         int uv_tile_height = 0, uv_meta_scanlines;
1050
1051         if (!height)
1052                 return 0;
1053
1054         switch (color_fmt) {
1055         case COLOR_FMT_NV12_UBWC:
1056                 uv_tile_height = 8;
1057                 break;
1058         case COLOR_FMT_NV12_BPP10_UBWC:
1059         case COLOR_FMT_P010_UBWC:
1060                 uv_tile_height = 4;
1061                 break;
1062         default:
1063                 return 0;
1064         }
1065
1066         uv_meta_scanlines = MSM_MEDIA_ROUNDUP((height+1)>>1, uv_tile_height);
1067         return MSM_MEDIA_ALIGN(uv_meta_scanlines, 16);
1068 }
1069
1070 static unsigned int VENUS_RGB_STRIDE(int color_fmt, int width)
1071 {
1072         unsigned int alignment = 0, bpp = 4;
1073
1074         if (!width)
1075                 return 0;
1076
1077         switch (color_fmt) {
1078         case COLOR_FMT_RGBA8888:
1079                 alignment = 128;
1080                 break;
1081         case COLOR_FMT_RGB565_UBWC:
1082                 alignment = 256;
1083                 bpp = 2;
1084                 break;
1085         case COLOR_FMT_RGBA8888_UBWC:
1086         case COLOR_FMT_RGBA1010102_UBWC:
1087                 alignment = 256;
1088                 break;
1089         default:
1090                 return 0;
1091         }
1092
1093         return MSM_MEDIA_ALIGN(width * bpp, alignment);
1094 }
1095
1096 static unsigned int VENUS_RGB_SCANLINES(int color_fmt, int height)
1097 {
1098         unsigned int alignment = 0;
1099
1100         if (!height)
1101                 return 0;
1102
1103         switch (color_fmt) {
1104         case COLOR_FMT_RGBA8888:
1105                 alignment = 32;
1106                 break;
1107         case COLOR_FMT_RGBA8888_UBWC:
1108         case COLOR_FMT_RGBA1010102_UBWC:
1109         case COLOR_FMT_RGB565_UBWC:
1110                 alignment = 16;
1111                 break;
1112         default:
1113                 return 0;
1114         }
1115
1116         return MSM_MEDIA_ALIGN(height, alignment);
1117 }
1118
1119 static unsigned int VENUS_RGB_META_STRIDE(int color_fmt, int width)
1120 {
1121         int rgb_meta_stride;
1122
1123         if (!width)
1124                 return 0;
1125
1126         switch (color_fmt) {
1127         case COLOR_FMT_RGBA8888_UBWC:
1128         case COLOR_FMT_RGBA1010102_UBWC:
1129         case COLOR_FMT_RGB565_UBWC:
1130                 rgb_meta_stride = MSM_MEDIA_ROUNDUP(width, 16);
1131                 return MSM_MEDIA_ALIGN(rgb_meta_stride, 64);
1132         }
1133
1134         return 0;
1135 }
1136
1137 static unsigned int VENUS_RGB_META_SCANLINES(int color_fmt, int height)
1138 {
1139         int rgb_meta_scanlines;
1140
1141         if (!height)
1142                 return 0;
1143
1144         switch (color_fmt) {
1145         case COLOR_FMT_RGBA8888_UBWC:
1146         case COLOR_FMT_RGBA1010102_UBWC:
1147         case COLOR_FMT_RGB565_UBWC:
1148                 rgb_meta_scanlines = MSM_MEDIA_ROUNDUP(height, 4);
1149                 return MSM_MEDIA_ALIGN(rgb_meta_scanlines, 16);
1150         }
1151
1152         return 0;
1153 }
1154
1155 #endif