1 /*
2  * Copyright (C) 2017 Jernej Skrabec <jernej.skrabec@siol.net>
3  *
4  * Coefficients are taken from BSP driver, which is:
5  * Copyright (C) 2014-2015 Allwinner
6  *
7  * This file is licensed under the terms of the GNU General Public
8  * License version 2.  This program is licensed "as is" without any
9  * warranty of any kind, whether express or implied.
10  */
11 
12 #include "sun8i_vi_scaler.h"
13 
14 static const u32 lan3coefftab32_left[480] = {
15 	0x40000000, 0x40fe0000, 0x3ffd0100, 0x3efc0100,
16 	0x3efb0100, 0x3dfa0200, 0x3cf90200, 0x3bf80200,
17 	0x39f70200, 0x37f70200, 0x35f70200, 0x33f70200,
18 	0x31f70200, 0x2ef70200, 0x2cf70200, 0x2af70200,
19 	0x27f70200, 0x24f80100, 0x22f80100, 0x1ef90100,
20 	0x1cf90100, 0x19fa0100, 0x17fa0100, 0x14fb0100,
21 	0x11fc0000, 0x0ffc0000, 0x0cfd0000, 0x0afd0000,
22 	0x08fe0000, 0x05ff0000, 0x03ff0000, 0x02000000,
23 
24 	0x3806fc02, 0x3805fc02, 0x3803fd01, 0x3801fe01,
25 	0x3700fe01, 0x35ffff01, 0x35fdff01, 0x34fc0001,
26 	0x34fb0000, 0x33fa0000, 0x31fa0100, 0x2ff90100,
27 	0x2df80200, 0x2bf80200, 0x2af70200, 0x28f70200,
28 	0x27f70200, 0x24f70300, 0x22f70300, 0x1ff70300,
29 	0x1ef70300, 0x1cf70300, 0x1af70300, 0x18f70300,
30 	0x16f80300, 0x13f80300, 0x11f90300, 0x0ef90300,
31 	0x0efa0200, 0x0cfa0200, 0x0afb0200, 0x08fb0200,
32 
33 	0x320bfa02, 0x3309fa02, 0x3208fb02, 0x3206fb02,
34 	0x3205fb02, 0x3104fc02, 0x3102fc01, 0x3001fd01,
35 	0x3000fd01, 0x2ffffd01, 0x2efefe01, 0x2dfdfe01,
36 	0x2bfcff01, 0x29fcff01, 0x28fbff01, 0x27fa0001,
37 	0x26fa0000, 0x24f90000, 0x22f90100, 0x20f90100,
38 	0x1ff80100, 0x1ef80100, 0x1cf80100, 0x1af80200,
39 	0x18f80200, 0x17f80200, 0x15f80200, 0x12f80200,
40 	0x11f90200, 0x0ff90200, 0x0df90200, 0x0cfa0200,
41 
42 	0x2e0efa01, 0x2f0dfa01, 0x2f0bfa01, 0x2e0afa01,
43 	0x2e09fa01, 0x2e07fb01, 0x2d06fb01, 0x2d05fb01,
44 	0x2c04fb01, 0x2b03fc01, 0x2a02fc01, 0x2a01fc01,
45 	0x2800fd01, 0x28fffd01, 0x26fefd01, 0x25fefe01,
46 	0x24fdfe01, 0x23fcfe01, 0x21fcff01, 0x20fbff01,
47 	0x1efbff01, 0x1efbff00, 0x1cfa0000, 0x1bfa0000,
48 	0x19fa0000, 0x18fa0000, 0x17f90000, 0x15f90100,
49 	0x14f90100, 0x12f90100, 0x11f90100, 0x0ff90100,
50 
51 	0x2b10fa00, 0x2b0ffa00, 0x2b0efa00, 0x2b0cfa00,
52 	0x2b0bfa00, 0x2a0afb01, 0x2a09fb01, 0x2908fb01,
53 	0x2807fb01, 0x2806fb01, 0x2805fb01, 0x2604fc01,
54 	0x2503fc01, 0x2502fc01, 0x2401fc01, 0x2301fc01,
55 	0x2100fd01, 0x21fffd01, 0x21fffd01, 0x20fefd01,
56 	0x1dfefe01, 0x1cfdfe01, 0x1cfdfe00, 0x1bfcfe00,
57 	0x19fcff00, 0x19fbff00, 0x17fbff00, 0x16fbff00,
58 	0x15fbff00, 0x14fb0000, 0x13fa0000, 0x11fa0000,
59 
60 	0x2811fcff, 0x2810fcff, 0x280ffbff, 0x280efbff,
61 	0x270dfb00, 0x270cfb00, 0x270bfb00, 0x260afb00,
62 	0x2609fb00, 0x2508fb00, 0x2507fb00, 0x2407fb00,
63 	0x2406fc00, 0x2305fc00, 0x2204fc00, 0x2203fc00,
64 	0x2103fc00, 0x2002fc00, 0x1f01fd00, 0x1e01fd00,
65 	0x1d00fd00, 0x1dfffd00, 0x1cfffd00, 0x1bfefd00,
66 	0x1afefe00, 0x19fefe00, 0x18fdfe00, 0x17fdfe00,
67 	0x16fdfe00, 0x15fcff00, 0x13fcff00, 0x12fcff00,
68 
69 	0x2512fdfe, 0x2511fdff, 0x2410fdff, 0x240ffdff,
70 	0x240efcff, 0x240dfcff, 0x240dfcff, 0x240cfcff,
71 	0x230bfcff, 0x230afc00, 0x2209fc00, 0x2108fc00,
72 	0x2108fc00, 0x2007fc00, 0x2006fc00, 0x2005fc00,
73 	0x1f05fc00, 0x1e04fc00, 0x1e03fc00, 0x1c03fd00,
74 	0x1c02fd00, 0x1b02fd00, 0x1b01fd00, 0x1a00fd00,
75 	0x1900fd00, 0x1800fd00, 0x17fffe00, 0x16fffe00,
76 	0x16fefe00, 0x14fefe00, 0x13fefe00, 0x13fdfe00,
77 
78 	0x2212fffe, 0x2211fefe, 0x2211fefe, 0x2110fefe,
79 	0x210ffeff, 0x220efdff, 0x210dfdff, 0x210dfdff,
80 	0x210cfdff, 0x210bfdff, 0x200afdff, 0x200afdff,
81 	0x1f09fdff, 0x1f08fdff, 0x1d08fd00, 0x1c07fd00,
82 	0x1d06fd00, 0x1b06fd00, 0x1b05fd00, 0x1c04fd00,
83 	0x1b04fd00, 0x1a03fd00, 0x1a03fd00, 0x1902fd00,
84 	0x1802fd00, 0x1801fd00, 0x1701fd00, 0x1600fd00,
85 	0x1400fe00, 0x1400fe00, 0x14fffe00, 0x13fffe00,
86 
87 	0x201200fe, 0x201100fe, 0x1f11fffe, 0x2010fffe,
88 	0x1f0ffffe, 0x1e0ffffe, 0x1f0efeff, 0x1f0dfeff,
89 	0x1f0dfeff, 0x1e0cfeff, 0x1e0bfeff, 0x1d0bfeff,
90 	0x1d0afeff, 0x1d09fdff, 0x1d09fdff, 0x1c08fdff,
91 	0x1c07fdff, 0x1b07fd00, 0x1b06fd00, 0x1a06fd00,
92 	0x1a05fd00, 0x1805fd00, 0x1904fd00, 0x1804fd00,
93 	0x1703fd00, 0x1703fd00, 0x1602fe00, 0x1502fe00,
94 	0x1501fe00, 0x1401fe00, 0x1301fe00, 0x1300fe00,
95 
96 	0x1c1202fe, 0x1c1102fe, 0x1b1102fe, 0x1c1001fe,
97 	0x1b1001fe, 0x1b0f01ff, 0x1b0e00ff, 0x1b0e00ff,
98 	0x1b0d00ff, 0x1a0d00ff, 0x1a0c00ff, 0x1a0cffff,
99 	0x1a0bffff, 0x1a0bffff, 0x1a0affff, 0x180affff,
100 	0x1909ffff, 0x1809ffff, 0x1808ffff, 0x1808feff,
101 	0x1807feff, 0x1707fe00, 0x1606fe00, 0x1506fe00,
102 	0x1605fe00, 0x1505fe00, 0x1504fe00, 0x1304fe00,
103 	0x1304fe00, 0x1303fe00, 0x1203fe00, 0x1203fe00,
104 
105 	0x181104ff, 0x191103ff, 0x191003ff, 0x181003ff,
106 	0x180f03ff, 0x190f02ff, 0x190e02ff, 0x180e02ff,
107 	0x180d02ff, 0x180d01ff, 0x180d01ff, 0x180c01ff,
108 	0x180c01ff, 0x180b00ff, 0x170b00ff, 0x170a00ff,
109 	0x170a00ff, 0x170900ff, 0x160900ff, 0x160900ff,
110 	0x1608ffff, 0x1508ffff, 0x1507ff00, 0x1507ff00,
111 	0x1407ff00, 0x1306ff00, 0x1306ff00, 0x1305ff00,
112 	0x1205ff00, 0x1105ff00, 0x1204ff00, 0x1104ff00,
113 
114 	0x171005ff, 0x171005ff, 0x171004ff, 0x170f04ff,
115 	0x160f04ff, 0x170f03ff, 0x170e03ff, 0x160e03ff,
116 	0x160d03ff, 0x160d02ff, 0x160d02ff, 0x160c02ff,
117 	0x160c02ff, 0x160c02ff, 0x160b01ff, 0x150b01ff,
118 	0x150a01ff, 0x150a01ff, 0x150a01ff, 0x140901ff,
119 	0x14090000, 0x14090000, 0x14080000, 0x13080000,
120 	0x13070000, 0x12070000, 0x12070000, 0x12060000,
121 	0x11060000, 0x11060000, 0x11050000, 0x1105ff00,
122 
123 	0x14100600, 0x15100500, 0x150f0500, 0x150f0500,
124 	0x140f0500, 0x150e0400, 0x140e0400, 0x130e0400,
125 	0x140d0400, 0x150d0300, 0x130d0300, 0x140c0300,
126 	0x140c0300, 0x140c0200, 0x140b0200, 0x130b0200,
127 	0x120b0200, 0x130a0200, 0x130a0200, 0x130a0100,
128 	0x13090100, 0x12090100, 0x11090100, 0x12080100,
129 	0x11080100, 0x10080100, 0x11070100, 0x11070000,
130 	0x10070000, 0x11060000, 0x10060000, 0x10060000,
131 
132 	0x140f0600, 0x140f0600, 0x130f0600, 0x140f0500,
133 	0x140e0500, 0x130e0500, 0x130e0500, 0x140d0400,
134 	0x140d0400, 0x130d0400, 0x120d0400, 0x130c0400,
135 	0x130c0300, 0x130c0300, 0x130b0300, 0x130b0300,
136 	0x110b0300, 0x130a0200, 0x120a0200, 0x120a0200,
137 	0x120a0200, 0x12090200, 0x10090200, 0x11090100,
138 	0x11080100, 0x11080100, 0x10080100, 0x10080100,
139 	0x10070100, 0x10070100, 0x0f070100, 0x10060100,
140 
141 	0x120f0701, 0x130f0601, 0x130e0601, 0x130e0601,
142 	0x120e0601, 0x130e0501, 0x130e0500, 0x130d0500,
143 	0x120d0500, 0x120d0500, 0x130c0400, 0x130c0400,
144 	0x120c0400, 0x110c0400, 0x120b0400, 0x120b0300,
145 	0x120b0300, 0x120b0300, 0x120a0300, 0x110a0300,
146 	0x110a0200, 0x11090200, 0x11090200, 0x10090200,
147 	0x10090200, 0x10080200, 0x10080200, 0x10080100,
148 	0x0f080100, 0x10070100, 0x0f070100, 0x0f070100
149 };
150 
151 static const u32 lan3coefftab32_right[480] = {
152 	0x00000000, 0x00000002, 0x0000ff04, 0x0000ff06,
153 	0x0000fe08, 0x0000fd0a, 0x0000fd0c, 0x0000fc0f,
154 	0x0000fc12, 0x0001fb14, 0x0001fa17, 0x0001fa19,
155 	0x0001f91c, 0x0001f91f, 0x0001f822, 0x0001f824,
156 	0x0002f727, 0x0002f72a, 0x0002f72c, 0x0002f72f,
157 	0x0002f731, 0x0002f733, 0x0002f735, 0x0002f737,
158 	0x0002f73a, 0x0002f83b, 0x0002f93c, 0x0002fa3d,
159 	0x0001fb3e, 0x0001fc3f, 0x0001fd40, 0x0000fe40,
160 
161 	0x0002fc06, 0x0002fb08, 0x0002fb0a, 0x0002fa0c,
162 	0x0002fa0e, 0x0003f910, 0x0003f912, 0x0003f814,
163 	0x0003f816, 0x0003f719, 0x0003f71a, 0x0003f71d,
164 	0x0003f71f, 0x0003f721, 0x0003f723, 0x0003f725,
165 	0x0002f727, 0x0002f729, 0x0002f72b, 0x0002f82d,
166 	0x0002f82e, 0x0001f930, 0x0001fa31, 0x0000fa34,
167 	0x0000fb34, 0x0100fc35, 0x01fffd36, 0x01ffff37,
168 	0x01fe0037, 0x01fe0138, 0x01fd0338, 0x02fc0538,
169 
170 	0x0002fa0b, 0x0002fa0c, 0x0002f90e, 0x0002f910,
171 	0x0002f911, 0x0002f813, 0x0002f816, 0x0002f817,
172 	0x0002f818, 0x0002f81a, 0x0001f81c, 0x0001f81e,
173 	0x0001f820, 0x0001f921, 0x0001f923, 0x0000f925,
174 	0x0000fa26, 0x0100fa28, 0x01fffb29, 0x01fffc2a,
175 	0x01fffc2c, 0x01fefd2d, 0x01fefe2e, 0x01fdff2f,
176 	0x01fd0030, 0x01fd0130, 0x01fc0232, 0x02fc0432,
177 	0x02fb0532, 0x02fb0633, 0x02fb0833, 0x02fa0933,
178 
179 	0x0001fa0e, 0x0001f90f, 0x0001f911, 0x0001f913,
180 	0x0001f914, 0x0001f915, 0x0000f918, 0x0000fa18,
181 	0x0000fa1a, 0x0000fa1b, 0x0000fa1d, 0x00fffb1e,
182 	0x01fffb1f, 0x01fffb20, 0x01fffc22, 0x01fefc23,
183 	0x01fefd24, 0x01fefe25, 0x01fdfe27, 0x01fdff28,
184 	0x01fd0029, 0x01fc012a, 0x01fc022b, 0x01fc032b,
185 	0x01fb042d, 0x01fb052d, 0x01fb062e, 0x01fb072e,
186 	0x01fa092e, 0x01fa0a2f, 0x01fa0b2f, 0x01fa0d2f,
187 
188 	0x0000fa11, 0x0000fa12, 0x0000fa13, 0x0000fb14,
189 	0x00fffb16, 0x00fffb16, 0x00fffb17, 0x00fffb19,
190 	0x00fffc1a, 0x00fefc1c, 0x00fefd1c, 0x01fefd1d,
191 	0x01fefe1e, 0x01fdfe20, 0x01fdff21, 0x01fdff22,
192 	0x01fd0023, 0x01fc0124, 0x01fc0124, 0x01fc0225,
193 	0x01fc0326, 0x01fc0427, 0x01fb0528, 0x01fb0629,
194 	0x01fb0729, 0x01fb0829, 0x01fb092a, 0x01fb0a2a,
195 	0x00fa0b2c, 0x00fa0c2b, 0x00fa0e2b, 0x00fa0f2c,
196 
197 	0x00fffc11, 0x00fffc12, 0x00fffc14, 0x00fffc15,
198 	0x00fefd16, 0x00fefd17, 0x00fefd18, 0x00fefe19,
199 	0x00fefe1a, 0x00fdfe1d, 0x00fdff1d, 0x00fdff1e,
200 	0x00fd001d, 0x00fd011e, 0x00fd0120, 0x00fc0221,
201 	0x00fc0321, 0x00fc0323, 0x00fc0423, 0x00fc0523,
202 	0x00fc0624, 0x00fb0725, 0x00fb0726, 0x00fb0827,
203 	0x00fb0926, 0x00fb0a26, 0x00fb0b27, 0x00fb0c27,
204 	0x00fb0d27, 0xfffb0e28, 0xfffb0f29, 0xfffc1028,
205 
206 	0x00fefd13, 0x00fefd13, 0x00fefe14, 0x00fefe15,
207 	0x00fefe17, 0x00feff17, 0x00feff17, 0x00fd0018,
208 	0x00fd001a, 0x00fd001a, 0x00fd011b, 0x00fd021c,
209 	0x00fd021c, 0x00fd031d, 0x00fc031f, 0x00fc041f,
210 	0x00fc051f, 0x00fc0521, 0x00fc0621, 0x00fc0721,
211 	0x00fc0821, 0x00fc0822, 0x00fc0922, 0x00fc0a23,
212 	0xfffc0b24, 0xfffc0c24, 0xfffc0d24, 0xfffc0d25,
213 	0xfffc0e25, 0xfffd0f25, 0xfffd1025, 0xfffd1125,
214 
215 	0x00feff12, 0x00feff14, 0x00feff14, 0x00fe0015,
216 	0x00fe0015, 0x00fd0017, 0x00fd0118, 0x00fd0118,
217 	0x00fd0218, 0x00fd0219, 0x00fd031a, 0x00fd031a,
218 	0x00fd041b, 0x00fd041c, 0x00fd051c, 0x00fd061d,
219 	0x00fd061d, 0x00fd071e, 0x00fd081e, 0xfffd081f,
220 	0xfffd091f, 0xfffd0a20, 0xfffd0a20, 0xfffd0b21,
221 	0xfffd0c21, 0xfffd0d21, 0xfffd0d22, 0xfffd0e23,
222 	0xfffe0f22, 0xfefe1022, 0xfefe1122, 0xfefe1123,
223 
224 	0x00fe0012, 0x00fe0013, 0x00fe0114, 0x00fe0114,
225 	0x00fe0116, 0x00fe0216, 0x00fe0216, 0x00fd0317,
226 	0x00fd0317, 0x00fd0418, 0x00fd0419, 0x00fd0519,
227 	0x00fd051a, 0x00fd061b, 0x00fd061b, 0x00fd071c,
228 	0xfffd071e, 0xfffd081d, 0xfffd091d, 0xfffd091e,
229 	0xfffe0a1d, 0xfffe0b1e, 0xfffe0b1e, 0xfffe0c1e,
230 	0xfffe0d1f, 0xfffe0d1f, 0xfffe0e1f, 0xfeff0f1f,
231 	0xfeff0f20, 0xfeff1020, 0xfeff1120, 0xfe001120,
232 
233 	0x00fe0212, 0x00fe0312, 0x00fe0313, 0x00fe0314,
234 	0x00fe0414, 0x00fe0414, 0x00fe0416, 0x00fe0515,
235 	0x00fe0516, 0x00fe0616, 0x00fe0617, 0x00fe0717,
236 	0xfffe0719, 0xfffe0818, 0xffff0818, 0xffff0919,
237 	0xffff0919, 0xffff0a19, 0xffff0a1a, 0xffff0b1a,
238 	0xffff0b1b, 0xffff0c1a, 0xff000c1b, 0xff000d1b,
239 	0xff000d1b, 0xff000e1b, 0xff000e1c, 0xff010f1c,
240 	0xfe01101c, 0xfe01101d, 0xfe02111c, 0xfe02111c,
241 
242 	0x00ff0411, 0x00ff0411, 0x00ff0412, 0x00ff0512,
243 	0x00ff0513, 0x00ff0513, 0x00ff0613, 0x00ff0614,
244 	0x00ff0714, 0x00ff0715, 0x00ff0715, 0xffff0816,
245 	0xffff0816, 0xff000916, 0xff000917, 0xff000918,
246 	0xff000a17, 0xff000a18, 0xff000b18, 0xff000b18,
247 	0xff010c18, 0xff010c19, 0xff010d18, 0xff010d18,
248 	0xff020d18, 0xff020e19, 0xff020e19, 0xff020f19,
249 	0xff030f19, 0xff031019, 0xff031019, 0xff031119,
250 
251 	0x00ff0511, 0x00ff0511, 0x00000511, 0x00000611,
252 	0x00000612, 0x00000612, 0x00000712, 0x00000713,
253 	0x00000714, 0x00000814, 0x00000814, 0x00000914,
254 	0x00000914, 0xff010914, 0xff010a15, 0xff010a16,
255 	0xff010a17, 0xff010b16, 0xff010b16, 0xff020c16,
256 	0xff020c16, 0xff020c16, 0xff020d16, 0xff020d17,
257 	0xff030d17, 0xff030e17, 0xff030e17, 0xff030f17,
258 	0xff040f17, 0xff040f17, 0xff041017, 0xff051017,
259 
260 	0x00000610, 0x00000610, 0x00000611, 0x00000611,
261 	0x00000711, 0x00000712, 0x00010712, 0x00010812,
262 	0x00010812, 0x00010812, 0x00010913, 0x00010913,
263 	0x00010913, 0x00010a13, 0x00020a13, 0x00020a14,
264 	0x00020b14, 0x00020b14, 0x00020b14, 0x00020c14,
265 	0x00030c14, 0x00030c15, 0x00030d15, 0x00030d15,
266 	0x00040d15, 0x00040e15, 0x00040e15, 0x00040e16,
267 	0x00050f15, 0x00050f15, 0x00050f16, 0x00051015,
268 
269 	0x00000611, 0x00010610, 0x00010710, 0x00010710,
270 	0x00010711, 0x00010811, 0x00010811, 0x00010812,
271 	0x00010812, 0x00010912, 0x00020912, 0x00020912,
272 	0x00020a12, 0x00020a12, 0x00020a13, 0x00020a13,
273 	0x00030b13, 0x00030b13, 0x00030b14, 0x00030c13,
274 	0x00030c13, 0x00040c13, 0x00040d14, 0x00040d14,
275 	0x00040d15, 0x00040d15, 0x00050e14, 0x00050e14,
276 	0x00050e15, 0x00050f14, 0x00060f14, 0x00060f14,
277 
278 	0x0001070f, 0x0001070f, 0x00010710, 0x00010710,
279 	0x00010810, 0x00010810, 0x00020810, 0x00020811,
280 	0x00020911, 0x00020911, 0x00020912, 0x00020912,
281 	0x00020a12, 0x00030a12, 0x00030a12, 0x00030b12,
282 	0x00030b12, 0x00030b12, 0x00040b12, 0x00040c12,
283 	0x00040c13, 0x00040c14, 0x00040c14, 0x00050d13,
284 	0x00050d13, 0x00050d14, 0x00050e13, 0x01050e13,
285 	0x01060e13, 0x01060e13, 0x01060e14, 0x01060f13
286 };
287 
288 static const u32 lan2coefftab32[480] = {
289 	0x00004000, 0x000140ff, 0x00033ffe, 0x00043ffd,
290 	0x00063efc, 0xff083dfc, 0x000a3bfb, 0xff0d39fb,
291 	0xff0f37fb, 0xff1136fa, 0xfe1433fb, 0xfe1631fb,
292 	0xfd192ffb, 0xfd1c2cfb, 0xfd1f29fb, 0xfc2127fc,
293 	0xfc2424fc, 0xfc2721fc, 0xfb291ffd, 0xfb2c1cfd,
294 	0xfb2f19fd, 0xfb3116fe, 0xfb3314fe, 0xfa3611ff,
295 	0xfb370fff, 0xfb390dff, 0xfb3b0a00, 0xfc3d08ff,
296 	0xfc3e0600, 0xfd3f0400, 0xfe3f0300, 0xff400100,
297 
298 	0xff053804, 0xff063803, 0xff083801, 0xff093701,
299 	0xff0a3700, 0xff0c3500, 0xff0e34ff, 0xff1033fe,
300 	0xff1232fd, 0xfe1431fd, 0xfe162ffd, 0xfe182dfd,
301 	0xfd1b2cfc, 0xfd1d2afc, 0xfd1f28fc, 0xfd2126fc,
302 	0xfd2323fd, 0xfc2621fd, 0xfc281ffd, 0xfc2a1dfd,
303 	0xfc2c1bfd, 0xfd2d18fe, 0xfd2f16fe, 0xfd3114fe,
304 	0xfd3212ff, 0xfe3310ff, 0xff340eff, 0x00350cff,
305 	0x00360a00, 0x01360900, 0x02370700, 0x03370600,
306 
307 	0xff083207, 0xff093206, 0xff0a3205, 0xff0c3203,
308 	0xff0d3103, 0xff0e3102, 0xfe113001, 0xfe132f00,
309 	0xfe142e00, 0xfe162dff, 0xfe182bff, 0xfe192aff,
310 	0xfe1b29fe, 0xfe1d27fe, 0xfe1f25fe, 0xfd2124fe,
311 	0xfe2222fe, 0xfe2421fd, 0xfe251ffe, 0xfe271dfe,
312 	0xfe291bfe, 0xff2a19fe, 0xff2b18fe, 0xff2d16fe,
313 	0x002e14fe, 0x002f12ff, 0x013010ff, 0x02300fff,
314 	0x03310dff, 0x04310cff, 0x05310a00, 0x06310900,
315 
316 	0xff0a2e09, 0xff0b2e08, 0xff0c2e07, 0xff0e2d06,
317 	0xff0f2d05, 0xff102d04, 0xff122c03, 0xfe142c02,
318 	0xfe152b02, 0xfe172a01, 0xfe182901, 0xfe1a2800,
319 	0xfe1b2700, 0xfe1d2500, 0xff1e24ff, 0xfe2023ff,
320 	0xff2121ff, 0xff2320fe, 0xff241eff, 0x00251dfe,
321 	0x00261bff, 0x00281afe, 0x012818ff, 0x012a16ff,
322 	0x022a15ff, 0x032b13ff, 0x032c12ff, 0x052c10ff,
323 	0x052d0fff, 0x062d0d00, 0x072d0c00, 0x082d0b00,
324 
325 	0xff0c2a0b, 0xff0d2a0a, 0xff0e2a09, 0xff0f2a08,
326 	0xff102a07, 0xff112a06, 0xff132905, 0xff142904,
327 	0xff162803, 0xff172703, 0xff182702, 0xff1a2601,
328 	0xff1b2501, 0xff1c2401, 0xff1e2300, 0xff1f2200,
329 	0x00202000, 0x00211f00, 0x01221d00, 0x01231c00,
330 	0x01251bff, 0x02251aff, 0x032618ff, 0x032717ff,
331 	0x042815ff, 0x052814ff, 0x052913ff, 0x06291100,
332 	0x072a10ff, 0x082a0e00, 0x092a0d00, 0x0a2a0c00,
333 
334 	0xff0d280c, 0xff0e280b, 0xff0f280a, 0xff102809,
335 	0xff112808, 0xff122708, 0xff142706, 0xff152705,
336 	0xff162605, 0xff172604, 0xff192503, 0xff1a2403,
337 	0x001b2302, 0x001c2202, 0x001d2201, 0x001e2101,
338 	0x011f1f01, 0x01211e00, 0x01221d00, 0x02221c00,
339 	0x02231b00, 0x03241900, 0x04241800, 0x04251700,
340 	0x052616ff, 0x06261400, 0x072713ff, 0x08271100,
341 	0x08271100, 0x09271000, 0x0a280e00, 0x0b280d00,
342 
343 	0xff0e260d, 0xff0f260c, 0xff10260b, 0xff11260a,
344 	0xff122609, 0xff132608, 0xff142508, 0xff152507,
345 	0x00152506, 0x00172405, 0x00182305, 0x00192304,
346 	0x001b2203, 0x001c2103, 0x011d2002, 0x011d2002,
347 	0x011f1f01, 0x021f1e01, 0x02201d01, 0x03211c00,
348 	0x03221b00, 0x04221a00, 0x04231801, 0x05241700,
349 	0x06241600, 0x07241500, 0x08251300, 0x09251200,
350 	0x09261100, 0x0a261000, 0x0b260f00, 0x0c260e00,
351 
352 	0xff0e250e, 0xff0f250d, 0xff10250c, 0xff11250b,
353 	0x0011250a, 0x00132409, 0x00142408, 0x00152407,
354 	0x00162307, 0x00172306, 0x00182206, 0x00192205,
355 	0x011a2104, 0x011b2004, 0x011c2003, 0x021c1f03,
356 	0x021e1e02, 0x031e1d02, 0x03201c01, 0x04201b01,
357 	0x04211a01, 0x05221900, 0x05221801, 0x06231700,
358 	0x07231600, 0x07241500, 0x08241400, 0x09241300,
359 	0x0a241200, 0x0b241100, 0x0c241000, 0x0d240f00,
360 
361 	0x000e240e, 0x000f240d, 0x0010240c, 0x0011240b,
362 	0x0013230a, 0x0013230a, 0x00142309, 0x00152308,
363 	0x00162208, 0x00172207, 0x01182106, 0x01192105,
364 	0x011a2005, 0x021b1f04, 0x021b1f04, 0x021d1e03,
365 	0x031d1d03, 0x031e1d02, 0x041e1c02, 0x041f1b02,
366 	0x05201a01, 0x05211901, 0x06211801, 0x07221700,
367 	0x07221601, 0x08231500, 0x09231400, 0x0a231300,
368 	0x0a231300, 0x0b231200, 0x0c231100, 0x0d231000,
369 
370 	0x000f220f, 0x0010220e, 0x0011220d, 0x0012220c,
371 	0x0013220b, 0x0013220b, 0x0015210a, 0x0015210a,
372 	0x01162108, 0x01172008, 0x01182007, 0x02191f06,
373 	0x02191f06, 0x021a1e06, 0x031a1e05, 0x031c1d04,
374 	0x041c1c04, 0x041d1c03, 0x051d1b03, 0x051e1a03,
375 	0x061f1902, 0x061f1902, 0x07201801, 0x08201701,
376 	0x08211601, 0x09211501, 0x0a211500, 0x0b211400,
377 	0x0b221300, 0x0c221200, 0x0d221100, 0x0e221000,
378 
379 	0x0010210f, 0x0011210e, 0x0011210e, 0x0012210d,
380 	0x0013210c, 0x0014200c, 0x0114200b, 0x0115200a,
381 	0x01161f0a, 0x01171f09, 0x02171f08, 0x02181e08,
382 	0x03181e07, 0x031a1d06, 0x031a1d06, 0x041b1c05,
383 	0x041c1c04, 0x051c1b04, 0x051d1a04, 0x061d1a03,
384 	0x071d1903, 0x071e1803, 0x081e1802, 0x081f1702,
385 	0x091f1602, 0x0a201501, 0x0b1f1501, 0x0b201401,
386 	0x0c211300, 0x0d211200, 0x0e201200, 0x0e211100,
387 
388 	0x00102010, 0x0011200f, 0x0012200e, 0x0013200d,
389 	0x0013200d, 0x01141f0c, 0x01151f0b, 0x01151f0b,
390 	0x01161f0a, 0x02171e09, 0x02171e09, 0x03181d08,
391 	0x03191d07, 0x03191d07, 0x041a1c06, 0x041b1c05,
392 	0x051b1b05, 0x051c1b04, 0x061c1a04, 0x071d1903,
393 	0x071d1903, 0x081d1803, 0x081e1703, 0x091e1702,
394 	0x0a1f1601, 0x0a1f1502, 0x0b1f1501, 0x0c1f1401,
395 	0x0d201300, 0x0d201300, 0x0e201200, 0x0f201100,
396 
397 	0x00102010, 0x0011200f, 0x00121f0f, 0x00131f0e,
398 	0x00141f0d, 0x01141f0c, 0x01141f0c, 0x01151e0c,
399 	0x02161e0a, 0x02171e09, 0x03171d09, 0x03181d08,
400 	0x03181d08, 0x04191c07, 0x041a1c06, 0x051a1b06,
401 	0x051b1b05, 0x061b1a05, 0x061c1a04, 0x071c1904,
402 	0x081c1903, 0x081d1803, 0x091d1703, 0x091e1702,
403 	0x0a1e1602, 0x0b1e1502, 0x0c1e1501, 0x0c1f1401,
404 	0x0d1f1400, 0x0e1f1300, 0x0e1f1201, 0x0f1f1200,
405 
406 	0x00111e11, 0x00121e10, 0x00131e0f, 0x00131e0f,
407 	0x01131e0e, 0x01141d0e, 0x02151d0c, 0x02151d0c,
408 	0x02161d0b, 0x03161c0b, 0x03171c0a, 0x04171c09,
409 	0x04181b09, 0x05181b08, 0x05191b07, 0x06191a07,
410 	0x061a1a06, 0x071a1906, 0x071b1905, 0x081b1805,
411 	0x091b1804, 0x091c1704, 0x0a1c1703, 0x0a1c1604,
412 	0x0b1d1602, 0x0c1d1502, 0x0c1d1502, 0x0d1d1402,
413 	0x0e1d1401, 0x0e1e1301, 0x0f1e1300, 0x101e1200,
414 
415 	0x00111e11, 0x00121e10, 0x00131d10, 0x01131d0f,
416 	0x01141d0e, 0x01141d0e, 0x02151c0d, 0x02151c0d,
417 	0x03161c0b, 0x03161c0b, 0x04171b0a, 0x04171b0a,
418 	0x05171b09, 0x05181a09, 0x06181a08, 0x06191a07,
419 	0x07191907, 0x071a1906, 0x081a1806, 0x081a1806,
420 	0x091a1805, 0x0a1b1704, 0x0a1b1704, 0x0b1c1603,
421 	0x0b1c1603, 0x0c1c1503, 0x0d1c1502, 0x0d1d1402,
422 	0x0e1d1401, 0x0f1d1301, 0x0f1d1301, 0x101e1200,
423 };
424 
425 static const u32 bicubic8coefftab32_left[480] = {
426 	0x40000000, 0x40ff0000, 0x3ffe0000, 0x3efe0000,
427 	0x3dfd0000, 0x3cfc0000, 0x3bfc0000, 0x39fc0000,
428 	0x36fc0000, 0x35fb0000, 0x33fb0000, 0x31fb0000,
429 	0x2ffb0000, 0x2cfb0000, 0x29fc0000, 0x27fc0000,
430 	0x24fc0000, 0x21fc0000, 0x1efd0000, 0x1cfd0000,
431 	0x19fd0000, 0x16fe0000, 0x14fe0000, 0x11fe0000,
432 	0x0dff0000, 0x0cff0000, 0x0aff0000, 0x08ff0000,
433 	0x05000000, 0x03000000, 0x02000000, 0x01000000,
434 
435 	0x3904ff00, 0x3903ff00, 0x3902ff00, 0x38010000,
436 	0x37000000, 0x36ff0000, 0x35ff0000, 0x34fe0000,
437 	0x32fe0000, 0x31fd0000, 0x30fd0000, 0x2efc0000,
438 	0x2cfc0000, 0x2afc0000, 0x28fc0000, 0x26fc0000,
439 	0x24fc0000, 0x22fc0000, 0x20fc0000, 0x1efc0000,
440 	0x1cfc0000, 0x19fc0000, 0x17fc0000, 0x15fd0000,
441 	0x12fd0000, 0x11fd0000, 0x0ffd0000, 0x0dfe0000,
442 	0x0bfe0000, 0x09fe0000, 0x08fe0000, 0x06ff0000,
443 
444 	0x3209fe00, 0x3407fe00, 0x3306fe00, 0x3305fe00,
445 	0x3204fe00, 0x3102ff00, 0x3102ff00, 0x3001ff00,
446 	0x2f00ff00, 0x2effff00, 0x2cff0000, 0x2bfe0000,
447 	0x29fe0000, 0x28fe0000, 0x26fd0000, 0x24fd0000,
448 	0x23fd0000, 0x21fd0000, 0x20fc0000, 0x1efc0000,
449 	0x1dfc0000, 0x1bfc0000, 0x19fc0000, 0x17fc0000,
450 	0x16fc0000, 0x14fc0000, 0x12fc0000, 0x10fd0000,
451 	0x0ffd0000, 0x0dfd0000, 0x0cfd0000, 0x0afd0000,
452 
453 	0x2e0cfd00, 0x2e0bfd00, 0x2e09fd00, 0x2e08fd00,
454 	0x2e07fd00, 0x2c06fe00, 0x2c05fe00, 0x2b04fe00,
455 	0x2b03fe00, 0x2a02fe00, 0x2901fe00, 0x2701ff00,
456 	0x2700ff00, 0x26ffff00, 0x24ffff00, 0x23ffff00,
457 	0x22feff00, 0x20fe0000, 0x1ffe0000, 0x1efd0000,
458 	0x1dfd0000, 0x1bfd0000, 0x1afd0000, 0x19fd0000,
459 	0x17fd0000, 0x15fd0000, 0x13fd0000, 0x12fd0000,
460 	0x11fd0000, 0x10fd0000, 0x0ffd0000, 0x0cfd0000,
461 
462 	0x2a0efd00, 0x2a0dfd00, 0x2a0cfd00, 0x290bfd00,
463 	0x290afd00, 0x2909fd00, 0x2908fd00, 0x2807fd00,
464 	0x2706fd00, 0x2705fd00, 0x2604fe00, 0x2603fe00,
465 	0x2502fe00, 0x2402fe00, 0x2401fe00, 0x2200fe00,
466 	0x2200fe00, 0x2000ff00, 0x1fffff00, 0x1effff00,
467 	0x1dfeff00, 0x1cfeff00, 0x1afeff00, 0x19feff00,
468 	0x17fe0000, 0x16fd0000, 0x15fd0000, 0x14fd0000,
469 	0x12fd0000, 0x11fd0000, 0x10fd0000, 0x0ffd0000,
470 
471 	0x2610fd00, 0x260ffd00, 0x260efd00, 0x260dfd00,
472 	0x260cfd00, 0x260bfd00, 0x260afd00, 0x2609fd00,
473 	0x2508fd00, 0x2507fd00, 0x2406fd00, 0x2406fd00,
474 	0x2305fd00, 0x2304fd00, 0x2203fe00, 0x2103fe00,
475 	0x2002fe00, 0x1f01fe00, 0x1e01fe00, 0x1e00fe00,
476 	0x1c00fe00, 0x1b00fe00, 0x1afffe00, 0x19ffff00,
477 	0x18ffff00, 0x17feff00, 0x16feff00, 0x15feff00,
478 	0x14feff00, 0x13feff00, 0x11feff00, 0x10fd0000,
479 
480 	0x2411feff, 0x2410feff, 0x240ffeff, 0x230efeff,
481 	0x240dfeff, 0x240cfeff, 0x230cfd00, 0x230bfd00,
482 	0x230afd00, 0x2309fd00, 0x2208fd00, 0x2108fd00,
483 	0x2007fd00, 0x2106fd00, 0x2005fd00, 0x1f05fd00,
484 	0x1f04fd00, 0x1e03fd00, 0x1d03fe00, 0x1c02fe00,
485 	0x1b02fe00, 0x1a01fe00, 0x1a01fe00, 0x1900fe00,
486 	0x1800fe00, 0x1700fe00, 0x16fffe00, 0x15fffe00,
487 	0x13ffff00, 0x12ffff00, 0x12feff00, 0x11feff00,
488 
489 	0x2212fffe, 0x2211fffe, 0x2210ffff, 0x220ffeff,
490 	0x220efeff, 0x210efeff, 0x210dfeff, 0x210cfeff,
491 	0x210bfeff, 0x200bfeff, 0x200afeff, 0x1f09feff,
492 	0x1f08feff, 0x1d08fe00, 0x1e07fd00, 0x1e06fd00,
493 	0x1d06fd00, 0x1c05fd00, 0x1b04fe00, 0x1a04fe00,
494 	0x1a03fe00, 0x1903fe00, 0x1802fe00, 0x1802fe00,
495 	0x1701fe00, 0x1601fe00, 0x1501fe00, 0x1500fe00,
496 	0x1400fe00, 0x1400fe00, 0x13fffe00, 0x12fffe00,
497 
498 	0x201200fe, 0x201100fe, 0x1f1100fe, 0x2010fffe,
499 	0x200ffffe, 0x1f0ffffe, 0x1f0efffe, 0x1e0dffff,
500 	0x1f0cfeff, 0x1e0cfeff, 0x1e0bfeff, 0x1e0afeff,
501 	0x1d0afeff, 0x1d09feff, 0x1c08feff, 0x1b08feff,
502 	0x1b07feff, 0x1a07feff, 0x1a06feff, 0x1a05feff,
503 	0x1805fe00, 0x1904fe00, 0x1704fe00, 0x1703fe00,
504 	0x1603fe00, 0x1602fe00, 0x1402fe00, 0x1402fe00,
505 	0x1401fe00, 0x1301fe00, 0x1201fe00, 0x1200fe00,
506 
507 	0x1c1202fe, 0x1c1102fe, 0x1b1102fe, 0x1c1001fe,
508 	0x1b1001fe, 0x1c0f01fe, 0x1b0f00fe, 0x1b0e00fe,
509 	0x1b0e00fe, 0x1b0d00fe, 0x1b0c00fe, 0x1a0cfffe,
510 	0x1a0bfffe, 0x1a0bfffe, 0x190afffe, 0x190afffe,
511 	0x1909fffe, 0x1709ffff, 0x1808ffff, 0x1708feff,
512 	0x1707feff, 0x1707feff, 0x1606feff, 0x1506feff,
513 	0x1505feff, 0x1505feff, 0x1404feff, 0x1404feff,
514 	0x1404feff, 0x1303feff, 0x1203feff, 0x1202feff,
515 
516 	0x191104fe, 0x191104fe, 0x191003fe, 0x191003fe,
517 	0x171003fe, 0x180f03fe, 0x180f02fe, 0x180e02fe,
518 	0x180e02fe, 0x180d01fe, 0x180d01fe, 0x180d01fe,
519 	0x170c01fe, 0x160c01fe, 0x170b00fe, 0x170b00fe,
520 	0x160a00fe, 0x160a00fe, 0x160a00fe, 0x150900fe,
521 	0x1509fffe, 0x1508fffe, 0x1508fffe, 0x1408fffe,
522 	0x1407fffe, 0x1307ffff, 0x1306ffff, 0x1206ffff,
523 	0x1206ffff, 0x1205ffff, 0x1205ffff, 0x1104feff,
524 
525 	0x161006ff, 0x161005ff, 0x161005ff, 0x160f05ff,
526 	0x160f04ff, 0x150f04ff, 0x150e04ff, 0x150e04ff,
527 	0x150e03ff, 0x150d03ff, 0x150d03ff, 0x150d02ff,
528 	0x140c02ff, 0x150c02fe, 0x150c02fe, 0x150b02fe,
529 	0x140b01fe, 0x140b01fe, 0x140a01fe, 0x140a01fe,
530 	0x140a01fe, 0x130900fe, 0x130900fe, 0x130900fe,
531 	0x130800fe, 0x120800fe, 0x120800fe, 0x120700fe,
532 	0x120700fe, 0x1107fffe, 0x1106fffe, 0x1106fffe,
533 
534 	0x140f0700, 0x140f0600, 0x140f0600, 0x140f0600,
535 	0x140e0600, 0x130e0500, 0x140e05ff, 0x130e05ff,
536 	0x140d05ff, 0x130d04ff, 0x130d04ff, 0x120d04ff,
537 	0x130c04ff, 0x130c03ff, 0x130c03ff, 0x120c03ff,
538 	0x120b03ff, 0x120b02ff, 0x120b02ff, 0x120a02ff,
539 	0x120a02ff, 0x110a02ff, 0x110a01ff, 0x120901ff,
540 	0x100901ff, 0x100901ff, 0x110801ff, 0x110801ff,
541 	0x100800ff, 0x100800ff, 0x100700ff, 0x100700fe,
542 
543 	0x120f0701, 0x120e0701, 0x120e0701, 0x120e0701,
544 	0x120e0600, 0x110e0600, 0x120d0600, 0x120d0600,
545 	0x120d0500, 0x120d0500, 0x110d0500, 0x110c0500,
546 	0x110c0500, 0x110c0400, 0x110c0400, 0x110b04ff,
547 	0x110b04ff, 0x110b04ff, 0x110b03ff, 0x110b03ff,
548 	0x110a03ff, 0x110a03ff, 0x100a03ff, 0x110a02ff,
549 	0x100902ff, 0x100902ff, 0x100902ff, 0x0f0902ff,
550 	0x0e0902ff, 0x100801ff, 0x0f0801ff, 0x0f0801ff,
551 
552 	0x100e0802, 0x100e0802, 0x110e0702, 0x110d0701,
553 	0x110d0701, 0x100d0701, 0x100d0701, 0x110d0601,
554 	0x110d0601, 0x110c0601, 0x110c0601, 0x100c0600,
555 	0x100c0500, 0x100c0500, 0x100c0500, 0x100b0500,
556 	0x100b0500, 0x100b0400, 0x100b0400, 0x0f0b0400,
557 	0x100a0400, 0x0f0a0400, 0x0f0a0400, 0x0f0a0300,
558 	0x0f0a03ff, 0x0f0903ff, 0x0f0903ff, 0x0f0903ff,
559 	0x0f0903ff, 0x0f0902ff, 0x0f0902ff, 0x0f0802ff
560 };
561 
562 static const u32 bicubic8coefftab32_right[480] = {
563 	0x00000000, 0x00000001, 0x00000003, 0x00000004,
564 	0x00000006, 0x0000ff09, 0x0000ff0a, 0x0000ff0c,
565 	0x0000ff0f, 0x0000fe12, 0x0000fe14, 0x0000fe16,
566 	0x0000fd19, 0x0000fd1c, 0x0000fd1e, 0x0000fc21,
567 	0x0000fc24, 0x0000fc27, 0x0000fc29, 0x0000fb2c,
568 	0x0000fb2f, 0x0000fb31, 0x0000fb33, 0x0000fb36,
569 	0x0000fc38, 0x0000fc39, 0x0000fc3b, 0x0000fc3d,
570 	0x0000fd3e, 0x0000fe3f, 0x0000fe40, 0x0000ff40,
571 
572 	0x0000ff05, 0x0000ff06, 0x0000fe08, 0x0000fe09,
573 	0x0000fe0b, 0x0000fe0d, 0x0000fd0f, 0x0000fd11,
574 	0x0000fd13, 0x0000fd15, 0x0000fc17, 0x0000fc1a,
575 	0x0000fc1c, 0x0000fc1e, 0x0000fc20, 0x0000fc22,
576 	0x0000fc24, 0x0000fc26, 0x0000fc28, 0x0000fc2a,
577 	0x0000fc2c, 0x0000fc2f, 0x0000fd30, 0x0000fd31,
578 	0x0000fe33, 0x0000fe34, 0x0000ff35, 0x0000ff36,
579 	0x00000037, 0x00000138, 0x00ff0239, 0x00ff0339,
580 
581 	0x0000fe09, 0x0000fd0a, 0x0000fd0c, 0x0000fd0d,
582 	0x0000fd0f, 0x0000fd11, 0x0000fc12, 0x0000fc14,
583 	0x0000fc16, 0x0000fc18, 0x0000fc19, 0x0000fc1b,
584 	0x0000fc1d, 0x0000fc1e, 0x0000fc21, 0x0000fd22,
585 	0x0000fd23, 0x0000fd25, 0x0000fd27, 0x0000fe28,
586 	0x0000fe29, 0x0000fe2b, 0x0000ff2c, 0x00ffff2f,
587 	0x00ff002f, 0x00ff0130, 0x00ff0231, 0x00ff0232,
588 	0x00fe0432, 0x00fe0533, 0x00fe0633, 0x00fe0734,
589 
590 	0x0000fd0c, 0x0000fd0d, 0x0000fd0f, 0x0000fd10,
591 	0x0000fd11, 0x0000fd13, 0x0000fd14, 0x0000fd16,
592 	0x0000fd17, 0x0000fd19, 0x0000fd1b, 0x0000fd1c,
593 	0x0000fd1d, 0x0000fd1f, 0x0000fe20, 0x0000fe21,
594 	0x00fffe24, 0x00ffff24, 0x00ffff25, 0x00ffff27,
595 	0x00ff0027, 0x00ff0128, 0x00fe012a, 0x00fe022a,
596 	0x00fe032b, 0x00fe042c, 0x00fe052d, 0x00fe062d,
597 	0x00fd072e, 0x00fd082e, 0x00fd092e, 0x00fd0b2f,
598 
599 	0x0000fd0e, 0x0000fd0f, 0x0000fd10, 0x0000fd12,
600 	0x0000fd13, 0x0000fd14, 0x0000fd15, 0x0000fd17,
601 	0x0000fe18, 0x00fffe1a, 0x00fffe1b, 0x00fffe1c,
602 	0x00fffe1e, 0x00ffff1e, 0x00ffff1f, 0x00ff0021,
603 	0x00fe0022, 0x00fe0023, 0x00fe0124, 0x00fe0224,
604 	0x00fe0226, 0x00fe0326, 0x00fe0427, 0x00fd0528,
605 	0x00fd0628, 0x00fd0729, 0x00fd0829, 0x00fd0929,
606 	0x00fd0a2a, 0x00fd0b2a, 0x00fd0c2a, 0x00fd0d2a,
607 
608 	0x0000fd10, 0x0000fd11, 0x00fffe12, 0x00fffe13,
609 	0x00fffe14, 0x00fffe15, 0x00fffe16, 0x00fffe17,
610 	0x00ffff18, 0x00ffff19, 0x00feff1c, 0x00fe001b,
611 	0x00fe001d, 0x00fe001e, 0x00fe011e, 0x00fe011f,
612 	0x00fe0220, 0x00fe0321, 0x00fe0322, 0x00fd0423,
613 	0x00fd0524, 0x00fd0624, 0x00fd0626, 0x00fd0725,
614 	0x00fd0825, 0x00fd0926, 0x00fd0a26, 0x00fd0b26,
615 	0x00fd0c26, 0x00fd0d26, 0x00fd0e27, 0x00fd0f27,
616 
617 	0x00fffe11, 0x00fffe12, 0x00fffe13, 0x00ffff14,
618 	0x00ffff14, 0x00feff16, 0x00feff17, 0x00fe0017,
619 	0x00fe0018, 0x00fe0019, 0x00fe011a, 0x00fe011b,
620 	0x00fe021c, 0x00fe021c, 0x00fe031d, 0x00fd031f,
621 	0x00fd041f, 0x00fd0520, 0x00fd0520, 0x00fd0621,
622 	0x00fd0721, 0x00fd0822, 0x00fd0822, 0x00fd0923,
623 	0x00fd0a23, 0x00fd0b23, 0x00fd0b25, 0x00fe0c24,
624 	0x00fe0d24, 0x00fe0e24, 0x00fe0f24, 0x00fe1024,
625 
626 	0x00feff12, 0x00feff13, 0x00feff13, 0x00fe0014,
627 	0x00fe0015, 0x00fe0016, 0x00fe0116, 0x00fe0117,
628 	0x00fe0118, 0x00fe0218, 0x00fe0219, 0x00fe031a,
629 	0x00fe031b, 0x00fe041b, 0x00fd041d, 0x00fd051d,
630 	0x00fd061d, 0x00fd061f, 0x00fe071e, 0x00fe081e,
631 	0x00fe081f, 0x00fe091f, 0x00fe0a20, 0x00fe0a20,
632 	0x00fe0b21, 0x00fe0c21, 0x00fe0d21, 0x00fe0d22,
633 	0x00fe0e22, 0x00fe0f21, 0x00ff1021, 0x00ff1022,
634 
635 	0x00fe0012, 0x00fe0013, 0x00fe0113, 0x00fe0114,
636 	0x00fe0115, 0x00fe0215, 0x00fe0216, 0x00fe0217,
637 	0x00fe0317, 0x00fe0318, 0x00fe0418, 0x00fe0419,
638 	0x00fe0519, 0x00fe051a, 0x00fe061b, 0x00fe071b,
639 	0x00fe071c, 0x00fe081c, 0x00fe081d, 0x00fe091d,
640 	0x00fe0a1d, 0x00fe0a1d, 0x00fe0b1e, 0x00fe0c1e,
641 	0x00ff0c1e, 0x00ff0d1e, 0x00ff0e1f, 0x00ff0e1f,
642 	0x00ff0f1f, 0x00ff0f20, 0x0000101f, 0x0000111f,
643 
644 	0x00fe0212, 0x00fe0312, 0x00fe0313, 0x00fe0314,
645 	0x00fe0414, 0x00fe0414, 0x00fe0515, 0x00fe0516,
646 	0x00fe0516, 0x00fe0616, 0x00fe0617, 0x00fe0718,
647 	0x00fe0719, 0x00fe0818, 0x00ff0819, 0x00ff0918,
648 	0x00ff0919, 0x00ff0a19, 0x00ff0a19, 0x00ff0b1a,
649 	0x00ff0b1b, 0x00ff0c1a, 0x00000c1b, 0x00000d1b,
650 	0x00000d1c, 0x00000e1b, 0x00000e1d, 0x00010f1b,
651 	0x00010f1b, 0x0001101c, 0x0001101d, 0x0002111c,
652 
653 	0x00fe0412, 0x00fe0412, 0x00ff0512, 0x00ff0512,
654 	0x00ff0613, 0x00ff0613, 0x00ff0614, 0x00ff0714,
655 	0x00ff0714, 0x00ff0815, 0x00ff0815, 0x00ff0815,
656 	0x00ff0916, 0x00000916, 0x00000a16, 0x00000a16,
657 	0x00000a18, 0x00000b17, 0x00000b17, 0x00010c17,
658 	0x00010c18, 0x00010d18, 0x00010d18, 0x00010d19,
659 	0x00020e18, 0x00020e18, 0x00020f18, 0x00030f18,
660 	0x00030f18, 0x00031018, 0x00031018, 0x00041119,
661 
662 	0x00ff0610, 0x00ff0611, 0x00ff0611, 0x00ff0711,
663 	0x00000711, 0x00000712, 0x00000812, 0x00000812,
664 	0x00000813, 0x00000913, 0x00000913, 0x00000914,
665 	0x00010a14, 0x00010a14, 0x00010a14, 0x00010b14,
666 	0x00010b16, 0x00020b15, 0x00020c15, 0x00020c15,
667 	0x00020c15, 0x00020d17, 0x00030d16, 0x00030d16,
668 	0x00030e16, 0x00040e16, 0x00040e16, 0x00040f16,
669 	0x00040f16, 0x00050f17, 0x00051017, 0x00051017,
670 
671 	0x0000070f, 0x00000710, 0x00000710, 0x00000710,
672 	0x00000810, 0x00010811, 0x00010811, 0x00010911,
673 	0x00010911, 0x00010913, 0x00010913, 0x00020a12,
674 	0x00020a12, 0x00020a13, 0x00020b12, 0x00020b13,
675 	0x00030b13, 0x00030c13, 0x00030c13, 0x00030c14,
676 	0x00040c13, 0x00040d13, 0x00040d14, 0x00040d14,
677 	0x00050e14, 0x00050e14, 0x00050e14, 0x00050e14,
678 	0x00060f14, 0x00060f14, 0x00060f15, 0x00061015,
679 
680 	0x0001070f, 0x0001080f, 0x0001080f, 0x0001080f,
681 	0x00010811, 0x00020910, 0x00020910, 0x00020910,
682 	0x00020911, 0x00020a10, 0x00030a10, 0x00030a11,
683 	0x00030a11, 0x00030b11, 0x00030b11, 0x00040b12,
684 	0x00040b12, 0x00040c11, 0x00040c12, 0x00040c12,
685 	0x00050c12, 0x00050c12, 0x00050d12, 0x00050d12,
686 	0x00060d13, 0x00060d13, 0x00060e12, 0x00060e13,
687 	0x00070e13, 0x00070e13, 0x00070f13, 0x00070f13,
688 
689 	0x0002080e, 0x0002080e, 0x0002080e, 0x00020810,
690 	0x0002090f, 0x0003090f, 0x0003090f, 0x0003090f,
691 	0x0003090f, 0x00030a0f, 0x00030a0f, 0x00040a10,
692 	0x00040a11, 0x00040b10, 0x00040b10, 0x00040b11,
693 	0x00050b10, 0x00050b11, 0x00050c10, 0x00050c11,
694 	0x00050c11, 0x00060c11, 0x00060c11, 0x00060d11,
695 	0x00060d12, 0x00070d12, 0x00070d12, 0x00070e11,
696 	0x00070e11, 0x00070e12, 0x00080e11, 0x00080e12
697 };
698 
699 static const u32 bicubic4coefftab32[480] = {
700 	0x00004000, 0x000140ff, 0x00033ffe, 0x00043ffd,
701 	0x00063dfd, 0xff083dfc, 0xff0a3bfc, 0xff0c39fc,
702 	0xff0e37fc, 0xfe1136fb, 0xfe1433fb, 0xfe1631fb,
703 	0xfd192ffb, 0xfd1c2cfb, 0xfd1e29fc, 0xfc2127fc,
704 	0xfc2424fc, 0xfc2721fc, 0xfc291efd, 0xfb2c1cfd,
705 	0xfb2f19fd, 0xfb3116fe, 0xfb3314fe, 0xfb3611fe,
706 	0xfc370eff, 0xfc390cff, 0xfc3b0aff, 0xfc3d08ff,
707 	0xfd3d0600, 0xfd3f0400, 0xfe3f0300, 0xff400100,
708 
709 	0xfe053904, 0xfe063903, 0xfe083901, 0xfe0a3800,
710 	0xfd0b3800, 0xfe0d36ff, 0xfd0f35ff, 0xfd1134fe,
711 	0xfd1332fe, 0xfd1531fd, 0xfc1730fd, 0xfc1a2efc,
712 	0xfc1c2cfc, 0xfc1e2afc, 0xfc2028fc, 0xfc2226fc,
713 	0xfc2424fc, 0xfc2622fc, 0xfc2820fc, 0xfc2a1efc,
714 	0xfc2c1cfc, 0xfc2e1afc, 0xfd3017fc, 0xfd3115fd,
715 	0xfe3213fd, 0xfe3411fd, 0xff350ffd, 0xff360dfe,
716 	0x00370bfe, 0x013809fe, 0x023808fe, 0x033806ff,
717 
718 	0xfd093208, 0xfd0a3207, 0xfd0c3205, 0xfd0d3204,
719 	0xfc0f3203, 0xfc113102, 0xfc123002, 0xfc143000,
720 	0xfc152f00, 0xfc172d00, 0xfc192cff, 0xfc1b2bfe,
721 	0xfc1d29fe, 0xfc1e28fe, 0xfc2027fd, 0xfd2125fd,
722 	0xfd2323fd, 0xfd2521fd, 0xfd2720fc, 0xfe281efc,
723 	0xfe291dfc, 0xfe2b1bfc, 0xff2c19fc, 0x002d17fc,
724 	0x002e16fc, 0x012f14fc, 0x022f12fd, 0x023110fd,
725 	0x03310ffd, 0x05310dfd, 0x06320bfd, 0x07320afd,
726 
727 	0xfc0c2d0b, 0xfc0d2d0a, 0xfc0e2d09, 0xfc102d07,
728 	0xfc112c07, 0xfc132c05, 0xfc142c04, 0xfc162b03,
729 	0xfc172a03, 0xfc192a01, 0xfc1a2901, 0xfd1b2800,
730 	0xfd1c2700, 0xfd1e2500, 0xfe1f24ff, 0xfe2023ff,
731 	0xfe2222fe, 0xff2320fe, 0xff241ffe, 0x00251efd,
732 	0x00271cfd, 0x01271bfd, 0x01281afd, 0x022918fd,
733 	0x032a16fd, 0x032b15fd, 0x042b14fd, 0x052c12fd,
734 	0x072c10fd, 0x082c0ffd, 0x092c0efd, 0x0a2c0dfd,
735 
736 	0xfd0d290d, 0xfd0e290c, 0xfd0f290b, 0xfd11280a,
737 	0xfd122809, 0xfd132808, 0xfd142807, 0xfd162706,
738 	0xfd172705, 0xfd192604, 0xfe1a2503, 0xfe1b2502,
739 	0xfe1c2402, 0xfe1d2302, 0xff1e2201, 0xff1f2101,
740 	0x00202000, 0x00211f00, 0x01221eff, 0x02221dff,
741 	0x02241cfe, 0x03241bfe, 0x042519fe, 0x042618fe,
742 	0x052617fe, 0x062716fd, 0x072714fe, 0x082713fe,
743 	0x092812fd, 0x0a2811fd, 0x0b2810fd, 0x0c280ffd,
744 
745 	0xfd0f250f, 0xfd10250e, 0xfd11250d, 0xfd12250c,
746 	0xfd13250b, 0xfe13250a, 0xfe152409, 0xfe162408,
747 	0xfe172308, 0xff182306, 0xff192305, 0xff1a2205,
748 	0x001b2104, 0x001c2103, 0x001d2003, 0x011e1f02,
749 	0x011f1f01, 0x021f1e01, 0x03201d00, 0x03211c00,
750 	0x04211b00, 0x05221aff, 0x062219ff, 0x062318ff,
751 	0x082316ff, 0x082316ff, 0x092415fe, 0x0a2414fe,
752 	0x0b2413fe, 0x0c2412fe, 0x0d2411fe, 0x0e2410fe,
753 
754 	0xfe10230f, 0xfe11230e, 0xfe12220e, 0xfe13220d,
755 	0xfe14220c, 0xff14220b, 0xff15220a, 0xff16210a,
756 	0x00162109, 0x00172108, 0x00182008, 0x01192006,
757 	0x011a1f06, 0x021a1f05, 0x021b1e05, 0x031c1d04,
758 	0x031d1d03, 0x041d1c03, 0x041e1b03, 0x051e1b02,
759 	0x061f1a01, 0x06201901, 0x07201801, 0x08201800,
760 	0x09201700, 0x0a211500, 0x0b2115ff, 0x0c2114ff,
761 	0x0c2213ff, 0x0d2212ff, 0x0e2211ff, 0x0f2211fe,
762 
763 	0xff112010, 0xff12200f, 0xff12200f, 0xff13200e,
764 	0x0013200d, 0x0014200c, 0x00151f0c, 0x00161f0b,
765 	0x01161f0a, 0x01171e0a, 0x02171e09, 0x02181e08,
766 	0x03191d07, 0x03191d07, 0x041a1c06, 0x041b1c05,
767 	0x051b1b05, 0x051c1b04, 0x061c1a04, 0x071c1a03,
768 	0x071d1903, 0x081e1802, 0x091d1802, 0x091e1702,
769 	0x0a1f1601, 0x0b1f1600, 0x0b1f1501, 0x0c201400,
770 	0x0d1f1400, 0x0e2013ff, 0x0f1f1200, 0x102011ff,
771 
772 	0x00111f10, 0x00121e10, 0x00131e0f, 0x00131e0f,
773 	0x01131e0e, 0x01141e0d, 0x01151d0d, 0x02151d0c,
774 	0x02161d0b, 0x03161d0a, 0x03171c0a, 0x04171c09,
775 	0x04181c08, 0x05181b08, 0x05191b07, 0x06191a07,
776 	0x061a1a06, 0x071a1906, 0x071b1905, 0x081b1805,
777 	0x081c1804, 0x091c1704, 0x0a1c1703, 0x0a1d1603,
778 	0x0b1d1602, 0x0c1d1502, 0x0c1d1502, 0x0d1e1401,
779 	0x0e1d1401, 0x0e1e1301, 0x0f1e1300, 0x101e1200,
780 
781 	0x02111c11, 0x02121c10, 0x02131b10, 0x03131b0f,
782 	0x03131b0f, 0x03141b0e, 0x04141b0d, 0x04151a0d,
783 	0x05151a0c, 0x05151a0c, 0x05161a0b, 0x0616190b,
784 	0x0616190b, 0x0716190a, 0x0717180a, 0x08171809,
785 	0x08181808, 0x09181708, 0x09181708, 0x0a181707,
786 	0x0a191607, 0x0b191606, 0x0b1a1605, 0x0c1a1505,
787 	0x0c1a1505, 0x0d1a1504, 0x0d1b1404, 0x0e1b1403,
788 	0x0f1b1303, 0x0f1b1303, 0x101b1302, 0x101c1202,
789 
790 	0x04111a11, 0x04121911, 0x04131910, 0x0513190f,
791 	0x0513190f, 0x0513190f, 0x0613190e, 0x0614180e,
792 	0x0714180d, 0x0714180d, 0x0715180c, 0x0814180c,
793 	0x0815170c, 0x0816170b, 0x0916170a, 0x0916170a,
794 	0x0a16160a, 0x0a171609, 0x0a171609, 0x0b171608,
795 	0x0b171509, 0x0c171508, 0x0c181507, 0x0d171507,
796 	0x0d181407, 0x0e181406, 0x0e181406, 0x0e191306,
797 	0x0f191305, 0x0f191305, 0x10191304, 0x10191205,
798 
799 	0x05121811, 0x06121810, 0x06121810, 0x06131710,
800 	0x0713170f, 0x0713170f, 0x0713170f, 0x0813170e,
801 	0x0813170e, 0x0814170d, 0x0914160d, 0x0914160d,
802 	0x0914160d, 0x0a14160c, 0x0a15160b, 0x0a15150c,
803 	0x0b15150b, 0x0b15150b, 0x0b16150a, 0x0c15150a,
804 	0x0c16140a, 0x0d161409, 0x0d161409, 0x0d171408,
805 	0x0e161408, 0x0e171308, 0x0e171308, 0x0f171307,
806 	0x0f171307, 0x10171306, 0x10181206, 0x10181206,
807 
808 	0x07111711, 0x07121710, 0x07121611, 0x08121610,
809 	0x08121610, 0x0813160f, 0x0912160f, 0x0913160e,
810 	0x0913160e, 0x0913160e, 0x0a14150d, 0x0a14150d,
811 	0x0a14150d, 0x0b14150c, 0x0b14150c, 0x0b14150c,
812 	0x0c14140c, 0x0c15140b, 0x0c15140b, 0x0c15140b,
813 	0x0d15140a, 0x0d15140a, 0x0d15140a, 0x0e161309,
814 	0x0e161309, 0x0e161309, 0x0f151309, 0x0f161308,
815 	0x0f161209, 0x10161208, 0x10161208, 0x10171207,
816 
817 	0x0a111411, 0x0b111410, 0x0b111410, 0x0b111410,
818 	0x0b111410, 0x0b12140f, 0x0b12140f, 0x0c12130f,
819 	0x0c12130f, 0x0c12130f, 0x0c12130f, 0x0c12130f,
820 	0x0d12130e, 0x0d12130e, 0x0d12130e, 0x0d13130d,
821 	0x0d13130d, 0x0d13130d, 0x0e12130d, 0x0e13120d,
822 	0x0e13120d, 0x0e13120d, 0x0e13120d, 0x0f13120c,
823 	0x0f13120c, 0x0f13120c, 0x0f14120b, 0x0f14120b,
824 	0x1013120b, 0x1013120b, 0x1013120b, 0x1014110b,
825 
826 	0x0c111310, 0x0c111310, 0x0c111310, 0x0d101310,
827 	0x0d101310, 0x0d111210, 0x0d111210, 0x0d111210,
828 	0x0d12120f, 0x0d12120f, 0x0d12120f, 0x0d12120f,
829 	0x0e11120f, 0x0e12120e, 0x0e12120e, 0x0e12120e,
830 	0x0e12120e, 0x0e12120e, 0x0e12120e, 0x0e12120e,
831 	0x0f11120e, 0x0f12120d, 0x0f12120d, 0x0f12120d,
832 	0x0f12120d, 0x0f12110e, 0x0f12110e, 0x0f12110e,
833 	0x1012110d, 0x1012110d, 0x1013110c, 0x1013110c,
834 };
835 
836 static int sun8i_vi_scaler_coef_index(unsigned int step)
837 {
838 	unsigned int scale, int_part, float_part;
839 
840 	scale = step >> (SUN8I_VI_SCALER_SCALE_FRAC - 3);
841 	int_part = scale >> 3;
842 	float_part = scale & 0x7;
843 
844 	switch (int_part) {
845 	case 0:
846 		return 0;
847 	case 1:
848 		return float_part;
849 	case 2:
850 		return 8 + (float_part >> 1);
851 	case 3:
852 		return 12;
853 	case 4:
854 		return 13;
855 	default:
856 		return 14;
857 	}
858 }
859 
860 static void sun8i_vi_scaler_set_coeff(struct regmap *map, int layer,
861 				      u32 hstep, u32 vstep,
862 				      const struct drm_format_info *format)
863 {
864 	const u32 *ch_left, *ch_right, *cy;
865 	int offset, i;
866 
867 	if (format->hsub == 1 && format->vsub == 1) {
868 		ch_left = lan3coefftab32_left;
869 		ch_right = lan3coefftab32_right;
870 		cy = lan2coefftab32;
871 	} else {
872 		ch_left = bicubic8coefftab32_left;
873 		ch_right = bicubic8coefftab32_right;
874 		cy = bicubic4coefftab32;
875 	}
876 
877 	offset = sun8i_vi_scaler_coef_index(hstep) *
878 			SUN8I_VI_SCALER_COEFF_COUNT;
879 	for (i = 0; i < SUN8I_VI_SCALER_COEFF_COUNT; i++) {
880 		regmap_write(map, SUN8I_SCALER_VSU_YHCOEFF0(layer, i),
881 			     lan3coefftab32_left[offset + i]);
882 		regmap_write(map, SUN8I_SCALER_VSU_YHCOEFF1(layer, i),
883 			     lan3coefftab32_right[offset + i]);
884 		regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF0(layer, i),
885 			     ch_left[offset + i]);
886 		regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF1(layer, i),
887 			     ch_right[offset + i]);
888 	}
889 
890 	offset = sun8i_vi_scaler_coef_index(hstep) *
891 			SUN8I_VI_SCALER_COEFF_COUNT;
892 	for (i = 0; i < SUN8I_VI_SCALER_COEFF_COUNT; i++) {
893 		regmap_write(map, SUN8I_SCALER_VSU_YVCOEFF(layer, i),
894 			     lan2coefftab32[offset + i]);
895 		regmap_write(map, SUN8I_SCALER_VSU_CVCOEFF(layer, i),
896 			     cy[offset + i]);
897 	}
898 }
899 
900 void sun8i_vi_scaler_enable(struct sun8i_mixer *mixer, int layer, bool enable)
901 {
902 	u32 val;
903 
904 	if (enable)
905 		val = SUN8I_SCALER_VSU_CTRL_EN |
906 		      SUN8I_SCALER_VSU_CTRL_COEFF_RDY;
907 	else
908 		val = 0;
909 
910 	regmap_write(mixer->engine.regs, SUN8I_SCALER_VSU_CTRL(layer), val);
911 }
912 
913 void sun8i_vi_scaler_setup(struct sun8i_mixer *mixer, int layer,
914 			   u32 src_w, u32 src_h, u32 dst_w, u32 dst_h,
915 			   u32 hscale, u32 vscale, u32 hphase, u32 vphase,
916 			   const struct drm_format_info *format)
917 {
918 	u32 chphase, cvphase;
919 	u32 insize, outsize;
920 
921 	hphase <<= SUN8I_VI_SCALER_PHASE_FRAC - 16;
922 	vphase <<= SUN8I_VI_SCALER_PHASE_FRAC - 16;
923 	hscale <<= SUN8I_VI_SCALER_SCALE_FRAC - 16;
924 	vscale <<= SUN8I_VI_SCALER_SCALE_FRAC - 16;
925 
926 	insize = SUN8I_VI_SCALER_SIZE(src_w, src_h);
927 	outsize = SUN8I_VI_SCALER_SIZE(dst_w, dst_h);
928 
929 	/*
930 	 * This is chroma V/H phase calculation as it appears in
931 	 * BSP driver. There is no detailed explanation. YUV 420
932 	 * chroma is threated specialy for some reason.
933 	 */
934 	if (format->hsub == 2 && format->vsub == 2) {
935 		chphase = hphase >> 1;
936 		cvphase = (vphase >> 1) -
937 			(1UL << (SUN8I_VI_SCALER_SCALE_FRAC - 2));
938 	} else {
939 		chphase = hphase;
940 		cvphase = vphase;
941 	}
942 
943 	regmap_write(mixer->engine.regs,
944 		     SUN8I_SCALER_VSU_OUTSIZE(layer), outsize);
945 	regmap_write(mixer->engine.regs,
946 		     SUN8I_SCALER_VSU_YINSIZE(layer), insize);
947 	regmap_write(mixer->engine.regs,
948 		     SUN8I_SCALER_VSU_YHSTEP(layer), hscale);
949 	regmap_write(mixer->engine.regs,
950 		     SUN8I_SCALER_VSU_YVSTEP(layer), vscale);
951 	regmap_write(mixer->engine.regs,
952 		     SUN8I_SCALER_VSU_YHPHASE(layer), hphase);
953 	regmap_write(mixer->engine.regs,
954 		     SUN8I_SCALER_VSU_YVPHASE(layer), vphase);
955 	regmap_write(mixer->engine.regs,
956 		     SUN8I_SCALER_VSU_CINSIZE(layer),
957 		     SUN8I_VI_SCALER_SIZE(src_w / format->hsub,
958 					  src_h / format->vsub));
959 	regmap_write(mixer->engine.regs,
960 		     SUN8I_SCALER_VSU_CHSTEP(layer),
961 		     hscale / format->hsub);
962 	regmap_write(mixer->engine.regs,
963 		     SUN8I_SCALER_VSU_CVSTEP(layer),
964 		     vscale / format->vsub);
965 	regmap_write(mixer->engine.regs,
966 		     SUN8I_SCALER_VSU_CHPHASE(layer), chphase);
967 	regmap_write(mixer->engine.regs,
968 		     SUN8I_SCALER_VSU_CVPHASE(layer), cvphase);
969 	sun8i_vi_scaler_set_coeff(mixer->engine.regs, layer,
970 				  hscale, vscale, format);
971 }
972