blob: e3f22c7c85d943117528bdc88768f96538aabab2 [file] [log] [blame]
Greg Hackmannfc29df82013-05-22 14:23:10 -07001/*
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
21bool 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}
87EXPORT_SYMBOL(adf_format_is_standard);
88
89bool 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}
129EXPORT_SYMBOL(adf_format_is_rgb);
130
131u8 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}
154EXPORT_SYMBOL(adf_format_num_planes);
155
156u8 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}
203EXPORT_SYMBOL(adf_format_bpp);
204
205u8 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}
236EXPORT_SYMBOL(adf_format_plane_cpp);
237
238u8 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}
263EXPORT_SYMBOL(adf_format_horz_chroma_subsampling);
264
265u8 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}
280EXPORT_SYMBOL(adf_format_vert_chroma_subsampling);