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