blob: f26bf3e51a5d597454ee11362813c54f12d8d5ff [file] [log] [blame]
hai.cao8c827c02023-02-28 11:12:05 +08001// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2/*
3 * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
4 */
5
6#include <amlogic/cpu_id.h>
7#include <config.h>
8#include <common.h>
9#include <env.h>
10#include <amlogic/media/vpp/vpp.h>
11#ifdef CONFIG_AML_HDMITX20
12#include <amlogic/media/vout/hdmitx/hdmitx_module.h>
13#else
14#include <amlogic/media/vout/hdmitx21/hdmitx_module.h>
15#endif
16#include "vpp_reg.h"
17#include "vpp.h"
18#include "hdr2.h"
lizhi.hu506ddfa2024-07-10 21:35:41 +080019#ifdef CONFIG_AML_VOUT
20#include <amlogic/media/vout/aml_vout.h>
21#endif
hai.cao8c827c02023-02-28 11:12:05 +080022
23#define VPP_PR(fmt, args...) printf("vpp: "fmt"", ## args)
24
25static unsigned char vpp_init_flag;
26
27/***************************** gamma table ****************************/
28#define GAMMA_SIZE (256)
29static unsigned short gamma_table_r[GAMMA_SIZE] = {
30 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60,
31 64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124,
32 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188,
33 192, 196, 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252,
34 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, 300, 304, 308, 312, 316,
35 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380,
36 384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444,
37 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, 500, 504, 508,
38 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572,
39 576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 616, 620, 624, 628, 632, 636,
40 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700,
41 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764,
42 768, 772, 776, 780, 784, 788, 792, 796, 800, 804, 808, 812, 816, 820, 824, 828,
43 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892,
44 896, 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956,
45 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, 1000, 1004, 1008, 1012, 1016, 1020,
46};
47static unsigned short gamma_table_g[GAMMA_SIZE] = {
48 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60,
49 64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124,
50 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188,
51 192, 196, 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252,
52 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, 300, 304, 308, 312, 316,
53 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380,
54 384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444,
55 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, 500, 504, 508,
56 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572,
57 576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 616, 620, 624, 628, 632, 636,
58 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700,
59 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764,
60 768, 772, 776, 780, 784, 788, 792, 796, 800, 804, 808, 812, 816, 820, 824, 828,
61 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892,
62 896, 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956,
63 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, 1000, 1004, 1008, 1012, 1016, 1020,
64};
65static unsigned short gamma_table_b[GAMMA_SIZE] = {
66 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60,
67 64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124,
68 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188,
69 192, 196, 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252,
70 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, 300, 304, 308, 312, 316,
71 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380,
72 384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 440, 444,
73 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, 488, 492, 496, 500, 504, 508,
74 512, 516, 520, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572,
75 576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 616, 620, 624, 628, 632, 636,
76 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700,
77 704, 708, 712, 716, 720, 724, 728, 732, 736, 740, 744, 748, 752, 756, 760, 764,
78 768, 772, 776, 780, 784, 788, 792, 796, 800, 804, 808, 812, 816, 820, 824, 828,
79 832, 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, 876, 880, 884, 888, 892,
80 896, 900, 904, 908, 912, 916, 920, 924, 928, 932, 936, 940, 944, 948, 952, 956,
81 960, 964, 968, 972, 976, 980, 984, 988, 992, 996, 1000, 1004, 1008, 1012, 1016, 1020,
82};
83
84/***************************** gxl hdr ****************************/
85
86#define EOTF_LUT_SIZE 33
87#ifndef AML_S5_DISPLAY
88static unsigned int osd_eotf_r_mapping[EOTF_LUT_SIZE] = {
89 0x0000, 0x0200, 0x0400, 0x0600,
90 0x0800, 0x0a00, 0x0c00, 0x0e00,
91 0x1000, 0x1200, 0x1400, 0x1600,
92 0x1800, 0x1a00, 0x1c00, 0x1e00,
93 0x2000, 0x2200, 0x2400, 0x2600,
94 0x2800, 0x2a00, 0x2c00, 0x2e00,
95 0x3000, 0x3200, 0x3400, 0x3600,
96 0x3800, 0x3a00, 0x3c00, 0x3e00,
97 0x4000
98};
99
100static unsigned int osd_eotf_g_mapping[EOTF_LUT_SIZE] = {
101 0x0000, 0x0200, 0x0400, 0x0600,
102 0x0800, 0x0a00, 0x0c00, 0x0e00,
103 0x1000, 0x1200, 0x1400, 0x1600,
104 0x1800, 0x1a00, 0x1c00, 0x1e00,
105 0x2000, 0x2200, 0x2400, 0x2600,
106 0x2800, 0x2a00, 0x2c00, 0x2e00,
107 0x3000, 0x3200, 0x3400, 0x3600,
108 0x3800, 0x3a00, 0x3c00, 0x3e00,
109 0x4000
110};
111
112static unsigned int osd_eotf_b_mapping[EOTF_LUT_SIZE] = {
113 0x0000, 0x0200, 0x0400, 0x0600,
114 0x0800, 0x0a00, 0x0c00, 0x0e00,
115 0x1000, 0x1200, 0x1400, 0x1600,
116 0x1800, 0x1a00, 0x1c00, 0x1e00,
117 0x2000, 0x2200, 0x2400, 0x2600,
118 0x2800, 0x2a00, 0x2c00, 0x2e00,
119 0x3000, 0x3200, 0x3400, 0x3600,
120 0x3800, 0x3a00, 0x3c00, 0x3e00,
121 0x4000
122};
123
124static unsigned int video_eotf_r_mapping[EOTF_LUT_SIZE] = {
125 0x0000, 0x0200, 0x0400, 0x0600,
126 0x0800, 0x0a00, 0x0c00, 0x0e00,
127 0x1000, 0x1200, 0x1400, 0x1600,
128 0x1800, 0x1a00, 0x1c00, 0x1e00,
129 0x2000, 0x2200, 0x2400, 0x2600,
130 0x2800, 0x2a00, 0x2c00, 0x2e00,
131 0x3000, 0x3200, 0x3400, 0x3600,
132 0x3800, 0x3a00, 0x3c00, 0x3e00,
133 0x4000
134};
135
136static unsigned int video_eotf_g_mapping[EOTF_LUT_SIZE] = {
137 0x0000, 0x0200, 0x0400, 0x0600,
138 0x0800, 0x0a00, 0x0c00, 0x0e00,
139 0x1000, 0x1200, 0x1400, 0x1600,
140 0x1800, 0x1a00, 0x1c00, 0x1e00,
141 0x2000, 0x2200, 0x2400, 0x2600,
142 0x2800, 0x2a00, 0x2c00, 0x2e00,
143 0x3000, 0x3200, 0x3400, 0x3600,
144 0x3800, 0x3a00, 0x3c00, 0x3e00,
145 0x4000
146};
147
148static unsigned int video_eotf_b_mapping[EOTF_LUT_SIZE] = {
149 0x0000, 0x0200, 0x0400, 0x0600,
150 0x0800, 0x0a00, 0x0c00, 0x0e00,
151 0x1000, 0x1200, 0x1400, 0x1600,
152 0x1800, 0x1a00, 0x1c00, 0x1e00,
153 0x2000, 0x2200, 0x2400, 0x2600,
154 0x2800, 0x2a00, 0x2c00, 0x2e00,
155 0x3000, 0x3200, 0x3400, 0x3600,
156 0x3800, 0x3a00, 0x3c00, 0x3e00,
157 0x4000
158};
159#endif
160#define EOTF_COEFF_NORM(a) ((int)((((a) * 4096.0) + 1) / 2))
161#define EOTF_COEFF_SIZE 10
162#define EOTF_COEFF_RIGHTSHIFT 1
163#ifndef AML_S5_DISPLAY
164static int osd_eotf_coeff[EOTF_COEFF_SIZE] = {
165 EOTF_COEFF_NORM(1.0), EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(0.0),
166 EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(1.0), EOTF_COEFF_NORM(0.0),
167 EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(1.0),
168 EOTF_COEFF_RIGHTSHIFT /* right shift */
169};
170
171static int video_eotf_coeff[EOTF_COEFF_SIZE] = {
172 EOTF_COEFF_NORM(1.0), EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(0.0),
173 EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(1.0), EOTF_COEFF_NORM(0.0),
174 EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(1.0),
175 EOTF_COEFF_RIGHTSHIFT /* right shift */
176};
177
178/******************** osd oetf **************/
179
180#endif
181#define OSD_OETF_LUT_SIZE 41
182#ifndef AML_S5_DISPLAY
183static unsigned int osd_oetf_r_mapping[OSD_OETF_LUT_SIZE] = {
184 0, 150, 250, 330,
185 395, 445, 485, 520,
186 544, 632, 686, 725,
187 756, 782, 803, 822,
188 839, 854, 868, 880,
189 892, 902, 913, 922,
190 931, 939, 947, 954,
191 961, 968, 974, 981,
192 986, 993, 998, 1003,
193 1009, 1014, 1018, 1023,
194 0
195};
196
197static unsigned int osd_oetf_g_mapping[OSD_OETF_LUT_SIZE] = {
198 0, 0, 0, 0,
199 0, 32, 64, 96,
200 128, 160, 196, 224,
201 256, 288, 320, 352,
202 384, 416, 448, 480,
203 512, 544, 576, 608,
204 640, 672, 704, 736,
205 768, 800, 832, 864,
206 896, 928, 960, 992,
207 1023, 1023, 1023, 1023,
208 1023
209};
210
211static unsigned int osd_oetf_b_mapping[OSD_OETF_LUT_SIZE] = {
212 0, 0, 0, 0,
213 0, 32, 64, 96,
214 128, 160, 196, 224,
215 256, 288, 320, 352,
216 384, 416, 448, 480,
217 512, 544, 576, 608,
218 640, 672, 704, 736,
219 768, 800, 832, 864,
220 896, 928, 960, 992,
221 1023, 1023, 1023, 1023,
222 1023
223};
224
225/************ video oetf ***************/
226
227#define VIDEO_OETF_LUT_SIZE 289
228static unsigned int video_oetf_r_mapping[VIDEO_OETF_LUT_SIZE] = {
229 0, 0, 0, 0, 0, 0, 0, 0,
230 0, 0, 0, 0, 0, 0, 0, 0,
231 4, 8, 12, 16, 20, 24, 28, 32,
232 36, 40, 44, 48, 52, 56, 60, 64,
233 68, 72, 76, 80, 84, 88, 92, 96,
234 100, 104, 108, 112, 116, 120, 124, 128,
235 132, 136, 140, 144, 148, 152, 156, 160,
236 164, 168, 172, 176, 180, 184, 188, 192,
237 196, 200, 204, 208, 212, 216, 220, 224,
238 228, 232, 236, 240, 244, 248, 252, 256,
239 260, 264, 268, 272, 276, 280, 284, 288,
240 292, 296, 300, 304, 308, 312, 316, 320,
241 324, 328, 332, 336, 340, 344, 348, 352,
242 356, 360, 364, 368, 372, 376, 380, 384,
243 388, 392, 396, 400, 404, 408, 412, 416,
244 420, 424, 428, 432, 436, 440, 444, 448,
245 452, 456, 460, 464, 468, 472, 476, 480,
246 484, 488, 492, 496, 500, 504, 508, 512,
247 516, 520, 524, 528, 532, 536, 540, 544,
248 548, 552, 556, 560, 564, 568, 572, 576,
249 580, 584, 588, 592, 596, 600, 604, 608,
250 612, 616, 620, 624, 628, 632, 636, 640,
251 644, 648, 652, 656, 660, 664, 668, 672,
252 676, 680, 684, 688, 692, 696, 700, 704,
253 708, 712, 716, 720, 724, 728, 732, 736,
254 740, 744, 748, 752, 756, 760, 764, 768,
255 772, 776, 780, 784, 788, 792, 796, 800,
256 804, 808, 812, 816, 820, 824, 828, 832,
257 836, 840, 844, 848, 852, 856, 860, 864,
258 868, 872, 876, 880, 884, 888, 892, 896,
259 900, 904, 908, 912, 916, 920, 924, 928,
260 932, 936, 940, 944, 948, 952, 956, 960,
261 964, 968, 972, 976, 980, 984, 988, 992,
262 996, 1000, 1004, 1008, 1012, 1016, 1020, 1023,
263 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
264 1023
265};
266
267static unsigned int video_oetf_g_mapping[VIDEO_OETF_LUT_SIZE] = {
268 0, 0, 0, 0, 0, 0, 0, 0,
269 0, 0, 0, 0, 0, 0, 0, 0,
270 4, 8, 12, 16, 20, 24, 28, 32,
271 36, 40, 44, 48, 52, 56, 60, 64,
272 68, 72, 76, 80, 84, 88, 92, 96,
273 100, 104, 108, 112, 116, 120, 124, 128,
274 132, 136, 140, 144, 148, 152, 156, 160,
275 164, 168, 172, 176, 180, 184, 188, 192,
276 196, 200, 204, 208, 212, 216, 220, 224,
277 228, 232, 236, 240, 244, 248, 252, 256,
278 260, 264, 268, 272, 276, 280, 284, 288,
279 292, 296, 300, 304, 308, 312, 316, 320,
280 324, 328, 332, 336, 340, 344, 348, 352,
281 356, 360, 364, 368, 372, 376, 380, 384,
282 388, 392, 396, 400, 404, 408, 412, 416,
283 420, 424, 428, 432, 436, 440, 444, 448,
284 452, 456, 460, 464, 468, 472, 476, 480,
285 484, 488, 492, 496, 500, 504, 508, 512,
286 516, 520, 524, 528, 532, 536, 540, 544,
287 548, 552, 556, 560, 564, 568, 572, 576,
288 580, 584, 588, 592, 596, 600, 604, 608,
289 612, 616, 620, 624, 628, 632, 636, 640,
290 644, 648, 652, 656, 660, 664, 668, 672,
291 676, 680, 684, 688, 692, 696, 700, 704,
292 708, 712, 716, 720, 724, 728, 732, 736,
293 740, 744, 748, 752, 756, 760, 764, 768,
294 772, 776, 780, 784, 788, 792, 796, 800,
295 804, 808, 812, 816, 820, 824, 828, 832,
296 836, 840, 844, 848, 852, 856, 860, 864,
297 868, 872, 876, 880, 884, 888, 892, 896,
298 900, 904, 908, 912, 916, 920, 924, 928,
299 932, 936, 940, 944, 948, 952, 956, 960,
300 964, 968, 972, 976, 980, 984, 988, 992,
301 996, 1000, 1004, 1008, 1012, 1016, 1020, 1023,
302 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
303 1023
304};
305
306static unsigned int video_oetf_b_mapping[VIDEO_OETF_LUT_SIZE] = {
307 0, 0, 0, 0, 0, 0, 0, 0,
308 0, 0, 0, 0, 0, 0, 0, 0,
309 4, 8, 12, 16, 20, 24, 28, 32,
310 36, 40, 44, 48, 52, 56, 60, 64,
311 68, 72, 76, 80, 84, 88, 92, 96,
312 100, 104, 108, 112, 116, 120, 124, 128,
313 132, 136, 140, 144, 148, 152, 156, 160,
314 164, 168, 172, 176, 180, 184, 188, 192,
315 196, 200, 204, 208, 212, 216, 220, 224,
316 228, 232, 236, 240, 244, 248, 252, 256,
317 260, 264, 268, 272, 276, 280, 284, 288,
318 292, 296, 300, 304, 308, 312, 316, 320,
319 324, 328, 332, 336, 340, 344, 348, 352,
320 356, 360, 364, 368, 372, 376, 380, 384,
321 388, 392, 396, 400, 404, 408, 412, 416,
322 420, 424, 428, 432, 436, 440, 444, 448,
323 452, 456, 460, 464, 468, 472, 476, 480,
324 484, 488, 492, 496, 500, 504, 508, 512,
325 516, 520, 524, 528, 532, 536, 540, 544,
326 548, 552, 556, 560, 564, 568, 572, 576,
327 580, 584, 588, 592, 596, 600, 604, 608,
328 612, 616, 620, 624, 628, 632, 636, 640,
329 644, 648, 652, 656, 660, 664, 668, 672,
330 676, 680, 684, 688, 692, 696, 700, 704,
331 708, 712, 716, 720, 724, 728, 732, 736,
332 740, 744, 748, 752, 756, 760, 764, 768,
333 772, 776, 780, 784, 788, 792, 796, 800,
334 804, 808, 812, 816, 820, 824, 828, 832,
335 836, 840, 844, 848, 852, 856, 860, 864,
336 868, 872, 876, 880, 884, 888, 892, 896,
337 900, 904, 908, 912, 916, 920, 924, 928,
338 932, 936, 940, 944, 948, 952, 956, 960,
339 964, 968, 972, 976, 980, 984, 988, 992,
340 996, 1000, 1004, 1008, 1012, 1016, 1020, 1023,
341 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
342 1023
343};
344#endif
345#define COEFF_NORM(a) ((int)((((a) * 2048.0) + 1) / 2))
346#define COEFF_NORM12(a) ((int)((((a) * 8192.0) + 1) / 2))
347
348#define MATRIX_5x3_COEF_SIZE 24
349#ifndef AML_S5_DISPLAY
350/******* osd1 matrix0 *******/
351/* default rgb to yuv_limit */
352static int osd_matrix_coeff[MATRIX_5x3_COEF_SIZE] = {
353 0, 0, 0, /* pre offset */
354 COEFF_NORM(0.2126), COEFF_NORM(0.7152), COEFF_NORM(0.0722),
355 COEFF_NORM(-0.11457), COEFF_NORM(-0.38543), COEFF_NORM(0.5),
356 COEFF_NORM(0.5), COEFF_NORM(-0.45415), COEFF_NORM(-0.045847),
357 0, 0, 0, /* 30/31/32 */
358 0, 0, 0, /* 40/41/42 */
359 0, 512, 512, /* offset */
360 0, 0, 0 /* mode, right_shift, clip_en */
361};
362
363static int vd1_matrix_coeff[MATRIX_5x3_COEF_SIZE] = {
364 0, 0, 0, /* pre offset */
365 COEFF_NORM(1.0), COEFF_NORM(0.0), COEFF_NORM(0.0),
366 COEFF_NORM(0.0), COEFF_NORM(1.0), COEFF_NORM(0.0),
367 COEFF_NORM(0.0), COEFF_NORM(0.0), COEFF_NORM(1.0),
368 0, 0, 0, /* 30/31/32 */
369 0, 0, 0, /* 40/41/42 */
370 0, 0, 0, /* offset */
371 0, 0, 0 /* mode, right_shift, clip_en */
372};
373
374static int vd2_matrix_coeff[MATRIX_5x3_COEF_SIZE] = {
375 0, 0, 0, /* pre offset */
376 COEFF_NORM(1.0), COEFF_NORM(0.0), COEFF_NORM(0.0),
377 COEFF_NORM(0.0), COEFF_NORM(1.0), COEFF_NORM(0.0),
378 COEFF_NORM(0.0), COEFF_NORM(0.0), COEFF_NORM(1.0),
379 0, 0, 0, /* 30/31/32 */
380 0, 0, 0, /* 40/41/42 */
381 0, 0, 0, /* offset */
382 0, 0, 0 /* mode, right_shift, clip_en */
383};
384
385static int post_matrix_coeff[MATRIX_5x3_COEF_SIZE] = {
386 0, 0, 0, /* pre offset */
387 COEFF_NORM(1.0), COEFF_NORM(0.0), COEFF_NORM(0.0),
388 COEFF_NORM(0.0), COEFF_NORM(1.0), COEFF_NORM(0.0),
389 COEFF_NORM(0.0), COEFF_NORM(0.0), COEFF_NORM(1.0),
390 0, 0, 0, /* 30/31/32 */
391 0, 0, 0, /* 40/41/42 */
392 0, 0, 0, /* offset */
393 0, 0, 0 /* mode, right_shift, clip_en */
394};
395
396static int xvycc_matrix_coeff[MATRIX_5x3_COEF_SIZE] = {
397 0, 0, 0, /* pre offset */
398 COEFF_NORM(1.0), COEFF_NORM(0.0), COEFF_NORM(0.0),
399 COEFF_NORM(0.0), COEFF_NORM(1.0), COEFF_NORM(0.0),
400 COEFF_NORM(0.0), COEFF_NORM(0.0), COEFF_NORM(1.0),
401 0, 0, 0, /* 30/31/32 */
402 0, 0, 0, /* 40/41/42 */
403 0, 0, 0, /* offset */
404 0, 0, 0 /* mode, right_shift, clip_en */
405};
406#endif
407
408static int RGB709_to_YUV709l_coeff[MATRIX_5x3_COEF_SIZE] = {
409 0, 0, 0, /* pre offset */
410 COEFF_NORM(0.181873), COEFF_NORM(0.611831), COEFF_NORM(0.061765),
411 COEFF_NORM(-0.100251), COEFF_NORM(-0.337249), COEFF_NORM(0.437500),
412 COEFF_NORM(0.437500), COEFF_NORM(-0.397384), COEFF_NORM(-0.040116),
413 0, 0, 0, /* 10'/11'/12' */
414 0, 0, 0, /* 20'/21'/22' */
415 64, 512, 512, /* offset */
416 0, 0, 0 /* mode, right_shift, clip_en */
417};
418
419#ifndef AML_S5_DISPLAY
420/* eotf matrix: bypass */
421static int eotf_bypass_coeff[EOTF_COEFF_SIZE] = {
422 EOTF_COEFF_NORM(1.0), EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(0.0),
423 EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(1.0), EOTF_COEFF_NORM(0.0),
424 EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(0.0), EOTF_COEFF_NORM(1.0),
425 EOTF_COEFF_RIGHTSHIFT /* right shift */
426};
427
428/* eotf lut: linear */
429static unsigned int eotf_33_linear_mapping[EOTF_LUT_SIZE] = {
430 0x0000, 0x0200, 0x0400, 0x0600,
431 0x0800, 0x0a00, 0x0c00, 0x0e00,
432 0x1000, 0x1200, 0x1400, 0x1600,
433 0x1800, 0x1a00, 0x1c00, 0x1e00,
434 0x2000, 0x2200, 0x2400, 0x2600,
435 0x2800, 0x2a00, 0x2c00, 0x2e00,
436 0x3000, 0x3200, 0x3400, 0x3600,
437 0x3800, 0x3a00, 0x3c00, 0x3e00,
438 0x4000
439};
440
441/* osd oetf lut: linear */
442static unsigned int oetf_41_linear_mapping[OSD_OETF_LUT_SIZE] = {
443 0, 0, 0, 0,
444 0, 32, 64, 96,
445 128, 160, 196, 224,
446 256, 288, 320, 352,
447 384, 416, 448, 480,
448 512, 544, 576, 608,
449 640, 672, 704, 736,
450 768, 800, 832, 864,
451 896, 928, 960, 992,
452 1023, 1023, 1023, 1023,
453 1023
454};
455#endif
456
457/*static int YUV709l_to_RGB709_coeff[MATRIX_5x3_COEF_SIZE] = { */
458/* -64, -512, -512, pre offset */
459/* COEFF_NORM(1.16895), COEFF_NORM(0.00000), COEFF_NORM(1.79977), */
460/* COEFF_NORM(1.16895), COEFF_NORM(-0.21408), COEFF_NORM(-0.53500), */
461/* COEFF_NORM(1.16895), COEFF_NORM(2.12069), COEFF_NORM(0.00000), */
462/* 0, 0, 0, 30/31/32 */
463/* 0, 0, 0, 40/41/42 */
464/* 0, 0, 0, offset */
465/* 0, 0, 0 mode, right_shift, clip_en */
466/*}; */
467
468static int YUV709l_to_RGB709_coeff12[MATRIX_5x3_COEF_SIZE] = {
469 -256, -2048, -2048, /* pre offset */
470 COEFF_NORM12(1.16895), COEFF_NORM12(0.00000), COEFF_NORM12(1.79977),
471 COEFF_NORM12(1.16895), COEFF_NORM12(-0.21408), COEFF_NORM12(-0.53500),
472 COEFF_NORM12(1.16895), COEFF_NORM12(2.12069), COEFF_NORM12(0.00000),
473 0, 0, 0, /* 30/31/32 */
474 0, 0, 0, /* 40/41/42 */
475 0, 0, 0, /* offset */
476 0, 0, 0 /* mode, right_shift, clip_en */
477};
478
479#define SIGN(a) ((a < 0) ? "-" : "+")
480#define DECI(a) ((a) / 1024)
481#define FRAC(a) ((((a) >= 0) ? \
482 ((a) & 0x3ff) : ((~(a) + 1) & 0x3ff)) * 10000 / 1024)
483
484#define INORM 50000
485#ifdef CONFIG_AML_HDMITX
486static u32 bt2020_primaries[3][2] = {
487 {0.17 * INORM + 0.5, 0.797 * INORM + 0.5}, /* G */
488 {0.131 * INORM + 0.5, 0.046 * INORM + 0.5}, /* B */
489 {0.708 * INORM + 0.5, 0.292 * INORM + 0.5}, /* R */
490};
491
492static u32 bt2020_white_point[2] = {
493 0.3127 * INORM + 0.5, 0.3290 * INORM + 0.5
494};
495#endif
496
497static int vpp_get_chip_type(void)
498{
499 unsigned int cpu_type;
500
501 cpu_type = get_cpu_id().family_id;
502 return cpu_type;
503}
504
505int is_osd_high_version(void)
506{
507 u32 family_id = get_cpu_id().family_id;
508
509 if (family_id == MESON_CPU_MAJOR_ID_G12A ||
510 family_id == MESON_CPU_MAJOR_ID_G12B ||
511 family_id >= MESON_CPU_MAJOR_ID_SM1)
512 return 1;
513 else
514 return 0;
515}
516
517/* OSD csc defines end */
518
Huijuan Xiao33baf922024-05-28 14:08:12 +0800519void mtx_setting(enum vpp_matrix_e mtx_sel,
520 enum mtx_csc_e mtx_csc,
521 int mtx_on)
522{
523 unsigned int matrix_coef00_01 = 0;
524 unsigned int matrix_coef02_10 = 0;
525 unsigned int matrix_coef11_12 = 0;
526 unsigned int matrix_coef20_21 = 0;
527 unsigned int matrix_coef22 = 0;
528 unsigned int matrix_offset0_1 = 0;
529 unsigned int matrix_offset2 = 0;
530 unsigned int matrix_pre_offset0_1 = 0;
531 unsigned int matrix_pre_offset2 = 0;
532 unsigned int matrix_en_ctrl = 0;
533
534 if (mtx_sel == VPP_OSD1_MTX) {
535 matrix_coef00_01 = VPP_WRAP_OSD1_MATRIX_COEF00_01;
536 matrix_coef02_10 = VPP_WRAP_OSD1_MATRIX_COEF02_10;
537 matrix_coef11_12 = VPP_WRAP_OSD1_MATRIX_COEF11_12;
538 matrix_coef20_21 = VPP_WRAP_OSD1_MATRIX_COEF20_21;
539 matrix_coef22 = VPP_WRAP_OSD1_MATRIX_COEF22;
540 matrix_offset0_1 = VPP_WRAP_OSD1_MATRIX_OFFSET0_1;
541 matrix_offset2 = VPP_WRAP_OSD1_MATRIX_OFFSET2;
542 matrix_pre_offset0_1 = VPP_WRAP_OSD1_MATRIX_PRE_OFFSET0_1;
543 matrix_pre_offset2 = VPP_WRAP_OSD1_MATRIX_PRE_OFFSET2;
544 matrix_en_ctrl = VPP_WRAP_OSD1_MATRIX_EN_CTRL;
545
546 vpp_reg_setb(matrix_en_ctrl, mtx_on, 0, 1);
547 } else if (mtx_sel == VPP_OSD2_MTX) {
548 matrix_coef00_01 = VPP_OSD2_MATRIX_COEF00_01;
549 matrix_coef02_10 = VPP_OSD2_MATRIX_COEF02_10;
550 matrix_coef11_12 = VPP_OSD2_MATRIX_COEF11_12;
551 matrix_coef20_21 = VPP_OSD2_MATRIX_COEF20_21;
552 matrix_coef22 = VPP_OSD2_MATRIX_COEF22;
553 matrix_offset0_1 = VPP_OSD2_MATRIX_OFFSET0_1;
554 matrix_offset2 = VPP_OSD2_MATRIX_OFFSET2;
555 matrix_pre_offset0_1 = VPP_OSD2_MATRIX_PRE_OFFSET0_1;
556 matrix_pre_offset2 = VPP_OSD2_MATRIX_PRE_OFFSET2;
557 matrix_en_ctrl = VPP_OSD2_MATRIX_EN_CTRL;
558
559 vpp_reg_setb(matrix_en_ctrl, mtx_on, 0, 1);
560
561 } else {
562 return;
563 }
564
565 if (!mtx_on)
566 return;
567
568 switch (mtx_csc) {
569 case MATRIX_RGB_YUV709:
570 vpp_reg_write(matrix_coef00_01, 0x00bb0275);
571 vpp_reg_write(matrix_coef02_10, 0x003f1f99);
572 vpp_reg_write(matrix_coef11_12, 0x1ea601c2);
573 vpp_reg_write(matrix_coef20_21, 0x01c21e67);
574 vpp_reg_write(matrix_coef22, 0x00001fd7);
575 vpp_reg_write(matrix_offset0_1, 0x00400200);
576 vpp_reg_write(matrix_offset2, 0x00000200);
577 vpp_reg_write(matrix_pre_offset0_1, 0x0);
578 vpp_reg_write(matrix_pre_offset2, 0x0);
579 break;
580 case MATRIX_RGB_BT2020YUV:
581 vpp_reg_write(matrix_coef00_01, 0x00e60252);
582 vpp_reg_write(matrix_coef02_10, 0x00341f83);
583 vpp_reg_write(matrix_coef11_12, 0x1ebd01c0);
584 vpp_reg_write(matrix_coef20_21, 0x01c01e63);
585 vpp_reg_write(matrix_coef22, 0x00001fdc);
586 vpp_reg_write(matrix_offset0_1, 0x00400200);
587 vpp_reg_write(matrix_offset2, 0x00000200);
588 vpp_reg_write(matrix_pre_offset0_1, 0x0);
589 vpp_reg_write(matrix_pre_offset2, 0x0);
590 default:
591 break;
592 }
593}
594
hai.cao8c827c02023-02-28 11:12:05 +0800595#ifndef AML_S5_DISPLAY
596static void vpp_set_matrix_default_init(void)
597{
598 /* default probe_sel, for highlight en */
599 vpp_reg_setb(VPP_MATRIX_CTRL, 0xf, 11, 4);
600}
601#endif
602
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000603/*ve module slice1~slice3 offset*/
604unsigned int ve_reg_ofst[3] = {
605 0x0, 0x100, 0x200
606};
607
608unsigned int pst_reg_ofst[4] = {
609 0x0, 0x100, 0x700, 0x1900
610};
611
612//S5 4 slice matrix setting, for hdmitx dsc enable
613void vpp_mtx_config_v2(struct matrix_coef_s *coef,
614 enum vpp_slice_e slice,
615 enum vpp_matrix_e mtx_sel)
616{
617 int reg_pre_offset0_1 = 0;
618 int reg_pre_offset2 = 0;
619 int reg_coef00_01 = 0;
620 int reg_coef02_10 = 0;
621 int reg_coef11_12 = 0;
622 int reg_coef20_21 = 0;
623 int reg_coef22 = 0;
624 int reg_offset0_1 = 0;
625 int reg_offset2 = 0;
626 int reg_en_ctl = 0;
627
628 switch (slice) {
629 case SLICE0:
630 if (mtx_sel == VD1_MTX) {
631 reg_pre_offset0_1 = S5_VPP_VD1_MATRIX_PRE_OFFSET0_1;
632 reg_pre_offset2 = S5_VPP_VD1_MATRIX_PRE_OFFSET2;
633 reg_coef00_01 = S5_VPP_VD1_MATRIX_COEF00_01;
634 reg_coef02_10 = S5_VPP_VD1_MATRIX_COEF02_10;
635 reg_coef11_12 = S5_VPP_VD1_MATRIX_COEF11_12;
636 reg_coef20_21 = S5_VPP_VD1_MATRIX_COEF20_21;
637 reg_coef22 = S5_VPP_VD1_MATRIX_COEF22;
638 reg_offset0_1 = S5_VPP_VD1_MATRIX_OFFSET0_1;
639 reg_offset2 = S5_VPP_VD1_MATRIX_OFFSET2;
640 reg_en_ctl = S5_VPP_VD1_MATRIX_EN_CTRL;
641 } else if (mtx_sel == POST2_MTX) {
642 reg_pre_offset0_1 = S5_VPP_POST2_MATRIX_PRE_OFFSET0_1;
643 reg_pre_offset2 = S5_VPP_POST2_MATRIX_PRE_OFFSET2;
644 reg_coef00_01 = S5_VPP_POST2_MATRIX_COEF00_01;
645 reg_coef02_10 = S5_VPP_POST2_MATRIX_COEF02_10;
646 reg_coef11_12 = S5_VPP_POST2_MATRIX_COEF11_12;
647 reg_coef20_21 = S5_VPP_POST2_MATRIX_COEF20_21;
648 reg_coef22 = S5_VPP_POST2_MATRIX_COEF22;
649 reg_offset0_1 = S5_VPP_POST2_MATRIX_OFFSET0_1;
650 reg_offset2 = S5_VPP_POST2_MATRIX_OFFSET2;
651 reg_en_ctl = S5_VPP_POST2_MATRIX_EN_CTRL;
652 } else if (mtx_sel == POST_MTX) {
653 reg_pre_offset0_1 = S5_VPP_POST_MATRIX_PRE_OFFSET0_1;
654 reg_pre_offset2 = S5_VPP_POST_MATRIX_PRE_OFFSET2;
655 reg_coef00_01 = S5_VPP_POST_MATRIX_COEF00_01;
656 reg_coef02_10 = S5_VPP_POST_MATRIX_COEF02_10;
657 reg_coef11_12 = S5_VPP_POST_MATRIX_COEF11_12;
658 reg_coef20_21 = S5_VPP_POST_MATRIX_COEF20_21;
659 reg_coef22 = S5_VPP_POST_MATRIX_COEF22;
660 reg_offset0_1 = S5_VPP_POST_MATRIX_OFFSET0_1;
661 reg_offset2 = S5_VPP_POST_MATRIX_OFFSET2;
662 reg_en_ctl = S5_VPP_POST_MATRIX_EN_CTRL;
663 } else {
664 reg_pre_offset0_1 = S5_VPP_POST2_MATRIX_PRE_OFFSET0_1;
665 reg_pre_offset2 = S5_VPP_POST2_MATRIX_PRE_OFFSET2;
666 reg_coef00_01 = S5_VPP_POST2_MATRIX_COEF00_01;
667 reg_coef02_10 = S5_VPP_POST2_MATRIX_COEF02_10;
668 reg_coef11_12 = S5_VPP_POST2_MATRIX_COEF11_12;
669 reg_coef20_21 = S5_VPP_POST2_MATRIX_COEF20_21;
670 reg_coef22 = S5_VPP_POST2_MATRIX_COEF22;
671 reg_offset0_1 = S5_VPP_POST2_MATRIX_OFFSET0_1;
672 reg_offset2 = S5_VPP_POST2_MATRIX_OFFSET2;
673 reg_en_ctl = S5_VPP_POST2_MATRIX_EN_CTRL;
674 }
675 break;
676 case SLICE1:
677 case SLICE2:
678 case SLICE3:
679 if (mtx_sel == VD1_MTX) {
680 reg_pre_offset0_1 = S5_VPP_SLICE1_VD1_MATRIX_PRE_OFFSET0_1 +
681 ve_reg_ofst[slice - 1];
682 reg_pre_offset2 = S5_VPP_SLICE1_VD1_MATRIX_PRE_OFFSET2 +
683 ve_reg_ofst[slice - 1];
684 reg_coef00_01 = S5_VPP_SLICE1_VD1_MATRIX_COEF00_01 +
685 ve_reg_ofst[slice - 1];
686 reg_coef02_10 = S5_VPP_SLICE1_VD1_MATRIX_COEF02_10 +
687 ve_reg_ofst[slice - 1];
688 reg_coef11_12 = S5_VPP_SLICE1_VD1_MATRIX_COEF11_12 +
689 ve_reg_ofst[slice - 1];
690 reg_coef20_21 = S5_VPP_SLICE1_VD1_MATRIX_COEF20_21 +
691 ve_reg_ofst[slice - 1];
692 reg_coef22 = S5_VPP_SLICE1_VD1_MATRIX_COEF22 +
693 ve_reg_ofst[slice - 1];
694 reg_offset0_1 = S5_VPP_SLICE1_VD1_MATRIX_OFFSET0_1 +
695 ve_reg_ofst[slice - 1];
696 reg_offset2 = S5_VPP_SLICE1_VD1_MATRIX_OFFSET2 +
697 ve_reg_ofst[slice - 1];
698 reg_en_ctl = S5_VPP_SLICE1_VD1_MATRIX_EN_CTRL +
699 ve_reg_ofst[slice - 1];
700 } else if (mtx_sel == POST2_MTX) {
701 reg_pre_offset0_1 = S5_VPP_POST2_MATRIX_PRE_OFFSET0_1 +
702 pst_reg_ofst[slice];
703 reg_pre_offset2 = S5_VPP_POST2_MATRIX_PRE_OFFSET2 +
704 pst_reg_ofst[slice];
705 reg_coef00_01 = S5_VPP_POST2_MATRIX_COEF00_01 +
706 pst_reg_ofst[slice];
707 reg_coef02_10 = S5_VPP_POST2_MATRIX_COEF02_10 +
708 pst_reg_ofst[slice];
709 reg_coef11_12 = S5_VPP_POST2_MATRIX_COEF11_12 +
710 pst_reg_ofst[slice];
711 reg_coef20_21 = S5_VPP_POST2_MATRIX_COEF20_21 +
712 pst_reg_ofst[slice];
713 reg_coef22 = S5_VPP_POST2_MATRIX_COEF22 +
714 pst_reg_ofst[slice];
715 reg_offset0_1 = S5_VPP_POST2_MATRIX_OFFSET0_1 +
716 pst_reg_ofst[slice];
717 reg_offset2 = S5_VPP_POST2_MATRIX_OFFSET2 +
718 pst_reg_ofst[slice];
719 reg_en_ctl = S5_VPP_POST2_MATRIX_EN_CTRL +
720 pst_reg_ofst[slice];
721 } else if (mtx_sel == POST_MTX) {
722 reg_pre_offset0_1 = S5_VPP_POST_MATRIX_PRE_OFFSET0_1 +
723 pst_reg_ofst[slice];
724 reg_pre_offset2 = S5_VPP_POST_MATRIX_PRE_OFFSET2 +
725 pst_reg_ofst[slice];
726 reg_coef00_01 = S5_VPP_POST_MATRIX_COEF00_01 +
727 pst_reg_ofst[slice];
728 reg_coef02_10 = S5_VPP_POST_MATRIX_COEF02_10 +
729 pst_reg_ofst[slice];
730 reg_coef11_12 = S5_VPP_POST_MATRIX_COEF11_12 +
731 pst_reg_ofst[slice];
732 reg_coef20_21 = S5_VPP_POST_MATRIX_COEF20_21 +
733 pst_reg_ofst[slice];
734 reg_coef22 = S5_VPP_POST_MATRIX_COEF22 +
735 pst_reg_ofst[slice];
736 reg_offset0_1 = S5_VPP_POST_MATRIX_OFFSET0_1 +
737 pst_reg_ofst[slice];
738 reg_offset2 = S5_VPP_POST_MATRIX_OFFSET2 +
739 pst_reg_ofst[slice];
740 reg_en_ctl = S5_VPP_POST_MATRIX_EN_CTRL +
741 pst_reg_ofst[slice];
742 } else {
743 reg_pre_offset0_1 = S5_VPP_POST2_MATRIX_PRE_OFFSET0_1 +
744 pst_reg_ofst[slice];
745 reg_pre_offset2 = S5_VPP_POST2_MATRIX_PRE_OFFSET2 +
746 pst_reg_ofst[slice];
747 reg_coef00_01 = S5_VPP_POST2_MATRIX_COEF00_01 +
748 pst_reg_ofst[slice];
749 reg_coef02_10 = S5_VPP_POST2_MATRIX_COEF02_10 +
750 pst_reg_ofst[slice];
751 reg_coef11_12 = S5_VPP_POST2_MATRIX_COEF11_12 +
752 pst_reg_ofst[slice];
753 reg_coef20_21 = S5_VPP_POST2_MATRIX_COEF20_21 +
754 pst_reg_ofst[slice];
755 reg_coef22 = S5_VPP_POST2_MATRIX_COEF22 +
756 pst_reg_ofst[slice];
757 reg_offset0_1 = S5_VPP_POST2_MATRIX_OFFSET0_1 +
758 pst_reg_ofst[slice];
759 reg_offset2 = S5_VPP_POST2_MATRIX_OFFSET2 +
760 pst_reg_ofst[slice];
761 reg_en_ctl = S5_VPP_POST2_MATRIX_EN_CTRL +
762 pst_reg_ofst[slice];
763 }
764 break;
765 default:
766 return;
767 }
768
769 vpp_reg_write(reg_pre_offset0_1,
770 (coef->pre_offset[0] << 16) | coef->pre_offset[1]);
771 vpp_reg_write(reg_pre_offset2, coef->pre_offset[2]);
772 vpp_reg_write(reg_coef00_01,
773 (coef->matrix_coef[0][0] << 16) | coef->matrix_coef[0][1]);
774 vpp_reg_write(reg_coef02_10,
775 (coef->matrix_coef[0][2] << 16) | coef->matrix_coef[1][0]);
776 vpp_reg_write(reg_coef11_12,
777 (coef->matrix_coef[1][1] << 16) | coef->matrix_coef[1][2]);
778 vpp_reg_write(reg_coef20_21,
779 (coef->matrix_coef[2][0] << 16) | coef->matrix_coef[2][1]);
780 vpp_reg_write(reg_coef22, coef->matrix_coef[2][2]);
781 vpp_reg_write(reg_offset0_1,
782 (coef->post_offset[0] << 16) | coef->post_offset[1]);
783 vpp_reg_write(reg_offset2, coef->post_offset[2]);
784 vpp_reg_setb(reg_en_ctl, coef->en, 0, 1);
785}
786
787void mtx_setting_v2(enum vpp_matrix_e mtx_sel,
788 enum mtx_csc_e mtx_csc,
789 int mtx_on,
790 enum vpp_slice_e slice)
791{
792 struct matrix_coef_s coef;
793
794 switch (mtx_csc) {
795 case MATRIX_RGB_YUV709:
796 coef.matrix_coef[0][0] = 0xbb;
797 coef.matrix_coef[0][1] = 0x275;
798 coef.matrix_coef[0][2] = 0x3f;
799 coef.matrix_coef[1][0] = 0x1f99;
800 coef.matrix_coef[1][1] = 0x1ea6;
801 coef.matrix_coef[1][2] = 0x1c2;
802 coef.matrix_coef[2][0] = 0x1c2;
803 coef.matrix_coef[2][1] = 0x1e67;
804 coef.matrix_coef[2][2] = 0x1fd7;
805
806 coef.pre_offset[0] = 0;
807 coef.pre_offset[1] = 0;
808 coef.pre_offset[2] = 0;
809 coef.post_offset[0] = 0x40;
810 coef.post_offset[1] = 0x200;
811 coef.post_offset[2] = 0x200;
812 coef.en = mtx_on;
813 break;
814 case MATRIX_YUV709_RGB:
815 coef.matrix_coef[0][0] = 0x4ac;
816 coef.matrix_coef[0][1] = 0x0;
817 coef.matrix_coef[0][2] = 0x731;
818 coef.matrix_coef[1][0] = 0x4ac;
819 coef.matrix_coef[1][1] = 0x1f25;
820 coef.matrix_coef[1][2] = 0x1ddd;
821 coef.matrix_coef[2][0] = 0x4ac;
822 coef.matrix_coef[2][1] = 0x879;
823 coef.matrix_coef[2][2] = 0x0;
824
825 coef.pre_offset[0] = 0x7c0;
826 coef.pre_offset[1] = 0x600;
827 coef.pre_offset[2] = 0x600;
828 coef.post_offset[0] = 0x0;
829 coef.post_offset[1] = 0x0;
830 coef.post_offset[2] = 0x0;
831 coef.en = mtx_on;
832 break;
833 case MATRIX_YUV709F_RGB:/*full to full*/
834 coef.matrix_coef[0][0] = 0x400;
835 coef.matrix_coef[0][1] = 0x0;
836 coef.matrix_coef[0][2] = 0x64D;
837 coef.matrix_coef[1][0] = 0x400;
838 coef.matrix_coef[1][1] = 0x1F41;
839 coef.matrix_coef[1][2] = 0x1E21;
840 coef.matrix_coef[2][0] = 0x400;
841 coef.matrix_coef[2][1] = 0x76D;
842 coef.matrix_coef[2][2] = 0x0;
843
844 coef.pre_offset[0] = 0x0;
845 coef.pre_offset[1] = 0x600;
846 coef.pre_offset[2] = 0x600;
847 coef.post_offset[0] = 0x0;
848 coef.post_offset[1] = 0x0;
849 coef.post_offset[2] = 0x0;
850 coef.en = mtx_on;
851 break;
852 case MATRIX_NULL:
853 coef.matrix_coef[0][0] = 0;
854 coef.matrix_coef[0][1] = 0;
855 coef.matrix_coef[0][2] = 0;
856 coef.matrix_coef[1][0] = 0;
857 coef.matrix_coef[1][1] = 0;
858 coef.matrix_coef[1][2] = 0;
859 coef.matrix_coef[2][0] = 0;
860 coef.matrix_coef[2][1] = 0;
861 coef.matrix_coef[2][2] = 0;
862
863 coef.pre_offset[0] = 0;
864 coef.pre_offset[1] = 0;
865 coef.pre_offset[2] = 0;
866 coef.post_offset[0] = 0;
867 coef.post_offset[1] = 0;
868 coef.post_offset[2] = 0;
869 coef.en = mtx_on;
870 break;
871 default:
872 return;
873 }
874
875 vpp_mtx_config_v2(&coef, slice, mtx_sel);
876}
877
hai.cao8c827c02023-02-28 11:12:05 +0800878static void vpp_top_post2_matrix_yuv2rgb(int vpp_top)
879{
880 int *m = NULL;
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000881 int offset = 0x100;
882 unsigned int reg_mtrx_coeff00_01;
883 unsigned int reg_mtrx_coeff02_10;
884 unsigned int reg_mtrx_coeff11_12;
885 unsigned int reg_mtrx_coeff20_21;
886 unsigned int reg_mtrx_coeff22;
887 unsigned int reg_mtrx_offset0_1;
888 unsigned int reg_mtrx_offset2;
889 unsigned int reg_mtrx_pre_offset0_1;
890 unsigned int reg_mtrx_pre_offset2;
891 unsigned int reg_mtrx_en_ctrl;
892
hai.cao8c827c02023-02-28 11:12:05 +0800893 /* POST2 matrix: YUV limit -> RGB default is 12bit*/
894 m = YUV709l_to_RGB709_coeff12;
895
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000896 if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_S5) {
897 mtx_setting_v2(POST_MTX,
898 MATRIX_YUV709_RGB, MTX_ON, SLICE0);
899 mtx_setting_v2(POST_MTX,
900 MATRIX_YUV709_RGB, MTX_ON, SLICE1);
901 mtx_setting_v2(POST_MTX,
902 MATRIX_YUV709_RGB, MTX_ON, SLICE2);
903 mtx_setting_v2(POST_MTX,
904 MATRIX_YUV709_RGB, MTX_ON, SLICE3);
905 return;
906 } else if (get_cpu_id().family_id != MESON_CPU_MAJOR_ID_T3X) {
907 reg_mtrx_coeff00_01 = VPP_POST2_MATRIX_COEF00_01;
908 reg_mtrx_coeff02_10 = VPP_POST2_MATRIX_COEF02_10;
909 reg_mtrx_coeff11_12 = VPP_POST2_MATRIX_COEF11_12;
910 reg_mtrx_coeff20_21 = VPP_POST2_MATRIX_COEF20_21;
911 reg_mtrx_coeff22 = VPP_POST2_MATRIX_COEF22;
912 reg_mtrx_offset0_1 = VPP_POST2_MATRIX_OFFSET0_1;
913 reg_mtrx_offset2 = VPP_POST2_MATRIX_COEF22;
914 reg_mtrx_pre_offset0_1 = VPP_POST2_MATRIX_PRE_OFFSET0_1;
915 reg_mtrx_pre_offset2 = VPP_POST2_MATRIX_PRE_OFFSET2;
916 reg_mtrx_en_ctrl = VPP_POST2_MATRIX_EN_CTRL;
917 } else {
918 reg_mtrx_coeff00_01 = S0_VPP_POST2_MATRIX_COEF00_01;
919 reg_mtrx_coeff02_10 = S0_VPP_POST2_MATRIX_COEF02_10;
920 reg_mtrx_coeff11_12 = S0_VPP_POST2_MATRIX_COEF11_12;
921 reg_mtrx_coeff20_21 = S0_VPP_POST2_MATRIX_COEF20_21;
922 reg_mtrx_coeff22 = S0_VPP_POST2_MATRIX_COEF22;
923 reg_mtrx_offset0_1 = S0_VPP_POST2_MATRIX_OFFSET0_1;
924 reg_mtrx_offset2 = S0_VPP_POST2_MATRIX_COEF22;
925 reg_mtrx_pre_offset0_1 = S0_VPP_POST2_MATRIX_PRE_OFFSET0_1;
926 reg_mtrx_pre_offset2 = S0_VPP_POST2_MATRIX_PRE_OFFSET2;
927 reg_mtrx_en_ctrl = S0_VPP_POST2_MATRIX_EN_CTRL;
928 }
929
hai.cao8c827c02023-02-28 11:12:05 +0800930 if (vpp_top == 0) {
931 /* VPP WRAP POST2 matrix */
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000932 vpp_reg_write(reg_mtrx_pre_offset0_1,
hai.cao8c827c02023-02-28 11:12:05 +0800933 (((m[0] >> 2) & 0xfff) << 16) | ((m[1] >> 2) & 0xfff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000934 vpp_reg_write(reg_mtrx_pre_offset2,
hai.cao8c827c02023-02-28 11:12:05 +0800935 (m[2] >> 2) & 0xfff);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000936 vpp_reg_write(reg_mtrx_coeff00_01,
hai.cao8c827c02023-02-28 11:12:05 +0800937 (((m[3] >> 2) & 0x1fff) << 16) | ((m[4] >> 2) & 0x1fff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000938 vpp_reg_write(reg_mtrx_coeff02_10,
hai.cao8c827c02023-02-28 11:12:05 +0800939 (((m[5] >> 2) & 0x1fff) << 16) | ((m[6] >> 2) & 0x1fff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000940 vpp_reg_write(reg_mtrx_coeff11_12,
hai.cao8c827c02023-02-28 11:12:05 +0800941 (((m[7] >> 2) & 0x1fff) << 16) | ((m[8] >> 2) & 0x1fff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000942 vpp_reg_write(reg_mtrx_coeff20_21,
hai.cao8c827c02023-02-28 11:12:05 +0800943 (((m[9] >> 2) & 0x1fff) << 16) | ((m[10] >> 2) & 0x1fff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000944 vpp_reg_write(reg_mtrx_coeff22,
hai.cao8c827c02023-02-28 11:12:05 +0800945 (m[11] >> 2) & 0x1fff);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000946 vpp_reg_write(reg_mtrx_offset0_1,
hai.cao8c827c02023-02-28 11:12:05 +0800947 (((m[18] >> 2) & 0xfff) << 16) | ((m[19] >> 2) & 0xfff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000948 vpp_reg_write(reg_mtrx_offset2,
hai.cao8c827c02023-02-28 11:12:05 +0800949 (m[20] >> 2) & 0xfff);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000950 vpp_reg_setb(reg_mtrx_en_ctrl, 1, 0, 1);
951
952 if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_T3X) {
953 vpp_reg_write(reg_mtrx_pre_offset0_1 + offset,
954 (((m[0] >> 2) & 0xfff) << 16) | ((m[1] >> 2) & 0xfff));
955 vpp_reg_write(reg_mtrx_pre_offset2 + offset,
956 (m[2] >> 2) & 0xfff);
957 vpp_reg_write(reg_mtrx_coeff00_01 + offset,
958 (((m[3] >> 2) & 0x1fff) << 16) | ((m[4] >> 2) & 0x1fff));
959 vpp_reg_write(reg_mtrx_coeff02_10 + offset,
960 (((m[5] >> 2) & 0x1fff) << 16) | ((m[6] >> 2) & 0x1fff));
961 vpp_reg_write(reg_mtrx_coeff11_12 + offset,
962 (((m[7] >> 2) & 0x1fff) << 16) | ((m[8] >> 2) & 0x1fff));
963 vpp_reg_write(reg_mtrx_coeff20_21 + offset,
964 (((m[9] >> 2) & 0x1fff) << 16) | ((m[10] >> 2) & 0x1fff));
965 vpp_reg_write(reg_mtrx_coeff22 + offset,
966 (m[11] >> 2) & 0x1fff);
967 vpp_reg_write(reg_mtrx_offset0_1 + offset,
968 (((m[18] >> 2) & 0xfff) << 16) | ((m[19] >> 2) & 0xfff));
969 vpp_reg_write(reg_mtrx_offset2 + offset,
970 (m[20] >> 2) & 0xfff);
971 vpp_reg_setb(reg_mtrx_en_ctrl + offset, 1, 0, 1);
972 }
hai.cao8c827c02023-02-28 11:12:05 +0800973 } else if (vpp_top == 1) {
974 vpp_reg_write(VPP1_MATRIX_PRE_OFFSET0_1,
975 (((m[0] >> 2) & 0xfff) << 16) | ((m[1] >> 2) & 0xfff));
976 vpp_reg_write(VPP1_MATRIX_PRE_OFFSET2,
977 (m[2] >> 2) & 0xfff);
978 vpp_reg_write(VPP1_MATRIX_COEF00_01,
979 (((m[3] >> 2) & 0x1fff) << 16) | ((m[4] >> 2) & 0x1fff));
980 vpp_reg_write(VPP1_MATRIX_COEF02_10,
981 (((m[5] >> 2) & 0x1fff) << 16) | ((m[6] >> 2) & 0x1fff));
982 vpp_reg_write(VPP1_MATRIX_COEF11_12,
983 (((m[7] >> 2) & 0x1fff) << 16) | ((m[8] >> 2) & 0x1fff));
984 vpp_reg_write(VPP1_MATRIX_COEF20_21,
985 (((m[9] >> 2) & 0x1fff) << 16) | ((m[10] >> 2) & 0x1fff));
986 vpp_reg_write(VPP1_MATRIX_COEF22,
987 (m[11] >> 2) & 0x1fff);
988
989 vpp_reg_write(VPP1_MATRIX_OFFSET0_1,
990 (((m[18] >> 2) & 0xfff) << 16) | ((m[19] >> 2) & 0xfff));
991 vpp_reg_write(VPP1_MATRIX_OFFSET2,
992 (m[20] >> 2) & 0xfff);
993
994 vpp_reg_setb(VPP1_MATRIX_EN_CTRL, 1, 0, 1);
995 } else if (vpp_top == 2) {
996 vpp_reg_write(VPP2_MATRIX_PRE_OFFSET0_1,
997 (((m[0] >> 2) & 0xfff) << 16) | ((m[1] >> 2) & 0xfff));
998 vpp_reg_write(VPP2_MATRIX_PRE_OFFSET2,
999 (m[2] >> 2) & 0xfff);
1000 vpp_reg_write(VPP2_MATRIX_COEF00_01,
1001 (((m[3] >> 2) & 0x1fff) << 16) | ((m[4] >> 2) & 0x1fff));
1002 vpp_reg_write(VPP2_MATRIX_COEF02_10,
1003 (((m[5] >> 2) & 0x1fff) << 16) | ((m[6] >> 2) & 0x1fff));
1004 vpp_reg_write(VPP2_MATRIX_COEF11_12,
1005 (((m[7] >> 2) & 0x1fff) << 16) | ((m[8] >> 2) & 0x1fff));
1006 vpp_reg_write(VPP2_MATRIX_COEF20_21,
1007 (((m[9] >> 2) & 0x1fff) << 16) | ((m[10] >> 2) & 0x1fff));
1008 vpp_reg_write(VPP2_MATRIX_COEF22,
1009 (m[11] >> 2) & 0x1fff);
1010
1011 vpp_reg_write(VPP2_MATRIX_OFFSET0_1,
1012 (((m[18] >> 2) & 0xfff) << 16) | ((m[19] >> 2) & 0xfff));
1013 vpp_reg_write(VPP2_MATRIX_OFFSET2,
1014 (m[20] >> 2) & 0xfff);
1015
1016 vpp_reg_setb(VPP2_MATRIX_EN_CTRL, 1, 0, 1);
1017 }
1018
1019}
1020static void vpp_set_matrix_ycbcr2rgb(int vd1_or_vd2_or_post, int mode)
1021{
1022 //VPP_PR("%s: %d, %d\n", __func__, vd1_or_vd2_or_post, mode);
1023
1024 if (is_osd_high_version()) {
1025 /* vpp top0 */
1026 vpp_top_post2_matrix_yuv2rgb(0);
1027 VPP_PR("g12a/b post2(bit12) matrix: YUV limit -> RGB ..............\n");
1028 return;
1029 }
1030#ifndef AML_S5_DISPLAY
1031 if (vd1_or_vd2_or_post == 0) { //vd1
1032 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 5, 1);
1033 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 8, 3);
1034 } else if (vd1_or_vd2_or_post == 1) { //vd2
1035 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 4, 1);
1036 vpp_reg_setb(VPP_MATRIX_CTRL, 2, 8, 3);
1037 } else if (vd1_or_vd2_or_post == 3) { //osd
1038 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 7, 1);
1039 vpp_reg_setb(VPP_MATRIX_CTRL, 4, 8, 3);
1040 } else if (vd1_or_vd2_or_post == 4) { //xvycc
1041 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 6, 1);
1042 vpp_reg_setb(VPP_MATRIX_CTRL, 3, 8, 3);
1043 } else {
1044 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 0, 1);
1045 vpp_reg_setb(VPP_MATRIX_CTRL, 0, 8, 3);
1046 if (mode == 0)
1047 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 1, 2);
1048 else if (mode == 1)
1049 vpp_reg_setb(VPP_MATRIX_CTRL, 0, 1, 2);
1050 }
1051
1052 if (mode == 0) { /* 601 limit to RGB */
1053 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1, 0x0064C8FF);
1054 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2, 0x006400C8);
1055 //1.164 0 1.596
1056 //1.164 -0.392 -0.813
1057 //1.164 2.017 0
1058 vpp_reg_write(VPP_MATRIX_COEF00_01, 0x04A80000);
1059 vpp_reg_write(VPP_MATRIX_COEF02_10, 0x066204A8);
1060 vpp_reg_write(VPP_MATRIX_COEF11_12, 0x1e701cbf);
1061 vpp_reg_write(VPP_MATRIX_COEF20_21, 0x04A80812);
1062 vpp_reg_write(VPP_MATRIX_COEF22, 0x00000000);
1063 vpp_reg_write(VPP_MATRIX_OFFSET0_1, 0x00000000);
1064 vpp_reg_write(VPP_MATRIX_OFFSET2, 0x00000000);
1065 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1, 0x0FC00E00);
1066 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2, 0x00000E00);
1067 } else if (mode == 1) { /* 601 limit to RGB */
1068 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1, 0x0000E00);
1069 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2, 0x0E00);
1070 // 1 0 1.402
1071 // 1 -0.34414 -0.71414
1072 // 1 1.772 0
1073 vpp_reg_write(VPP_MATRIX_COEF00_01, (0x400 << 16) |0);
1074 vpp_reg_write(VPP_MATRIX_COEF02_10, (0x59c << 16) |0x400);
1075 vpp_reg_write(VPP_MATRIX_COEF11_12, (0x1ea0 << 16) |0x1d24);
1076 vpp_reg_write(VPP_MATRIX_COEF20_21, (0x400 << 16) |0x718);
1077 vpp_reg_write(VPP_MATRIX_COEF22, 0x0);
1078 vpp_reg_write(VPP_MATRIX_OFFSET0_1, 0x0);
1079 vpp_reg_write(VPP_MATRIX_OFFSET2, 0x0);
1080 } else if (mode == 2) { /* 709F to RGB */
1081 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1, 0x0000E00);
1082 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2, 0x0E00);
1083 // 1 0 1.402
1084 // 1 -0.34414 -0.71414
1085 // 1 1.772 0
1086 vpp_reg_write(VPP_MATRIX_COEF00_01, 0x04000000);
1087 vpp_reg_write(VPP_MATRIX_COEF02_10, 0x064D0400);
1088 vpp_reg_write(VPP_MATRIX_COEF11_12, 0x1F411E21);
1089 vpp_reg_write(VPP_MATRIX_COEF20_21, 0x0400076D);
1090 vpp_reg_write(VPP_MATRIX_COEF22, 0x0);
1091 vpp_reg_write(VPP_MATRIX_OFFSET0_1, 0x0);
1092 vpp_reg_write(VPP_MATRIX_OFFSET2, 0x0);
1093 } else if (mode == 3) { /* 709L to RGB */
1094 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1, 0x0FC00E00);
1095 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2, 0x00000E00);
1096 /* ycbcr limit range, 709 to RGB */
1097 /* -16 1.164 0 1.793 0 */
1098 /* -128 1.164 -0.213 -0.534 0 */
1099 /* -128 1.164 2.115 0 0 */
1100 vpp_reg_write(VPP_MATRIX_COEF00_01, 0x04A80000);
1101 vpp_reg_write(VPP_MATRIX_COEF02_10, 0x072C04A8);
1102 vpp_reg_write(VPP_MATRIX_COEF11_12, 0x1F261DDD);
1103 vpp_reg_write(VPP_MATRIX_COEF20_21, 0x04A80876);
1104 vpp_reg_write(VPP_MATRIX_COEF22, 0x0);
1105 vpp_reg_write(VPP_MATRIX_OFFSET0_1, 0x0);
1106 vpp_reg_write(VPP_MATRIX_OFFSET2, 0x0);
1107 }
1108 vpp_reg_setb(VPP_MATRIX_CLIP, 0, 5, 3);
1109#endif
1110}
1111
1112void set_vpp_matrix(int m_select, int *s, int on)
1113{
1114#ifndef AML_S5_DISPLAY
1115 int *m = NULL;
1116 int size = 0;
1117 int i;
1118
1119 pr_info("set_vpp_matrix m_select = %d on = %d\n",m_select,on);
1120
1121 if (m_select == VPP_MATRIX_OSD) {
1122 m = osd_matrix_coeff;
1123 size = MATRIX_5x3_COEF_SIZE;
1124 } else if (m_select == VPP_MATRIX_POST) {
1125 m = post_matrix_coeff;
1126 size = MATRIX_5x3_COEF_SIZE;
1127 } else if (m_select == VPP_MATRIX_VD1) {
1128 m = vd1_matrix_coeff;
1129 size = MATRIX_5x3_COEF_SIZE;
1130 } else if (m_select == VPP_MATRIX_VD2) {
1131 m = vd2_matrix_coeff;
1132 size = MATRIX_5x3_COEF_SIZE;
1133 } else if (m_select == VPP_MATRIX_XVYCC) {
1134 m = xvycc_matrix_coeff;
1135 size = MATRIX_5x3_COEF_SIZE;
1136 } else if (m_select == VPP_MATRIX_EOTF) {
1137 m = video_eotf_coeff;
1138 size = EOTF_COEFF_SIZE;
1139 } else if (m_select == VPP_MATRIX_OSD_EOTF) {
1140 m = osd_eotf_coeff;
1141 size = EOTF_COEFF_SIZE;
1142 } else
1143 return;
1144
1145 if (s)
1146 for (i = 0; i < size; i++)
1147 m[i] = s[i];
1148
1149 if (m_select == VPP_MATRIX_OSD) {
1150 /* osd matrix, VPP_MATRIX_0 */
1151 vpp_reg_write(VIU_OSD1_MATRIX_PRE_OFFSET0_1,
1152 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1153 vpp_reg_write(VIU_OSD1_MATRIX_PRE_OFFSET2,
1154 m[2] & 0xfff);
1155 vpp_reg_write(VIU_OSD1_MATRIX_COEF00_01,
1156 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1157 vpp_reg_write(VIU_OSD1_MATRIX_COEF02_10,
1158 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1159 vpp_reg_write(VIU_OSD1_MATRIX_COEF11_12,
1160 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1161 vpp_reg_write(VIU_OSD1_MATRIX_COEF20_21,
1162 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1163 if (m[21]) {
1164 vpp_reg_write(VIU_OSD1_MATRIX_COEF22_30,
1165 ((m[11] & 0x1fff) << 16) | (m[12] & 0x1fff));
1166 vpp_reg_write(VIU_OSD1_MATRIX_COEF31_32,
1167 ((m[13] & 0x1fff) << 16) | (m[14] & 0x1fff));
1168 vpp_reg_write(VIU_OSD1_MATRIX_COEF40_41,
1169 ((m[15] & 0x1fff) << 16) | (m[16] & 0x1fff));
1170 vpp_reg_write(VIU_OSD1_MATRIX_COLMOD_COEF42,
1171 m[17] & 0x1fff);
1172 } else {
1173 vpp_reg_write(VIU_OSD1_MATRIX_COEF22_30,
1174 (m[11] & 0x1fff) << 16);
1175 }
1176 vpp_reg_write(VIU_OSD1_MATRIX_OFFSET0_1,
1177 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1178 vpp_reg_write(VIU_OSD1_MATRIX_OFFSET2,
1179 m[20] & 0xfff);
1180 vpp_reg_setb(VIU_OSD1_MATRIX_COLMOD_COEF42,
1181 m[21], 30, 2);
1182 vpp_reg_setb(VIU_OSD1_MATRIX_COLMOD_COEF42,
1183 m[22], 16, 3);
1184 /* 23 reserved for clipping control */
1185 vpp_reg_setb(VIU_OSD1_MATRIX_CTRL, on, 0, 1);
1186 vpp_reg_setb(VIU_OSD1_MATRIX_CTRL, 0, 1, 1);
1187 } else if (m_select == VPP_MATRIX_EOTF) {
1188 /* eotf matrix, VPP_MATRIX_EOTF */
1189 for (i = 0; i < 5; i++)
1190 vpp_reg_write(VIU_EOTF_CTL + i + 1,
1191 ((m[i * 2] & 0x1fff) << 16)
1192 | (m[i * 2 + 1] & 0x1fff));
1193
1194 vpp_reg_setb(VIU_EOTF_CTL, on, 30, 1);
1195 vpp_reg_setb(VIU_EOTF_CTL, on, 31, 1);
1196 } else if (m_select == VPP_MATRIX_OSD_EOTF) {
1197 /* osd eotf matrix, VPP_MATRIX_OSD_EOTF */
1198 for (i = 0; i < 5; i++)
1199 vpp_reg_write(VIU_OSD1_EOTF_CTL + i + 1,
1200 ((m[i * 2] & 0x1fff) << 16)
1201 | (m[i * 2 + 1] & 0x1fff));
1202
1203 vpp_reg_setb(VIU_OSD1_EOTF_CTL, on, 30, 1);
1204 vpp_reg_setb(VIU_OSD1_EOTF_CTL, on, 31, 1);
1205 } else {
1206 /* vd1 matrix, VPP_MATRIX_1 */
1207 /* post matrix, VPP_MATRIX_2 */
1208 /* xvycc matrix, VPP_MATRIX_3 */
1209 /* vd2 matrix, VPP_MATRIX_6 */
1210 if (m_select == VPP_MATRIX_POST) {
1211 /* post matrix */
1212 m = post_matrix_coeff;
1213 vpp_reg_setb(VPP_MATRIX_CTRL, on, 0, 1);
1214 vpp_reg_setb(VPP_MATRIX_CTRL, 0, 8, 3);
1215 } else if (m_select == VPP_MATRIX_VD1) {
1216 /* vd1 matrix */
1217 m = vd1_matrix_coeff;
1218 vpp_reg_setb(VPP_MATRIX_CTRL, on, 5, 1);
1219 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 8, 3);
1220 } else if (m_select == VPP_MATRIX_VD2) {
1221 /* vd2 matrix */
1222 m = vd2_matrix_coeff;
1223 vpp_reg_setb(VPP_MATRIX_CTRL, on, 4, 1);
1224 vpp_reg_setb(VPP_MATRIX_CTRL, 2, 8, 3);
1225 } else if (m_select == VPP_MATRIX_XVYCC) {
1226 /* xvycc matrix */
1227 m = xvycc_matrix_coeff;
1228 vpp_reg_setb(VPP_MATRIX_CTRL, on, 6, 1);
1229 vpp_reg_setb(VPP_MATRIX_CTRL, 3, 8, 3);
1230 }
1231 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1,
1232 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1233 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2,
1234 m[2] & 0xfff);
1235 vpp_reg_write(VPP_MATRIX_COEF00_01,
1236 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1237 vpp_reg_write(VPP_MATRIX_COEF02_10,
1238 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1239 vpp_reg_write(VPP_MATRIX_COEF11_12,
1240 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1241 vpp_reg_write(VPP_MATRIX_COEF20_21,
1242 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1243 vpp_reg_write(VPP_MATRIX_COEF22,
1244 m[11] & 0x1fff);
1245 if (m[21]) {
1246 vpp_reg_write(VPP_MATRIX_COEF13_14,
1247 ((m[12] & 0x1fff) << 16) | (m[13] & 0x1fff));
1248 vpp_reg_write(VPP_MATRIX_COEF15_25,
1249 ((m[14] & 0x1fff) << 16) | (m[17] & 0x1fff));
1250 vpp_reg_write(VPP_MATRIX_COEF23_24,
1251 ((m[15] & 0x1fff) << 16) | (m[16] & 0x1fff));
1252 }
1253 vpp_reg_write(VPP_MATRIX_OFFSET0_1,
1254 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1255 vpp_reg_write(VPP_MATRIX_OFFSET2,
1256 m[20] & 0xfff);
1257 vpp_reg_setb(VPP_MATRIX_CLIP,
1258 m[21], 3, 2);
1259 vpp_reg_setb(VPP_MATRIX_CLIP,
1260 m[22], 5, 3);
1261 }
1262#endif
1263}
1264
1265const char lut_name[4][16] = {
1266 "OSD_EOTF",
1267 "OSD_OETF",
1268 "EOTF",
1269 "OETF",
1270};
1271
1272#ifndef AML_S5_DISPLAY
1273void set_vpp_lut(
1274 enum vpp_lut_sel_e lut_sel,
1275 unsigned int *r,
1276 unsigned int *g,
1277 unsigned int *b,
1278 int on)
1279{
1280 unsigned int *r_map = NULL;
1281 unsigned int *g_map = NULL;
1282 unsigned int *b_map = NULL;
1283 unsigned int addr_port;
1284 unsigned int data_port;
1285 unsigned int ctrl_port;
1286 int i;
1287
1288 if (lut_sel == VPP_LUT_OSD_EOTF) {
1289 r_map = osd_eotf_r_mapping;
1290 g_map = osd_eotf_g_mapping;
1291 b_map = osd_eotf_b_mapping;
1292 addr_port = VIU_OSD1_EOTF_LUT_ADDR_PORT;
1293 data_port = VIU_OSD1_EOTF_LUT_DATA_PORT;
1294 ctrl_port = VIU_OSD1_EOTF_CTL;
1295 } else if (lut_sel == VPP_LUT_EOTF) {
1296 r_map = video_eotf_r_mapping;
1297 g_map = video_eotf_g_mapping;
1298 b_map = video_eotf_b_mapping;
1299 addr_port = VIU_EOTF_LUT_ADDR_PORT;
1300 data_port = VIU_EOTF_LUT_DATA_PORT;
1301 ctrl_port = VIU_EOTF_CTL;
1302 } else if (lut_sel == VPP_LUT_OSD_OETF) {
1303 r_map = osd_oetf_r_mapping;
1304 g_map = osd_oetf_g_mapping;
1305 b_map = osd_oetf_b_mapping;
1306 addr_port = VIU_OSD1_OETF_LUT_ADDR_PORT;
1307 data_port = VIU_OSD1_OETF_LUT_DATA_PORT;
1308 ctrl_port = VIU_OSD1_OETF_CTL;
1309 } else if (lut_sel == VPP_LUT_OETF) {
1310#if 0
1311 load_knee_lut(on);
1312 return;
1313#else
1314 r_map = video_oetf_r_mapping;
1315 g_map = video_oetf_g_mapping;
1316 b_map = video_oetf_b_mapping;
1317 addr_port = XVYCC_LUT_R_ADDR_PORT;
1318 data_port = XVYCC_LUT_R_DATA_PORT;
1319 ctrl_port = XVYCC_LUT_CTL;
1320#endif
1321 } else
1322 return;
1323
1324 if (lut_sel == VPP_LUT_OSD_OETF) {
1325 if (r && r_map)
1326 for (i = 0; i < OSD_OETF_LUT_SIZE; i++)
1327 r_map[i] = r[i];
1328 if (g && g_map)
1329 for (i = 0; i < OSD_OETF_LUT_SIZE; i++)
1330 g_map[i] = g[i];
1331 if (r && r_map)
1332 for (i = 0; i < OSD_OETF_LUT_SIZE; i++)
1333 b_map[i] = b[i];
1334 vpp_reg_write(addr_port, 0);
1335 for (i = 0; i < 20; i++)
1336 vpp_reg_write(data_port,
1337 r_map[i * 2]
1338 | (r_map[i * 2 + 1] << 16));
1339 vpp_reg_write(data_port,
1340 r_map[OSD_OETF_LUT_SIZE - 1]
1341 | (g_map[0] << 16));
1342 for (i = 0; i < 20; i++)
1343 vpp_reg_write(data_port,
1344 g_map[i * 2 + 1]
1345 | (g_map[i * 2 + 2] << 16));
1346 for (i = 0; i < 20; i++)
1347 vpp_reg_write(data_port,
1348 b_map[i * 2]
1349 | (b_map[i * 2 + 1] << 16));
1350 vpp_reg_write(data_port,
1351 b_map[OSD_OETF_LUT_SIZE - 1]);
1352 if (on)
1353 vpp_reg_setb(ctrl_port, 7, 29, 3);
1354 else
1355 vpp_reg_setb(ctrl_port, 0, 29, 3);
1356 } else if ((lut_sel == VPP_LUT_OSD_EOTF) || (lut_sel == VPP_LUT_EOTF)) {
1357 if (r && r_map)
1358 for (i = 0; i < EOTF_LUT_SIZE; i++)
1359 r_map[i] = r[i];
1360 if (g && g_map)
1361 for (i = 0; i < EOTF_LUT_SIZE; i++)
1362 g_map[i] = g[i];
1363 if (r && r_map)
1364 for (i = 0; i < EOTF_LUT_SIZE; i++)
1365 b_map[i] = b[i];
1366 vpp_reg_write(addr_port, 0);
1367 for (i = 0; i < 16; i++)
1368 vpp_reg_write(data_port,
1369 r_map[i * 2]
1370 | (r_map[i * 2 + 1] << 16));
1371 vpp_reg_write(data_port,
1372 r_map[EOTF_LUT_SIZE - 1]
1373 | (g_map[0] << 16));
1374 for (i = 0; i < 16; i++)
1375 vpp_reg_write(data_port,
1376 g_map[i * 2 + 1]
1377 | (g_map[i * 2 + 2] << 16));
1378 for (i = 0; i < 16; i++)
1379 vpp_reg_write(data_port,
1380 b_map[i * 2]
1381 | (b_map[i * 2 + 1] << 16));
1382 vpp_reg_write(data_port, b_map[EOTF_LUT_SIZE - 1]);
1383 if (on)
1384 vpp_reg_setb(ctrl_port, 7, 27, 3);
1385 else
1386 vpp_reg_setb(ctrl_port, 0, 27, 3);
1387 vpp_reg_setb(ctrl_port, 1, 31, 1);
1388 } else if (lut_sel == VPP_LUT_OETF) {
1389 if (r && r_map)
1390 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1391 r_map[i] = r[i];
1392 if (g && g_map)
1393 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1394 g_map[i] = g[i];
1395 if (r && r_map)
1396 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1397 b_map[i] = b[i];
1398 vpp_reg_write(ctrl_port, 0x0);
1399 vpp_reg_write(addr_port, 0);
1400 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1401 vpp_reg_write(data_port, r_map[i]);
1402 vpp_reg_write(addr_port + 2, 0);
1403 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1404 vpp_reg_write(data_port + 2, g_map[i]);
1405 vpp_reg_write(addr_port + 4, 0);
1406 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1407 vpp_reg_write(data_port + 4, b_map[i]);
1408 if (on)
1409 vpp_reg_write(ctrl_port, 0x7f);
1410 else
1411 vpp_reg_write(ctrl_port, 0x0);
1412 }
1413}
1414#endif
1415
1416 /*
1417for G12A, set osd2 matrix(10bit) RGB2YUV
1418 */
1419 #ifndef AML_S5_DISPLAY
1420 static void set_osd1_rgb2yuv(bool on)
1421 {
1422 int *m = NULL;
hai.cao8b0d0bc2023-06-14 14:08:57 +08001423 u32 chip_id = get_cpu_id().family_id;
hai.cao8c827c02023-02-28 11:12:05 +08001424
1425 if (is_osd_high_version()) {
1426 /* RGB -> 709 limit */
1427 m = RGB709_to_YUV709l_coeff;
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00001428 if (chip_id != MESON_CPU_MAJOR_ID_S1A &&
1429 chip_id != MESON_CPU_MAJOR_ID_TXHD2) {
hai.cao8b0d0bc2023-06-14 14:08:57 +08001430 /* VPP WRAP OSD1 matrix */
1431 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_PRE_OFFSET0_1,
1432 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1433 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_PRE_OFFSET2,
1434 m[2] & 0xfff);
1435 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_COEF00_01,
1436 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1437 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_COEF02_10,
1438 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1439 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_COEF11_12,
1440 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1441 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_COEF20_21,
1442 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1443 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_COEF22,
1444 m[11] & 0x1fff);
hai.cao8c827c02023-02-28 11:12:05 +08001445
hai.cao8b0d0bc2023-06-14 14:08:57 +08001446 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_OFFSET0_1,
1447 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1448 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_OFFSET2,
1449 m[20] & 0xfff);
hai.cao8c827c02023-02-28 11:12:05 +08001450
hai.cao8b0d0bc2023-06-14 14:08:57 +08001451 vpp_reg_setb(VPP_WRAP_OSD1_MATRIX_EN_CTRL, on, 0, 1);
1452 } else {
1453 vpp_reg_write(VPP_OSD1_MATRIX_PRE_OFFSET0_1,
1454 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1455 vpp_reg_write(VPP_OSD1_MATRIX_PRE_OFFSET2,
1456 m[2] & 0xfff);
1457 vpp_reg_write(VPP_OSD1_MATRIX_COEF00_01,
1458 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1459 vpp_reg_write(VPP_OSD1_MATRIX_COEF02_10,
1460 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1461 vpp_reg_write(VPP_OSD1_MATRIX_COEF11_12,
1462 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1463 vpp_reg_write(VPP_OSD1_MATRIX_COEF20_21,
1464 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1465 vpp_reg_write(VPP_OSD1_MATRIX_COEF22,
1466 m[11] & 0x1fff);
1467 vpp_reg_write(VPP_OSD1_MATRIX_OFFSET0_1,
1468 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1469 vpp_reg_write(VPP_OSD1_MATRIX_OFFSET2,
1470 m[20] & 0xfff);
1471 vpp_reg_setb(VPP_OSD1_MATRIX_EN_CTRL, on, 0, 1);
hai.cao8b0d0bc2023-06-14 14:08:57 +08001472 }
hai.cao8c827c02023-02-28 11:12:05 +08001473 VPP_PR("%s rgb2yuv on = %d..............\n", __func__, on);
1474 } else {
1475 vpp_reg_setb(VIU_OSD1_BLK0_CFG_W0, 0, 7, 1);
1476 /* eotf lut bypass */
1477 set_vpp_lut(VPP_LUT_OSD_EOTF,
1478 eotf_33_linear_mapping, /* R */
1479 eotf_33_linear_mapping, /* G */
1480 eotf_33_linear_mapping, /* B */
1481 CSC_OFF);
1482 /* eotf matrix bypass */
1483 set_vpp_matrix(VPP_MATRIX_OSD_EOTF,
1484 eotf_bypass_coeff,
1485 CSC_OFF);
1486 /* oetf lut bypass */
1487 set_vpp_lut(VPP_LUT_OSD_OETF,
1488 oetf_41_linear_mapping, /* R */
1489 oetf_41_linear_mapping, /* G */
1490 oetf_41_linear_mapping, /* B */
1491 CSC_OFF);
1492 /* osd matrix RGB709 to YUV709 limit */
1493 set_vpp_matrix(VPP_MATRIX_OSD,
1494 RGB709_to_YUV709l_coeff,
1495 CSC_ON);
1496 }
1497 }
1498
1499 /*
1500for G12A, set osd2 matrix(10bit) RGB2YUV
1501 */
1502static void set_osd2_rgb2yuv(bool on)
1503{
1504 int *m = NULL;
1505
1506 if (is_osd_high_version()) {
1507 /* RGB -> 709 limit */
1508 m = RGB709_to_YUV709l_coeff;
1509
1510 /* VPP WRAP OSD2 matrix */
1511 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_PRE_OFFSET0_1,
1512 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1513 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_PRE_OFFSET2,
1514 m[2] & 0xfff);
1515 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_COEF00_01,
1516 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1517 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_COEF02_10,
1518 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1519 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_COEF11_12,
1520 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1521 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_COEF20_21,
1522 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1523 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_COEF22,
1524 m[11] & 0x1fff);
1525
1526 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_OFFSET0_1,
1527 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1528 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_OFFSET2,
1529 m[20] & 0xfff);
1530
1531 vpp_reg_setb(VPP_WRAP_OSD2_MATRIX_EN_CTRL, on, 0, 1);
1532
1533 VPP_PR("%s rgb2yuv on = %d..............\n", __func__, on);
1534 }
1535}
1536
1537 /*
1538for G12A, set osd3 matrix(10bit) RGB2YUV
1539 */
1540static void set_osd3_rgb2yuv(bool on)
1541{
1542 int *m = NULL;
1543
1544 if (is_osd_high_version()) {
1545 /* RGB -> 709 limit */
1546 m = RGB709_to_YUV709l_coeff;
1547
1548 /* VPP WRAP OSD3 matrix */
1549 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_PRE_OFFSET0_1,
1550 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1551 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_PRE_OFFSET2,
1552 m[2] & 0xfff);
1553 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_COEF00_01,
1554 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1555 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_COEF02_10,
1556 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1557 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_COEF11_12,
1558 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1559 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_COEF20_21,
1560 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1561 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_COEF22,
1562 m[11] & 0x1fff);
1563
1564 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_OFFSET0_1,
1565 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1566 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_OFFSET2,
1567 m[20] & 0xfff);
1568
1569 vpp_reg_setb(VPP_WRAP_OSD3_MATRIX_EN_CTRL, on, 0, 1);
1570
1571 VPP_PR("%s rgb2yuv on = %d..............\n", __func__, on);
1572 }
1573}
1574
1575 /*
1576for T7, set osd4 matrix(10bit) RGB2YUV
1577 */
1578static void set_osd4_rgb2yuv(bool on)
1579{
1580 int *m = NULL;
1581
1582 if (is_osd_high_version()) {
1583 /* RGB -> 709 limit */
1584 m = RGB709_to_YUV709l_coeff;
1585
1586 /* VPP WRAP OSD3 matrix */
1587 vpp_reg_write(VIU_OSD4_MATRIX_PRE_OFFSET0_1,
1588 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1589 vpp_reg_write(VIU_OSD4_MATRIX_PRE_OFFSET2,
1590 m[2] & 0xfff);
1591 vpp_reg_write(VIU_OSD4_MATRIX_COEF00_01,
1592 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1593 vpp_reg_write(VIU_OSD4_MATRIX_COEF02_10,
1594 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1595 vpp_reg_write(VIU_OSD4_MATRIX_COEF11_12,
1596 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1597 vpp_reg_write(VIU_OSD4_MATRIX_COEF20_21,
1598 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1599 vpp_reg_write(VIU_OSD4_MATRIX_COEF22,
1600 m[11] & 0x1fff);
1601
1602 vpp_reg_write(VIU_OSD4_MATRIX_OFFSET0_1,
1603 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1604 vpp_reg_write(VIU_OSD4_MATRIX_OFFSET2,
1605 m[20] & 0xfff);
1606
1607 vpp_reg_setb(VIU_OSD4_MATRIX_EN_CTRL, on, 0, 1);
1608
1609 VPP_PR("T7 osd4 matrix rgb2yuv..............\n");
1610 }
1611}
1612#endif
1613
1614#ifndef AML_T7_DISPLAY
1615static void set_viu2_osd_matrix_rgb2yuv(bool on)
1616{
1617 int *m = RGB709_to_YUV709l_coeff;
1618
1619 /* RGB -> 709 limit */
1620 if (is_osd_high_version()) {
1621 /* VPP WRAP OSD3 matrix */
1622 vpp_reg_write(VIU2_OSD1_MATRIX_PRE_OFFSET0_1,
1623 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1624 vpp_reg_write(VIU2_OSD1_MATRIX_PRE_OFFSET2,
1625 m[2] & 0xfff);
1626 vpp_reg_write(VIU2_OSD1_MATRIX_COEF00_01,
1627 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1628 vpp_reg_write(VIU2_OSD1_MATRIX_COEF02_10,
1629 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1630 vpp_reg_write(VIU2_OSD1_MATRIX_COEF11_12,
1631 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1632 vpp_reg_write(VIU2_OSD1_MATRIX_COEF20_21,
1633 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1634 vpp_reg_write(VIU2_OSD1_MATRIX_COEF22,
1635 m[11] & 0x1fff);
1636
1637 vpp_reg_write(VIU2_OSD1_MATRIX_OFFSET0_1,
1638 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1639 vpp_reg_write(VIU2_OSD1_MATRIX_OFFSET2,
1640 m[20] & 0xfff);
1641
1642 vpp_reg_setb(VIU2_OSD1_MATRIX_EN_CTRL, on, 0, 1);
1643 }
1644}
1645#endif
1646
1647#ifndef AML_S5_DISPLAY
1648static void set_vpp_osd2_rgb2yuv(bool on)
1649{
1650 int *m = NULL;
1651
1652 /* RGB -> 709 limit */
1653 m = RGB709_to_YUV709l_coeff;
1654
1655 /* VPP WRAP OSD3 matrix */
1656 vpp_reg_write(VPP_OSD2_MATRIX_PRE_OFFSET0_1,
1657 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1658 vpp_reg_write(VPP_OSD2_MATRIX_PRE_OFFSET2,
1659 m[2] & 0xfff);
1660 vpp_reg_write(VPP_OSD2_MATRIX_COEF00_01,
1661 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1662 vpp_reg_write(VPP_OSD2_MATRIX_COEF02_10,
1663 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1664 vpp_reg_write(VPP_OSD2_MATRIX_COEF11_12,
1665 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1666 vpp_reg_write(VPP_OSD2_MATRIX_COEF20_21,
1667 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1668 vpp_reg_write(VPP_OSD2_MATRIX_COEF22,
1669 m[11] & 0x1fff);
1670 vpp_reg_write(VPP_OSD2_MATRIX_OFFSET0_1,
1671 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1672 vpp_reg_write(VPP_OSD2_MATRIX_OFFSET2,
1673 m[20] & 0xfff);
1674 vpp_reg_setb(VPP_OSD2_MATRIX_EN_CTRL, on, 0, 1);
1675 VPP_PR("vpp osd2 matrix rgb2yuv..............\n");
1676}
1677#endif
1678
1679/*
1680for txlx, set vpp default data path to u10
1681 */
1682static void set_vpp_bitdepth(void)
1683{
1684 u32 chip_id = get_cpu_id().family_id;
1685
1686 if (is_osd_high_version()) {
1687 /*after this step vd1 output data is U12,*/
1688 if (chip_id == MESON_CPU_MAJOR_ID_T7) {
1689 /* osd dolby bypass en */
1690 vpp_reg_setb(MALI_AFBCD_TOP_CTRL, 1, 14, 1);
1691 vpp_reg_setb(MALI_AFBCD_TOP_CTRL, 1, 19, 1);
1692 /* osd_din_ext 12bit */
1693 vpp_reg_setb(MALI_AFBCD_TOP_CTRL, 0, 15, 1);
1694 vpp_reg_setb(MALI_AFBCD_TOP_CTRL, 0, 20, 1);
1695
1696 vpp_reg_setb(MALI_AFBCD1_TOP_CTRL, 1, 19, 1);
1697 vpp_reg_setb(MALI_AFBCD1_TOP_CTRL, 0, 20, 1);
1698
1699 vpp_reg_setb(MALI_AFBCD2_TOP_CTRL, 1, 19, 1);
1700 vpp_reg_setb(MALI_AFBCD2_TOP_CTRL, 0, 20, 1);
1701 } else {
1702 vpp_reg_write(DOLBY_PATH_CTRL, 0xf);
1703 }
1704 }
1705}
1706
1707/* osd+video brightness */
1708static void video_adj2_brightness(int val)
1709{
1710 if (val < -255)
1711 val = -255;
1712 else if (val > 255)
1713 val = 255;
1714
1715 VPP_PR("brightness_post:%d\n", val);
1716
1717 vpp_reg_setb(VPP_VADJ2_Y, val << 1, 8, 10);
1718
1719#ifndef AML_S5_DISPLAY
1720 vpp_reg_setb(VPP_VADJ_CTRL, 1, 2, 1);
1721#endif
1722}
1723
1724/* osd+video contrast */
1725static void video_adj2_contrast(int val)
1726{
1727 if (val < -127)
1728 val = -127;
1729 else if (val > 127)
1730 val = 127;
1731
1732 VPP_PR("contrast_post:%d\n", val);
1733
1734 val += 0x80;
1735
1736 vpp_reg_setb(VPP_VADJ2_Y, val, 0, 8);
1737#ifndef AML_S5_DISPLAY
1738 vpp_reg_setb(VPP_VADJ_CTRL, 1, 2, 1);
1739#endif
1740}
1741
1742/* osd+video saturation/hue */
1743static void amvecm_saturation_hue_post(int sat, int hue)
1744{
1745 int hue_post; /*-25~25*/
1746 int saturation_post; /*-128~127*/
1747 int i, ma, mb, mab, mc, md;
1748 int hue_cos[] = {
1749 /*0~12*/
1750 256, 256, 256, 255, 255, 254, 253, 252, 251, 250,
1751 248, 247, 245, 243, 241, 239, 237, 234, 231, 229,
1752 226, 223, 220, 216, 213, 209 /*13~25*/
1753 };
1754 int hue_sin[] = {
1755 -147, -142, -137, -132, -126, -121, -115, -109, -104,
1756 -98, -92, -86, -80, /*-25~-13*/-74, -68, -62, -56,
1757 -50, -44, -38, -31, -25, -19, -13, -6, /*-12~-1*/
1758 0, /*0*/
1759 6, 13, 19, 25, 31, 38, 44, 50, 56,
1760 62, 68, 74, /*1~12*/ 80, 86, 92, 98, 104,
1761 109, 115, 121, 126, 132, 137, 142, 147 /*13~25*/
1762 };
1763
1764 if (sat < -128)
1765 sat = -128;
1766 else if (sat > 128)
1767 sat = 128;
1768
1769 if (hue < -25)
1770 hue = -25;
1771 else if (hue > 25)
1772 hue = 25;
1773
1774 VPP_PR("saturation sat_post:%d hue_post:%d\n", sat, hue);
1775
1776 saturation_post = sat;
1777 hue_post = hue;
1778 i = (hue_post > 0) ? hue_post : -hue_post;
1779 ma = (hue_cos[i]*(saturation_post + 128)) >> 7;
1780 mb = (hue_sin[25+hue_post]*(saturation_post + 128)) >> 7;
1781 if (ma > 511)
1782 ma = 511;
1783 if (ma < -512)
1784 ma = -512;
1785 if (mb > 511)
1786 mb = 511;
1787 if (mb < -512)
1788 mb = -512;
1789 mab = ((ma & 0x3ff) << 16) | (mb & 0x3ff);
1790
1791 vpp_reg_write(VPP_VADJ2_MA_MB, mab);
1792 mc = (s16)((mab<<22)>>22); /* mc = -mb */
1793 mc = 0 - mc;
1794 if (mc > 511)
1795 mc = 511;
1796 if (mc < -512)
1797 mc = -512;
1798 md = (s16)((mab<<6)>>22); /* md = ma; */
1799 mab = ((mc&0x3ff)<<16)|(md&0x3ff);
1800
1801 vpp_reg_write(VPP_VADJ2_MC_MD, mab);
1802#ifndef AML_S5_DISPLAY
1803 vpp_reg_setb(VPP_VADJ_CTRL, 1, 2, 1);
1804#endif
1805}
1806
1807/* init osd+video brightness/contrast/saturaion/hue */
1808void vpp_pq_init(int brightness, int contrast, int sat, int hue)
1809{
1810 video_adj2_brightness(brightness);
1811 video_adj2_contrast(contrast);
1812 amvecm_saturation_hue_post(sat, hue);
1813}
1814
1815void vpp_pq_load(void)
1816{
1817 int i = 0, cnt = 0;
1818 char const *pq = env_get("pq");
1819 char *tk, *str, *tmp[4];
1820 short val[4];
1821
1822 if (pq == NULL) {
1823 VPP_PR("%s pq val error !!!\n", __func__);
1824 return;
1825 }
1826
1827 str = strdup(pq);
1828
1829 for (tk = strsep(&str, ","); tk != NULL; tk = strsep(&str, ",")) {
1830 tmp[cnt] = tk;
1831
1832 if (++cnt > 3)
1833 break;
1834 }
1835
1836 if (cnt == 4) {
1837 for (i = 0; i < 4; i++) {
1838 val[i] = simple_strtol(tmp[i], NULL, 10);
1839 /* VPP_PR("pq[%d]: %d\n", i, val[i]); */
1840 }
1841 vpp_pq_init(val[0], val[1], val[2], val[3]);
1842 }
1843}
1844
1845void vpp_load_gamma_table(unsigned short *data, unsigned int len, enum vpp_gamma_sel_e flag)
1846{
1847 unsigned short *table = NULL;
1848 unsigned int i;
1849
1850 switch (flag) {
1851 case VPP_GAMMA_R:
1852 table = gamma_table_r;
1853 break;
1854 case VPP_GAMMA_G:
1855 table = gamma_table_g;
1856 break;
1857 case VPP_GAMMA_B:
1858 table = gamma_table_b;
1859 break;
1860 default:
1861 break;
1862 }
1863 if (table == NULL) {
1864 VPP_PR("error: %s: invalid flag: %d\n", __func__, flag);
1865 return;
1866 }
1867 if (len != GAMMA_SIZE) {
1868 VPP_PR("error: %s: invalid len: %d\n", __func__, len);
1869 return;
1870 }
1871
1872 for (i = 0; i < GAMMA_SIZE; i++)
1873 table[i] = data[i];
1874 VPP_PR("%s: successful\n", __func__);
1875}
1876
1877void vpp_enable_lcd_gamma_table(int index)
1878{
1879 unsigned int reg;
1880
1881 if (get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_T7) {
1882 switch (index) {
1883 case 1:
1884 reg = LCD_GAMMA_CNTL_PORT0 + 0x100;
1885 break;
1886 case 2:
1887 reg = LCD_GAMMA_CNTL_PORT0 + 0x200;
1888 break;
1889 case 0:
1890 default:
1891 reg = LCD_GAMMA_CNTL_PORT0;
1892 break;
1893 }
1894 } else {
1895 reg = L_GAMMA_CNTL_PORT;
1896 }
1897
1898 vpp_reg_setb(reg, 1, GAMMA_EN, 1);
1899}
1900
1901void vpp_disable_lcd_gamma_table(int index)
1902{
1903 unsigned int reg;
1904
1905 if (get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_T7) {
1906 switch (index) {
1907 case 1:
1908 reg = LCD_GAMMA_CNTL_PORT0 + 0x100;
1909 break;
1910 case 2:
1911 reg = LCD_GAMMA_CNTL_PORT0 + 0x200;
1912 break;
1913 case 0:
1914 default:
1915 reg = LCD_GAMMA_CNTL_PORT0;
1916 break;
1917 }
1918 } else {
1919 reg = L_GAMMA_CNTL_PORT;
1920 }
1921 vpp_reg_setb(reg, 0, GAMMA_EN, 1);
1922}
1923
1924#define GAMMA_RETRY 1000
1925static void vpp_set_lcd_gamma_table(int index, u16 *data, u32 rgb_mask)
1926{
1927 unsigned int reg_encl_en, reg_cntl_port, reg_data_port, reg_addr_port;
1928 int i;
1929 int cnt = 0;
1930
1931 if (get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_T7) {
1932 switch (index) {
1933 case 1:
1934 reg_encl_en = ENCL_VIDEO_EN + 0x600;
1935 reg_cntl_port = LCD_GAMMA_CNTL_PORT0 + 0x100;
1936 reg_data_port = LCD_GAMMA_DATA_PORT0 + 0x100;
1937 reg_addr_port = LCD_GAMMA_ADDR_PORT0 + 0x100;
1938 break;
1939 case 2:
1940 reg_encl_en = ENCL_VIDEO_EN + 0x800;
1941 reg_cntl_port = LCD_GAMMA_CNTL_PORT0 + 0x200;
1942 reg_data_port = LCD_GAMMA_DATA_PORT0 + 0x200;
1943 reg_addr_port = LCD_GAMMA_ADDR_PORT0 + 0x200;
1944 break;
1945 case 0:
1946 default:
1947 reg_encl_en = ENCL_VIDEO_EN;
1948 reg_cntl_port = LCD_GAMMA_CNTL_PORT0;
1949 reg_data_port = LCD_GAMMA_DATA_PORT0;
1950 reg_addr_port = LCD_GAMMA_ADDR_PORT0;
1951 break;
1952 }
1953 } else {
1954 reg_encl_en = ENCL_VIDEO_EN;
1955 reg_cntl_port = L_GAMMA_CNTL_PORT;
1956 reg_data_port = L_GAMMA_DATA_PORT;
1957 reg_addr_port = L_GAMMA_ADDR_PORT;
1958 }
1959
1960 if (get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_T7) {
1961 if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_T5M) {
1962 vpp_reg_write(reg_addr_port, (1 << 9));
1963 for (i = 0; i < 256; i++)
1964 vpp_reg_write(reg_data_port,
1965 (data[i] << 20) |
1966 (data[i] << 10) |
1967 (data[i] << 0));
1968 vpp_reg_write(reg_data_port,
1969 (0x3ff << 20) |
1970 (0x3ff << 10) |
1971 (0x3ff << 0));
1972 } else {
1973 vpp_reg_write(reg_addr_port, (1 << 8));
1974 for (i = 0; i < 256; i++)
1975 vpp_reg_write(reg_data_port,
1976 (data[i] << 20) |
1977 (data[i] << 10) |
1978 (data[i] << 0));
1979 }
1980 return;
1981 }
1982
1983 if (!(vpp_reg_read(reg_encl_en) & 0x1))
1984 return;
1985
1986 vpp_reg_setb(reg_cntl_port, 0, GAMMA_EN, 1);
1987
1988 while (!(vpp_reg_read(reg_cntl_port) & (0x1 << ADR_RDY))) {
1989 udelay(10);
1990 if (cnt++ > GAMMA_RETRY)
1991 break;
1992 }
1993 cnt = 0;
1994 vpp_reg_write(reg_addr_port, (0x1 << H_AUTO_INC) |
1995 (0x1 << rgb_mask) |
1996 (0x0 << HADR));
1997 for (i = 0; i < 256; i++) {
1998 while (!(vpp_reg_read(reg_cntl_port) & (0x1 << WR_RDY))) {
1999 udelay(10);
2000 if (cnt++ > GAMMA_RETRY)
2001 break;
2002 }
2003 cnt = 0;
2004 vpp_reg_write(reg_data_port, data[i]);
2005 }
2006 while (!(vpp_reg_read(reg_cntl_port) & (0x1 << ADR_RDY))) {
2007 udelay(10);
2008 if (cnt++ > GAMMA_RETRY)
2009 break;
2010 }
2011 vpp_reg_write(reg_addr_port, (0x1 << H_AUTO_INC) |
2012 (0x1 << rgb_mask) |
2013 (0x23 << HADR));
2014
2015}
2016
2017void vpp_init_lcd_gamma_table(int index)
2018{
2019 VPP_PR("%s\n", __func__);
2020
2021 vpp_disable_lcd_gamma_table(index);
2022
2023 vpp_set_lcd_gamma_table(index, gamma_table_r, H_SEL_R);
2024 vpp_set_lcd_gamma_table(index, gamma_table_g, H_SEL_G);
2025 vpp_set_lcd_gamma_table(index, gamma_table_b, H_SEL_B);
2026
2027 vpp_enable_lcd_gamma_table(index);
2028}
2029
2030void vpp_matrix_update(int type)
2031{
2032 if (vpp_init_flag == 0)
2033 return;
2034
2035 switch (type) {
2036 case VPP_CM_RGB:
2037 /* 709 limit to RGB */
2038 vpp_set_matrix_ycbcr2rgb(2, 3);
2039 break;
2040 case VPP_CM_YUV:
2041 break;
2042 default:
2043 break;
2044 }
2045}
2046
2047void vpp_viu2_matrix_update(int type)
2048{
2049 if (vpp_init_flag == 0)
2050 return;
2051
2052 if (get_cpu_id().family_id < MESON_CPU_MAJOR_ID_G12A)
2053 return;
2054
2055 switch (type) {
2056 case VPP_CM_RGB:
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002057 #if defined(AML_T7_DISPLAY)
hai.cao8c827c02023-02-28 11:12:05 +08002058 /* vpp_top1: yuv2rgb */
2059 vpp_top_post2_matrix_yuv2rgb(1);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002060 #elif defined(AML_S5_DISPLAY)
2061 /* vpp_top1: use vpp post csc to do yuv2rgb */
2062 #else
2063 /* default RGB */
2064 set_viu2_osd_matrix_rgb2yuv(0);
hai.cao8c827c02023-02-28 11:12:05 +08002065 #endif
2066 break;
2067 case VPP_CM_YUV:
2068 /* RGB to 709 limit */
2069 #ifndef AML_T7_DISPLAY
2070 set_viu2_osd_matrix_rgb2yuv(1);
2071 #endif
2072 break;
2073 default:
2074 break;
2075 }
2076}
2077
2078void vpp_viu3_matrix_update(int type)
2079{
2080 if (vpp_init_flag == 0)
2081 return;
2082
2083 if (get_cpu_id().family_id < MESON_CPU_MAJOR_ID_G12A)
2084 return;
2085
2086 switch (type) {
2087 case VPP_CM_RGB:
2088 /* default RGB */
2089 //#ifndef AML_T7_DISPLAY
2090 //set_viu_osd_matrix_rgb2yuv(0);
2091 //#else
2092 /* vpp_top2: yuv2rgb */
2093 vpp_top_post2_matrix_yuv2rgb(2);
2094 //#endif
2095 break;
2096 case VPP_CM_YUV:
2097 /* RGB to 709 limit */
2098 #ifndef AML_T7_DISPLAY
2099 //set_viu2_osd_matrix_rgb2yuv(2);
2100 #endif
2101 break;
2102 default:
2103 break;
2104 }
2105}
2106
2107static void vpp_ofifo_init(void)
2108{
2109 unsigned int data32;
2110
2111 data32 = vpp_reg_read(VPP_OFIFO_SIZE);
hai.cao12deab32023-08-07 14:38:48 +08002112 if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_S1A)
2113 data32 |= 0x7ff;
2114 else
2115 data32 |= 0xfff;
hai.cao8c827c02023-02-28 11:12:05 +08002116 vpp_reg_write(VPP_OFIFO_SIZE, data32);
2117
2118 data32 = 0x08080808;
2119#ifndef AML_S5_DISPLAY
2120 vpp_reg_write(VPP_HOLD_LINES, data32);
2121#endif
2122}
2123
2124#ifdef CONFIG_AML_HDMITX
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002125static void amvecm_cp_hdr_info(struct master_display_info_s *hdr_data,
2126 enum force_output_format output_format)
hai.cao8c827c02023-02-28 11:12:05 +08002127{
2128 int i, j;
2129
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002130 switch (output_format) {
2131 case BT2020_PQ:
2132 hdr_data->features =
2133 (0 << 30) /*sdr output 709*/
2134 | (1 << 29) /*video available*/
2135 | (5 << 26) /* unspecified */
2136 | (0 << 25) /* limit */
2137 | (1 << 24) /*color available*/
2138 | (9 << 16)
2139 | (16 << 8)
2140 | (10 << 0); /* bt2020c */
2141 break;
2142 case BT2020_HLG:
2143 hdr_data->features =
2144 (0 << 30) /*sdr output 709*/
2145 | (1 << 29) /*video available*/
2146 | (5 << 26) /* unspecified */
2147 | (0 << 25) /* limit */
2148 | (1 << 24) /*color available*/
2149 | (9 << 16)
2150 | (18 << 8)
2151 | (10 << 0);
2152 break;
2153 case UNKNOWN_FMT:
2154 return;
2155 }
hai.cao8c827c02023-02-28 11:12:05 +08002156
2157 for (i = 0; i < 3; i++)
2158 for (j = 0; j < 2; j++)
2159 hdr_data->primaries[i][j] =
2160 bt2020_primaries[i][j];
2161 hdr_data->white_point[0] = bt2020_white_point[0];
2162 hdr_data->white_point[1] = bt2020_white_point[1];
2163 /* default luminance */
2164 hdr_data->luminance[0] = 1000 * 10000;
2165 hdr_data->luminance[1] = 50;
2166
2167 /* content_light_level */
2168 hdr_data->max_content = 0;
2169 hdr_data->max_frame_average = 0;
2170 hdr_data->luminance[0] = hdr_data->luminance[0] / 10000;
2171 hdr_data->present_flag = 1;
2172}
2173#endif
2174
2175void hdr_tx_pkt_cb(void)
2176{
2177 int hdr_policy = 0;
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002178 int hdr_force_mode = 0; /*0: no force, 3: force hdr, 5: force hlg*/
hai.cao8c827c02023-02-28 11:12:05 +08002179#ifdef CONFIG_AML_HDMITX
2180 struct master_display_info_s hdr_data;
2181 struct hdr_info *hdrinfo = NULL;
2182#endif
2183 const char *hdr_policy_env = env_get("hdr_policy");
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002184 const char *hdr_force_mode_env = env_get("hdr_force_mode");
hai.cao8c827c02023-02-28 11:12:05 +08002185
2186 if (!hdr_policy_env)
2187 return;
2188
Huijuan Xiaoc3788dd2024-03-25 11:50:38 +00002189 if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_S1A)
2190 return;
2191
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002192 if (hdr_force_mode_env)
2193 hdr_force_mode = simple_strtoul(hdr_force_mode_env, NULL, 10);
qinghui.jiang3406ce52023-08-16 10:40:39 +00002194
hai.cao8c827c02023-02-28 11:12:05 +08002195 hdr_policy = simple_strtoul(hdr_policy_env, NULL, 10);
2196#ifdef CONFIG_AML_HDMITX
2197 hdrinfo = hdmitx_get_rx_hdr_info();
2198
xiang.wu114497ab2024-02-21 14:57:05 +08002199 if ((hdrinfo && (hdrinfo->hdr_support & HDR_SUP_EOTF_SMPTE_ST_2084)) &&
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002200 (hdr_policy == 0 || hdr_policy == 3)) {
lizhi.hu506ddfa2024-07-10 21:35:41 +08002201 if ((vout_connector_check(0) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI) {
hai.cao8c827c02023-02-28 11:12:05 +08002202 hdr_func(OSD1_HDR, SDR_HDR);
2203 hdr_func(OSD2_HDR, SDR_HDR);
2204 hdr_func(VD1_HDR, SDR_HDR);
2205 }
lizhi.hu506ddfa2024-07-10 21:35:41 +08002206 if ((vout_connector_check(1) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI)
hai.cao8c827c02023-02-28 11:12:05 +08002207 hdr_func(OSD3_HDR, SDR_HDR);
lizhi.hu506ddfa2024-07-10 21:35:41 +08002208 if ((vout_connector_check(2) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI)
hai.cao8c827c02023-02-28 11:12:05 +08002209 hdr_func(OSD4_HDR, SDR_HDR);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002210 amvecm_cp_hdr_info(&hdr_data, BT2020_PQ);
2211 hdmitx_set_drm_pkt(&hdr_data);
Huijuan Xiaof97ae152024-04-02 02:13:05 +00002212 } else if ((hdrinfo && (hdrinfo->hdr_support & HDR_SUP_EOTF_HLG)) &&
2213 (hdr_policy == 0 || hdr_policy == 3)) {
lizhi.hu506ddfa2024-07-10 21:35:41 +08002214 if ((vout_connector_check(0) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI) {
Huijuan Xiaof97ae152024-04-02 02:13:05 +00002215 hdr_func(OSD1_HDR, SDR_HLG);
2216 hdr_func(OSD2_HDR, SDR_HLG);
2217 hdr_func(VD1_HDR, SDR_HLG);
2218 }
lizhi.hu506ddfa2024-07-10 21:35:41 +08002219 if ((vout_connector_check(1) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI)
Huijuan Xiaof97ae152024-04-02 02:13:05 +00002220 hdr_func(OSD3_HDR, SDR_HLG);
lizhi.hu506ddfa2024-07-10 21:35:41 +08002221 if ((vout_connector_check(2) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI)
Huijuan Xiaof97ae152024-04-02 02:13:05 +00002222 hdr_func(OSD4_HDR, SDR_HLG);
2223 amvecm_cp_hdr_info(&hdr_data, BT2020_HLG);
2224 hdmitx_set_drm_pkt(&hdr_data);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002225 }
2226
2227 if ((hdrinfo && (hdrinfo->hdr_support & HDR_SUP_EOTF_SMPTE_ST_2084)) &&
2228 hdr_policy == 4 && hdr_force_mode == 3) {
lizhi.hu506ddfa2024-07-10 21:35:41 +08002229 if ((vout_connector_check(0) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI) {
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002230 hdr_func(OSD1_HDR, SDR_HDR);
2231 hdr_func(OSD2_HDR, SDR_HDR);
2232 hdr_func(VD1_HDR, SDR_HDR);
2233 }
lizhi.hu506ddfa2024-07-10 21:35:41 +08002234 if ((vout_connector_check(1) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI)
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002235 hdr_func(OSD3_HDR, SDR_HDR);
lizhi.hu506ddfa2024-07-10 21:35:41 +08002236 if ((vout_connector_check(2) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI)
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002237 hdr_func(OSD4_HDR, SDR_HDR);
2238 amvecm_cp_hdr_info(&hdr_data, BT2020_PQ);
2239 hdmitx_set_drm_pkt(&hdr_data);
2240 }
2241
2242 if ((hdrinfo && (hdrinfo->hdr_support & HDR_SUP_EOTF_HLG)) &&
2243 hdr_policy == 4 && hdr_force_mode == 5) {
lizhi.hu506ddfa2024-07-10 21:35:41 +08002244 if ((vout_connector_check(0) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI) {
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002245 hdr_func(OSD1_HDR, SDR_HLG);
2246 hdr_func(OSD2_HDR, SDR_HLG);
2247 hdr_func(VD1_HDR, SDR_HLG);
2248 }
lizhi.hu506ddfa2024-07-10 21:35:41 +08002249 if ((vout_connector_check(1) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI)
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002250 hdr_func(OSD3_HDR, SDR_HLG);
lizhi.hu506ddfa2024-07-10 21:35:41 +08002251 if ((vout_connector_check(2) & CONNECTOR_DEV_MASK) == CONNECTOR_DEV_HDMI)
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002252 hdr_func(OSD4_HDR, SDR_HLG);
2253 amvecm_cp_hdr_info(&hdr_data, BT2020_HLG);
hai.cao8c827c02023-02-28 11:12:05 +08002254 hdmitx_set_drm_pkt(&hdr_data);
2255 }
2256#endif
2257
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002258 VPP_PR("hdr_policy = %d, hdr_force_mode = %d\n",
2259 hdr_policy, hdr_force_mode);
hai.cao8c827c02023-02-28 11:12:05 +08002260#ifdef CONFIG_AML_HDMITX
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002261 if (hdrinfo) {
hai.cao8c827c02023-02-28 11:12:05 +08002262 VPP_PR("Rx hdr_info.hdr_sup_eotf_smpte_st_2084 = %d\n",
xiang.wu114497ab2024-02-21 14:57:05 +08002263 !!(hdrinfo->hdr_support & HDR_SUP_EOTF_SMPTE_ST_2084));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002264 VPP_PR("Rx hdr_info.hdr_sup_eotf_hlg = %d\n",
2265 !!(hdrinfo->hdr_support & HDR_SUP_EOTF_HLG));
2266 }
hai.cao8c827c02023-02-28 11:12:05 +08002267#endif
2268}
2269
2270static bool is_vpp_supported(int chip_id)
2271{
2272 if ((chip_id == MESON_CPU_MAJOR_ID_A1) ||
2273 (chip_id == MESON_CPU_MAJOR_ID_C1) ||
2274 (chip_id == MESON_CPU_MAJOR_ID_C2))
2275 return false;
2276 else
2277 return true;
2278}
2279
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002280static void vpp_wb_init_reg(void)
2281{
2282 int chip_id;
2283
2284 chip_id = vpp_get_chip_type();
2285
2286 if (chip_id != MESON_CPU_MAJOR_ID_T3X)
2287 return;
2288
2289 vpp_reg_write(0x2550, 0x84000400);
2290 vpp_reg_write(0x2650, 0x84000400);
2291
2292 /* vpp_reg_write(0x2550, 0xc4000400); */
2293 /* vpp_reg_write(0x2650, 0xc4000400); */
2294 vpp_reg_write(0x2551, 0x04000000);
2295 vpp_reg_write(0x2651, 0x04000000);
2296 vpp_reg_write(0x2552, 0x00000000);
2297 vpp_reg_write(0x2652, 0x00000000);
2298 vpp_reg_write(0x2553, 0x00000000);
2299 vpp_reg_write(0x2653, 0x00000000);
2300 vpp_reg_write(0x2554, 0x00000000);
2301 vpp_reg_write(0x2654, 0x00000000);
2302}
2303
hai.cao8c827c02023-02-28 11:12:05 +08002304void vpp_init(void)
2305{
2306 int chip_id;
2307
2308 chip_id = vpp_get_chip_type();
2309 VPP_PR("%s, chip_id=%d\n", __func__, chip_id);
2310 if (!is_vpp_supported(chip_id)) {
2311 VPP_PR("%s, vpp not supported\n", __func__);
2312 return;
2313 }
2314 vpp_init_flag = 1;
2315
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002316 if (chip_id == MESON_CPU_MAJOR_ID_T3X)
2317 vpp_wb_init_reg();
2318
hai.cao8c827c02023-02-28 11:12:05 +08002319 /* init vpu fifo control register */
2320 vpp_ofifo_init();
2321
2322#ifndef AML_S5_DISPLAY
2323 vpp_set_matrix_default_init();
2324#endif
2325
2326 if (is_osd_high_version()) {
2327 /* >= g12a: osd out is rgb */
2328#ifndef AML_S5_DISPLAY
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002329 if (chip_id != MESON_CPU_MAJOR_ID_S1A &&
2330 chip_id != MESON_CPU_MAJOR_ID_TXHD2)
hai.cao8b0d0bc2023-06-14 14:08:57 +08002331 set_osd1_rgb2yuv(0);
2332 else
2333 set_osd1_rgb2yuv(1);
hai.cao8c827c02023-02-28 11:12:05 +08002334 set_osd2_rgb2yuv(0);
2335 if (chip_id != MESON_CPU_MAJOR_ID_TL1 &&
hai.cao8b0d0bc2023-06-14 14:08:57 +08002336 chip_id != MESON_CPU_MAJOR_ID_S4 &&
yuhua.linacab7682024-01-11 14:30:57 +08002337 chip_id != MESON_CPU_MAJOR_ID_S1A &&
hai.caoc06b31d2024-04-05 13:53:01 +08002338 chip_id != MESON_CPU_MAJOR_ID_S7 &&
jinbing.zhu354816b2024-06-19 11:47:58 +00002339 chip_id != MESON_CPU_MAJOR_ID_S7D &&
2340 chip_id != MESON_CPU_MAJOR_ID_S6)
hai.cao8c827c02023-02-28 11:12:05 +08002341 set_osd3_rgb2yuv(0);
2342
2343 if (chip_id != MESON_CPU_MAJOR_ID_T7)
2344 set_vpp_osd2_rgb2yuv(1);
2345 else
2346 set_osd4_rgb2yuv(0);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002347
2348 /*txhd2 enable keystone in uboot need disable osd2 matrix*/
2349 if (chip_id == MESON_CPU_MAJOR_ID_TXHD2) {
2350 char *enable_flag;
2351
2352 enable_flag = env_get("vout_projector_mux");
2353 if (enable_flag && !strcmp(enable_flag, "enable"))
2354 set_vpp_osd2_rgb2yuv(0);
2355 }
2356
hai.cao8c827c02023-02-28 11:12:05 +08002357#endif
2358 /* set vpp data path to u12 */
2359 set_vpp_bitdepth();
2360 hdr_func(OSD1_HDR, HDR_BYPASS | RGB_OSD);
2361 hdr_func(OSD2_HDR, HDR_BYPASS | RGB_OSD);
2362 hdr_func(OSD3_HDR, HDR_BYPASS | RGB_OSD);
2363 hdr_func(OSD4_HDR, HDR_BYPASS | RGB_OSD);
2364 hdr_func(VD1_HDR, HDR_BYPASS);
2365 hdr_func(VD2_HDR, HDR_BYPASS);
2366 } else {
2367 /* set dummy data default YUV black */
2368#ifndef AML_S5_DISPLAY
2369 vpp_reg_write(VPP_DUMMY_DATA1, 0x108080);
2370 /* osd1: rgb->yuv limit , osd2: yuv limit */
2371 set_osd1_rgb2yuv(1);
2372#endif
2373 }
2374}