1 /*
2  * Copyright 2012-17 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Authors: AMD
23  *
24  */
25 
26 #include "reg_helper.h"
27 #include "fixed31_32.h"
28 #include "resource.h"
29 #include "dwb.h"
30 #include "dcn20_dwb.h"
31 
32 #define NUM_PHASES    16
33 #define HORZ_MAX_TAPS 12
34 #define VERT_MAX_TAPS 12
35 
36 #define REG(reg)\
37 	dwbc20->dwbc_regs->reg
38 
39 #define CTX \
40 	dwbc20->base.ctx
41 
42 #undef FN
43 #define FN(reg_name, field_name) \
44 	dwbc20->dwbc_shift->field_name, dwbc20->dwbc_mask->field_name
45 
46 #define TO_DCN20_DWBC(dwbc_base) \
47 	container_of(dwbc_base, struct dcn20_dwbc, base)
48 
49 
50 static const uint16_t filter_3tap_16p_upscale[27] = {
51 	2048, 2048, 0,
52 	1708, 2424, 16348,
53 	1372, 2796, 16308,
54 	1056, 3148, 16272,
55 	768, 3464, 16244,
56 	512, 3728, 16236,
57 	296, 3928, 16252,
58 	124, 4052, 16296,
59 	0, 4096, 0
60 };
61 
62 static const uint16_t filter_3tap_16p_117[27] = {
63 	2048, 2048, 0,
64 	1824, 2276, 16376,
65 	1600, 2496, 16380,
66 	1376, 2700, 16,
67 	1156, 2880, 52,
68 	948, 3032, 108,
69 	756, 3144, 192,
70 	580, 3212, 296,
71 	428, 3236, 428
72 };
73 
74 static const uint16_t filter_3tap_16p_150[27] = {
75 	2048, 2048, 0,
76 	1872, 2184, 36,
77 	1692, 2308, 88,
78 	1516, 2420, 156,
79 	1340, 2516, 236,
80 	1168, 2592, 328,
81 	1004, 2648, 440,
82 	844, 2684, 560,
83 	696, 2696, 696
84 };
85 
86 static const uint16_t filter_3tap_16p_183[27] = {
87 	2048, 2048, 0,
88 	1892, 2104, 92,
89 	1744, 2152, 196,
90 	1592, 2196, 300,
91 	1448, 2232, 412,
92 	1304, 2256, 528,
93 	1168, 2276, 648,
94 	1032, 2288, 772,
95 	900, 2292, 900
96 };
97 
98 static const uint16_t filter_4tap_16p_upscale[36] = {
99 	0, 4096, 0, 0,
100 	16240, 4056, 180, 16380,
101 	16136, 3952, 404, 16364,
102 	16072, 3780, 664, 16344,
103 	16040, 3556, 952, 16312,
104 	16036, 3284, 1268, 16272,
105 	16052, 2980, 1604, 16224,
106 	16084, 2648, 1952, 16176,
107 	16128, 2304, 2304, 16128
108 };
109 
110 static const uint16_t filter_4tap_16p_117[36] = {
111 	428, 3236, 428, 0,
112 	276, 3232, 604, 16364,
113 	148, 3184, 800, 16340,
114 	44, 3104, 1016, 16312,
115 	16344, 2984, 1244, 16284,
116 	16284, 2832, 1488, 16256,
117 	16244, 2648, 1732, 16236,
118 	16220, 2440, 1976, 16220,
119 	16212, 2216, 2216, 16212
120 };
121 
122 static const uint16_t filter_4tap_16p_150[36] = {
123 	696, 2700, 696, 0,
124 	560, 2700, 848, 16364,
125 	436, 2676, 1008, 16348,
126 	328, 2628, 1180, 16336,
127 	232, 2556, 1356, 16328,
128 	152, 2460, 1536, 16328,
129 	84, 2344, 1716, 16332,
130 	28, 2208, 1888, 16348,
131 	16376, 2052, 2052, 16376
132 };
133 
134 static const uint16_t filter_4tap_16p_183[36] = {
135 	940, 2208, 940, 0,
136 	832, 2200, 1052, 4,
137 	728, 2180, 1164, 16,
138 	628, 2148, 1280, 36,
139 	536, 2100, 1392, 60,
140 	448, 2044, 1504, 92,
141 	368, 1976, 1612, 132,
142 	296, 1900, 1716, 176,
143 	232, 1812, 1812, 232
144 };
145 
146 static const uint16_t filter_5tap_16p_upscale[45] = {
147 	15936, 2496, 2496, 15936, 0,
148 	15992, 2128, 2832, 15896, 12,
149 	16056, 1760, 3140, 15876, 24,
150 	16120, 1404, 3420, 15876, 36,
151 	16188, 1060, 3652, 15908, 44,
152 	16248, 744, 3844, 15972, 44,
153 	16304, 460, 3980, 16072, 40,
154 	16348, 212, 4064, 16208, 24,
155 	0, 0, 4096, 0, 0,
156 };
157 
158 static const uint16_t filter_5tap_16p_117[45] = {
159 	16056, 2372, 2372, 16056, 0,
160 	16052, 2124, 2600, 16076, 0,
161 	16060, 1868, 2808, 16120, 0,
162 	16080, 1612, 2992, 16180, 16376,
163 	16112, 1356, 3144, 16268, 16364,
164 	16144, 1108, 3268, 16376, 16344,
165 	16184, 872, 3356, 124, 16320,
166 	16220, 656, 3412, 276, 16292,
167 	16256, 456, 3428, 456, 16256,
168 };
169 
170 static const uint16_t filter_5tap_16p_150[45] = {
171 	16368, 2064, 2064, 16368, 0,
172 	16316, 1924, 2204, 44, 16372,
173 	16280, 1772, 2328, 116, 16356,
174 	16256, 1616, 2440, 204, 16340,
175 	16240, 1456, 2536, 304, 16320,
176 	16232, 1296, 2612, 416, 16300,
177 	16232, 1132, 2664, 544, 16284,
178 	16240, 976, 2700, 680, 16264,
179 	16248, 824, 2708, 824, 16248,
180 };
181 
182 static const uint16_t filter_5tap_16p_183[45] = {
183 	228, 1816, 1816, 228, 0,
184 	168, 1728, 1904, 300, 16372,
185 	116, 1632, 1988, 376, 16360,
186 	72, 1528, 2060, 460, 16348,
187 	36, 1424, 2120, 552, 16340,
188 	4, 1312, 2168, 652, 16336,
189 	16368, 1200, 2204, 752, 16332,
190 	16352, 1084, 2224, 860, 16332,
191 	16340, 972, 2232, 972, 16340,
192 };
193 
194 static const uint16_t filter_6tap_16p_upscale[54] = {
195 	0, 0, 4092, 0, 0, 0,
196 	44, 16188, 4064, 228, 16324, 0,
197 	80, 16036, 3980, 492, 16256, 4,
198 	108, 15916, 3844, 788, 16184, 16,
199 	120, 15836, 3656, 1108, 16104, 28,
200 	128, 15792, 3420, 1448, 16024, 44,
201 	124, 15776, 3144, 1800, 15948, 64,
202 	112, 15792, 2836, 2152, 15880, 80,
203 	100, 15828, 2504, 2504, 15828, 100,
204 };
205 
206 static const uint16_t filter_6tap_16p_117[54] = {
207 	16168, 476, 3568, 476, 16168, 0,
208 	16216, 280, 3540, 692, 16116, 8,
209 	16264, 104, 3472, 924, 16068, 16,
210 	16304, 16340, 3372, 1168, 16024, 28,
211 	16344, 16212, 3236, 1424, 15988, 36,
212 	16372, 16112, 3072, 1680, 15956, 44,
213 	12, 16036, 2880, 1936, 15940, 48,
214 	28, 15984, 2668, 2192, 15936, 48,
215 	40, 15952, 2436, 2436, 15952, 40,
216 };
217 
218 static const uint16_t filter_6tap_16p_150[54] = {
219 	16148, 920, 2724, 920, 16148, 0,
220 	16156, 768, 2712, 1072, 16144, 0,
221 	16172, 628, 2684, 1232, 16148, 16380,
222 	16192, 492, 2632, 1388, 16160, 16372,
223 	16212, 368, 2564, 1548, 16180, 16364,
224 	16232, 256, 2480, 1704, 16212, 16352,
225 	16256, 156, 2380, 1856, 16256, 16336,
226 	16276, 64, 2268, 2004, 16308, 16320,
227 	16300, 16372, 2140, 2140, 16372, 16300,
228 };
229 
230 static const uint16_t filter_6tap_16p_183[54] = {
231 	16296, 1032, 2196, 1032, 16296, 0,
232 	16284, 924, 2196, 1144, 16320, 16376,
233 	16272, 820, 2180, 1256, 16348, 16364,
234 	16268, 716, 2156, 1364, 16380, 16352,
235 	16264, 620, 2116, 1472, 36, 16340,
236 	16268, 524, 2068, 1576, 88, 16328,
237 	16272, 436, 2008, 1680, 144, 16316,
238 	16280, 352, 1940, 1772, 204, 16304,
239 	16292, 276, 1860, 1860, 276, 16292,
240 };
241 
242 static const uint16_t filter_7tap_16p_upscale[63] = {
243 	176, 15760, 2488, 2488, 15760, 176, 0,
244 	160, 15812, 2152, 2816, 15728, 192, 16376,
245 	136, 15884, 1812, 3124, 15720, 196, 16368,
246 	108, 15964, 1468, 3400, 15740, 196, 16364,
247 	84, 16048, 1132, 3640, 15792, 180, 16360,
248 	56, 16140, 812, 3832, 15884, 152, 16360,
249 	32, 16228, 512, 3976, 16012, 116, 16364,
250 	12, 16308, 240, 4064, 16180, 60, 16372,
251 	0, 0, 0, 4096, 0, 0, 0,
252 };
253 
254 static const uint16_t filter_7tap_16p_117[63] = {
255 	92, 15868, 2464, 2464, 15868, 92, 0,
256 	108, 15852, 2216, 2700, 15904, 72, 0,
257 	112, 15856, 1960, 2916, 15964, 44, 0,
258 	116, 15876, 1696, 3108, 16048, 8, 8,
259 	112, 15908, 1428, 3268, 16156, 16348, 12,
260 	104, 15952, 1168, 3400, 16288, 16300, 24,
261 	92, 16004, 916, 3496, 64, 16244, 36,
262 	80, 16064, 676, 3556, 248, 16184, 48,
263 	64, 16124, 452, 3576, 452, 16124, 64,
264 };
265 
266 static const uint16_t filter_7tap_16p_150[63] = {
267 	16224, 16380, 2208, 2208, 16380, 16224, 0,
268 	16252, 16304, 2072, 2324, 84, 16196, 4,
269 	16276, 16240, 1924, 2432, 184, 16172, 8,
270 	16300, 16184, 1772, 2524, 296, 16144, 12,
271 	16324, 16144, 1616, 2600, 416, 16124, 12,
272 	16344, 16112, 1456, 2660, 548, 16104, 12,
273 	16360, 16092, 1296, 2704, 688, 16088, 12,
274 	16372, 16080, 1140, 2732, 832, 16080, 8,
275 	0, 16076, 984, 2740, 984, 16076, 0,
276 };
277 
278 static const uint16_t filter_7tap_16p_183[63] = {
279 	16216, 324, 1884, 1884, 324, 16216, 0,
280 	16228, 248, 1804, 1960, 408, 16212, 16380,
281 	16240, 176, 1716, 2028, 496, 16208, 16376,
282 	16252, 112, 1624, 2084, 588, 16208, 16372,
283 	16264, 56, 1524, 2132, 684, 16212, 16364,
284 	16280, 4, 1424, 2168, 788, 16220, 16356,
285 	16292, 16344, 1320, 2196, 892, 16232, 16344,
286 	16308, 16308, 1212, 2212, 996, 16252, 16332,
287 	16320, 16276, 1104, 2216, 1104, 16276, 16320,
288 };
289 
290 static const uint16_t filter_8tap_16p_upscale[72] = {
291 	0, 0, 0, 4096, 0, 0, 0, 0,
292 	16360, 76, 16172, 4064, 244, 16296, 24, 16380,
293 	16340, 136, 15996, 3980, 524, 16204, 56, 16380,
294 	16328, 188, 15860, 3844, 828, 16104, 92, 16372,
295 	16320, 224, 15760, 3656, 1156, 16008, 128, 16368,
296 	16320, 248, 15696, 3428, 1496, 15912, 160, 16360,
297 	16320, 256, 15668, 3156, 1844, 15828, 192, 16348,
298 	16324, 256, 15672, 2856, 2192, 15756, 220, 16340,
299 	16332, 244, 15704, 2532, 2532, 15704, 244, 16332,
300 };
301 
302 static const uint16_t filter_8tap_16p_117[72] = {
303 	116, 16100, 428, 3564, 428, 16100, 116, 0,
304 	96, 16168, 220, 3548, 656, 16032, 136, 16376,
305 	76, 16236, 32, 3496, 904, 15968, 152, 16372,
306 	56, 16300, 16252, 3408, 1164, 15908, 164, 16368,
307 	36, 16360, 16116, 3284, 1428, 15856, 172, 16364,
308 	20, 28, 16000, 3124, 1700, 15820, 176, 16364,
309 	4, 76, 15912, 2940, 1972, 15800, 172, 16364,
310 	16380, 112, 15848, 2724, 2236, 15792, 160, 16364,
311 	16372, 140, 15812, 2488, 2488, 15812, 140, 16372,
312 };
313 
314 static const uint16_t filter_8tap_16p_150[72] = {
315 	16380, 16020, 1032, 2756, 1032, 16020, 16380, 0,
316 	12, 16020, 876, 2744, 1184, 16032, 16364, 4,
317 	24, 16028, 728, 2716, 1344, 16052, 16340, 8,
318 	36, 16040, 584, 2668, 1500, 16080, 16316, 16,
319 	40, 16060, 448, 2608, 1652, 16120, 16288, 20,
320 	44, 16080, 320, 2528, 1804, 16168, 16260, 28,
321 	48, 16108, 204, 2436, 1948, 16232, 16228, 32,
322 	44, 16136, 100, 2328, 2084, 16304, 16200, 40,
323 	44, 16168, 4, 2212, 2212, 4, 16168, 44,
324 };
325 
326 static const uint16_t filter_8tap_16p_183[72] = {
327 	16264, 16264, 1164, 2244, 1164, 16264, 16264, 0,
328 	16280, 16232, 1056, 2236, 1268, 16300, 16248, 0,
329 	16296, 16204, 948, 2220, 1372, 16348, 16232, 0,
330 	16312, 16184, 844, 2192, 1472, 12, 16216, 4,
331 	16328, 16172, 740, 2156, 1572, 72, 16200, 0,
332 	16340, 16160, 640, 2108, 1668, 136, 16188, 0,
333 	16352, 16156, 544, 2052, 1756, 204, 16176, 16380,
334 	16360, 16156, 452, 1988, 1840, 280, 16164, 16376,
335 	16368, 16160, 364, 1920, 1920, 364, 16160, 16368,
336 };
337 
338 static const uint16_t filter_9tap_16p_upscale[81] = {
339 	16284, 296, 15660, 2572, 2572, 15660, 296, 16284, 0,
340 	16296, 272, 15712, 2228, 2896, 15632, 304, 16276, 4,
341 	16308, 240, 15788, 1876, 3192, 15632, 304, 16276, 4,
342 	16320, 204, 15876, 1520, 3452, 15664, 288, 16280, 8,
343 	16336, 164, 15976, 1176, 3676, 15732, 260, 16288, 12,
344 	16348, 120, 16080, 844, 3856, 15840, 216, 16300, 12,
345 	16364, 76, 16188, 532, 3988, 15984, 156, 16324, 8,
346 	16376, 36, 16288, 252, 4068, 16164, 84, 16352, 4,
347 	0, 0, 0, 0, 4096, 0, 0, 0, 0,
348 };
349 
350 static const uint16_t filter_9tap_16p_117[81] = {
351 	16356, 172, 15776, 2504, 2504, 15776, 172, 16356, 0,
352 	16344, 200, 15756, 2252, 2740, 15816, 136, 16372, 16380,
353 	16336, 216, 15756, 1988, 2956, 15884, 92, 8, 16380,
354 	16332, 224, 15780, 1720, 3144, 15976, 40, 28, 16376,
355 	16328, 224, 15816, 1448, 3304, 16096, 16364, 52, 16372,
356 	16328, 216, 15868, 1180, 3432, 16240, 16296, 80, 16364,
357 	16332, 200, 15928, 916, 3524, 24, 16224, 108, 16356,
358 	16336, 184, 15996, 668, 3580, 220, 16148, 132, 16352,
359 	16344, 160, 16072, 436, 3600, 436, 16072, 160, 16344,
360 };
361 
362 static const uint16_t filter_9tap_16p_150[81] = {
363 	84, 16128, 0, 2216, 2216, 0, 16128, 84, 0,
364 	80, 16160, 16296, 2088, 2332, 100, 16092, 84, 0,
365 	76, 16196, 16220, 1956, 2432, 208, 16064, 80, 0,
366 	72, 16232, 16152, 1812, 2524, 328, 16036, 76, 4,
367 	64, 16264, 16096, 1664, 2600, 460, 16012, 64, 8,
368 	56, 16300, 16052, 1508, 2656, 596, 15996, 52, 12,
369 	48, 16328, 16020, 1356, 2700, 740, 15984, 36, 20,
370 	40, 16356, 15996, 1196, 2728, 888, 15980, 20, 24,
371 	32, 0, 15984, 1044, 2736, 1044, 15984, 0, 32,
372 };
373 
374 static const uint16_t filter_9tap_16p_183[81] = {
375 	16356, 16112, 388, 1952, 1952, 388, 16112, 16356, 0,
376 	16368, 16116, 304, 1876, 2020, 480, 16112, 16344, 4,
377 	16376, 16124, 224, 1792, 2080, 576, 16116, 16328, 8,
378 	0, 16136, 148, 1700, 2132, 672, 16124, 16312, 8,
379 	8, 16148, 80, 1604, 2176, 772, 16140, 16296, 12,
380 	12, 16164, 16, 1504, 2208, 876, 16156, 16276, 16,
381 	16, 16180, 16344, 1404, 2232, 980, 16184, 16256, 20,
382 	20, 16200, 16296, 1300, 2244, 1088, 16212, 16240, 20,
383 	20, 16220, 16252, 1196, 2252, 1196, 16252, 16220, 20,
384 };
385 
386 static const uint16_t filter_10tap_16p_upscale[90] = {
387 	0, 0, 0, 0, 4096, 0, 0, 0, 0, 0,
388 	12, 16344, 88, 16160, 4068, 252, 16280, 44, 16368, 0,
389 	24, 16308, 168, 15976, 3988, 540, 16176, 92, 16348, 0,
390 	32, 16280, 236, 15828, 3852, 852, 16064, 140, 16328, 4,
391 	36, 16260, 284, 15720, 3672, 1184, 15956, 188, 16308, 8,
392 	36, 16244, 320, 15648, 3448, 1528, 15852, 236, 16288, 12,
393 	36, 16240, 336, 15612, 3184, 1880, 15764, 276, 16272, 20,
394 	32, 16240, 340, 15608, 2888, 2228, 15688, 308, 16256, 24,
395 	28, 16244, 332, 15636, 2568, 2568, 15636, 332, 16244, 28,
396 };
397 
398 static const uint16_t filter_10tap_16p_117[90] = {
399 	16308, 196, 16048, 440, 3636, 440, 16048, 196, 16308, 0,
400 	16316, 164, 16132, 220, 3612, 676, 15972, 220, 16300, 0,
401 	16324, 132, 16212, 20, 3552, 932, 15900, 240, 16296, 4,
402 	16336, 100, 16292, 16232, 3456, 1192, 15836, 256, 16296, 4,
403 	16348, 68, 16364, 16084, 3324, 1464, 15784, 264, 16296, 8,
404 	16356, 36, 48, 15960, 3164, 1736, 15748, 260, 16304, 4,
405 	16364, 8, 108, 15864, 2972, 2008, 15728, 252, 16312, 4,
406 	16372, 16368, 160, 15792, 2756, 2268, 15724, 228, 16328, 0,
407 	16380, 16344, 200, 15748, 2520, 2520, 15748, 200, 16344, 16380,
408 };
409 
410 static const uint16_t filter_10tap_16p_150[90] = {
411 	64, 0, 15956, 1048, 2716, 1048, 15956, 0, 64, 0,
412 	52, 24, 15952, 896, 2708, 1204, 15972, 16356, 72, 16380,
413 	44, 48, 15952, 748, 2684, 1360, 16000, 16320, 84, 16380,
414 	32, 68, 15964, 604, 2644, 1516, 16032, 16288, 92, 16376,
415 	24, 88, 15980, 464, 2588, 1668, 16080, 16248, 100, 16376,
416 	16, 100, 16004, 332, 2516, 1816, 16140, 16212, 108, 16376,
417 	8, 108, 16032, 212, 2428, 1956, 16208, 16172, 112, 16376,
418 	4, 116, 16060, 100, 2328, 2092, 16288, 16132, 116, 16380,
419 	0, 116, 16096, 16380, 2216, 2216, 16380, 16096, 116, 0,
420 };
421 
422 static const uint16_t filter_10tap_16p_183[90] = {
423 	40, 16180, 16240, 1216, 2256, 1216, 16240, 16180, 40, 0,
424 	44, 16204, 16200, 1112, 2252, 1320, 16288, 16160, 36, 0,
425 	44, 16224, 16168, 1004, 2236, 1424, 16344, 16144, 28, 4,
426 	44, 16248, 16136, 900, 2208, 1524, 16, 16124, 24, 8,
427 	44, 16268, 16116, 796, 2176, 1620, 84, 16108, 12, 12,
428 	40, 16288, 16100, 692, 2132, 1712, 156, 16096, 4, 16,
429 	36, 16308, 16088, 592, 2080, 1796, 232, 16088, 16376, 20,
430 	32, 16328, 16080, 496, 2020, 1876, 316, 16080, 16360, 24,
431 	28, 16344, 16080, 404, 1952, 1952, 404, 16080, 16344, 28,
432 };
433 
434 static const uint16_t filter_11tap_16p_upscale[99] = {
435 	60, 16216, 356, 15620, 2556, 2556, 15620, 356, 16216, 60, 0,
436 	52, 16224, 336, 15672, 2224, 2876, 15592, 368, 16208, 64, 16380,
437 	44, 16244, 304, 15744, 1876, 3176, 15596, 364, 16212, 64, 16376,
438 	36, 16264, 260, 15836, 1532, 3440, 15636, 340, 16220, 60, 16376,
439 	28, 16288, 212, 15940, 1188, 3668, 15708, 304, 16236, 56, 16376,
440 	20, 16312, 160, 16052, 856, 3848, 15820, 248, 16264, 48, 16376,
441 	12, 16336, 104, 16164, 544, 3984, 15968, 180, 16296, 36, 16376,
442 	4, 16360, 48, 16276, 256, 4068, 16160, 96, 16336, 16, 16380,
443 	0, 0, 0, 0, 0, 4096, 0, 0, 0, 0, 0,
444 };
445 
446 static const uint16_t filter_11tap_16p_117[99] = {
447 	16380, 16332, 220, 15728, 2536, 2536, 15728, 220, 16332, 16380, 0,
448 	4, 16308, 256, 15704, 2280, 2768, 15772, 176, 16360, 16368, 0,
449 	12, 16292, 280, 15704, 2016, 2984, 15848, 120, 8, 16356, 0,
450 	20, 16276, 292, 15724, 1744, 3172, 15948, 56, 40, 16340, 4,
451 	24, 16268, 292, 15760, 1468, 3328, 16072, 16368, 80, 16324, 8,
452 	24, 16264, 288, 15816, 1196, 3456, 16224, 16288, 116, 16312, 12,
453 	24, 16264, 272, 15880, 932, 3548, 16, 16208, 152, 16296, 16,
454 	24, 16268, 248, 15956, 676, 3604, 216, 16120, 188, 16284, 20,
455 	24, 16276, 220, 16036, 436, 3624, 436, 16036, 220, 16276, 24,
456 };
457 
458 static const uint16_t filter_11tap_16p_150[99] = {
459 	0, 144, 16072, 0, 2212, 2212, 0, 16072, 144, 0, 0,
460 	16376, 144, 16112, 16288, 2092, 2324, 104, 16036, 140, 8, 16380,
461 	16368, 144, 16152, 16204, 1960, 2424, 216, 16004, 132, 16, 16376,
462 	16364, 140, 16192, 16132, 1820, 2512, 340, 15976, 116, 28, 16376,
463 	16364, 132, 16232, 16072, 1676, 2584, 476, 15952, 100, 40, 16372,
464 	16360, 124, 16272, 16020, 1528, 2644, 612, 15936, 80, 52, 16368,
465 	16360, 116, 16312, 15980, 1372, 2684, 760, 15928, 56, 64, 16364,
466 	16360, 104, 16348, 15952, 1216, 2712, 908, 15928, 28, 76, 16364,
467 	16360, 92, 0, 15936, 1064, 2720, 1064, 15936, 0, 92, 16360,
468 };
469 
470 static const uint16_t filter_11tap_16p_183[99] = {
471 	60, 16336, 16052, 412, 1948, 1948, 412, 16052, 16336, 60, 0,
472 	56, 16356, 16052, 324, 1876, 2016, 504, 16056, 16316, 64, 0,
473 	48, 16372, 16060, 240, 1796, 2072, 604, 16064, 16292, 64, 0,
474 	44, 4, 16068, 160, 1712, 2124, 700, 16080, 16272, 68, 0,
475 	40, 20, 16080, 84, 1620, 2164, 804, 16096, 16248, 68, 4,
476 	32, 32, 16096, 16, 1524, 2200, 908, 16124, 16224, 68, 4,
477 	28, 40, 16112, 16340, 1428, 2220, 1012, 16152, 16200, 64, 8,
478 	24, 52, 16132, 16284, 1328, 2236, 1120, 16192, 16176, 64, 12,
479 	16, 56, 16156, 16236, 1224, 2240, 1224, 16236, 16156, 56, 16,
480 };
481 
482 static const uint16_t filter_12tap_16p_upscale[108] = {
483 	0, 0, 0, 0, 0, 4096, 0, 0, 0, 0, 0, 0,
484 	16376, 24, 16332, 100, 16156, 4068, 260, 16272, 56, 16356, 8, 0,
485 	16368, 44, 16284, 188, 15964, 3988, 548, 16156, 112, 16328, 20, 16380,
486 	16360, 64, 16248, 260, 15812, 3856, 864, 16040, 172, 16296, 32, 16380,
487 	16360, 76, 16216, 320, 15696, 3672, 1196, 15928, 228, 16268, 44, 16376,
488 	16356, 84, 16196, 360, 15620, 3448, 1540, 15820, 280, 16240, 56, 16372,
489 	16356, 88, 16184, 384, 15580, 3188, 1888, 15728, 324, 16216, 68, 16368,
490 	16360, 88, 16180, 392, 15576, 2892, 2236, 15652, 360, 16200, 80, 16364,
491 	16360, 84, 16188, 384, 15600, 2576, 2576, 15600, 384, 16188, 84, 16360,
492 };
493 
494 static const uint16_t filter_12tap_16p_117[108] = {
495 	48, 16248, 240, 16028, 436, 3612, 436, 16028, 240, 16248, 48, 0,
496 	44, 16260, 208, 16116, 212, 3596, 676, 15944, 272, 16240, 48, 16380,
497 	40, 16276, 168, 16204, 12, 3540, 932, 15868, 296, 16240, 48, 16380,
498 	36, 16292, 128, 16288, 16220, 3452, 1196, 15800, 312, 16240, 44, 16380,
499 	28, 16308, 84, 16372, 16064, 3324, 1472, 15748, 316, 16244, 40, 16380,
500 	24, 16328, 44, 64, 15936, 3168, 1744, 15708, 312, 16256, 32, 16380,
501 	16, 16344, 8, 132, 15836, 2980, 2016, 15688, 300, 16272, 20, 0,
502 	12, 16364, 16356, 188, 15760, 2768, 2280, 15688, 272, 16296, 8, 4,
503 	8, 16380, 16324, 236, 15712, 2532, 2532, 15712, 236, 16324, 16380, 8,
504 };
505 
506 static const uint16_t filter_12tap_16p_150[108] = {
507 	16340, 116, 0, 15916, 1076, 2724, 1076, 15916, 0, 116, 16340, 0,
508 	16340, 100, 32, 15908, 920, 2716, 1232, 15936, 16344, 128, 16340, 0,
509 	16344, 84, 64, 15908, 772, 2692, 1388, 15968, 16304, 140, 16344, 16380,
510 	16344, 68, 92, 15912, 624, 2652, 1540, 16008, 16264, 152, 16344, 16380,
511 	16348, 52, 112, 15928, 484, 2592, 1688, 16060, 16220, 160, 16348, 16380,
512 	16352, 40, 132, 15952, 348, 2520, 1836, 16124, 16176, 168, 16356, 16376,
513 	16356, 24, 148, 15980, 224, 2436, 1976, 16200, 16132, 172, 16364, 16372,
514 	16360, 12, 160, 16012, 108, 2336, 2104, 16288, 16088, 172, 16372, 16368,
515 	16364, 0, 168, 16048, 0, 2228, 2228, 0, 16048, 168, 0, 16364,
516 };
517 
518 static const uint16_t filter_12tap_16p_183[108] = {
519 	36, 72, 16132, 16228, 1224, 2224, 1224, 16228, 16132, 72, 36, 0,
520 	28, 80, 16156, 16184, 1120, 2224, 1328, 16280, 16112, 64, 40, 16380,
521 	24, 84, 16180, 16144, 1016, 2208, 1428, 16340, 16092, 52, 48, 16380,
522 	16, 88, 16208, 16112, 912, 2188, 1524, 16, 16072, 36, 56, 16380,
523 	12, 92, 16232, 16084, 812, 2156, 1620, 88, 16056, 24, 64, 16380,
524 	8, 92, 16256, 16064, 708, 2116, 1708, 164, 16044, 4, 68, 16380,
525 	4, 88, 16280, 16048, 608, 2068, 1792, 244, 16036, 16372, 76, 16380,
526 	0, 88, 16308, 16036, 512, 2008, 1872, 328, 16032, 16352, 80, 16380,
527 	0, 84, 16328, 16032, 416, 1944, 1944, 416, 16032, 16328, 84, 0,
528 };
529 
wbscl_get_filter_3tap_16p(struct fixed31_32 ratio)530 static const uint16_t *wbscl_get_filter_3tap_16p(struct fixed31_32 ratio)
531 {
532 	if (ratio.value < dc_fixpt_one.value)
533 		return filter_3tap_16p_upscale;
534 	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
535 		return filter_3tap_16p_117;
536 	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
537 		return filter_3tap_16p_150;
538 	else
539 		return filter_3tap_16p_183;
540 }
541 
wbscl_get_filter_4tap_16p(struct fixed31_32 ratio)542 static const uint16_t *wbscl_get_filter_4tap_16p(struct fixed31_32 ratio)
543 {
544 	if (ratio.value < dc_fixpt_one.value)
545 		return filter_4tap_16p_upscale;
546 	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
547 		return filter_4tap_16p_117;
548 	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
549 		return filter_4tap_16p_150;
550 	else
551 		return filter_4tap_16p_183;
552 }
553 
wbscl_get_filter_5tap_16p(struct fixed31_32 ratio)554 static const uint16_t *wbscl_get_filter_5tap_16p(struct fixed31_32 ratio)
555 {
556 	if (ratio.value < dc_fixpt_one.value)
557 		return filter_5tap_16p_upscale;
558 	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
559 		return filter_5tap_16p_117;
560 	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
561 		return filter_5tap_16p_150;
562 	else
563 		return filter_5tap_16p_183;
564 }
565 
wbscl_get_filter_6tap_16p(struct fixed31_32 ratio)566 static const uint16_t *wbscl_get_filter_6tap_16p(struct fixed31_32 ratio)
567 {
568 	if (ratio.value < dc_fixpt_one.value)
569 		return filter_6tap_16p_upscale;
570 	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
571 		return filter_6tap_16p_117;
572 	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
573 		return filter_6tap_16p_150;
574 	else
575 		return filter_6tap_16p_183;
576 }
577 
wbscl_get_filter_7tap_16p(struct fixed31_32 ratio)578 static const uint16_t *wbscl_get_filter_7tap_16p(struct fixed31_32 ratio)
579 {
580 	if (ratio.value < dc_fixpt_one.value)
581 		return filter_7tap_16p_upscale;
582 	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
583 		return filter_7tap_16p_117;
584 	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
585 		return filter_7tap_16p_150;
586 	else
587 		return filter_7tap_16p_183;
588 }
589 
wbscl_get_filter_8tap_16p(struct fixed31_32 ratio)590 static const uint16_t *wbscl_get_filter_8tap_16p(struct fixed31_32 ratio)
591 {
592 	if (ratio.value < dc_fixpt_one.value)
593 		return filter_8tap_16p_upscale;
594 	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
595 		return filter_8tap_16p_117;
596 	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
597 		return filter_8tap_16p_150;
598 	else
599 		return filter_8tap_16p_183;
600 }
601 
wbscl_get_filter_9tap_16p(struct fixed31_32 ratio)602 static const uint16_t *wbscl_get_filter_9tap_16p(struct fixed31_32 ratio)
603 {
604 	if (ratio.value < dc_fixpt_one.value)
605 		return filter_9tap_16p_upscale;
606 	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
607 		return filter_9tap_16p_117;
608 	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
609 		return filter_9tap_16p_150;
610 	else
611 		return filter_9tap_16p_183;
612 }
wbscl_get_filter_10tap_16p(struct fixed31_32 ratio)613 static const uint16_t *wbscl_get_filter_10tap_16p(struct fixed31_32 ratio)
614 {
615 	if (ratio.value < dc_fixpt_one.value)
616 		return filter_10tap_16p_upscale;
617 	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
618 		return filter_10tap_16p_117;
619 	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
620 		return filter_10tap_16p_150;
621 	else
622 		return filter_10tap_16p_183;
623 }
624 
wbscl_get_filter_11tap_16p(struct fixed31_32 ratio)625 static const uint16_t *wbscl_get_filter_11tap_16p(struct fixed31_32 ratio)
626 {
627 	if (ratio.value < dc_fixpt_one.value)
628 		return filter_11tap_16p_upscale;
629 	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
630 		return filter_11tap_16p_117;
631 	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
632 		return filter_11tap_16p_150;
633 	else
634 		return filter_11tap_16p_183;
635 }
636 
wbscl_get_filter_12tap_16p(struct fixed31_32 ratio)637 static const uint16_t *wbscl_get_filter_12tap_16p(struct fixed31_32 ratio)
638 {
639 	if (ratio.value < dc_fixpt_one.value)
640 		return filter_12tap_16p_upscale;
641 	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
642 		return filter_12tap_16p_117;
643 	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
644 		return filter_12tap_16p_150;
645 	else
646 		return filter_12tap_16p_183;
647 }
648 
wbscl_get_filter_coeffs_16p(int taps,struct fixed31_32 ratio)649 static const uint16_t *wbscl_get_filter_coeffs_16p(int taps, struct fixed31_32 ratio)
650 {
651 	if (taps == 12)
652 		return wbscl_get_filter_12tap_16p(ratio);
653 	else if (taps == 11)
654 		return wbscl_get_filter_11tap_16p(ratio);
655 	else if (taps == 10)
656 		return wbscl_get_filter_10tap_16p(ratio);
657 	else if (taps == 9)
658 		return wbscl_get_filter_9tap_16p(ratio);
659 	else if (taps == 8)
660 		return wbscl_get_filter_8tap_16p(ratio);
661 	else if (taps == 7)
662 		return wbscl_get_filter_7tap_16p(ratio);
663 	else if (taps == 6)
664 		return wbscl_get_filter_6tap_16p(ratio);
665 	else if (taps == 5)
666 		return wbscl_get_filter_5tap_16p(ratio);
667 	else if (taps == 4)
668 		return wbscl_get_filter_4tap_16p(ratio);
669 	else if (taps == 3)
670 		return wbscl_get_filter_3tap_16p(ratio);
671 	else if (taps == 2)
672 		return get_filter_2tap_16p();
673 	else if (taps == 1)
674 		return NULL;
675 	else {
676 		/* should never happen, bug */
677 		BREAK_TO_DEBUGGER();
678 		return NULL;
679 	}
680 }
681 
wbscl_set_scaler_filter(struct dcn20_dwbc * dwbc20,uint32_t taps,enum wbscl_coef_filter_type_sel filter_type,const uint16_t * filter)682 static void wbscl_set_scaler_filter(
683 	struct dcn20_dwbc *dwbc20,
684 	uint32_t taps,
685 	enum wbscl_coef_filter_type_sel filter_type,
686 	const uint16_t *filter)
687 {
688 	const int tap_pairs = (taps + 1) / 2;
689 	int phase;
690 	int pair;
691 	uint16_t odd_coef, even_coef;
692 
693 	if (!filter)
694 		return;
695 
696 	for (phase = 0; phase < (NUM_PHASES / 2 + 1); phase++) {
697 		for (pair = 0; pair < tap_pairs; pair++) {
698 			even_coef = filter[phase * taps + 2 * pair];
699 			if ((pair * 2 + 1) < taps)
700 				odd_coef = filter[phase * taps + 2 * pair + 1];
701 			else
702 				odd_coef = 0;
703 
704 			REG_SET_3(WBSCL_COEF_RAM_SELECT, 0,
705 				WBSCL_COEF_RAM_TAP_PAIR_IDX, pair,
706 				WBSCL_COEF_RAM_PHASE, phase,
707 				WBSCL_COEF_RAM_FILTER_TYPE, filter_type);
708 
709 			REG_SET_4(WBSCL_COEF_RAM_TAP_DATA, 0,
710 				/* Even tap coefficient (bits 1:0 fixed to 0) */
711 				WBSCL_COEF_RAM_EVEN_TAP_COEF, even_coef,
712 				/* Write/read control for even coefficient */
713 				WBSCL_COEF_RAM_EVEN_TAP_COEF_EN, 1,
714 				/* Odd tap coefficient (bits 1:0 fixed to 0) */
715 				WBSCL_COEF_RAM_ODD_TAP_COEF, odd_coef,
716 				/* Write/read control for odd coefficient */
717 				WBSCL_COEF_RAM_ODD_TAP_COEF_EN, 1);
718 		}
719 	}
720 }
721 
dwb_program_horz_scalar(struct dcn20_dwbc * dwbc20,uint32_t src_width,uint32_t dest_width,struct scaling_taps num_taps)722 bool dwb_program_horz_scalar(struct dcn20_dwbc *dwbc20,
723 		uint32_t src_width,
724 		uint32_t dest_width,
725 		struct scaling_taps num_taps)
726 {
727 	uint32_t h_ratio_luma = 1;
728 	uint32_t h_taps_luma = num_taps.h_taps;
729 	uint32_t h_taps_chroma = num_taps.h_taps_c;
730 	int32_t h_init_phase_luma = 0;
731 	int32_t h_init_phase_chroma = 0;
732 	uint32_t h_init_phase_luma_int = 0;
733 	uint32_t h_init_phase_luma_frac = 0;
734 	uint32_t h_init_phase_chroma_int = 0;
735 	uint32_t h_init_phase_chroma_frac = 0;
736 	const uint16_t *filter_h = NULL;
737 	const uint16_t *filter_h_c = NULL;
738 
739 
740 	struct fixed31_32 tmp_h_init_phase_luma = dc_fixpt_from_int(0);
741 	struct fixed31_32 tmp_h_init_phase_chroma = dc_fixpt_from_int(0);
742 
743 
744 	/*Calculate ratio*/
745 	struct fixed31_32 tmp_h_ratio_luma = dc_fixpt_from_fraction(
746 		src_width, dest_width);
747 
748 	if (dc_fixpt_floor(tmp_h_ratio_luma) == 8)
749 		h_ratio_luma = -1;
750 	else
751 		h_ratio_luma = dc_fixpt_u3d19(tmp_h_ratio_luma) << 5;
752 
753 	/*Program ratio*/
754 	REG_UPDATE(WBSCL_HORZ_FILTER_SCALE_RATIO, WBSCL_H_SCALE_RATIO, h_ratio_luma);
755 
756 	/* Program taps*/
757 	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_H_NUM_OF_TAPS_Y_RGB, h_taps_luma - 1);
758 	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_H_NUM_OF_TAPS_CBCR, h_taps_chroma - 1);
759 
760 	/* Calculate phase*/
761 	tmp_h_init_phase_luma = dc_fixpt_add_int(tmp_h_ratio_luma, h_taps_luma + 1);
762 	tmp_h_init_phase_luma = dc_fixpt_div_int(tmp_h_init_phase_luma, 2);
763 	tmp_h_init_phase_luma = dc_fixpt_sub_int(tmp_h_init_phase_luma, h_taps_luma);
764 
765 	h_init_phase_luma = dc_fixpt_s4d19(tmp_h_init_phase_luma);
766 	h_init_phase_luma_int = (h_init_phase_luma >> 19) & 0x1f;
767 	h_init_phase_luma_frac = (h_init_phase_luma & 0x7ffff) << 5;
768 
769 	tmp_h_init_phase_chroma = dc_fixpt_mul_int(tmp_h_ratio_luma, 2);
770 	tmp_h_init_phase_chroma = dc_fixpt_add_int(tmp_h_init_phase_chroma, h_taps_chroma + 1);
771 	tmp_h_init_phase_chroma = dc_fixpt_div_int(tmp_h_init_phase_chroma, 2);
772 	tmp_h_init_phase_chroma = dc_fixpt_sub_int(tmp_h_init_phase_chroma, h_taps_chroma);
773 	tmp_h_init_phase_chroma = dc_fixpt_add(tmp_h_init_phase_chroma, dc_fixpt_from_fraction(1, 4));
774 
775 	h_init_phase_chroma = dc_fixpt_s4d19(tmp_h_init_phase_chroma);
776 	h_init_phase_chroma_int = (h_init_phase_chroma >> 19) & 0x1f;
777 	h_init_phase_chroma_frac = (h_init_phase_chroma & 0x7ffff) << 5;
778 
779 	/* Program phase*/
780 	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_Y_RGB, WBSCL_H_INIT_INT_Y_RGB, h_init_phase_luma_int);
781 	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_Y_RGB, WBSCL_H_INIT_FRAC_Y_RGB, h_init_phase_luma_frac);
782 	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_CBCR, WBSCL_H_INIT_INT_CBCR, h_init_phase_chroma_int);
783 	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_CBCR, WBSCL_H_INIT_FRAC_CBCR, h_init_phase_chroma_frac);
784 
785 	/* Program LUT coefficients*/
786 	filter_h = wbscl_get_filter_coeffs_16p(
787 		h_taps_luma, tmp_h_ratio_luma);
788 	filter_h_c = wbscl_get_filter_coeffs_16p(
789 		h_taps_chroma, dc_fixpt_from_int(h_ratio_luma * 2));
790 
791 	wbscl_set_scaler_filter(dwbc20, h_taps_luma,
792 		WBSCL_COEF_LUMA_HORZ_FILTER, filter_h);
793 
794 	wbscl_set_scaler_filter(dwbc20, h_taps_chroma,
795 		WBSCL_COEF_CHROMA_HORZ_FILTER, filter_h_c);
796 
797 	return true;
798 }
799 
dwb_program_vert_scalar(struct dcn20_dwbc * dwbc20,uint32_t src_height,uint32_t dest_height,struct scaling_taps num_taps,enum dwb_subsample_position subsample_position)800 bool dwb_program_vert_scalar(struct dcn20_dwbc *dwbc20,
801 		uint32_t src_height,
802 		uint32_t dest_height,
803 		struct scaling_taps num_taps,
804 		enum dwb_subsample_position subsample_position)
805 {
806 	uint32_t v_ratio_luma = 1;
807 	uint32_t v_taps_luma = num_taps.v_taps;
808 	uint32_t v_taps_chroma = num_taps.v_taps_c;
809 	int32_t v_init_phase_luma = 0;
810 	int32_t v_init_phase_chroma = 0;
811 	uint32_t v_init_phase_luma_int = 0;
812 	uint32_t v_init_phase_luma_frac = 0;
813 	uint32_t v_init_phase_chroma_int = 0;
814 	uint32_t v_init_phase_chroma_frac = 0;
815 
816 	const uint16_t *filter_v = NULL;
817 	const uint16_t *filter_v_c = NULL;
818 
819 	struct fixed31_32 tmp_v_init_phase_luma = dc_fixpt_from_int(0);
820 	struct fixed31_32 tmp_v_init_phase_chroma = dc_fixpt_from_int(0);
821 
822 	/*Calculate ratio*/
823 	struct fixed31_32 tmp_v_ratio_luma = dc_fixpt_from_fraction(
824 		src_height, dest_height);
825 
826 	if (dc_fixpt_floor(tmp_v_ratio_luma) == 8)
827 		v_ratio_luma = -1;
828 	else
829 		v_ratio_luma = dc_fixpt_u3d19(tmp_v_ratio_luma) << 5;
830 
831 	/*Program ratio*/
832 	REG_UPDATE(WBSCL_VERT_FILTER_SCALE_RATIO, WBSCL_V_SCALE_RATIO, v_ratio_luma);
833 
834 	/* Program taps*/
835 	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_V_NUM_OF_TAPS_Y_RGB, v_taps_luma - 1);
836 	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_V_NUM_OF_TAPS_CBCR, v_taps_chroma - 1);
837 
838 	/* Calculate phase*/
839 	tmp_v_init_phase_luma = dc_fixpt_add_int(tmp_v_ratio_luma, v_taps_luma + 1);
840 	tmp_v_init_phase_luma = dc_fixpt_div_int(tmp_v_init_phase_luma, 2);
841 	tmp_v_init_phase_luma = dc_fixpt_sub_int(tmp_v_init_phase_luma, v_taps_luma);
842 
843 	v_init_phase_luma = dc_fixpt_s4d19(tmp_v_init_phase_luma);
844 	v_init_phase_luma_int = (v_init_phase_luma >> 19) & 0x1f;
845 	v_init_phase_luma_frac = (v_init_phase_luma & 0x7ffff) << 5;
846 
847 	tmp_v_init_phase_chroma = dc_fixpt_mul_int(tmp_v_ratio_luma, 2);
848 	tmp_v_init_phase_chroma = dc_fixpt_add_int(tmp_v_init_phase_chroma, v_taps_chroma + 1);
849 	tmp_v_init_phase_chroma = dc_fixpt_div_int(tmp_v_init_phase_chroma, 2);
850 	tmp_v_init_phase_chroma = dc_fixpt_sub_int(tmp_v_init_phase_chroma, v_taps_chroma);
851 	if (subsample_position == DWB_COSITED_SUBSAMPLING)
852 		tmp_v_init_phase_chroma = dc_fixpt_add(tmp_v_init_phase_chroma, dc_fixpt_from_fraction(1, 4));
853 
854 	v_init_phase_chroma = dc_fixpt_s4d19(tmp_v_init_phase_chroma);
855 	v_init_phase_chroma_int = (v_init_phase_chroma >> 19) & 0x1f;
856 	v_init_phase_chroma_frac = (v_init_phase_chroma & 0x7ffff) << 5;
857 
858 	/* Program phase*/
859 	REG_UPDATE(WBSCL_VERT_FILTER_INIT_Y_RGB, WBSCL_V_INIT_INT_Y_RGB, v_init_phase_luma_int);
860 	REG_UPDATE(WBSCL_VERT_FILTER_INIT_Y_RGB, WBSCL_V_INIT_FRAC_Y_RGB, v_init_phase_luma_frac);
861 	REG_UPDATE(WBSCL_VERT_FILTER_INIT_CBCR, WBSCL_V_INIT_INT_CBCR, v_init_phase_chroma_int);
862 	REG_UPDATE(WBSCL_VERT_FILTER_INIT_CBCR, WBSCL_V_INIT_FRAC_CBCR, v_init_phase_chroma_frac);
863 
864 
865 	/* Program LUT coefficients*/
866 	filter_v  = wbscl_get_filter_coeffs_16p(
867 		v_taps_luma, tmp_v_ratio_luma);
868 	filter_v_c = wbscl_get_filter_coeffs_16p(
869 		v_taps_chroma, dc_fixpt_from_int(v_ratio_luma * 2));
870 	wbscl_set_scaler_filter(dwbc20, v_taps_luma,
871 		WBSCL_COEF_LUMA_VERT_FILTER, filter_v);
872 
873 	wbscl_set_scaler_filter(dwbc20, v_taps_chroma,
874 		WBSCL_COEF_CHROMA_VERT_FILTER, filter_v_c);
875 	return true;
876 }
877