1*ab3bc873SGuochun Huang // SPDX-License-Identifier: GPL-2.0+
2*ab3bc873SGuochun Huang /*
3*ab3bc873SGuochun Huang * (C) Copyright 2022 Rockchip Electronics Co., Ltd
4*ab3bc873SGuochun Huang */
5*ab3bc873SGuochun Huang
6*ab3bc873SGuochun Huang #include <common.h>
7*ab3bc873SGuochun Huang #include <dm.h>
8*ab3bc873SGuochun Huang #include <errno.h>
9*ab3bc873SGuochun Huang #include <i2c.h>
10*ab3bc873SGuochun Huang #include <linux/iopoll.h>
11*ab3bc873SGuochun Huang
12*ab3bc873SGuochun Huang #include "rk628.h"
13*ab3bc873SGuochun Huang #include "rk628_cru.h"
14*ab3bc873SGuochun Huang #include "rk628_post_process.h"
15*ab3bc873SGuochun Huang
16*ab3bc873SGuochun Huang #define PQ_CSC_HUE_TABLE_NUM 256
17*ab3bc873SGuochun Huang #define PQ_CSC_MODE_COEF_COMMENT_LEN 32
18*ab3bc873SGuochun Huang #define PQ_CSC_SIMPLE_MAT_PARAM_FIX_BIT_WIDTH 10
19*ab3bc873SGuochun Huang #define PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM (1 << PQ_CSC_SIMPLE_MAT_PARAM_FIX_BIT_WIDTH)
20*ab3bc873SGuochun Huang
21*ab3bc873SGuochun Huang #define PQ_CALC_ENHANCE_BIT 6
22*ab3bc873SGuochun Huang /* csc convert coef fixed-point num bit width */
23*ab3bc873SGuochun Huang #define PQ_CSC_PARAM_FIX_BIT_WIDTH 10
24*ab3bc873SGuochun Huang /* csc convert coef half fixed-point num bit width */
25*ab3bc873SGuochun Huang #define PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH (PQ_CSC_PARAM_FIX_BIT_WIDTH - 1)
26*ab3bc873SGuochun Huang /* csc convert coef fixed-point num */
27*ab3bc873SGuochun Huang #define PQ_CSC_PARAM_FIX_NUM (1 << PQ_CSC_PARAM_FIX_BIT_WIDTH)
28*ab3bc873SGuochun Huang #define PQ_CSC_PARAM_HALF_FIX_NUM (1 << PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH)
29*ab3bc873SGuochun Huang /* csc input param bit width */
30*ab3bc873SGuochun Huang #define PQ_CSC_IN_PARAM_NORM_BIT_WIDTH 9
31*ab3bc873SGuochun Huang /* csc input param normalization coef */
32*ab3bc873SGuochun Huang #define PQ_CSC_IN_PARAM_NORM_COEF (1 << PQ_CSC_IN_PARAM_NORM_BIT_WIDTH)
33*ab3bc873SGuochun Huang
34*ab3bc873SGuochun Huang /* csc hue table range [0,255] */
35*ab3bc873SGuochun Huang #define PQ_CSC_HUE_TABLE_DIV_COEF 2
36*ab3bc873SGuochun Huang /* csc brightness offset */
37*ab3bc873SGuochun Huang #define PQ_CSC_BRIGHTNESS_OFFSET 256
38*ab3bc873SGuochun Huang
39*ab3bc873SGuochun Huang /* dc coef base bit width */
40*ab3bc873SGuochun Huang #define PQ_CSC_DC_COEF_BASE_BIT_WIDTH 10
41*ab3bc873SGuochun Huang /* input dc coef offset for 10bit data */
42*ab3bc873SGuochun Huang #define PQ_CSC_DC_IN_OFFSET 64
43*ab3bc873SGuochun Huang /* input and output dc coef offset for 10bit data u,v */
44*ab3bc873SGuochun Huang #define PQ_CSC_DC_IN_OUT_DEFAULT 512
45*ab3bc873SGuochun Huang /* r,g,b color temp div coef, range [-128,128] for 10bit data */
46*ab3bc873SGuochun Huang #define PQ_CSC_TEMP_OFFSET_DIV_COEF 2
47*ab3bc873SGuochun Huang
48*ab3bc873SGuochun Huang #define MAX(a, b) ((a) > (b) ? (a) : (b))
49*ab3bc873SGuochun Huang #define MIN(a, b) ((a) < (b) ? (a) : (b))
50*ab3bc873SGuochun Huang #define CLIP(x, min_v, max_v) MIN(MAX(x, min_v), max_v)
51*ab3bc873SGuochun Huang
52*ab3bc873SGuochun Huang #define V4L2_COLORSPACE_BT709F 0xfe
53*ab3bc873SGuochun Huang #define V4L2_COLORSPACE_BT2020F 0xff
54*ab3bc873SGuochun Huang
55*ab3bc873SGuochun Huang enum vop_csc_bit_depth {
56*ab3bc873SGuochun Huang CSC_10BIT_DEPTH,
57*ab3bc873SGuochun Huang CSC_13BIT_DEPTH,
58*ab3bc873SGuochun Huang };
59*ab3bc873SGuochun Huang
60*ab3bc873SGuochun Huang enum rk_pq_csc_mode {
61*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGB_601 = 0, /* YCbCr_601 LIMIT-> RGB FULL */
62*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGB_709, /* YCbCr_709 LIMIT-> RGB FULL */
63*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV_601, /* RGB FULL->YCbCr_601 LIMIT */
64*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV_709, /* RGB FULL->YCbCr_709 LIMIT */
65*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_709_601, /* YCbCr_709 LIMIT->YCbCr_601 LIMIT */
66*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_601_709, /* YCbCr_601 LIMIT->YCbCr_709 LIMIT */
67*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV, /* YCbCr LIMIT->YCbCr LIMIT */
68*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGB_601_FULL, /* YCbCr_601 FULL-> RGB FULL */
69*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGB_709_FULL, /* YCbCr_709 FULL-> RGB FULL */
70*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV_601_FULL, /* RGB FULL->YCbCr_601 FULL */
71*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV_709_FULL, /* RGB FULL->YCbCr_709 FULL */
72*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_709_601_FULL, /* YCbCr_709 FULL->YCbCr_601 FULL */
73*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_601_709_FULL, /* YCbCr_601 FULL->YCbCr_709 FULL */
74*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_FULL, /* YCbCr FULL->YCbCr FULL */
75*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_LIMIT2FULL, /* YCbCr LIMIT->YCbCr FULL */
76*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_601_709_LIMIT2FULL, /* YCbCr 601 LIMIT->YCbCr 709 FULL */
77*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_709_601_LIMIT2FULL, /* YCbCr 709 LIMIT->YCbCr 601 FULL */
78*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_FULL2LIMIT, /* YCbCr FULL->YCbCr LIMIT */
79*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_601_709_FULL2LIMIT, /* YCbCr 601 FULL->YCbCr 709 LIMIT */
80*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_709_601_FULL2LIMIT, /* YCbCr 709 FULL->YCbCr 601 LIMIT */
81*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGBL_601, /* YCbCr_601 LIMIT-> RGB LIMIT */
82*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGBL_709, /* YCbCr_709 LIMIT-> RGB LIMIT */
83*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2YUV_601, /* RGB LIMIT->YCbCr_601 LIMIT */
84*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2YUV_709, /* RGB LIMIT->YCbCr_709 LIMIT */
85*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGBL_601_FULL, /* YCbCr_601 FULL-> RGB LIMIT */
86*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGBL_709_FULL, /* YCbCr_709 FULL-> RGB LIMIT */
87*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2YUV_601_FULL, /* RGB LIMIT->YCbCr_601 FULL */
88*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2YUV_709_FULL, /* RGB LIMIT->YCbCr_709 FULL */
89*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2RGBL, /* RGB FULL->RGB LIMIT */
90*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2RGB, /* RGB LIMIT->RGB FULL */
91*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2RGBL, /* RGB LIMIT->RGB LIMIT */
92*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2RGB, /* RGB FULL->RGB FULL */
93*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGB_2020, /* YUV 2020 FULL->RGB 2020 FULL */
94*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV2020_LIMIT2FULL, /* BT2020RGBLIMIT -> BT2020YUVFULL */
95*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV2020_LIMIT, /* BT2020RGBLIMIT -> BT2020YUVLIMIT */
96*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV2020_FULL2LIMIT, /* BT2020RGBFULL -> BT2020YUVLIMIT */
97*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV2020_FULL, /* BT2020RGBFULL -> BT2020YUVFULL */
98*ab3bc873SGuochun Huang };
99*ab3bc873SGuochun Huang
100*ab3bc873SGuochun Huang enum color_space_type {
101*ab3bc873SGuochun Huang OPTM_CS_E_UNKNOWN = 0,
102*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709 = 1,
103*ab3bc873SGuochun Huang OPTM_CS_E_FCC = 4,
104*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_470_2_BG = 5,
105*ab3bc873SGuochun Huang OPTM_CS_E_SMPTE_170_M = 6,
106*ab3bc873SGuochun Huang OPTM_CS_E_SMPTE_240_M = 7,
107*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_709 = OPTM_CS_E_ITU_R_BT_709,
108*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601 = 8,
109*ab3bc873SGuochun Huang OPTM_CS_E_RGB = 9,
110*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_2020 = 10,
111*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020 = 11,
112*ab3bc873SGuochun Huang };
113*ab3bc873SGuochun Huang
114*ab3bc873SGuochun Huang struct rk_pq_csc_coef {
115*ab3bc873SGuochun Huang s32 csc_coef00;
116*ab3bc873SGuochun Huang s32 csc_coef01;
117*ab3bc873SGuochun Huang s32 csc_coef02;
118*ab3bc873SGuochun Huang s32 csc_coef10;
119*ab3bc873SGuochun Huang s32 csc_coef11;
120*ab3bc873SGuochun Huang s32 csc_coef12;
121*ab3bc873SGuochun Huang s32 csc_coef20;
122*ab3bc873SGuochun Huang s32 csc_coef21;
123*ab3bc873SGuochun Huang s32 csc_coef22;
124*ab3bc873SGuochun Huang };
125*ab3bc873SGuochun Huang
126*ab3bc873SGuochun Huang struct rk_pq_csc_ventor {
127*ab3bc873SGuochun Huang s32 csc_offset0;
128*ab3bc873SGuochun Huang s32 csc_offset1;
129*ab3bc873SGuochun Huang s32 csc_offset2;
130*ab3bc873SGuochun Huang };
131*ab3bc873SGuochun Huang
132*ab3bc873SGuochun Huang struct rk_pq_csc_dc_coef {
133*ab3bc873SGuochun Huang s32 csc_in_dc0;
134*ab3bc873SGuochun Huang s32 csc_in_dc1;
135*ab3bc873SGuochun Huang s32 csc_in_dc2;
136*ab3bc873SGuochun Huang s32 csc_out_dc0;
137*ab3bc873SGuochun Huang s32 csc_out_dc1;
138*ab3bc873SGuochun Huang s32 csc_out_dc2;
139*ab3bc873SGuochun Huang };
140*ab3bc873SGuochun Huang
141*ab3bc873SGuochun Huang /* color space param */
142*ab3bc873SGuochun Huang struct rk_csc_colorspace_info {
143*ab3bc873SGuochun Huang enum color_space_type input_color_space;
144*ab3bc873SGuochun Huang enum color_space_type output_color_space;
145*ab3bc873SGuochun Huang bool in_full_range;
146*ab3bc873SGuochun Huang bool out_full_range;
147*ab3bc873SGuochun Huang };
148*ab3bc873SGuochun Huang
149*ab3bc873SGuochun Huang struct rk_csc_mode_coef {
150*ab3bc873SGuochun Huang enum rk_pq_csc_mode csc_mode;
151*ab3bc873SGuochun Huang char c_csc_comment[PQ_CSC_MODE_COEF_COMMENT_LEN];
152*ab3bc873SGuochun Huang const struct rk_pq_csc_coef *pst_csc_coef;
153*ab3bc873SGuochun Huang const struct rk_pq_csc_dc_coef *pst_csc_dc_coef;
154*ab3bc873SGuochun Huang struct rk_csc_colorspace_info st_csc_color_info;
155*ab3bc873SGuochun Huang };
156*ab3bc873SGuochun Huang
157*ab3bc873SGuochun Huang /*
158*ab3bc873SGuochun Huang *CSC matrix
159*ab3bc873SGuochun Huang */
160*ab3bc873SGuochun Huang /* xv_ycc BT.601 limit(i.e. SD) -> RGB full */
161*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full = {
162*ab3bc873SGuochun Huang 1196, 0, 1639,
163*ab3bc873SGuochun Huang 1196, -402, -835,
164*ab3bc873SGuochun Huang 1196, 2072, 0
165*ab3bc873SGuochun Huang };
166*ab3bc873SGuochun Huang
167*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full = {
168*ab3bc873SGuochun Huang -64, -512, -512,
169*ab3bc873SGuochun Huang 0, 0, 0
170*ab3bc873SGuochun Huang };
171*ab3bc873SGuochun Huang
172*ab3bc873SGuochun Huang /* BT.709 limit(i.e. HD) -> RGB full */
173*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_limit_to_rgb_full = {
174*ab3bc873SGuochun Huang 1196, 0, 1841,
175*ab3bc873SGuochun Huang 1196, -219, -547,
176*ab3bc873SGuochun Huang 1196, 2169, 0
177*ab3bc873SGuochun Huang };
178*ab3bc873SGuochun Huang
179*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_full = {
180*ab3bc873SGuochun Huang -64, -512, -512,
181*ab3bc873SGuochun Huang 0, 0, 0
182*ab3bc873SGuochun Huang };
183*ab3bc873SGuochun Huang
184*ab3bc873SGuochun Huang /* RGB full-> YUV601 (i.e. SD) limit */
185*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_rgb_to_xv_yccsdy_cb_cr = {
186*ab3bc873SGuochun Huang 262, 515, 100,
187*ab3bc873SGuochun Huang -151, -297, 448,
188*ab3bc873SGuochun Huang 448, -376, -73
189*ab3bc873SGuochun Huang };
190*ab3bc873SGuochun Huang
191*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr = {
192*ab3bc873SGuochun Huang 0, 0, 0,
193*ab3bc873SGuochun Huang 64, 512, 512
194*ab3bc873SGuochun Huang };
195*ab3bc873SGuochun Huang
196*ab3bc873SGuochun Huang /* RGB full-> YUV709 (i.e. SD) limit */
197*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_rgb_to_hdy_cb_cr = {
198*ab3bc873SGuochun Huang 186, 627, 63,
199*ab3bc873SGuochun Huang -103, -346, 448,
200*ab3bc873SGuochun Huang 448, -407, -41
201*ab3bc873SGuochun Huang };
202*ab3bc873SGuochun Huang
203*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_hdy_cb_cr = {
204*ab3bc873SGuochun Huang 0, 0, 0,
205*ab3bc873SGuochun Huang 64, 512, 512
206*ab3bc873SGuochun Huang };
207*ab3bc873SGuochun Huang
208*ab3bc873SGuochun Huang /* BT.709 (i.e. HD) -> to xv_ycc BT.601 (i.e. SD) */
209*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr = {
210*ab3bc873SGuochun Huang 1024, 104, 201,
211*ab3bc873SGuochun Huang 0, 1014, -113,
212*ab3bc873SGuochun Huang 0, -74, 1007
213*ab3bc873SGuochun Huang };
214*ab3bc873SGuochun Huang
215*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr = {
216*ab3bc873SGuochun Huang -64, -512, -512,
217*ab3bc873SGuochun Huang 64, 512, 512
218*ab3bc873SGuochun Huang };
219*ab3bc873SGuochun Huang
220*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full = {
221*ab3bc873SGuochun Huang 0, -512, -512,
222*ab3bc873SGuochun Huang 0, 512, 512
223*ab3bc873SGuochun Huang };
224*ab3bc873SGuochun Huang
225*ab3bc873SGuochun Huang /* xv_ycc BT.601 (i.e. SD) -> to BT.709 (i.e. HD) */
226*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr = {
227*ab3bc873SGuochun Huang 1024, -121, -218,
228*ab3bc873SGuochun Huang 0, 1043, 117,
229*ab3bc873SGuochun Huang 0, 77, 1050
230*ab3bc873SGuochun Huang };
231*ab3bc873SGuochun Huang
232*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr = {
233*ab3bc873SGuochun Huang -64, -512, -512,
234*ab3bc873SGuochun Huang 64, 512, 512
235*ab3bc873SGuochun Huang };
236*ab3bc873SGuochun Huang
237*ab3bc873SGuochun Huang /* xv_ycc BT.601 full(i.e. SD) -> RGB full */
238*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_to_rgb_full = {
239*ab3bc873SGuochun Huang 1024, 0, 1436,
240*ab3bc873SGuochun Huang 1024, -352, -731,
241*ab3bc873SGuochun Huang 1024, 1815, 0
242*ab3bc873SGuochun Huang };
243*ab3bc873SGuochun Huang
244*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_full = {
245*ab3bc873SGuochun Huang 0, -512, -512,
246*ab3bc873SGuochun Huang 0, 0, 0
247*ab3bc873SGuochun Huang };
248*ab3bc873SGuochun Huang
249*ab3bc873SGuochun Huang /* BT.709 full(i.e. HD) -> RGB full */
250*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_to_rgb_full = {
251*ab3bc873SGuochun Huang 1024, 0, 1613,
252*ab3bc873SGuochun Huang 1024, -192, -479,
253*ab3bc873SGuochun Huang 1024, 1900, 0
254*ab3bc873SGuochun Huang };
255*ab3bc873SGuochun Huang
256*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_to_rgb_full = {
257*ab3bc873SGuochun Huang 0, -512, -512,
258*ab3bc873SGuochun Huang 0, 0, 0
259*ab3bc873SGuochun Huang };
260*ab3bc873SGuochun Huang
261*ab3bc873SGuochun Huang /* RGB full-> YUV601 full(i.e. SD) */
262*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_rgb_to_xv_yccsdy_cb_cr_full = {
263*ab3bc873SGuochun Huang 306, 601, 117,
264*ab3bc873SGuochun Huang -173, -339, 512,
265*ab3bc873SGuochun Huang 512, -429, -83
266*ab3bc873SGuochun Huang };
267*ab3bc873SGuochun Huang
268*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr_full = {
269*ab3bc873SGuochun Huang 0, 0, 0,
270*ab3bc873SGuochun Huang 0, 512, 512
271*ab3bc873SGuochun Huang };
272*ab3bc873SGuochun Huang
273*ab3bc873SGuochun Huang /* RGB full-> YUV709 full (i.e. SD) */
274*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_rgb_to_hdy_cb_cr_full = {
275*ab3bc873SGuochun Huang 218, 732, 74,
276*ab3bc873SGuochun Huang -117, -395, 512,
277*ab3bc873SGuochun Huang 512, -465, -47
278*ab3bc873SGuochun Huang };
279*ab3bc873SGuochun Huang
280*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_hdy_cb_cr_full = {
281*ab3bc873SGuochun Huang 0, 0, 0,
282*ab3bc873SGuochun Huang 0, 512, 512
283*ab3bc873SGuochun Huang };
284*ab3bc873SGuochun Huang
285*ab3bc873SGuochun Huang /* limit -> full */
286*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full = {
287*ab3bc873SGuochun Huang 1196, 0, 0,
288*ab3bc873SGuochun Huang 0, 1169, 0,
289*ab3bc873SGuochun Huang 0, 0, 1169
290*ab3bc873SGuochun Huang };
291*ab3bc873SGuochun Huang
292*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full = {
293*ab3bc873SGuochun Huang -64, -512, -512,
294*ab3bc873SGuochun Huang 0, 512, 512
295*ab3bc873SGuochun Huang };
296*ab3bc873SGuochun Huang
297*ab3bc873SGuochun Huang /* 601 limit -> 709 full */
298*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_601_limit_to_709_full = {
299*ab3bc873SGuochun Huang 1196, -138, -249,
300*ab3bc873SGuochun Huang 0, 1191, 134,
301*ab3bc873SGuochun Huang 0, 88, 1199
302*ab3bc873SGuochun Huang };
303*ab3bc873SGuochun Huang
304*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_601_limit_to_709_full = {
305*ab3bc873SGuochun Huang -64, -512, -512,
306*ab3bc873SGuochun Huang 0, 512, 512
307*ab3bc873SGuochun Huang };
308*ab3bc873SGuochun Huang
309*ab3bc873SGuochun Huang /* 709 limit -> 601 full */
310*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_709_limit_to_601_full = {
311*ab3bc873SGuochun Huang 1196, 119, 229,
312*ab3bc873SGuochun Huang 0, 1157, -129,
313*ab3bc873SGuochun Huang 0, -85, 1150
314*ab3bc873SGuochun Huang };
315*ab3bc873SGuochun Huang
316*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_709_limit_to_601_full = {
317*ab3bc873SGuochun Huang -64, -512, -512,
318*ab3bc873SGuochun Huang 0, 512, 512
319*ab3bc873SGuochun Huang };
320*ab3bc873SGuochun Huang
321*ab3bc873SGuochun Huang /* full -> limit */
322*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit = {
323*ab3bc873SGuochun Huang 877, 0, 0,
324*ab3bc873SGuochun Huang 0, 897, 0,
325*ab3bc873SGuochun Huang 0, 0, 897
326*ab3bc873SGuochun Huang };
327*ab3bc873SGuochun Huang
328*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit = {
329*ab3bc873SGuochun Huang 0, -512, -512,
330*ab3bc873SGuochun Huang 64, 512, 512
331*ab3bc873SGuochun Huang };
332*ab3bc873SGuochun Huang
333*ab3bc873SGuochun Huang /* 601 full -> 709 limit */
334*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit = {
335*ab3bc873SGuochun Huang 877, -106, -191,
336*ab3bc873SGuochun Huang 0, 914, 103,
337*ab3bc873SGuochun Huang 0, 67, 920
338*ab3bc873SGuochun Huang };
339*ab3bc873SGuochun Huang
340*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef
341*ab3bc873SGuochun Huang rk_dc_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit = {
342*ab3bc873SGuochun Huang 0, -512, -512,
343*ab3bc873SGuochun Huang 64, 512, 512
344*ab3bc873SGuochun Huang };
345*ab3bc873SGuochun Huang
346*ab3bc873SGuochun Huang /* 709 full -> 601 limit */
347*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit = {
348*ab3bc873SGuochun Huang 877, 91, 176,
349*ab3bc873SGuochun Huang 0, 888, -99,
350*ab3bc873SGuochun Huang 0, -65, 882
351*ab3bc873SGuochun Huang };
352*ab3bc873SGuochun Huang
353*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef
354*ab3bc873SGuochun Huang rk_dc_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit = {
355*ab3bc873SGuochun Huang 0, -512, -512,
356*ab3bc873SGuochun Huang 64, 512, 512
357*ab3bc873SGuochun Huang };
358*ab3bc873SGuochun Huang
359*ab3bc873SGuochun Huang /* xv_ycc BT.601 limit(i.e. SD) -> RGB limit */
360*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit = {
361*ab3bc873SGuochun Huang 1024, 0, 1404,
362*ab3bc873SGuochun Huang 1024, -344, -715,
363*ab3bc873SGuochun Huang 1024, 1774, 0
364*ab3bc873SGuochun Huang };
365*ab3bc873SGuochun Huang
366*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit = {
367*ab3bc873SGuochun Huang -64, -512, -512,
368*ab3bc873SGuochun Huang 64, 64, 64
369*ab3bc873SGuochun Huang };
370*ab3bc873SGuochun Huang
371*ab3bc873SGuochun Huang /* BT.709 limit(i.e. HD) -> RGB limit */
372*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_limit_to_rgb_limit = {
373*ab3bc873SGuochun Huang 1024, 0, 1577,
374*ab3bc873SGuochun Huang 1024, -188, -469,
375*ab3bc873SGuochun Huang 1024, 1858, 0
376*ab3bc873SGuochun Huang };
377*ab3bc873SGuochun Huang
378*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_limit = {
379*ab3bc873SGuochun Huang -64, -512, -512,
380*ab3bc873SGuochun Huang 64, 64, 64
381*ab3bc873SGuochun Huang };
382*ab3bc873SGuochun Huang
383*ab3bc873SGuochun Huang /* RGB limit-> YUV601 (i.e. SD) limit */
384*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr = {
385*ab3bc873SGuochun Huang 306, 601, 117,
386*ab3bc873SGuochun Huang -177, -347, 524,
387*ab3bc873SGuochun Huang 524, -439, -85
388*ab3bc873SGuochun Huang };
389*ab3bc873SGuochun Huang
390*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr = {
391*ab3bc873SGuochun Huang -64, -64, -64,
392*ab3bc873SGuochun Huang 64, 512, 512
393*ab3bc873SGuochun Huang };
394*ab3bc873SGuochun Huang
395*ab3bc873SGuochun Huang /* RGB limit -> YUV709 (i.e. SD) limit */
396*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_hdy_cb_cr = {
397*ab3bc873SGuochun Huang 218, 732, 74,
398*ab3bc873SGuochun Huang -120, -404, 524,
399*ab3bc873SGuochun Huang 524, -476, -48
400*ab3bc873SGuochun Huang };
401*ab3bc873SGuochun Huang
402*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_hdy_cb_cr = {
403*ab3bc873SGuochun Huang -64, -64, -64,
404*ab3bc873SGuochun Huang 64, 512, 512
405*ab3bc873SGuochun Huang };
406*ab3bc873SGuochun Huang
407*ab3bc873SGuochun Huang /* xv_ycc BT.601 full(i.e. SD) -> RGB limit */
408*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_to_rgb_limit = {
409*ab3bc873SGuochun Huang 877, 0, 1229,
410*ab3bc873SGuochun Huang 877, -302, -626,
411*ab3bc873SGuochun Huang 877, 1554, 0
412*ab3bc873SGuochun Huang };
413*ab3bc873SGuochun Huang
414*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_limit = {
415*ab3bc873SGuochun Huang 0, -512, -512,
416*ab3bc873SGuochun Huang 64, 64, 64
417*ab3bc873SGuochun Huang };
418*ab3bc873SGuochun Huang
419*ab3bc873SGuochun Huang /* BT.709 full(i.e. HD) -> RGB limit */
420*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_to_rgb_limit = {
421*ab3bc873SGuochun Huang 877, 0, 1381,
422*ab3bc873SGuochun Huang 877, -164, -410,
423*ab3bc873SGuochun Huang 877, 1627, 0
424*ab3bc873SGuochun Huang };
425*ab3bc873SGuochun Huang
426*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_to_rgb_limit = {
427*ab3bc873SGuochun Huang 0, -512, -512,
428*ab3bc873SGuochun Huang 64, 64, 64
429*ab3bc873SGuochun Huang };
430*ab3bc873SGuochun Huang
431*ab3bc873SGuochun Huang /* RGB limit-> YUV601 full(i.e. SD) */
432*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full = {
433*ab3bc873SGuochun Huang 358, 702, 136,
434*ab3bc873SGuochun Huang -202, -396, 598,
435*ab3bc873SGuochun Huang 598, -501, -97
436*ab3bc873SGuochun Huang };
437*ab3bc873SGuochun Huang
438*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full = {
439*ab3bc873SGuochun Huang -64, -64, -64,
440*ab3bc873SGuochun Huang 0, 512, 512
441*ab3bc873SGuochun Huang };
442*ab3bc873SGuochun Huang
443*ab3bc873SGuochun Huang /* RGB limit-> YUV709 full (i.e. SD) */
444*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_hdy_cb_cr_full = {
445*ab3bc873SGuochun Huang 254, 855, 86,
446*ab3bc873SGuochun Huang -137, -461, 598,
447*ab3bc873SGuochun Huang 598, -543, -55
448*ab3bc873SGuochun Huang };
449*ab3bc873SGuochun Huang
450*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_hdy_cb_cr_full = {
451*ab3bc873SGuochun Huang -64, -64, -64,
452*ab3bc873SGuochun Huang 0, 512, 512
453*ab3bc873SGuochun Huang };
454*ab3bc873SGuochun Huang
455*ab3bc873SGuochun Huang /* RGB full -> RGB limit */
456*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_to_rgb_limit = {
457*ab3bc873SGuochun Huang 877, 0, 0,
458*ab3bc873SGuochun Huang 0, 877, 0,
459*ab3bc873SGuochun Huang 0, 0, 877
460*ab3bc873SGuochun Huang };
461*ab3bc873SGuochun Huang
462*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_to_rgb_limit = {
463*ab3bc873SGuochun Huang 0, 0, 0,
464*ab3bc873SGuochun Huang 64, 64, 64
465*ab3bc873SGuochun Huang };
466*ab3bc873SGuochun Huang
467*ab3bc873SGuochun Huang /* RGB limit -> RGB full */
468*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_limit_to_rgb = {
469*ab3bc873SGuochun Huang 1196, 0, 0,
470*ab3bc873SGuochun Huang 0, 1196, 0,
471*ab3bc873SGuochun Huang 0, 0, 1196
472*ab3bc873SGuochun Huang };
473*ab3bc873SGuochun Huang
474*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_limit_to_rgb = {
475*ab3bc873SGuochun Huang -64, -64, -64,
476*ab3bc873SGuochun Huang 0, 0, 0
477*ab3bc873SGuochun Huang };
478*ab3bc873SGuochun Huang
479*ab3bc873SGuochun Huang /* RGB limit/full -> RGB limit/full */
480*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_to_rgb = {
481*ab3bc873SGuochun Huang 1024, 0, 0,
482*ab3bc873SGuochun Huang 0, 1024, 0,
483*ab3bc873SGuochun Huang 0, 0, 1024
484*ab3bc873SGuochun Huang };
485*ab3bc873SGuochun Huang
486*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_to_rgb1 = {
487*ab3bc873SGuochun Huang -64, -64, -64,
488*ab3bc873SGuochun Huang 64, 64, 64
489*ab3bc873SGuochun Huang };
490*ab3bc873SGuochun Huang
491*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_to_rgb2 = {
492*ab3bc873SGuochun Huang 0, 0, 0,
493*ab3bc873SGuochun Huang 0, 0, 0
494*ab3bc873SGuochun Huang };
495*ab3bc873SGuochun Huang
496*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_yuv_to_rgb_2020 = {
497*ab3bc873SGuochun Huang 1024, 0, 1510,
498*ab3bc873SGuochun Huang 1024, -169, -585,
499*ab3bc873SGuochun Huang 1024, 1927, 0
500*ab3bc873SGuochun Huang };
501*ab3bc873SGuochun Huang
502*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_yuv_to_rgb_2020 = {
503*ab3bc873SGuochun Huang 0, -512, -512,
504*ab3bc873SGuochun Huang 0, 0, 0
505*ab3bc873SGuochun Huang };
506*ab3bc873SGuochun Huang
507*ab3bc873SGuochun Huang /* 2020 RGB LIMIT ->YUV LIMIT */
508*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_limit_to_yuv_limit_2020 = {
509*ab3bc873SGuochun Huang 269, 694, 61,
510*ab3bc873SGuochun Huang -146, -377, 524,
511*ab3bc873SGuochun Huang 524, -482, -42
512*ab3bc873SGuochun Huang };
513*ab3bc873SGuochun Huang
514*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_limit_to_yuv_limit_2020 = {
515*ab3bc873SGuochun Huang -64, -64, -64,
516*ab3bc873SGuochun Huang 64, 512, 512
517*ab3bc873SGuochun Huang };
518*ab3bc873SGuochun Huang
519*ab3bc873SGuochun Huang /* 2020 RGB LIMIT ->YUV FULL */
520*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_limit_to_yuv_full_2020 = {
521*ab3bc873SGuochun Huang 314, 811, 71,
522*ab3bc873SGuochun Huang -167, -431, 598,
523*ab3bc873SGuochun Huang 598, -550, -48
524*ab3bc873SGuochun Huang };
525*ab3bc873SGuochun Huang
526*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_limit_to_yuv_full_2020 = {
527*ab3bc873SGuochun Huang -64, -64, -64,
528*ab3bc873SGuochun Huang 0, 512, 512
529*ab3bc873SGuochun Huang };
530*ab3bc873SGuochun Huang
531*ab3bc873SGuochun Huang /* 2020 RGB FULL ->YUV LIMIT */
532*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_full_to_yuv_limit_2020 = {
533*ab3bc873SGuochun Huang 230, 595, 52,
534*ab3bc873SGuochun Huang -125, -323, 448,
535*ab3bc873SGuochun Huang 448, -412, -36
536*ab3bc873SGuochun Huang };
537*ab3bc873SGuochun Huang
538*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_full_to_yuv_limit_2020 = {
539*ab3bc873SGuochun Huang 0, 0, 0,
540*ab3bc873SGuochun Huang 64, 512, 512
541*ab3bc873SGuochun Huang };
542*ab3bc873SGuochun Huang
543*ab3bc873SGuochun Huang /* 2020 RGB FULL ->YUV FULL */
544*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_full_to_yuv_full_2020 = {
545*ab3bc873SGuochun Huang 269, 694, 61,
546*ab3bc873SGuochun Huang -143, -369, 512,
547*ab3bc873SGuochun Huang 512, -471, -41
548*ab3bc873SGuochun Huang };
549*ab3bc873SGuochun Huang
550*ab3bc873SGuochun Huang static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_full_to_yuv_full_2020 = {
551*ab3bc873SGuochun Huang 0, 0, 0,
552*ab3bc873SGuochun Huang 0, 512, 512
553*ab3bc873SGuochun Huang };
554*ab3bc873SGuochun Huang
555*ab3bc873SGuochun Huang /* identity matrix */
556*ab3bc873SGuochun Huang static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_to_y_cb_cr = {
557*ab3bc873SGuochun Huang 1024, 0, 0,
558*ab3bc873SGuochun Huang 0, 1024, 0,
559*ab3bc873SGuochun Huang 0, 0, 1024
560*ab3bc873SGuochun Huang };
561*ab3bc873SGuochun Huang
562*ab3bc873SGuochun Huang /*
563*ab3bc873SGuochun Huang *CSC Param Struct
564*ab3bc873SGuochun Huang */
565*ab3bc873SGuochun Huang static const struct rk_csc_mode_coef g_mode_csc_coef[] = {
566*ab3bc873SGuochun Huang {
567*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGB_601, "YUV601 L->RGB F",
568*ab3bc873SGuochun Huang &rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full,
569*ab3bc873SGuochun Huang &rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full,
570*ab3bc873SGuochun Huang {
571*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, false, true
572*ab3bc873SGuochun Huang }
573*ab3bc873SGuochun Huang },
574*ab3bc873SGuochun Huang {
575*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGB_709, "YUV709 L->RGB F",
576*ab3bc873SGuochun Huang &rk_csc_table_hdy_cb_cr_limit_to_rgb_full,
577*ab3bc873SGuochun Huang &rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_full,
578*ab3bc873SGuochun Huang {
579*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, false, true
580*ab3bc873SGuochun Huang }
581*ab3bc873SGuochun Huang },
582*ab3bc873SGuochun Huang {
583*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV_601, "RGB F->YUV601 L",
584*ab3bc873SGuochun Huang &rk_csc_table_rgb_to_xv_yccsdy_cb_cr,
585*ab3bc873SGuochun Huang &rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr,
586*ab3bc873SGuochun Huang {
587*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, true, false
588*ab3bc873SGuochun Huang }
589*ab3bc873SGuochun Huang },
590*ab3bc873SGuochun Huang {
591*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV_709, "RGB F->YUV709 L",
592*ab3bc873SGuochun Huang &rk_csc_table_rgb_to_hdy_cb_cr,
593*ab3bc873SGuochun Huang &rk_dc_csc_table_rgb_to_hdy_cb_cr,
594*ab3bc873SGuochun Huang {
595*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, true, false
596*ab3bc873SGuochun Huang }
597*ab3bc873SGuochun Huang },
598*ab3bc873SGuochun Huang {
599*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_709_601, "YUV709 L->YUV601 L",
600*ab3bc873SGuochun Huang &rk_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr,
601*ab3bc873SGuochun Huang &rk_dc_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr,
602*ab3bc873SGuochun Huang {
603*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, false, false
604*ab3bc873SGuochun Huang }
605*ab3bc873SGuochun Huang },
606*ab3bc873SGuochun Huang {
607*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_601_709, "YUV601 L->YUV709 L",
608*ab3bc873SGuochun Huang &rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
609*ab3bc873SGuochun Huang &rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
610*ab3bc873SGuochun Huang {
611*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, false, false
612*ab3bc873SGuochun Huang }
613*ab3bc873SGuochun Huang },
614*ab3bc873SGuochun Huang {
615*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV, "YUV L->YUV L",
616*ab3bc873SGuochun Huang &rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
617*ab3bc873SGuochun Huang &rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
618*ab3bc873SGuochun Huang {
619*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, false, false
620*ab3bc873SGuochun Huang }
621*ab3bc873SGuochun Huang },
622*ab3bc873SGuochun Huang {
623*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGB_601_FULL, "YUV601 F->RGB F",
624*ab3bc873SGuochun Huang &rk_csc_table_xv_yccsdy_cb_cr_to_rgb_full,
625*ab3bc873SGuochun Huang &rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_full,
626*ab3bc873SGuochun Huang {
627*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, true, true
628*ab3bc873SGuochun Huang }
629*ab3bc873SGuochun Huang },
630*ab3bc873SGuochun Huang {
631*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGB_709_FULL, "YUV709 F->RGB F",
632*ab3bc873SGuochun Huang &rk_csc_table_hdy_cb_cr_to_rgb_full,
633*ab3bc873SGuochun Huang &rk_dc_csc_table_hdy_cb_cr_to_rgb_full,
634*ab3bc873SGuochun Huang {
635*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, true, true
636*ab3bc873SGuochun Huang }
637*ab3bc873SGuochun Huang },
638*ab3bc873SGuochun Huang {
639*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV_601_FULL, "RGB F->YUV601 F",
640*ab3bc873SGuochun Huang &rk_csc_table_rgb_to_xv_yccsdy_cb_cr_full,
641*ab3bc873SGuochun Huang &rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr_full,
642*ab3bc873SGuochun Huang {
643*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, true, true
644*ab3bc873SGuochun Huang }
645*ab3bc873SGuochun Huang },
646*ab3bc873SGuochun Huang {
647*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV_709_FULL, "RGB F->YUV709 F",
648*ab3bc873SGuochun Huang &rk_csc_table_rgb_to_hdy_cb_cr_full,
649*ab3bc873SGuochun Huang &rk_dc_csc_table_rgb_to_hdy_cb_cr_full,
650*ab3bc873SGuochun Huang {
651*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, true, true
652*ab3bc873SGuochun Huang }
653*ab3bc873SGuochun Huang },
654*ab3bc873SGuochun Huang {
655*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_709_601_FULL, "YUV709 F->YUV601 F",
656*ab3bc873SGuochun Huang &rk_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr,
657*ab3bc873SGuochun Huang &rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full,
658*ab3bc873SGuochun Huang {
659*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, true, true
660*ab3bc873SGuochun Huang }
661*ab3bc873SGuochun Huang },
662*ab3bc873SGuochun Huang {
663*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_601_709_FULL, "YUV601 F->YUV709 F",
664*ab3bc873SGuochun Huang &rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
665*ab3bc873SGuochun Huang &rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full,
666*ab3bc873SGuochun Huang {
667*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, true, true
668*ab3bc873SGuochun Huang }
669*ab3bc873SGuochun Huang },
670*ab3bc873SGuochun Huang {
671*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_FULL, "YUV F->YUV F",
672*ab3bc873SGuochun Huang &rk_csc_table_identity_y_cb_cr_to_y_cb_cr,
673*ab3bc873SGuochun Huang &rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full,
674*ab3bc873SGuochun Huang {
675*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, true, true
676*ab3bc873SGuochun Huang }
677*ab3bc873SGuochun Huang },
678*ab3bc873SGuochun Huang {
679*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_LIMIT2FULL, "YUV L->YUV F",
680*ab3bc873SGuochun Huang &rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
681*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
682*ab3bc873SGuochun Huang {
683*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, false, true
684*ab3bc873SGuochun Huang }
685*ab3bc873SGuochun Huang },
686*ab3bc873SGuochun Huang {
687*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_601_709_LIMIT2FULL, "YUV601 L->YUV709 F",
688*ab3bc873SGuochun Huang &rk_csc_table_identity_601_limit_to_709_full,
689*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_601_limit_to_709_full,
690*ab3bc873SGuochun Huang {
691*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, false, true
692*ab3bc873SGuochun Huang }
693*ab3bc873SGuochun Huang },
694*ab3bc873SGuochun Huang {
695*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_709_601_LIMIT2FULL, "YUV709 L->YUV601 F",
696*ab3bc873SGuochun Huang &rk_csc_table_identity_709_limit_to_601_full,
697*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_709_limit_to_601_full,
698*ab3bc873SGuochun Huang {
699*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, false, true
700*ab3bc873SGuochun Huang }
701*ab3bc873SGuochun Huang },
702*ab3bc873SGuochun Huang {
703*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_FULL2LIMIT, "YUV F->YUV L",
704*ab3bc873SGuochun Huang &rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
705*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
706*ab3bc873SGuochun Huang {
707*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, true, false
708*ab3bc873SGuochun Huang }
709*ab3bc873SGuochun Huang },
710*ab3bc873SGuochun Huang {
711*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_601_709_FULL2LIMIT, "YUV601 F->YUV709 L",
712*ab3bc873SGuochun Huang &rk_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit,
713*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit,
714*ab3bc873SGuochun Huang {
715*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, true, false
716*ab3bc873SGuochun Huang }
717*ab3bc873SGuochun Huang },
718*ab3bc873SGuochun Huang {
719*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_709_601_FULL2LIMIT, "YUV709 F->YUV601 L",
720*ab3bc873SGuochun Huang &rk_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit,
721*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit,
722*ab3bc873SGuochun Huang {
723*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, true, false
724*ab3bc873SGuochun Huang }
725*ab3bc873SGuochun Huang },
726*ab3bc873SGuochun Huang {
727*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGBL_601, "YUV601 L->RGB L",
728*ab3bc873SGuochun Huang &rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit,
729*ab3bc873SGuochun Huang &rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit,
730*ab3bc873SGuochun Huang {
731*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, false, false
732*ab3bc873SGuochun Huang }
733*ab3bc873SGuochun Huang },
734*ab3bc873SGuochun Huang {
735*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGBL_709, "YUV709 L->RGB L",
736*ab3bc873SGuochun Huang &rk_csc_table_hdy_cb_cr_limit_to_rgb_limit,
737*ab3bc873SGuochun Huang &rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_limit,
738*ab3bc873SGuochun Huang {
739*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, false, false
740*ab3bc873SGuochun Huang }
741*ab3bc873SGuochun Huang },
742*ab3bc873SGuochun Huang {
743*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2YUV_601, "RGB L->YUV601 L",
744*ab3bc873SGuochun Huang &rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr,
745*ab3bc873SGuochun Huang &rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr,
746*ab3bc873SGuochun Huang {
747*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, false, false
748*ab3bc873SGuochun Huang }
749*ab3bc873SGuochun Huang },
750*ab3bc873SGuochun Huang {
751*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2YUV_709, "RGB L->YUV709 L",
752*ab3bc873SGuochun Huang &rk_csc_table_rgb_limit_to_hdy_cb_cr,
753*ab3bc873SGuochun Huang &rk_dc_csc_table_rgb_limit_to_hdy_cb_cr,
754*ab3bc873SGuochun Huang {
755*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, false, false
756*ab3bc873SGuochun Huang }
757*ab3bc873SGuochun Huang },
758*ab3bc873SGuochun Huang {
759*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGBL_601_FULL, "YUV601 F->RGB L",
760*ab3bc873SGuochun Huang &rk_csc_table_xv_yccsdy_cb_cr_to_rgb_limit,
761*ab3bc873SGuochun Huang &rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_limit,
762*ab3bc873SGuochun Huang {
763*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, true, false
764*ab3bc873SGuochun Huang }
765*ab3bc873SGuochun Huang },
766*ab3bc873SGuochun Huang {
767*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGBL_709_FULL, "YUV709 F->RGB L",
768*ab3bc873SGuochun Huang &rk_csc_table_hdy_cb_cr_to_rgb_limit,
769*ab3bc873SGuochun Huang &rk_dc_csc_table_hdy_cb_cr_to_rgb_limit,
770*ab3bc873SGuochun Huang {
771*ab3bc873SGuochun Huang OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, true, false
772*ab3bc873SGuochun Huang }
773*ab3bc873SGuochun Huang },
774*ab3bc873SGuochun Huang {
775*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2YUV_601_FULL, "RGB L->YUV601 F",
776*ab3bc873SGuochun Huang &rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full,
777*ab3bc873SGuochun Huang &rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full,
778*ab3bc873SGuochun Huang {
779*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, false, true
780*ab3bc873SGuochun Huang }
781*ab3bc873SGuochun Huang },
782*ab3bc873SGuochun Huang {
783*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2YUV_709_FULL, "RGB L->YUV709 F",
784*ab3bc873SGuochun Huang &rk_csc_table_rgb_limit_to_hdy_cb_cr_full,
785*ab3bc873SGuochun Huang &rk_dc_csc_table_rgb_limit_to_hdy_cb_cr_full,
786*ab3bc873SGuochun Huang {
787*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, false, true
788*ab3bc873SGuochun Huang }
789*ab3bc873SGuochun Huang },
790*ab3bc873SGuochun Huang {
791*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2RGBL, "RGB F->RGB L",
792*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_to_rgb_limit,
793*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_to_rgb_limit,
794*ab3bc873SGuochun Huang {
795*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_RGB, true, false
796*ab3bc873SGuochun Huang }
797*ab3bc873SGuochun Huang },
798*ab3bc873SGuochun Huang {
799*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2RGB, "RGB L->RGB F",
800*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_limit_to_rgb,
801*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_limit_to_rgb,
802*ab3bc873SGuochun Huang {
803*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_RGB, false, true
804*ab3bc873SGuochun Huang }
805*ab3bc873SGuochun Huang },
806*ab3bc873SGuochun Huang {
807*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2RGBL, "RGB L->RGB L",
808*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_to_rgb,
809*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_to_rgb1,
810*ab3bc873SGuochun Huang {
811*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_RGB, false, false
812*ab3bc873SGuochun Huang }
813*ab3bc873SGuochun Huang },
814*ab3bc873SGuochun Huang {
815*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2RGB, "RGB F->RGB F",
816*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_to_rgb,
817*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_to_rgb2,
818*ab3bc873SGuochun Huang {
819*ab3bc873SGuochun Huang OPTM_CS_E_RGB, OPTM_CS_E_RGB, true, true
820*ab3bc873SGuochun Huang }
821*ab3bc873SGuochun Huang },
822*ab3bc873SGuochun Huang {
823*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2RGB_2020, "YUV2020 F->RGB2020 F",
824*ab3bc873SGuochun Huang &rk_csc_table_identity_yuv_to_rgb_2020,
825*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_yuv_to_rgb_2020,
826*ab3bc873SGuochun Huang {
827*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_RGB_2020, true, true
828*ab3bc873SGuochun Huang }
829*ab3bc873SGuochun Huang },
830*ab3bc873SGuochun Huang {
831*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV2020_LIMIT2FULL, "RGB2020 L->YUV2020 F",
832*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_limit_to_yuv_full_2020,
833*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_limit_to_yuv_full_2020,
834*ab3bc873SGuochun Huang {
835*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, false, true
836*ab3bc873SGuochun Huang }
837*ab3bc873SGuochun Huang },
838*ab3bc873SGuochun Huang {
839*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV2020_LIMIT, "RGB2020 L->YUV2020 L",
840*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_limit_to_yuv_limit_2020,
841*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_limit_to_yuv_limit_2020,
842*ab3bc873SGuochun Huang {
843*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, false, false
844*ab3bc873SGuochun Huang }
845*ab3bc873SGuochun Huang },
846*ab3bc873SGuochun Huang {
847*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV2020_FULL2LIMIT, "RGB2020 F->YUV2020 L",
848*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_full_to_yuv_limit_2020,
849*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_full_to_yuv_limit_2020,
850*ab3bc873SGuochun Huang {
851*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, true, false
852*ab3bc873SGuochun Huang }
853*ab3bc873SGuochun Huang },
854*ab3bc873SGuochun Huang {
855*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2YUV2020_FULL, "RGB2020 F->YUV2020 F",
856*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_full_to_yuv_full_2020,
857*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_full_to_yuv_full_2020,
858*ab3bc873SGuochun Huang {
859*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, true, true
860*ab3bc873SGuochun Huang }
861*ab3bc873SGuochun Huang },
862*ab3bc873SGuochun Huang {
863*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV, "YUV 601 L->YUV 601 L",
864*ab3bc873SGuochun Huang &rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
865*ab3bc873SGuochun Huang &rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
866*ab3bc873SGuochun Huang {
867*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601, false, false
868*ab3bc873SGuochun Huang }
869*ab3bc873SGuochun Huang },
870*ab3bc873SGuochun Huang {
871*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_FULL, "YUV 601 F->YUV 601 F",
872*ab3bc873SGuochun Huang &rk_csc_table_identity_y_cb_cr_to_y_cb_cr,
873*ab3bc873SGuochun Huang &rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full,
874*ab3bc873SGuochun Huang {
875*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601, true, true
876*ab3bc873SGuochun Huang }
877*ab3bc873SGuochun Huang },
878*ab3bc873SGuochun Huang {
879*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_LIMIT2FULL, "YUV 601 L->YUV 601 F",
880*ab3bc873SGuochun Huang &rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
881*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
882*ab3bc873SGuochun Huang {
883*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601, false, true
884*ab3bc873SGuochun Huang }
885*ab3bc873SGuochun Huang },
886*ab3bc873SGuochun Huang {
887*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_FULL2LIMIT, "YUV 601 F->YUV 601 L",
888*ab3bc873SGuochun Huang &rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
889*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
890*ab3bc873SGuochun Huang {
891*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601, true, false
892*ab3bc873SGuochun Huang }
893*ab3bc873SGuochun Huang },
894*ab3bc873SGuochun Huang {
895*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV, "YUV 2020 L->YUV 2020 L",
896*ab3bc873SGuochun Huang &rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
897*ab3bc873SGuochun Huang &rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
898*ab3bc873SGuochun Huang {
899*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, false, false
900*ab3bc873SGuochun Huang }
901*ab3bc873SGuochun Huang },
902*ab3bc873SGuochun Huang {
903*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_FULL, "YUV 2020 F->YUV 2020 F",
904*ab3bc873SGuochun Huang &rk_csc_table_identity_y_cb_cr_to_y_cb_cr,
905*ab3bc873SGuochun Huang &rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full,
906*ab3bc873SGuochun Huang {
907*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, true, true
908*ab3bc873SGuochun Huang }
909*ab3bc873SGuochun Huang },
910*ab3bc873SGuochun Huang {
911*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_LIMIT2FULL, "YUV 2020 L->YUV 2020 F",
912*ab3bc873SGuochun Huang &rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
913*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
914*ab3bc873SGuochun Huang {
915*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, false, true
916*ab3bc873SGuochun Huang }
917*ab3bc873SGuochun Huang },
918*ab3bc873SGuochun Huang {
919*ab3bc873SGuochun Huang RK_PQ_CSC_YUV2YUV_FULL2LIMIT, "YUV 2020 F->YUV 2020 L",
920*ab3bc873SGuochun Huang &rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
921*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
922*ab3bc873SGuochun Huang {
923*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, true, false
924*ab3bc873SGuochun Huang }
925*ab3bc873SGuochun Huang },
926*ab3bc873SGuochun Huang {
927*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2RGBL, "RGB 2020 F->RGB 2020 L",
928*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_to_rgb_limit,
929*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_to_rgb_limit,
930*ab3bc873SGuochun Huang {
931*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, true, false
932*ab3bc873SGuochun Huang }
933*ab3bc873SGuochun Huang },
934*ab3bc873SGuochun Huang {
935*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2RGB, "RGB 2020 L->RGB 2020 F",
936*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_limit_to_rgb,
937*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_limit_to_rgb,
938*ab3bc873SGuochun Huang {
939*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, false, true
940*ab3bc873SGuochun Huang }
941*ab3bc873SGuochun Huang },
942*ab3bc873SGuochun Huang {
943*ab3bc873SGuochun Huang RK_PQ_CSC_RGBL2RGBL, "RGB 2020 L->RGB 2020 L",
944*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_to_rgb,
945*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_to_rgb1,
946*ab3bc873SGuochun Huang {
947*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, false, false
948*ab3bc873SGuochun Huang }
949*ab3bc873SGuochun Huang },
950*ab3bc873SGuochun Huang {
951*ab3bc873SGuochun Huang RK_PQ_CSC_RGB2RGB, "RGB 2020 F->RGB 2020 F",
952*ab3bc873SGuochun Huang &rk_csc_table_identity_rgb_to_rgb,
953*ab3bc873SGuochun Huang &rk_dc_csc_table_identity_rgb_to_rgb2,
954*ab3bc873SGuochun Huang {
955*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, true, true
956*ab3bc873SGuochun Huang }
957*ab3bc873SGuochun Huang },
958*ab3bc873SGuochun Huang };
959*ab3bc873SGuochun Huang
960*ab3bc873SGuochun Huang enum vop_csc_format {
961*ab3bc873SGuochun Huang CSC_BT601L,
962*ab3bc873SGuochun Huang CSC_BT709L,
963*ab3bc873SGuochun Huang CSC_BT601F,
964*ab3bc873SGuochun Huang CSC_BT2020,
965*ab3bc873SGuochun Huang CSC_BT709L_13BIT,
966*ab3bc873SGuochun Huang CSC_BT709F_13BIT,
967*ab3bc873SGuochun Huang CSC_BT2020L_13BIT,
968*ab3bc873SGuochun Huang CSC_BT2020F_13BIT,
969*ab3bc873SGuochun Huang };
970*ab3bc873SGuochun Huang
971*ab3bc873SGuochun Huang enum vop_csc_mode {
972*ab3bc873SGuochun Huang CSC_RGB,
973*ab3bc873SGuochun Huang CSC_YUV,
974*ab3bc873SGuochun Huang };
975*ab3bc873SGuochun Huang
976*ab3bc873SGuochun Huang struct csc_mapping {
977*ab3bc873SGuochun Huang enum vop_csc_format csc_format;
978*ab3bc873SGuochun Huang enum color_space_type rgb_color_space;
979*ab3bc873SGuochun Huang enum color_space_type yuv_color_space;
980*ab3bc873SGuochun Huang bool rgb_full_range;
981*ab3bc873SGuochun Huang bool yuv_full_range;
982*ab3bc873SGuochun Huang };
983*ab3bc873SGuochun Huang
984*ab3bc873SGuochun Huang static const struct csc_mapping csc_mapping_table[] = {
985*ab3bc873SGuochun Huang {
986*ab3bc873SGuochun Huang CSC_BT601L,
987*ab3bc873SGuochun Huang OPTM_CS_E_RGB,
988*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601,
989*ab3bc873SGuochun Huang true,
990*ab3bc873SGuochun Huang false,
991*ab3bc873SGuochun Huang },
992*ab3bc873SGuochun Huang {
993*ab3bc873SGuochun Huang CSC_BT709L,
994*ab3bc873SGuochun Huang OPTM_CS_E_RGB,
995*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_709,
996*ab3bc873SGuochun Huang true,
997*ab3bc873SGuochun Huang false,
998*ab3bc873SGuochun Huang },
999*ab3bc873SGuochun Huang {
1000*ab3bc873SGuochun Huang CSC_BT601F,
1001*ab3bc873SGuochun Huang OPTM_CS_E_RGB,
1002*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_601,
1003*ab3bc873SGuochun Huang true,
1004*ab3bc873SGuochun Huang true,
1005*ab3bc873SGuochun Huang },
1006*ab3bc873SGuochun Huang {
1007*ab3bc873SGuochun Huang CSC_BT2020,
1008*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020,
1009*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_2020,
1010*ab3bc873SGuochun Huang true,
1011*ab3bc873SGuochun Huang true,
1012*ab3bc873SGuochun Huang },
1013*ab3bc873SGuochun Huang {
1014*ab3bc873SGuochun Huang CSC_BT709L_13BIT,
1015*ab3bc873SGuochun Huang OPTM_CS_E_RGB,
1016*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_709,
1017*ab3bc873SGuochun Huang true,
1018*ab3bc873SGuochun Huang false,
1019*ab3bc873SGuochun Huang },
1020*ab3bc873SGuochun Huang {
1021*ab3bc873SGuochun Huang CSC_BT709F_13BIT,
1022*ab3bc873SGuochun Huang OPTM_CS_E_RGB,
1023*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_709,
1024*ab3bc873SGuochun Huang true,
1025*ab3bc873SGuochun Huang true,
1026*ab3bc873SGuochun Huang },
1027*ab3bc873SGuochun Huang {
1028*ab3bc873SGuochun Huang CSC_BT2020L_13BIT,
1029*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020,
1030*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_2020,
1031*ab3bc873SGuochun Huang true,
1032*ab3bc873SGuochun Huang false,
1033*ab3bc873SGuochun Huang },
1034*ab3bc873SGuochun Huang {
1035*ab3bc873SGuochun Huang CSC_BT2020F_13BIT,
1036*ab3bc873SGuochun Huang OPTM_CS_E_RGB_2020,
1037*ab3bc873SGuochun Huang OPTM_CS_E_XV_YCC_2020,
1038*ab3bc873SGuochun Huang true,
1039*ab3bc873SGuochun Huang true,
1040*ab3bc873SGuochun Huang },
1041*ab3bc873SGuochun Huang };
1042*ab3bc873SGuochun Huang
is_rgb_format(u64 format)1043*ab3bc873SGuochun Huang static bool is_rgb_format(u64 format)
1044*ab3bc873SGuochun Huang {
1045*ab3bc873SGuochun Huang switch (format) {
1046*ab3bc873SGuochun Huang case BUS_FMT_YUV420:
1047*ab3bc873SGuochun Huang case BUS_FMT_YUV422:
1048*ab3bc873SGuochun Huang case BUS_FMT_YUV444:
1049*ab3bc873SGuochun Huang return false;
1050*ab3bc873SGuochun Huang case BUS_FMT_RGB:
1051*ab3bc873SGuochun Huang default:
1052*ab3bc873SGuochun Huang return true;
1053*ab3bc873SGuochun Huang }
1054*ab3bc873SGuochun Huang }
1055*ab3bc873SGuochun Huang
1056*ab3bc873SGuochun Huang struct post_csc_coef {
1057*ab3bc873SGuochun Huang s32 csc_coef00;
1058*ab3bc873SGuochun Huang s32 csc_coef01;
1059*ab3bc873SGuochun Huang s32 csc_coef02;
1060*ab3bc873SGuochun Huang s32 csc_coef10;
1061*ab3bc873SGuochun Huang s32 csc_coef11;
1062*ab3bc873SGuochun Huang s32 csc_coef12;
1063*ab3bc873SGuochun Huang s32 csc_coef20;
1064*ab3bc873SGuochun Huang s32 csc_coef21;
1065*ab3bc873SGuochun Huang s32 csc_coef22;
1066*ab3bc873SGuochun Huang
1067*ab3bc873SGuochun Huang s32 csc_dc0;
1068*ab3bc873SGuochun Huang s32 csc_dc1;
1069*ab3bc873SGuochun Huang s32 csc_dc2;
1070*ab3bc873SGuochun Huang
1071*ab3bc873SGuochun Huang u32 range_type;
1072*ab3bc873SGuochun Huang };
1073*ab3bc873SGuochun Huang
csc_get_mode_index(int post_csc_mode,bool is_input_yuv,bool is_output_yuv)1074*ab3bc873SGuochun Huang static int csc_get_mode_index(int post_csc_mode, bool is_input_yuv, bool is_output_yuv)
1075*ab3bc873SGuochun Huang {
1076*ab3bc873SGuochun Huang const struct rk_csc_colorspace_info *colorspace_info;
1077*ab3bc873SGuochun Huang enum color_space_type input_color_space;
1078*ab3bc873SGuochun Huang enum color_space_type output_color_space;
1079*ab3bc873SGuochun Huang bool is_input_full_range;
1080*ab3bc873SGuochun Huang bool is_output_full_range;
1081*ab3bc873SGuochun Huang int i;
1082*ab3bc873SGuochun Huang
1083*ab3bc873SGuochun Huang for (i = 0; i < ARRAY_SIZE(csc_mapping_table); i++) {
1084*ab3bc873SGuochun Huang if (post_csc_mode == csc_mapping_table[i].csc_format) {
1085*ab3bc873SGuochun Huang input_color_space = is_input_yuv ? csc_mapping_table[i].yuv_color_space :
1086*ab3bc873SGuochun Huang csc_mapping_table[i].rgb_color_space;
1087*ab3bc873SGuochun Huang is_input_full_range = is_input_yuv ? csc_mapping_table[i].yuv_full_range :
1088*ab3bc873SGuochun Huang csc_mapping_table[i].rgb_full_range;
1089*ab3bc873SGuochun Huang output_color_space = is_output_yuv ? csc_mapping_table[i].yuv_color_space :
1090*ab3bc873SGuochun Huang csc_mapping_table[i].rgb_color_space;
1091*ab3bc873SGuochun Huang is_output_full_range = is_output_yuv ? csc_mapping_table[i].yuv_full_range :
1092*ab3bc873SGuochun Huang csc_mapping_table[i].rgb_full_range;
1093*ab3bc873SGuochun Huang break;
1094*ab3bc873SGuochun Huang }
1095*ab3bc873SGuochun Huang }
1096*ab3bc873SGuochun Huang if (i >= ARRAY_SIZE(csc_mapping_table))
1097*ab3bc873SGuochun Huang return -EINVAL;
1098*ab3bc873SGuochun Huang
1099*ab3bc873SGuochun Huang for (i = 0; i < ARRAY_SIZE(g_mode_csc_coef); i++) {
1100*ab3bc873SGuochun Huang colorspace_info = &g_mode_csc_coef[i].st_csc_color_info;
1101*ab3bc873SGuochun Huang if (colorspace_info->input_color_space == input_color_space &&
1102*ab3bc873SGuochun Huang colorspace_info->output_color_space == output_color_space &&
1103*ab3bc873SGuochun Huang colorspace_info->in_full_range == is_input_full_range &&
1104*ab3bc873SGuochun Huang colorspace_info->out_full_range == is_output_full_range)
1105*ab3bc873SGuochun Huang return i;
1106*ab3bc873SGuochun Huang }
1107*ab3bc873SGuochun Huang
1108*ab3bc873SGuochun Huang return -EINVAL;
1109*ab3bc873SGuochun Huang }
1110*ab3bc873SGuochun Huang
csc_matrix_ventor_multiply(struct rk_pq_csc_ventor * dst,const struct rk_pq_csc_coef * m0,const struct rk_pq_csc_ventor * v0)1111*ab3bc873SGuochun Huang static void csc_matrix_ventor_multiply(struct rk_pq_csc_ventor *dst,
1112*ab3bc873SGuochun Huang const struct rk_pq_csc_coef *m0,
1113*ab3bc873SGuochun Huang const struct rk_pq_csc_ventor *v0)
1114*ab3bc873SGuochun Huang {
1115*ab3bc873SGuochun Huang dst->csc_offset0 = m0->csc_coef00 * v0->csc_offset0 +
1116*ab3bc873SGuochun Huang m0->csc_coef01 * v0->csc_offset1 +
1117*ab3bc873SGuochun Huang m0->csc_coef02 * v0->csc_offset2;
1118*ab3bc873SGuochun Huang
1119*ab3bc873SGuochun Huang dst->csc_offset1 = m0->csc_coef10 * v0->csc_offset0 +
1120*ab3bc873SGuochun Huang m0->csc_coef11 * v0->csc_offset1 +
1121*ab3bc873SGuochun Huang m0->csc_coef12 * v0->csc_offset2;
1122*ab3bc873SGuochun Huang
1123*ab3bc873SGuochun Huang dst->csc_offset2 = m0->csc_coef20 * v0->csc_offset0 +
1124*ab3bc873SGuochun Huang m0->csc_coef21 * v0->csc_offset1 +
1125*ab3bc873SGuochun Huang m0->csc_coef22 * v0->csc_offset2;
1126*ab3bc873SGuochun Huang }
1127*ab3bc873SGuochun Huang
pq_csc_simple_round(s32 x,s32 n)1128*ab3bc873SGuochun Huang static inline s32 pq_csc_simple_round(s32 x, s32 n)
1129*ab3bc873SGuochun Huang {
1130*ab3bc873SGuochun Huang s32 value = 0;
1131*ab3bc873SGuochun Huang
1132*ab3bc873SGuochun Huang if (n == 0)
1133*ab3bc873SGuochun Huang return x;
1134*ab3bc873SGuochun Huang
1135*ab3bc873SGuochun Huang value = (abs(x) + (1 << (n - 1))) >> (n);
1136*ab3bc873SGuochun Huang return (((x) >= 0) ? value : -value);
1137*ab3bc873SGuochun Huang }
1138*ab3bc873SGuochun Huang
csc_calc_default_output_coef(const struct rk_csc_mode_coef * csc_mode_cfg,struct rk_pq_csc_coef * out_matrix,struct rk_pq_csc_ventor * out_dc)1139*ab3bc873SGuochun Huang static int csc_calc_default_output_coef(const struct rk_csc_mode_coef *csc_mode_cfg,
1140*ab3bc873SGuochun Huang struct rk_pq_csc_coef *out_matrix,
1141*ab3bc873SGuochun Huang struct rk_pq_csc_ventor *out_dc)
1142*ab3bc873SGuochun Huang {
1143*ab3bc873SGuochun Huang const struct rk_pq_csc_coef *csc_coef;
1144*ab3bc873SGuochun Huang const struct rk_pq_csc_dc_coef *csc_dc_coef;
1145*ab3bc873SGuochun Huang struct rk_pq_csc_ventor dc_in_ventor;
1146*ab3bc873SGuochun Huang struct rk_pq_csc_ventor dc_out_ventor;
1147*ab3bc873SGuochun Huang struct rk_pq_csc_ventor v;
1148*ab3bc873SGuochun Huang
1149*ab3bc873SGuochun Huang csc_coef = csc_mode_cfg->pst_csc_coef;
1150*ab3bc873SGuochun Huang csc_dc_coef = csc_mode_cfg->pst_csc_dc_coef;
1151*ab3bc873SGuochun Huang
1152*ab3bc873SGuochun Huang out_matrix->csc_coef00 = csc_coef->csc_coef00;
1153*ab3bc873SGuochun Huang out_matrix->csc_coef01 = csc_coef->csc_coef01;
1154*ab3bc873SGuochun Huang out_matrix->csc_coef02 = csc_coef->csc_coef02;
1155*ab3bc873SGuochun Huang out_matrix->csc_coef10 = csc_coef->csc_coef10;
1156*ab3bc873SGuochun Huang out_matrix->csc_coef11 = csc_coef->csc_coef11;
1157*ab3bc873SGuochun Huang out_matrix->csc_coef12 = csc_coef->csc_coef12;
1158*ab3bc873SGuochun Huang out_matrix->csc_coef20 = csc_coef->csc_coef20;
1159*ab3bc873SGuochun Huang out_matrix->csc_coef21 = csc_coef->csc_coef21;
1160*ab3bc873SGuochun Huang out_matrix->csc_coef22 = csc_coef->csc_coef22;
1161*ab3bc873SGuochun Huang
1162*ab3bc873SGuochun Huang dc_in_ventor.csc_offset0 = csc_dc_coef->csc_in_dc0;
1163*ab3bc873SGuochun Huang dc_in_ventor.csc_offset1 = csc_dc_coef->csc_in_dc1;
1164*ab3bc873SGuochun Huang dc_in_ventor.csc_offset2 = csc_dc_coef->csc_in_dc2;
1165*ab3bc873SGuochun Huang dc_out_ventor.csc_offset0 = csc_dc_coef->csc_out_dc0;
1166*ab3bc873SGuochun Huang dc_out_ventor.csc_offset1 = csc_dc_coef->csc_out_dc1;
1167*ab3bc873SGuochun Huang dc_out_ventor.csc_offset2 = csc_dc_coef->csc_out_dc2;
1168*ab3bc873SGuochun Huang
1169*ab3bc873SGuochun Huang csc_matrix_ventor_multiply(&v, csc_coef, &dc_in_ventor);
1170*ab3bc873SGuochun Huang out_dc->csc_offset0 = v.csc_offset0 + dc_out_ventor.csc_offset0 *
1171*ab3bc873SGuochun Huang PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM;
1172*ab3bc873SGuochun Huang out_dc->csc_offset1 = v.csc_offset1 + dc_out_ventor.csc_offset1 *
1173*ab3bc873SGuochun Huang PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM;
1174*ab3bc873SGuochun Huang out_dc->csc_offset2 = v.csc_offset2 + dc_out_ventor.csc_offset2 *
1175*ab3bc873SGuochun Huang PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM;
1176*ab3bc873SGuochun Huang
1177*ab3bc873SGuochun Huang return 0;
1178*ab3bc873SGuochun Huang }
1179*ab3bc873SGuochun Huang
vop2_convert_csc_mode(int csc_mode,int bit_depth)1180*ab3bc873SGuochun Huang static int vop2_convert_csc_mode(int csc_mode, int bit_depth)
1181*ab3bc873SGuochun Huang {
1182*ab3bc873SGuochun Huang switch (csc_mode) {
1183*ab3bc873SGuochun Huang case V4L2_COLORSPACE_SMPTE170M:
1184*ab3bc873SGuochun Huang case V4L2_COLORSPACE_470_SYSTEM_M:
1185*ab3bc873SGuochun Huang case V4L2_COLORSPACE_470_SYSTEM_BG:
1186*ab3bc873SGuochun Huang return CSC_BT601L;
1187*ab3bc873SGuochun Huang case V4L2_COLORSPACE_REC709:
1188*ab3bc873SGuochun Huang case V4L2_COLORSPACE_SMPTE240M:
1189*ab3bc873SGuochun Huang case V4L2_COLORSPACE_DEFAULT:
1190*ab3bc873SGuochun Huang if (bit_depth == CSC_13BIT_DEPTH)
1191*ab3bc873SGuochun Huang return CSC_BT709L_13BIT;
1192*ab3bc873SGuochun Huang else
1193*ab3bc873SGuochun Huang return CSC_BT709L;
1194*ab3bc873SGuochun Huang case V4L2_COLORSPACE_JPEG:
1195*ab3bc873SGuochun Huang return CSC_BT601F;
1196*ab3bc873SGuochun Huang case V4L2_COLORSPACE_BT2020:
1197*ab3bc873SGuochun Huang if (bit_depth == CSC_13BIT_DEPTH)
1198*ab3bc873SGuochun Huang return CSC_BT2020L_13BIT;
1199*ab3bc873SGuochun Huang else
1200*ab3bc873SGuochun Huang return CSC_BT2020;
1201*ab3bc873SGuochun Huang case V4L2_COLORSPACE_BT709F:
1202*ab3bc873SGuochun Huang if (bit_depth == CSC_10BIT_DEPTH)
1203*ab3bc873SGuochun Huang return CSC_BT601F;
1204*ab3bc873SGuochun Huang else
1205*ab3bc873SGuochun Huang return CSC_BT709F_13BIT;
1206*ab3bc873SGuochun Huang case V4L2_COLORSPACE_BT2020F:
1207*ab3bc873SGuochun Huang if (bit_depth == CSC_10BIT_DEPTH)
1208*ab3bc873SGuochun Huang return CSC_BT601F;
1209*ab3bc873SGuochun Huang else
1210*ab3bc873SGuochun Huang return CSC_BT2020F_13BIT;
1211*ab3bc873SGuochun Huang default:
1212*ab3bc873SGuochun Huang return CSC_BT709L;
1213*ab3bc873SGuochun Huang }
1214*ab3bc873SGuochun Huang }
1215*ab3bc873SGuochun Huang
rockchip_calc_post_csc(struct post_csc_coef * csc_simple_coef,int csc_mode,bool is_input_yuv,bool is_output_yuv)1216*ab3bc873SGuochun Huang static int rockchip_calc_post_csc(struct post_csc_coef *csc_simple_coef,
1217*ab3bc873SGuochun Huang int csc_mode, bool is_input_yuv, bool is_output_yuv)
1218*ab3bc873SGuochun Huang {
1219*ab3bc873SGuochun Huang int ret = 0;
1220*ab3bc873SGuochun Huang struct rk_pq_csc_coef out_matrix;
1221*ab3bc873SGuochun Huang struct rk_pq_csc_ventor out_dc;
1222*ab3bc873SGuochun Huang const struct rk_csc_mode_coef *csc_mode_cfg;
1223*ab3bc873SGuochun Huang int bit_num = PQ_CSC_SIMPLE_MAT_PARAM_FIX_BIT_WIDTH;
1224*ab3bc873SGuochun Huang
1225*ab3bc873SGuochun Huang ret = csc_get_mode_index(csc_mode, is_input_yuv, is_output_yuv);
1226*ab3bc873SGuochun Huang if (ret < 0)
1227*ab3bc873SGuochun Huang return ret;
1228*ab3bc873SGuochun Huang
1229*ab3bc873SGuochun Huang csc_mode_cfg = &g_mode_csc_coef[ret];
1230*ab3bc873SGuochun Huang
1231*ab3bc873SGuochun Huang ret = csc_calc_default_output_coef(csc_mode_cfg, &out_matrix, &out_dc);
1232*ab3bc873SGuochun Huang
1233*ab3bc873SGuochun Huang csc_simple_coef->csc_coef00 = out_matrix.csc_coef00;
1234*ab3bc873SGuochun Huang csc_simple_coef->csc_coef01 = out_matrix.csc_coef01;
1235*ab3bc873SGuochun Huang csc_simple_coef->csc_coef02 = out_matrix.csc_coef02;
1236*ab3bc873SGuochun Huang csc_simple_coef->csc_coef10 = out_matrix.csc_coef10;
1237*ab3bc873SGuochun Huang csc_simple_coef->csc_coef11 = out_matrix.csc_coef11;
1238*ab3bc873SGuochun Huang csc_simple_coef->csc_coef12 = out_matrix.csc_coef12;
1239*ab3bc873SGuochun Huang csc_simple_coef->csc_coef20 = out_matrix.csc_coef20;
1240*ab3bc873SGuochun Huang csc_simple_coef->csc_coef21 = out_matrix.csc_coef21;
1241*ab3bc873SGuochun Huang csc_simple_coef->csc_coef22 = out_matrix.csc_coef22;
1242*ab3bc873SGuochun Huang csc_simple_coef->csc_dc0 = out_dc.csc_offset0;
1243*ab3bc873SGuochun Huang csc_simple_coef->csc_dc1 = out_dc.csc_offset1;
1244*ab3bc873SGuochun Huang csc_simple_coef->csc_dc2 = out_dc.csc_offset2;
1245*ab3bc873SGuochun Huang
1246*ab3bc873SGuochun Huang csc_simple_coef->csc_dc0 = pq_csc_simple_round(csc_simple_coef->csc_dc0, bit_num);
1247*ab3bc873SGuochun Huang csc_simple_coef->csc_dc1 = pq_csc_simple_round(csc_simple_coef->csc_dc1, bit_num);
1248*ab3bc873SGuochun Huang csc_simple_coef->csc_dc2 = pq_csc_simple_round(csc_simple_coef->csc_dc2, bit_num);
1249*ab3bc873SGuochun Huang csc_simple_coef->range_type = csc_mode_cfg->st_csc_color_info.out_full_range;
1250*ab3bc873SGuochun Huang
1251*ab3bc873SGuochun Huang return ret;
1252*ab3bc873SGuochun Huang }
1253*ab3bc873SGuochun Huang
calc_dsp_frm_hst_vst(const struct drm_display_mode * src,const struct drm_display_mode * dst,u32 * dsp_frame_hst,u32 * dsp_frame_vst)1254*ab3bc873SGuochun Huang static void calc_dsp_frm_hst_vst(const struct drm_display_mode *src,
1255*ab3bc873SGuochun Huang const struct drm_display_mode *dst,
1256*ab3bc873SGuochun Huang u32 *dsp_frame_hst,
1257*ab3bc873SGuochun Huang u32 *dsp_frame_vst)
1258*ab3bc873SGuochun Huang {
1259*ab3bc873SGuochun Huang u32 bp_in, bp_out;
1260*ab3bc873SGuochun Huang u32 v_scale_ratio;
1261*ab3bc873SGuochun Huang u64 t_frm_st;
1262*ab3bc873SGuochun Huang u64 t_bp_in, t_bp_out, t_delta, tin;
1263*ab3bc873SGuochun Huang u32 src_pixclock, dst_pixclock;
1264*ab3bc873SGuochun Huang u32 dst_htotal, dst_hsync_len, dst_hback_porch;
1265*ab3bc873SGuochun Huang u32 dst_vsync_len, dst_vback_porch, dst_vactive;
1266*ab3bc873SGuochun Huang u32 src_htotal, src_hsync_len, src_hback_porch;
1267*ab3bc873SGuochun Huang u32 src_vtotal, src_vsync_len, src_vback_porch, src_vactive;
1268*ab3bc873SGuochun Huang u32 rem;
1269*ab3bc873SGuochun Huang u32 x;
1270*ab3bc873SGuochun Huang
1271*ab3bc873SGuochun Huang src_pixclock = div_u64(1000000000llu, src->clock);
1272*ab3bc873SGuochun Huang dst_pixclock = div_u64(1000000000llu, dst->clock);
1273*ab3bc873SGuochun Huang
1274*ab3bc873SGuochun Huang src_hsync_len = src->hsync_end - src->hsync_start;
1275*ab3bc873SGuochun Huang src_hback_porch = src->htotal - src->hsync_end;
1276*ab3bc873SGuochun Huang src_htotal = src->htotal;
1277*ab3bc873SGuochun Huang src_vsync_len = src->vsync_end - src->vsync_start;
1278*ab3bc873SGuochun Huang src_vback_porch = src->vtotal - src->vsync_end;
1279*ab3bc873SGuochun Huang src_vactive = src->vdisplay;
1280*ab3bc873SGuochun Huang src_vtotal = src->vtotal;
1281*ab3bc873SGuochun Huang
1282*ab3bc873SGuochun Huang dst_hsync_len = dst->hsync_end - dst->hsync_start;
1283*ab3bc873SGuochun Huang dst_hback_porch = dst->htotal - dst->hsync_end;
1284*ab3bc873SGuochun Huang dst_htotal = dst->htotal;
1285*ab3bc873SGuochun Huang dst_vsync_len = dst->vsync_end - dst->vsync_start;
1286*ab3bc873SGuochun Huang dst_vback_porch = dst->vtotal - dst->vsync_end;
1287*ab3bc873SGuochun Huang dst_vactive = dst->vdisplay;
1288*ab3bc873SGuochun Huang
1289*ab3bc873SGuochun Huang bp_in = (src_vback_porch + src_vsync_len) * src_htotal +
1290*ab3bc873SGuochun Huang src_hsync_len + src_hback_porch;
1291*ab3bc873SGuochun Huang bp_out = (dst_vback_porch + dst_vsync_len) * dst_htotal +
1292*ab3bc873SGuochun Huang dst_hsync_len + dst_hback_porch;
1293*ab3bc873SGuochun Huang
1294*ab3bc873SGuochun Huang t_bp_in = bp_in * src_pixclock;
1295*ab3bc873SGuochun Huang t_bp_out = bp_out * dst_pixclock;
1296*ab3bc873SGuochun Huang tin = src_vtotal * src_htotal * src_pixclock;
1297*ab3bc873SGuochun Huang
1298*ab3bc873SGuochun Huang v_scale_ratio = src_vactive / dst_vactive;
1299*ab3bc873SGuochun Huang x = 5;
1300*ab3bc873SGuochun Huang __retry:
1301*ab3bc873SGuochun Huang if (v_scale_ratio <= 2)
1302*ab3bc873SGuochun Huang t_delta = x * src_htotal * src_pixclock;
1303*ab3bc873SGuochun Huang else
1304*ab3bc873SGuochun Huang t_delta = 12 * src_htotal * src_pixclock;
1305*ab3bc873SGuochun Huang
1306*ab3bc873SGuochun Huang if (t_bp_in + t_delta > t_bp_out)
1307*ab3bc873SGuochun Huang t_frm_st = (t_bp_in + t_delta - t_bp_out);
1308*ab3bc873SGuochun Huang else
1309*ab3bc873SGuochun Huang t_frm_st = tin - (t_bp_out - (t_bp_in + t_delta));
1310*ab3bc873SGuochun Huang
1311*ab3bc873SGuochun Huang do_div(t_frm_st, src_pixclock);
1312*ab3bc873SGuochun Huang rem = do_div(t_frm_st, src_htotal);
1313*ab3bc873SGuochun Huang if ((t_frm_st < 2 || t_frm_st > 14) && x < 12) {
1314*ab3bc873SGuochun Huang x++;
1315*ab3bc873SGuochun Huang goto __retry;
1316*ab3bc873SGuochun Huang }
1317*ab3bc873SGuochun Huang if (t_frm_st < 2 || t_frm_st > 14)
1318*ab3bc873SGuochun Huang t_frm_st = 4;
1319*ab3bc873SGuochun Huang
1320*ab3bc873SGuochun Huang *dsp_frame_hst = rem;
1321*ab3bc873SGuochun Huang *dsp_frame_vst = t_frm_st;
1322*ab3bc873SGuochun Huang }
1323*ab3bc873SGuochun Huang
rk628_post_process_scaler_init(struct rk628 * rk628,struct drm_display_mode * src,const struct drm_display_mode * dst)1324*ab3bc873SGuochun Huang static void rk628_post_process_scaler_init(struct rk628 *rk628,
1325*ab3bc873SGuochun Huang struct drm_display_mode *src,
1326*ab3bc873SGuochun Huang const struct drm_display_mode *dst)
1327*ab3bc873SGuochun Huang {
1328*ab3bc873SGuochun Huang u32 dsp_frame_hst, dsp_frame_vst;
1329*ab3bc873SGuochun Huang u32 scl_hor_mode, scl_ver_mode;
1330*ab3bc873SGuochun Huang u32 scl_v_factor, scl_h_factor;
1331*ab3bc873SGuochun Huang u32 dsp_htotal, dsp_hs_end, dsp_hact_st, dsp_hact_end;
1332*ab3bc873SGuochun Huang u32 dsp_vtotal, dsp_vs_end, dsp_vact_st, dsp_vact_end;
1333*ab3bc873SGuochun Huang u32 dsp_hbor_end, dsp_hbor_st, dsp_vbor_end, dsp_vbor_st;
1334*ab3bc873SGuochun Huang u16 bor_right = 0, bor_left = 0, bor_up = 0, bor_down = 0;
1335*ab3bc873SGuochun Huang u8 hor_down_mode = 0, ver_down_mode = 0;
1336*ab3bc873SGuochun Huang u32 dst_hsync_len, dst_hback_porch, dst_hfront_porch, dst_hactive;
1337*ab3bc873SGuochun Huang u32 dst_vsync_len, dst_vback_porch, dst_vfront_porch, dst_vactive;
1338*ab3bc873SGuochun Huang u32 src_hactive;
1339*ab3bc873SGuochun Huang u32 src_vactive;
1340*ab3bc873SGuochun Huang int gvi_offset = 0;
1341*ab3bc873SGuochun Huang
1342*ab3bc873SGuochun Huang if (rk628->version == RK628F_VERSION && rk628->gvi.division_mode)
1343*ab3bc873SGuochun Huang gvi_offset = 4;
1344*ab3bc873SGuochun Huang
1345*ab3bc873SGuochun Huang src_hactive = src->hdisplay;
1346*ab3bc873SGuochun Huang src_vactive = src->vdisplay;
1347*ab3bc873SGuochun Huang
1348*ab3bc873SGuochun Huang dst_hactive = dst->hdisplay;
1349*ab3bc873SGuochun Huang dst_hsync_len = dst->hsync_end - dst->hsync_start;
1350*ab3bc873SGuochun Huang dst_hback_porch = dst->htotal - dst->hsync_end;
1351*ab3bc873SGuochun Huang dst_hfront_porch = dst->hsync_start - dst->hdisplay;
1352*ab3bc873SGuochun Huang dst_vsync_len = dst->vsync_end - dst->vsync_start;
1353*ab3bc873SGuochun Huang dst_vback_porch = dst->vtotal - dst->vsync_end;
1354*ab3bc873SGuochun Huang dst_vfront_porch = dst->vsync_start - dst->vdisplay;
1355*ab3bc873SGuochun Huang dst_vactive = dst->vdisplay;
1356*ab3bc873SGuochun Huang
1357*ab3bc873SGuochun Huang dsp_htotal = dst_hsync_len + dst_hback_porch +
1358*ab3bc873SGuochun Huang dst_hactive + dst_hfront_porch;
1359*ab3bc873SGuochun Huang dsp_vtotal = dst_vsync_len + dst_vback_porch +
1360*ab3bc873SGuochun Huang dst_vactive + dst_vfront_porch;
1361*ab3bc873SGuochun Huang dsp_hs_end = dst_hsync_len;
1362*ab3bc873SGuochun Huang dsp_vs_end = dst_vsync_len;
1363*ab3bc873SGuochun Huang dsp_hbor_end = dst_hsync_len + dst_hback_porch + dst_hactive - gvi_offset;
1364*ab3bc873SGuochun Huang dsp_hbor_st = dst_hsync_len + dst_hback_porch - gvi_offset;
1365*ab3bc873SGuochun Huang dsp_vbor_end = dst_vsync_len + dst_vback_porch + dst_vactive;
1366*ab3bc873SGuochun Huang dsp_vbor_st = dst_vsync_len + dst_vback_porch;
1367*ab3bc873SGuochun Huang dsp_hact_st = dsp_hbor_st + bor_left;
1368*ab3bc873SGuochun Huang dsp_hact_end = dsp_hbor_end - bor_right;
1369*ab3bc873SGuochun Huang dsp_vact_st = dsp_vbor_st + bor_up;
1370*ab3bc873SGuochun Huang dsp_vact_end = dsp_vbor_end - bor_down;
1371*ab3bc873SGuochun Huang
1372*ab3bc873SGuochun Huang calc_dsp_frm_hst_vst(src, dst, &dsp_frame_hst, &dsp_frame_vst);
1373*ab3bc873SGuochun Huang printf("rk628 dsp_frame_vst:%d dsp_frame_hst:%d\n",
1374*ab3bc873SGuochun Huang dsp_frame_vst, dsp_frame_hst);
1375*ab3bc873SGuochun Huang
1376*ab3bc873SGuochun Huang if (src_hactive > dst_hactive) {
1377*ab3bc873SGuochun Huang scl_hor_mode = 2;
1378*ab3bc873SGuochun Huang
1379*ab3bc873SGuochun Huang if (hor_down_mode == 0) {
1380*ab3bc873SGuochun Huang if ((src_hactive - 1) / (dst_hactive - 1) > 2)
1381*ab3bc873SGuochun Huang scl_h_factor = ((src_hactive - 1) << 14) /
1382*ab3bc873SGuochun Huang (dst_hactive - 1);
1383*ab3bc873SGuochun Huang else
1384*ab3bc873SGuochun Huang scl_h_factor = ((src_hactive - 2) << 14) /
1385*ab3bc873SGuochun Huang (dst_hactive - 1);
1386*ab3bc873SGuochun Huang } else {
1387*ab3bc873SGuochun Huang scl_h_factor = (dst_hactive << 16) / (src_hactive - 1);
1388*ab3bc873SGuochun Huang }
1389*ab3bc873SGuochun Huang
1390*ab3bc873SGuochun Huang } else if (src_hactive == dst_hactive) {
1391*ab3bc873SGuochun Huang scl_hor_mode = 0;
1392*ab3bc873SGuochun Huang scl_h_factor = 0;
1393*ab3bc873SGuochun Huang } else {
1394*ab3bc873SGuochun Huang scl_hor_mode = 1;
1395*ab3bc873SGuochun Huang scl_h_factor = ((src_hactive - 1) << 16) / (dst_hactive - 1);
1396*ab3bc873SGuochun Huang }
1397*ab3bc873SGuochun Huang
1398*ab3bc873SGuochun Huang if (src_vactive > dst_vactive) {
1399*ab3bc873SGuochun Huang scl_ver_mode = 2;
1400*ab3bc873SGuochun Huang
1401*ab3bc873SGuochun Huang if (ver_down_mode == 0) {
1402*ab3bc873SGuochun Huang if ((src_vactive - 1) / (dst_vactive - 1) > 2)
1403*ab3bc873SGuochun Huang scl_v_factor = ((src_vactive - 1) << 14) /
1404*ab3bc873SGuochun Huang (dst_vactive - 1);
1405*ab3bc873SGuochun Huang else
1406*ab3bc873SGuochun Huang scl_v_factor = ((src_vactive - 2) << 14) /
1407*ab3bc873SGuochun Huang (dst_vactive - 1);
1408*ab3bc873SGuochun Huang } else {
1409*ab3bc873SGuochun Huang scl_v_factor = (dst_vactive << 16) / (src_vactive - 1);
1410*ab3bc873SGuochun Huang }
1411*ab3bc873SGuochun Huang
1412*ab3bc873SGuochun Huang } else if (src_vactive == dst_vactive) {
1413*ab3bc873SGuochun Huang scl_ver_mode = 0;
1414*ab3bc873SGuochun Huang scl_v_factor = 0;
1415*ab3bc873SGuochun Huang } else {
1416*ab3bc873SGuochun Huang scl_ver_mode = 1;
1417*ab3bc873SGuochun Huang scl_v_factor = ((src_vactive - 1) << 16) / (dst_vactive - 1);
1418*ab3bc873SGuochun Huang }
1419*ab3bc873SGuochun Huang
1420*ab3bc873SGuochun Huang rk628_i2c_update_bits(rk628, GRF_RGB_DEC_CON0, SW_HRES_MASK,
1421*ab3bc873SGuochun Huang SW_HRES(src_hactive));
1422*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_SCALER_CON0, SCL_VER_DOWN_MODE(ver_down_mode) |
1423*ab3bc873SGuochun Huang SCL_HOR_DOWN_MODE(hor_down_mode) |
1424*ab3bc873SGuochun Huang SCL_VER_MODE(scl_ver_mode) |
1425*ab3bc873SGuochun Huang SCL_HOR_MODE(scl_hor_mode));
1426*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_SCALER_CON1, SCL_V_FACTOR(scl_v_factor) |
1427*ab3bc873SGuochun Huang SCL_H_FACTOR(scl_h_factor));
1428*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_SCALER_CON2, DSP_FRAME_VST(dsp_frame_vst) |
1429*ab3bc873SGuochun Huang DSP_FRAME_HST(dsp_frame_hst));
1430*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_SCALER_CON3, DSP_HS_END(dsp_hs_end) |
1431*ab3bc873SGuochun Huang DSP_HTOTAL(dsp_htotal));
1432*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_SCALER_CON4, DSP_HACT_END(dsp_hact_end) |
1433*ab3bc873SGuochun Huang DSP_HACT_ST(dsp_hact_st));
1434*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_SCALER_CON5, DSP_VS_END(dsp_vs_end) |
1435*ab3bc873SGuochun Huang DSP_VTOTAL(dsp_vtotal));
1436*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_SCALER_CON6, DSP_VACT_END(dsp_vact_end) |
1437*ab3bc873SGuochun Huang DSP_VACT_ST(dsp_vact_st));
1438*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_SCALER_CON7, DSP_HBOR_END(dsp_hbor_end) |
1439*ab3bc873SGuochun Huang DSP_HBOR_ST(dsp_hbor_st));
1440*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_SCALER_CON8, DSP_VBOR_END(dsp_vbor_end) |
1441*ab3bc873SGuochun Huang DSP_VBOR_ST(dsp_vbor_st));
1442*ab3bc873SGuochun Huang }
1443*ab3bc873SGuochun Huang
rk628_post_process_init(struct rk628 * rk628)1444*ab3bc873SGuochun Huang void rk628_post_process_init(struct rk628 *rk628)
1445*ab3bc873SGuochun Huang {
1446*ab3bc873SGuochun Huang struct drm_display_mode *src = &rk628->src_mode;
1447*ab3bc873SGuochun Huang const struct drm_display_mode *dst = &rk628->dst_mode;
1448*ab3bc873SGuochun Huang u64 dst_rate, src_rate;
1449*ab3bc873SGuochun Huang
1450*ab3bc873SGuochun Huang src_rate = src->clock * 1000;
1451*ab3bc873SGuochun Huang dst_rate = src_rate * dst->vtotal * dst->htotal;
1452*ab3bc873SGuochun Huang do_div(dst_rate, (src->vtotal * src->htotal));
1453*ab3bc873SGuochun Huang do_div(dst_rate, 1000);
1454*ab3bc873SGuochun Huang printf("rk628 src %dx%d clock:%d\n",
1455*ab3bc873SGuochun Huang src->hdisplay, src->vdisplay, src->clock);
1456*ab3bc873SGuochun Huang
1457*ab3bc873SGuochun Huang printf("rk628 dst %dx%d clock:%llu\n",
1458*ab3bc873SGuochun Huang dst->hdisplay, dst->vdisplay, dst_rate);
1459*ab3bc873SGuochun Huang
1460*ab3bc873SGuochun Huang rk628_cru_clk_set_rate(rk628, CGU_CLK_RX_READ, src->clock * 1000);
1461*ab3bc873SGuochun Huang rk628_cru_clk_set_rate(rk628, CGU_SCLK_VOP, dst_rate * 1000);
1462*ab3bc873SGuochun Huang
1463*ab3bc873SGuochun Huang if (rk628_output_is_hdmi(rk628)) {
1464*ab3bc873SGuochun Huang rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, SW_VSYNC_POL_MASK,
1465*ab3bc873SGuochun Huang SW_VSYNC_POL(rk628->sync_pol));
1466*ab3bc873SGuochun Huang rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, SW_HSYNC_POL_MASK,
1467*ab3bc873SGuochun Huang SW_HSYNC_POL(rk628->sync_pol));
1468*ab3bc873SGuochun Huang } else {
1469*ab3bc873SGuochun Huang if (src->flags & DRM_MODE_FLAG_PVSYNC)
1470*ab3bc873SGuochun Huang rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
1471*ab3bc873SGuochun Huang SW_VSYNC_POL_MASK, SW_VSYNC_POL(1));
1472*ab3bc873SGuochun Huang if (src->flags & DRM_MODE_FLAG_PHSYNC)
1473*ab3bc873SGuochun Huang rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
1474*ab3bc873SGuochun Huang SW_HSYNC_POL_MASK,
1475*ab3bc873SGuochun Huang SW_HSYNC_POL(1));
1476*ab3bc873SGuochun Huang }
1477*ab3bc873SGuochun Huang
1478*ab3bc873SGuochun Huang rk628_post_process_scaler_init(rk628, src, dst);
1479*ab3bc873SGuochun Huang }
1480*ab3bc873SGuochun Huang
rk628_post_process_csc(struct rk628 * rk628)1481*ab3bc873SGuochun Huang static void rk628_post_process_csc(struct rk628 *rk628)
1482*ab3bc873SGuochun Huang {
1483*ab3bc873SGuochun Huang enum bus_format in_fmt, out_fmt;
1484*ab3bc873SGuochun Huang struct post_csc_coef csc_coef = {};
1485*ab3bc873SGuochun Huang bool is_input_yuv, is_output_yuv;
1486*ab3bc873SGuochun Huang u32 color_space = V4L2_COLORSPACE_DEFAULT;
1487*ab3bc873SGuochun Huang u32 csc_mode;
1488*ab3bc873SGuochun Huang u32 val;
1489*ab3bc873SGuochun Huang int range_type;
1490*ab3bc873SGuochun Huang
1491*ab3bc873SGuochun Huang in_fmt = rk628_get_input_bus_format(rk628);
1492*ab3bc873SGuochun Huang out_fmt = rk628_get_output_bus_format(rk628);
1493*ab3bc873SGuochun Huang
1494*ab3bc873SGuochun Huang if (in_fmt == out_fmt) {
1495*ab3bc873SGuochun Huang if (out_fmt == BUS_FMT_YUV422) {
1496*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_CTRL_CON,
1497*ab3bc873SGuochun Huang SW_YUV2VYU_SWP(1) |
1498*ab3bc873SGuochun Huang SW_R2Y_EN(0));
1499*ab3bc873SGuochun Huang return;
1500*ab3bc873SGuochun Huang }
1501*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_CTRL_CON, SW_R2Y_EN(0));
1502*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_CTRL_CON, SW_Y2R_EN(0));
1503*ab3bc873SGuochun Huang return;
1504*ab3bc873SGuochun Huang }
1505*ab3bc873SGuochun Huang
1506*ab3bc873SGuochun Huang if (rk628->version == RK628D_VERSION) {
1507*ab3bc873SGuochun Huang if (in_fmt == BUS_FMT_RGB)
1508*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_CTRL_CON, SW_R2Y_EN(1));
1509*ab3bc873SGuochun Huang else if (out_fmt == BUS_FMT_RGB)
1510*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_CTRL_CON, SW_Y2R_EN(1));
1511*ab3bc873SGuochun Huang } else {
1512*ab3bc873SGuochun Huang csc_mode = vop2_convert_csc_mode(color_space, CSC_13BIT_DEPTH);
1513*ab3bc873SGuochun Huang
1514*ab3bc873SGuochun Huang is_input_yuv = !is_rgb_format(in_fmt);
1515*ab3bc873SGuochun Huang is_output_yuv = !is_rgb_format(out_fmt);
1516*ab3bc873SGuochun Huang rockchip_calc_post_csc(&csc_coef, csc_mode, is_input_yuv, is_output_yuv);
1517*ab3bc873SGuochun Huang
1518*ab3bc873SGuochun Huang val = ((csc_coef.csc_coef01 & 0xffff) << 16) | (csc_coef.csc_coef00 & 0xffff);
1519*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_MATRIX_COE01_COE00, val);
1520*ab3bc873SGuochun Huang
1521*ab3bc873SGuochun Huang val = ((csc_coef.csc_coef10 & 0xffff) << 16) | (csc_coef.csc_coef02 & 0xffff);
1522*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_MATRIX_COE10_COE02, val);
1523*ab3bc873SGuochun Huang
1524*ab3bc873SGuochun Huang val = ((csc_coef.csc_coef12 & 0xffff) << 16) | (csc_coef.csc_coef11 & 0xffff);
1525*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_MATRIX_COE12_COE11, val);
1526*ab3bc873SGuochun Huang
1527*ab3bc873SGuochun Huang val = ((csc_coef.csc_coef21 & 0xffff) << 16) | (csc_coef.csc_coef20 & 0xffff);
1528*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_MATRIX_COE21_COE20, val);
1529*ab3bc873SGuochun Huang
1530*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_MATRIX_COE22, csc_coef.csc_coef22);
1531*ab3bc873SGuochun Huang
1532*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_MATRIX_OFFSET0, csc_coef.csc_dc0);
1533*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_MATRIX_OFFSET1, csc_coef.csc_dc1);
1534*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_MATRIX_OFFSET2, csc_coef.csc_dc2);
1535*ab3bc873SGuochun Huang
1536*ab3bc873SGuochun Huang range_type = csc_coef.range_type ? 0 : 1;
1537*ab3bc873SGuochun Huang range_type <<= is_input_yuv ? 0 : 1;
1538*ab3bc873SGuochun Huang val = SW_Y2R_MODE(range_type) | SW_FROM_CSC_MATRIX_EN(1);
1539*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_CTRL_CON, val);
1540*ab3bc873SGuochun Huang
1541*ab3bc873SGuochun Huang if (rk628_output_is_bt1120(rk628))
1542*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_CSC_CTRL_CON, SW_YUV2VYU_SWP(1));
1543*ab3bc873SGuochun Huang }
1544*ab3bc873SGuochun Huang }
1545*ab3bc873SGuochun Huang
rk628_post_process_enable(struct rk628 * rk628)1546*ab3bc873SGuochun Huang void rk628_post_process_enable(struct rk628 *rk628)
1547*ab3bc873SGuochun Huang {
1548*ab3bc873SGuochun Huang #if 0
1549*ab3bc873SGuochun Huang /*
1550*ab3bc873SGuochun Huang * bt1120 needs to configure the timing register, but hdmitx will modify
1551*ab3bc873SGuochun Huang * the timing as needed, so the bt1120 enable process is moved here.
1552*ab3bc873SGuochun Huang */
1553*ab3bc873SGuochun Huang if (rk628_input_is_bt1120(rk628))
1554*ab3bc873SGuochun Huang rk628_bt1120_rx_enable(rk628);
1555*ab3bc873SGuochun Huang #endif
1556*ab3bc873SGuochun Huang rk628_post_process_csc(rk628);
1557*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_SCALER_CON0, SCL_EN(1));
1558*ab3bc873SGuochun Huang }
1559*ab3bc873SGuochun Huang
rk628_post_process_disable(struct rk628 * rk628)1560*ab3bc873SGuochun Huang void rk628_post_process_disable(struct rk628 *rk628)
1561*ab3bc873SGuochun Huang {
1562*ab3bc873SGuochun Huang rk628_i2c_write(rk628, GRF_SCALER_CON0, SCL_EN(0));
1563*ab3bc873SGuochun Huang }
1564