GNU Linux-libre 4.19.286-gnu1
[releases.git] / drivers / gpu / drm / sun4i / sun8i_vi_scaler.c
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 }