blob: ded84a3df2c630117a1406f269fb87bfeb96fbb4 [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
Huijuan Xiao33baf922024-05-28 14:08:12 +0800516void mtx_setting(enum vpp_matrix_e mtx_sel,
517 enum mtx_csc_e mtx_csc,
518 int mtx_on)
519{
520 unsigned int matrix_coef00_01 = 0;
521 unsigned int matrix_coef02_10 = 0;
522 unsigned int matrix_coef11_12 = 0;
523 unsigned int matrix_coef20_21 = 0;
524 unsigned int matrix_coef22 = 0;
525 unsigned int matrix_offset0_1 = 0;
526 unsigned int matrix_offset2 = 0;
527 unsigned int matrix_pre_offset0_1 = 0;
528 unsigned int matrix_pre_offset2 = 0;
529 unsigned int matrix_en_ctrl = 0;
530
531 if (mtx_sel == VPP_OSD1_MTX) {
532 matrix_coef00_01 = VPP_WRAP_OSD1_MATRIX_COEF00_01;
533 matrix_coef02_10 = VPP_WRAP_OSD1_MATRIX_COEF02_10;
534 matrix_coef11_12 = VPP_WRAP_OSD1_MATRIX_COEF11_12;
535 matrix_coef20_21 = VPP_WRAP_OSD1_MATRIX_COEF20_21;
536 matrix_coef22 = VPP_WRAP_OSD1_MATRIX_COEF22;
537 matrix_offset0_1 = VPP_WRAP_OSD1_MATRIX_OFFSET0_1;
538 matrix_offset2 = VPP_WRAP_OSD1_MATRIX_OFFSET2;
539 matrix_pre_offset0_1 = VPP_WRAP_OSD1_MATRIX_PRE_OFFSET0_1;
540 matrix_pre_offset2 = VPP_WRAP_OSD1_MATRIX_PRE_OFFSET2;
541 matrix_en_ctrl = VPP_WRAP_OSD1_MATRIX_EN_CTRL;
542
543 vpp_reg_setb(matrix_en_ctrl, mtx_on, 0, 1);
544 } else if (mtx_sel == VPP_OSD2_MTX) {
545 matrix_coef00_01 = VPP_OSD2_MATRIX_COEF00_01;
546 matrix_coef02_10 = VPP_OSD2_MATRIX_COEF02_10;
547 matrix_coef11_12 = VPP_OSD2_MATRIX_COEF11_12;
548 matrix_coef20_21 = VPP_OSD2_MATRIX_COEF20_21;
549 matrix_coef22 = VPP_OSD2_MATRIX_COEF22;
550 matrix_offset0_1 = VPP_OSD2_MATRIX_OFFSET0_1;
551 matrix_offset2 = VPP_OSD2_MATRIX_OFFSET2;
552 matrix_pre_offset0_1 = VPP_OSD2_MATRIX_PRE_OFFSET0_1;
553 matrix_pre_offset2 = VPP_OSD2_MATRIX_PRE_OFFSET2;
554 matrix_en_ctrl = VPP_OSD2_MATRIX_EN_CTRL;
555
556 vpp_reg_setb(matrix_en_ctrl, mtx_on, 0, 1);
557
558 } else {
559 return;
560 }
561
562 if (!mtx_on)
563 return;
564
565 switch (mtx_csc) {
566 case MATRIX_RGB_YUV709:
567 vpp_reg_write(matrix_coef00_01, 0x00bb0275);
568 vpp_reg_write(matrix_coef02_10, 0x003f1f99);
569 vpp_reg_write(matrix_coef11_12, 0x1ea601c2);
570 vpp_reg_write(matrix_coef20_21, 0x01c21e67);
571 vpp_reg_write(matrix_coef22, 0x00001fd7);
572 vpp_reg_write(matrix_offset0_1, 0x00400200);
573 vpp_reg_write(matrix_offset2, 0x00000200);
574 vpp_reg_write(matrix_pre_offset0_1, 0x0);
575 vpp_reg_write(matrix_pre_offset2, 0x0);
576 break;
577 case MATRIX_RGB_BT2020YUV:
578 vpp_reg_write(matrix_coef00_01, 0x00e60252);
579 vpp_reg_write(matrix_coef02_10, 0x00341f83);
580 vpp_reg_write(matrix_coef11_12, 0x1ebd01c0);
581 vpp_reg_write(matrix_coef20_21, 0x01c01e63);
582 vpp_reg_write(matrix_coef22, 0x00001fdc);
583 vpp_reg_write(matrix_offset0_1, 0x00400200);
584 vpp_reg_write(matrix_offset2, 0x00000200);
585 vpp_reg_write(matrix_pre_offset0_1, 0x0);
586 vpp_reg_write(matrix_pre_offset2, 0x0);
587 default:
588 break;
589 }
590}
591
hai.cao8c827c02023-02-28 11:12:05 +0800592#ifndef AML_S5_DISPLAY
593static void vpp_set_matrix_default_init(void)
594{
595 /* default probe_sel, for highlight en */
596 vpp_reg_setb(VPP_MATRIX_CTRL, 0xf, 11, 4);
597}
598#endif
599
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000600/*ve module slice1~slice3 offset*/
601unsigned int ve_reg_ofst[3] = {
602 0x0, 0x100, 0x200
603};
604
605unsigned int pst_reg_ofst[4] = {
606 0x0, 0x100, 0x700, 0x1900
607};
608
609//S5 4 slice matrix setting, for hdmitx dsc enable
610void vpp_mtx_config_v2(struct matrix_coef_s *coef,
611 enum vpp_slice_e slice,
612 enum vpp_matrix_e mtx_sel)
613{
614 int reg_pre_offset0_1 = 0;
615 int reg_pre_offset2 = 0;
616 int reg_coef00_01 = 0;
617 int reg_coef02_10 = 0;
618 int reg_coef11_12 = 0;
619 int reg_coef20_21 = 0;
620 int reg_coef22 = 0;
621 int reg_offset0_1 = 0;
622 int reg_offset2 = 0;
623 int reg_en_ctl = 0;
624
625 switch (slice) {
626 case SLICE0:
627 if (mtx_sel == VD1_MTX) {
628 reg_pre_offset0_1 = S5_VPP_VD1_MATRIX_PRE_OFFSET0_1;
629 reg_pre_offset2 = S5_VPP_VD1_MATRIX_PRE_OFFSET2;
630 reg_coef00_01 = S5_VPP_VD1_MATRIX_COEF00_01;
631 reg_coef02_10 = S5_VPP_VD1_MATRIX_COEF02_10;
632 reg_coef11_12 = S5_VPP_VD1_MATRIX_COEF11_12;
633 reg_coef20_21 = S5_VPP_VD1_MATRIX_COEF20_21;
634 reg_coef22 = S5_VPP_VD1_MATRIX_COEF22;
635 reg_offset0_1 = S5_VPP_VD1_MATRIX_OFFSET0_1;
636 reg_offset2 = S5_VPP_VD1_MATRIX_OFFSET2;
637 reg_en_ctl = S5_VPP_VD1_MATRIX_EN_CTRL;
638 } else if (mtx_sel == POST2_MTX) {
639 reg_pre_offset0_1 = S5_VPP_POST2_MATRIX_PRE_OFFSET0_1;
640 reg_pre_offset2 = S5_VPP_POST2_MATRIX_PRE_OFFSET2;
641 reg_coef00_01 = S5_VPP_POST2_MATRIX_COEF00_01;
642 reg_coef02_10 = S5_VPP_POST2_MATRIX_COEF02_10;
643 reg_coef11_12 = S5_VPP_POST2_MATRIX_COEF11_12;
644 reg_coef20_21 = S5_VPP_POST2_MATRIX_COEF20_21;
645 reg_coef22 = S5_VPP_POST2_MATRIX_COEF22;
646 reg_offset0_1 = S5_VPP_POST2_MATRIX_OFFSET0_1;
647 reg_offset2 = S5_VPP_POST2_MATRIX_OFFSET2;
648 reg_en_ctl = S5_VPP_POST2_MATRIX_EN_CTRL;
649 } else if (mtx_sel == POST_MTX) {
650 reg_pre_offset0_1 = S5_VPP_POST_MATRIX_PRE_OFFSET0_1;
651 reg_pre_offset2 = S5_VPP_POST_MATRIX_PRE_OFFSET2;
652 reg_coef00_01 = S5_VPP_POST_MATRIX_COEF00_01;
653 reg_coef02_10 = S5_VPP_POST_MATRIX_COEF02_10;
654 reg_coef11_12 = S5_VPP_POST_MATRIX_COEF11_12;
655 reg_coef20_21 = S5_VPP_POST_MATRIX_COEF20_21;
656 reg_coef22 = S5_VPP_POST_MATRIX_COEF22;
657 reg_offset0_1 = S5_VPP_POST_MATRIX_OFFSET0_1;
658 reg_offset2 = S5_VPP_POST_MATRIX_OFFSET2;
659 reg_en_ctl = S5_VPP_POST_MATRIX_EN_CTRL;
660 } else {
661 reg_pre_offset0_1 = S5_VPP_POST2_MATRIX_PRE_OFFSET0_1;
662 reg_pre_offset2 = S5_VPP_POST2_MATRIX_PRE_OFFSET2;
663 reg_coef00_01 = S5_VPP_POST2_MATRIX_COEF00_01;
664 reg_coef02_10 = S5_VPP_POST2_MATRIX_COEF02_10;
665 reg_coef11_12 = S5_VPP_POST2_MATRIX_COEF11_12;
666 reg_coef20_21 = S5_VPP_POST2_MATRIX_COEF20_21;
667 reg_coef22 = S5_VPP_POST2_MATRIX_COEF22;
668 reg_offset0_1 = S5_VPP_POST2_MATRIX_OFFSET0_1;
669 reg_offset2 = S5_VPP_POST2_MATRIX_OFFSET2;
670 reg_en_ctl = S5_VPP_POST2_MATRIX_EN_CTRL;
671 }
672 break;
673 case SLICE1:
674 case SLICE2:
675 case SLICE3:
676 if (mtx_sel == VD1_MTX) {
677 reg_pre_offset0_1 = S5_VPP_SLICE1_VD1_MATRIX_PRE_OFFSET0_1 +
678 ve_reg_ofst[slice - 1];
679 reg_pre_offset2 = S5_VPP_SLICE1_VD1_MATRIX_PRE_OFFSET2 +
680 ve_reg_ofst[slice - 1];
681 reg_coef00_01 = S5_VPP_SLICE1_VD1_MATRIX_COEF00_01 +
682 ve_reg_ofst[slice - 1];
683 reg_coef02_10 = S5_VPP_SLICE1_VD1_MATRIX_COEF02_10 +
684 ve_reg_ofst[slice - 1];
685 reg_coef11_12 = S5_VPP_SLICE1_VD1_MATRIX_COEF11_12 +
686 ve_reg_ofst[slice - 1];
687 reg_coef20_21 = S5_VPP_SLICE1_VD1_MATRIX_COEF20_21 +
688 ve_reg_ofst[slice - 1];
689 reg_coef22 = S5_VPP_SLICE1_VD1_MATRIX_COEF22 +
690 ve_reg_ofst[slice - 1];
691 reg_offset0_1 = S5_VPP_SLICE1_VD1_MATRIX_OFFSET0_1 +
692 ve_reg_ofst[slice - 1];
693 reg_offset2 = S5_VPP_SLICE1_VD1_MATRIX_OFFSET2 +
694 ve_reg_ofst[slice - 1];
695 reg_en_ctl = S5_VPP_SLICE1_VD1_MATRIX_EN_CTRL +
696 ve_reg_ofst[slice - 1];
697 } else if (mtx_sel == POST2_MTX) {
698 reg_pre_offset0_1 = S5_VPP_POST2_MATRIX_PRE_OFFSET0_1 +
699 pst_reg_ofst[slice];
700 reg_pre_offset2 = S5_VPP_POST2_MATRIX_PRE_OFFSET2 +
701 pst_reg_ofst[slice];
702 reg_coef00_01 = S5_VPP_POST2_MATRIX_COEF00_01 +
703 pst_reg_ofst[slice];
704 reg_coef02_10 = S5_VPP_POST2_MATRIX_COEF02_10 +
705 pst_reg_ofst[slice];
706 reg_coef11_12 = S5_VPP_POST2_MATRIX_COEF11_12 +
707 pst_reg_ofst[slice];
708 reg_coef20_21 = S5_VPP_POST2_MATRIX_COEF20_21 +
709 pst_reg_ofst[slice];
710 reg_coef22 = S5_VPP_POST2_MATRIX_COEF22 +
711 pst_reg_ofst[slice];
712 reg_offset0_1 = S5_VPP_POST2_MATRIX_OFFSET0_1 +
713 pst_reg_ofst[slice];
714 reg_offset2 = S5_VPP_POST2_MATRIX_OFFSET2 +
715 pst_reg_ofst[slice];
716 reg_en_ctl = S5_VPP_POST2_MATRIX_EN_CTRL +
717 pst_reg_ofst[slice];
718 } else if (mtx_sel == POST_MTX) {
719 reg_pre_offset0_1 = S5_VPP_POST_MATRIX_PRE_OFFSET0_1 +
720 pst_reg_ofst[slice];
721 reg_pre_offset2 = S5_VPP_POST_MATRIX_PRE_OFFSET2 +
722 pst_reg_ofst[slice];
723 reg_coef00_01 = S5_VPP_POST_MATRIX_COEF00_01 +
724 pst_reg_ofst[slice];
725 reg_coef02_10 = S5_VPP_POST_MATRIX_COEF02_10 +
726 pst_reg_ofst[slice];
727 reg_coef11_12 = S5_VPP_POST_MATRIX_COEF11_12 +
728 pst_reg_ofst[slice];
729 reg_coef20_21 = S5_VPP_POST_MATRIX_COEF20_21 +
730 pst_reg_ofst[slice];
731 reg_coef22 = S5_VPP_POST_MATRIX_COEF22 +
732 pst_reg_ofst[slice];
733 reg_offset0_1 = S5_VPP_POST_MATRIX_OFFSET0_1 +
734 pst_reg_ofst[slice];
735 reg_offset2 = S5_VPP_POST_MATRIX_OFFSET2 +
736 pst_reg_ofst[slice];
737 reg_en_ctl = S5_VPP_POST_MATRIX_EN_CTRL +
738 pst_reg_ofst[slice];
739 } else {
740 reg_pre_offset0_1 = S5_VPP_POST2_MATRIX_PRE_OFFSET0_1 +
741 pst_reg_ofst[slice];
742 reg_pre_offset2 = S5_VPP_POST2_MATRIX_PRE_OFFSET2 +
743 pst_reg_ofst[slice];
744 reg_coef00_01 = S5_VPP_POST2_MATRIX_COEF00_01 +
745 pst_reg_ofst[slice];
746 reg_coef02_10 = S5_VPP_POST2_MATRIX_COEF02_10 +
747 pst_reg_ofst[slice];
748 reg_coef11_12 = S5_VPP_POST2_MATRIX_COEF11_12 +
749 pst_reg_ofst[slice];
750 reg_coef20_21 = S5_VPP_POST2_MATRIX_COEF20_21 +
751 pst_reg_ofst[slice];
752 reg_coef22 = S5_VPP_POST2_MATRIX_COEF22 +
753 pst_reg_ofst[slice];
754 reg_offset0_1 = S5_VPP_POST2_MATRIX_OFFSET0_1 +
755 pst_reg_ofst[slice];
756 reg_offset2 = S5_VPP_POST2_MATRIX_OFFSET2 +
757 pst_reg_ofst[slice];
758 reg_en_ctl = S5_VPP_POST2_MATRIX_EN_CTRL +
759 pst_reg_ofst[slice];
760 }
761 break;
762 default:
763 return;
764 }
765
766 vpp_reg_write(reg_pre_offset0_1,
767 (coef->pre_offset[0] << 16) | coef->pre_offset[1]);
768 vpp_reg_write(reg_pre_offset2, coef->pre_offset[2]);
769 vpp_reg_write(reg_coef00_01,
770 (coef->matrix_coef[0][0] << 16) | coef->matrix_coef[0][1]);
771 vpp_reg_write(reg_coef02_10,
772 (coef->matrix_coef[0][2] << 16) | coef->matrix_coef[1][0]);
773 vpp_reg_write(reg_coef11_12,
774 (coef->matrix_coef[1][1] << 16) | coef->matrix_coef[1][2]);
775 vpp_reg_write(reg_coef20_21,
776 (coef->matrix_coef[2][0] << 16) | coef->matrix_coef[2][1]);
777 vpp_reg_write(reg_coef22, coef->matrix_coef[2][2]);
778 vpp_reg_write(reg_offset0_1,
779 (coef->post_offset[0] << 16) | coef->post_offset[1]);
780 vpp_reg_write(reg_offset2, coef->post_offset[2]);
781 vpp_reg_setb(reg_en_ctl, coef->en, 0, 1);
782}
783
784void mtx_setting_v2(enum vpp_matrix_e mtx_sel,
785 enum mtx_csc_e mtx_csc,
786 int mtx_on,
787 enum vpp_slice_e slice)
788{
789 struct matrix_coef_s coef;
790
791 switch (mtx_csc) {
792 case MATRIX_RGB_YUV709:
793 coef.matrix_coef[0][0] = 0xbb;
794 coef.matrix_coef[0][1] = 0x275;
795 coef.matrix_coef[0][2] = 0x3f;
796 coef.matrix_coef[1][0] = 0x1f99;
797 coef.matrix_coef[1][1] = 0x1ea6;
798 coef.matrix_coef[1][2] = 0x1c2;
799 coef.matrix_coef[2][0] = 0x1c2;
800 coef.matrix_coef[2][1] = 0x1e67;
801 coef.matrix_coef[2][2] = 0x1fd7;
802
803 coef.pre_offset[0] = 0;
804 coef.pre_offset[1] = 0;
805 coef.pre_offset[2] = 0;
806 coef.post_offset[0] = 0x40;
807 coef.post_offset[1] = 0x200;
808 coef.post_offset[2] = 0x200;
809 coef.en = mtx_on;
810 break;
811 case MATRIX_YUV709_RGB:
812 coef.matrix_coef[0][0] = 0x4ac;
813 coef.matrix_coef[0][1] = 0x0;
814 coef.matrix_coef[0][2] = 0x731;
815 coef.matrix_coef[1][0] = 0x4ac;
816 coef.matrix_coef[1][1] = 0x1f25;
817 coef.matrix_coef[1][2] = 0x1ddd;
818 coef.matrix_coef[2][0] = 0x4ac;
819 coef.matrix_coef[2][1] = 0x879;
820 coef.matrix_coef[2][2] = 0x0;
821
822 coef.pre_offset[0] = 0x7c0;
823 coef.pre_offset[1] = 0x600;
824 coef.pre_offset[2] = 0x600;
825 coef.post_offset[0] = 0x0;
826 coef.post_offset[1] = 0x0;
827 coef.post_offset[2] = 0x0;
828 coef.en = mtx_on;
829 break;
830 case MATRIX_YUV709F_RGB:/*full to full*/
831 coef.matrix_coef[0][0] = 0x400;
832 coef.matrix_coef[0][1] = 0x0;
833 coef.matrix_coef[0][2] = 0x64D;
834 coef.matrix_coef[1][0] = 0x400;
835 coef.matrix_coef[1][1] = 0x1F41;
836 coef.matrix_coef[1][2] = 0x1E21;
837 coef.matrix_coef[2][0] = 0x400;
838 coef.matrix_coef[2][1] = 0x76D;
839 coef.matrix_coef[2][2] = 0x0;
840
841 coef.pre_offset[0] = 0x0;
842 coef.pre_offset[1] = 0x600;
843 coef.pre_offset[2] = 0x600;
844 coef.post_offset[0] = 0x0;
845 coef.post_offset[1] = 0x0;
846 coef.post_offset[2] = 0x0;
847 coef.en = mtx_on;
848 break;
849 case MATRIX_NULL:
850 coef.matrix_coef[0][0] = 0;
851 coef.matrix_coef[0][1] = 0;
852 coef.matrix_coef[0][2] = 0;
853 coef.matrix_coef[1][0] = 0;
854 coef.matrix_coef[1][1] = 0;
855 coef.matrix_coef[1][2] = 0;
856 coef.matrix_coef[2][0] = 0;
857 coef.matrix_coef[2][1] = 0;
858 coef.matrix_coef[2][2] = 0;
859
860 coef.pre_offset[0] = 0;
861 coef.pre_offset[1] = 0;
862 coef.pre_offset[2] = 0;
863 coef.post_offset[0] = 0;
864 coef.post_offset[1] = 0;
865 coef.post_offset[2] = 0;
866 coef.en = mtx_on;
867 break;
868 default:
869 return;
870 }
871
872 vpp_mtx_config_v2(&coef, slice, mtx_sel);
873}
874
hai.cao8c827c02023-02-28 11:12:05 +0800875static void vpp_top_post2_matrix_yuv2rgb(int vpp_top)
876{
877 int *m = NULL;
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000878 int offset = 0x100;
879 unsigned int reg_mtrx_coeff00_01;
880 unsigned int reg_mtrx_coeff02_10;
881 unsigned int reg_mtrx_coeff11_12;
882 unsigned int reg_mtrx_coeff20_21;
883 unsigned int reg_mtrx_coeff22;
884 unsigned int reg_mtrx_offset0_1;
885 unsigned int reg_mtrx_offset2;
886 unsigned int reg_mtrx_pre_offset0_1;
887 unsigned int reg_mtrx_pre_offset2;
888 unsigned int reg_mtrx_en_ctrl;
889
hai.cao8c827c02023-02-28 11:12:05 +0800890 /* POST2 matrix: YUV limit -> RGB default is 12bit*/
891 m = YUV709l_to_RGB709_coeff12;
892
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000893 if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_S5) {
894 mtx_setting_v2(POST_MTX,
895 MATRIX_YUV709_RGB, MTX_ON, SLICE0);
896 mtx_setting_v2(POST_MTX,
897 MATRIX_YUV709_RGB, MTX_ON, SLICE1);
898 mtx_setting_v2(POST_MTX,
899 MATRIX_YUV709_RGB, MTX_ON, SLICE2);
900 mtx_setting_v2(POST_MTX,
901 MATRIX_YUV709_RGB, MTX_ON, SLICE3);
902 return;
903 } else if (get_cpu_id().family_id != MESON_CPU_MAJOR_ID_T3X) {
904 reg_mtrx_coeff00_01 = VPP_POST2_MATRIX_COEF00_01;
905 reg_mtrx_coeff02_10 = VPP_POST2_MATRIX_COEF02_10;
906 reg_mtrx_coeff11_12 = VPP_POST2_MATRIX_COEF11_12;
907 reg_mtrx_coeff20_21 = VPP_POST2_MATRIX_COEF20_21;
908 reg_mtrx_coeff22 = VPP_POST2_MATRIX_COEF22;
909 reg_mtrx_offset0_1 = VPP_POST2_MATRIX_OFFSET0_1;
910 reg_mtrx_offset2 = VPP_POST2_MATRIX_COEF22;
911 reg_mtrx_pre_offset0_1 = VPP_POST2_MATRIX_PRE_OFFSET0_1;
912 reg_mtrx_pre_offset2 = VPP_POST2_MATRIX_PRE_OFFSET2;
913 reg_mtrx_en_ctrl = VPP_POST2_MATRIX_EN_CTRL;
914 } else {
915 reg_mtrx_coeff00_01 = S0_VPP_POST2_MATRIX_COEF00_01;
916 reg_mtrx_coeff02_10 = S0_VPP_POST2_MATRIX_COEF02_10;
917 reg_mtrx_coeff11_12 = S0_VPP_POST2_MATRIX_COEF11_12;
918 reg_mtrx_coeff20_21 = S0_VPP_POST2_MATRIX_COEF20_21;
919 reg_mtrx_coeff22 = S0_VPP_POST2_MATRIX_COEF22;
920 reg_mtrx_offset0_1 = S0_VPP_POST2_MATRIX_OFFSET0_1;
921 reg_mtrx_offset2 = S0_VPP_POST2_MATRIX_COEF22;
922 reg_mtrx_pre_offset0_1 = S0_VPP_POST2_MATRIX_PRE_OFFSET0_1;
923 reg_mtrx_pre_offset2 = S0_VPP_POST2_MATRIX_PRE_OFFSET2;
924 reg_mtrx_en_ctrl = S0_VPP_POST2_MATRIX_EN_CTRL;
925 }
926
hai.cao8c827c02023-02-28 11:12:05 +0800927 if (vpp_top == 0) {
928 /* VPP WRAP POST2 matrix */
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000929 vpp_reg_write(reg_mtrx_pre_offset0_1,
hai.cao8c827c02023-02-28 11:12:05 +0800930 (((m[0] >> 2) & 0xfff) << 16) | ((m[1] >> 2) & 0xfff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000931 vpp_reg_write(reg_mtrx_pre_offset2,
hai.cao8c827c02023-02-28 11:12:05 +0800932 (m[2] >> 2) & 0xfff);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000933 vpp_reg_write(reg_mtrx_coeff00_01,
hai.cao8c827c02023-02-28 11:12:05 +0800934 (((m[3] >> 2) & 0x1fff) << 16) | ((m[4] >> 2) & 0x1fff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000935 vpp_reg_write(reg_mtrx_coeff02_10,
hai.cao8c827c02023-02-28 11:12:05 +0800936 (((m[5] >> 2) & 0x1fff) << 16) | ((m[6] >> 2) & 0x1fff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000937 vpp_reg_write(reg_mtrx_coeff11_12,
hai.cao8c827c02023-02-28 11:12:05 +0800938 (((m[7] >> 2) & 0x1fff) << 16) | ((m[8] >> 2) & 0x1fff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000939 vpp_reg_write(reg_mtrx_coeff20_21,
hai.cao8c827c02023-02-28 11:12:05 +0800940 (((m[9] >> 2) & 0x1fff) << 16) | ((m[10] >> 2) & 0x1fff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000941 vpp_reg_write(reg_mtrx_coeff22,
hai.cao8c827c02023-02-28 11:12:05 +0800942 (m[11] >> 2) & 0x1fff);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000943 vpp_reg_write(reg_mtrx_offset0_1,
hai.cao8c827c02023-02-28 11:12:05 +0800944 (((m[18] >> 2) & 0xfff) << 16) | ((m[19] >> 2) & 0xfff));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000945 vpp_reg_write(reg_mtrx_offset2,
hai.cao8c827c02023-02-28 11:12:05 +0800946 (m[20] >> 2) & 0xfff);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +0000947 vpp_reg_setb(reg_mtrx_en_ctrl, 1, 0, 1);
948
949 if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_T3X) {
950 vpp_reg_write(reg_mtrx_pre_offset0_1 + offset,
951 (((m[0] >> 2) & 0xfff) << 16) | ((m[1] >> 2) & 0xfff));
952 vpp_reg_write(reg_mtrx_pre_offset2 + offset,
953 (m[2] >> 2) & 0xfff);
954 vpp_reg_write(reg_mtrx_coeff00_01 + offset,
955 (((m[3] >> 2) & 0x1fff) << 16) | ((m[4] >> 2) & 0x1fff));
956 vpp_reg_write(reg_mtrx_coeff02_10 + offset,
957 (((m[5] >> 2) & 0x1fff) << 16) | ((m[6] >> 2) & 0x1fff));
958 vpp_reg_write(reg_mtrx_coeff11_12 + offset,
959 (((m[7] >> 2) & 0x1fff) << 16) | ((m[8] >> 2) & 0x1fff));
960 vpp_reg_write(reg_mtrx_coeff20_21 + offset,
961 (((m[9] >> 2) & 0x1fff) << 16) | ((m[10] >> 2) & 0x1fff));
962 vpp_reg_write(reg_mtrx_coeff22 + offset,
963 (m[11] >> 2) & 0x1fff);
964 vpp_reg_write(reg_mtrx_offset0_1 + offset,
965 (((m[18] >> 2) & 0xfff) << 16) | ((m[19] >> 2) & 0xfff));
966 vpp_reg_write(reg_mtrx_offset2 + offset,
967 (m[20] >> 2) & 0xfff);
968 vpp_reg_setb(reg_mtrx_en_ctrl + offset, 1, 0, 1);
969 }
hai.cao8c827c02023-02-28 11:12:05 +0800970 } else if (vpp_top == 1) {
971 vpp_reg_write(VPP1_MATRIX_PRE_OFFSET0_1,
972 (((m[0] >> 2) & 0xfff) << 16) | ((m[1] >> 2) & 0xfff));
973 vpp_reg_write(VPP1_MATRIX_PRE_OFFSET2,
974 (m[2] >> 2) & 0xfff);
975 vpp_reg_write(VPP1_MATRIX_COEF00_01,
976 (((m[3] >> 2) & 0x1fff) << 16) | ((m[4] >> 2) & 0x1fff));
977 vpp_reg_write(VPP1_MATRIX_COEF02_10,
978 (((m[5] >> 2) & 0x1fff) << 16) | ((m[6] >> 2) & 0x1fff));
979 vpp_reg_write(VPP1_MATRIX_COEF11_12,
980 (((m[7] >> 2) & 0x1fff) << 16) | ((m[8] >> 2) & 0x1fff));
981 vpp_reg_write(VPP1_MATRIX_COEF20_21,
982 (((m[9] >> 2) & 0x1fff) << 16) | ((m[10] >> 2) & 0x1fff));
983 vpp_reg_write(VPP1_MATRIX_COEF22,
984 (m[11] >> 2) & 0x1fff);
985
986 vpp_reg_write(VPP1_MATRIX_OFFSET0_1,
987 (((m[18] >> 2) & 0xfff) << 16) | ((m[19] >> 2) & 0xfff));
988 vpp_reg_write(VPP1_MATRIX_OFFSET2,
989 (m[20] >> 2) & 0xfff);
990
991 vpp_reg_setb(VPP1_MATRIX_EN_CTRL, 1, 0, 1);
992 } else if (vpp_top == 2) {
993 vpp_reg_write(VPP2_MATRIX_PRE_OFFSET0_1,
994 (((m[0] >> 2) & 0xfff) << 16) | ((m[1] >> 2) & 0xfff));
995 vpp_reg_write(VPP2_MATRIX_PRE_OFFSET2,
996 (m[2] >> 2) & 0xfff);
997 vpp_reg_write(VPP2_MATRIX_COEF00_01,
998 (((m[3] >> 2) & 0x1fff) << 16) | ((m[4] >> 2) & 0x1fff));
999 vpp_reg_write(VPP2_MATRIX_COEF02_10,
1000 (((m[5] >> 2) & 0x1fff) << 16) | ((m[6] >> 2) & 0x1fff));
1001 vpp_reg_write(VPP2_MATRIX_COEF11_12,
1002 (((m[7] >> 2) & 0x1fff) << 16) | ((m[8] >> 2) & 0x1fff));
1003 vpp_reg_write(VPP2_MATRIX_COEF20_21,
1004 (((m[9] >> 2) & 0x1fff) << 16) | ((m[10] >> 2) & 0x1fff));
1005 vpp_reg_write(VPP2_MATRIX_COEF22,
1006 (m[11] >> 2) & 0x1fff);
1007
1008 vpp_reg_write(VPP2_MATRIX_OFFSET0_1,
1009 (((m[18] >> 2) & 0xfff) << 16) | ((m[19] >> 2) & 0xfff));
1010 vpp_reg_write(VPP2_MATRIX_OFFSET2,
1011 (m[20] >> 2) & 0xfff);
1012
1013 vpp_reg_setb(VPP2_MATRIX_EN_CTRL, 1, 0, 1);
1014 }
1015
1016}
1017static void vpp_set_matrix_ycbcr2rgb(int vd1_or_vd2_or_post, int mode)
1018{
1019 //VPP_PR("%s: %d, %d\n", __func__, vd1_or_vd2_or_post, mode);
1020
1021 if (is_osd_high_version()) {
1022 /* vpp top0 */
1023 vpp_top_post2_matrix_yuv2rgb(0);
1024 VPP_PR("g12a/b post2(bit12) matrix: YUV limit -> RGB ..............\n");
1025 return;
1026 }
1027#ifndef AML_S5_DISPLAY
1028 if (vd1_or_vd2_or_post == 0) { //vd1
1029 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 5, 1);
1030 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 8, 3);
1031 } else if (vd1_or_vd2_or_post == 1) { //vd2
1032 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 4, 1);
1033 vpp_reg_setb(VPP_MATRIX_CTRL, 2, 8, 3);
1034 } else if (vd1_or_vd2_or_post == 3) { //osd
1035 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 7, 1);
1036 vpp_reg_setb(VPP_MATRIX_CTRL, 4, 8, 3);
1037 } else if (vd1_or_vd2_or_post == 4) { //xvycc
1038 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 6, 1);
1039 vpp_reg_setb(VPP_MATRIX_CTRL, 3, 8, 3);
1040 } else {
1041 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 0, 1);
1042 vpp_reg_setb(VPP_MATRIX_CTRL, 0, 8, 3);
1043 if (mode == 0)
1044 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 1, 2);
1045 else if (mode == 1)
1046 vpp_reg_setb(VPP_MATRIX_CTRL, 0, 1, 2);
1047 }
1048
1049 if (mode == 0) { /* 601 limit to RGB */
1050 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1, 0x0064C8FF);
1051 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2, 0x006400C8);
1052 //1.164 0 1.596
1053 //1.164 -0.392 -0.813
1054 //1.164 2.017 0
1055 vpp_reg_write(VPP_MATRIX_COEF00_01, 0x04A80000);
1056 vpp_reg_write(VPP_MATRIX_COEF02_10, 0x066204A8);
1057 vpp_reg_write(VPP_MATRIX_COEF11_12, 0x1e701cbf);
1058 vpp_reg_write(VPP_MATRIX_COEF20_21, 0x04A80812);
1059 vpp_reg_write(VPP_MATRIX_COEF22, 0x00000000);
1060 vpp_reg_write(VPP_MATRIX_OFFSET0_1, 0x00000000);
1061 vpp_reg_write(VPP_MATRIX_OFFSET2, 0x00000000);
1062 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1, 0x0FC00E00);
1063 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2, 0x00000E00);
1064 } else if (mode == 1) { /* 601 limit to RGB */
1065 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1, 0x0000E00);
1066 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2, 0x0E00);
1067 // 1 0 1.402
1068 // 1 -0.34414 -0.71414
1069 // 1 1.772 0
1070 vpp_reg_write(VPP_MATRIX_COEF00_01, (0x400 << 16) |0);
1071 vpp_reg_write(VPP_MATRIX_COEF02_10, (0x59c << 16) |0x400);
1072 vpp_reg_write(VPP_MATRIX_COEF11_12, (0x1ea0 << 16) |0x1d24);
1073 vpp_reg_write(VPP_MATRIX_COEF20_21, (0x400 << 16) |0x718);
1074 vpp_reg_write(VPP_MATRIX_COEF22, 0x0);
1075 vpp_reg_write(VPP_MATRIX_OFFSET0_1, 0x0);
1076 vpp_reg_write(VPP_MATRIX_OFFSET2, 0x0);
1077 } else if (mode == 2) { /* 709F to RGB */
1078 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1, 0x0000E00);
1079 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2, 0x0E00);
1080 // 1 0 1.402
1081 // 1 -0.34414 -0.71414
1082 // 1 1.772 0
1083 vpp_reg_write(VPP_MATRIX_COEF00_01, 0x04000000);
1084 vpp_reg_write(VPP_MATRIX_COEF02_10, 0x064D0400);
1085 vpp_reg_write(VPP_MATRIX_COEF11_12, 0x1F411E21);
1086 vpp_reg_write(VPP_MATRIX_COEF20_21, 0x0400076D);
1087 vpp_reg_write(VPP_MATRIX_COEF22, 0x0);
1088 vpp_reg_write(VPP_MATRIX_OFFSET0_1, 0x0);
1089 vpp_reg_write(VPP_MATRIX_OFFSET2, 0x0);
1090 } else if (mode == 3) { /* 709L to RGB */
1091 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1, 0x0FC00E00);
1092 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2, 0x00000E00);
1093 /* ycbcr limit range, 709 to RGB */
1094 /* -16 1.164 0 1.793 0 */
1095 /* -128 1.164 -0.213 -0.534 0 */
1096 /* -128 1.164 2.115 0 0 */
1097 vpp_reg_write(VPP_MATRIX_COEF00_01, 0x04A80000);
1098 vpp_reg_write(VPP_MATRIX_COEF02_10, 0x072C04A8);
1099 vpp_reg_write(VPP_MATRIX_COEF11_12, 0x1F261DDD);
1100 vpp_reg_write(VPP_MATRIX_COEF20_21, 0x04A80876);
1101 vpp_reg_write(VPP_MATRIX_COEF22, 0x0);
1102 vpp_reg_write(VPP_MATRIX_OFFSET0_1, 0x0);
1103 vpp_reg_write(VPP_MATRIX_OFFSET2, 0x0);
1104 }
1105 vpp_reg_setb(VPP_MATRIX_CLIP, 0, 5, 3);
1106#endif
1107}
1108
1109void set_vpp_matrix(int m_select, int *s, int on)
1110{
1111#ifndef AML_S5_DISPLAY
1112 int *m = NULL;
1113 int size = 0;
1114 int i;
1115
1116 pr_info("set_vpp_matrix m_select = %d on = %d\n",m_select,on);
1117
1118 if (m_select == VPP_MATRIX_OSD) {
1119 m = osd_matrix_coeff;
1120 size = MATRIX_5x3_COEF_SIZE;
1121 } else if (m_select == VPP_MATRIX_POST) {
1122 m = post_matrix_coeff;
1123 size = MATRIX_5x3_COEF_SIZE;
1124 } else if (m_select == VPP_MATRIX_VD1) {
1125 m = vd1_matrix_coeff;
1126 size = MATRIX_5x3_COEF_SIZE;
1127 } else if (m_select == VPP_MATRIX_VD2) {
1128 m = vd2_matrix_coeff;
1129 size = MATRIX_5x3_COEF_SIZE;
1130 } else if (m_select == VPP_MATRIX_XVYCC) {
1131 m = xvycc_matrix_coeff;
1132 size = MATRIX_5x3_COEF_SIZE;
1133 } else if (m_select == VPP_MATRIX_EOTF) {
1134 m = video_eotf_coeff;
1135 size = EOTF_COEFF_SIZE;
1136 } else if (m_select == VPP_MATRIX_OSD_EOTF) {
1137 m = osd_eotf_coeff;
1138 size = EOTF_COEFF_SIZE;
1139 } else
1140 return;
1141
1142 if (s)
1143 for (i = 0; i < size; i++)
1144 m[i] = s[i];
1145
1146 if (m_select == VPP_MATRIX_OSD) {
1147 /* osd matrix, VPP_MATRIX_0 */
1148 vpp_reg_write(VIU_OSD1_MATRIX_PRE_OFFSET0_1,
1149 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1150 vpp_reg_write(VIU_OSD1_MATRIX_PRE_OFFSET2,
1151 m[2] & 0xfff);
1152 vpp_reg_write(VIU_OSD1_MATRIX_COEF00_01,
1153 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1154 vpp_reg_write(VIU_OSD1_MATRIX_COEF02_10,
1155 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1156 vpp_reg_write(VIU_OSD1_MATRIX_COEF11_12,
1157 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1158 vpp_reg_write(VIU_OSD1_MATRIX_COEF20_21,
1159 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1160 if (m[21]) {
1161 vpp_reg_write(VIU_OSD1_MATRIX_COEF22_30,
1162 ((m[11] & 0x1fff) << 16) | (m[12] & 0x1fff));
1163 vpp_reg_write(VIU_OSD1_MATRIX_COEF31_32,
1164 ((m[13] & 0x1fff) << 16) | (m[14] & 0x1fff));
1165 vpp_reg_write(VIU_OSD1_MATRIX_COEF40_41,
1166 ((m[15] & 0x1fff) << 16) | (m[16] & 0x1fff));
1167 vpp_reg_write(VIU_OSD1_MATRIX_COLMOD_COEF42,
1168 m[17] & 0x1fff);
1169 } else {
1170 vpp_reg_write(VIU_OSD1_MATRIX_COEF22_30,
1171 (m[11] & 0x1fff) << 16);
1172 }
1173 vpp_reg_write(VIU_OSD1_MATRIX_OFFSET0_1,
1174 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1175 vpp_reg_write(VIU_OSD1_MATRIX_OFFSET2,
1176 m[20] & 0xfff);
1177 vpp_reg_setb(VIU_OSD1_MATRIX_COLMOD_COEF42,
1178 m[21], 30, 2);
1179 vpp_reg_setb(VIU_OSD1_MATRIX_COLMOD_COEF42,
1180 m[22], 16, 3);
1181 /* 23 reserved for clipping control */
1182 vpp_reg_setb(VIU_OSD1_MATRIX_CTRL, on, 0, 1);
1183 vpp_reg_setb(VIU_OSD1_MATRIX_CTRL, 0, 1, 1);
1184 } else if (m_select == VPP_MATRIX_EOTF) {
1185 /* eotf matrix, VPP_MATRIX_EOTF */
1186 for (i = 0; i < 5; i++)
1187 vpp_reg_write(VIU_EOTF_CTL + i + 1,
1188 ((m[i * 2] & 0x1fff) << 16)
1189 | (m[i * 2 + 1] & 0x1fff));
1190
1191 vpp_reg_setb(VIU_EOTF_CTL, on, 30, 1);
1192 vpp_reg_setb(VIU_EOTF_CTL, on, 31, 1);
1193 } else if (m_select == VPP_MATRIX_OSD_EOTF) {
1194 /* osd eotf matrix, VPP_MATRIX_OSD_EOTF */
1195 for (i = 0; i < 5; i++)
1196 vpp_reg_write(VIU_OSD1_EOTF_CTL + i + 1,
1197 ((m[i * 2] & 0x1fff) << 16)
1198 | (m[i * 2 + 1] & 0x1fff));
1199
1200 vpp_reg_setb(VIU_OSD1_EOTF_CTL, on, 30, 1);
1201 vpp_reg_setb(VIU_OSD1_EOTF_CTL, on, 31, 1);
1202 } else {
1203 /* vd1 matrix, VPP_MATRIX_1 */
1204 /* post matrix, VPP_MATRIX_2 */
1205 /* xvycc matrix, VPP_MATRIX_3 */
1206 /* vd2 matrix, VPP_MATRIX_6 */
1207 if (m_select == VPP_MATRIX_POST) {
1208 /* post matrix */
1209 m = post_matrix_coeff;
1210 vpp_reg_setb(VPP_MATRIX_CTRL, on, 0, 1);
1211 vpp_reg_setb(VPP_MATRIX_CTRL, 0, 8, 3);
1212 } else if (m_select == VPP_MATRIX_VD1) {
1213 /* vd1 matrix */
1214 m = vd1_matrix_coeff;
1215 vpp_reg_setb(VPP_MATRIX_CTRL, on, 5, 1);
1216 vpp_reg_setb(VPP_MATRIX_CTRL, 1, 8, 3);
1217 } else if (m_select == VPP_MATRIX_VD2) {
1218 /* vd2 matrix */
1219 m = vd2_matrix_coeff;
1220 vpp_reg_setb(VPP_MATRIX_CTRL, on, 4, 1);
1221 vpp_reg_setb(VPP_MATRIX_CTRL, 2, 8, 3);
1222 } else if (m_select == VPP_MATRIX_XVYCC) {
1223 /* xvycc matrix */
1224 m = xvycc_matrix_coeff;
1225 vpp_reg_setb(VPP_MATRIX_CTRL, on, 6, 1);
1226 vpp_reg_setb(VPP_MATRIX_CTRL, 3, 8, 3);
1227 }
1228 vpp_reg_write(VPP_MATRIX_PRE_OFFSET0_1,
1229 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1230 vpp_reg_write(VPP_MATRIX_PRE_OFFSET2,
1231 m[2] & 0xfff);
1232 vpp_reg_write(VPP_MATRIX_COEF00_01,
1233 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1234 vpp_reg_write(VPP_MATRIX_COEF02_10,
1235 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1236 vpp_reg_write(VPP_MATRIX_COEF11_12,
1237 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1238 vpp_reg_write(VPP_MATRIX_COEF20_21,
1239 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1240 vpp_reg_write(VPP_MATRIX_COEF22,
1241 m[11] & 0x1fff);
1242 if (m[21]) {
1243 vpp_reg_write(VPP_MATRIX_COEF13_14,
1244 ((m[12] & 0x1fff) << 16) | (m[13] & 0x1fff));
1245 vpp_reg_write(VPP_MATRIX_COEF15_25,
1246 ((m[14] & 0x1fff) << 16) | (m[17] & 0x1fff));
1247 vpp_reg_write(VPP_MATRIX_COEF23_24,
1248 ((m[15] & 0x1fff) << 16) | (m[16] & 0x1fff));
1249 }
1250 vpp_reg_write(VPP_MATRIX_OFFSET0_1,
1251 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1252 vpp_reg_write(VPP_MATRIX_OFFSET2,
1253 m[20] & 0xfff);
1254 vpp_reg_setb(VPP_MATRIX_CLIP,
1255 m[21], 3, 2);
1256 vpp_reg_setb(VPP_MATRIX_CLIP,
1257 m[22], 5, 3);
1258 }
1259#endif
1260}
1261
1262const char lut_name[4][16] = {
1263 "OSD_EOTF",
1264 "OSD_OETF",
1265 "EOTF",
1266 "OETF",
1267};
1268
1269#ifndef AML_S5_DISPLAY
1270void set_vpp_lut(
1271 enum vpp_lut_sel_e lut_sel,
1272 unsigned int *r,
1273 unsigned int *g,
1274 unsigned int *b,
1275 int on)
1276{
1277 unsigned int *r_map = NULL;
1278 unsigned int *g_map = NULL;
1279 unsigned int *b_map = NULL;
1280 unsigned int addr_port;
1281 unsigned int data_port;
1282 unsigned int ctrl_port;
1283 int i;
1284
1285 if (lut_sel == VPP_LUT_OSD_EOTF) {
1286 r_map = osd_eotf_r_mapping;
1287 g_map = osd_eotf_g_mapping;
1288 b_map = osd_eotf_b_mapping;
1289 addr_port = VIU_OSD1_EOTF_LUT_ADDR_PORT;
1290 data_port = VIU_OSD1_EOTF_LUT_DATA_PORT;
1291 ctrl_port = VIU_OSD1_EOTF_CTL;
1292 } else if (lut_sel == VPP_LUT_EOTF) {
1293 r_map = video_eotf_r_mapping;
1294 g_map = video_eotf_g_mapping;
1295 b_map = video_eotf_b_mapping;
1296 addr_port = VIU_EOTF_LUT_ADDR_PORT;
1297 data_port = VIU_EOTF_LUT_DATA_PORT;
1298 ctrl_port = VIU_EOTF_CTL;
1299 } else if (lut_sel == VPP_LUT_OSD_OETF) {
1300 r_map = osd_oetf_r_mapping;
1301 g_map = osd_oetf_g_mapping;
1302 b_map = osd_oetf_b_mapping;
1303 addr_port = VIU_OSD1_OETF_LUT_ADDR_PORT;
1304 data_port = VIU_OSD1_OETF_LUT_DATA_PORT;
1305 ctrl_port = VIU_OSD1_OETF_CTL;
1306 } else if (lut_sel == VPP_LUT_OETF) {
1307#if 0
1308 load_knee_lut(on);
1309 return;
1310#else
1311 r_map = video_oetf_r_mapping;
1312 g_map = video_oetf_g_mapping;
1313 b_map = video_oetf_b_mapping;
1314 addr_port = XVYCC_LUT_R_ADDR_PORT;
1315 data_port = XVYCC_LUT_R_DATA_PORT;
1316 ctrl_port = XVYCC_LUT_CTL;
1317#endif
1318 } else
1319 return;
1320
1321 if (lut_sel == VPP_LUT_OSD_OETF) {
1322 if (r && r_map)
1323 for (i = 0; i < OSD_OETF_LUT_SIZE; i++)
1324 r_map[i] = r[i];
1325 if (g && g_map)
1326 for (i = 0; i < OSD_OETF_LUT_SIZE; i++)
1327 g_map[i] = g[i];
1328 if (r && r_map)
1329 for (i = 0; i < OSD_OETF_LUT_SIZE; i++)
1330 b_map[i] = b[i];
1331 vpp_reg_write(addr_port, 0);
1332 for (i = 0; i < 20; i++)
1333 vpp_reg_write(data_port,
1334 r_map[i * 2]
1335 | (r_map[i * 2 + 1] << 16));
1336 vpp_reg_write(data_port,
1337 r_map[OSD_OETF_LUT_SIZE - 1]
1338 | (g_map[0] << 16));
1339 for (i = 0; i < 20; i++)
1340 vpp_reg_write(data_port,
1341 g_map[i * 2 + 1]
1342 | (g_map[i * 2 + 2] << 16));
1343 for (i = 0; i < 20; i++)
1344 vpp_reg_write(data_port,
1345 b_map[i * 2]
1346 | (b_map[i * 2 + 1] << 16));
1347 vpp_reg_write(data_port,
1348 b_map[OSD_OETF_LUT_SIZE - 1]);
1349 if (on)
1350 vpp_reg_setb(ctrl_port, 7, 29, 3);
1351 else
1352 vpp_reg_setb(ctrl_port, 0, 29, 3);
1353 } else if ((lut_sel == VPP_LUT_OSD_EOTF) || (lut_sel == VPP_LUT_EOTF)) {
1354 if (r && r_map)
1355 for (i = 0; i < EOTF_LUT_SIZE; i++)
1356 r_map[i] = r[i];
1357 if (g && g_map)
1358 for (i = 0; i < EOTF_LUT_SIZE; i++)
1359 g_map[i] = g[i];
1360 if (r && r_map)
1361 for (i = 0; i < EOTF_LUT_SIZE; i++)
1362 b_map[i] = b[i];
1363 vpp_reg_write(addr_port, 0);
1364 for (i = 0; i < 16; i++)
1365 vpp_reg_write(data_port,
1366 r_map[i * 2]
1367 | (r_map[i * 2 + 1] << 16));
1368 vpp_reg_write(data_port,
1369 r_map[EOTF_LUT_SIZE - 1]
1370 | (g_map[0] << 16));
1371 for (i = 0; i < 16; i++)
1372 vpp_reg_write(data_port,
1373 g_map[i * 2 + 1]
1374 | (g_map[i * 2 + 2] << 16));
1375 for (i = 0; i < 16; i++)
1376 vpp_reg_write(data_port,
1377 b_map[i * 2]
1378 | (b_map[i * 2 + 1] << 16));
1379 vpp_reg_write(data_port, b_map[EOTF_LUT_SIZE - 1]);
1380 if (on)
1381 vpp_reg_setb(ctrl_port, 7, 27, 3);
1382 else
1383 vpp_reg_setb(ctrl_port, 0, 27, 3);
1384 vpp_reg_setb(ctrl_port, 1, 31, 1);
1385 } else if (lut_sel == VPP_LUT_OETF) {
1386 if (r && r_map)
1387 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1388 r_map[i] = r[i];
1389 if (g && g_map)
1390 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1391 g_map[i] = g[i];
1392 if (r && r_map)
1393 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1394 b_map[i] = b[i];
1395 vpp_reg_write(ctrl_port, 0x0);
1396 vpp_reg_write(addr_port, 0);
1397 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1398 vpp_reg_write(data_port, r_map[i]);
1399 vpp_reg_write(addr_port + 2, 0);
1400 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1401 vpp_reg_write(data_port + 2, g_map[i]);
1402 vpp_reg_write(addr_port + 4, 0);
1403 for (i = 0; i < VIDEO_OETF_LUT_SIZE; i++)
1404 vpp_reg_write(data_port + 4, b_map[i]);
1405 if (on)
1406 vpp_reg_write(ctrl_port, 0x7f);
1407 else
1408 vpp_reg_write(ctrl_port, 0x0);
1409 }
1410}
1411#endif
1412
1413 /*
1414for G12A, set osd2 matrix(10bit) RGB2YUV
1415 */
1416 #ifndef AML_S5_DISPLAY
1417 static void set_osd1_rgb2yuv(bool on)
1418 {
1419 int *m = NULL;
hai.cao8b0d0bc2023-06-14 14:08:57 +08001420 u32 chip_id = get_cpu_id().family_id;
hai.cao8c827c02023-02-28 11:12:05 +08001421
1422 if (is_osd_high_version()) {
1423 /* RGB -> 709 limit */
1424 m = RGB709_to_YUV709l_coeff;
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00001425 if (chip_id != MESON_CPU_MAJOR_ID_S1A &&
1426 chip_id != MESON_CPU_MAJOR_ID_TXHD2) {
hai.cao8b0d0bc2023-06-14 14:08:57 +08001427 /* VPP WRAP OSD1 matrix */
1428 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_PRE_OFFSET0_1,
1429 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1430 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_PRE_OFFSET2,
1431 m[2] & 0xfff);
1432 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_COEF00_01,
1433 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1434 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_COEF02_10,
1435 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1436 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_COEF11_12,
1437 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1438 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_COEF20_21,
1439 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1440 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_COEF22,
1441 m[11] & 0x1fff);
hai.cao8c827c02023-02-28 11:12:05 +08001442
hai.cao8b0d0bc2023-06-14 14:08:57 +08001443 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_OFFSET0_1,
1444 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1445 vpp_reg_write(VPP_WRAP_OSD1_MATRIX_OFFSET2,
1446 m[20] & 0xfff);
hai.cao8c827c02023-02-28 11:12:05 +08001447
hai.cao8b0d0bc2023-06-14 14:08:57 +08001448 vpp_reg_setb(VPP_WRAP_OSD1_MATRIX_EN_CTRL, on, 0, 1);
1449 } else {
1450 vpp_reg_write(VPP_OSD1_MATRIX_PRE_OFFSET0_1,
1451 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1452 vpp_reg_write(VPP_OSD1_MATRIX_PRE_OFFSET2,
1453 m[2] & 0xfff);
1454 vpp_reg_write(VPP_OSD1_MATRIX_COEF00_01,
1455 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1456 vpp_reg_write(VPP_OSD1_MATRIX_COEF02_10,
1457 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1458 vpp_reg_write(VPP_OSD1_MATRIX_COEF11_12,
1459 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1460 vpp_reg_write(VPP_OSD1_MATRIX_COEF20_21,
1461 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1462 vpp_reg_write(VPP_OSD1_MATRIX_COEF22,
1463 m[11] & 0x1fff);
1464 vpp_reg_write(VPP_OSD1_MATRIX_OFFSET0_1,
1465 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1466 vpp_reg_write(VPP_OSD1_MATRIX_OFFSET2,
1467 m[20] & 0xfff);
1468 vpp_reg_setb(VPP_OSD1_MATRIX_EN_CTRL, on, 0, 1);
hai.cao8b0d0bc2023-06-14 14:08:57 +08001469 }
hai.cao8c827c02023-02-28 11:12:05 +08001470 VPP_PR("%s rgb2yuv on = %d..............\n", __func__, on);
1471 } else {
1472 vpp_reg_setb(VIU_OSD1_BLK0_CFG_W0, 0, 7, 1);
1473 /* eotf lut bypass */
1474 set_vpp_lut(VPP_LUT_OSD_EOTF,
1475 eotf_33_linear_mapping, /* R */
1476 eotf_33_linear_mapping, /* G */
1477 eotf_33_linear_mapping, /* B */
1478 CSC_OFF);
1479 /* eotf matrix bypass */
1480 set_vpp_matrix(VPP_MATRIX_OSD_EOTF,
1481 eotf_bypass_coeff,
1482 CSC_OFF);
1483 /* oetf lut bypass */
1484 set_vpp_lut(VPP_LUT_OSD_OETF,
1485 oetf_41_linear_mapping, /* R */
1486 oetf_41_linear_mapping, /* G */
1487 oetf_41_linear_mapping, /* B */
1488 CSC_OFF);
1489 /* osd matrix RGB709 to YUV709 limit */
1490 set_vpp_matrix(VPP_MATRIX_OSD,
1491 RGB709_to_YUV709l_coeff,
1492 CSC_ON);
1493 }
1494 }
1495
1496 /*
1497for G12A, set osd2 matrix(10bit) RGB2YUV
1498 */
1499static void set_osd2_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 OSD2 matrix */
1508 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_PRE_OFFSET0_1,
1509 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1510 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_PRE_OFFSET2,
1511 m[2] & 0xfff);
1512 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_COEF00_01,
1513 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1514 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_COEF02_10,
1515 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1516 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_COEF11_12,
1517 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1518 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_COEF20_21,
1519 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1520 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_COEF22,
1521 m[11] & 0x1fff);
1522
1523 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_OFFSET0_1,
1524 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1525 vpp_reg_write(VPP_WRAP_OSD2_MATRIX_OFFSET2,
1526 m[20] & 0xfff);
1527
1528 vpp_reg_setb(VPP_WRAP_OSD2_MATRIX_EN_CTRL, on, 0, 1);
1529
1530 VPP_PR("%s rgb2yuv on = %d..............\n", __func__, on);
1531 }
1532}
1533
1534 /*
1535for G12A, set osd3 matrix(10bit) RGB2YUV
1536 */
1537static void set_osd3_rgb2yuv(bool on)
1538{
1539 int *m = NULL;
1540
1541 if (is_osd_high_version()) {
1542 /* RGB -> 709 limit */
1543 m = RGB709_to_YUV709l_coeff;
1544
1545 /* VPP WRAP OSD3 matrix */
1546 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_PRE_OFFSET0_1,
1547 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1548 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_PRE_OFFSET2,
1549 m[2] & 0xfff);
1550 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_COEF00_01,
1551 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1552 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_COEF02_10,
1553 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1554 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_COEF11_12,
1555 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1556 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_COEF20_21,
1557 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1558 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_COEF22,
1559 m[11] & 0x1fff);
1560
1561 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_OFFSET0_1,
1562 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1563 vpp_reg_write(VPP_WRAP_OSD3_MATRIX_OFFSET2,
1564 m[20] & 0xfff);
1565
1566 vpp_reg_setb(VPP_WRAP_OSD3_MATRIX_EN_CTRL, on, 0, 1);
1567
1568 VPP_PR("%s rgb2yuv on = %d..............\n", __func__, on);
1569 }
1570}
1571
1572 /*
1573for T7, set osd4 matrix(10bit) RGB2YUV
1574 */
1575static void set_osd4_rgb2yuv(bool on)
1576{
1577 int *m = NULL;
1578
1579 if (is_osd_high_version()) {
1580 /* RGB -> 709 limit */
1581 m = RGB709_to_YUV709l_coeff;
1582
1583 /* VPP WRAP OSD3 matrix */
1584 vpp_reg_write(VIU_OSD4_MATRIX_PRE_OFFSET0_1,
1585 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1586 vpp_reg_write(VIU_OSD4_MATRIX_PRE_OFFSET2,
1587 m[2] & 0xfff);
1588 vpp_reg_write(VIU_OSD4_MATRIX_COEF00_01,
1589 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1590 vpp_reg_write(VIU_OSD4_MATRIX_COEF02_10,
1591 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1592 vpp_reg_write(VIU_OSD4_MATRIX_COEF11_12,
1593 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1594 vpp_reg_write(VIU_OSD4_MATRIX_COEF20_21,
1595 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1596 vpp_reg_write(VIU_OSD4_MATRIX_COEF22,
1597 m[11] & 0x1fff);
1598
1599 vpp_reg_write(VIU_OSD4_MATRIX_OFFSET0_1,
1600 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1601 vpp_reg_write(VIU_OSD4_MATRIX_OFFSET2,
1602 m[20] & 0xfff);
1603
1604 vpp_reg_setb(VIU_OSD4_MATRIX_EN_CTRL, on, 0, 1);
1605
1606 VPP_PR("T7 osd4 matrix rgb2yuv..............\n");
1607 }
1608}
1609#endif
1610
1611#ifndef AML_T7_DISPLAY
1612static void set_viu2_osd_matrix_rgb2yuv(bool on)
1613{
1614 int *m = RGB709_to_YUV709l_coeff;
1615
1616 /* RGB -> 709 limit */
1617 if (is_osd_high_version()) {
1618 /* VPP WRAP OSD3 matrix */
1619 vpp_reg_write(VIU2_OSD1_MATRIX_PRE_OFFSET0_1,
1620 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1621 vpp_reg_write(VIU2_OSD1_MATRIX_PRE_OFFSET2,
1622 m[2] & 0xfff);
1623 vpp_reg_write(VIU2_OSD1_MATRIX_COEF00_01,
1624 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1625 vpp_reg_write(VIU2_OSD1_MATRIX_COEF02_10,
1626 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1627 vpp_reg_write(VIU2_OSD1_MATRIX_COEF11_12,
1628 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1629 vpp_reg_write(VIU2_OSD1_MATRIX_COEF20_21,
1630 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1631 vpp_reg_write(VIU2_OSD1_MATRIX_COEF22,
1632 m[11] & 0x1fff);
1633
1634 vpp_reg_write(VIU2_OSD1_MATRIX_OFFSET0_1,
1635 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1636 vpp_reg_write(VIU2_OSD1_MATRIX_OFFSET2,
1637 m[20] & 0xfff);
1638
1639 vpp_reg_setb(VIU2_OSD1_MATRIX_EN_CTRL, on, 0, 1);
1640 }
1641}
1642#endif
1643
1644#ifndef AML_S5_DISPLAY
1645static void set_vpp_osd2_rgb2yuv(bool on)
1646{
1647 int *m = NULL;
1648
1649 /* RGB -> 709 limit */
1650 m = RGB709_to_YUV709l_coeff;
1651
1652 /* VPP WRAP OSD3 matrix */
1653 vpp_reg_write(VPP_OSD2_MATRIX_PRE_OFFSET0_1,
1654 ((m[0] & 0xfff) << 16) | (m[1] & 0xfff));
1655 vpp_reg_write(VPP_OSD2_MATRIX_PRE_OFFSET2,
1656 m[2] & 0xfff);
1657 vpp_reg_write(VPP_OSD2_MATRIX_COEF00_01,
1658 ((m[3] & 0x1fff) << 16) | (m[4] & 0x1fff));
1659 vpp_reg_write(VPP_OSD2_MATRIX_COEF02_10,
1660 ((m[5] & 0x1fff) << 16) | (m[6] & 0x1fff));
1661 vpp_reg_write(VPP_OSD2_MATRIX_COEF11_12,
1662 ((m[7] & 0x1fff) << 16) | (m[8] & 0x1fff));
1663 vpp_reg_write(VPP_OSD2_MATRIX_COEF20_21,
1664 ((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff));
1665 vpp_reg_write(VPP_OSD2_MATRIX_COEF22,
1666 m[11] & 0x1fff);
1667 vpp_reg_write(VPP_OSD2_MATRIX_OFFSET0_1,
1668 ((m[18] & 0xfff) << 16) | (m[19] & 0xfff));
1669 vpp_reg_write(VPP_OSD2_MATRIX_OFFSET2,
1670 m[20] & 0xfff);
1671 vpp_reg_setb(VPP_OSD2_MATRIX_EN_CTRL, on, 0, 1);
1672 VPP_PR("vpp osd2 matrix rgb2yuv..............\n");
1673}
1674#endif
1675
1676/*
1677for txlx, set vpp default data path to u10
1678 */
1679static void set_vpp_bitdepth(void)
1680{
1681 u32 chip_id = get_cpu_id().family_id;
1682
1683 if (is_osd_high_version()) {
1684 /*after this step vd1 output data is U12,*/
1685 if (chip_id == MESON_CPU_MAJOR_ID_T7) {
1686 /* osd dolby bypass en */
1687 vpp_reg_setb(MALI_AFBCD_TOP_CTRL, 1, 14, 1);
1688 vpp_reg_setb(MALI_AFBCD_TOP_CTRL, 1, 19, 1);
1689 /* osd_din_ext 12bit */
1690 vpp_reg_setb(MALI_AFBCD_TOP_CTRL, 0, 15, 1);
1691 vpp_reg_setb(MALI_AFBCD_TOP_CTRL, 0, 20, 1);
1692
1693 vpp_reg_setb(MALI_AFBCD1_TOP_CTRL, 1, 19, 1);
1694 vpp_reg_setb(MALI_AFBCD1_TOP_CTRL, 0, 20, 1);
1695
1696 vpp_reg_setb(MALI_AFBCD2_TOP_CTRL, 1, 19, 1);
1697 vpp_reg_setb(MALI_AFBCD2_TOP_CTRL, 0, 20, 1);
1698 } else {
1699 vpp_reg_write(DOLBY_PATH_CTRL, 0xf);
1700 }
1701 }
1702}
1703
1704/* osd+video brightness */
1705static void video_adj2_brightness(int val)
1706{
1707 if (val < -255)
1708 val = -255;
1709 else if (val > 255)
1710 val = 255;
1711
1712 VPP_PR("brightness_post:%d\n", val);
1713
1714 vpp_reg_setb(VPP_VADJ2_Y, val << 1, 8, 10);
1715
1716#ifndef AML_S5_DISPLAY
1717 vpp_reg_setb(VPP_VADJ_CTRL, 1, 2, 1);
1718#endif
1719}
1720
1721/* osd+video contrast */
1722static void video_adj2_contrast(int val)
1723{
1724 if (val < -127)
1725 val = -127;
1726 else if (val > 127)
1727 val = 127;
1728
1729 VPP_PR("contrast_post:%d\n", val);
1730
1731 val += 0x80;
1732
1733 vpp_reg_setb(VPP_VADJ2_Y, val, 0, 8);
1734#ifndef AML_S5_DISPLAY
1735 vpp_reg_setb(VPP_VADJ_CTRL, 1, 2, 1);
1736#endif
1737}
1738
1739/* osd+video saturation/hue */
1740static void amvecm_saturation_hue_post(int sat, int hue)
1741{
1742 int hue_post; /*-25~25*/
1743 int saturation_post; /*-128~127*/
1744 int i, ma, mb, mab, mc, md;
1745 int hue_cos[] = {
1746 /*0~12*/
1747 256, 256, 256, 255, 255, 254, 253, 252, 251, 250,
1748 248, 247, 245, 243, 241, 239, 237, 234, 231, 229,
1749 226, 223, 220, 216, 213, 209 /*13~25*/
1750 };
1751 int hue_sin[] = {
1752 -147, -142, -137, -132, -126, -121, -115, -109, -104,
1753 -98, -92, -86, -80, /*-25~-13*/-74, -68, -62, -56,
1754 -50, -44, -38, -31, -25, -19, -13, -6, /*-12~-1*/
1755 0, /*0*/
1756 6, 13, 19, 25, 31, 38, 44, 50, 56,
1757 62, 68, 74, /*1~12*/ 80, 86, 92, 98, 104,
1758 109, 115, 121, 126, 132, 137, 142, 147 /*13~25*/
1759 };
1760
1761 if (sat < -128)
1762 sat = -128;
1763 else if (sat > 128)
1764 sat = 128;
1765
1766 if (hue < -25)
1767 hue = -25;
1768 else if (hue > 25)
1769 hue = 25;
1770
1771 VPP_PR("saturation sat_post:%d hue_post:%d\n", sat, hue);
1772
1773 saturation_post = sat;
1774 hue_post = hue;
1775 i = (hue_post > 0) ? hue_post : -hue_post;
1776 ma = (hue_cos[i]*(saturation_post + 128)) >> 7;
1777 mb = (hue_sin[25+hue_post]*(saturation_post + 128)) >> 7;
1778 if (ma > 511)
1779 ma = 511;
1780 if (ma < -512)
1781 ma = -512;
1782 if (mb > 511)
1783 mb = 511;
1784 if (mb < -512)
1785 mb = -512;
1786 mab = ((ma & 0x3ff) << 16) | (mb & 0x3ff);
1787
1788 vpp_reg_write(VPP_VADJ2_MA_MB, mab);
1789 mc = (s16)((mab<<22)>>22); /* mc = -mb */
1790 mc = 0 - mc;
1791 if (mc > 511)
1792 mc = 511;
1793 if (mc < -512)
1794 mc = -512;
1795 md = (s16)((mab<<6)>>22); /* md = ma; */
1796 mab = ((mc&0x3ff)<<16)|(md&0x3ff);
1797
1798 vpp_reg_write(VPP_VADJ2_MC_MD, mab);
1799#ifndef AML_S5_DISPLAY
1800 vpp_reg_setb(VPP_VADJ_CTRL, 1, 2, 1);
1801#endif
1802}
1803
1804/* init osd+video brightness/contrast/saturaion/hue */
1805void vpp_pq_init(int brightness, int contrast, int sat, int hue)
1806{
1807 video_adj2_brightness(brightness);
1808 video_adj2_contrast(contrast);
1809 amvecm_saturation_hue_post(sat, hue);
1810}
1811
1812void vpp_pq_load(void)
1813{
1814 int i = 0, cnt = 0;
1815 char const *pq = env_get("pq");
1816 char *tk, *str, *tmp[4];
1817 short val[4];
1818
1819 if (pq == NULL) {
1820 VPP_PR("%s pq val error !!!\n", __func__);
1821 return;
1822 }
1823
1824 str = strdup(pq);
1825
1826 for (tk = strsep(&str, ","); tk != NULL; tk = strsep(&str, ",")) {
1827 tmp[cnt] = tk;
1828
1829 if (++cnt > 3)
1830 break;
1831 }
1832
1833 if (cnt == 4) {
1834 for (i = 0; i < 4; i++) {
1835 val[i] = simple_strtol(tmp[i], NULL, 10);
1836 /* VPP_PR("pq[%d]: %d\n", i, val[i]); */
1837 }
1838 vpp_pq_init(val[0], val[1], val[2], val[3]);
1839 }
1840}
1841
1842void vpp_load_gamma_table(unsigned short *data, unsigned int len, enum vpp_gamma_sel_e flag)
1843{
1844 unsigned short *table = NULL;
1845 unsigned int i;
1846
1847 switch (flag) {
1848 case VPP_GAMMA_R:
1849 table = gamma_table_r;
1850 break;
1851 case VPP_GAMMA_G:
1852 table = gamma_table_g;
1853 break;
1854 case VPP_GAMMA_B:
1855 table = gamma_table_b;
1856 break;
1857 default:
1858 break;
1859 }
1860 if (table == NULL) {
1861 VPP_PR("error: %s: invalid flag: %d\n", __func__, flag);
1862 return;
1863 }
1864 if (len != GAMMA_SIZE) {
1865 VPP_PR("error: %s: invalid len: %d\n", __func__, len);
1866 return;
1867 }
1868
1869 for (i = 0; i < GAMMA_SIZE; i++)
1870 table[i] = data[i];
1871 VPP_PR("%s: successful\n", __func__);
1872}
1873
1874void vpp_enable_lcd_gamma_table(int index)
1875{
1876 unsigned int reg;
1877
1878 if (get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_T7) {
1879 switch (index) {
1880 case 1:
1881 reg = LCD_GAMMA_CNTL_PORT0 + 0x100;
1882 break;
1883 case 2:
1884 reg = LCD_GAMMA_CNTL_PORT0 + 0x200;
1885 break;
1886 case 0:
1887 default:
1888 reg = LCD_GAMMA_CNTL_PORT0;
1889 break;
1890 }
1891 } else {
1892 reg = L_GAMMA_CNTL_PORT;
1893 }
1894
1895 vpp_reg_setb(reg, 1, GAMMA_EN, 1);
1896}
1897
1898void vpp_disable_lcd_gamma_table(int index)
1899{
1900 unsigned int reg;
1901
1902 if (get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_T7) {
1903 switch (index) {
1904 case 1:
1905 reg = LCD_GAMMA_CNTL_PORT0 + 0x100;
1906 break;
1907 case 2:
1908 reg = LCD_GAMMA_CNTL_PORT0 + 0x200;
1909 break;
1910 case 0:
1911 default:
1912 reg = LCD_GAMMA_CNTL_PORT0;
1913 break;
1914 }
1915 } else {
1916 reg = L_GAMMA_CNTL_PORT;
1917 }
1918 vpp_reg_setb(reg, 0, GAMMA_EN, 1);
1919}
1920
1921#define GAMMA_RETRY 1000
1922static void vpp_set_lcd_gamma_table(int index, u16 *data, u32 rgb_mask)
1923{
1924 unsigned int reg_encl_en, reg_cntl_port, reg_data_port, reg_addr_port;
1925 int i;
1926 int cnt = 0;
1927
1928 if (get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_T7) {
1929 switch (index) {
1930 case 1:
1931 reg_encl_en = ENCL_VIDEO_EN + 0x600;
1932 reg_cntl_port = LCD_GAMMA_CNTL_PORT0 + 0x100;
1933 reg_data_port = LCD_GAMMA_DATA_PORT0 + 0x100;
1934 reg_addr_port = LCD_GAMMA_ADDR_PORT0 + 0x100;
1935 break;
1936 case 2:
1937 reg_encl_en = ENCL_VIDEO_EN + 0x800;
1938 reg_cntl_port = LCD_GAMMA_CNTL_PORT0 + 0x200;
1939 reg_data_port = LCD_GAMMA_DATA_PORT0 + 0x200;
1940 reg_addr_port = LCD_GAMMA_ADDR_PORT0 + 0x200;
1941 break;
1942 case 0:
1943 default:
1944 reg_encl_en = ENCL_VIDEO_EN;
1945 reg_cntl_port = LCD_GAMMA_CNTL_PORT0;
1946 reg_data_port = LCD_GAMMA_DATA_PORT0;
1947 reg_addr_port = LCD_GAMMA_ADDR_PORT0;
1948 break;
1949 }
1950 } else {
1951 reg_encl_en = ENCL_VIDEO_EN;
1952 reg_cntl_port = L_GAMMA_CNTL_PORT;
1953 reg_data_port = L_GAMMA_DATA_PORT;
1954 reg_addr_port = L_GAMMA_ADDR_PORT;
1955 }
1956
1957 if (get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_T7) {
1958 if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_T5M) {
1959 vpp_reg_write(reg_addr_port, (1 << 9));
1960 for (i = 0; i < 256; i++)
1961 vpp_reg_write(reg_data_port,
1962 (data[i] << 20) |
1963 (data[i] << 10) |
1964 (data[i] << 0));
1965 vpp_reg_write(reg_data_port,
1966 (0x3ff << 20) |
1967 (0x3ff << 10) |
1968 (0x3ff << 0));
1969 } else {
1970 vpp_reg_write(reg_addr_port, (1 << 8));
1971 for (i = 0; i < 256; i++)
1972 vpp_reg_write(reg_data_port,
1973 (data[i] << 20) |
1974 (data[i] << 10) |
1975 (data[i] << 0));
1976 }
1977 return;
1978 }
1979
1980 if (!(vpp_reg_read(reg_encl_en) & 0x1))
1981 return;
1982
1983 vpp_reg_setb(reg_cntl_port, 0, GAMMA_EN, 1);
1984
1985 while (!(vpp_reg_read(reg_cntl_port) & (0x1 << ADR_RDY))) {
1986 udelay(10);
1987 if (cnt++ > GAMMA_RETRY)
1988 break;
1989 }
1990 cnt = 0;
1991 vpp_reg_write(reg_addr_port, (0x1 << H_AUTO_INC) |
1992 (0x1 << rgb_mask) |
1993 (0x0 << HADR));
1994 for (i = 0; i < 256; i++) {
1995 while (!(vpp_reg_read(reg_cntl_port) & (0x1 << WR_RDY))) {
1996 udelay(10);
1997 if (cnt++ > GAMMA_RETRY)
1998 break;
1999 }
2000 cnt = 0;
2001 vpp_reg_write(reg_data_port, data[i]);
2002 }
2003 while (!(vpp_reg_read(reg_cntl_port) & (0x1 << ADR_RDY))) {
2004 udelay(10);
2005 if (cnt++ > GAMMA_RETRY)
2006 break;
2007 }
2008 vpp_reg_write(reg_addr_port, (0x1 << H_AUTO_INC) |
2009 (0x1 << rgb_mask) |
2010 (0x23 << HADR));
2011
2012}
2013
2014void vpp_init_lcd_gamma_table(int index)
2015{
2016 VPP_PR("%s\n", __func__);
2017
2018 vpp_disable_lcd_gamma_table(index);
2019
2020 vpp_set_lcd_gamma_table(index, gamma_table_r, H_SEL_R);
2021 vpp_set_lcd_gamma_table(index, gamma_table_g, H_SEL_G);
2022 vpp_set_lcd_gamma_table(index, gamma_table_b, H_SEL_B);
2023
2024 vpp_enable_lcd_gamma_table(index);
2025}
2026
2027void vpp_matrix_update(int type)
2028{
2029 if (vpp_init_flag == 0)
2030 return;
2031
2032 switch (type) {
2033 case VPP_CM_RGB:
2034 /* 709 limit to RGB */
2035 vpp_set_matrix_ycbcr2rgb(2, 3);
2036 break;
2037 case VPP_CM_YUV:
2038 break;
2039 default:
2040 break;
2041 }
2042}
2043
2044void vpp_viu2_matrix_update(int type)
2045{
2046 if (vpp_init_flag == 0)
2047 return;
2048
2049 if (get_cpu_id().family_id < MESON_CPU_MAJOR_ID_G12A)
2050 return;
2051
2052 switch (type) {
2053 case VPP_CM_RGB:
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002054 #if defined(AML_T7_DISPLAY)
hai.cao8c827c02023-02-28 11:12:05 +08002055 /* vpp_top1: yuv2rgb */
2056 vpp_top_post2_matrix_yuv2rgb(1);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002057 #elif defined(AML_S5_DISPLAY)
2058 /* vpp_top1: use vpp post csc to do yuv2rgb */
2059 #else
2060 /* default RGB */
2061 set_viu2_osd_matrix_rgb2yuv(0);
hai.cao8c827c02023-02-28 11:12:05 +08002062 #endif
2063 break;
2064 case VPP_CM_YUV:
2065 /* RGB to 709 limit */
2066 #ifndef AML_T7_DISPLAY
2067 set_viu2_osd_matrix_rgb2yuv(1);
2068 #endif
2069 break;
2070 default:
2071 break;
2072 }
2073}
2074
2075void vpp_viu3_matrix_update(int type)
2076{
2077 if (vpp_init_flag == 0)
2078 return;
2079
2080 if (get_cpu_id().family_id < MESON_CPU_MAJOR_ID_G12A)
2081 return;
2082
2083 switch (type) {
2084 case VPP_CM_RGB:
2085 /* default RGB */
2086 //#ifndef AML_T7_DISPLAY
2087 //set_viu_osd_matrix_rgb2yuv(0);
2088 //#else
2089 /* vpp_top2: yuv2rgb */
2090 vpp_top_post2_matrix_yuv2rgb(2);
2091 //#endif
2092 break;
2093 case VPP_CM_YUV:
2094 /* RGB to 709 limit */
2095 #ifndef AML_T7_DISPLAY
2096 //set_viu2_osd_matrix_rgb2yuv(2);
2097 #endif
2098 break;
2099 default:
2100 break;
2101 }
2102}
2103
2104static void vpp_ofifo_init(void)
2105{
2106 unsigned int data32;
2107
2108 data32 = vpp_reg_read(VPP_OFIFO_SIZE);
hai.cao12deab32023-08-07 14:38:48 +08002109 if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_S1A)
2110 data32 |= 0x7ff;
2111 else
2112 data32 |= 0xfff;
hai.cao8c827c02023-02-28 11:12:05 +08002113 vpp_reg_write(VPP_OFIFO_SIZE, data32);
2114
2115 data32 = 0x08080808;
2116#ifndef AML_S5_DISPLAY
2117 vpp_reg_write(VPP_HOLD_LINES, data32);
2118#endif
2119}
2120
2121#ifdef CONFIG_AML_HDMITX
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002122static void amvecm_cp_hdr_info(struct master_display_info_s *hdr_data,
2123 enum force_output_format output_format)
hai.cao8c827c02023-02-28 11:12:05 +08002124{
2125 int i, j;
2126
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002127 switch (output_format) {
2128 case BT2020_PQ:
2129 hdr_data->features =
2130 (0 << 30) /*sdr output 709*/
2131 | (1 << 29) /*video available*/
2132 | (5 << 26) /* unspecified */
2133 | (0 << 25) /* limit */
2134 | (1 << 24) /*color available*/
2135 | (9 << 16)
2136 | (16 << 8)
2137 | (10 << 0); /* bt2020c */
2138 break;
2139 case BT2020_HLG:
2140 hdr_data->features =
2141 (0 << 30) /*sdr output 709*/
2142 | (1 << 29) /*video available*/
2143 | (5 << 26) /* unspecified */
2144 | (0 << 25) /* limit */
2145 | (1 << 24) /*color available*/
2146 | (9 << 16)
2147 | (18 << 8)
2148 | (10 << 0);
2149 break;
2150 case UNKNOWN_FMT:
2151 return;
2152 }
hai.cao8c827c02023-02-28 11:12:05 +08002153
2154 for (i = 0; i < 3; i++)
2155 for (j = 0; j < 2; j++)
2156 hdr_data->primaries[i][j] =
2157 bt2020_primaries[i][j];
2158 hdr_data->white_point[0] = bt2020_white_point[0];
2159 hdr_data->white_point[1] = bt2020_white_point[1];
2160 /* default luminance */
2161 hdr_data->luminance[0] = 1000 * 10000;
2162 hdr_data->luminance[1] = 50;
2163
2164 /* content_light_level */
2165 hdr_data->max_content = 0;
2166 hdr_data->max_frame_average = 0;
2167 hdr_data->luminance[0] = hdr_data->luminance[0] / 10000;
2168 hdr_data->present_flag = 1;
2169}
2170#endif
2171
2172void hdr_tx_pkt_cb(void)
2173{
2174 int hdr_policy = 0;
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002175 int hdr_force_mode = 0; /*0: no force, 3: force hdr, 5: force hlg*/
hai.cao8c827c02023-02-28 11:12:05 +08002176#ifdef CONFIG_AML_HDMITX
2177 struct master_display_info_s hdr_data;
2178 struct hdr_info *hdrinfo = NULL;
2179#endif
2180 const char *hdr_policy_env = env_get("hdr_policy");
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002181 const char *hdr_force_mode_env = env_get("hdr_force_mode");
hai.cao8c827c02023-02-28 11:12:05 +08002182
2183 if (!hdr_policy_env)
2184 return;
2185
Huijuan Xiaoc3788dd2024-03-25 11:50:38 +00002186 if (get_cpu_id().family_id == MESON_CPU_MAJOR_ID_S1A)
2187 return;
2188
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002189 if (hdr_force_mode_env)
2190 hdr_force_mode = simple_strtoul(hdr_force_mode_env, NULL, 10);
qinghui.jiang3406ce52023-08-16 10:40:39 +00002191
hai.cao8c827c02023-02-28 11:12:05 +08002192 hdr_policy = simple_strtoul(hdr_policy_env, NULL, 10);
2193#ifdef CONFIG_AML_HDMITX
2194 hdrinfo = hdmitx_get_rx_hdr_info();
2195
xiang.wu114497ab2024-02-21 14:57:05 +08002196 if ((hdrinfo && (hdrinfo->hdr_support & HDR_SUP_EOTF_SMPTE_ST_2084)) &&
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002197 (hdr_policy == 0 || hdr_policy == 3)) {
hai.cao8c827c02023-02-28 11:12:05 +08002198 if (is_hdmi_mode(env_get("outputmode"))) {
2199 hdr_func(OSD1_HDR, SDR_HDR);
2200 hdr_func(OSD2_HDR, SDR_HDR);
2201 hdr_func(VD1_HDR, SDR_HDR);
2202 }
2203 if (is_hdmi_mode(env_get("outputmode2")))
2204 hdr_func(OSD3_HDR, SDR_HDR);
2205 if (is_hdmi_mode(env_get("outputmode3")))
2206 hdr_func(OSD4_HDR, SDR_HDR);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002207 amvecm_cp_hdr_info(&hdr_data, BT2020_PQ);
2208 hdmitx_set_drm_pkt(&hdr_data);
Huijuan Xiaof97ae152024-04-02 02:13:05 +00002209 } else if ((hdrinfo && (hdrinfo->hdr_support & HDR_SUP_EOTF_HLG)) &&
2210 (hdr_policy == 0 || hdr_policy == 3)) {
2211 if (is_hdmi_mode(env_get("outputmode"))) {
2212 hdr_func(OSD1_HDR, SDR_HLG);
2213 hdr_func(OSD2_HDR, SDR_HLG);
2214 hdr_func(VD1_HDR, SDR_HLG);
2215 }
2216 if (is_hdmi_mode(env_get("outputmode2")))
2217 hdr_func(OSD3_HDR, SDR_HLG);
2218 if (is_hdmi_mode(env_get("outputmode3")))
2219 hdr_func(OSD4_HDR, SDR_HLG);
2220 amvecm_cp_hdr_info(&hdr_data, BT2020_HLG);
2221 hdmitx_set_drm_pkt(&hdr_data);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002222 }
2223
2224 if ((hdrinfo && (hdrinfo->hdr_support & HDR_SUP_EOTF_SMPTE_ST_2084)) &&
2225 hdr_policy == 4 && hdr_force_mode == 3) {
2226 if (is_hdmi_mode(env_get("outputmode"))) {
2227 hdr_func(OSD1_HDR, SDR_HDR);
2228 hdr_func(OSD2_HDR, SDR_HDR);
2229 hdr_func(VD1_HDR, SDR_HDR);
2230 }
2231 if (is_hdmi_mode(env_get("outputmode2")))
2232 hdr_func(OSD3_HDR, SDR_HDR);
2233 if (is_hdmi_mode(env_get("outputmode3")))
2234 hdr_func(OSD4_HDR, SDR_HDR);
2235 amvecm_cp_hdr_info(&hdr_data, BT2020_PQ);
2236 hdmitx_set_drm_pkt(&hdr_data);
2237 }
2238
2239 if ((hdrinfo && (hdrinfo->hdr_support & HDR_SUP_EOTF_HLG)) &&
2240 hdr_policy == 4 && hdr_force_mode == 5) {
2241 if (is_hdmi_mode(env_get("outputmode"))) {
2242 hdr_func(OSD1_HDR, SDR_HLG);
2243 hdr_func(OSD2_HDR, SDR_HLG);
2244 hdr_func(VD1_HDR, SDR_HLG);
2245 }
2246 if (is_hdmi_mode(env_get("outputmode2")))
2247 hdr_func(OSD3_HDR, SDR_HLG);
2248 if (is_hdmi_mode(env_get("outputmode3")))
2249 hdr_func(OSD4_HDR, SDR_HLG);
2250 amvecm_cp_hdr_info(&hdr_data, BT2020_HLG);
hai.cao8c827c02023-02-28 11:12:05 +08002251 hdmitx_set_drm_pkt(&hdr_data);
2252 }
2253#endif
2254
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002255 VPP_PR("hdr_policy = %d, hdr_force_mode = %d\n",
2256 hdr_policy, hdr_force_mode);
hai.cao8c827c02023-02-28 11:12:05 +08002257#ifdef CONFIG_AML_HDMITX
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002258 if (hdrinfo) {
hai.cao8c827c02023-02-28 11:12:05 +08002259 VPP_PR("Rx hdr_info.hdr_sup_eotf_smpte_st_2084 = %d\n",
xiang.wu114497ab2024-02-21 14:57:05 +08002260 !!(hdrinfo->hdr_support & HDR_SUP_EOTF_SMPTE_ST_2084));
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002261 VPP_PR("Rx hdr_info.hdr_sup_eotf_hlg = %d\n",
2262 !!(hdrinfo->hdr_support & HDR_SUP_EOTF_HLG));
2263 }
hai.cao8c827c02023-02-28 11:12:05 +08002264#endif
2265}
2266
2267static bool is_vpp_supported(int chip_id)
2268{
2269 if ((chip_id == MESON_CPU_MAJOR_ID_A1) ||
2270 (chip_id == MESON_CPU_MAJOR_ID_C1) ||
2271 (chip_id == MESON_CPU_MAJOR_ID_C2))
2272 return false;
2273 else
2274 return true;
2275}
2276
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002277static void vpp_wb_init_reg(void)
2278{
2279 int chip_id;
2280
2281 chip_id = vpp_get_chip_type();
2282
2283 if (chip_id != MESON_CPU_MAJOR_ID_T3X)
2284 return;
2285
2286 vpp_reg_write(0x2550, 0x84000400);
2287 vpp_reg_write(0x2650, 0x84000400);
2288
2289 /* vpp_reg_write(0x2550, 0xc4000400); */
2290 /* vpp_reg_write(0x2650, 0xc4000400); */
2291 vpp_reg_write(0x2551, 0x04000000);
2292 vpp_reg_write(0x2651, 0x04000000);
2293 vpp_reg_write(0x2552, 0x00000000);
2294 vpp_reg_write(0x2652, 0x00000000);
2295 vpp_reg_write(0x2553, 0x00000000);
2296 vpp_reg_write(0x2653, 0x00000000);
2297 vpp_reg_write(0x2554, 0x00000000);
2298 vpp_reg_write(0x2654, 0x00000000);
2299}
2300
hai.cao8c827c02023-02-28 11:12:05 +08002301void vpp_init(void)
2302{
2303 int chip_id;
2304
2305 chip_id = vpp_get_chip_type();
2306 VPP_PR("%s, chip_id=%d\n", __func__, chip_id);
2307 if (!is_vpp_supported(chip_id)) {
2308 VPP_PR("%s, vpp not supported\n", __func__);
2309 return;
2310 }
2311 vpp_init_flag = 1;
2312
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002313 if (chip_id == MESON_CPU_MAJOR_ID_T3X)
2314 vpp_wb_init_reg();
2315
hai.cao8c827c02023-02-28 11:12:05 +08002316 /* init vpu fifo control register */
2317 vpp_ofifo_init();
2318
2319#ifndef AML_S5_DISPLAY
2320 vpp_set_matrix_default_init();
2321#endif
2322
2323 if (is_osd_high_version()) {
2324 /* >= g12a: osd out is rgb */
2325#ifndef AML_S5_DISPLAY
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002326 if (chip_id != MESON_CPU_MAJOR_ID_S1A &&
2327 chip_id != MESON_CPU_MAJOR_ID_TXHD2)
hai.cao8b0d0bc2023-06-14 14:08:57 +08002328 set_osd1_rgb2yuv(0);
2329 else
2330 set_osd1_rgb2yuv(1);
hai.cao8c827c02023-02-28 11:12:05 +08002331 set_osd2_rgb2yuv(0);
2332 if (chip_id != MESON_CPU_MAJOR_ID_TL1 &&
hai.cao8b0d0bc2023-06-14 14:08:57 +08002333 chip_id != MESON_CPU_MAJOR_ID_S4 &&
yuhua.linacab7682024-01-11 14:30:57 +08002334 chip_id != MESON_CPU_MAJOR_ID_S1A &&
hai.caoc06b31d2024-04-05 13:53:01 +08002335 chip_id != MESON_CPU_MAJOR_ID_S7 &&
2336 chip_id != MESON_CPU_MAJOR_ID_S7D)
hai.cao8c827c02023-02-28 11:12:05 +08002337 set_osd3_rgb2yuv(0);
2338
2339 if (chip_id != MESON_CPU_MAJOR_ID_T7)
2340 set_vpp_osd2_rgb2yuv(1);
2341 else
2342 set_osd4_rgb2yuv(0);
Huijuan Xiaobc39cb62024-03-21 06:58:33 +00002343
2344 /*txhd2 enable keystone in uboot need disable osd2 matrix*/
2345 if (chip_id == MESON_CPU_MAJOR_ID_TXHD2) {
2346 char *enable_flag;
2347
2348 enable_flag = env_get("vout_projector_mux");
2349 if (enable_flag && !strcmp(enable_flag, "enable"))
2350 set_vpp_osd2_rgb2yuv(0);
2351 }
2352
hai.cao8c827c02023-02-28 11:12:05 +08002353#endif
2354 /* set vpp data path to u12 */
2355 set_vpp_bitdepth();
2356 hdr_func(OSD1_HDR, HDR_BYPASS | RGB_OSD);
2357 hdr_func(OSD2_HDR, HDR_BYPASS | RGB_OSD);
2358 hdr_func(OSD3_HDR, HDR_BYPASS | RGB_OSD);
2359 hdr_func(OSD4_HDR, HDR_BYPASS | RGB_OSD);
2360 hdr_func(VD1_HDR, HDR_BYPASS);
2361 hdr_func(VD2_HDR, HDR_BYPASS);
2362 } else {
2363 /* set dummy data default YUV black */
2364#ifndef AML_S5_DISPLAY
2365 vpp_reg_write(VPP_DUMMY_DATA1, 0x108080);
2366 /* osd1: rgb->yuv limit , osd2: yuv limit */
2367 set_osd1_rgb2yuv(1);
2368#endif
2369 }
2370}