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