GNU Linux-libre 4.14.266-gnu1
[releases.git] / drivers / staging / media / atomisp / pci / atomisp2 / css2400 / camera / util / src / util.c
1 /*
2  * Support for Intel Camera Imaging ISP subsystem.
3  * Copyright (c) 2015, Intel Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU General Public License,
7  * version 2, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  */
14
15 #include "ia_css_util.h"
16 #include <ia_css_frame.h>
17 #include <assert_support.h>
18 #include <math_support.h>
19
20 /* for ia_css_binary_max_vf_width() */
21 #include "ia_css_binary.h"
22
23
24 enum ia_css_err ia_css_convert_errno(
25                                 int in_err)
26 {
27         enum ia_css_err out_err;
28
29         switch (in_err) {
30                 case 0:
31                         out_err = IA_CSS_SUCCESS;
32                         break;
33                 case EINVAL:
34                         out_err = IA_CSS_ERR_INVALID_ARGUMENTS;
35                         break;
36                 case ENODATA:
37                         out_err = IA_CSS_ERR_QUEUE_IS_EMPTY;
38                         break;
39                 case ENOSYS:
40                 case ENOTSUP:
41                         out_err = IA_CSS_ERR_INTERNAL_ERROR;
42                         break;
43                 case ENOBUFS:
44                         out_err = IA_CSS_ERR_QUEUE_IS_FULL;
45                         break;
46                 default:
47                         out_err = IA_CSS_ERR_INTERNAL_ERROR;
48                         break;
49         }
50         return out_err;
51 }
52
53 /* MW: Table look-up ??? */
54 unsigned int ia_css_util_input_format_bpp(
55         enum ia_css_stream_format format,
56         bool two_ppc)
57 {
58         unsigned int rval = 0;
59         switch (format) {
60         case IA_CSS_STREAM_FORMAT_YUV420_8_LEGACY:
61         case IA_CSS_STREAM_FORMAT_YUV420_8:
62         case IA_CSS_STREAM_FORMAT_YUV422_8:
63         case IA_CSS_STREAM_FORMAT_RGB_888:
64         case IA_CSS_STREAM_FORMAT_RAW_8:
65         case IA_CSS_STREAM_FORMAT_BINARY_8:
66         case IA_CSS_STREAM_FORMAT_EMBEDDED:
67                 rval = 8;
68                 break;
69         case IA_CSS_STREAM_FORMAT_YUV420_10:
70         case IA_CSS_STREAM_FORMAT_YUV422_10:
71         case IA_CSS_STREAM_FORMAT_RAW_10:
72                 rval = 10;
73                 break;
74         case IA_CSS_STREAM_FORMAT_YUV420_16:
75         case IA_CSS_STREAM_FORMAT_YUV422_16:
76                 rval = 16;
77                 break;
78         case IA_CSS_STREAM_FORMAT_RGB_444:
79                 rval = 4;
80                 break;
81         case IA_CSS_STREAM_FORMAT_RGB_555:
82                 rval = 5;
83                 break;
84         case IA_CSS_STREAM_FORMAT_RGB_565:
85                 rval = 65;
86                 break;
87         case IA_CSS_STREAM_FORMAT_RGB_666:
88         case IA_CSS_STREAM_FORMAT_RAW_6:
89                 rval = 6;
90                 break;
91         case IA_CSS_STREAM_FORMAT_RAW_7:
92                 rval = 7;
93                 break;
94         case IA_CSS_STREAM_FORMAT_RAW_12:
95                 rval = 12;
96                 break;
97         case IA_CSS_STREAM_FORMAT_RAW_14:
98                 if (two_ppc)
99                         rval = 14;
100                 else
101                         rval = 12;
102                 break;
103         case IA_CSS_STREAM_FORMAT_RAW_16:
104                 if (two_ppc)
105                         rval = 16;
106                 else
107                         rval = 12;
108                 break;
109         default:
110                 rval = 0;
111                 break;
112
113         }
114 return rval;
115 }
116
117 enum ia_css_err ia_css_util_check_vf_info(
118         const struct ia_css_frame_info * const info)
119 {
120         enum ia_css_err err;
121         unsigned int max_vf_width;
122         assert(info != NULL);
123         err = ia_css_frame_check_info(info);
124         if (err != IA_CSS_SUCCESS)
125                 return err;
126         max_vf_width = ia_css_binary_max_vf_width();
127         if (max_vf_width != 0 && info->res.width > max_vf_width*2)
128                 return IA_CSS_ERR_INVALID_ARGUMENTS;
129         return IA_CSS_SUCCESS;
130 }
131
132 enum ia_css_err ia_css_util_check_vf_out_info(
133         const struct ia_css_frame_info * const out_info,
134         const struct ia_css_frame_info * const vf_info)
135 {
136         enum ia_css_err err;
137
138         assert(out_info != NULL);
139         assert(vf_info != NULL);
140
141         err = ia_css_frame_check_info(out_info);
142         if (err != IA_CSS_SUCCESS)
143                 return err;
144         err = ia_css_util_check_vf_info(vf_info);
145         if (err != IA_CSS_SUCCESS)
146                 return err;
147         return IA_CSS_SUCCESS;
148 }
149
150 enum ia_css_err ia_css_util_check_res(unsigned int width, unsigned int height)
151 {
152         /* height can be odd number for jpeg/embedded data from ISYS2401 */
153         if (((width  == 0)   ||
154              (height == 0)   ||
155              IS_ODD(width))) {
156                 return IA_CSS_ERR_INVALID_ARGUMENTS;
157         }
158         return IA_CSS_SUCCESS;
159 }
160
161 #ifdef ISP2401
162 bool ia_css_util_res_leq(struct ia_css_resolution a, struct ia_css_resolution b)
163 {
164         return a.width <= b.width && a.height <= b.height;
165 }
166
167 bool ia_css_util_resolution_is_zero(const struct ia_css_resolution resolution)
168 {
169         return (resolution.width == 0) || (resolution.height == 0);
170 }
171
172 bool ia_css_util_resolution_is_even(const struct ia_css_resolution resolution)
173 {
174         return IS_EVEN(resolution.height) && IS_EVEN(resolution.width);
175 }
176
177 #endif
178 bool ia_css_util_is_input_format_raw(enum ia_css_stream_format format)
179 {
180         return ((format == IA_CSS_STREAM_FORMAT_RAW_6) ||
181                 (format == IA_CSS_STREAM_FORMAT_RAW_7) ||
182                 (format == IA_CSS_STREAM_FORMAT_RAW_8) ||
183                 (format == IA_CSS_STREAM_FORMAT_RAW_10) ||
184                 (format == IA_CSS_STREAM_FORMAT_RAW_12));
185         /* raw_14 and raw_16 are not supported as input formats to the ISP.
186          * They can only be copied to a frame in memory using the
187          * copy binary.
188          */
189 }
190
191 bool ia_css_util_is_input_format_yuv(enum ia_css_stream_format format)
192 {
193         return format == IA_CSS_STREAM_FORMAT_YUV420_8_LEGACY ||
194             format == IA_CSS_STREAM_FORMAT_YUV420_8  ||
195             format == IA_CSS_STREAM_FORMAT_YUV420_10 ||
196             format == IA_CSS_STREAM_FORMAT_YUV420_16 ||
197             format == IA_CSS_STREAM_FORMAT_YUV422_8  ||
198             format == IA_CSS_STREAM_FORMAT_YUV422_10 ||
199             format == IA_CSS_STREAM_FORMAT_YUV422_16;
200 }
201
202 enum ia_css_err ia_css_util_check_input(
203         const struct ia_css_stream_config * const stream_config,
204         bool must_be_raw,
205         bool must_be_yuv)
206 {
207         assert(stream_config != NULL);
208
209         if (stream_config == NULL)
210                 return IA_CSS_ERR_INVALID_ARGUMENTS;
211
212 #ifdef IS_ISP_2400_SYSTEM
213         if (stream_config->input_config.effective_res.width == 0 ||
214             stream_config->input_config.effective_res.height == 0)
215                 return IA_CSS_ERR_INVALID_ARGUMENTS;
216 #endif
217         if (must_be_raw &&
218             !ia_css_util_is_input_format_raw(stream_config->input_config.format))
219                 return IA_CSS_ERR_INVALID_ARGUMENTS;
220
221         if (must_be_yuv &&
222             !ia_css_util_is_input_format_yuv(stream_config->input_config.format))
223                 return IA_CSS_ERR_INVALID_ARGUMENTS;
224
225         return IA_CSS_SUCCESS;
226 }
227