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