190075Sobrien/*	$NetBSD: amdgpu_dcn20_dwb_scl.c,v 1.2 2021/12/18 23:45:03 riastradh Exp $	*/
2169689Skan
3169689Skan/*
4169689Skan * Copyright 2012-17 Advanced Micro Devices, Inc.
590075Sobrien *
6132718Skan * Permission is hereby granted, free of charge, to any person obtaining a
790075Sobrien * copy of this software and associated documentation files (the "Software"),
8132718Skan * to deal in the Software without restriction, including without limitation
990075Sobrien * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1090075Sobrien * and/or sell copies of the Software, and to permit persons to whom the
1190075Sobrien * Software is furnished to do so, subject to the following conditions:
1290075Sobrien *
13132718Skan * The above copyright notice and this permission notice shall be included in
1490075Sobrien * all copies or substantial portions of the Software.
1590075Sobrien *
1690075Sobrien * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1790075Sobrien * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1890075Sobrien * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19132718Skan * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20169689Skan * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21169689Skan * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2290075Sobrien * OTHER DEALINGS IN THE SOFTWARE.
2390075Sobrien *
2490075Sobrien * Authors: AMD
2590075Sobrien *
2690075Sobrien */
2790075Sobrien
2890075Sobrien#include <sys/cdefs.h>
2990075Sobrien__KERNEL_RCSID(0, "$NetBSD: amdgpu_dcn20_dwb_scl.c,v 1.2 2021/12/18 23:45:03 riastradh Exp $");
3090075Sobrien
3190075Sobrien#include "reg_helper.h"
3290075Sobrien#include "fixed31_32.h"
3390075Sobrien#include "resource.h"
3490075Sobrien#include "dwb.h"
3590075Sobrien#include "dcn20_dwb.h"
3690075Sobrien
3790075Sobrien#define NUM_PHASES    16
3890075Sobrien#define HORZ_MAX_TAPS 12
3990075Sobrien#define VERT_MAX_TAPS 12
4090075Sobrien
4190075Sobrien#define REG(reg)\
42169689Skan	dwbc20->dwbc_regs->reg
43169689Skan
44169689Skan#define CTX \
45169689Skan	dwbc20->base.ctx
46169689Skan
47169689Skan#undef FN
4890075Sobrien#define FN(reg_name, field_name) \
4990075Sobrien	dwbc20->dwbc_shift->field_name, dwbc20->dwbc_mask->field_name
5090075Sobrien
51132718Skan#define TO_DCN20_DWBC(dwbc_base) \
52132718Skan	container_of(dwbc_base, struct dcn20_dwbc, base)
5390075Sobrien
54117395Skan
5590075Sobrienstatic const uint16_t filter_3tap_16p_upscale[27] = {
56117395Skan	2048, 2048, 0,
5790075Sobrien	1708, 2424, 16348,
5890075Sobrien	1372, 2796, 16308,
5990075Sobrien	1056, 3148, 16272,
60132718Skan	768, 3464, 16244,
61146895Skan	512, 3728, 16236,
6290075Sobrien	296, 3928, 16252,
6390075Sobrien	124, 4052, 16296,
6490075Sobrien	0, 4096, 0
6590075Sobrien};
6690075Sobrien
6790075Sobrienstatic const uint16_t filter_3tap_16p_117[27] = {
6890075Sobrien	2048, 2048, 0,
6990075Sobrien	1824, 2276, 16376,
7090075Sobrien	1600, 2496, 16380,
7190075Sobrien	1376, 2700, 16,
7290075Sobrien	1156, 2880, 52,
7390075Sobrien	948, 3032, 108,
7490075Sobrien	756, 3144, 192,
7590075Sobrien	580, 3212, 296,
76169689Skan	428, 3236, 428
7790075Sobrien};
7890075Sobrien
7990075Sobrienstatic const uint16_t filter_3tap_16p_150[27] = {
8090075Sobrien	2048, 2048, 0,
8190075Sobrien	1872, 2184, 36,
82117395Skan	1692, 2308, 88,
8390075Sobrien	1516, 2420, 156,
8490075Sobrien	1340, 2516, 236,
8590075Sobrien	1168, 2592, 328,
8690075Sobrien	1004, 2648, 440,
87117395Skan	844, 2684, 560,
88117395Skan	696, 2696, 696
89117395Skan};
90117395Skan
91117395Skanstatic const uint16_t filter_3tap_16p_183[27] = {
9290075Sobrien	2048, 2048, 0,
9390075Sobrien	1892, 2104, 92,
94169689Skan	1744, 2152, 196,
9590075Sobrien	1592, 2196, 300,
9690075Sobrien	1448, 2232, 412,
9790075Sobrien	1304, 2256, 528,
98169689Skan	1168, 2276, 648,
99107590Sobrien	1032, 2288, 772,
100107590Sobrien	900, 2292, 900
101169689Skan};
102107590Sobrien
103107590Sobrienstatic const uint16_t filter_4tap_16p_upscale[36] = {
104107590Sobrien	0, 4096, 0, 0,
105107590Sobrien	16240, 4056, 180, 16380,
106169689Skan	16136, 3952, 404, 16364,
10790075Sobrien	16072, 3780, 664, 16344,
108169689Skan	16040, 3556, 952, 16312,
109169689Skan	16036, 3284, 1268, 16272,
110169689Skan	16052, 2980, 1604, 16224,
111169689Skan	16084, 2648, 1952, 16176,
112169689Skan	16128, 2304, 2304, 16128
113169689Skan};
114169689Skan
115169689Skanstatic const uint16_t filter_4tap_16p_117[36] = {
116169689Skan	428, 3236, 428, 0,
117169689Skan	276, 3232, 604, 16364,
118169689Skan	148, 3184, 800, 16340,
119169689Skan	44, 3104, 1016, 16312,
120169689Skan	16344, 2984, 1244, 16284,
121169689Skan	16284, 2832, 1488, 16256,
122169689Skan	16244, 2648, 1732, 16236,
123169689Skan	16220, 2440, 1976, 16220,
124169689Skan	16212, 2216, 2216, 16212
125169689Skan};
126169689Skan
127169689Skanstatic const uint16_t filter_4tap_16p_150[36] = {
12890075Sobrien	696, 2700, 696, 0,
12990075Sobrien	560, 2700, 848, 16364,
13090075Sobrien	436, 2676, 1008, 16348,
13190075Sobrien	328, 2628, 1180, 16336,
13290075Sobrien	232, 2556, 1356, 16328,
13390075Sobrien	152, 2460, 1536, 16328,
13490075Sobrien	84, 2344, 1716, 16332,
13590075Sobrien	28, 2208, 1888, 16348,
13690075Sobrien	16376, 2052, 2052, 16376
13790075Sobrien};
13890075Sobrien
13990075Sobrienstatic const uint16_t filter_4tap_16p_183[36] = {
14090075Sobrien	940, 2208, 940, 0,
14190075Sobrien	832, 2200, 1052, 4,
14290075Sobrien	728, 2180, 1164, 16,
14390075Sobrien	628, 2148, 1280, 36,
144132718Skan	536, 2100, 1392, 60,
14590075Sobrien	448, 2044, 1504, 92,
14690075Sobrien	368, 1976, 1612, 132,
14790075Sobrien	296, 1900, 1716, 176,
148117395Skan	232, 1812, 1812, 232
14990075Sobrien};
15090075Sobrien
15190075Sobrienstatic const uint16_t filter_5tap_16p_upscale[45] = {
15290075Sobrien	15936, 2496, 2496, 15936, 0,
15390075Sobrien	15992, 2128, 2832, 15896, 12,
15490075Sobrien	16056, 1760, 3140, 15876, 24,
15590075Sobrien	16120, 1404, 3420, 15876, 36,
15690075Sobrien	16188, 1060, 3652, 15908, 44,
15790075Sobrien	16248, 744, 3844, 15972, 44,
15890075Sobrien	16304, 460, 3980, 16072, 40,
15990075Sobrien	16348, 212, 4064, 16208, 24,
16090075Sobrien	0, 0, 4096, 0, 0,
16190075Sobrien};
16290075Sobrien
16390075Sobrienstatic const uint16_t filter_5tap_16p_117[45] = {
164132718Skan	16056, 2372, 2372, 16056, 0,
16590075Sobrien	16052, 2124, 2600, 16076, 0,
16690075Sobrien	16060, 1868, 2808, 16120, 0,
16790075Sobrien	16080, 1612, 2992, 16180, 16376,
168132718Skan	16112, 1356, 3144, 16268, 16364,
169132718Skan	16144, 1108, 3268, 16376, 16344,
170132718Skan	16184, 872, 3356, 124, 16320,
171132718Skan	16220, 656, 3412, 276, 16292,
172132718Skan	16256, 456, 3428, 456, 16256,
173132718Skan};
174132718Skan
175132718Skanstatic const uint16_t filter_5tap_16p_150[45] = {
17690075Sobrien	16368, 2064, 2064, 16368, 0,
17790075Sobrien	16316, 1924, 2204, 44, 16372,
17890075Sobrien	16280, 1772, 2328, 116, 16356,
179132718Skan	16256, 1616, 2440, 204, 16340,
180132718Skan	16240, 1456, 2536, 304, 16320,
181132718Skan	16232, 1296, 2612, 416, 16300,
182132718Skan	16232, 1132, 2664, 544, 16284,
183132718Skan	16240, 976, 2700, 680, 16264,
184132718Skan	16248, 824, 2708, 824, 16248,
185132718Skan};
186132718Skan
187132718Skanstatic const uint16_t filter_5tap_16p_183[45] = {
188132718Skan	228, 1816, 1816, 228, 0,
189132718Skan	168, 1728, 1904, 300, 16372,
190132718Skan	116, 1632, 1988, 376, 16360,
191132718Skan	72, 1528, 2060, 460, 16348,
192132718Skan	36, 1424, 2120, 552, 16340,
193132718Skan	4, 1312, 2168, 652, 16336,
194132718Skan	16368, 1200, 2204, 752, 16332,
195132718Skan	16352, 1084, 2224, 860, 16332,
196132718Skan	16340, 972, 2232, 972, 16340,
197132718Skan};
198132718Skan
199132718Skanstatic const uint16_t filter_6tap_16p_upscale[54] = {
200132718Skan	0, 0, 4092, 0, 0, 0,
201132718Skan	44, 16188, 4064, 228, 16324, 0,
202132718Skan	80, 16036, 3980, 492, 16256, 4,
203132718Skan	108, 15916, 3844, 788, 16184, 16,
204132718Skan	120, 15836, 3656, 1108, 16104, 28,
205132718Skan	128, 15792, 3420, 1448, 16024, 44,
206132718Skan	124, 15776, 3144, 1800, 15948, 64,
207132718Skan	112, 15792, 2836, 2152, 15880, 80,
208132718Skan	100, 15828, 2504, 2504, 15828, 100,
209132718Skan};
210132718Skan
211132718Skanstatic const uint16_t filter_6tap_16p_117[54] = {
212132718Skan	16168, 476, 3568, 476, 16168, 0,
213132718Skan	16216, 280, 3540, 692, 16116, 8,
214132718Skan	16264, 104, 3472, 924, 16068, 16,
215132718Skan	16304, 16340, 3372, 1168, 16024, 28,
216132718Skan	16344, 16212, 3236, 1424, 15988, 36,
217132718Skan	16372, 16112, 3072, 1680, 15956, 44,
218132718Skan	12, 16036, 2880, 1936, 15940, 48,
219132718Skan	28, 15984, 2668, 2192, 15936, 48,
220132718Skan	40, 15952, 2436, 2436, 15952, 40,
221132718Skan};
22290075Sobrien
22390075Sobrienstatic const uint16_t filter_6tap_16p_150[54] = {
22490075Sobrien	16148, 920, 2724, 920, 16148, 0,
225169689Skan	16156, 768, 2712, 1072, 16144, 0,
226132718Skan	16172, 628, 2684, 1232, 16148, 16380,
227132718Skan	16192, 492, 2632, 1388, 16160, 16372,
22890075Sobrien	16212, 368, 2564, 1548, 16180, 16364,
229117395Skan	16232, 256, 2480, 1704, 16212, 16352,
23090075Sobrien	16256, 156, 2380, 1856, 16256, 16336,
231132718Skan	16276, 64, 2268, 2004, 16308, 16320,
23290075Sobrien	16300, 16372, 2140, 2140, 16372, 16300,
23390075Sobrien};
23490075Sobrien
235169689Skanstatic const uint16_t filter_6tap_16p_183[54] = {
236169689Skan	16296, 1032, 2196, 1032, 16296, 0,
23790075Sobrien	16284, 924, 2196, 1144, 16320, 16376,
238117395Skan	16272, 820, 2180, 1256, 16348, 16364,
239169689Skan	16268, 716, 2156, 1364, 16380, 16352,
240169689Skan	16264, 620, 2116, 1472, 36, 16340,
24190075Sobrien	16268, 524, 2068, 1576, 88, 16328,
24290075Sobrien	16272, 436, 2008, 1680, 144, 16316,
24390075Sobrien	16280, 352, 1940, 1772, 204, 16304,
244169689Skan	16292, 276, 1860, 1860, 276, 16292,
245169689Skan};
24690075Sobrien
247117395Skanstatic const uint16_t filter_7tap_16p_upscale[63] = {
24890075Sobrien	176, 15760, 2488, 2488, 15760, 176, 0,
24990075Sobrien	160, 15812, 2152, 2816, 15728, 192, 16376,
25090075Sobrien	136, 15884, 1812, 3124, 15720, 196, 16368,
251169689Skan	108, 15964, 1468, 3400, 15740, 196, 16364,
252169689Skan	84, 16048, 1132, 3640, 15792, 180, 16360,
253169689Skan	56, 16140, 812, 3832, 15884, 152, 16360,
254169689Skan	32, 16228, 512, 3976, 16012, 116, 16364,
255169689Skan	12, 16308, 240, 4064, 16180, 60, 16372,
256169689Skan	0, 0, 0, 4096, 0, 0, 0,
25790075Sobrien};
25890075Sobrien
25990075Sobrienstatic const uint16_t filter_7tap_16p_117[63] = {
260169689Skan	92, 15868, 2464, 2464, 15868, 92, 0,
26190075Sobrien	108, 15852, 2216, 2700, 15904, 72, 0,
26290075Sobrien	112, 15856, 1960, 2916, 15964, 44, 0,
263169689Skan	116, 15876, 1696, 3108, 16048, 8, 8,
264169689Skan	112, 15908, 1428, 3268, 16156, 16348, 12,
265169689Skan	104, 15952, 1168, 3400, 16288, 16300, 24,
266169689Skan	92, 16004, 916, 3496, 64, 16244, 36,
267169689Skan	80, 16064, 676, 3556, 248, 16184, 48,
268169689Skan	64, 16124, 452, 3576, 452, 16124, 64,
269169689Skan};
270169689Skan
271169689Skanstatic const uint16_t filter_7tap_16p_150[63] = {
272169689Skan	16224, 16380, 2208, 2208, 16380, 16224, 0,
273169689Skan	16252, 16304, 2072, 2324, 84, 16196, 4,
274169689Skan	16276, 16240, 1924, 2432, 184, 16172, 8,
275169689Skan	16300, 16184, 1772, 2524, 296, 16144, 12,
276169689Skan	16324, 16144, 1616, 2600, 416, 16124, 12,
277169689Skan	16344, 16112, 1456, 2660, 548, 16104, 12,
278169689Skan	16360, 16092, 1296, 2704, 688, 16088, 12,
279169689Skan	16372, 16080, 1140, 2732, 832, 16080, 8,
280169689Skan	0, 16076, 984, 2740, 984, 16076, 0,
281169689Skan};
282169689Skan
283169689Skanstatic const uint16_t filter_7tap_16p_183[63] = {
284169689Skan	16216, 324, 1884, 1884, 324, 16216, 0,
285169689Skan	16228, 248, 1804, 1960, 408, 16212, 16380,
286169689Skan	16240, 176, 1716, 2028, 496, 16208, 16376,
287169689Skan	16252, 112, 1624, 2084, 588, 16208, 16372,
288169689Skan	16264, 56, 1524, 2132, 684, 16212, 16364,
289169689Skan	16280, 4, 1424, 2168, 788, 16220, 16356,
290169689Skan	16292, 16344, 1320, 2196, 892, 16232, 16344,
291169689Skan	16308, 16308, 1212, 2212, 996, 16252, 16332,
292169689Skan	16320, 16276, 1104, 2216, 1104, 16276, 16320,
293169689Skan};
294169689Skan
295169689Skanstatic const uint16_t filter_8tap_16p_upscale[72] = {
296169689Skan	0, 0, 0, 4096, 0, 0, 0, 0,
297169689Skan	16360, 76, 16172, 4064, 244, 16296, 24, 16380,
298169689Skan	16340, 136, 15996, 3980, 524, 16204, 56, 16380,
299117395Skan	16328, 188, 15860, 3844, 828, 16104, 92, 16372,
30090075Sobrien	16320, 224, 15760, 3656, 1156, 16008, 128, 16368,
30190075Sobrien	16320, 248, 15696, 3428, 1496, 15912, 160, 16360,
30290075Sobrien	16320, 256, 15668, 3156, 1844, 15828, 192, 16348,
30390075Sobrien	16324, 256, 15672, 2856, 2192, 15756, 220, 16340,
304132718Skan	16332, 244, 15704, 2532, 2532, 15704, 244, 16332,
30590075Sobrien};
30690075Sobrien
30790075Sobrienstatic const uint16_t filter_8tap_16p_117[72] = {
30890075Sobrien	116, 16100, 428, 3564, 428, 16100, 116, 0,
30990075Sobrien	96, 16168, 220, 3548, 656, 16032, 136, 16376,
310132718Skan	76, 16236, 32, 3496, 904, 15968, 152, 16372,
31190075Sobrien	56, 16300, 16252, 3408, 1164, 15908, 164, 16368,
31290075Sobrien	36, 16360, 16116, 3284, 1428, 15856, 172, 16364,
31390075Sobrien	20, 28, 16000, 3124, 1700, 15820, 176, 16364,
31490075Sobrien	4, 76, 15912, 2940, 1972, 15800, 172, 16364,
31590075Sobrien	16380, 112, 15848, 2724, 2236, 15792, 160, 16364,
31690075Sobrien	16372, 140, 15812, 2488, 2488, 15812, 140, 16372,
317117395Skan};
31890075Sobrien
31990075Sobrienstatic const uint16_t filter_8tap_16p_150[72] = {
320169689Skan	16380, 16020, 1032, 2756, 1032, 16020, 16380, 0,
32190075Sobrien	12, 16020, 876, 2744, 1184, 16032, 16364, 4,
32290075Sobrien	24, 16028, 728, 2716, 1344, 16052, 16340, 8,
32390075Sobrien	36, 16040, 584, 2668, 1500, 16080, 16316, 16,
32490075Sobrien	40, 16060, 448, 2608, 1652, 16120, 16288, 20,
32590075Sobrien	44, 16080, 320, 2528, 1804, 16168, 16260, 28,
32690075Sobrien	48, 16108, 204, 2436, 1948, 16232, 16228, 32,
32790075Sobrien	44, 16136, 100, 2328, 2084, 16304, 16200, 40,
32890075Sobrien	44, 16168, 4, 2212, 2212, 4, 16168, 44,
32990075Sobrien};
33090075Sobrien
33190075Sobrienstatic const uint16_t filter_8tap_16p_183[72] = {
33290075Sobrien	16264, 16264, 1164, 2244, 1164, 16264, 16264, 0,
33390075Sobrien	16280, 16232, 1056, 2236, 1268, 16300, 16248, 0,
33490075Sobrien	16296, 16204, 948, 2220, 1372, 16348, 16232, 0,
33590075Sobrien	16312, 16184, 844, 2192, 1472, 12, 16216, 4,
33690075Sobrien	16328, 16172, 740, 2156, 1572, 72, 16200, 0,
33790075Sobrien	16340, 16160, 640, 2108, 1668, 136, 16188, 0,
33890075Sobrien	16352, 16156, 544, 2052, 1756, 204, 16176, 16380,
33990075Sobrien	16360, 16156, 452, 1988, 1840, 280, 16164, 16376,
34090075Sobrien	16368, 16160, 364, 1920, 1920, 364, 16160, 16368,
34190075Sobrien};
34290075Sobrien
34390075Sobrienstatic const uint16_t filter_9tap_16p_upscale[81] = {
344132718Skan	16284, 296, 15660, 2572, 2572, 15660, 296, 16284, 0,
34590075Sobrien	16296, 272, 15712, 2228, 2896, 15632, 304, 16276, 4,
34690075Sobrien	16308, 240, 15788, 1876, 3192, 15632, 304, 16276, 4,
347169689Skan	16320, 204, 15876, 1520, 3452, 15664, 288, 16280, 8,
34890075Sobrien	16336, 164, 15976, 1176, 3676, 15732, 260, 16288, 12,
34990075Sobrien	16348, 120, 16080, 844, 3856, 15840, 216, 16300, 12,
350169689Skan	16364, 76, 16188, 532, 3988, 15984, 156, 16324, 8,
35190075Sobrien	16376, 36, 16288, 252, 4068, 16164, 84, 16352, 4,
35290075Sobrien	0, 0, 0, 0, 4096, 0, 0, 0, 0,
35390075Sobrien};
35490075Sobrien
35590075Sobrienstatic const uint16_t filter_9tap_16p_117[81] = {
35690075Sobrien	16356, 172, 15776, 2504, 2504, 15776, 172, 16356, 0,
35790075Sobrien	16344, 200, 15756, 2252, 2740, 15816, 136, 16372, 16380,
35890075Sobrien	16336, 216, 15756, 1988, 2956, 15884, 92, 8, 16380,
35990075Sobrien	16332, 224, 15780, 1720, 3144, 15976, 40, 28, 16376,
36090075Sobrien	16328, 224, 15816, 1448, 3304, 16096, 16364, 52, 16372,
36190075Sobrien	16328, 216, 15868, 1180, 3432, 16240, 16296, 80, 16364,
36290075Sobrien	16332, 200, 15928, 916, 3524, 24, 16224, 108, 16356,
363169689Skan	16336, 184, 15996, 668, 3580, 220, 16148, 132, 16352,
364169689Skan	16344, 160, 16072, 436, 3600, 436, 16072, 160, 16344,
365169689Skan};
36690075Sobrien
36790075Sobrienstatic const uint16_t filter_9tap_16p_150[81] = {
368169689Skan	84, 16128, 0, 2216, 2216, 0, 16128, 84, 0,
36990075Sobrien	80, 16160, 16296, 2088, 2332, 100, 16092, 84, 0,
37090075Sobrien	76, 16196, 16220, 1956, 2432, 208, 16064, 80, 0,
37190075Sobrien	72, 16232, 16152, 1812, 2524, 328, 16036, 76, 4,
37290075Sobrien	64, 16264, 16096, 1664, 2600, 460, 16012, 64, 8,
37390075Sobrien	56, 16300, 16052, 1508, 2656, 596, 15996, 52, 12,
37490075Sobrien	48, 16328, 16020, 1356, 2700, 740, 15984, 36, 20,
37590075Sobrien	40, 16356, 15996, 1196, 2728, 888, 15980, 20, 24,
376132718Skan	32, 0, 15984, 1044, 2736, 1044, 15984, 0, 32,
37790075Sobrien};
37890075Sobrien
37990075Sobrienstatic const uint16_t filter_9tap_16p_183[81] = {
38090075Sobrien	16356, 16112, 388, 1952, 1952, 388, 16112, 16356, 0,
381132718Skan	16368, 16116, 304, 1876, 2020, 480, 16112, 16344, 4,
38290075Sobrien	16376, 16124, 224, 1792, 2080, 576, 16116, 16328, 8,
38390075Sobrien	0, 16136, 148, 1700, 2132, 672, 16124, 16312, 8,
38490075Sobrien	8, 16148, 80, 1604, 2176, 772, 16140, 16296, 12,
38590075Sobrien	12, 16164, 16, 1504, 2208, 876, 16156, 16276, 16,
38690075Sobrien	16, 16180, 16344, 1404, 2232, 980, 16184, 16256, 20,
38790075Sobrien	20, 16200, 16296, 1300, 2244, 1088, 16212, 16240, 20,
38890075Sobrien	20, 16220, 16252, 1196, 2252, 1196, 16252, 16220, 20,
38990075Sobrien};
39090075Sobrien
39190075Sobrienstatic const uint16_t filter_10tap_16p_upscale[90] = {
39290075Sobrien	0, 0, 0, 0, 4096, 0, 0, 0, 0, 0,
39390075Sobrien	12, 16344, 88, 16160, 4068, 252, 16280, 44, 16368, 0,
39490075Sobrien	24, 16308, 168, 15976, 3988, 540, 16176, 92, 16348, 0,
39590075Sobrien	32, 16280, 236, 15828, 3852, 852, 16064, 140, 16328, 4,
396132718Skan	36, 16260, 284, 15720, 3672, 1184, 15956, 188, 16308, 8,
39790075Sobrien	36, 16244, 320, 15648, 3448, 1528, 15852, 236, 16288, 12,
39890075Sobrien	36, 16240, 336, 15612, 3184, 1880, 15764, 276, 16272, 20,
39990075Sobrien	32, 16240, 340, 15608, 2888, 2228, 15688, 308, 16256, 24,
40090075Sobrien	28, 16244, 332, 15636, 2568, 2568, 15636, 332, 16244, 28,
401169689Skan};
40290075Sobrien
40390075Sobrienstatic const uint16_t filter_10tap_16p_117[90] = {
40490075Sobrien	16308, 196, 16048, 440, 3636, 440, 16048, 196, 16308, 0,
40590075Sobrien	16316, 164, 16132, 220, 3612, 676, 15972, 220, 16300, 0,
40690075Sobrien	16324, 132, 16212, 20, 3552, 932, 15900, 240, 16296, 4,
40790075Sobrien	16336, 100, 16292, 16232, 3456, 1192, 15836, 256, 16296, 4,
40890075Sobrien	16348, 68, 16364, 16084, 3324, 1464, 15784, 264, 16296, 8,
40990075Sobrien	16356, 36, 48, 15960, 3164, 1736, 15748, 260, 16304, 4,
41090075Sobrien	16364, 8, 108, 15864, 2972, 2008, 15728, 252, 16312, 4,
41190075Sobrien	16372, 16368, 160, 15792, 2756, 2268, 15724, 228, 16328, 0,
41290075Sobrien	16380, 16344, 200, 15748, 2520, 2520, 15748, 200, 16344, 16380,
41390075Sobrien};
41490075Sobrien
415169689Skanstatic const uint16_t filter_10tap_16p_150[90] = {
416169689Skan	64, 0, 15956, 1048, 2716, 1048, 15956, 0, 64, 0,
417169689Skan	52, 24, 15952, 896, 2708, 1204, 15972, 16356, 72, 16380,
41890075Sobrien	44, 48, 15952, 748, 2684, 1360, 16000, 16320, 84, 16380,
419169689Skan	32, 68, 15964, 604, 2644, 1516, 16032, 16288, 92, 16376,
420169689Skan	24, 88, 15980, 464, 2588, 1668, 16080, 16248, 100, 16376,
421169689Skan	16, 100, 16004, 332, 2516, 1816, 16140, 16212, 108, 16376,
42290075Sobrien	8, 108, 16032, 212, 2428, 1956, 16208, 16172, 112, 16376,
42390075Sobrien	4, 116, 16060, 100, 2328, 2092, 16288, 16132, 116, 16380,
42490075Sobrien	0, 116, 16096, 16380, 2216, 2216, 16380, 16096, 116, 0,
42590075Sobrien};
42690075Sobrien
427169689Skanstatic const uint16_t filter_10tap_16p_183[90] = {
42890075Sobrien	40, 16180, 16240, 1216, 2256, 1216, 16240, 16180, 40, 0,
42990075Sobrien	44, 16204, 16200, 1112, 2252, 1320, 16288, 16160, 36, 0,
43090075Sobrien	44, 16224, 16168, 1004, 2236, 1424, 16344, 16144, 28, 4,
43190075Sobrien	44, 16248, 16136, 900, 2208, 1524, 16, 16124, 24, 8,
43290075Sobrien	44, 16268, 16116, 796, 2176, 1620, 84, 16108, 12, 12,
433117395Skan	40, 16288, 16100, 692, 2132, 1712, 156, 16096, 4, 16,
43490075Sobrien	36, 16308, 16088, 592, 2080, 1796, 232, 16088, 16376, 20,
43590075Sobrien	32, 16328, 16080, 496, 2020, 1876, 316, 16080, 16360, 24,
43690075Sobrien	28, 16344, 16080, 404, 1952, 1952, 404, 16080, 16344, 28,
437169689Skan};
438132718Skan
439132718Skanstatic const uint16_t filter_11tap_16p_upscale[99] = {
44090075Sobrien	60, 16216, 356, 15620, 2556, 2556, 15620, 356, 16216, 60, 0,
44190075Sobrien	52, 16224, 336, 15672, 2224, 2876, 15592, 368, 16208, 64, 16380,
44290075Sobrien	44, 16244, 304, 15744, 1876, 3176, 15596, 364, 16212, 64, 16376,
44390075Sobrien	36, 16264, 260, 15836, 1532, 3440, 15636, 340, 16220, 60, 16376,
44490075Sobrien	28, 16288, 212, 15940, 1188, 3668, 15708, 304, 16236, 56, 16376,
44590075Sobrien	20, 16312, 160, 16052, 856, 3848, 15820, 248, 16264, 48, 16376,
44690075Sobrien	12, 16336, 104, 16164, 544, 3984, 15968, 180, 16296, 36, 16376,
44790075Sobrien	4, 16360, 48, 16276, 256, 4068, 16160, 96, 16336, 16, 16380,
44890075Sobrien	0, 0, 0, 0, 0, 4096, 0, 0, 0, 0, 0,
44990075Sobrien};
45090075Sobrien
45190075Sobrienstatic const uint16_t filter_11tap_16p_117[99] = {
45290075Sobrien	16380, 16332, 220, 15728, 2536, 2536, 15728, 220, 16332, 16380, 0,
45390075Sobrien	4, 16308, 256, 15704, 2280, 2768, 15772, 176, 16360, 16368, 0,
454169689Skan	12, 16292, 280, 15704, 2016, 2984, 15848, 120, 8, 16356, 0,
45590075Sobrien	20, 16276, 292, 15724, 1744, 3172, 15948, 56, 40, 16340, 4,
45690075Sobrien	24, 16268, 292, 15760, 1468, 3328, 16072, 16368, 80, 16324, 8,
45790075Sobrien	24, 16264, 288, 15816, 1196, 3456, 16224, 16288, 116, 16312, 12,
45890075Sobrien	24, 16264, 272, 15880, 932, 3548, 16, 16208, 152, 16296, 16,
459169689Skan	24, 16268, 248, 15956, 676, 3604, 216, 16120, 188, 16284, 20,
460117395Skan	24, 16276, 220, 16036, 436, 3624, 436, 16036, 220, 16276, 24,
461169689Skan};
46290075Sobrien
46390075Sobrienstatic const uint16_t filter_11tap_16p_150[99] = {
46490075Sobrien	0, 144, 16072, 0, 2212, 2212, 0, 16072, 144, 0, 0,
465117395Skan	16376, 144, 16112, 16288, 2092, 2324, 104, 16036, 140, 8, 16380,
46690075Sobrien	16368, 144, 16152, 16204, 1960, 2424, 216, 16004, 132, 16, 16376,
46790075Sobrien	16364, 140, 16192, 16132, 1820, 2512, 340, 15976, 116, 28, 16376,
46890075Sobrien	16364, 132, 16232, 16072, 1676, 2584, 476, 15952, 100, 40, 16372,
46990075Sobrien	16360, 124, 16272, 16020, 1528, 2644, 612, 15936, 80, 52, 16368,
47090075Sobrien	16360, 116, 16312, 15980, 1372, 2684, 760, 15928, 56, 64, 16364,
471132718Skan	16360, 104, 16348, 15952, 1216, 2712, 908, 15928, 28, 76, 16364,
472132718Skan	16360, 92, 0, 15936, 1064, 2720, 1064, 15936, 0, 92, 16360,
47390075Sobrien};
47490075Sobrien
47590075Sobrienstatic const uint16_t filter_11tap_16p_183[99] = {
47690075Sobrien	60, 16336, 16052, 412, 1948, 1948, 412, 16052, 16336, 60, 0,
47790075Sobrien	56, 16356, 16052, 324, 1876, 2016, 504, 16056, 16316, 64, 0,
47890075Sobrien	48, 16372, 16060, 240, 1796, 2072, 604, 16064, 16292, 64, 0,
47990075Sobrien	44, 4, 16068, 160, 1712, 2124, 700, 16080, 16272, 68, 0,
480169689Skan	40, 20, 16080, 84, 1620, 2164, 804, 16096, 16248, 68, 4,
48190075Sobrien	32, 32, 16096, 16, 1524, 2200, 908, 16124, 16224, 68, 4,
48290075Sobrien	28, 40, 16112, 16340, 1428, 2220, 1012, 16152, 16200, 64, 8,
48390075Sobrien	24, 52, 16132, 16284, 1328, 2236, 1120, 16192, 16176, 64, 12,
48490075Sobrien	16, 56, 16156, 16236, 1224, 2240, 1224, 16236, 16156, 56, 16,
48590075Sobrien};
48690075Sobrien
487169689Skanstatic const uint16_t filter_12tap_16p_upscale[108] = {
48890075Sobrien	0, 0, 0, 0, 0, 4096, 0, 0, 0, 0, 0, 0,
48990075Sobrien	16376, 24, 16332, 100, 16156, 4068, 260, 16272, 56, 16356, 8, 0,
49090075Sobrien	16368, 44, 16284, 188, 15964, 3988, 548, 16156, 112, 16328, 20, 16380,
49190075Sobrien	16360, 64, 16248, 260, 15812, 3856, 864, 16040, 172, 16296, 32, 16380,
49290075Sobrien	16360, 76, 16216, 320, 15696, 3672, 1196, 15928, 228, 16268, 44, 16376,
49390075Sobrien	16356, 84, 16196, 360, 15620, 3448, 1540, 15820, 280, 16240, 56, 16372,
49490075Sobrien	16356, 88, 16184, 384, 15580, 3188, 1888, 15728, 324, 16216, 68, 16368,
49590075Sobrien	16360, 88, 16180, 392, 15576, 2892, 2236, 15652, 360, 16200, 80, 16364,
49690075Sobrien	16360, 84, 16188, 384, 15600, 2576, 2576, 15600, 384, 16188, 84, 16360,
497169689Skan};
498169689Skan
49990075Sobrienstatic const uint16_t filter_12tap_16p_117[108] = {
500169689Skan	48, 16248, 240, 16028, 436, 3612, 436, 16028, 240, 16248, 48, 0,
50190075Sobrien	44, 16260, 208, 16116, 212, 3596, 676, 15944, 272, 16240, 48, 16380,
50290075Sobrien	40, 16276, 168, 16204, 12, 3540, 932, 15868, 296, 16240, 48, 16380,
503169689Skan	36, 16292, 128, 16288, 16220, 3452, 1196, 15800, 312, 16240, 44, 16380,
504169689Skan	28, 16308, 84, 16372, 16064, 3324, 1472, 15748, 316, 16244, 40, 16380,
50590075Sobrien	24, 16328, 44, 64, 15936, 3168, 1744, 15708, 312, 16256, 32, 16380,
506169689Skan	16, 16344, 8, 132, 15836, 2980, 2016, 15688, 300, 16272, 20, 0,
507169689Skan	12, 16364, 16356, 188, 15760, 2768, 2280, 15688, 272, 16296, 8, 4,
50890075Sobrien	8, 16380, 16324, 236, 15712, 2532, 2532, 15712, 236, 16324, 16380, 8,
50990075Sobrien};
51090075Sobrien
511169689Skanstatic const uint16_t filter_12tap_16p_150[108] = {
512169689Skan	16340, 116, 0, 15916, 1076, 2724, 1076, 15916, 0, 116, 16340, 0,
51390075Sobrien	16340, 100, 32, 15908, 920, 2716, 1232, 15936, 16344, 128, 16340, 0,
514169689Skan	16344, 84, 64, 15908, 772, 2692, 1388, 15968, 16304, 140, 16344, 16380,
515169689Skan	16344, 68, 92, 15912, 624, 2652, 1540, 16008, 16264, 152, 16344, 16380,
51690075Sobrien	16348, 52, 112, 15928, 484, 2592, 1688, 16060, 16220, 160, 16348, 16380,
517169689Skan	16352, 40, 132, 15952, 348, 2520, 1836, 16124, 16176, 168, 16356, 16376,
518169689Skan	16356, 24, 148, 15980, 224, 2436, 1976, 16200, 16132, 172, 16364, 16372,
51990075Sobrien	16360, 12, 160, 16012, 108, 2336, 2104, 16288, 16088, 172, 16372, 16368,
52090075Sobrien	16364, 0, 168, 16048, 0, 2228, 2228, 0, 16048, 168, 0, 16364,
52190075Sobrien};
52290075Sobrien
52390075Sobrienstatic const uint16_t filter_12tap_16p_183[108] = {
524117395Skan	36, 72, 16132, 16228, 1224, 2224, 1224, 16228, 16132, 72, 36, 0,
52590075Sobrien	28, 80, 16156, 16184, 1120, 2224, 1328, 16280, 16112, 64, 40, 16380,
52690075Sobrien	24, 84, 16180, 16144, 1016, 2208, 1428, 16340, 16092, 52, 48, 16380,
527132718Skan	16, 88, 16208, 16112, 912, 2188, 1524, 16, 16072, 36, 56, 16380,
52890075Sobrien	12, 92, 16232, 16084, 812, 2156, 1620, 88, 16056, 24, 64, 16380,
52990075Sobrien	8, 92, 16256, 16064, 708, 2116, 1708, 164, 16044, 4, 68, 16380,
530169689Skan	4, 88, 16280, 16048, 608, 2068, 1792, 244, 16036, 16372, 76, 16380,
53190075Sobrien	0, 88, 16308, 16036, 512, 2008, 1872, 328, 16032, 16352, 80, 16380,
53290075Sobrien	0, 84, 16328, 16032, 416, 1944, 1944, 416, 16032, 16328, 84, 0,
53390075Sobrien};
53490075Sobrien
53590075Sobrienconst uint16_t *wbscl_get_filter_3tap_16p(struct fixed31_32 ratio)
53690075Sobrien{
53790075Sobrien	if (ratio.value < dc_fixpt_one.value)
53890075Sobrien		return filter_3tap_16p_upscale;
53990075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
54090075Sobrien		return filter_3tap_16p_117;
54190075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
54290075Sobrien		return filter_3tap_16p_150;
54390075Sobrien	else
54490075Sobrien		return filter_3tap_16p_183;
54590075Sobrien}
54690075Sobrien
54790075Sobrienconst uint16_t *wbscl_get_filter_4tap_16p(struct fixed31_32 ratio)
548169689Skan{
54990075Sobrien	if (ratio.value < dc_fixpt_one.value)
55090075Sobrien		return filter_4tap_16p_upscale;
55190075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
55290075Sobrien		return filter_4tap_16p_117;
55390075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
55490075Sobrien		return filter_4tap_16p_150;
55590075Sobrien	else
55690075Sobrien		return filter_4tap_16p_183;
55790075Sobrien}
55890075Sobrien
55990075Sobrienstatic const uint16_t *wbscl_get_filter_5tap_16p(struct fixed31_32 ratio)
56090075Sobrien{
561169689Skan	if (ratio.value < dc_fixpt_one.value)
562169689Skan		return filter_5tap_16p_upscale;
563169689Skan	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
564169689Skan		return filter_5tap_16p_117;
56590075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
56690075Sobrien		return filter_5tap_16p_150;
56790075Sobrien	else
56890075Sobrien		return filter_5tap_16p_183;
56990075Sobrien}
57090075Sobrien
57190075Sobrienstatic const uint16_t *wbscl_get_filter_6tap_16p(struct fixed31_32 ratio)
57290075Sobrien{
57390075Sobrien	if (ratio.value < dc_fixpt_one.value)
57490075Sobrien		return filter_6tap_16p_upscale;
57590075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
57690075Sobrien		return filter_6tap_16p_117;
57790075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
57890075Sobrien		return filter_6tap_16p_150;
57990075Sobrien	else
58090075Sobrien		return filter_6tap_16p_183;
58190075Sobrien}
58290075Sobrien
58390075Sobrienstatic const uint16_t *wbscl_get_filter_7tap_16p(struct fixed31_32 ratio)
58490075Sobrien{
58590075Sobrien	if (ratio.value < dc_fixpt_one.value)
58690075Sobrien		return filter_7tap_16p_upscale;
58790075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
58890075Sobrien		return filter_7tap_16p_117;
58990075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
59090075Sobrien		return filter_7tap_16p_150;
59190075Sobrien	else
59290075Sobrien		return filter_7tap_16p_183;
59390075Sobrien}
59490075Sobrien
59590075Sobrienstatic const uint16_t *wbscl_get_filter_8tap_16p(struct fixed31_32 ratio)
59690075Sobrien{
597169689Skan	if (ratio.value < dc_fixpt_one.value)
59890075Sobrien		return filter_8tap_16p_upscale;
59990075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
60090075Sobrien		return filter_8tap_16p_117;
601132718Skan	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
60290075Sobrien		return filter_8tap_16p_150;
60390075Sobrien	else
60490075Sobrien		return filter_8tap_16p_183;
60590075Sobrien}
60690075Sobrien
607169689Skanstatic const uint16_t *wbscl_get_filter_9tap_16p(struct fixed31_32 ratio)
60890075Sobrien{
60990075Sobrien	if (ratio.value < dc_fixpt_one.value)
61090075Sobrien		return filter_9tap_16p_upscale;
61190075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
61290075Sobrien		return filter_9tap_16p_117;
613169689Skan	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
61490075Sobrien		return filter_9tap_16p_150;
61590075Sobrien	else
61690075Sobrien		return filter_9tap_16p_183;
61790075Sobrien}
61890075Sobrienstatic const uint16_t *wbscl_get_filter_10tap_16p(struct fixed31_32 ratio)
619169689Skan{
62090075Sobrien	if (ratio.value < dc_fixpt_one.value)
62190075Sobrien		return filter_10tap_16p_upscale;
62290075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
62390075Sobrien		return filter_10tap_16p_117;
62490075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
62590075Sobrien		return filter_10tap_16p_150;
62690075Sobrien	else
62790075Sobrien		return filter_10tap_16p_183;
62890075Sobrien}
62990075Sobrien
63090075Sobrienstatic const uint16_t *wbscl_get_filter_11tap_16p(struct fixed31_32 ratio)
63190075Sobrien{
63290075Sobrien	if (ratio.value < dc_fixpt_one.value)
63390075Sobrien		return filter_11tap_16p_upscale;
63490075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
635117395Skan		return filter_11tap_16p_117;
63690075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
63790075Sobrien		return filter_11tap_16p_150;
638169689Skan	else
63990075Sobrien		return filter_11tap_16p_183;
64090075Sobrien}
64190075Sobrien
64290075Sobrienstatic const uint16_t *wbscl_get_filter_12tap_16p(struct fixed31_32 ratio)
64390075Sobrien{
64490075Sobrien	if (ratio.value < dc_fixpt_one.value)
64590075Sobrien		return filter_12tap_16p_upscale;
64690075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
64790075Sobrien		return filter_12tap_16p_117;
64890075Sobrien	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
64990075Sobrien		return filter_12tap_16p_150;
65090075Sobrien	else
65190075Sobrien		return filter_12tap_16p_183;
65290075Sobrien}
65390075Sobrien
65490075Sobrienstatic const uint16_t *wbscl_get_filter_coeffs_16p(int taps, struct fixed31_32 ratio)
65590075Sobrien{
656132718Skan	if (taps == 12)
657132718Skan		return wbscl_get_filter_12tap_16p(ratio);
658132718Skan	else if (taps == 11)
659169689Skan		return wbscl_get_filter_11tap_16p(ratio);
660132718Skan	else if (taps == 10)
66190075Sobrien		return wbscl_get_filter_10tap_16p(ratio);
662132718Skan	else if (taps == 9)
663132718Skan		return wbscl_get_filter_9tap_16p(ratio);
66490075Sobrien	else if (taps == 8)
66590075Sobrien		return wbscl_get_filter_8tap_16p(ratio);
66690075Sobrien	else if (taps == 7)
667132718Skan		return wbscl_get_filter_7tap_16p(ratio);
668132718Skan	else if (taps == 6)
669132718Skan		return wbscl_get_filter_6tap_16p(ratio);
670132718Skan	else if (taps == 5)
671132718Skan		return wbscl_get_filter_5tap_16p(ratio);
672132718Skan	else if (taps == 4)
673169689Skan		return wbscl_get_filter_4tap_16p(ratio);
674132718Skan	else if (taps == 3)
675132718Skan		return wbscl_get_filter_3tap_16p(ratio);
676132718Skan	else if (taps == 2)
677132718Skan		return get_filter_2tap_16p();
678132718Skan	else if (taps == 1)
679169689Skan		return NULL;
680169689Skan	else {
681169689Skan		/* should never happen, bug */
682169689Skan		BREAK_TO_DEBUGGER();
683132718Skan		return NULL;
684132718Skan	}
685132718Skan}
686132718Skan
687132718Skanstatic void wbscl_set_scaler_filter(
688132718Skan	struct dcn20_dwbc *dwbc20,
689132718Skan	uint32_t taps,
690132718Skan	enum wbscl_coef_filter_type_sel filter_type,
691259694Spfg	const uint16_t *filter)
692259694Spfg{
693132718Skan	const int tap_pairs = (taps + 1) / 2;
694132718Skan	int phase;
695132718Skan	int pair;
696132718Skan	uint16_t odd_coef, even_coef;
697132718Skan
698132718Skan	for (phase = 0; phase < (NUM_PHASES / 2 + 1); phase++) {
699132718Skan		for (pair = 0; pair < tap_pairs; pair++) {
700132718Skan			even_coef = filter[phase * taps + 2 * pair];
701132718Skan			if ((pair * 2 + 1) < taps)
702132718Skan				odd_coef = filter[phase * taps + 2 * pair + 1];
703132718Skan			else
704132718Skan				odd_coef = 0;
70590075Sobrien
70690075Sobrien			REG_SET_3(WBSCL_COEF_RAM_SELECT, 0,
707132718Skan				WBSCL_COEF_RAM_TAP_PAIR_IDX, pair,
70890075Sobrien				WBSCL_COEF_RAM_PHASE, phase,
70990075Sobrien				WBSCL_COEF_RAM_FILTER_TYPE, filter_type);
710132718Skan
711132718Skan			REG_SET_4(WBSCL_COEF_RAM_TAP_DATA, 0,
712132718Skan				/* Even tap coefficient (bits 1:0 fixed to 0) */
713132718Skan				WBSCL_COEF_RAM_EVEN_TAP_COEF, even_coef,
714132718Skan				/* Write/read control for even coefficient */
715132718Skan				WBSCL_COEF_RAM_EVEN_TAP_COEF_EN, 1,
716132718Skan				/* Odd tap coefficient (bits 1:0 fixed to 0) */
71790075Sobrien				WBSCL_COEF_RAM_ODD_TAP_COEF, odd_coef,
71890075Sobrien				/* Write/read control for odd coefficient */
71990075Sobrien				WBSCL_COEF_RAM_ODD_TAP_COEF_EN, 1);
72090075Sobrien		}
72190075Sobrien	}
72290075Sobrien}
72390075Sobrien
724132718Skanbool dwb_program_horz_scalar(struct dcn20_dwbc *dwbc20,
72590075Sobrien		uint32_t src_width,
72690075Sobrien		uint32_t dest_width,
72790075Sobrien		struct scaling_taps num_taps)
72890075Sobrien{
72990075Sobrien	uint32_t h_ratio_luma = 1;
73090075Sobrien	uint32_t h_taps_luma = num_taps.h_taps;
73190075Sobrien	uint32_t h_taps_chroma = num_taps.h_taps_c;
73290075Sobrien	int32_t h_init_phase_luma = 0;
73390075Sobrien	int32_t h_init_phase_chroma = 0;
73490075Sobrien	uint32_t h_init_phase_luma_int = 0;
73590075Sobrien	uint32_t h_init_phase_luma_frac = 0;
73690075Sobrien	uint32_t h_init_phase_chroma_int = 0;
73790075Sobrien	uint32_t h_init_phase_chroma_frac = 0;
73890075Sobrien	const uint16_t *filter_h = NULL;
73990075Sobrien	const uint16_t *filter_h_c = NULL;
74090075Sobrien
74190075Sobrien
74290075Sobrien	struct fixed31_32 tmp_h_init_phase_luma = dc_fixpt_from_int(0);
743132718Skan	struct fixed31_32 tmp_h_init_phase_chroma = dc_fixpt_from_int(0);
74490075Sobrien
74590075Sobrien
746132718Skan	/*Calculate ratio*/
747169689Skan	struct fixed31_32 tmp_h_ratio_luma = dc_fixpt_from_fraction(
748132718Skan		src_width, dest_width);
749169689Skan
750169689Skan	if (dc_fixpt_floor(tmp_h_ratio_luma) == 8)
751169689Skan		h_ratio_luma = -1;
752169689Skan	else
753169689Skan		h_ratio_luma = dc_fixpt_u3d19(tmp_h_ratio_luma) << 5;
754132718Skan
755132718Skan	/*Program ratio*/
75690075Sobrien	REG_UPDATE(WBSCL_HORZ_FILTER_SCALE_RATIO, WBSCL_H_SCALE_RATIO, h_ratio_luma);
757132718Skan
758132718Skan	/* Program taps*/
759132718Skan	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_H_NUM_OF_TAPS_Y_RGB, h_taps_luma - 1);
760132718Skan	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_H_NUM_OF_TAPS_CBCR, h_taps_chroma - 1);
76190075Sobrien
762169689Skan	/* Calculate phase*/
76390075Sobrien	tmp_h_init_phase_luma = dc_fixpt_add_int(tmp_h_ratio_luma, h_taps_luma + 1);
76490075Sobrien	tmp_h_init_phase_luma = dc_fixpt_div_int(tmp_h_init_phase_luma, 2);
76590075Sobrien	tmp_h_init_phase_luma = dc_fixpt_sub_int(tmp_h_init_phase_luma, h_taps_luma);
76690075Sobrien
767132718Skan	h_init_phase_luma = dc_fixpt_s4d19(tmp_h_init_phase_luma);
76890075Sobrien	h_init_phase_luma_int = (h_init_phase_luma >> 19) & 0x1f;
76990075Sobrien	h_init_phase_luma_frac = (h_init_phase_luma & 0x7ffff) << 5;
77090075Sobrien
77190075Sobrien	tmp_h_init_phase_chroma = dc_fixpt_mul_int(tmp_h_ratio_luma, 2);
772169689Skan	tmp_h_init_phase_chroma = dc_fixpt_add_int(tmp_h_init_phase_chroma, h_taps_chroma + 1);
77390075Sobrien	tmp_h_init_phase_chroma = dc_fixpt_div_int(tmp_h_init_phase_chroma, 2);
774169689Skan	tmp_h_init_phase_chroma = dc_fixpt_sub_int(tmp_h_init_phase_chroma, h_taps_chroma);
77590075Sobrien	tmp_h_init_phase_chroma = dc_fixpt_add(tmp_h_init_phase_chroma, dc_fixpt_from_fraction(1, 4));
776117395Skan
77790075Sobrien	h_init_phase_chroma = dc_fixpt_s4d19(tmp_h_init_phase_chroma);
77890075Sobrien	h_init_phase_chroma_int = (h_init_phase_chroma >> 19) & 0x1f;
77990075Sobrien	h_init_phase_chroma_frac = (h_init_phase_chroma & 0x7ffff) << 5;
78090075Sobrien
78190075Sobrien	/* Program phase*/
78290075Sobrien	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_Y_RGB, WBSCL_H_INIT_INT_Y_RGB, h_init_phase_luma_int);
783132718Skan	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_Y_RGB, WBSCL_H_INIT_FRAC_Y_RGB, h_init_phase_luma_frac);
78490075Sobrien	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_CBCR, WBSCL_H_INIT_INT_CBCR, h_init_phase_chroma_int);
78590075Sobrien	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_CBCR, WBSCL_H_INIT_FRAC_CBCR, h_init_phase_chroma_frac);
78690075Sobrien
78790075Sobrien	/* Program LUT coefficients*/
78890075Sobrien	filter_h = wbscl_get_filter_coeffs_16p(
78990075Sobrien		h_taps_luma, tmp_h_ratio_luma);
79090075Sobrien	filter_h_c = wbscl_get_filter_coeffs_16p(
79190075Sobrien		h_taps_chroma, dc_fixpt_from_int(h_ratio_luma * 2));
79290075Sobrien
79390075Sobrien	wbscl_set_scaler_filter(dwbc20, h_taps_luma,
79490075Sobrien		WBSCL_COEF_LUMA_HORZ_FILTER, filter_h);
79590075Sobrien
79690075Sobrien	wbscl_set_scaler_filter(dwbc20, h_taps_chroma,
79790075Sobrien		WBSCL_COEF_CHROMA_HORZ_FILTER, filter_h_c);
79890075Sobrien
79990075Sobrien	return true;
80090075Sobrien}
80190075Sobrien
80290075Sobrienbool dwb_program_vert_scalar(struct dcn20_dwbc *dwbc20,
80390075Sobrien		uint32_t src_height,
804169689Skan		uint32_t dest_height,
805169689Skan		struct scaling_taps num_taps,
80690075Sobrien		enum dwb_subsample_position subsample_position)
80790075Sobrien{
80890075Sobrien	uint32_t v_ratio_luma = 1;
80990075Sobrien	uint32_t v_taps_luma = num_taps.v_taps;
81090075Sobrien	uint32_t v_taps_chroma = num_taps.v_taps_c;
81190075Sobrien	int32_t v_init_phase_luma = 0;
81290075Sobrien	int32_t v_init_phase_chroma = 0;
81390075Sobrien	uint32_t v_init_phase_luma_int = 0;
81490075Sobrien	uint32_t v_init_phase_luma_frac = 0;
81590075Sobrien	uint32_t v_init_phase_chroma_int = 0;
81690075Sobrien	uint32_t v_init_phase_chroma_frac = 0;
81790075Sobrien
81890075Sobrien	const uint16_t *filter_v = NULL;
81990075Sobrien	const uint16_t *filter_v_c = NULL;
82090075Sobrien
82190075Sobrien	struct fixed31_32 tmp_v_init_phase_luma = dc_fixpt_from_int(0);
82290075Sobrien	struct fixed31_32 tmp_v_init_phase_chroma = dc_fixpt_from_int(0);
82390075Sobrien
824169689Skan	/*Calculate ratio*/
825169689Skan	struct fixed31_32 tmp_v_ratio_luma = dc_fixpt_from_fraction(
82690075Sobrien		src_height, dest_height);
827169689Skan
82890075Sobrien	if (dc_fixpt_floor(tmp_v_ratio_luma) == 8)
82990075Sobrien		v_ratio_luma = -1;
83090075Sobrien	else
83190075Sobrien		v_ratio_luma = dc_fixpt_u3d19(tmp_v_ratio_luma) << 5;
83290075Sobrien
83390075Sobrien	/*Program ratio*/
83490075Sobrien	REG_UPDATE(WBSCL_VERT_FILTER_SCALE_RATIO, WBSCL_V_SCALE_RATIO, v_ratio_luma);
83590075Sobrien
83690075Sobrien	/* Program taps*/
83790075Sobrien	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_V_NUM_OF_TAPS_Y_RGB, v_taps_luma - 1);
83890075Sobrien	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_V_NUM_OF_TAPS_CBCR, v_taps_chroma - 1);
83990075Sobrien
84090075Sobrien	/* Calculate phase*/
84190075Sobrien	tmp_v_init_phase_luma = dc_fixpt_add_int(tmp_v_ratio_luma, v_taps_luma + 1);
84290075Sobrien	tmp_v_init_phase_luma = dc_fixpt_div_int(tmp_v_init_phase_luma, 2);
84390075Sobrien	tmp_v_init_phase_luma = dc_fixpt_sub_int(tmp_v_init_phase_luma, v_taps_luma);
84490075Sobrien
84590075Sobrien	v_init_phase_luma = dc_fixpt_s4d19(tmp_v_init_phase_luma);
84690075Sobrien	v_init_phase_luma_int = (v_init_phase_luma >> 19) & 0x1f;
84790075Sobrien	v_init_phase_luma_frac = (v_init_phase_luma & 0x7ffff) << 5;
84890075Sobrien
84990075Sobrien	tmp_v_init_phase_chroma = dc_fixpt_mul_int(tmp_v_ratio_luma, 2);
85090075Sobrien	tmp_v_init_phase_chroma = dc_fixpt_add_int(tmp_v_init_phase_chroma, v_taps_chroma + 1);
85190075Sobrien	tmp_v_init_phase_chroma = dc_fixpt_div_int(tmp_v_init_phase_chroma, 2);
85290075Sobrien	tmp_v_init_phase_chroma = dc_fixpt_sub_int(tmp_v_init_phase_chroma, v_taps_chroma);
85390075Sobrien	if (subsample_position == DWB_COSITED_SUBSAMPLING)
85490075Sobrien		tmp_v_init_phase_chroma = dc_fixpt_add(tmp_v_init_phase_chroma, dc_fixpt_from_fraction(1, 4));
85590075Sobrien
85690075Sobrien	v_init_phase_chroma = dc_fixpt_s4d19(tmp_v_init_phase_chroma);
85790075Sobrien	v_init_phase_chroma_int = (v_init_phase_chroma >> 19) & 0x1f;
85890075Sobrien	v_init_phase_chroma_frac = (v_init_phase_chroma & 0x7ffff) << 5;
85990075Sobrien
86090075Sobrien	/* Program phase*/
86190075Sobrien	REG_UPDATE(WBSCL_VERT_FILTER_INIT_Y_RGB, WBSCL_V_INIT_INT_Y_RGB, v_init_phase_luma_int);
862169689Skan	REG_UPDATE(WBSCL_VERT_FILTER_INIT_Y_RGB, WBSCL_V_INIT_FRAC_Y_RGB, v_init_phase_luma_frac);
86390075Sobrien	REG_UPDATE(WBSCL_VERT_FILTER_INIT_CBCR, WBSCL_V_INIT_INT_CBCR, v_init_phase_chroma_int);
86490075Sobrien	REG_UPDATE(WBSCL_VERT_FILTER_INIT_CBCR, WBSCL_V_INIT_FRAC_CBCR, v_init_phase_chroma_frac);
865132718Skan
86690075Sobrien
86790075Sobrien	/* Program LUT coefficients*/
86890075Sobrien	filter_v  = wbscl_get_filter_coeffs_16p(
86990075Sobrien		v_taps_luma, tmp_v_ratio_luma);
87090075Sobrien	filter_v_c = wbscl_get_filter_coeffs_16p(
87190075Sobrien		v_taps_chroma, dc_fixpt_from_int(v_ratio_luma * 2));
87290075Sobrien	wbscl_set_scaler_filter(dwbc20, v_taps_luma,
87390075Sobrien		WBSCL_COEF_LUMA_VERT_FILTER, filter_v);
87490075Sobrien
87590075Sobrien	wbscl_set_scaler_filter(dwbc20, v_taps_chroma,
87690075Sobrien		WBSCL_COEF_CHROMA_VERT_FILTER, filter_v_c);
877169689Skan	return true;
878169689Skan}
879169689Skan