1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
50static 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
62static 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
74static 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
86static 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
98static 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
110static 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
122static 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
134static 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
146static 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
158static 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
170static 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
182static 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
194static 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
206static 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
218static 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
230static 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
242static 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
254static 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
266static 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
278static 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
290static 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
302static 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
314static 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
326static 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
338static 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
350static 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
362static 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
374static 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
386static 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
398static 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
410static 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
422static 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
434static 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
446static 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
458static 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
470static 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
482static 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
494static 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
506static 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
518static 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
530const 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
542const 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
554static 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
566static 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
578static 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
590static 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
602static 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}
613static 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
625static 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
637static 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
649static 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
677 BREAK_TO_DEBUGGER();
678 return NULL;
679 }
680}
681
682static 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 for (phase = 0; phase < (NUM_PHASES / 2 + 1); phase++) {
694 for (pair = 0; pair < tap_pairs; pair++) {
695 even_coef = filter[phase * taps + 2 * pair];
696 if ((pair * 2 + 1) < taps)
697 odd_coef = filter[phase * taps + 2 * pair + 1];
698 else
699 odd_coef = 0;
700
701 REG_SET_3(WBSCL_COEF_RAM_SELECT, 0,
702 WBSCL_COEF_RAM_TAP_PAIR_IDX, pair,
703 WBSCL_COEF_RAM_PHASE, phase,
704 WBSCL_COEF_RAM_FILTER_TYPE, filter_type);
705
706 REG_SET_4(WBSCL_COEF_RAM_TAP_DATA, 0,
707
708 WBSCL_COEF_RAM_EVEN_TAP_COEF, even_coef,
709
710 WBSCL_COEF_RAM_EVEN_TAP_COEF_EN, 1,
711
712 WBSCL_COEF_RAM_ODD_TAP_COEF, odd_coef,
713
714 WBSCL_COEF_RAM_ODD_TAP_COEF_EN, 1);
715 }
716 }
717}
718
719bool dwb_program_horz_scalar(struct dcn20_dwbc *dwbc20,
720 uint32_t src_width,
721 uint32_t dest_width,
722 struct scaling_taps num_taps)
723{
724 uint32_t h_ratio_luma = 1;
725 uint32_t h_taps_luma = num_taps.h_taps;
726 uint32_t h_taps_chroma = num_taps.h_taps_c;
727 int32_t h_init_phase_luma = 0;
728 int32_t h_init_phase_chroma = 0;
729 uint32_t h_init_phase_luma_int = 0;
730 uint32_t h_init_phase_luma_frac = 0;
731 uint32_t h_init_phase_chroma_int = 0;
732 uint32_t h_init_phase_chroma_frac = 0;
733 const uint16_t *filter_h = NULL;
734 const uint16_t *filter_h_c = NULL;
735
736
737 struct fixed31_32 tmp_h_init_phase_luma = dc_fixpt_from_int(0);
738 struct fixed31_32 tmp_h_init_phase_chroma = dc_fixpt_from_int(0);
739
740
741
742 struct fixed31_32 tmp_h_ratio_luma = dc_fixpt_from_fraction(
743 src_width, dest_width);
744
745 if (dc_fixpt_floor(tmp_h_ratio_luma) == 8)
746 h_ratio_luma = -1;
747 else
748 h_ratio_luma = dc_fixpt_u3d19(tmp_h_ratio_luma) << 5;
749
750
751 REG_UPDATE(WBSCL_HORZ_FILTER_SCALE_RATIO, WBSCL_H_SCALE_RATIO, h_ratio_luma);
752
753
754 REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_H_NUM_OF_TAPS_Y_RGB, h_taps_luma - 1);
755 REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_H_NUM_OF_TAPS_CBCR, h_taps_chroma - 1);
756
757
758 tmp_h_init_phase_luma = dc_fixpt_add_int(tmp_h_ratio_luma, h_taps_luma + 1);
759 tmp_h_init_phase_luma = dc_fixpt_div_int(tmp_h_init_phase_luma, 2);
760 tmp_h_init_phase_luma = dc_fixpt_sub_int(tmp_h_init_phase_luma, h_taps_luma);
761
762 h_init_phase_luma = dc_fixpt_s4d19(tmp_h_init_phase_luma);
763 h_init_phase_luma_int = (h_init_phase_luma >> 19) & 0x1f;
764 h_init_phase_luma_frac = (h_init_phase_luma & 0x7ffff) << 5;
765
766 tmp_h_init_phase_chroma = dc_fixpt_mul_int(tmp_h_ratio_luma, 2);
767 tmp_h_init_phase_chroma = dc_fixpt_add_int(tmp_h_init_phase_chroma, h_taps_chroma + 1);
768 tmp_h_init_phase_chroma = dc_fixpt_div_int(tmp_h_init_phase_chroma, 2);
769 tmp_h_init_phase_chroma = dc_fixpt_sub_int(tmp_h_init_phase_chroma, h_taps_chroma);
770 tmp_h_init_phase_chroma = dc_fixpt_add(tmp_h_init_phase_chroma, dc_fixpt_from_fraction(1, 4));
771
772 h_init_phase_chroma = dc_fixpt_s4d19(tmp_h_init_phase_chroma);
773 h_init_phase_chroma_int = (h_init_phase_chroma >> 19) & 0x1f;
774 h_init_phase_chroma_frac = (h_init_phase_chroma & 0x7ffff) << 5;
775
776
777 REG_UPDATE(WBSCL_HORZ_FILTER_INIT_Y_RGB, WBSCL_H_INIT_INT_Y_RGB, h_init_phase_luma_int);
778 REG_UPDATE(WBSCL_HORZ_FILTER_INIT_Y_RGB, WBSCL_H_INIT_FRAC_Y_RGB, h_init_phase_luma_frac);
779 REG_UPDATE(WBSCL_HORZ_FILTER_INIT_CBCR, WBSCL_H_INIT_INT_CBCR, h_init_phase_chroma_int);
780 REG_UPDATE(WBSCL_HORZ_FILTER_INIT_CBCR, WBSCL_H_INIT_FRAC_CBCR, h_init_phase_chroma_frac);
781
782
783 filter_h = wbscl_get_filter_coeffs_16p(
784 h_taps_luma, tmp_h_ratio_luma);
785 filter_h_c = wbscl_get_filter_coeffs_16p(
786 h_taps_chroma, dc_fixpt_from_int(h_ratio_luma * 2));
787
788 wbscl_set_scaler_filter(dwbc20, h_taps_luma,
789 WBSCL_COEF_LUMA_HORZ_FILTER, filter_h);
790
791 wbscl_set_scaler_filter(dwbc20, h_taps_chroma,
792 WBSCL_COEF_CHROMA_HORZ_FILTER, filter_h_c);
793
794 return true;
795}
796
797bool dwb_program_vert_scalar(struct dcn20_dwbc *dwbc20,
798 uint32_t src_height,
799 uint32_t dest_height,
800 struct scaling_taps num_taps,
801 enum dwb_subsample_position subsample_position)
802{
803 uint32_t v_ratio_luma = 1;
804 uint32_t v_taps_luma = num_taps.v_taps;
805 uint32_t v_taps_chroma = num_taps.v_taps_c;
806 int32_t v_init_phase_luma = 0;
807 int32_t v_init_phase_chroma = 0;
808 uint32_t v_init_phase_luma_int = 0;
809 uint32_t v_init_phase_luma_frac = 0;
810 uint32_t v_init_phase_chroma_int = 0;
811 uint32_t v_init_phase_chroma_frac = 0;
812
813 const uint16_t *filter_v = NULL;
814 const uint16_t *filter_v_c = NULL;
815
816 struct fixed31_32 tmp_v_init_phase_luma = dc_fixpt_from_int(0);
817 struct fixed31_32 tmp_v_init_phase_chroma = dc_fixpt_from_int(0);
818
819
820 struct fixed31_32 tmp_v_ratio_luma = dc_fixpt_from_fraction(
821 src_height, dest_height);
822
823 if (dc_fixpt_floor(tmp_v_ratio_luma) == 8)
824 v_ratio_luma = -1;
825 else
826 v_ratio_luma = dc_fixpt_u3d19(tmp_v_ratio_luma) << 5;
827
828
829 REG_UPDATE(WBSCL_VERT_FILTER_SCALE_RATIO, WBSCL_V_SCALE_RATIO, v_ratio_luma);
830
831
832 REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_V_NUM_OF_TAPS_Y_RGB, v_taps_luma - 1);
833 REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_V_NUM_OF_TAPS_CBCR, v_taps_chroma - 1);
834
835
836 tmp_v_init_phase_luma = dc_fixpt_add_int(tmp_v_ratio_luma, v_taps_luma + 1);
837 tmp_v_init_phase_luma = dc_fixpt_div_int(tmp_v_init_phase_luma, 2);
838 tmp_v_init_phase_luma = dc_fixpt_sub_int(tmp_v_init_phase_luma, v_taps_luma);
839
840 v_init_phase_luma = dc_fixpt_s4d19(tmp_v_init_phase_luma);
841 v_init_phase_luma_int = (v_init_phase_luma >> 19) & 0x1f;
842 v_init_phase_luma_frac = (v_init_phase_luma & 0x7ffff) << 5;
843
844 tmp_v_init_phase_chroma = dc_fixpt_mul_int(tmp_v_ratio_luma, 2);
845 tmp_v_init_phase_chroma = dc_fixpt_add_int(tmp_v_init_phase_chroma, v_taps_chroma + 1);
846 tmp_v_init_phase_chroma = dc_fixpt_div_int(tmp_v_init_phase_chroma, 2);
847 tmp_v_init_phase_chroma = dc_fixpt_sub_int(tmp_v_init_phase_chroma, v_taps_chroma);
848 if (subsample_position == DWB_COSITED_SUBSAMPLING)
849 tmp_v_init_phase_chroma = dc_fixpt_add(tmp_v_init_phase_chroma, dc_fixpt_from_fraction(1, 4));
850
851 v_init_phase_chroma = dc_fixpt_s4d19(tmp_v_init_phase_chroma);
852 v_init_phase_chroma_int = (v_init_phase_chroma >> 19) & 0x1f;
853 v_init_phase_chroma_frac = (v_init_phase_chroma & 0x7ffff) << 5;
854
855
856 REG_UPDATE(WBSCL_VERT_FILTER_INIT_Y_RGB, WBSCL_V_INIT_INT_Y_RGB, v_init_phase_luma_int);
857 REG_UPDATE(WBSCL_VERT_FILTER_INIT_Y_RGB, WBSCL_V_INIT_FRAC_Y_RGB, v_init_phase_luma_frac);
858 REG_UPDATE(WBSCL_VERT_FILTER_INIT_CBCR, WBSCL_V_INIT_INT_CBCR, v_init_phase_chroma_int);
859 REG_UPDATE(WBSCL_VERT_FILTER_INIT_CBCR, WBSCL_V_INIT_FRAC_CBCR, v_init_phase_chroma_frac);
860
861
862
863 filter_v = wbscl_get_filter_coeffs_16p(
864 v_taps_luma, tmp_v_ratio_luma);
865 filter_v_c = wbscl_get_filter_coeffs_16p(
866 v_taps_chroma, dc_fixpt_from_int(v_ratio_luma * 2));
867 wbscl_set_scaler_filter(dwbc20, v_taps_luma,
868 WBSCL_COEF_LUMA_VERT_FILTER, filter_v);
869
870 wbscl_set_scaler_filter(dwbc20, v_taps_chroma,
871 WBSCL_COEF_CHROMA_VERT_FILTER, filter_v_c);
872 return true;
873}
874