1 /*
2  * Copyright (C) STMicroelectronics SA 2014
3  * Authors: Fabien Dessenne <fabien.dessenne@st.com> for STMicroelectronics.
4  * License terms:  GNU General Public License (GPL), version 2
5  */
6 
7 #define BDISP_HF_NB             64
8 #define BDISP_VF_NB             40
9 
10 /**
11  * struct bdisp_filter_h_spec - Horizontal filter specification
12  *
13  * @min:        min scale factor for this filter (6.10 fixed point)
14  * @max:        max scale factor for this filter (6.10 fixed point)
15  * coef:        filter coefficients
16  */
17 struct bdisp_filter_h_spec {
18 	const u16 min;
19 	const u16 max;
20 	const u8 coef[BDISP_HF_NB];
21 };
22 
23 static const struct bdisp_filter_h_spec bdisp_h_spec[] = {
24 	{
25 		.min = 0,
26 		.max = 921,
27 		.coef = {
28 			0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
29 			0x00, 0x00, 0xff, 0x07, 0x3d, 0xfc, 0x01, 0x00,
30 			0x00, 0x01, 0xfd, 0x11, 0x36, 0xf9, 0x02, 0x00,
31 			0x00, 0x01, 0xfb, 0x1b, 0x2e, 0xf9, 0x02, 0x00,
32 			0x00, 0x01, 0xf9, 0x26, 0x26, 0xf9, 0x01, 0x00,
33 			0x00, 0x02, 0xf9, 0x30, 0x19, 0xfb, 0x01, 0x00,
34 			0x00, 0x02, 0xf9, 0x39, 0x0e, 0xfd, 0x01, 0x00,
35 			0x00, 0x01, 0xfc, 0x3e, 0x06, 0xff, 0x00, 0x00
36 		}
37 	},
38 	{
39 		.min = 921,
40 		.max = 1024,
41 		.coef = {
42 			0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
43 			0xff, 0x03, 0xfd, 0x08, 0x3e, 0xf9, 0x04, 0xfe,
44 			0xfd, 0x06, 0xf8, 0x13, 0x3b, 0xf4, 0x07, 0xfc,
45 			0xfb, 0x08, 0xf5, 0x1f, 0x34, 0xf1, 0x09, 0xfb,
46 			0xfb, 0x09, 0xf2, 0x2b, 0x2a, 0xf1, 0x09, 0xfb,
47 			0xfb, 0x09, 0xf2, 0x35, 0x1e, 0xf4, 0x08, 0xfb,
48 			0xfc, 0x07, 0xf5, 0x3c, 0x12, 0xf7, 0x06, 0xfd,
49 			0xfe, 0x04, 0xfa, 0x3f, 0x07, 0xfc, 0x03, 0xff
50 		}
51 	},
52 	{
53 		.min = 1024,
54 		.max = 1126,
55 		.coef = {
56 			0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
57 			0xff, 0x03, 0xfd, 0x08, 0x3e, 0xf9, 0x04, 0xfe,
58 			0xfd, 0x06, 0xf8, 0x13, 0x3b, 0xf4, 0x07, 0xfc,
59 			0xfb, 0x08, 0xf5, 0x1f, 0x34, 0xf1, 0x09, 0xfb,
60 			0xfb, 0x09, 0xf2, 0x2b, 0x2a, 0xf1, 0x09, 0xfb,
61 			0xfb, 0x09, 0xf2, 0x35, 0x1e, 0xf4, 0x08, 0xfb,
62 			0xfc, 0x07, 0xf5, 0x3c, 0x12, 0xf7, 0x06, 0xfd,
63 			0xfe, 0x04, 0xfa, 0x3f, 0x07, 0xfc, 0x03, 0xff
64 		}
65 	},
66 	{
67 		.min = 1126,
68 		.max = 1228,
69 		.coef = {
70 			0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
71 			0xff, 0x03, 0xfd, 0x08, 0x3e, 0xf9, 0x04, 0xfe,
72 			0xfd, 0x06, 0xf8, 0x13, 0x3b, 0xf4, 0x07, 0xfc,
73 			0xfb, 0x08, 0xf5, 0x1f, 0x34, 0xf1, 0x09, 0xfb,
74 			0xfb, 0x09, 0xf2, 0x2b, 0x2a, 0xf1, 0x09, 0xfb,
75 			0xfb, 0x09, 0xf2, 0x35, 0x1e, 0xf4, 0x08, 0xfb,
76 			0xfc, 0x07, 0xf5, 0x3c, 0x12, 0xf7, 0x06, 0xfd,
77 			0xfe, 0x04, 0xfa, 0x3f, 0x07, 0xfc, 0x03, 0xff
78 		}
79 	},
80 	{
81 		.min = 1228,
82 		.max = 1331,
83 		.coef = {
84 			0xfd, 0x04, 0xfc, 0x05, 0x39, 0x05, 0xfc, 0x04,
85 			0xfc, 0x06, 0xf9, 0x0c, 0x39, 0xfe, 0x00, 0x02,
86 			0xfb, 0x08, 0xf6, 0x17, 0x35, 0xf9, 0x02, 0x00,
87 			0xfc, 0x08, 0xf4, 0x20, 0x30, 0xf4, 0x05, 0xff,
88 			0xfd, 0x07, 0xf4, 0x29, 0x28, 0xf3, 0x07, 0xfd,
89 			0xff, 0x05, 0xf5, 0x31, 0x1f, 0xf3, 0x08, 0xfc,
90 			0x00, 0x02, 0xf9, 0x38, 0x14, 0xf6, 0x08, 0xfb,
91 			0x02, 0x00, 0xff, 0x3a, 0x0b, 0xf8, 0x06, 0xfc
92 		}
93 	},
94 	{
95 		.min = 1331,
96 		.max = 1433,
97 		.coef = {
98 			0xfc, 0x06, 0xf9, 0x09, 0x34, 0x09, 0xf9, 0x06,
99 			0xfd, 0x07, 0xf7, 0x10, 0x32, 0x02, 0xfc, 0x05,
100 			0xfe, 0x07, 0xf6, 0x17, 0x2f, 0xfc, 0xff, 0x04,
101 			0xff, 0x06, 0xf5, 0x20, 0x2a, 0xf9, 0x01, 0x02,
102 			0x00, 0x04, 0xf6, 0x27, 0x25, 0xf6, 0x04, 0x00,
103 			0x02, 0x01, 0xf9, 0x2d, 0x1d, 0xf5, 0x06, 0xff,
104 			0x04, 0xff, 0xfd, 0x31, 0x15, 0xf5, 0x07, 0xfe,
105 			0x05, 0xfc, 0x02, 0x35, 0x0d, 0xf7, 0x07, 0xfd
106 		}
107 	},
108 	{
109 		.min = 1433,
110 		.max = 1536,
111 		.coef = {
112 			0xfe, 0x06, 0xf8, 0x0b, 0x30, 0x0b, 0xf8, 0x06,
113 			0xff, 0x06, 0xf7, 0x12, 0x2d, 0x05, 0xfa, 0x06,
114 			0x00, 0x04, 0xf6, 0x18, 0x2c, 0x00, 0xfc, 0x06,
115 			0x01, 0x02, 0xf7, 0x1f, 0x27, 0xfd, 0xff, 0x04,
116 			0x03, 0x00, 0xf9, 0x24, 0x24, 0xf9, 0x00, 0x03,
117 			0x04, 0xff, 0xfd, 0x29, 0x1d, 0xf7, 0x02, 0x01,
118 			0x06, 0xfc, 0x00, 0x2d, 0x17, 0xf6, 0x04, 0x00,
119 			0x06, 0xfa, 0x05, 0x30, 0x0f, 0xf7, 0x06, 0xff
120 		}
121 	},
122 	{
123 		.min = 1536,
124 		.max = 2048,
125 		.coef = {
126 			0x05, 0xfd, 0xfb, 0x13, 0x25, 0x13, 0xfb, 0xfd,
127 			0x05, 0xfc, 0xfd, 0x17, 0x24, 0x0f, 0xf9, 0xff,
128 			0x04, 0xfa, 0xff, 0x1b, 0x24, 0x0b, 0xf9, 0x00,
129 			0x03, 0xf9, 0x01, 0x1f, 0x23, 0x08, 0xf8, 0x01,
130 			0x02, 0xf9, 0x04, 0x22, 0x20, 0x04, 0xf9, 0x02,
131 			0x01, 0xf8, 0x08, 0x25, 0x1d, 0x01, 0xf9, 0x03,
132 			0x00, 0xf9, 0x0c, 0x25, 0x1a, 0xfe, 0xfa, 0x04,
133 			0xff, 0xf9, 0x10, 0x26, 0x15, 0xfc, 0xfc, 0x05
134 		}
135 	},
136 	{
137 		.min = 2048,
138 		.max = 3072,
139 		.coef = {
140 			0xfc, 0xfd, 0x06, 0x13, 0x18, 0x13, 0x06, 0xfd,
141 			0xfc, 0xfe, 0x08, 0x15, 0x17, 0x12, 0x04, 0xfc,
142 			0xfb, 0xfe, 0x0a, 0x16, 0x18, 0x10, 0x03, 0xfc,
143 			0xfb, 0x00, 0x0b, 0x18, 0x17, 0x0f, 0x01, 0xfb,
144 			0xfb, 0x00, 0x0d, 0x19, 0x17, 0x0d, 0x00, 0xfb,
145 			0xfb, 0x01, 0x0f, 0x19, 0x16, 0x0b, 0x00, 0xfb,
146 			0xfc, 0x03, 0x11, 0x19, 0x15, 0x09, 0xfe, 0xfb,
147 			0xfc, 0x04, 0x12, 0x1a, 0x12, 0x08, 0xfe, 0xfc
148 		}
149 	},
150 	{
151 		.min = 3072,
152 		.max = 4096,
153 		.coef = {
154 			0xfe, 0x02, 0x09, 0x0f, 0x0e, 0x0f, 0x09, 0x02,
155 			0xff, 0x02, 0x09, 0x0f, 0x10, 0x0e, 0x08, 0x01,
156 			0xff, 0x03, 0x0a, 0x10, 0x10, 0x0d, 0x07, 0x00,
157 			0x00, 0x04, 0x0b, 0x10, 0x0f, 0x0c, 0x06, 0x00,
158 			0x00, 0x05, 0x0c, 0x10, 0x0e, 0x0c, 0x05, 0x00,
159 			0x00, 0x06, 0x0c, 0x11, 0x0e, 0x0b, 0x04, 0x00,
160 			0x00, 0x07, 0x0d, 0x11, 0x0f, 0x0a, 0x03, 0xff,
161 			0x01, 0x08, 0x0e, 0x11, 0x0e, 0x09, 0x02, 0xff
162 		}
163 	},
164 	{
165 		.min = 4096,
166 		.max = 5120,
167 		.coef = {
168 			0x00, 0x04, 0x09, 0x0c, 0x0e, 0x0c, 0x09, 0x04,
169 			0x01, 0x05, 0x09, 0x0c, 0x0d, 0x0c, 0x08, 0x04,
170 			0x01, 0x05, 0x0a, 0x0c, 0x0e, 0x0b, 0x08, 0x03,
171 			0x02, 0x06, 0x0a, 0x0d, 0x0c, 0x0b, 0x07, 0x03,
172 			0x02, 0x07, 0x0a, 0x0d, 0x0d, 0x0a, 0x07, 0x02,
173 			0x03, 0x07, 0x0b, 0x0d, 0x0c, 0x0a, 0x06, 0x02,
174 			0x03, 0x08, 0x0b, 0x0d, 0x0d, 0x0a, 0x05, 0x01,
175 			0x04, 0x08, 0x0c, 0x0d, 0x0c, 0x09, 0x05, 0x01
176 		}
177 	},
178 	{
179 		.min = 5120,
180 		.max = 65535,
181 		.coef = {
182 			0x03, 0x06, 0x09, 0x0b, 0x09, 0x0b, 0x09, 0x06,
183 			0x03, 0x06, 0x09, 0x0b, 0x0c, 0x0a, 0x08, 0x05,
184 			0x03, 0x06, 0x09, 0x0b, 0x0c, 0x0a, 0x08, 0x05,
185 			0x04, 0x07, 0x09, 0x0b, 0x0b, 0x0a, 0x08, 0x04,
186 			0x04, 0x07, 0x0a, 0x0b, 0x0b, 0x0a, 0x07, 0x04,
187 			0x04, 0x08, 0x0a, 0x0b, 0x0b, 0x09, 0x07, 0x04,
188 			0x05, 0x08, 0x0a, 0x0b, 0x0c, 0x09, 0x06, 0x03,
189 			0x05, 0x08, 0x0a, 0x0b, 0x0c, 0x09, 0x06, 0x03
190 		}
191 	}
192 };
193 
194 /**
195  * struct bdisp_filter_v_spec - Vertical filter specification
196  *
197  * @min:	min scale factor for this filter (6.10 fixed point)
198  * @max:	max scale factor for this filter (6.10 fixed point)
199  * coef:	filter coefficients
200  */
201 struct bdisp_filter_v_spec {
202 	const u16 min;
203 	const u16 max;
204 	const u8 coef[BDISP_VF_NB];
205 };
206 
207 static const struct bdisp_filter_v_spec bdisp_v_spec[] = {
208 	{
209 		.min = 0,
210 		.max = 1024,
211 		.coef = {
212 			0x00, 0x00, 0x40, 0x00, 0x00,
213 			0x00, 0x06, 0x3d, 0xfd, 0x00,
214 			0xfe, 0x0f, 0x38, 0xfb, 0x00,
215 			0xfd, 0x19, 0x2f, 0xfb, 0x00,
216 			0xfc, 0x24, 0x24, 0xfc, 0x00,
217 			0xfb, 0x2f, 0x19, 0xfd, 0x00,
218 			0xfb, 0x38, 0x0f, 0xfe, 0x00,
219 			0xfd, 0x3d, 0x06, 0x00, 0x00
220 		}
221 	},
222 	{
223 		.min = 1024,
224 		.max = 1331,
225 		.coef = {
226 			0xfc, 0x05, 0x3e, 0x05, 0xfc,
227 			0xf8, 0x0e, 0x3b, 0xff, 0x00,
228 			0xf5, 0x18, 0x38, 0xf9, 0x02,
229 			0xf4, 0x21, 0x31, 0xf5, 0x05,
230 			0xf4, 0x2a, 0x27, 0xf4, 0x07,
231 			0xf6, 0x30, 0x1e, 0xf4, 0x08,
232 			0xf9, 0x35, 0x15, 0xf6, 0x07,
233 			0xff, 0x37, 0x0b, 0xf9, 0x06
234 		}
235 	},
236 	{
237 		.min = 1331,
238 		.max = 1433,
239 		.coef = {
240 			0xf8, 0x0a, 0x3c, 0x0a, 0xf8,
241 			0xf6, 0x12, 0x3b, 0x02, 0xfb,
242 			0xf4, 0x1b, 0x35, 0xfd, 0xff,
243 			0xf4, 0x23, 0x30, 0xf8, 0x01,
244 			0xf6, 0x29, 0x27, 0xf6, 0x04,
245 			0xf9, 0x2e, 0x1e, 0xf5, 0x06,
246 			0xfd, 0x31, 0x16, 0xf6, 0x06,
247 			0x02, 0x32, 0x0d, 0xf8, 0x07
248 		}
249 	},
250 	{
251 		.min = 1433,
252 		.max = 1536,
253 		.coef = {
254 			0xf6, 0x0e, 0x38, 0x0e, 0xf6,
255 			0xf5, 0x15, 0x38, 0x06, 0xf8,
256 			0xf5, 0x1d, 0x33, 0x00, 0xfb,
257 			0xf6, 0x23, 0x2d, 0xfc, 0xfe,
258 			0xf9, 0x28, 0x26, 0xf9, 0x00,
259 			0xfc, 0x2c, 0x1e, 0xf7, 0x03,
260 			0x00, 0x2e, 0x18, 0xf6, 0x04,
261 			0x05, 0x2e, 0x11, 0xf7, 0x05
262 		}
263 	},
264 	{
265 		.min = 1536,
266 		.max = 2048,
267 		.coef = {
268 			0xfb, 0x13, 0x24, 0x13, 0xfb,
269 			0xfd, 0x17, 0x23, 0x0f, 0xfa,
270 			0xff, 0x1a, 0x23, 0x0b, 0xf9,
271 			0x01, 0x1d, 0x22, 0x07, 0xf9,
272 			0x04, 0x20, 0x1f, 0x04, 0xf9,
273 			0x07, 0x22, 0x1c, 0x01, 0xfa,
274 			0x0b, 0x24, 0x17, 0xff, 0xfb,
275 			0x0f, 0x24, 0x14, 0xfd, 0xfc
276 		}
277 	},
278 	{
279 		.min = 2048,
280 		.max = 3072,
281 		.coef = {
282 			0x05, 0x10, 0x16, 0x10, 0x05,
283 			0x06, 0x11, 0x16, 0x0f, 0x04,
284 			0x08, 0x13, 0x15, 0x0e, 0x02,
285 			0x09, 0x14, 0x16, 0x0c, 0x01,
286 			0x0b, 0x15, 0x15, 0x0b, 0x00,
287 			0x0d, 0x16, 0x13, 0x0a, 0x00,
288 			0x0f, 0x17, 0x13, 0x08, 0xff,
289 			0x11, 0x18, 0x12, 0x07, 0xfe
290 		}
291 	},
292 	{
293 		.min = 3072,
294 		.max = 4096,
295 		.coef = {
296 			0x09, 0x0f, 0x10, 0x0f, 0x09,
297 			0x09, 0x0f, 0x12, 0x0e, 0x08,
298 			0x0a, 0x10, 0x11, 0x0e, 0x07,
299 			0x0b, 0x11, 0x11, 0x0d, 0x06,
300 			0x0c, 0x11, 0x12, 0x0c, 0x05,
301 			0x0d, 0x12, 0x11, 0x0c, 0x04,
302 			0x0e, 0x12, 0x11, 0x0b, 0x04,
303 			0x0f, 0x13, 0x11, 0x0a, 0x03
304 		}
305 	},
306 	{
307 		.min = 4096,
308 		.max = 5120,
309 		.coef = {
310 			0x0a, 0x0e, 0x10, 0x0e, 0x0a,
311 			0x0b, 0x0e, 0x0f, 0x0e, 0x0a,
312 			0x0b, 0x0f, 0x10, 0x0d, 0x09,
313 			0x0c, 0x0f, 0x10, 0x0d, 0x08,
314 			0x0d, 0x0f, 0x0f, 0x0d, 0x08,
315 			0x0d, 0x10, 0x10, 0x0c, 0x07,
316 			0x0e, 0x10, 0x0f, 0x0c, 0x07,
317 			0x0f, 0x10, 0x10, 0x0b, 0x06
318 		}
319 	},
320 	{
321 		.min = 5120,
322 		.max = 65535,
323 		.coef = {
324 			0x0b, 0x0e, 0x0e, 0x0e, 0x0b,
325 			0x0b, 0x0e, 0x0f, 0x0d, 0x0b,
326 			0x0c, 0x0e, 0x0f, 0x0d, 0x0a,
327 			0x0c, 0x0e, 0x0f, 0x0d, 0x0a,
328 			0x0d, 0x0f, 0x0e, 0x0d, 0x09,
329 			0x0d, 0x0f, 0x0f, 0x0c, 0x09,
330 			0x0e, 0x0f, 0x0e, 0x0c, 0x09,
331 			0x0e, 0x0f, 0x0f, 0x0c, 0x08
332 		}
333 	}
334 };
335 
336 #define NB_H_FILTER ARRAY_SIZE(bdisp_h_spec)
337 #define NB_V_FILTER ARRAY_SIZE(bdisp_v_spec)
338 
339 /* RGB YUV 601 standard conversion */
340 static const u32 bdisp_rgb_to_yuv[] = {
341 		0x0e1e8bee, 0x08420419, 0xfb5ed471, 0x08004080,
342 };
343 
344 static const u32 bdisp_yuv_to_rgb[] = {
345 		0x3324a800, 0xe604ab9c, 0x0004a957, 0x32121eeb,
346 };
347