| /* |
| * Copyright (C) 2017 Amlogic, Inc. All rights reserved. |
| * * |
| This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * * |
| This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| * * |
| You should have received a copy of the GNU General Public License along |
| * with this program; if not, write to the Free Software Foundation, Inc., |
| * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| * * |
| Description: |
| */ |
| |
| #include <asm/cpu_id.h> |
| #include <malloc.h> |
| #include "hdr2.h" |
| #include "aml_vpp_reg.h" |
| #include <common.h> |
| |
| int cgain_lut0[65] = { |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x4c0, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x40e, |
| 0x429, 0x444, 0x45f, 0x479, 0x492, 0x4ab, 0x4c3, 0x4db, 0x4f2, |
| 0x509, 0x520, 0x536, 0x54c, 0x561, 0x576, 0x58b, 0x59f, 0x5b3, |
| 0x5c0, 0x5d0, 0x5f2, 0x609, 0x620, 0x636, 0x64c, 0x661, 0x676, |
| 0x68b, 0x69f |
| }; |
| |
| int cgain_lut1[65] = { |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x40e, |
| 0x419, 0x424, 0x43f, 0x449, 0x452, 0x46b, 0x473, 0x48b, 0x492, |
| 0x4a9, 0x4b0, 0x4c6, 0x4dc, 0x4e1, 0x4f6, 0x50b, 0x51f, 0x523, |
| 0x530, 0x540 |
| }; |
| |
| int cgain_lut_bypass[65] = { |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, |
| 0x400, 0x400 |
| }; |
| |
| int cgain_lut2[65] = { |
| 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, |
| 0xc00, 0xc00, 0xc0e, 0xc79, 0xcdb, 0xd36, 0xd8b, 0xdda, 0xe25, |
| 0xe6b, 0xead, 0xeec, 0xf28, 0xf61, 0xf98, 0xfcc, 0xfff, 0x102f, |
| 0x105d, 0x108a, 0x10b5, 0x10df, 0x1107, 0x112e, 0x1154, 0x1178, 0x119c, |
| 0x11bf, 0x11e0, 0x1201, 0x1221, 0x1240, 0x125e, 0x127c, 0x1299, 0x12b5, |
| 0x12d1, 0x12ec, 0x1306, 0x1320, 0x1339, 0x1352, 0x136b, 0x1383, 0x139a, |
| 0x13b1, 0x13c7, 0x13de, 0x13f3, 0x1409, 0x141e, 0x1432, 0x1447, 0x145b, |
| 0x146e, 0x1482 |
| }; |
| |
| int eo_y_lut_hdr[143] = { |
| 132288, 136832, 165440, 181832, 193440, 202088, 210400, 216476, 221882, |
| 227920, 231986, 235648, 239639, 243964, 247193, 249698, 252377, 271330, |
| 285261, 297148, 306377, 314682, 321922, 329204, 334486, 340750, 346085, |
| 350369, 355325, 360734, 363991, 367697, 371896, 376636, 379400, 382389, |
| 385731, 389458, 393410, 395711, 398260, 401078, 404188, 407615, 410492, |
| 412562, 414834, 417322, 420045, 423021, 426127, 427900, 429831, 431934, |
| 434222, 436709, 439410, 442342, 443945, 445668, 447230, 448187, 449224, |
| 450344, 451555, 452864, 454277, 455803, 457449, 458988, 459945, 460977, |
| 462089, 463286, 464576, 465964, 467458, 469066, 470795, 472655, 474655, |
| 475971, 477126, 478368, 479702, 481136, 482676, 484330, 486107, 488015, |
| 490063, 491891, 493071, 494339, 495699, 497159, 498727, 500409, 502262, |
| 504308, 506503, 508381, 509646, 511003, 512460, 512934, 513098, 513279, |
| 513477, 513691, 513923, 514172, 514438, 514720, 515017, 515328, 515650, |
| 515981, 516320, 516662, 517006, 517349, 517689, 518022, 518347, 518662, |
| 518968, 519263, 519549, 519827, 520097, 520363, 520625, 520888, 521155, |
| 521431, 521727, 522054, 522431, 522871, 523371, 523881, 524287 |
| }; |
| |
| int eo_y_lut_hlg[143] = { |
| 0, 169296, 202068, 221184, 234837, 246442, 253952, 262485, 267605, |
| 273408, 279210, 282794, 286720, 290986, 295253, 297728, 300373, 319488, |
| 333141, 344746, 352256, 360789, 365909, 371712, 377514, 381098, 385024, |
| 389290, 393557, 396032, 398677, 401493, 404480, 407637, 410282, 412032, |
| 413866, 415786, 417792, 419882, 422058, 424320, 426325, 427541, 428800, |
| 430101, 431445, 432832, 434261, 435733, 437248, 438805, 440405, 442048, |
| 443050, 443914, 444800, 445706, 446634, 447584, 448554, 449546, 450560, |
| 451594, 452650, 453728, 454826, 455946, 457088, 458250, 459093, 459696, |
| 460309, 460933, 461568, 462213, 462869, 463536, 464213, 464911, 465640, |
| 466401, 467197, 468028, 468896, 469803, 470750, 471740, 472774, 473854, |
| 474982, 475648, 476264, 476907, 477579, 478281, 479014, 479780, 480580, |
| 481416, 482289, 483201, 484154, 485150, 486190, 487276, 488411, 489597, |
| 490835, 491824, 492500, 493206, 493944, 494714, 495519, 496360, 497238, |
| 498156, 499114, 500115, 501161, 502254, 503396, 504588, 505834, 507135, |
| 508199, 508909, 509651, 510426, 511236, 512081, 512965, 513888, 514852, |
| 515859, 516911, 518010, 519158, 520358, 521611, 522920, 524287 |
| }; |
| |
| int eo_y_lut_sdr[143] = { |
| 0, 163808, 199044, 219568, 234610, 247036, 255751, 264272, 270593, |
| 277939, 282430, 287163, 292441, 296593, 299792, 303278, 307054, 328697, |
| 344063, 354448, 364052, 372123, 379268, 384835, 391196, 395793, 399793, |
| 404214, 409063, 411973, 414834, 417919, 421229, 424767, 427260, 429261, |
| 431380, 433618, 435975, 438453, 441054, 443072, 444496, 445981, 447530, |
| 449142, 450817, 452556, 454360, 456229, 458163, 459457, 460489, 461555, |
| 462654, 463787, 464953, 466153, 467387, 468655, 469957, 471294, 472665, |
| 474071, 475324, 476062, 476817, 477590, 478381, 479190, 480016, 480861, |
| 481723, 482603, 483502, 484418, 485353, 486306, 487278, 488267, 489276, |
| 490302, 491348, 491966, 492507, 493057, 493618, 494187, 494766, 495354, |
| 495952, 496559, 497176, 497803, 498439, 499084, 499740, 500405, 501079, |
| 501764, 502458, 503161, 503875, 504598, 505332, 506075, 506828, 507590, |
| 508133, 508525, 508921, 509322, 509728, 510140, 510556, 510977, 511404, |
| 511835, 512272, 512713, 513160, 513611, 514068, 514530, 514997, 515469, |
| 515946, 516429, 516916, 517409, 517907, 518410, 518918, 519432, 519950, |
| 520474, 521003, 521537, 522077, 522622, 523172, 523727, 524287 |
| }; |
| |
| int eo_y_lut_bypass[143] = { |
| 0, 360448, 376832, 385024, 393216, 397312, 401408, 405504, 409600, |
| 411648, 413696, 415744, 417792, 419840, 421888, 423936, 425984, 434176, |
| 442368, 446464, 450560, 454656, 458752, 460800, 462848, 464896, 466944, |
| 468992, 471040, 473088, 475136, 476160, 477184, 478208, 479232, 480256, |
| 481280, 482304, 483328, 484352, 485376, 486400, 487424, 488448, 489472, |
| 490496, 491520, 492032, 492544, 493056, 493568, 494080, 494592, 495104, |
| 495616, 496128, 496640, 497152, 497664, 498176, 498688, 499200, 499712, |
| 500224, 500736, 501248, 501760, 502272, 502784, 503296, 503808, 504320, |
| 504832, 505344, 505856, 506368, 506880, 507392, 507904, 508160, 508416, |
| 508672, 508928, 509184, 509440, 509696, 509952, 510208, 510464, 510720, |
| 510976, 511232, 511488, 511744, 512000, 512256, 512512, 512768, 513024, |
| 513280, 513536, 513792, 514048, 514304, 514560, 514816, 515072, 515328, |
| 515584, 515840, 516096, 516352, 516608, 516864, 517120, 517376, 517632, |
| 517888, 518144, 518400, 518656, 518912, 519168, 519424, 519680, 519936, |
| 520192, 520448, 520704, 520960, 521216, 521472, 521728, 521984, 522240, |
| 522496, 522752, 523008, 523264, 523520, 523776, 524032, 524287 |
| }; |
| |
| int oe_y_lut_hdr[149] = {0, 3, 5, 8, 12, 19, 28, 41, 60, 67, 74, 80, 85, |
| 96, 105, 113, 120, 134, 146, 157, 167, 184, 200, 214, 227, 250, 270, |
| 288, 304, 332, 357, 380, 400, 435, 465, 492, 517, 559, 595, 628, 656, |
| 706, 749, 787, 820, 850, 878, 903, 927, 949, 970, 989, 1008, 1042, 1073, |
| 1102, 1129, 1154, 1177, 1199, 1219, 1258, 1292, 1324, 1354, 1381, 1407, |
| 1431, 1453, 1495, 1533, 1568, 1600, 1630, 1657, 1683, 1708, 1753, 1794, |
| 1831, 1865, 1897, 1926, 1954, 1980, 2028, 2071, 2110, 2146, 2179, 2210, |
| 2239, 2267, 2317, 2361, 2402, 2440, 2474, 2506, 2536, 2564, 2616, 2662, |
| 2704, 2742, 2778, 2810, 2841, 2870, 2922, 2969, 3011, 3050, 3086, 3119, |
| 3150, 3179, 3231, 3278, 3321, 3360, 3396, 3429, 3459, 3488, 3540, 3587, |
| 3629, 3668, 3703, 3736, 3766, 3795, 3821, 3846, 3870, 3892, 3913, 3934, |
| 3953, 3971, 3989, 4006, 4022, 4038, 4053, 4068, 4082, 4095 |
| }; |
| |
| int oe_y_lut_hlg[149] = {0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 6, 6, 7, 8, 9, |
| 9, 10, 12, 12, 13, 15, 16, 18, 19, 21, 24, 25, 27, 30, 33, 36, 39, |
| 43, 48, 51, 55, 61, 67, 73, 78, 87, 96, 103, 110, 117, 123, 129, 135, |
| 141, 146, 151, 156, 166, 175, 183, 192, 199, 207, 214, 221, 235, 247, |
| 259, 271, 282, 293, 303, 313, 332, 350, 367, 384, 399, 414, 429, 443, |
| 470, 495, 519, 543, 565, 586, 607, 627, 665, 701, 735, 768, 799, 829, |
| 858, 886, 940, 991, 1039, 1086, 1130, 1173, 1214, 1254, 1330, 1402, |
| 1470, 1536, 1598, 1659, 1717, 1773, 1881, 1982, 2079, 2165, 2243, |
| 2313, 2377, 2436, 2541, 2633, 2714, 2788, 2855, 2916, 2972, 3025, |
| 3119, 3203, 3279, 3347, 3409, 3467, 3520, 3570, 3616, 3660, 3701, |
| 3740, 3778, 3813, 3847, 3879, 3910, 3939, 3968, 3995, 4022, 4047, |
| 4072, 4095 |
| }; |
| |
| int oe_y_lut_sdr[149] = {0, 1, 1, 2, 2, 3, 5, 7, 9, 10, 11, 12, 12, 13, |
| 15, 16, 16, 18, 20, 21, 22, 24, 26, 28, 30, 33, 35, 38, 40, 44, 47, |
| 50, 53, 59, 63, 67, 71, 78, 85, 90, 95, 105, 113, 121, 127, 134, 140, |
| 146, 151, 156, 161, 166, 170, 179, 187, 195, 202, 209, 215, 222, 228, |
| 239, 250, 260, 270, 279, 287, 296, 304, 319, 334, 347, 360, 372, 384, |
| 395, 406, 426, 445, 464, 481, 497, 513, 528, 542, 569, 595, 619, 642, |
| 664, 684, 704, 724, 760, 794, 826, 857, 886, 914, 940, 966, 1015, 1060, |
| 1103, 1144, 1183, 1220, 1255, 1290, 1355, 1415, 1473, 1527, 1579, 1628, |
| 1676, 1722, 1808, 1889, 1966, 2039, 2108, 2174, 2237, 2298, 2414, 2522, |
| 2624, 2721, 2814, 2902, 2987, 3068, 3147, 3222, 3296, 3367, 3436, 3503, |
| 3569, 3633, 3695, 3756, 3816, 3874, 3931, 3987, 4042, 4095 |
| }; |
| |
| static int oe_y_lut_bypass[149] = { |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, |
| 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, |
| 26, 28, 30, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, 88, 96, |
| 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, |
| 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 832, 896, |
| 960, 1024, 1152, 1280, 1408, 1536, 1664, 1792, 1920, 2048, 2176, |
| 2304, 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456, 3584, |
| 3712, 3840, 3968, 4095 |
| }; |
| |
| int oo_y_lut_hdr_hlg[149] = { |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 3917, 3776, 3662, 3565, 3410, 3288, 3188, 3104, 2968, 2862, 2775, |
| 2702, 2639, 2584, 2535, 2491, 2452, 2416, 2383, 2352, 2297, 2249, |
| 2207, 2169, 2134, 2103, 2074, 2047, 2000, 1958, 1921, 1888, 1858, |
| 1831, 1806, 1782, 1741, 1705, 1672, 1644, 1617, 1594, 1572, 1552, |
| 1515, 1484, 1456, 1431, 1408, 1387, 1368, 1351, 1319, 1292, 1267, |
| 1245, 1226, 1208, 1191, 1176, 1148, 1124, 1103, 1084, 1067, 1051, |
| 1037, 1023, 1000, 979, 960, 944, 929, 915, 903, 891, 870, 852, |
| 836, 822, 808, 797, 786, 776, 757, 742, 728, 715, 704, 693, 684, |
| 675, 659, 646, 633, 622, 613, 604, 595, 588, 581, 574, 568, 562, |
| 557, 551, 546, 542, 537, 533, 529, 525, 522, 518, 515, 512 |
| }; |
| |
| int oo_y_lut_hdr_sdr[149] = { |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255 |
| }; |
| |
| int oo_y_lut_bypass[149] = { |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, |
| 255, 255, 255, 255, 255, 255 |
| }; |
| |
| int oo_y_lut_hlg_hdr[149] = { |
| 4, 8, 9, 11, 12, 14, 16, 19, 22, 23, 24, 24, 25, 26, 27, 28, 29, |
| 30, 31, 32, 33, 35, 36, 37, 38, 40, 42, 43, 44, 46, 48, 49, 51, |
| 53, 55, 57, 58, 61, 63, 65, 67, 70, 73, 75, 77, 79, 81, 82, 84, |
| 85, 86, 88, 89, 91, 93, 95, 96, 98, 99, 101, 102, 104, 107, 109, |
| 111, 112, 114, 116, 117, 120, 122, 125, 127, 129, 131, 133, 135, |
| 138, 141, 144, 146, 148, 151, 153, 155, 158, 162, 165, 168, 171, |
| 173, 176, 178, 182, 186, 190, 193, 196, 199, 202, 204, 209, 214, |
| 218, 222, 225, 229, 232, 235, 240, 245, 250, 255, 259, 263, 266, |
| 270, 276, 282, 288, 293, 297, 302, 306, 310, 317, 324, 330, 336, |
| 342, 347, 352, 356, 360, 365, 369, 372, 376, 380, 383, 386, 389, |
| 392, 395, 398, 401, 404, 407, 409 |
| }; |
| |
| int oo_y_lut_sdr_hdr[149] = { |
| 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
| 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
| 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
| 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
| 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
| 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
| 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
| 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
| 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
| 32, 32, 32, 32, 32 |
| }; |
| |
| int oo_y_lut_hlg_sdr[149] = { |
| 245, 269, 275, 282, 288, 295, 302, 309, 316, 318, 320, 322, 323, |
| 326, 327, 329, 331, 333, 335, 337, 338, 341, 343, 345, 346, 349, |
| 351, 353, 354, 357, 359, 361, 362, 365, 367, 369, 371, 373, 376, |
| 378, 379, 382, 384, 386, 388, 390, 391, 392, 393, 394, 395, 396, |
| 397, 399, 400, 401, 402, 403, 404, 405, 406, 408, 409, 410, 412, |
| 413, 414, 415, 416, 417, 419, 420, 421, 422, 423, 424, 425, 427, |
| 428, 430, 431, 432, 433, 434, 435, 437, 438, 440, 441, 442, 443, |
| 444, 445, 447, 448, 450, 451, 452, 453, 454, 455, 457, 459, 460, |
| 462, 463, 464, 465, 466, 468, 469, 471, 472, 473, 475, 476, 477, |
| 479, 480, 482, 483, 484, 486, 487, 488, 490, 491, 493, 494, 496, |
| 497, 498, 499, 500, 501, 502, 503, 503, 504, 505, 506, 506, 507, |
| 508, 508, 509, 509, 510, 510 |
| }; |
| |
| int oo_y_lut_sdr_hlg[149] = { |
| 1060, 967, 946, 924, 903, 883, 863, 844, 825, 819, 814, 810, 806, |
| 800, 795, 791, 788, 782, 777, 773, 770, 764, 760, 756, 753, |
| 747, 743, 739, 736, 730, 726, 722, 719, 714, 710, 706, 703, |
| 698, 694, 690, 687, 682, 678, 674, 671, 669, 667, 664, 663, |
| 661, 659, 658, 656, 654, 651, 649, 648, 646, 644, 643, 641, |
| 639, 637, 635, 633, 631, 630, 628, 627, 625, 622, 620, 619, |
| 617, 616, 614, 613, 610, 608, 606, 605, 603, 602, 600, 599, |
| 597, 595, 593, 591, 590, 588, 587, 585, 583, 581, 579, 578, |
| 576, 575, 573, 572, 570, 568, 566, 565, 563, 562, 561, 559, |
| 557, 555, 554, 552, 550, 549, 548, 547, 545, 543, 541, 539, |
| 538, 537, 536, 534, 532, 530, 529, 527, 526, 525, 523, 522, |
| 521, 520, 519, 518, 518, 517, 516, 515, 515, 514, 513, 513, |
| 512, 512, 511, 511 |
| }; |
| |
| int oo_y_lut_1[149] = { |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, |
| 4095, 4095, 4095, 4095, 4095, 4095 |
| }; |
| |
| static uint out_luma = 5; |
| static uint in_luma = 1;/*1 as 100luminance*/ |
| static uint adp_scal_shift = 10;/*1 as 100luminance*/ |
| |
| int ncl_2020_709[9] = { |
| 2684, -489, -147, -201, 2266, -17, -29, -171, 2248}; |
| |
| int ncl_709_2020[9] = {1285, 674, 89, 142, 1883, 23, 34, 180, 1834}; |
| |
| int rgb2yuvpre[3] = {0, 0, 0}; |
| int rgb2yuvpos[3] = {64, 512, 512}; |
| int yuv2rgbpre[3] = {-64, -512, -512}; |
| int yuv2rgbpos[3] = {0, 0, 0}; |
| int bypass_pre[3] = {0, 0, 0}; |
| int bypass_pos[3] = {0, 0, 0}; |
| |
| int yuv2rgbmat[15] = { |
| 1197, 0, 0, 1197, 1851, 0, 1197, 0, 1163, 1197, 2271, 0, 1197, 0, 2011}; |
| int rgb2ycbcr[15] = { |
| 230, 594, 52, -125, -323, 448, 448, -412, -36, 0, 0, 0, 0, 0, 0}; |
| int rgb2ycbcr_ncl2020[15] = { |
| 230, 594, 52, -125, -323, 448, 448, -412, -36, 0, 0, 0, 0, 0, 0}; |
| int rgb2ycbcr_709[15] = { |
| 186, 627, 63, -103, -345, 448, 448, -407, -41, 0, 0, 0, 0, 0, 0}; |
| int ycbcr2rgb_709[15] = { |
| 1192, 0, 1836, 1192, -217, -546, 1192, 2166, 0, 0, 0, 0, 0, 0, 0}; |
| int ycbcr2rgb_ncl2020[15] = { |
| 1197, 0, 1726, 1197, -193, -669, 1197, 2202, 0, 0, 0, 0, 0, 0, 0}; |
| |
| static int bypass_coeff[15] = { |
| 1024, 0, 0, |
| 0, 1024, 0, |
| 0, 0, 1024, |
| 0, 0, 0, |
| 0, 0, 0, |
| }; |
| |
| void set_hdr_matrix( |
| enum hdr_module_sel module_sel, |
| enum hdr_matrix_sel mtx_sel, |
| struct hdr_proc_mtx_param_s *hdr_mtx_param) |
| { |
| unsigned int MATRIXI_COEF00_01 = 0; |
| unsigned int MATRIXI_COEF02_10 = 0; |
| unsigned int MATRIXI_COEF11_12 = 0; |
| unsigned int MATRIXI_COEF20_21 = 0; |
| unsigned int MATRIXI_COEF22 = 0; |
| /*unsigned int MATRIXI_COEF30_31 = 0;*/ |
| /*unsigned int MATRIXI_COEF32_40 = 0;*/ |
| /*unsigned int MATRIXI_COEF41_42 = 0;*/ |
| unsigned int MATRIXI_OFFSET0_1 = 0; |
| unsigned int MATRIXI_OFFSET2 = 0; |
| unsigned int MATRIXI_PRE_OFFSET0_1 = 0; |
| unsigned int MATRIXI_PRE_OFFSET2 = 0; |
| /*unsigned int MATRIXI_CLIP = 0;*/ |
| unsigned int MATRIXI_EN_CTRL = 0; |
| |
| unsigned int MATRIXO_COEF00_01 = 0; |
| unsigned int MATRIXO_COEF02_10 = 0; |
| unsigned int MATRIXO_COEF11_12 = 0; |
| unsigned int MATRIXO_COEF20_21 = 0; |
| unsigned int MATRIXO_COEF22 = 0; |
| /*unsigned int MATRIXO_COEF30_31 = 0;*/ |
| /*unsigned int MATRIXO_COEF32_40 = 0;*/ |
| /*unsigned int MATRIXO_COEF41_42 = 0;*/ |
| unsigned int MATRIXO_OFFSET0_1 = 0; |
| unsigned int MATRIXO_OFFSET2 = 0; |
| unsigned int MATRIXO_PRE_OFFSET0_1 = 0; |
| unsigned int MATRIXO_PRE_OFFSET2 = 0; |
| /*unsigned int MATRIXO_CLIP = 0;*/ |
| unsigned int MATRIXO_EN_CTRL = 0; |
| |
| unsigned int CGAIN_OFFT = 0; |
| unsigned int CGAIN_COEF0 = 0; |
| unsigned int CGAIN_COEF1 = 0; |
| unsigned int ADPS_CTRL = 0; |
| unsigned int ADPS_ALPHA0 = 0; |
| unsigned int ADPS_ALPHA1 = 0; |
| unsigned int ADPS_BETA0 = 0; |
| unsigned int ADPS_BETA1 = 0; |
| unsigned int ADPS_BETA2 = 0; |
| unsigned int ADPS_COEF0 = 0; |
| unsigned int ADPS_COEF1 = 0; |
| unsigned int GMUT_CTRL = 0; |
| unsigned int GMUT_COEF0 = 0; |
| unsigned int GMUT_COEF1 = 0; |
| unsigned int GMUT_COEF2 = 0; |
| unsigned int GMUT_COEF3 = 0; |
| unsigned int GMUT_COEF4 = 0; |
| |
| unsigned int hdr_ctrl = 0; |
| |
| int adpscl_mode = 0; |
| |
| int c_gain_lim_coef[3]; |
| int gmut_coef[3][3]; |
| int gmut_shift; |
| int adpscl_enable[3]; |
| int adpscl_alpha[3] = {0, 0, 0}; |
| int adpscl_shift[3]; |
| int adpscl_ys_coef[3] = {0, 0, 0}; |
| int adpscl_beta[3]; |
| int adpscl_beta_s[3]; |
| |
| int i = 0; |
| int mtx[15] = { |
| 1024, 0, 0, |
| 0, 1024, 0, |
| 0, 0, 1024, |
| 0, 0, 0, |
| 0, 0, 0, |
| }; |
| |
| if (module_sel & VD1_HDR) { |
| MATRIXI_COEF00_01 = VD1_HDR2_MATRIXI_COEF00_01; |
| MATRIXI_COEF00_01 = VD1_HDR2_MATRIXI_COEF00_01; |
| MATRIXI_COEF02_10 = VD1_HDR2_MATRIXI_COEF02_10; |
| MATRIXI_COEF11_12 = VD1_HDR2_MATRIXI_COEF11_12; |
| MATRIXI_COEF20_21 = VD1_HDR2_MATRIXI_COEF20_21; |
| MATRIXI_COEF22 = VD1_HDR2_MATRIXI_COEF22; |
| /*MATRIXI_COEF30_31 = VD1_HDR2_MATRIXI_COEF30_31;*/ |
| /*MATRIXI_COEF32_40 = VD1_HDR2_MATRIXI_COEF32_40;*/ |
| /*MATRIXI_COEF41_42 = VD1_HDR2_MATRIXI_COEF41_42;*/ |
| MATRIXI_OFFSET0_1 = VD1_HDR2_MATRIXI_OFFSET0_1; |
| MATRIXI_OFFSET2 = VD1_HDR2_MATRIXI_OFFSET2; |
| MATRIXI_PRE_OFFSET0_1 = VD1_HDR2_MATRIXI_PRE_OFFSET0_1; |
| MATRIXI_PRE_OFFSET2 = VD1_HDR2_MATRIXI_PRE_OFFSET2; |
| /*MATRIXI_CLIP = VD1_HDR2_MATRIXI_CLIP;*/ |
| MATRIXI_EN_CTRL = VD1_HDR2_MATRIXI_EN_CTRL; |
| |
| MATRIXO_COEF00_01 = VD1_HDR2_MATRIXO_COEF00_01; |
| MATRIXO_COEF00_01 = VD1_HDR2_MATRIXO_COEF00_01; |
| MATRIXO_COEF02_10 = VD1_HDR2_MATRIXO_COEF02_10; |
| MATRIXO_COEF11_12 = VD1_HDR2_MATRIXO_COEF11_12; |
| MATRIXO_COEF20_21 = VD1_HDR2_MATRIXO_COEF20_21; |
| MATRIXO_COEF22 = VD1_HDR2_MATRIXO_COEF22; |
| /*MATRIXO_COEF30_31 = VD1_HDR2_MATRIXO_COEF30_31;*/ |
| /*MATRIXO_COEF32_40 = VD1_HDR2_MATRIXO_COEF32_40;*/ |
| /*MATRIXO_COEF41_42 = VD1_HDR2_MATRIXO_COEF41_42;*/ |
| MATRIXO_OFFSET0_1 = VD1_HDR2_MATRIXO_OFFSET0_1; |
| MATRIXO_OFFSET2 = VD1_HDR2_MATRIXO_OFFSET2; |
| MATRIXO_PRE_OFFSET0_1 = VD1_HDR2_MATRIXO_PRE_OFFSET0_1; |
| MATRIXO_PRE_OFFSET2 = VD1_HDR2_MATRIXO_PRE_OFFSET2; |
| /*MATRIXO_CLIP = VD1_HDR2_MATRIXO_CLIP;*/ |
| MATRIXO_EN_CTRL = VD1_HDR2_MATRIXO_EN_CTRL; |
| |
| CGAIN_OFFT = VD1_HDR2_CGAIN_OFFT; |
| CGAIN_COEF0 = VD1_HDR2_CGAIN_COEF0; |
| CGAIN_COEF1 = VD1_HDR2_CGAIN_COEF1; |
| ADPS_CTRL = VD1_HDR2_ADPS_CTRL; |
| ADPS_ALPHA0 = VD1_HDR2_ADPS_ALPHA0; |
| ADPS_ALPHA1 = VD1_HDR2_ADPS_ALPHA1; |
| ADPS_BETA0 = VD1_HDR2_ADPS_BETA0; |
| ADPS_BETA1 = VD1_HDR2_ADPS_BETA1; |
| ADPS_BETA2 = VD1_HDR2_ADPS_BETA2; |
| ADPS_COEF0 = VD1_HDR2_ADPS_COEF0; |
| ADPS_COEF1 = VD1_HDR2_ADPS_COEF1; |
| GMUT_CTRL = VD1_HDR2_GMUT_CTRL; |
| GMUT_COEF0 = VD1_HDR2_GMUT_COEF0; |
| GMUT_COEF1 = VD1_HDR2_GMUT_COEF1; |
| GMUT_COEF2 = VD1_HDR2_GMUT_COEF2; |
| GMUT_COEF3 = VD1_HDR2_GMUT_COEF3; |
| GMUT_COEF4 = VD1_HDR2_GMUT_COEF4; |
| |
| hdr_ctrl = VD1_HDR2_CTRL; |
| } else if (module_sel & OSD1_HDR) { |
| MATRIXI_COEF00_01 = OSD1_HDR2_MATRIXI_COEF00_01; |
| MATRIXI_COEF00_01 = OSD1_HDR2_MATRIXI_COEF00_01; |
| MATRIXI_COEF02_10 = OSD1_HDR2_MATRIXI_COEF02_10; |
| MATRIXI_COEF11_12 = OSD1_HDR2_MATRIXI_COEF11_12; |
| MATRIXI_COEF20_21 = OSD1_HDR2_MATRIXI_COEF20_21; |
| MATRIXI_COEF22 = OSD1_HDR2_MATRIXI_COEF22; |
| /*MATRIXI_COEF30_31 = OSD1_HDR2_MATRIXI_COEF30_31;*/ |
| /*MATRIXI_COEF32_40 = OSD1_HDR2_MATRIXI_COEF32_40;*/ |
| /*MATRIXI_COEF41_42 = OSD1_HDR2_MATRIXI_COEF41_42;*/ |
| MATRIXI_OFFSET0_1 = OSD1_HDR2_MATRIXI_OFFSET0_1; |
| MATRIXI_OFFSET2 = OSD1_HDR2_MATRIXI_OFFSET2; |
| MATRIXI_PRE_OFFSET0_1 = OSD1_HDR2_MATRIXI_PRE_OFFSET0_1; |
| MATRIXI_PRE_OFFSET2 = OSD1_HDR2_MATRIXI_PRE_OFFSET2; |
| /*MATRIXI_CLIP = OSD1_HDR2_MATRIXI_CLIP;*/ |
| MATRIXI_EN_CTRL = OSD1_HDR2_MATRIXI_EN_CTRL; |
| |
| MATRIXO_COEF00_01 = OSD1_HDR2_MATRIXO_COEF00_01; |
| MATRIXO_COEF00_01 = OSD1_HDR2_MATRIXO_COEF00_01; |
| MATRIXO_COEF02_10 = OSD1_HDR2_MATRIXO_COEF02_10; |
| MATRIXO_COEF11_12 = OSD1_HDR2_MATRIXO_COEF11_12; |
| MATRIXO_COEF20_21 = OSD1_HDR2_MATRIXO_COEF20_21; |
| MATRIXO_COEF22 = OSD1_HDR2_MATRIXO_COEF22; |
| /*MATRIXO_COEF30_31 = OSD1_HDR2_MATRIXO_COEF30_31;*/ |
| /*MATRIXO_COEF32_40 = OSD1_HDR2_MATRIXO_COEF32_40;*/ |
| /*MATRIXO_COEF41_42 = OSD1_HDR2_MATRIXO_COEF41_42;*/ |
| MATRIXO_OFFSET0_1 = OSD1_HDR2_MATRIXO_OFFSET0_1; |
| MATRIXO_OFFSET2 = OSD1_HDR2_MATRIXO_OFFSET2; |
| MATRIXO_PRE_OFFSET0_1 = OSD1_HDR2_MATRIXO_PRE_OFFSET0_1; |
| MATRIXO_PRE_OFFSET2 = OSD1_HDR2_MATRIXO_PRE_OFFSET2; |
| /*MATRIXO_CLIP = OSD1_HDR2_MATRIXO_CLIP;*/ |
| MATRIXO_EN_CTRL = OSD1_HDR2_MATRIXO_EN_CTRL; |
| |
| CGAIN_OFFT = OSD1_HDR2_CGAIN_OFFT; |
| CGAIN_COEF0 = OSD1_HDR2_CGAIN_COEF0; |
| CGAIN_COEF1 = OSD1_HDR2_CGAIN_COEF1; |
| ADPS_CTRL = OSD1_HDR2_ADPS_CTRL; |
| ADPS_ALPHA0 = OSD1_HDR2_ADPS_ALPHA0; |
| ADPS_ALPHA1 = OSD1_HDR2_ADPS_ALPHA1; |
| ADPS_BETA0 = OSD1_HDR2_ADPS_BETA0; |
| ADPS_BETA1 = OSD1_HDR2_ADPS_BETA1; |
| ADPS_BETA2 = OSD1_HDR2_ADPS_BETA2; |
| ADPS_COEF0 = OSD1_HDR2_ADPS_COEF0; |
| ADPS_COEF1 = OSD1_HDR2_ADPS_COEF1; |
| GMUT_CTRL = OSD1_HDR2_GMUT_CTRL; |
| GMUT_COEF0 = OSD1_HDR2_GMUT_COEF0; |
| GMUT_COEF1 = OSD1_HDR2_GMUT_COEF1; |
| GMUT_COEF2 = OSD1_HDR2_GMUT_COEF2; |
| GMUT_COEF3 = OSD1_HDR2_GMUT_COEF3; |
| GMUT_COEF4 = OSD1_HDR2_GMUT_COEF4; |
| |
| hdr_ctrl = OSD1_HDR2_CTRL; |
| } |
| |
| if (hdr_mtx_param == NULL) |
| return; |
| vpp_reg_setb(hdr_ctrl, hdr_mtx_param->mtx_on, 13, 1); |
| |
| if (mtx_sel & HDR_IN_MTX) { |
| for (i = 0; i < 15; i++) |
| mtx[i] = hdr_mtx_param->mtx_in[i]; |
| |
| if ((hdr_mtx_param->mtx_only == MTX_ONLY) && |
| (!hdr_mtx_param->mtx_on)) |
| vpp_reg_write(MATRIXI_EN_CTRL, 1); |
| else |
| vpp_reg_write(MATRIXI_EN_CTRL, |
| hdr_mtx_param->mtx_on); |
| /*yuv in*/ |
| vpp_reg_setb(hdr_ctrl, hdr_mtx_param->mtx_on, 4, 1); |
| |
| vpp_reg_setb(hdr_ctrl, hdr_mtx_param->mtx_only, |
| 16, 1); |
| vpp_reg_setb(hdr_ctrl, 0, 17, 1); |
| /*mtx in en*/ |
| vpp_reg_setb(hdr_ctrl, 1, 14, 1); |
| |
| vpp_reg_write(MATRIXI_COEF00_01, |
| (mtx[0 * 3 + 0] << 16) | (mtx[0 * 3 + 1] & 0x1FFF)); |
| vpp_reg_write(MATRIXI_COEF02_10, |
| (mtx[0 * 3 + 2] << 16) | (mtx[1 * 3 + 0] & 0x1FFF)); |
| vpp_reg_write(MATRIXI_COEF11_12, |
| (mtx[1 * 3 + 1] << 16) | (mtx[1 * 3 + 2] & 0x1FFF)); |
| vpp_reg_write(MATRIXI_COEF20_21, |
| (mtx[2 * 3 + 0] << 16) | (mtx[2 * 3 + 1] & 0x1FFF)); |
| vpp_reg_write(MATRIXI_COEF22, |
| mtx[2 * 3 + 2]); |
| vpp_reg_write(MATRIXI_OFFSET0_1, |
| (hdr_mtx_param->mtxi_pos_offset[0] << 16) | |
| (hdr_mtx_param->mtxi_pos_offset[1] & 0xFFF)); |
| vpp_reg_write(MATRIXI_OFFSET2, |
| hdr_mtx_param->mtxi_pos_offset[2]); |
| vpp_reg_write(MATRIXI_PRE_OFFSET0_1, |
| (hdr_mtx_param->mtxi_pre_offset[0] << 16) | |
| (hdr_mtx_param->mtxi_pre_offset[1] & 0xFFF)); |
| vpp_reg_write(MATRIXI_PRE_OFFSET2, |
| hdr_mtx_param->mtxi_pre_offset[2]); |
| |
| } else if (mtx_sel & HDR_GAMUT_MTX) { |
| for (i = 0; i < 9; i++) |
| gmut_coef[i/3][i%3] = |
| hdr_mtx_param->mtx_gamut[i]; |
| /*for g12a/g12b osd blend shift rtl bug*/ |
| if (((get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12A) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12B)) && |
| (hdr_mtx_param->p_sel & HDR_BYPASS) && |
| (module_sel & OSD1_HDR)) |
| gmut_shift = 10; |
| else |
| gmut_shift = 11; |
| |
| for (i = 0; i < 3; i++) |
| c_gain_lim_coef[i] = |
| hdr_mtx_param->mtx_cgain[i] << 2; |
| /*0, nolinear input, 1, max linear, 2, adpscl mode*/ |
| adpscl_mode = 1; |
| for (i = 0; i < 3; i++) { |
| if (((get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12A) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12B)) && |
| (hdr_mtx_param->p_sel & HDR_BYPASS) && |
| (module_sel & OSD1_HDR)) |
| adpscl_enable[i] = 1; |
| else |
| adpscl_enable[i] = 0; |
| if (hdr_mtx_param->p_sel & HDR_SDR) |
| adpscl_alpha[i] = |
| (1 << adp_scal_shift); |
| else if (hdr_mtx_param->p_sel & SDR_HDR) |
| adpscl_alpha[i] = |
| (1 << adp_scal_shift); |
| else if (hdr_mtx_param->p_sel & HDR_BYPASS) |
| adpscl_alpha[i] = out_luma * |
| (1 << adp_scal_shift) / in_luma; |
| else if (hdr_mtx_param->p_sel & HLG_SDR) { |
| adpscl_alpha[i] = out_luma * |
| (1 << adp_scal_shift) / in_luma; |
| adpscl_mode = 2; |
| } else if (hdr_mtx_param->p_sel & HLG_HDR) |
| adpscl_alpha[i] = 1 * |
| (1 << adp_scal_shift) / in_luma; |
| else if (hdr_mtx_param->p_sel & SDR_HLG) |
| adpscl_alpha[i] = 10 * in_luma * |
| (1 << adp_scal_shift) / out_luma; |
| |
| if (hdr_mtx_param->p_sel & HDR_SDR) { |
| if (i == 0) |
| adpscl_shift[i] = adp_scal_shift; |
| else |
| adpscl_shift[i] = adp_scal_shift - 2; |
| } else { |
| /* shift value keep consistent with kernel */ |
| if (i == 1) |
| adpscl_shift[i] = adp_scal_shift - 1; |
| else |
| adpscl_shift[i] = adp_scal_shift; |
| } |
| |
| adpscl_ys_coef[i] = |
| 1 << adp_scal_shift; |
| adpscl_beta_s[i] = 0; |
| adpscl_beta[i] = 0; |
| } |
| |
| /*gamut mode: 1->gamut before ootf*/ |
| /*2->gamut after ootf*/ |
| /*other->disable gamut*/ |
| vpp_reg_setb(hdr_ctrl, 1, 6, 2); |
| |
| vpp_reg_write(GMUT_CTRL, gmut_shift); |
| vpp_reg_write(GMUT_COEF0, |
| (gmut_coef[0][1] & 0xffff) << 16 | |
| (gmut_coef[0][0] & 0xffff)); |
| vpp_reg_write(GMUT_COEF1, |
| (gmut_coef[1][0] & 0xffff) << 16 | |
| (gmut_coef[0][2] & 0xffff)); |
| vpp_reg_write(GMUT_COEF2, |
| (gmut_coef[1][2] & 0xffff) << 16 | |
| (gmut_coef[1][1] & 0xffff)); |
| vpp_reg_write(GMUT_COEF3, |
| (gmut_coef[2][1] & 0xffff) << 16 | |
| (gmut_coef[2][0] & 0xffff)); |
| vpp_reg_write(GMUT_COEF4, |
| gmut_coef[2][2] & 0xffff); |
| |
| vpp_reg_write(CGAIN_COEF0, |
| c_gain_lim_coef[1] << 16 | |
| c_gain_lim_coef[0]); |
| vpp_reg_write(CGAIN_COEF1, c_gain_lim_coef[2] | |
| 0x1000 << 16); |
| |
| vpp_reg_write(ADPS_CTRL, adpscl_enable[2] << 6 | |
| adpscl_enable[1] << 5 | |
| adpscl_enable[0] << 4 | |
| adpscl_mode); |
| vpp_reg_write(ADPS_ALPHA0, |
| adpscl_alpha[1]<<16 | adpscl_alpha[0]); |
| vpp_reg_write(ADPS_ALPHA1, adpscl_shift[0] << 24 | |
| adpscl_shift[1] << 20 | |
| adpscl_shift[2] << 16 | |
| adpscl_alpha[2]); |
| vpp_reg_write(ADPS_BETA0, |
| adpscl_beta_s[0] << 20 | adpscl_beta[0]); |
| vpp_reg_write(ADPS_BETA1, |
| adpscl_beta_s[1] << 20 | adpscl_beta[1]); |
| vpp_reg_write(ADPS_BETA2, |
| adpscl_beta_s[2] << 20 | adpscl_beta[2]); |
| vpp_reg_write(ADPS_COEF0, |
| adpscl_ys_coef[1] << 16 | adpscl_ys_coef[0]); |
| vpp_reg_write(ADPS_COEF1, adpscl_ys_coef[2]); |
| |
| } else if (mtx_sel & HDR_OUT_MTX) { |
| for (i = 0; i < 15; i++) |
| mtx[i] = hdr_mtx_param->mtx_out[i]; |
| vpp_reg_write(CGAIN_OFFT, |
| (rgb2yuvpos[2] << 16) | rgb2yuvpos[1]); |
| vpp_reg_write(MATRIXO_EN_CTRL, hdr_mtx_param->mtx_on); |
| /*yuv in*/ |
| vpp_reg_setb(hdr_ctrl, hdr_mtx_param->mtx_on, 4, 1); |
| |
| vpp_reg_setb(hdr_ctrl, hdr_mtx_param->mtx_only, |
| 16, 1); |
| vpp_reg_setb(hdr_ctrl, 0, 17, 1); |
| /*mtx out en*/ |
| vpp_reg_setb(hdr_ctrl, 1, 15, 1); |
| |
| vpp_reg_write(MATRIXO_COEF00_01, |
| (mtx[0 * 3 + 0] << 16) | (mtx[0 * 3 + 1] & 0x1FFF)); |
| vpp_reg_write(MATRIXO_COEF02_10, |
| (mtx[0 * 3 + 2] << 16) | (mtx[1 * 3 + 0] & 0x1FFF)); |
| vpp_reg_write(MATRIXO_COEF11_12, |
| (mtx[1 * 3 + 1] << 16) | (mtx[1 * 3 + 2] & 0x1FFF)); |
| vpp_reg_write(MATRIXO_COEF20_21, |
| (mtx[2 * 3 + 0] << 16) | (mtx[2 * 3 + 1] & 0x1FFF)); |
| vpp_reg_write(MATRIXO_COEF22, |
| mtx[2 * 3 + 2]); |
| vpp_reg_write(MATRIXO_OFFSET0_1, |
| (hdr_mtx_param->mtxo_pos_offset[0] << 16) | |
| (hdr_mtx_param->mtxo_pos_offset[1]&0xFFF)); |
| vpp_reg_write(MATRIXO_OFFSET2, |
| hdr_mtx_param->mtxo_pos_offset[2]); |
| vpp_reg_write(MATRIXO_PRE_OFFSET0_1, |
| (hdr_mtx_param->mtxo_pre_offset[0] << 16) | |
| (hdr_mtx_param->mtxo_pre_offset[1]&0xFFF)); |
| vpp_reg_write(MATRIXO_PRE_OFFSET2, |
| hdr_mtx_param->mtxo_pre_offset[2]); |
| } |
| |
| } |
| |
| void set_eotf_lut( |
| enum hdr_module_sel module_sel, |
| struct hdr_proc_lut_param_s *hdr_lut_param) |
| { |
| unsigned int lut[HDR2_EOTF_LUT_SIZE]; |
| unsigned int eotf_lut_addr_port = 0; |
| unsigned int eotf_lut_data_port = 0; |
| unsigned int hdr_ctrl = 0; |
| unsigned int i = 0; |
| |
| if (module_sel & VD1_HDR) { |
| eotf_lut_addr_port = VD1_EOTF_LUT_ADDR_PORT; |
| eotf_lut_data_port = VD1_EOTF_LUT_DATA_PORT; |
| hdr_ctrl = VD1_HDR2_CTRL; |
| } else if (module_sel & OSD1_HDR) { |
| eotf_lut_addr_port = OSD1_EOTF_LUT_ADDR_PORT; |
| eotf_lut_data_port = OSD1_EOTF_LUT_DATA_PORT; |
| hdr_ctrl = OSD1_HDR2_CTRL; |
| } |
| |
| for (i = 0; i < HDR2_EOTF_LUT_SIZE; i++) |
| lut[i] = hdr_lut_param->eotf_lut[i]; |
| |
| vpp_reg_setb(hdr_ctrl, hdr_lut_param->lut_on, 3, 1); |
| |
| if (!hdr_lut_param->lut_on) |
| return; |
| |
| vpp_reg_write(eotf_lut_addr_port, 0x0); |
| for (i = 0; i < HDR2_EOTF_LUT_SIZE; i++) |
| vpp_reg_write(eotf_lut_data_port, lut[i]); |
| } |
| |
| void set_ootf_lut( |
| enum hdr_module_sel module_sel, |
| struct hdr_proc_lut_param_s *hdr_lut_param) |
| { |
| unsigned int lut[HDR2_OOTF_LUT_SIZE]; |
| unsigned int ootf_lut_addr_port = 0; |
| unsigned int ootf_lut_data_port = 0; |
| unsigned int hdr_ctrl = 0; |
| unsigned int i = 0; |
| |
| if (module_sel & VD1_HDR) { |
| ootf_lut_addr_port = VD1_OGAIN_LUT_ADDR_PORT; |
| ootf_lut_data_port = VD1_OGAIN_LUT_DATA_PORT; |
| hdr_ctrl = VD1_HDR2_CTRL; |
| } else if (module_sel & OSD1_HDR) { |
| ootf_lut_addr_port = OSD1_OGAIN_LUT_ADDR_PORT; |
| ootf_lut_data_port = OSD1_OGAIN_LUT_DATA_PORT; |
| hdr_ctrl = OSD1_HDR2_CTRL; |
| } |
| |
| for (i = 0; i < HDR2_OOTF_LUT_SIZE; i++) |
| lut[i] = hdr_lut_param->ogain_lut[i]; |
| |
| vpp_reg_setb(hdr_ctrl, hdr_lut_param->lut_on, 1, 1); |
| |
| if (!hdr_lut_param->lut_on) |
| return; |
| |
| vpp_reg_write(ootf_lut_addr_port, 0x0); |
| for (i = 0; i < HDR2_OOTF_LUT_SIZE / 2; i++) |
| vpp_reg_write(ootf_lut_data_port, |
| (lut[i * 2 + 1] << 16) + |
| lut[i * 2]); |
| vpp_reg_write(ootf_lut_data_port, lut[148]); |
| } |
| |
| void set_oetf_lut( |
| enum hdr_module_sel module_sel, |
| struct hdr_proc_lut_param_s *hdr_lut_param) |
| { |
| unsigned int lut[HDR2_OETF_LUT_SIZE]; |
| unsigned int oetf_lut_addr_port = 0; |
| unsigned int oetf_lut_data_port = 0; |
| unsigned int hdr_ctrl = 0; |
| unsigned int i = 0; |
| |
| if (module_sel & VD1_HDR) { |
| oetf_lut_addr_port = VD1_OETF_LUT_ADDR_PORT; |
| oetf_lut_data_port = VD1_OETF_LUT_DATA_PORT; |
| hdr_ctrl = VD1_HDR2_CTRL; |
| } else if (module_sel & OSD1_HDR) { |
| oetf_lut_addr_port = OSD1_OETF_LUT_ADDR_PORT; |
| oetf_lut_data_port = OSD1_OETF_LUT_DATA_PORT; |
| hdr_ctrl = OSD1_HDR2_CTRL; |
| } |
| |
| for (i = 0; i < HDR2_OETF_LUT_SIZE; i++) |
| lut[i] = hdr_lut_param->oetf_lut[i]; |
| |
| vpp_reg_setb(hdr_ctrl, hdr_lut_param->lut_on, 2, 1); |
| |
| if (!hdr_lut_param->lut_on) |
| return; |
| |
| vpp_reg_write(oetf_lut_addr_port, 0x0); |
| for (i = 0; i < HDR2_OETF_LUT_SIZE / 2; i++) { |
| if (hdr_lut_param->bitdepth == 10) |
| vpp_reg_write(oetf_lut_data_port, |
| ((lut[i * 2 + 1] >> 2) << 16) + |
| (lut[i * 2] >> 2)); |
| else |
| vpp_reg_write(oetf_lut_data_port, |
| (lut[i * 2 + 1] << 16) + |
| lut[i * 2]); |
| } |
| vpp_reg_write(oetf_lut_data_port, lut[148]); |
| } |
| |
| void set_c_gain( |
| enum hdr_module_sel module_sel, |
| struct hdr_proc_lut_param_s *hdr_lut_param) |
| { |
| unsigned int lut[HDR2_CGAIN_LUT_SIZE]; |
| unsigned int cgain_lut_addr_port = 0; |
| unsigned int cgain_lut_data_port = 0; |
| unsigned int hdr_ctrl = 0; |
| unsigned int i = 0; |
| |
| if (module_sel & VD1_HDR) { |
| cgain_lut_addr_port = VD1_CGAIN_LUT_ADDR_PORT; |
| cgain_lut_data_port = VD1_CGAIN_LUT_DATA_PORT; |
| hdr_ctrl = VD1_HDR2_CTRL; |
| } else if (module_sel & OSD1_HDR) { |
| cgain_lut_addr_port = OSD1_CGAIN_LUT_ADDR_PORT; |
| cgain_lut_data_port = OSD1_CGAIN_LUT_DATA_PORT; |
| hdr_ctrl = OSD1_HDR2_CTRL; |
| } |
| |
| for (i = 0; i < HDR2_CGAIN_LUT_SIZE; i++) |
| lut[i] = hdr_lut_param->cgain_lut[i]; |
| |
| /*cgain mode: 0->y domin*/ |
| /*cgain mode: 1->rgb domin, use r/g/b max*/ |
| vpp_reg_setb(hdr_ctrl, 0, 12, 1); |
| vpp_reg_setb(hdr_ctrl, hdr_lut_param->cgain_en, 0, 1); |
| |
| if (!hdr_lut_param->cgain_en) |
| return; |
| |
| vpp_reg_write(cgain_lut_addr_port, 0x0); |
| for (i = 0; i < HDR2_CGAIN_LUT_SIZE / 2; i++) |
| vpp_reg_write(cgain_lut_data_port, |
| (lut[i * 2 + 1] << 16) + lut[i * 2]); |
| vpp_reg_write(cgain_lut_data_port, lut[64]); |
| } |
| |
| struct hdr_proc_lut_param_s hdr_lut_param; |
| |
| void hdr_func(enum hdr_module_sel module_sel, |
| enum hdr_process_sel hdr_process_select) |
| { |
| int bit_depth; |
| unsigned int i = 0; |
| struct hdr_proc_mtx_param_s hdr_mtx_param; |
| printf("hdr_func %d, hdr_process_select 0x%x\n", module_sel, hdr_process_select); |
| |
| memset(&hdr_mtx_param, 0, sizeof(struct hdr_proc_mtx_param_s)); |
| memset(&hdr_lut_param, 0, sizeof(struct hdr_proc_lut_param_s)); |
| |
| if (module_sel & (VD1_HDR | VD2_HDR | OSD1_HDR)) |
| bit_depth = 12; |
| else if (module_sel & (VDIN0_HDR | VDIN1_HDR | DI_HDR)) |
| bit_depth = 10; |
| else |
| return; |
| /*lut parameters*/ |
| if (hdr_process_select & HDR_BYPASS) { |
| /*for g12a/g12b osd blend shift rtl bug*/ |
| if (((get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12A) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12B)) && |
| (module_sel & OSD1_HDR)) { |
| for (i = 0; i < HDR2_OETF_LUT_SIZE; i++) { |
| hdr_lut_param.oetf_lut[i] = oe_y_lut_bypass[i]; |
| hdr_lut_param.ogain_lut[i] = oo_y_lut_bypass[i]; |
| if (i < HDR2_EOTF_LUT_SIZE) |
| hdr_lut_param.eotf_lut[i] = |
| eo_y_lut_bypass[i]; |
| if (i < HDR2_CGAIN_LUT_SIZE) |
| hdr_lut_param.cgain_lut[i] = |
| cgain_lut_bypass[i] - 1; |
| } |
| hdr_lut_param.lut_on = LUT_ON; |
| hdr_lut_param.bitdepth = bit_depth; |
| hdr_lut_param.cgain_en = LUT_ON; |
| } else { |
| for (i = 0; i < HDR2_OETF_LUT_SIZE; i++) { |
| hdr_lut_param.oetf_lut[i] = oe_y_lut_sdr[i]; |
| hdr_lut_param.ogain_lut[i] = |
| oo_y_lut_hdr_sdr[i]; |
| if (i < HDR2_EOTF_LUT_SIZE) |
| hdr_lut_param.eotf_lut[i] = |
| eo_y_lut_hdr[i]; |
| if (i < HDR2_CGAIN_LUT_SIZE) |
| hdr_lut_param.cgain_lut[i] = |
| cgain_lut1[i] - 1; |
| } |
| hdr_lut_param.lut_on = LUT_OFF; |
| hdr_lut_param.bitdepth = bit_depth; |
| hdr_lut_param.cgain_en = LUT_OFF; |
| } |
| } else if (hdr_process_select & HDR_SDR) { |
| for (i = 0; i < HDR2_OETF_LUT_SIZE; i++) { |
| hdr_lut_param.oetf_lut[i] = oe_y_lut_sdr[i]; |
| hdr_lut_param.ogain_lut[i] = oo_y_lut_hdr_sdr[i]; |
| if (i < HDR2_EOTF_LUT_SIZE) |
| hdr_lut_param.eotf_lut[i] = eo_y_lut_hdr[i]; |
| if (i < HDR2_CGAIN_LUT_SIZE) |
| hdr_lut_param.cgain_lut[i] = cgain_lut1[i] - 1; |
| } |
| hdr_lut_param.lut_on = LUT_ON; |
| hdr_lut_param.bitdepth = bit_depth; |
| hdr_lut_param.cgain_en = LUT_ON; |
| } else if (hdr_process_select & SDR_HDR) { |
| for (i = 0; i < HDR2_OETF_LUT_SIZE; i++) { |
| hdr_lut_param.oetf_lut[i] = oe_y_lut_hdr[i]; |
| hdr_lut_param.ogain_lut[i] = oo_y_lut_sdr_hdr[i]; |
| if (i < HDR2_EOTF_LUT_SIZE) |
| hdr_lut_param.eotf_lut[i] = eo_y_lut_sdr[i]; |
| if (i < HDR2_CGAIN_LUT_SIZE) |
| hdr_lut_param.cgain_lut[i] = |
| cgain_lut_bypass[i] - 1; |
| } |
| hdr_lut_param.lut_on = LUT_ON; |
| hdr_lut_param.bitdepth = bit_depth; |
| /*for g12a/g12b osd blend shift rtl bug*/ |
| if ((get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_G12A) && |
| (module_sel & OSD1_HDR)) |
| hdr_lut_param.cgain_en = LUT_ON; |
| else |
| hdr_lut_param.cgain_en = LUT_OFF; |
| } else if (hdr_process_select & HLG_BYPASS) { |
| for (i = 0; i < HDR2_OETF_LUT_SIZE; i++) { |
| hdr_lut_param.oetf_lut[i] = oe_y_lut_sdr[i]; |
| hdr_lut_param.ogain_lut[i] = oo_y_lut_hdr_sdr[i]; |
| if (i < HDR2_EOTF_LUT_SIZE) |
| hdr_lut_param.eotf_lut[i] = eo_y_lut_hlg[i]; |
| if (i < HDR2_CGAIN_LUT_SIZE) |
| hdr_lut_param.cgain_lut[i] = cgain_lut1[i] - 1; |
| } |
| hdr_lut_param.lut_on = LUT_OFF; |
| hdr_lut_param.bitdepth = bit_depth; |
| hdr_lut_param.cgain_en = LUT_OFF; |
| } else if (hdr_process_select & HLG_SDR) { |
| for (i = 0; i < HDR2_OETF_LUT_SIZE; i++) { |
| hdr_lut_param.oetf_lut[i] = oe_y_lut_sdr[i]; |
| hdr_lut_param.ogain_lut[i] = oo_y_lut_hlg_sdr[i]; |
| if (i < HDR2_EOTF_LUT_SIZE) |
| hdr_lut_param.eotf_lut[i] = eo_y_lut_hlg[i]; |
| if (i < HDR2_CGAIN_LUT_SIZE) |
| hdr_lut_param.cgain_lut[i] = cgain_lut1[i] - 1; |
| } |
| hdr_lut_param.lut_on = LUT_ON; |
| hdr_lut_param.bitdepth = bit_depth; |
| hdr_lut_param.cgain_en = LUT_ON; |
| } else if (hdr_process_select & HLG_HDR) { |
| for (i = 0; i < HDR2_OETF_LUT_SIZE; i++) { |
| hdr_lut_param.oetf_lut[i] = oe_y_lut_hdr[i]; |
| hdr_lut_param.ogain_lut[i] = oo_y_lut_hlg_hdr[i]; |
| if (i < HDR2_EOTF_LUT_SIZE) |
| hdr_lut_param.eotf_lut[i] = eo_y_lut_hlg[i]; |
| if (i < HDR2_CGAIN_LUT_SIZE) |
| hdr_lut_param.cgain_lut[i] = cgain_lut1[i] - 1; |
| } |
| hdr_lut_param.lut_on = LUT_ON; |
| hdr_lut_param.bitdepth = bit_depth; |
| hdr_lut_param.cgain_en = LUT_ON; |
| } else if (hdr_process_select & SDR_HLG) { |
| for (i = 0; i < HDR2_OETF_LUT_SIZE; i++) { |
| hdr_lut_param.oetf_lut[i] = oe_y_lut_hlg[i]; |
| hdr_lut_param.ogain_lut[i] = oo_y_lut_sdr_hlg[i]; |
| if (i < HDR2_EOTF_LUT_SIZE) |
| hdr_lut_param.eotf_lut[i] = eo_y_lut_sdr[i]; |
| if (i < HDR2_CGAIN_LUT_SIZE) |
| hdr_lut_param.cgain_lut[i] = |
| cgain_lut_bypass[i] - 1; |
| } |
| hdr_lut_param.lut_on = LUT_ON; |
| hdr_lut_param.bitdepth = bit_depth; |
| /*for g12a/g12b osd blend shift rtl bug*/ |
| if (((get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12A) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12B)) && |
| (module_sel & OSD1_HDR)) |
| hdr_lut_param.cgain_en = LUT_ON; |
| else |
| hdr_lut_param.cgain_en = LUT_OFF; |
| } else if (hdr_process_select & HDR_OFF) { |
| for (i = 0; i < HDR2_OETF_LUT_SIZE; i++) { |
| hdr_lut_param.oetf_lut[i] = oe_y_lut_sdr[i]; |
| hdr_lut_param.ogain_lut[i] = |
| oo_y_lut_hdr_sdr[i]; |
| if (i < HDR2_EOTF_LUT_SIZE) |
| hdr_lut_param.eotf_lut[i] = |
| eo_y_lut_hdr[i]; |
| if (i < HDR2_CGAIN_LUT_SIZE) |
| hdr_lut_param.cgain_lut[i] = |
| cgain_lut1[i] - 1; |
| } |
| hdr_lut_param.lut_on = LUT_OFF; |
| hdr_lut_param.bitdepth = bit_depth; |
| hdr_lut_param.cgain_en = LUT_OFF; |
| } else |
| return; |
| |
| /*mtx parameters*/ |
| if (hdr_process_select & (HDR_BYPASS | HLG_BYPASS)) { |
| hdr_mtx_param.mtx_only = HDR_ONLY; |
| /*for g12a/g12b osd blend shift rtl bug*/ |
| if (((get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12A) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12B && |
| get_cpu_id().chip_rev == MESON_CPU_CHIP_REVISION_A)) && |
| (hdr_process_select & HDR_BYPASS) && |
| (module_sel & OSD1_HDR)) { |
| for (i = 0; i < 15; i++) { |
| hdr_mtx_param.mtx_in[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_cgain[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_ogain[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_out[i] = rgb2ycbcr_709[i]; |
| if (i < 9) |
| hdr_mtx_param.mtx_gamut[i] = |
| bypass_coeff[i]; |
| if (i < 3) { |
| hdr_mtx_param.mtxi_pre_offset[i] = |
| bypass_pre[i]; |
| hdr_mtx_param.mtxi_pos_offset[i] = |
| bypass_pos[i]; |
| hdr_mtx_param.mtxo_pre_offset[i] = |
| rgb2yuvpre[i]; |
| hdr_mtx_param.mtxo_pos_offset[i] = |
| rgb2yuvpos[i]; |
| } |
| } |
| hdr_mtx_param.mtx_on = MTX_ON; |
| hdr_mtx_param.p_sel = HDR_BYPASS; |
| } else if (((get_cpu_id().family_id == MESON_CPU_MAJOR_ID_SM1) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_TL1) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12B && |
| get_cpu_id().chip_rev == MESON_CPU_CHIP_REVISION_B)) && |
| (module_sel & OSD1_HDR)) { |
| for (i = 0; i < 15; i++) { |
| hdr_mtx_param.mtx_in[i] = rgb2ycbcr_709[i]; |
| hdr_mtx_param.mtx_cgain[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_ogain[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_out[i] = bypass_coeff[i]; |
| if (i < 9) |
| hdr_mtx_param.mtx_gamut[i] = |
| bypass_coeff[i]; |
| if (i < 3) { |
| hdr_mtx_param.mtxi_pre_offset[i] = |
| rgb2yuvpre[i]; |
| hdr_mtx_param.mtxi_pos_offset[i] = |
| rgb2yuvpos[i]; |
| hdr_mtx_param.mtxo_pre_offset[i] = |
| bypass_pre[i]; |
| hdr_mtx_param.mtxo_pos_offset[i] = |
| bypass_pos[i]; |
| } |
| } |
| hdr_mtx_param.mtx_on = MTX_OFF; |
| hdr_mtx_param.p_sel = HDR_BYPASS; |
| hdr_mtx_param.mtx_only = MTX_ONLY; |
| } else { |
| for (i = 0; i < 15; i++) { |
| hdr_mtx_param.mtx_in[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_cgain[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_ogain[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_out[i] = bypass_coeff[i]; |
| if (i < 9) |
| hdr_mtx_param.mtx_gamut[i] = |
| bypass_coeff[i]; |
| if (i < 3) { |
| hdr_mtx_param.mtxi_pre_offset[i] = |
| bypass_pre[i]; |
| hdr_mtx_param.mtxi_pos_offset[i] = |
| bypass_pre[i]; |
| hdr_mtx_param.mtxo_pre_offset[i] = |
| bypass_pre[i]; |
| hdr_mtx_param.mtxo_pos_offset[i] = |
| bypass_pos[i]; |
| } |
| } |
| hdr_mtx_param.mtx_on = MTX_OFF; |
| hdr_mtx_param.p_sel = HDR_BYPASS; |
| } |
| } else if (hdr_process_select & (HDR_SDR | HLG_SDR)) { |
| hdr_mtx_param.mtx_only = HDR_ONLY; |
| for (i = 0; i < 15; i++) { |
| hdr_mtx_param.mtx_in[i] = ycbcr2rgb_ncl2020[i]; |
| hdr_mtx_param.mtx_cgain[i] = rgb2ycbcr_709[i]; |
| hdr_mtx_param.mtx_ogain[i] = rgb2ycbcr_ncl2020[i]; |
| hdr_mtx_param.mtx_out[i] = rgb2ycbcr_709[i]; |
| if (i < 9) |
| hdr_mtx_param.mtx_gamut[i] = ncl_2020_709[i]; |
| if (i < 3) { |
| hdr_mtx_param.mtxi_pre_offset[i] = |
| yuv2rgbpre[i]; |
| hdr_mtx_param.mtxi_pos_offset[i] = |
| yuv2rgbpos[i]; |
| hdr_mtx_param.mtxo_pre_offset[i] = |
| rgb2yuvpre[i]; |
| hdr_mtx_param.mtxo_pos_offset[i] = |
| rgb2yuvpos[i]; |
| } |
| } |
| hdr_mtx_param.mtx_on = MTX_ON; |
| |
| if (hdr_process_select & HDR_SDR) |
| hdr_mtx_param.p_sel = HDR_SDR; |
| else if (hdr_process_select & HLG_SDR) |
| hdr_mtx_param.p_sel = HLG_SDR; |
| |
| } else if (hdr_process_select & SDR_HDR) { |
| hdr_mtx_param.mtx_only = HDR_ONLY; |
| if (((get_cpu_id().family_id == MESON_CPU_MAJOR_ID_SM1) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_TL1) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12B) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12A)) && |
| (module_sel & OSD1_HDR)) { |
| for (i = 0; i < 15; i++) { |
| hdr_mtx_param.mtx_in[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_cgain[i] = |
| rgb2ycbcr_ncl2020[i]; |
| hdr_mtx_param.mtx_ogain[i] = rgb2ycbcr_709[i]; |
| hdr_mtx_param.mtx_out[i] = rgb2ycbcr_ncl2020[i]; |
| if (i < 9) |
| hdr_mtx_param.mtx_gamut[i] = |
| ncl_709_2020[i]; |
| if (i < 3) { |
| hdr_mtx_param.mtxi_pre_offset[i] = |
| bypass_pre[i]; |
| hdr_mtx_param.mtxi_pos_offset[i] = |
| bypass_pos[i]; |
| hdr_mtx_param.mtxo_pre_offset[i] = |
| rgb2yuvpre[i]; |
| hdr_mtx_param.mtxo_pos_offset[i] = |
| rgb2yuvpos[i]; |
| } |
| } |
| } else { |
| for (i = 0; i < 15; i++) { |
| hdr_mtx_param.mtx_in[i] = ycbcr2rgb_709[i]; |
| hdr_mtx_param.mtx_cgain[i] = |
| rgb2ycbcr_ncl2020[i]; |
| hdr_mtx_param.mtx_ogain[i] = rgb2ycbcr_709[i]; |
| hdr_mtx_param.mtx_out[i] = rgb2ycbcr_ncl2020[i]; |
| if (i < 9) |
| hdr_mtx_param.mtx_gamut[i] = |
| ncl_709_2020[i]; |
| if (i < 3) { |
| hdr_mtx_param.mtxi_pre_offset[i] = |
| yuv2rgbpre[i]; |
| hdr_mtx_param.mtxi_pos_offset[i] = |
| yuv2rgbpos[i]; |
| hdr_mtx_param.mtxo_pre_offset[i] = |
| rgb2yuvpre[i]; |
| hdr_mtx_param.mtxo_pos_offset[i] = |
| rgb2yuvpos[i]; |
| } |
| } |
| } |
| hdr_mtx_param.mtx_on = MTX_ON; |
| hdr_mtx_param.p_sel = SDR_HDR; |
| } else if (hdr_process_select & HLG_HDR) { |
| hdr_mtx_param.mtx_only = HDR_ONLY; |
| for (i = 0; i < 15; i++) { |
| hdr_mtx_param.mtx_in[i] = ycbcr2rgb_ncl2020[i]; |
| hdr_mtx_param.mtx_cgain[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_ogain[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_out[i] = rgb2ycbcr_ncl2020[i]; |
| if (i < 9) |
| hdr_mtx_param.mtx_gamut[i] = bypass_coeff[i]; |
| } |
| hdr_mtx_param.mtx_on = MTX_ON; |
| hdr_mtx_param.p_sel = HLG_HDR; |
| } else if (hdr_process_select & SDR_HLG) { |
| hdr_mtx_param.mtx_only = HDR_ONLY; |
| if (((get_cpu_id().family_id == MESON_CPU_MAJOR_ID_SM1) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_TL1) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12B) || |
| (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_G12A)) && |
| (module_sel & OSD1_HDR)) { |
| for (i = 0; i < 15; i++) { |
| hdr_mtx_param.mtx_in[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_cgain[i] = |
| rgb2ycbcr_ncl2020[i]; |
| hdr_mtx_param.mtx_ogain[i] = rgb2ycbcr_709[i]; |
| hdr_mtx_param.mtx_out[i] = rgb2ycbcr_ncl2020[i]; |
| if (i < 9) |
| hdr_mtx_param.mtx_gamut[i] = |
| ncl_709_2020[i]; |
| if (i < 3) { |
| hdr_mtx_param.mtxi_pre_offset[i] = |
| bypass_pre[i]; |
| hdr_mtx_param.mtxi_pos_offset[i] = |
| bypass_pos[i]; |
| hdr_mtx_param.mtxo_pre_offset[i] = |
| rgb2yuvpre[i]; |
| hdr_mtx_param.mtxo_pos_offset[i] = |
| rgb2yuvpos[i]; |
| } |
| } |
| } else { |
| for (i = 0; i < 15; i++) { |
| hdr_mtx_param.mtx_in[i] = ycbcr2rgb_709[i]; |
| hdr_mtx_param.mtx_cgain[i] = |
| rgb2ycbcr_ncl2020[i]; |
| hdr_mtx_param.mtx_ogain[i] = rgb2ycbcr_709[i]; |
| hdr_mtx_param.mtx_out[i] = rgb2ycbcr_ncl2020[i]; |
| if (i < 9) |
| hdr_mtx_param.mtx_gamut[i] = |
| ncl_709_2020[i]; |
| if (i < 3) { |
| hdr_mtx_param.mtxi_pre_offset[i] = |
| yuv2rgbpre[i]; |
| hdr_mtx_param.mtxi_pos_offset[i] = |
| yuv2rgbpos[i]; |
| hdr_mtx_param.mtxo_pre_offset[i] = |
| rgb2yuvpre[i]; |
| hdr_mtx_param.mtxo_pos_offset[i] = |
| rgb2yuvpos[i]; |
| } |
| } |
| } |
| hdr_mtx_param.mtx_on = MTX_ON; |
| hdr_mtx_param.p_sel = SDR_HLG; |
| } else if (hdr_process_select & HDR_OFF) { |
| for (i = 0; i < 15; i++) { |
| hdr_mtx_param.mtx_in[i] = rgb2ycbcr_709[i]; |
| hdr_mtx_param.mtx_cgain[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_ogain[i] = bypass_coeff[i]; |
| hdr_mtx_param.mtx_out[i] = bypass_coeff[i]; |
| if (i < 9) |
| hdr_mtx_param.mtx_gamut[i] = |
| bypass_coeff[i]; |
| if (i < 3) { |
| hdr_mtx_param.mtxi_pre_offset[i] = |
| rgb2yuvpre[i]; |
| hdr_mtx_param.mtxi_pos_offset[i] = |
| rgb2yuvpos[i]; |
| hdr_mtx_param.mtxo_pre_offset[i] = |
| bypass_pre[i]; |
| hdr_mtx_param.mtxo_pos_offset[i] = |
| bypass_pos[i]; |
| } |
| } |
| hdr_mtx_param.mtx_on = MTX_OFF; |
| hdr_mtx_param.p_sel = HDR_BYPASS; |
| hdr_mtx_param.mtx_only = HDR_ONLY; |
| } |
| |
| set_hdr_matrix(module_sel, HDR_IN_MTX, &hdr_mtx_param); |
| |
| set_eotf_lut(module_sel, &hdr_lut_param); |
| |
| set_hdr_matrix(module_sel, HDR_GAMUT_MTX, &hdr_mtx_param); |
| |
| set_ootf_lut(module_sel, &hdr_lut_param); |
| |
| set_oetf_lut(module_sel, &hdr_lut_param); |
| |
| set_hdr_matrix(module_sel, HDR_OUT_MTX, &hdr_mtx_param); |
| |
| set_c_gain(module_sel, &hdr_lut_param); |
| } |