video: adf: Cleanup sw_sync timeline at adf_device_destroy
[firefly-linux-kernel-4.4.55.git] / drivers / video / adf / adf_format.c
1 /*
2  * Copyright (C) 2013 Google, Inc.
3  * modified from drivers/gpu/drm/drm_crtc.c
4  *
5  * This software is licensed under the terms of the GNU General Public
6  * License version 2, as published by the Free Software Foundation, and
7  * may be copied, distributed, and modified under those terms.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  */
15
16 #include <linux/export.h>
17 #include <linux/kernel.h>
18 #include <drm/drm_fourcc.h>
19 #include <video/adf_format.h>
20
21 bool adf_format_is_standard(u32 format)
22 {
23         switch (format) {
24         case DRM_FORMAT_C8:
25         case DRM_FORMAT_RGB332:
26         case DRM_FORMAT_BGR233:
27         case DRM_FORMAT_XRGB4444:
28         case DRM_FORMAT_XBGR4444:
29         case DRM_FORMAT_RGBX4444:
30         case DRM_FORMAT_BGRX4444:
31         case DRM_FORMAT_ARGB4444:
32         case DRM_FORMAT_ABGR4444:
33         case DRM_FORMAT_RGBA4444:
34         case DRM_FORMAT_BGRA4444:
35         case DRM_FORMAT_XRGB1555:
36         case DRM_FORMAT_XBGR1555:
37         case DRM_FORMAT_RGBX5551:
38         case DRM_FORMAT_BGRX5551:
39         case DRM_FORMAT_ARGB1555:
40         case DRM_FORMAT_ABGR1555:
41         case DRM_FORMAT_RGBA5551:
42         case DRM_FORMAT_BGRA5551:
43         case DRM_FORMAT_RGB565:
44         case DRM_FORMAT_BGR565:
45         case DRM_FORMAT_RGB888:
46         case DRM_FORMAT_BGR888:
47         case DRM_FORMAT_XRGB8888:
48         case DRM_FORMAT_XBGR8888:
49         case DRM_FORMAT_RGBX8888:
50         case DRM_FORMAT_BGRX8888:
51         case DRM_FORMAT_ARGB8888:
52         case DRM_FORMAT_ABGR8888:
53         case DRM_FORMAT_RGBA8888:
54         case DRM_FORMAT_BGRA8888:
55         case DRM_FORMAT_XRGB2101010:
56         case DRM_FORMAT_XBGR2101010:
57         case DRM_FORMAT_RGBX1010102:
58         case DRM_FORMAT_BGRX1010102:
59         case DRM_FORMAT_ARGB2101010:
60         case DRM_FORMAT_ABGR2101010:
61         case DRM_FORMAT_RGBA1010102:
62         case DRM_FORMAT_BGRA1010102:
63         case DRM_FORMAT_YUYV:
64         case DRM_FORMAT_YVYU:
65         case DRM_FORMAT_UYVY:
66         case DRM_FORMAT_VYUY:
67         case DRM_FORMAT_AYUV:
68         case DRM_FORMAT_NV12:
69         case DRM_FORMAT_NV21:
70         case DRM_FORMAT_NV16:
71         case DRM_FORMAT_NV61:
72         case DRM_FORMAT_YUV410:
73         case DRM_FORMAT_YVU410:
74         case DRM_FORMAT_YUV411:
75         case DRM_FORMAT_YVU411:
76         case DRM_FORMAT_YUV420:
77         case DRM_FORMAT_YVU420:
78         case DRM_FORMAT_YUV422:
79         case DRM_FORMAT_YVU422:
80         case DRM_FORMAT_YUV444:
81         case DRM_FORMAT_YVU444:
82                 return true;
83         default:
84                 return false;
85         }
86 }
87 EXPORT_SYMBOL(adf_format_is_standard);
88
89 bool adf_format_is_rgb(u32 format)
90 {
91         switch (format) {
92         case DRM_FORMAT_C8:
93         case DRM_FORMAT_RGB332:
94         case DRM_FORMAT_BGR233:
95         case DRM_FORMAT_XRGB1555:
96         case DRM_FORMAT_XBGR1555:
97         case DRM_FORMAT_RGBX5551:
98         case DRM_FORMAT_BGRX5551:
99         case DRM_FORMAT_ARGB1555:
100         case DRM_FORMAT_ABGR1555:
101         case DRM_FORMAT_RGBA5551:
102         case DRM_FORMAT_BGRA5551:
103         case DRM_FORMAT_RGB565:
104         case DRM_FORMAT_BGR565:
105         case DRM_FORMAT_RGB888:
106         case DRM_FORMAT_BGR888:
107         case DRM_FORMAT_XRGB8888:
108         case DRM_FORMAT_XBGR8888:
109         case DRM_FORMAT_RGBX8888:
110         case DRM_FORMAT_BGRX8888:
111         case DRM_FORMAT_XRGB2101010:
112         case DRM_FORMAT_XBGR2101010:
113         case DRM_FORMAT_RGBX1010102:
114         case DRM_FORMAT_BGRX1010102:
115         case DRM_FORMAT_ARGB2101010:
116         case DRM_FORMAT_ABGR2101010:
117         case DRM_FORMAT_RGBA1010102:
118         case DRM_FORMAT_BGRA1010102:
119         case DRM_FORMAT_ARGB8888:
120         case DRM_FORMAT_ABGR8888:
121         case DRM_FORMAT_RGBA8888:
122         case DRM_FORMAT_BGRA8888:
123                 return true;
124
125         default:
126                 return false;
127         }
128 }
129 EXPORT_SYMBOL(adf_format_is_rgb);
130
131 u8 adf_format_num_planes(u32 format)
132 {
133         switch (format) {
134         case DRM_FORMAT_YUV410:
135         case DRM_FORMAT_YVU410:
136         case DRM_FORMAT_YUV411:
137         case DRM_FORMAT_YVU411:
138         case DRM_FORMAT_YUV420:
139         case DRM_FORMAT_YVU420:
140         case DRM_FORMAT_YUV422:
141         case DRM_FORMAT_YVU422:
142         case DRM_FORMAT_YUV444:
143         case DRM_FORMAT_YVU444:
144                 return 3;
145         case DRM_FORMAT_NV12:
146         case DRM_FORMAT_NV21:
147         case DRM_FORMAT_NV16:
148         case DRM_FORMAT_NV61:
149                 return 2;
150         default:
151                 return 1;
152         }
153 }
154 EXPORT_SYMBOL(adf_format_num_planes);
155
156 u8 adf_format_bpp(u32 format)
157 {
158         switch (format) {
159         case DRM_FORMAT_C8:
160         case DRM_FORMAT_RGB332:
161         case DRM_FORMAT_BGR233:
162                 return 8;
163
164         case DRM_FORMAT_XRGB1555:
165         case DRM_FORMAT_XBGR1555:
166         case DRM_FORMAT_RGBX5551:
167         case DRM_FORMAT_BGRX5551:
168         case DRM_FORMAT_ARGB1555:
169         case DRM_FORMAT_ABGR1555:
170         case DRM_FORMAT_RGBA5551:
171         case DRM_FORMAT_BGRA5551:
172         case DRM_FORMAT_RGB565:
173         case DRM_FORMAT_BGR565:
174                 return 16;
175
176         case DRM_FORMAT_RGB888:
177         case DRM_FORMAT_BGR888:
178                 return 24;
179
180         case DRM_FORMAT_XRGB8888:
181         case DRM_FORMAT_XBGR8888:
182         case DRM_FORMAT_RGBX8888:
183         case DRM_FORMAT_BGRX8888:
184         case DRM_FORMAT_XRGB2101010:
185         case DRM_FORMAT_XBGR2101010:
186         case DRM_FORMAT_RGBX1010102:
187         case DRM_FORMAT_BGRX1010102:
188         case DRM_FORMAT_ARGB2101010:
189         case DRM_FORMAT_ABGR2101010:
190         case DRM_FORMAT_RGBA1010102:
191         case DRM_FORMAT_BGRA1010102:
192         case DRM_FORMAT_ARGB8888:
193         case DRM_FORMAT_ABGR8888:
194         case DRM_FORMAT_RGBA8888:
195         case DRM_FORMAT_BGRA8888:
196                 return 32;
197
198         default:
199                 pr_debug("%s: unsupported pixel format %u\n", __func__, format);
200                 return 0;
201         }
202 }
203 EXPORT_SYMBOL(adf_format_bpp);
204
205 u8 adf_format_plane_cpp(u32 format, int plane)
206 {
207         if (plane >= adf_format_num_planes(format))
208                 return 0;
209
210         switch (format) {
211         case DRM_FORMAT_YUYV:
212         case DRM_FORMAT_YVYU:
213         case DRM_FORMAT_UYVY:
214         case DRM_FORMAT_VYUY:
215                 return 2;
216         case DRM_FORMAT_NV12:
217         case DRM_FORMAT_NV21:
218         case DRM_FORMAT_NV16:
219         case DRM_FORMAT_NV61:
220                 return plane ? 2 : 1;
221         case DRM_FORMAT_YUV410:
222         case DRM_FORMAT_YVU410:
223         case DRM_FORMAT_YUV411:
224         case DRM_FORMAT_YVU411:
225         case DRM_FORMAT_YUV420:
226         case DRM_FORMAT_YVU420:
227         case DRM_FORMAT_YUV422:
228         case DRM_FORMAT_YVU422:
229         case DRM_FORMAT_YUV444:
230         case DRM_FORMAT_YVU444:
231                 return 1;
232         default:
233                 return adf_format_bpp(format) / 8;
234         }
235 }
236 EXPORT_SYMBOL(adf_format_plane_cpp);
237
238 u8 adf_format_horz_chroma_subsampling(u32 format)
239 {
240         switch (format) {
241         case DRM_FORMAT_YUV411:
242         case DRM_FORMAT_YVU411:
243         case DRM_FORMAT_YUV410:
244         case DRM_FORMAT_YVU410:
245                 return 4;
246         case DRM_FORMAT_YUYV:
247         case DRM_FORMAT_YVYU:
248         case DRM_FORMAT_UYVY:
249         case DRM_FORMAT_VYUY:
250         case DRM_FORMAT_NV12:
251         case DRM_FORMAT_NV21:
252         case DRM_FORMAT_NV16:
253         case DRM_FORMAT_NV61:
254         case DRM_FORMAT_YUV422:
255         case DRM_FORMAT_YVU422:
256         case DRM_FORMAT_YUV420:
257         case DRM_FORMAT_YVU420:
258                 return 2;
259         default:
260                 return 1;
261         }
262 }
263 EXPORT_SYMBOL(adf_format_horz_chroma_subsampling);
264
265 u8 adf_format_vert_chroma_subsampling(u32 format)
266 {
267         switch (format) {
268         case DRM_FORMAT_YUV410:
269         case DRM_FORMAT_YVU410:
270                 return 4;
271         case DRM_FORMAT_YUV420:
272         case DRM_FORMAT_YVU420:
273         case DRM_FORMAT_NV12:
274         case DRM_FORMAT_NV21:
275                 return 2;
276         default:
277                 return 1;
278         }
279 }
280 EXPORT_SYMBOL(adf_format_vert_chroma_subsampling);