blob: 9a59c7f33ffca19e7394202ee96fb198ed6c9232 [file] [log] [blame]
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#include <amlogic/cpu_id.h>
#include <malloc.h>
#include "vpp_reg.h"
#include "hdr2.h"
#include <common.h>
#define OO_Y_LUT_BYPASS_VAL 512
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_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] = {
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16
};
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,
};
/* gamut bypass */
int gamut_bypass[9] = {2048, 0, 0, 0, 2048, 0, 0, 0, 2048};
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 & VD2_HDR) {
MATRIXI_COEF00_01 = VD2_HDR2_MATRIXI_COEF00_01;
MATRIXI_COEF00_01 = VD2_HDR2_MATRIXI_COEF00_01;
MATRIXI_COEF02_10 = VD2_HDR2_MATRIXI_COEF02_10;
MATRIXI_COEF11_12 = VD2_HDR2_MATRIXI_COEF11_12;
MATRIXI_COEF20_21 = VD2_HDR2_MATRIXI_COEF20_21;
MATRIXI_COEF22 = VD2_HDR2_MATRIXI_COEF22;
/*MATRIXI_COEF30_31 = VD2_HDR2_MATRIXI_COEF30_31;*/
/*MATRIXI_COEF32_40 = VD2_HDR2_MATRIXI_COEF32_40;*/
/*MATRIXI_COEF41_42 = VD2_HDR2_MATRIXI_COEF41_42;*/
MATRIXI_OFFSET0_1 = VD2_HDR2_MATRIXI_OFFSET0_1;
MATRIXI_OFFSET2 = VD2_HDR2_MATRIXI_OFFSET2;
MATRIXI_PRE_OFFSET0_1 = VD2_HDR2_MATRIXI_PRE_OFFSET0_1;
MATRIXI_PRE_OFFSET2 = VD2_HDR2_MATRIXI_PRE_OFFSET2;
/*MATRIXI_CLIP = VD2_HDR2_MATRIXI_CLIP;*/
MATRIXI_EN_CTRL = VD2_HDR2_MATRIXI_EN_CTRL;
MATRIXO_COEF00_01 = VD2_HDR2_MATRIXO_COEF00_01;
MATRIXO_COEF00_01 = VD2_HDR2_MATRIXO_COEF00_01;
MATRIXO_COEF02_10 = VD2_HDR2_MATRIXO_COEF02_10;
MATRIXO_COEF11_12 = VD2_HDR2_MATRIXO_COEF11_12;
MATRIXO_COEF20_21 = VD2_HDR2_MATRIXO_COEF20_21;
MATRIXO_COEF22 = VD2_HDR2_MATRIXO_COEF22;
/*MATRIXO_COEF30_31 = VD2_HDR2_MATRIXO_COEF30_31;*/
/*MATRIXO_COEF32_40 = VD2_HDR2_MATRIXO_COEF32_40;*/
/*MATRIXO_COEF41_42 = VD2_HDR2_MATRIXO_COEF41_42;*/
MATRIXO_OFFSET0_1 = VD2_HDR2_MATRIXO_OFFSET0_1;
MATRIXO_OFFSET2 = VD2_HDR2_MATRIXO_OFFSET2;
MATRIXO_PRE_OFFSET0_1 = VD2_HDR2_MATRIXO_PRE_OFFSET0_1;
MATRIXO_PRE_OFFSET2 = VD2_HDR2_MATRIXO_PRE_OFFSET2;
/*MATRIXO_CLIP = VD2_HDR2_MATRIXO_CLIP;*/
MATRIXO_EN_CTRL = VD2_HDR2_MATRIXO_EN_CTRL;
CGAIN_OFFT = VD2_HDR2_CGAIN_OFFT;
CGAIN_COEF0 = VD2_HDR2_CGAIN_COEF0;
CGAIN_COEF1 = VD2_HDR2_CGAIN_COEF1;
ADPS_CTRL = VD2_HDR2_ADPS_CTRL;
ADPS_ALPHA0 = VD2_HDR2_ADPS_ALPHA0;
ADPS_ALPHA1 = VD2_HDR2_ADPS_ALPHA1;
ADPS_BETA0 = VD2_HDR2_ADPS_BETA0;
ADPS_BETA1 = VD2_HDR2_ADPS_BETA1;
ADPS_BETA2 = VD2_HDR2_ADPS_BETA2;
ADPS_COEF0 = VD2_HDR2_ADPS_COEF0;
ADPS_COEF1 = VD2_HDR2_ADPS_COEF1;
GMUT_CTRL = VD2_HDR2_GMUT_CTRL;
GMUT_COEF0 = VD2_HDR2_GMUT_COEF0;
GMUT_COEF1 = VD2_HDR2_GMUT_COEF1;
GMUT_COEF2 = VD2_HDR2_GMUT_COEF2;
GMUT_COEF3 = VD2_HDR2_GMUT_COEF3;
GMUT_COEF4 = VD2_HDR2_GMUT_COEF4;
hdr_ctrl = VD2_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;
}else if (module_sel & OSD2_HDR) {
MATRIXI_COEF00_01 = OSD2_HDR2_MATRIXI_COEF00_01;
MATRIXI_COEF00_01 = OSD2_HDR2_MATRIXI_COEF00_01;
MATRIXI_COEF02_10 = OSD2_HDR2_MATRIXI_COEF02_10;
MATRIXI_COEF11_12 = OSD2_HDR2_MATRIXI_COEF11_12;
MATRIXI_COEF20_21 = OSD2_HDR2_MATRIXI_COEF20_21;
MATRIXI_COEF22 = OSD2_HDR2_MATRIXI_COEF22;
/*MATRIXI_COEF30_31 = OSD2_HDR2_MATRIXI_COEF30_31;*/
/*MATRIXI_COEF32_40 = OSD2_HDR2_MATRIXI_COEF32_40;*/
/*MATRIXI_COEF41_42 = OSD2_HDR2_MATRIXI_COEF41_42;*/
MATRIXI_OFFSET0_1 = OSD2_HDR2_MATRIXI_OFFSET0_1;
MATRIXI_OFFSET2 = OSD2_HDR2_MATRIXI_OFFSET2;
MATRIXI_PRE_OFFSET0_1 = OSD2_HDR2_MATRIXI_PRE_OFFSET0_1;
MATRIXI_PRE_OFFSET2 = OSD2_HDR2_MATRIXI_PRE_OFFSET2;
/*MATRIXI_CLIP = OSD2_HDR2_MATRIXI_CLIP;*/
MATRIXI_EN_CTRL = OSD2_HDR2_MATRIXI_EN_CTRL;
MATRIXO_COEF00_01 = OSD2_HDR2_MATRIXO_COEF00_01;
MATRIXO_COEF00_01 = OSD2_HDR2_MATRIXO_COEF00_01;
MATRIXO_COEF02_10 = OSD2_HDR2_MATRIXO_COEF02_10;
MATRIXO_COEF11_12 = OSD2_HDR2_MATRIXO_COEF11_12;
MATRIXO_COEF20_21 = OSD2_HDR2_MATRIXO_COEF20_21;
MATRIXO_COEF22 = OSD2_HDR2_MATRIXO_COEF22;
/*MATRIXO_COEF30_31 = OSD2_HDR2_MATRIXO_COEF30_31;*/
/*MATRIXO_COEF32_40 = OSD2_HDR2_MATRIXO_COEF32_40;*/
/*MATRIXO_COEF41_42 = OSD2_HDR2_MATRIXO_COEF41_42;*/
MATRIXO_OFFSET0_1 = OSD2_HDR2_MATRIXO_OFFSET0_1;
MATRIXO_OFFSET2 = OSD2_HDR2_MATRIXO_OFFSET2;
MATRIXO_PRE_OFFSET0_1 = OSD2_HDR2_MATRIXO_PRE_OFFSET0_1;
MATRIXO_PRE_OFFSET2 = OSD2_HDR2_MATRIXO_PRE_OFFSET2;
/*MATRIXO_CLIP = OSD2_HDR2_MATRIXO_CLIP;*/
MATRIXO_EN_CTRL = OSD2_HDR2_MATRIXO_EN_CTRL;
CGAIN_OFFT = OSD2_HDR2_CGAIN_OFFT;
CGAIN_COEF0 = OSD2_HDR2_CGAIN_COEF0;
CGAIN_COEF1 = OSD2_HDR2_CGAIN_COEF1;
ADPS_CTRL = OSD2_HDR2_ADPS_CTRL;
ADPS_ALPHA0 = OSD2_HDR2_ADPS_ALPHA0;
ADPS_ALPHA1 = OSD2_HDR2_ADPS_ALPHA1;
ADPS_BETA0 = OSD2_HDR2_ADPS_BETA0;
ADPS_BETA1 = OSD2_HDR2_ADPS_BETA1;
ADPS_BETA2 = OSD2_HDR2_ADPS_BETA2;
ADPS_COEF0 = OSD2_HDR2_ADPS_COEF0;
ADPS_COEF1 = OSD2_HDR2_ADPS_COEF1;
GMUT_CTRL = OSD2_HDR2_GMUT_CTRL;
GMUT_COEF0 = OSD2_HDR2_GMUT_COEF0;
GMUT_COEF1 = OSD2_HDR2_GMUT_COEF1;
GMUT_COEF2 = OSD2_HDR2_GMUT_COEF2;
GMUT_COEF3 = OSD2_HDR2_GMUT_COEF3;
GMUT_COEF4 = OSD2_HDR2_GMUT_COEF4;
hdr_ctrl = OSD2_HDR2_CTRL;
}
if (!hdr_mtx_param)
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) &&
(hdr_mtx_param->p_sel & HDR_BYPASS) &&
(module_sel & (OSD1_HDR | 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) &&
(hdr_mtx_param->p_sel & HDR_BYPASS) &&
(module_sel & (OSD1_HDR | OSD2_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] = 1 *
(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 & VD2_HDR) {
eotf_lut_addr_port = VD2_EOTF_LUT_ADDR_PORT;
eotf_lut_data_port = VD2_EOTF_LUT_DATA_PORT;
hdr_ctrl = VD2_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;
} else if (module_sel & OSD2_HDR) {
eotf_lut_addr_port = OSD2_EOTF_LUT_ADDR_PORT;
eotf_lut_data_port = OSD2_EOTF_LUT_DATA_PORT;
hdr_ctrl = OSD2_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 & VD2_HDR) {
ootf_lut_addr_port = VD2_OGAIN_LUT_ADDR_PORT;
ootf_lut_data_port = VD2_OGAIN_LUT_DATA_PORT;
hdr_ctrl = VD2_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;
} else if (module_sel & OSD2_HDR) {
ootf_lut_addr_port = OSD2_OGAIN_LUT_ADDR_PORT;
ootf_lut_data_port = OSD2_OGAIN_LUT_DATA_PORT;
hdr_ctrl = OSD2_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 & VD2_HDR) {
oetf_lut_addr_port = VD2_OETF_LUT_ADDR_PORT;
oetf_lut_data_port = VD2_OETF_LUT_DATA_PORT;
hdr_ctrl = VD2_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;
} else if (module_sel & OSD2_HDR) {
oetf_lut_addr_port = OSD2_OETF_LUT_ADDR_PORT;
oetf_lut_data_port = OSD2_OETF_LUT_DATA_PORT;
hdr_ctrl = OSD2_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 & VD2_HDR) {
cgain_lut_addr_port = VD2_CGAIN_LUT_ADDR_PORT;
cgain_lut_data_port = VD2_CGAIN_LUT_DATA_PORT;
hdr_ctrl = VD2_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;
} else if (module_sel & OSD2_HDR) {
cgain_lut_addr_port = OSD2_CGAIN_LUT_ADDR_PORT;
cgain_lut_data_port = OSD2_CGAIN_LUT_DATA_PORT;
hdr_ctrl = OSD2_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]);
}
void clip_func_after_ootf(int mtx_gamut_mode,
enum hdr_module_sel module_sel)
{
unsigned int asps_ctrl = 0;
int clip_en = 0;
int clip_max = 0;
/* if Dynamic TMO+ enable : clip_en = 1 clip_max = 524288
* (hdr_process_select is HDR_SDR or HDR10P_SDR);
* else if mtx_gamut_mode = 1 : clip_en = 0/1 clip_max = 524288;
* else if mtx_gamut_mode == 2 : clip_en = 1 clip_max = 393216;
* else : clip_en = 0 clip_max = 524288;
*/
if (mtx_gamut_mode == 1) {
clip_max = 524288 >> 14;
} else if (mtx_gamut_mode == 2) {
clip_en = 1;
clip_max = 393216 >> 14;
} else {
clip_en = 0;
clip_max = 524288 >> 14;
}
if (module_sel & VD1_HDR)
asps_ctrl = VD1_HDR2_ADPS_CTRL;
else if (module_sel & VD2_HDR)
asps_ctrl = VD2_HDR2_ADPS_CTRL;
else if (module_sel & OSD1_HDR)
asps_ctrl = OSD1_HDR2_ADPS_CTRL;
else
return;
vpp_reg_setb(asps_ctrl,
clip_en, 7, 1);
vpp_reg_setb(asps_ctrl,
clip_max, 8, 6);
}
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("%s: %d, hdr_process_select 0x%x\n",
__func__, module_sel, hdr_process_select);
if (get_cpu_id().family_id != MESON_CPU_MAJOR_ID_T7 &&
(module_sel == OSD2_HDR ||
module_sel == VD3_HDR))
return;
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 | VD3_HDR | OSD1_HDR | OSD2_HDR)) {
if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_S4 ||
get_cpu_id().family_id == MESON_CPU_MAJOR_ID_T3)
bit_depth = 10;
else
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 | RGB_BYPASS)) {
/*for g12a/g12b osd blend shift rtl bug*/
if ((get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_G12A) &&
(module_sel & (OSD1_HDR | OSD2_HDR | VD1_HDR | VD2_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_VAL;
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 | OSD2_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 | OSD2_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;
hdr_mtx_param.mtx_gamut_mode = 1;
/*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 | OSD2_HDR | VD1_HDR | VD2_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];
if (module_sel & (OSD1_HDR | OSD2_HDR))
hdr_mtx_param.mtx_out[i] = rgb2ycbcr_709[i];
else
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_pos[i];
if (module_sel & (OSD1_HDR | OSD2_HDR)) {
hdr_mtx_param.mtxo_pre_offset[i] =
rgb2yuvpre[i];
hdr_mtx_param.mtxo_pos_offset[i] =
rgb2yuvpos[i];
} else {
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_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_G12B &&
get_cpu_id().chip_rev ==
MESON_CPU_CHIP_REVISION_B)) &&
(module_sel & (OSD1_HDR | OSD1_HDR | VD1_HDR | VD2_HDR))) {
for (i = 0; i < 15; i++) {
if (module_sel & (OSD1_HDR| OSD2_HDR))
hdr_mtx_param.mtx_in[i] = rgb2ycbcr_709[i];
else
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] =
gamut_bypass[i];
if (i < 3) {
if (module_sel & (OSD1_HDR | OSD2_HDR)) {
hdr_mtx_param.mtxi_pre_offset[i] =
rgb2yuvpre[i];
hdr_mtx_param.mtxi_pos_offset[i] =
rgb2yuvpos[i];
} else {
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] =
bypass_pre[i];
hdr_mtx_param.mtxo_pos_offset[i] =
bypass_pos[i];
}
}
if (module_sel & (OSD1_HDR | OSD2_HDR)) {
hdr_mtx_param.mtx_on = MTX_OFF;
hdr_mtx_param.p_sel = HDR_BYPASS;
hdr_mtx_param.mtx_only = MTX_ONLY;
} else {
hdr_mtx_param.mtx_on = MTX_ON;
hdr_mtx_param.p_sel = HDR_BYPASS;
hdr_mtx_param.mtx_only = HDR_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;
hdr_mtx_param.mtx_gamut_mode = 1;
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;
hdr_mtx_param.mtx_gamut_mode = 1;
if ((get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_G12A) &&
(module_sel & (OSD1_HDR | OSD2_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;
hdr_mtx_param.mtx_gamut_mode = 1;
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;
hdr_mtx_param.mtx_gamut_mode = 1;
if ((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) {
hdr_mtx_param.mtx_gamut_mode = 0;
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;
} else if (hdr_process_select & RGB_BYPASS) {
hdr_mtx_param.mtx_gamut_mode = 0;
if ((get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_G12A)) {
/*DV HDR_BYPASS need bypass coeff*/
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_pos[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_ON;
hdr_mtx_param.p_sel = HDR_BYPASS;
}
}
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);
if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_T3)
clip_func_after_ootf(hdr_mtx_param.mtx_gamut_mode, module_sel);
}