brintos

brintos / linux-shallow public Read only

0
0
Text · 30.7 KiB · a0d437f Raw
877 lines · c
1/*2 * Copyright 2012-17 Advanced Micro Devices, Inc.3 *4 * Permission is hereby granted, free of charge, to any person obtaining a5 * copy of this software and associated documentation files (the "Software"),6 * to deal in the Software without restriction, including without limitation7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,8 * and/or sell copies of the Software, and to permit persons to whom the9 * Software is furnished to do so, subject to the following conditions:10 *11 * The above copyright notice and this permission notice shall be included in12 * all copies or substantial portions of the Software.13 *14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR20 * OTHER DEALINGS IN THE SOFTWARE.21 *22 * Authors: AMD23 *24 */25 26#include "reg_helper.h"27#include "fixed31_32.h"28#include "resource.h"29#include "dwb.h"30#include "dcn20_dwb.h"31 32#define NUM_PHASES    1633#define HORZ_MAX_TAPS 1234#define VERT_MAX_TAPS 1235 36#define REG(reg)\37	dwbc20->dwbc_regs->reg38 39#define CTX \40	dwbc20->base.ctx41 42#undef FN43#define FN(reg_name, field_name) \44	dwbc20->dwbc_shift->field_name, dwbc20->dwbc_mask->field_name45 46#define TO_DCN20_DWBC(dwbc_base) \47	container_of(dwbc_base, struct dcn20_dwbc, base)48 49 50static const uint16_t filter_3tap_16p_upscale[27] = {51	2048, 2048, 0,52	1708, 2424, 16348,53	1372, 2796, 16308,54	1056, 3148, 16272,55	768, 3464, 16244,56	512, 3728, 16236,57	296, 3928, 16252,58	124, 4052, 16296,59	0, 4096, 060};61 62static const uint16_t filter_3tap_16p_117[27] = {63	2048, 2048, 0,64	1824, 2276, 16376,65	1600, 2496, 16380,66	1376, 2700, 16,67	1156, 2880, 52,68	948, 3032, 108,69	756, 3144, 192,70	580, 3212, 296,71	428, 3236, 42872};73 74static const uint16_t filter_3tap_16p_150[27] = {75	2048, 2048, 0,76	1872, 2184, 36,77	1692, 2308, 88,78	1516, 2420, 156,79	1340, 2516, 236,80	1168, 2592, 328,81	1004, 2648, 440,82	844, 2684, 560,83	696, 2696, 69684};85 86static const uint16_t filter_3tap_16p_183[27] = {87	2048, 2048, 0,88	1892, 2104, 92,89	1744, 2152, 196,90	1592, 2196, 300,91	1448, 2232, 412,92	1304, 2256, 528,93	1168, 2276, 648,94	1032, 2288, 772,95	900, 2292, 90096};97 98static const uint16_t filter_4tap_16p_upscale[36] = {99	0, 4096, 0, 0,100	16240, 4056, 180, 16380,101	16136, 3952, 404, 16364,102	16072, 3780, 664, 16344,103	16040, 3556, 952, 16312,104	16036, 3284, 1268, 16272,105	16052, 2980, 1604, 16224,106	16084, 2648, 1952, 16176,107	16128, 2304, 2304, 16128108};109 110static const uint16_t filter_4tap_16p_117[36] = {111	428, 3236, 428, 0,112	276, 3232, 604, 16364,113	148, 3184, 800, 16340,114	44, 3104, 1016, 16312,115	16344, 2984, 1244, 16284,116	16284, 2832, 1488, 16256,117	16244, 2648, 1732, 16236,118	16220, 2440, 1976, 16220,119	16212, 2216, 2216, 16212120};121 122static const uint16_t filter_4tap_16p_150[36] = {123	696, 2700, 696, 0,124	560, 2700, 848, 16364,125	436, 2676, 1008, 16348,126	328, 2628, 1180, 16336,127	232, 2556, 1356, 16328,128	152, 2460, 1536, 16328,129	84, 2344, 1716, 16332,130	28, 2208, 1888, 16348,131	16376, 2052, 2052, 16376132};133 134static const uint16_t filter_4tap_16p_183[36] = {135	940, 2208, 940, 0,136	832, 2200, 1052, 4,137	728, 2180, 1164, 16,138	628, 2148, 1280, 36,139	536, 2100, 1392, 60,140	448, 2044, 1504, 92,141	368, 1976, 1612, 132,142	296, 1900, 1716, 176,143	232, 1812, 1812, 232144};145 146static const uint16_t filter_5tap_16p_upscale[45] = {147	15936, 2496, 2496, 15936, 0,148	15992, 2128, 2832, 15896, 12,149	16056, 1760, 3140, 15876, 24,150	16120, 1404, 3420, 15876, 36,151	16188, 1060, 3652, 15908, 44,152	16248, 744, 3844, 15972, 44,153	16304, 460, 3980, 16072, 40,154	16348, 212, 4064, 16208, 24,155	0, 0, 4096, 0, 0,156};157 158static const uint16_t filter_5tap_16p_117[45] = {159	16056, 2372, 2372, 16056, 0,160	16052, 2124, 2600, 16076, 0,161	16060, 1868, 2808, 16120, 0,162	16080, 1612, 2992, 16180, 16376,163	16112, 1356, 3144, 16268, 16364,164	16144, 1108, 3268, 16376, 16344,165	16184, 872, 3356, 124, 16320,166	16220, 656, 3412, 276, 16292,167	16256, 456, 3428, 456, 16256,168};169 170static const uint16_t filter_5tap_16p_150[45] = {171	16368, 2064, 2064, 16368, 0,172	16316, 1924, 2204, 44, 16372,173	16280, 1772, 2328, 116, 16356,174	16256, 1616, 2440, 204, 16340,175	16240, 1456, 2536, 304, 16320,176	16232, 1296, 2612, 416, 16300,177	16232, 1132, 2664, 544, 16284,178	16240, 976, 2700, 680, 16264,179	16248, 824, 2708, 824, 16248,180};181 182static const uint16_t filter_5tap_16p_183[45] = {183	228, 1816, 1816, 228, 0,184	168, 1728, 1904, 300, 16372,185	116, 1632, 1988, 376, 16360,186	72, 1528, 2060, 460, 16348,187	36, 1424, 2120, 552, 16340,188	4, 1312, 2168, 652, 16336,189	16368, 1200, 2204, 752, 16332,190	16352, 1084, 2224, 860, 16332,191	16340, 972, 2232, 972, 16340,192};193 194static const uint16_t filter_6tap_16p_upscale[54] = {195	0, 0, 4092, 0, 0, 0,196	44, 16188, 4064, 228, 16324, 0,197	80, 16036, 3980, 492, 16256, 4,198	108, 15916, 3844, 788, 16184, 16,199	120, 15836, 3656, 1108, 16104, 28,200	128, 15792, 3420, 1448, 16024, 44,201	124, 15776, 3144, 1800, 15948, 64,202	112, 15792, 2836, 2152, 15880, 80,203	100, 15828, 2504, 2504, 15828, 100,204};205 206static const uint16_t filter_6tap_16p_117[54] = {207	16168, 476, 3568, 476, 16168, 0,208	16216, 280, 3540, 692, 16116, 8,209	16264, 104, 3472, 924, 16068, 16,210	16304, 16340, 3372, 1168, 16024, 28,211	16344, 16212, 3236, 1424, 15988, 36,212	16372, 16112, 3072, 1680, 15956, 44,213	12, 16036, 2880, 1936, 15940, 48,214	28, 15984, 2668, 2192, 15936, 48,215	40, 15952, 2436, 2436, 15952, 40,216};217 218static const uint16_t filter_6tap_16p_150[54] = {219	16148, 920, 2724, 920, 16148, 0,220	16156, 768, 2712, 1072, 16144, 0,221	16172, 628, 2684, 1232, 16148, 16380,222	16192, 492, 2632, 1388, 16160, 16372,223	16212, 368, 2564, 1548, 16180, 16364,224	16232, 256, 2480, 1704, 16212, 16352,225	16256, 156, 2380, 1856, 16256, 16336,226	16276, 64, 2268, 2004, 16308, 16320,227	16300, 16372, 2140, 2140, 16372, 16300,228};229 230static const uint16_t filter_6tap_16p_183[54] = {231	16296, 1032, 2196, 1032, 16296, 0,232	16284, 924, 2196, 1144, 16320, 16376,233	16272, 820, 2180, 1256, 16348, 16364,234	16268, 716, 2156, 1364, 16380, 16352,235	16264, 620, 2116, 1472, 36, 16340,236	16268, 524, 2068, 1576, 88, 16328,237	16272, 436, 2008, 1680, 144, 16316,238	16280, 352, 1940, 1772, 204, 16304,239	16292, 276, 1860, 1860, 276, 16292,240};241 242static const uint16_t filter_7tap_16p_upscale[63] = {243	176, 15760, 2488, 2488, 15760, 176, 0,244	160, 15812, 2152, 2816, 15728, 192, 16376,245	136, 15884, 1812, 3124, 15720, 196, 16368,246	108, 15964, 1468, 3400, 15740, 196, 16364,247	84, 16048, 1132, 3640, 15792, 180, 16360,248	56, 16140, 812, 3832, 15884, 152, 16360,249	32, 16228, 512, 3976, 16012, 116, 16364,250	12, 16308, 240, 4064, 16180, 60, 16372,251	0, 0, 0, 4096, 0, 0, 0,252};253 254static const uint16_t filter_7tap_16p_117[63] = {255	92, 15868, 2464, 2464, 15868, 92, 0,256	108, 15852, 2216, 2700, 15904, 72, 0,257	112, 15856, 1960, 2916, 15964, 44, 0,258	116, 15876, 1696, 3108, 16048, 8, 8,259	112, 15908, 1428, 3268, 16156, 16348, 12,260	104, 15952, 1168, 3400, 16288, 16300, 24,261	92, 16004, 916, 3496, 64, 16244, 36,262	80, 16064, 676, 3556, 248, 16184, 48,263	64, 16124, 452, 3576, 452, 16124, 64,264};265 266static const uint16_t filter_7tap_16p_150[63] = {267	16224, 16380, 2208, 2208, 16380, 16224, 0,268	16252, 16304, 2072, 2324, 84, 16196, 4,269	16276, 16240, 1924, 2432, 184, 16172, 8,270	16300, 16184, 1772, 2524, 296, 16144, 12,271	16324, 16144, 1616, 2600, 416, 16124, 12,272	16344, 16112, 1456, 2660, 548, 16104, 12,273	16360, 16092, 1296, 2704, 688, 16088, 12,274	16372, 16080, 1140, 2732, 832, 16080, 8,275	0, 16076, 984, 2740, 984, 16076, 0,276};277 278static const uint16_t filter_7tap_16p_183[63] = {279	16216, 324, 1884, 1884, 324, 16216, 0,280	16228, 248, 1804, 1960, 408, 16212, 16380,281	16240, 176, 1716, 2028, 496, 16208, 16376,282	16252, 112, 1624, 2084, 588, 16208, 16372,283	16264, 56, 1524, 2132, 684, 16212, 16364,284	16280, 4, 1424, 2168, 788, 16220, 16356,285	16292, 16344, 1320, 2196, 892, 16232, 16344,286	16308, 16308, 1212, 2212, 996, 16252, 16332,287	16320, 16276, 1104, 2216, 1104, 16276, 16320,288};289 290static const uint16_t filter_8tap_16p_upscale[72] = {291	0, 0, 0, 4096, 0, 0, 0, 0,292	16360, 76, 16172, 4064, 244, 16296, 24, 16380,293	16340, 136, 15996, 3980, 524, 16204, 56, 16380,294	16328, 188, 15860, 3844, 828, 16104, 92, 16372,295	16320, 224, 15760, 3656, 1156, 16008, 128, 16368,296	16320, 248, 15696, 3428, 1496, 15912, 160, 16360,297	16320, 256, 15668, 3156, 1844, 15828, 192, 16348,298	16324, 256, 15672, 2856, 2192, 15756, 220, 16340,299	16332, 244, 15704, 2532, 2532, 15704, 244, 16332,300};301 302static const uint16_t filter_8tap_16p_117[72] = {303	116, 16100, 428, 3564, 428, 16100, 116, 0,304	96, 16168, 220, 3548, 656, 16032, 136, 16376,305	76, 16236, 32, 3496, 904, 15968, 152, 16372,306	56, 16300, 16252, 3408, 1164, 15908, 164, 16368,307	36, 16360, 16116, 3284, 1428, 15856, 172, 16364,308	20, 28, 16000, 3124, 1700, 15820, 176, 16364,309	4, 76, 15912, 2940, 1972, 15800, 172, 16364,310	16380, 112, 15848, 2724, 2236, 15792, 160, 16364,311	16372, 140, 15812, 2488, 2488, 15812, 140, 16372,312};313 314static const uint16_t filter_8tap_16p_150[72] = {315	16380, 16020, 1032, 2756, 1032, 16020, 16380, 0,316	12, 16020, 876, 2744, 1184, 16032, 16364, 4,317	24, 16028, 728, 2716, 1344, 16052, 16340, 8,318	36, 16040, 584, 2668, 1500, 16080, 16316, 16,319	40, 16060, 448, 2608, 1652, 16120, 16288, 20,320	44, 16080, 320, 2528, 1804, 16168, 16260, 28,321	48, 16108, 204, 2436, 1948, 16232, 16228, 32,322	44, 16136, 100, 2328, 2084, 16304, 16200, 40,323	44, 16168, 4, 2212, 2212, 4, 16168, 44,324};325 326static const uint16_t filter_8tap_16p_183[72] = {327	16264, 16264, 1164, 2244, 1164, 16264, 16264, 0,328	16280, 16232, 1056, 2236, 1268, 16300, 16248, 0,329	16296, 16204, 948, 2220, 1372, 16348, 16232, 0,330	16312, 16184, 844, 2192, 1472, 12, 16216, 4,331	16328, 16172, 740, 2156, 1572, 72, 16200, 0,332	16340, 16160, 640, 2108, 1668, 136, 16188, 0,333	16352, 16156, 544, 2052, 1756, 204, 16176, 16380,334	16360, 16156, 452, 1988, 1840, 280, 16164, 16376,335	16368, 16160, 364, 1920, 1920, 364, 16160, 16368,336};337 338static const uint16_t filter_9tap_16p_upscale[81] = {339	16284, 296, 15660, 2572, 2572, 15660, 296, 16284, 0,340	16296, 272, 15712, 2228, 2896, 15632, 304, 16276, 4,341	16308, 240, 15788, 1876, 3192, 15632, 304, 16276, 4,342	16320, 204, 15876, 1520, 3452, 15664, 288, 16280, 8,343	16336, 164, 15976, 1176, 3676, 15732, 260, 16288, 12,344	16348, 120, 16080, 844, 3856, 15840, 216, 16300, 12,345	16364, 76, 16188, 532, 3988, 15984, 156, 16324, 8,346	16376, 36, 16288, 252, 4068, 16164, 84, 16352, 4,347	0, 0, 0, 0, 4096, 0, 0, 0, 0,348};349 350static const uint16_t filter_9tap_16p_117[81] = {351	16356, 172, 15776, 2504, 2504, 15776, 172, 16356, 0,352	16344, 200, 15756, 2252, 2740, 15816, 136, 16372, 16380,353	16336, 216, 15756, 1988, 2956, 15884, 92, 8, 16380,354	16332, 224, 15780, 1720, 3144, 15976, 40, 28, 16376,355	16328, 224, 15816, 1448, 3304, 16096, 16364, 52, 16372,356	16328, 216, 15868, 1180, 3432, 16240, 16296, 80, 16364,357	16332, 200, 15928, 916, 3524, 24, 16224, 108, 16356,358	16336, 184, 15996, 668, 3580, 220, 16148, 132, 16352,359	16344, 160, 16072, 436, 3600, 436, 16072, 160, 16344,360};361 362static const uint16_t filter_9tap_16p_150[81] = {363	84, 16128, 0, 2216, 2216, 0, 16128, 84, 0,364	80, 16160, 16296, 2088, 2332, 100, 16092, 84, 0,365	76, 16196, 16220, 1956, 2432, 208, 16064, 80, 0,366	72, 16232, 16152, 1812, 2524, 328, 16036, 76, 4,367	64, 16264, 16096, 1664, 2600, 460, 16012, 64, 8,368	56, 16300, 16052, 1508, 2656, 596, 15996, 52, 12,369	48, 16328, 16020, 1356, 2700, 740, 15984, 36, 20,370	40, 16356, 15996, 1196, 2728, 888, 15980, 20, 24,371	32, 0, 15984, 1044, 2736, 1044, 15984, 0, 32,372};373 374static const uint16_t filter_9tap_16p_183[81] = {375	16356, 16112, 388, 1952, 1952, 388, 16112, 16356, 0,376	16368, 16116, 304, 1876, 2020, 480, 16112, 16344, 4,377	16376, 16124, 224, 1792, 2080, 576, 16116, 16328, 8,378	0, 16136, 148, 1700, 2132, 672, 16124, 16312, 8,379	8, 16148, 80, 1604, 2176, 772, 16140, 16296, 12,380	12, 16164, 16, 1504, 2208, 876, 16156, 16276, 16,381	16, 16180, 16344, 1404, 2232, 980, 16184, 16256, 20,382	20, 16200, 16296, 1300, 2244, 1088, 16212, 16240, 20,383	20, 16220, 16252, 1196, 2252, 1196, 16252, 16220, 20,384};385 386static const uint16_t filter_10tap_16p_upscale[90] = {387	0, 0, 0, 0, 4096, 0, 0, 0, 0, 0,388	12, 16344, 88, 16160, 4068, 252, 16280, 44, 16368, 0,389	24, 16308, 168, 15976, 3988, 540, 16176, 92, 16348, 0,390	32, 16280, 236, 15828, 3852, 852, 16064, 140, 16328, 4,391	36, 16260, 284, 15720, 3672, 1184, 15956, 188, 16308, 8,392	36, 16244, 320, 15648, 3448, 1528, 15852, 236, 16288, 12,393	36, 16240, 336, 15612, 3184, 1880, 15764, 276, 16272, 20,394	32, 16240, 340, 15608, 2888, 2228, 15688, 308, 16256, 24,395	28, 16244, 332, 15636, 2568, 2568, 15636, 332, 16244, 28,396};397 398static const uint16_t filter_10tap_16p_117[90] = {399	16308, 196, 16048, 440, 3636, 440, 16048, 196, 16308, 0,400	16316, 164, 16132, 220, 3612, 676, 15972, 220, 16300, 0,401	16324, 132, 16212, 20, 3552, 932, 15900, 240, 16296, 4,402	16336, 100, 16292, 16232, 3456, 1192, 15836, 256, 16296, 4,403	16348, 68, 16364, 16084, 3324, 1464, 15784, 264, 16296, 8,404	16356, 36, 48, 15960, 3164, 1736, 15748, 260, 16304, 4,405	16364, 8, 108, 15864, 2972, 2008, 15728, 252, 16312, 4,406	16372, 16368, 160, 15792, 2756, 2268, 15724, 228, 16328, 0,407	16380, 16344, 200, 15748, 2520, 2520, 15748, 200, 16344, 16380,408};409 410static const uint16_t filter_10tap_16p_150[90] = {411	64, 0, 15956, 1048, 2716, 1048, 15956, 0, 64, 0,412	52, 24, 15952, 896, 2708, 1204, 15972, 16356, 72, 16380,413	44, 48, 15952, 748, 2684, 1360, 16000, 16320, 84, 16380,414	32, 68, 15964, 604, 2644, 1516, 16032, 16288, 92, 16376,415	24, 88, 15980, 464, 2588, 1668, 16080, 16248, 100, 16376,416	16, 100, 16004, 332, 2516, 1816, 16140, 16212, 108, 16376,417	8, 108, 16032, 212, 2428, 1956, 16208, 16172, 112, 16376,418	4, 116, 16060, 100, 2328, 2092, 16288, 16132, 116, 16380,419	0, 116, 16096, 16380, 2216, 2216, 16380, 16096, 116, 0,420};421 422static const uint16_t filter_10tap_16p_183[90] = {423	40, 16180, 16240, 1216, 2256, 1216, 16240, 16180, 40, 0,424	44, 16204, 16200, 1112, 2252, 1320, 16288, 16160, 36, 0,425	44, 16224, 16168, 1004, 2236, 1424, 16344, 16144, 28, 4,426	44, 16248, 16136, 900, 2208, 1524, 16, 16124, 24, 8,427	44, 16268, 16116, 796, 2176, 1620, 84, 16108, 12, 12,428	40, 16288, 16100, 692, 2132, 1712, 156, 16096, 4, 16,429	36, 16308, 16088, 592, 2080, 1796, 232, 16088, 16376, 20,430	32, 16328, 16080, 496, 2020, 1876, 316, 16080, 16360, 24,431	28, 16344, 16080, 404, 1952, 1952, 404, 16080, 16344, 28,432};433 434static const uint16_t filter_11tap_16p_upscale[99] = {435	60, 16216, 356, 15620, 2556, 2556, 15620, 356, 16216, 60, 0,436	52, 16224, 336, 15672, 2224, 2876, 15592, 368, 16208, 64, 16380,437	44, 16244, 304, 15744, 1876, 3176, 15596, 364, 16212, 64, 16376,438	36, 16264, 260, 15836, 1532, 3440, 15636, 340, 16220, 60, 16376,439	28, 16288, 212, 15940, 1188, 3668, 15708, 304, 16236, 56, 16376,440	20, 16312, 160, 16052, 856, 3848, 15820, 248, 16264, 48, 16376,441	12, 16336, 104, 16164, 544, 3984, 15968, 180, 16296, 36, 16376,442	4, 16360, 48, 16276, 256, 4068, 16160, 96, 16336, 16, 16380,443	0, 0, 0, 0, 0, 4096, 0, 0, 0, 0, 0,444};445 446static const uint16_t filter_11tap_16p_117[99] = {447	16380, 16332, 220, 15728, 2536, 2536, 15728, 220, 16332, 16380, 0,448	4, 16308, 256, 15704, 2280, 2768, 15772, 176, 16360, 16368, 0,449	12, 16292, 280, 15704, 2016, 2984, 15848, 120, 8, 16356, 0,450	20, 16276, 292, 15724, 1744, 3172, 15948, 56, 40, 16340, 4,451	24, 16268, 292, 15760, 1468, 3328, 16072, 16368, 80, 16324, 8,452	24, 16264, 288, 15816, 1196, 3456, 16224, 16288, 116, 16312, 12,453	24, 16264, 272, 15880, 932, 3548, 16, 16208, 152, 16296, 16,454	24, 16268, 248, 15956, 676, 3604, 216, 16120, 188, 16284, 20,455	24, 16276, 220, 16036, 436, 3624, 436, 16036, 220, 16276, 24,456};457 458static const uint16_t filter_11tap_16p_150[99] = {459	0, 144, 16072, 0, 2212, 2212, 0, 16072, 144, 0, 0,460	16376, 144, 16112, 16288, 2092, 2324, 104, 16036, 140, 8, 16380,461	16368, 144, 16152, 16204, 1960, 2424, 216, 16004, 132, 16, 16376,462	16364, 140, 16192, 16132, 1820, 2512, 340, 15976, 116, 28, 16376,463	16364, 132, 16232, 16072, 1676, 2584, 476, 15952, 100, 40, 16372,464	16360, 124, 16272, 16020, 1528, 2644, 612, 15936, 80, 52, 16368,465	16360, 116, 16312, 15980, 1372, 2684, 760, 15928, 56, 64, 16364,466	16360, 104, 16348, 15952, 1216, 2712, 908, 15928, 28, 76, 16364,467	16360, 92, 0, 15936, 1064, 2720, 1064, 15936, 0, 92, 16360,468};469 470static const uint16_t filter_11tap_16p_183[99] = {471	60, 16336, 16052, 412, 1948, 1948, 412, 16052, 16336, 60, 0,472	56, 16356, 16052, 324, 1876, 2016, 504, 16056, 16316, 64, 0,473	48, 16372, 16060, 240, 1796, 2072, 604, 16064, 16292, 64, 0,474	44, 4, 16068, 160, 1712, 2124, 700, 16080, 16272, 68, 0,475	40, 20, 16080, 84, 1620, 2164, 804, 16096, 16248, 68, 4,476	32, 32, 16096, 16, 1524, 2200, 908, 16124, 16224, 68, 4,477	28, 40, 16112, 16340, 1428, 2220, 1012, 16152, 16200, 64, 8,478	24, 52, 16132, 16284, 1328, 2236, 1120, 16192, 16176, 64, 12,479	16, 56, 16156, 16236, 1224, 2240, 1224, 16236, 16156, 56, 16,480};481 482static const uint16_t filter_12tap_16p_upscale[108] = {483	0, 0, 0, 0, 0, 4096, 0, 0, 0, 0, 0, 0,484	16376, 24, 16332, 100, 16156, 4068, 260, 16272, 56, 16356, 8, 0,485	16368, 44, 16284, 188, 15964, 3988, 548, 16156, 112, 16328, 20, 16380,486	16360, 64, 16248, 260, 15812, 3856, 864, 16040, 172, 16296, 32, 16380,487	16360, 76, 16216, 320, 15696, 3672, 1196, 15928, 228, 16268, 44, 16376,488	16356, 84, 16196, 360, 15620, 3448, 1540, 15820, 280, 16240, 56, 16372,489	16356, 88, 16184, 384, 15580, 3188, 1888, 15728, 324, 16216, 68, 16368,490	16360, 88, 16180, 392, 15576, 2892, 2236, 15652, 360, 16200, 80, 16364,491	16360, 84, 16188, 384, 15600, 2576, 2576, 15600, 384, 16188, 84, 16360,492};493 494static const uint16_t filter_12tap_16p_117[108] = {495	48, 16248, 240, 16028, 436, 3612, 436, 16028, 240, 16248, 48, 0,496	44, 16260, 208, 16116, 212, 3596, 676, 15944, 272, 16240, 48, 16380,497	40, 16276, 168, 16204, 12, 3540, 932, 15868, 296, 16240, 48, 16380,498	36, 16292, 128, 16288, 16220, 3452, 1196, 15800, 312, 16240, 44, 16380,499	28, 16308, 84, 16372, 16064, 3324, 1472, 15748, 316, 16244, 40, 16380,500	24, 16328, 44, 64, 15936, 3168, 1744, 15708, 312, 16256, 32, 16380,501	16, 16344, 8, 132, 15836, 2980, 2016, 15688, 300, 16272, 20, 0,502	12, 16364, 16356, 188, 15760, 2768, 2280, 15688, 272, 16296, 8, 4,503	8, 16380, 16324, 236, 15712, 2532, 2532, 15712, 236, 16324, 16380, 8,504};505 506static const uint16_t filter_12tap_16p_150[108] = {507	16340, 116, 0, 15916, 1076, 2724, 1076, 15916, 0, 116, 16340, 0,508	16340, 100, 32, 15908, 920, 2716, 1232, 15936, 16344, 128, 16340, 0,509	16344, 84, 64, 15908, 772, 2692, 1388, 15968, 16304, 140, 16344, 16380,510	16344, 68, 92, 15912, 624, 2652, 1540, 16008, 16264, 152, 16344, 16380,511	16348, 52, 112, 15928, 484, 2592, 1688, 16060, 16220, 160, 16348, 16380,512	16352, 40, 132, 15952, 348, 2520, 1836, 16124, 16176, 168, 16356, 16376,513	16356, 24, 148, 15980, 224, 2436, 1976, 16200, 16132, 172, 16364, 16372,514	16360, 12, 160, 16012, 108, 2336, 2104, 16288, 16088, 172, 16372, 16368,515	16364, 0, 168, 16048, 0, 2228, 2228, 0, 16048, 168, 0, 16364,516};517 518static const uint16_t filter_12tap_16p_183[108] = {519	36, 72, 16132, 16228, 1224, 2224, 1224, 16228, 16132, 72, 36, 0,520	28, 80, 16156, 16184, 1120, 2224, 1328, 16280, 16112, 64, 40, 16380,521	24, 84, 16180, 16144, 1016, 2208, 1428, 16340, 16092, 52, 48, 16380,522	16, 88, 16208, 16112, 912, 2188, 1524, 16, 16072, 36, 56, 16380,523	12, 92, 16232, 16084, 812, 2156, 1620, 88, 16056, 24, 64, 16380,524	8, 92, 16256, 16064, 708, 2116, 1708, 164, 16044, 4, 68, 16380,525	4, 88, 16280, 16048, 608, 2068, 1792, 244, 16036, 16372, 76, 16380,526	0, 88, 16308, 16036, 512, 2008, 1872, 328, 16032, 16352, 80, 16380,527	0, 84, 16328, 16032, 416, 1944, 1944, 416, 16032, 16328, 84, 0,528};529 530static const uint16_t *wbscl_get_filter_3tap_16p(struct fixed31_32 ratio)531{532	if (ratio.value < dc_fixpt_one.value)533		return filter_3tap_16p_upscale;534	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)535		return filter_3tap_16p_117;536	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)537		return filter_3tap_16p_150;538	else539		return filter_3tap_16p_183;540}541 542static const uint16_t *wbscl_get_filter_4tap_16p(struct fixed31_32 ratio)543{544	if (ratio.value < dc_fixpt_one.value)545		return filter_4tap_16p_upscale;546	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)547		return filter_4tap_16p_117;548	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)549		return filter_4tap_16p_150;550	else551		return filter_4tap_16p_183;552}553 554static const uint16_t *wbscl_get_filter_5tap_16p(struct fixed31_32 ratio)555{556	if (ratio.value < dc_fixpt_one.value)557		return filter_5tap_16p_upscale;558	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)559		return filter_5tap_16p_117;560	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)561		return filter_5tap_16p_150;562	else563		return filter_5tap_16p_183;564}565 566static const uint16_t *wbscl_get_filter_6tap_16p(struct fixed31_32 ratio)567{568	if (ratio.value < dc_fixpt_one.value)569		return filter_6tap_16p_upscale;570	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)571		return filter_6tap_16p_117;572	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)573		return filter_6tap_16p_150;574	else575		return filter_6tap_16p_183;576}577 578static const uint16_t *wbscl_get_filter_7tap_16p(struct fixed31_32 ratio)579{580	if (ratio.value < dc_fixpt_one.value)581		return filter_7tap_16p_upscale;582	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)583		return filter_7tap_16p_117;584	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)585		return filter_7tap_16p_150;586	else587		return filter_7tap_16p_183;588}589 590static const uint16_t *wbscl_get_filter_8tap_16p(struct fixed31_32 ratio)591{592	if (ratio.value < dc_fixpt_one.value)593		return filter_8tap_16p_upscale;594	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)595		return filter_8tap_16p_117;596	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)597		return filter_8tap_16p_150;598	else599		return filter_8tap_16p_183;600}601 602static const uint16_t *wbscl_get_filter_9tap_16p(struct fixed31_32 ratio)603{604	if (ratio.value < dc_fixpt_one.value)605		return filter_9tap_16p_upscale;606	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)607		return filter_9tap_16p_117;608	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)609		return filter_9tap_16p_150;610	else611		return filter_9tap_16p_183;612}613static const uint16_t *wbscl_get_filter_10tap_16p(struct fixed31_32 ratio)614{615	if (ratio.value < dc_fixpt_one.value)616		return filter_10tap_16p_upscale;617	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)618		return filter_10tap_16p_117;619	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)620		return filter_10tap_16p_150;621	else622		return filter_10tap_16p_183;623}624 625static const uint16_t *wbscl_get_filter_11tap_16p(struct fixed31_32 ratio)626{627	if (ratio.value < dc_fixpt_one.value)628		return filter_11tap_16p_upscale;629	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)630		return filter_11tap_16p_117;631	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)632		return filter_11tap_16p_150;633	else634		return filter_11tap_16p_183;635}636 637static const uint16_t *wbscl_get_filter_12tap_16p(struct fixed31_32 ratio)638{639	if (ratio.value < dc_fixpt_one.value)640		return filter_12tap_16p_upscale;641	else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)642		return filter_12tap_16p_117;643	else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)644		return filter_12tap_16p_150;645	else646		return filter_12tap_16p_183;647}648 649static const uint16_t *wbscl_get_filter_coeffs_16p(int taps, struct fixed31_32 ratio)650{651	if (taps == 12)652		return wbscl_get_filter_12tap_16p(ratio);653	else if (taps == 11)654		return wbscl_get_filter_11tap_16p(ratio);655	else if (taps == 10)656		return wbscl_get_filter_10tap_16p(ratio);657	else if (taps == 9)658		return wbscl_get_filter_9tap_16p(ratio);659	else if (taps == 8)660		return wbscl_get_filter_8tap_16p(ratio);661	else if (taps == 7)662		return wbscl_get_filter_7tap_16p(ratio);663	else if (taps == 6)664		return wbscl_get_filter_6tap_16p(ratio);665	else if (taps == 5)666		return wbscl_get_filter_5tap_16p(ratio);667	else if (taps == 4)668		return wbscl_get_filter_4tap_16p(ratio);669	else if (taps == 3)670		return wbscl_get_filter_3tap_16p(ratio);671	else if (taps == 2)672		return get_filter_2tap_16p();673	else if (taps == 1)674		return NULL;675	else {676		/* should never happen, bug */677		BREAK_TO_DEBUGGER();678		return NULL;679	}680}681 682static void wbscl_set_scaler_filter(683	struct dcn20_dwbc *dwbc20,684	uint32_t taps,685	enum wbscl_coef_filter_type_sel filter_type,686	const uint16_t *filter)687{688	const int tap_pairs = (taps + 1) / 2;689	int phase;690	int pair;691	uint16_t odd_coef, even_coef;692 693	if (!filter)694		return;695 696	for (phase = 0; phase < (NUM_PHASES / 2 + 1); phase++) {697		for (pair = 0; pair < tap_pairs; pair++) {698			even_coef = filter[phase * taps + 2 * pair];699			if ((pair * 2 + 1) < taps)700				odd_coef = filter[phase * taps + 2 * pair + 1];701			else702				odd_coef = 0;703 704			REG_SET_3(WBSCL_COEF_RAM_SELECT, 0,705				WBSCL_COEF_RAM_TAP_PAIR_IDX, pair,706				WBSCL_COEF_RAM_PHASE, phase,707				WBSCL_COEF_RAM_FILTER_TYPE, filter_type);708 709			REG_SET_4(WBSCL_COEF_RAM_TAP_DATA, 0,710				/* Even tap coefficient (bits 1:0 fixed to 0) */711				WBSCL_COEF_RAM_EVEN_TAP_COEF, even_coef,712				/* Write/read control for even coefficient */713				WBSCL_COEF_RAM_EVEN_TAP_COEF_EN, 1,714				/* Odd tap coefficient (bits 1:0 fixed to 0) */715				WBSCL_COEF_RAM_ODD_TAP_COEF, odd_coef,716				/* Write/read control for odd coefficient */717				WBSCL_COEF_RAM_ODD_TAP_COEF_EN, 1);718		}719	}720}721 722bool dwb_program_horz_scalar(struct dcn20_dwbc *dwbc20,723		uint32_t src_width,724		uint32_t dest_width,725		struct scaling_taps num_taps)726{727	uint32_t h_ratio_luma = 1;728	uint32_t h_taps_luma = num_taps.h_taps;729	uint32_t h_taps_chroma = num_taps.h_taps_c;730	int32_t h_init_phase_luma = 0;731	int32_t h_init_phase_chroma = 0;732	uint32_t h_init_phase_luma_int = 0;733	uint32_t h_init_phase_luma_frac = 0;734	uint32_t h_init_phase_chroma_int = 0;735	uint32_t h_init_phase_chroma_frac = 0;736	const uint16_t *filter_h = NULL;737	const uint16_t *filter_h_c = NULL;738 739 740	struct fixed31_32 tmp_h_init_phase_luma = dc_fixpt_from_int(0);741	struct fixed31_32 tmp_h_init_phase_chroma = dc_fixpt_from_int(0);742 743 744	/*Calculate ratio*/745	struct fixed31_32 tmp_h_ratio_luma = dc_fixpt_from_fraction(746		src_width, dest_width);747 748	if (dc_fixpt_floor(tmp_h_ratio_luma) == 8)749		h_ratio_luma = -1;750	else751		h_ratio_luma = dc_fixpt_u3d19(tmp_h_ratio_luma) << 5;752 753	/*Program ratio*/754	REG_UPDATE(WBSCL_HORZ_FILTER_SCALE_RATIO, WBSCL_H_SCALE_RATIO, h_ratio_luma);755 756	/* Program taps*/757	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_H_NUM_OF_TAPS_Y_RGB, h_taps_luma - 1);758	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_H_NUM_OF_TAPS_CBCR, h_taps_chroma - 1);759 760	/* Calculate phase*/761	tmp_h_init_phase_luma = dc_fixpt_add_int(tmp_h_ratio_luma, h_taps_luma + 1);762	tmp_h_init_phase_luma = dc_fixpt_div_int(tmp_h_init_phase_luma, 2);763	tmp_h_init_phase_luma = dc_fixpt_sub_int(tmp_h_init_phase_luma, h_taps_luma);764 765	h_init_phase_luma = dc_fixpt_s4d19(tmp_h_init_phase_luma);766	h_init_phase_luma_int = (h_init_phase_luma >> 19) & 0x1f;767	h_init_phase_luma_frac = (h_init_phase_luma & 0x7ffff) << 5;768 769	tmp_h_init_phase_chroma = dc_fixpt_mul_int(tmp_h_ratio_luma, 2);770	tmp_h_init_phase_chroma = dc_fixpt_add_int(tmp_h_init_phase_chroma, h_taps_chroma + 1);771	tmp_h_init_phase_chroma = dc_fixpt_div_int(tmp_h_init_phase_chroma, 2);772	tmp_h_init_phase_chroma = dc_fixpt_sub_int(tmp_h_init_phase_chroma, h_taps_chroma);773	tmp_h_init_phase_chroma = dc_fixpt_add(tmp_h_init_phase_chroma, dc_fixpt_from_fraction(1, 4));774 775	h_init_phase_chroma = dc_fixpt_s4d19(tmp_h_init_phase_chroma);776	h_init_phase_chroma_int = (h_init_phase_chroma >> 19) & 0x1f;777	h_init_phase_chroma_frac = (h_init_phase_chroma & 0x7ffff) << 5;778 779	/* Program phase*/780	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_Y_RGB, WBSCL_H_INIT_INT_Y_RGB, h_init_phase_luma_int);781	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_Y_RGB, WBSCL_H_INIT_FRAC_Y_RGB, h_init_phase_luma_frac);782	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_CBCR, WBSCL_H_INIT_INT_CBCR, h_init_phase_chroma_int);783	REG_UPDATE(WBSCL_HORZ_FILTER_INIT_CBCR, WBSCL_H_INIT_FRAC_CBCR, h_init_phase_chroma_frac);784 785	/* Program LUT coefficients*/786	filter_h = wbscl_get_filter_coeffs_16p(787		h_taps_luma, tmp_h_ratio_luma);788	filter_h_c = wbscl_get_filter_coeffs_16p(789		h_taps_chroma, dc_fixpt_from_int(h_ratio_luma * 2));790 791	wbscl_set_scaler_filter(dwbc20, h_taps_luma,792		WBSCL_COEF_LUMA_HORZ_FILTER, filter_h);793 794	wbscl_set_scaler_filter(dwbc20, h_taps_chroma,795		WBSCL_COEF_CHROMA_HORZ_FILTER, filter_h_c);796 797	return true;798}799 800bool dwb_program_vert_scalar(struct dcn20_dwbc *dwbc20,801		uint32_t src_height,802		uint32_t dest_height,803		struct scaling_taps num_taps,804		enum dwb_subsample_position subsample_position)805{806	uint32_t v_ratio_luma = 1;807	uint32_t v_taps_luma = num_taps.v_taps;808	uint32_t v_taps_chroma = num_taps.v_taps_c;809	int32_t v_init_phase_luma = 0;810	int32_t v_init_phase_chroma = 0;811	uint32_t v_init_phase_luma_int = 0;812	uint32_t v_init_phase_luma_frac = 0;813	uint32_t v_init_phase_chroma_int = 0;814	uint32_t v_init_phase_chroma_frac = 0;815 816	const uint16_t *filter_v = NULL;817	const uint16_t *filter_v_c = NULL;818 819	struct fixed31_32 tmp_v_init_phase_luma = dc_fixpt_from_int(0);820	struct fixed31_32 tmp_v_init_phase_chroma = dc_fixpt_from_int(0);821 822	/*Calculate ratio*/823	struct fixed31_32 tmp_v_ratio_luma = dc_fixpt_from_fraction(824		src_height, dest_height);825 826	if (dc_fixpt_floor(tmp_v_ratio_luma) == 8)827		v_ratio_luma = -1;828	else829		v_ratio_luma = dc_fixpt_u3d19(tmp_v_ratio_luma) << 5;830 831	/*Program ratio*/832	REG_UPDATE(WBSCL_VERT_FILTER_SCALE_RATIO, WBSCL_V_SCALE_RATIO, v_ratio_luma);833 834	/* Program taps*/835	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_V_NUM_OF_TAPS_Y_RGB, v_taps_luma - 1);836	REG_UPDATE(WBSCL_TAP_CONTROL, WBSCL_V_NUM_OF_TAPS_CBCR, v_taps_chroma - 1);837 838	/* Calculate phase*/839	tmp_v_init_phase_luma = dc_fixpt_add_int(tmp_v_ratio_luma, v_taps_luma + 1);840	tmp_v_init_phase_luma = dc_fixpt_div_int(tmp_v_init_phase_luma, 2);841	tmp_v_init_phase_luma = dc_fixpt_sub_int(tmp_v_init_phase_luma, v_taps_luma);842 843	v_init_phase_luma = dc_fixpt_s4d19(tmp_v_init_phase_luma);844	v_init_phase_luma_int = (v_init_phase_luma >> 19) & 0x1f;845	v_init_phase_luma_frac = (v_init_phase_luma & 0x7ffff) << 5;846 847	tmp_v_init_phase_chroma = dc_fixpt_mul_int(tmp_v_ratio_luma, 2);848	tmp_v_init_phase_chroma = dc_fixpt_add_int(tmp_v_init_phase_chroma, v_taps_chroma + 1);849	tmp_v_init_phase_chroma = dc_fixpt_div_int(tmp_v_init_phase_chroma, 2);850	tmp_v_init_phase_chroma = dc_fixpt_sub_int(tmp_v_init_phase_chroma, v_taps_chroma);851	if (subsample_position == DWB_COSITED_SUBSAMPLING)852		tmp_v_init_phase_chroma = dc_fixpt_add(tmp_v_init_phase_chroma, dc_fixpt_from_fraction(1, 4));853 854	v_init_phase_chroma = dc_fixpt_s4d19(tmp_v_init_phase_chroma);855	v_init_phase_chroma_int = (v_init_phase_chroma >> 19) & 0x1f;856	v_init_phase_chroma_frac = (v_init_phase_chroma & 0x7ffff) << 5;857 858	/* Program phase*/859	REG_UPDATE(WBSCL_VERT_FILTER_INIT_Y_RGB, WBSCL_V_INIT_INT_Y_RGB, v_init_phase_luma_int);860	REG_UPDATE(WBSCL_VERT_FILTER_INIT_Y_RGB, WBSCL_V_INIT_FRAC_Y_RGB, v_init_phase_luma_frac);861	REG_UPDATE(WBSCL_VERT_FILTER_INIT_CBCR, WBSCL_V_INIT_INT_CBCR, v_init_phase_chroma_int);862	REG_UPDATE(WBSCL_VERT_FILTER_INIT_CBCR, WBSCL_V_INIT_FRAC_CBCR, v_init_phase_chroma_frac);863 864 865	/* Program LUT coefficients*/866	filter_v  = wbscl_get_filter_coeffs_16p(867		v_taps_luma, tmp_v_ratio_luma);868	filter_v_c = wbscl_get_filter_coeffs_16p(869		v_taps_chroma, dc_fixpt_from_int(v_ratio_luma * 2));870	wbscl_set_scaler_filter(dwbc20, v_taps_luma,871		WBSCL_COEF_LUMA_VERT_FILTER, filter_v);872 873	wbscl_set_scaler_filter(dwbc20, v_taps_chroma,874		WBSCL_COEF_CHROMA_VERT_FILTER, filter_v_c);875	return true;876}877