1fb4d8502Sjsg /*
2fb4d8502Sjsg  * Copyright 2012-15 Advanced Micro Devices, Inc.
3fb4d8502Sjsg  *
4fb4d8502Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
5fb4d8502Sjsg  * copy of this software and associated documentation files (the "Software"),
6fb4d8502Sjsg  * to deal in the Software without restriction, including without limitation
7fb4d8502Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fb4d8502Sjsg  *  and/or sell copies of the Software, and to permit persons to whom the
9fb4d8502Sjsg  * Software is furnished to do so, subject to the following conditions:
10fb4d8502Sjsg  *
11fb4d8502Sjsg  * The above copyright notice and this permission notice shall be included in
12fb4d8502Sjsg  * all copies or substantial portions of the Software.
13fb4d8502Sjsg  *
14fb4d8502Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fb4d8502Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fb4d8502Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17fb4d8502Sjsg  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18fb4d8502Sjsg  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19fb4d8502Sjsg  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20fb4d8502Sjsg  * OTHER DEALINGS IN THE SOFTWARE.
21fb4d8502Sjsg  *
22fb4d8502Sjsg  * Authors: AMD
23fb4d8502Sjsg  *
24fb4d8502Sjsg  */
25fb4d8502Sjsg 
26fb4d8502Sjsg #include "dm_services.h"
27fb4d8502Sjsg #include "dce110_transform_v.h"
28fb4d8502Sjsg #include "basics/conversion.h"
29fb4d8502Sjsg 
30fb4d8502Sjsg /* include DCE11 register header files */
31fb4d8502Sjsg #include "dce/dce_11_0_d.h"
32fb4d8502Sjsg #include "dce/dce_11_0_sh_mask.h"
33fb4d8502Sjsg #include "dce/dce_11_0_enum.h"
34fb4d8502Sjsg 
35fb4d8502Sjsg enum {
36fb4d8502Sjsg 	OUTPUT_CSC_MATRIX_SIZE = 12
37fb4d8502Sjsg };
38fb4d8502Sjsg 
39fb4d8502Sjsg /* constrast:0 - 2.0, default 1.0 */
40fb4d8502Sjsg #define UNDERLAY_CONTRAST_DEFAULT 100
41fb4d8502Sjsg #define UNDERLAY_CONTRAST_MAX     200
42fb4d8502Sjsg #define UNDERLAY_CONTRAST_MIN       0
43fb4d8502Sjsg #define UNDERLAY_CONTRAST_STEP      1
44fb4d8502Sjsg #define UNDERLAY_CONTRAST_DIVIDER 100
45fb4d8502Sjsg 
46fb4d8502Sjsg /* Saturation: 0 - 2.0; default 1.0 */
47fb4d8502Sjsg #define UNDERLAY_SATURATION_DEFAULT   100 /*1.00*/
48fb4d8502Sjsg #define UNDERLAY_SATURATION_MIN         0
49fb4d8502Sjsg #define UNDERLAY_SATURATION_MAX       200 /* 2.00 */
50fb4d8502Sjsg #define UNDERLAY_SATURATION_STEP        1 /* 0.01 */
51fb4d8502Sjsg /*actual max overlay saturation
52fb4d8502Sjsg  * value = UNDERLAY_SATURATION_MAX /UNDERLAY_SATURATION_DIVIDER
53fb4d8502Sjsg  */
54fb4d8502Sjsg 
55fb4d8502Sjsg /* Hue */
56fb4d8502Sjsg #define  UNDERLAY_HUE_DEFAULT      0
57fb4d8502Sjsg #define  UNDERLAY_HUE_MIN       -300
58fb4d8502Sjsg #define  UNDERLAY_HUE_MAX        300
59fb4d8502Sjsg #define  UNDERLAY_HUE_STEP         5
60fb4d8502Sjsg #define  UNDERLAY_HUE_DIVIDER   10 /* HW range: -30 ~ +30 */
61fb4d8502Sjsg #define UNDERLAY_SATURATION_DIVIDER   100
62fb4d8502Sjsg 
63fb4d8502Sjsg /* Brightness: in DAL usually -.25 ~ .25.
64fb4d8502Sjsg  * In MMD is -100 to +100 in 16-235 range; which when scaled to full range is
65fb4d8502Sjsg  *  ~-116 to +116. When normalized this is about 0.4566.
66fb4d8502Sjsg  * With 100 divider this becomes 46, but we may use another for better precision
67fb4d8502Sjsg  * The ideal one is 100/219 ((100/255)*(255/219)),
68fb4d8502Sjsg  * i.e. min/max = +-100, divider = 219
69fb4d8502Sjsg  * default 0.0
70fb4d8502Sjsg  */
71fb4d8502Sjsg #define  UNDERLAY_BRIGHTNESS_DEFAULT    0
72fb4d8502Sjsg #define  UNDERLAY_BRIGHTNESS_MIN      -46 /* ~116/255 */
73fb4d8502Sjsg #define  UNDERLAY_BRIGHTNESS_MAX       46
74fb4d8502Sjsg #define  UNDERLAY_BRIGHTNESS_STEP       1 /*  .01 */
75fb4d8502Sjsg #define  UNDERLAY_BRIGHTNESS_DIVIDER  100
76fb4d8502Sjsg 
77fb4d8502Sjsg static const struct out_csc_color_matrix global_color_matrix[] = {
78fb4d8502Sjsg { COLOR_SPACE_SRGB,
79fb4d8502Sjsg 	{ 0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} },
80fb4d8502Sjsg { COLOR_SPACE_SRGB_LIMITED,
81fb4d8502Sjsg 	{ 0x1B60, 0, 0, 0x200, 0, 0x1B60, 0, 0x200, 0, 0, 0x1B60, 0x200} },
82fb4d8502Sjsg { COLOR_SPACE_YCBCR601,
83fb4d8502Sjsg 	{ 0xE00, 0xF447, 0xFDB9, 0x1000, 0x82F, 0x1012, 0x31F, 0x200, 0xFB47,
84fb4d8502Sjsg 		0xF6B9, 0xE00, 0x1000} },
85fb4d8502Sjsg { COLOR_SPACE_YCBCR709, { 0xE00, 0xF349, 0xFEB7, 0x1000, 0x5D2, 0x1394, 0x1FA,
86fb4d8502Sjsg 	0x200, 0xFCCB, 0xF535, 0xE00, 0x1000} },
87fb4d8502Sjsg /* TODO: correct values below */
88fb4d8502Sjsg { COLOR_SPACE_YCBCR601_LIMITED, { 0xE00, 0xF447, 0xFDB9, 0x1000, 0x991,
89fb4d8502Sjsg 	0x12C9, 0x3A6, 0x200, 0xFB47, 0xF6B9, 0xE00, 0x1000} },
90fb4d8502Sjsg { COLOR_SPACE_YCBCR709_LIMITED, { 0xE00, 0xF349, 0xFEB7, 0x1000, 0x6CE, 0x16E3,
91fb4d8502Sjsg 	0x24F, 0x200, 0xFCCB, 0xF535, 0xE00, 0x1000} }
92fb4d8502Sjsg };
93fb4d8502Sjsg 
94fb4d8502Sjsg enum csc_color_mode {
95fb4d8502Sjsg 	/* 00 - BITS2:0 Bypass */
96fb4d8502Sjsg 	CSC_COLOR_MODE_GRAPHICS_BYPASS,
97fb4d8502Sjsg 	/* 01 - hard coded coefficient TV RGB */
98fb4d8502Sjsg 	CSC_COLOR_MODE_GRAPHICS_PREDEFINED,
99fb4d8502Sjsg 	/* 04 - programmable OUTPUT CSC coefficient */
100fb4d8502Sjsg 	CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC,
101fb4d8502Sjsg };
102fb4d8502Sjsg 
103fb4d8502Sjsg enum grph_color_adjust_option {
104fb4d8502Sjsg 	GRPH_COLOR_MATRIX_HW_DEFAULT = 1,
105fb4d8502Sjsg 	GRPH_COLOR_MATRIX_SW
106fb4d8502Sjsg };
107fb4d8502Sjsg 
program_color_matrix_v(struct dce_transform * xfm_dce,const struct out_csc_color_matrix * tbl_entry,enum grph_color_adjust_option options)108fb4d8502Sjsg static void program_color_matrix_v(
109fb4d8502Sjsg 	struct dce_transform *xfm_dce,
110fb4d8502Sjsg 	const struct out_csc_color_matrix *tbl_entry,
111fb4d8502Sjsg 	enum grph_color_adjust_option options)
112fb4d8502Sjsg {
113fb4d8502Sjsg 	struct dc_context *ctx = xfm_dce->base.ctx;
114fb4d8502Sjsg 	uint32_t cntl_value = dm_read_reg(ctx, mmCOL_MAN_OUTPUT_CSC_CONTROL);
115fb4d8502Sjsg 	bool use_set_a = (get_reg_field_value(cntl_value,
116fb4d8502Sjsg 			COL_MAN_OUTPUT_CSC_CONTROL,
117fb4d8502Sjsg 			OUTPUT_CSC_MODE) != 4);
118fb4d8502Sjsg 
119fb4d8502Sjsg 	set_reg_field_value(
120fb4d8502Sjsg 			cntl_value,
121fb4d8502Sjsg 		0,
122fb4d8502Sjsg 		COL_MAN_OUTPUT_CSC_CONTROL,
123fb4d8502Sjsg 		OUTPUT_CSC_MODE);
124fb4d8502Sjsg 
125fb4d8502Sjsg 	if (use_set_a) {
126fb4d8502Sjsg 		{
127fb4d8502Sjsg 			uint32_t value = 0;
128fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C11_C12_A;
129fb4d8502Sjsg 			/* fixed S2.13 format */
130fb4d8502Sjsg 			set_reg_field_value(
131fb4d8502Sjsg 				value,
132fb4d8502Sjsg 				tbl_entry->regval[0],
133fb4d8502Sjsg 				OUTPUT_CSC_C11_C12_A,
134fb4d8502Sjsg 				OUTPUT_CSC_C11_A);
135fb4d8502Sjsg 
136fb4d8502Sjsg 			set_reg_field_value(
137fb4d8502Sjsg 				value,
138fb4d8502Sjsg 				tbl_entry->regval[1],
139fb4d8502Sjsg 				OUTPUT_CSC_C11_C12_A,
140fb4d8502Sjsg 				OUTPUT_CSC_C12_A);
141fb4d8502Sjsg 
142fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
143fb4d8502Sjsg 		}
144fb4d8502Sjsg 		{
145fb4d8502Sjsg 			uint32_t value = 0;
146fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C13_C14_A;
147fb4d8502Sjsg 			/* fixed S2.13 format */
148fb4d8502Sjsg 			set_reg_field_value(
149fb4d8502Sjsg 				value,
150fb4d8502Sjsg 				tbl_entry->regval[2],
151fb4d8502Sjsg 				OUTPUT_CSC_C13_C14_A,
152fb4d8502Sjsg 				OUTPUT_CSC_C13_A);
153fb4d8502Sjsg 			/* fixed S0.13 format */
154fb4d8502Sjsg 			set_reg_field_value(
155fb4d8502Sjsg 				value,
156fb4d8502Sjsg 				tbl_entry->regval[3],
157fb4d8502Sjsg 				OUTPUT_CSC_C13_C14_A,
158fb4d8502Sjsg 				OUTPUT_CSC_C14_A);
159fb4d8502Sjsg 
160fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
161fb4d8502Sjsg 		}
162fb4d8502Sjsg 		{
163fb4d8502Sjsg 			uint32_t value = 0;
164fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C21_C22_A;
165fb4d8502Sjsg 			/* fixed S2.13 format */
166fb4d8502Sjsg 			set_reg_field_value(
167fb4d8502Sjsg 				value,
168fb4d8502Sjsg 				tbl_entry->regval[4],
169fb4d8502Sjsg 				OUTPUT_CSC_C21_C22_A,
170fb4d8502Sjsg 				OUTPUT_CSC_C21_A);
171fb4d8502Sjsg 			/* fixed S2.13 format */
172fb4d8502Sjsg 			set_reg_field_value(
173fb4d8502Sjsg 				value,
174fb4d8502Sjsg 				tbl_entry->regval[5],
175fb4d8502Sjsg 				OUTPUT_CSC_C21_C22_A,
176fb4d8502Sjsg 				OUTPUT_CSC_C22_A);
177fb4d8502Sjsg 
178fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
179fb4d8502Sjsg 		}
180fb4d8502Sjsg 		{
181fb4d8502Sjsg 			uint32_t value = 0;
182fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C23_C24_A;
183fb4d8502Sjsg 			/* fixed S2.13 format */
184fb4d8502Sjsg 			set_reg_field_value(
185fb4d8502Sjsg 				value,
186fb4d8502Sjsg 				tbl_entry->regval[6],
187fb4d8502Sjsg 				OUTPUT_CSC_C23_C24_A,
188fb4d8502Sjsg 				OUTPUT_CSC_C23_A);
189fb4d8502Sjsg 			/* fixed S0.13 format */
190fb4d8502Sjsg 			set_reg_field_value(
191fb4d8502Sjsg 				value,
192fb4d8502Sjsg 				tbl_entry->regval[7],
193fb4d8502Sjsg 				OUTPUT_CSC_C23_C24_A,
194fb4d8502Sjsg 				OUTPUT_CSC_C24_A);
195fb4d8502Sjsg 
196fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
197fb4d8502Sjsg 		}
198fb4d8502Sjsg 		{
199fb4d8502Sjsg 			uint32_t value = 0;
200fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C31_C32_A;
201fb4d8502Sjsg 			/* fixed S2.13 format */
202fb4d8502Sjsg 			set_reg_field_value(
203fb4d8502Sjsg 				value,
204fb4d8502Sjsg 				tbl_entry->regval[8],
205fb4d8502Sjsg 				OUTPUT_CSC_C31_C32_A,
206fb4d8502Sjsg 				OUTPUT_CSC_C31_A);
207fb4d8502Sjsg 			/* fixed S0.13 format */
208fb4d8502Sjsg 			set_reg_field_value(
209fb4d8502Sjsg 				value,
210fb4d8502Sjsg 				tbl_entry->regval[9],
211fb4d8502Sjsg 				OUTPUT_CSC_C31_C32_A,
212fb4d8502Sjsg 				OUTPUT_CSC_C32_A);
213fb4d8502Sjsg 
214fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
215fb4d8502Sjsg 		}
216fb4d8502Sjsg 		{
217fb4d8502Sjsg 			uint32_t value = 0;
218fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C33_C34_A;
219fb4d8502Sjsg 			/* fixed S2.13 format */
220fb4d8502Sjsg 			set_reg_field_value(
221fb4d8502Sjsg 				value,
222fb4d8502Sjsg 				tbl_entry->regval[10],
223fb4d8502Sjsg 				OUTPUT_CSC_C33_C34_A,
224fb4d8502Sjsg 				OUTPUT_CSC_C33_A);
225fb4d8502Sjsg 			/* fixed S0.13 format */
226fb4d8502Sjsg 			set_reg_field_value(
227fb4d8502Sjsg 				value,
228fb4d8502Sjsg 				tbl_entry->regval[11],
229fb4d8502Sjsg 				OUTPUT_CSC_C33_C34_A,
230fb4d8502Sjsg 				OUTPUT_CSC_C34_A);
231fb4d8502Sjsg 
232fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
233fb4d8502Sjsg 		}
234fb4d8502Sjsg 		set_reg_field_value(
235fb4d8502Sjsg 			cntl_value,
236fb4d8502Sjsg 			4,
237fb4d8502Sjsg 			COL_MAN_OUTPUT_CSC_CONTROL,
238fb4d8502Sjsg 			OUTPUT_CSC_MODE);
239fb4d8502Sjsg 	} else {
240fb4d8502Sjsg 		{
241fb4d8502Sjsg 			uint32_t value = 0;
242fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C11_C12_B;
243fb4d8502Sjsg 			/* fixed S2.13 format */
244fb4d8502Sjsg 			set_reg_field_value(
245fb4d8502Sjsg 				value,
246fb4d8502Sjsg 				tbl_entry->regval[0],
247fb4d8502Sjsg 				OUTPUT_CSC_C11_C12_B,
248fb4d8502Sjsg 				OUTPUT_CSC_C11_B);
249fb4d8502Sjsg 
250fb4d8502Sjsg 			set_reg_field_value(
251fb4d8502Sjsg 				value,
252fb4d8502Sjsg 				tbl_entry->regval[1],
253fb4d8502Sjsg 				OUTPUT_CSC_C11_C12_B,
254fb4d8502Sjsg 				OUTPUT_CSC_C12_B);
255fb4d8502Sjsg 
256fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
257fb4d8502Sjsg 		}
258fb4d8502Sjsg 		{
259fb4d8502Sjsg 			uint32_t value = 0;
260fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C13_C14_B;
261fb4d8502Sjsg 			/* fixed S2.13 format */
262fb4d8502Sjsg 			set_reg_field_value(
263fb4d8502Sjsg 				value,
264fb4d8502Sjsg 				tbl_entry->regval[2],
265fb4d8502Sjsg 				OUTPUT_CSC_C13_C14_B,
266fb4d8502Sjsg 				OUTPUT_CSC_C13_B);
267fb4d8502Sjsg 			/* fixed S0.13 format */
268fb4d8502Sjsg 			set_reg_field_value(
269fb4d8502Sjsg 				value,
270fb4d8502Sjsg 				tbl_entry->regval[3],
271fb4d8502Sjsg 				OUTPUT_CSC_C13_C14_B,
272fb4d8502Sjsg 				OUTPUT_CSC_C14_B);
273fb4d8502Sjsg 
274fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
275fb4d8502Sjsg 		}
276fb4d8502Sjsg 		{
277fb4d8502Sjsg 			uint32_t value = 0;
278fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C21_C22_B;
279fb4d8502Sjsg 			/* fixed S2.13 format */
280fb4d8502Sjsg 			set_reg_field_value(
281fb4d8502Sjsg 				value,
282fb4d8502Sjsg 				tbl_entry->regval[4],
283fb4d8502Sjsg 				OUTPUT_CSC_C21_C22_B,
284fb4d8502Sjsg 				OUTPUT_CSC_C21_B);
285fb4d8502Sjsg 			/* fixed S2.13 format */
286fb4d8502Sjsg 			set_reg_field_value(
287fb4d8502Sjsg 				value,
288fb4d8502Sjsg 				tbl_entry->regval[5],
289fb4d8502Sjsg 				OUTPUT_CSC_C21_C22_B,
290fb4d8502Sjsg 				OUTPUT_CSC_C22_B);
291fb4d8502Sjsg 
292fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
293fb4d8502Sjsg 		}
294fb4d8502Sjsg 		{
295fb4d8502Sjsg 			uint32_t value = 0;
296fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C23_C24_B;
297fb4d8502Sjsg 			/* fixed S2.13 format */
298fb4d8502Sjsg 			set_reg_field_value(
299fb4d8502Sjsg 				value,
300fb4d8502Sjsg 				tbl_entry->regval[6],
301fb4d8502Sjsg 				OUTPUT_CSC_C23_C24_B,
302fb4d8502Sjsg 				OUTPUT_CSC_C23_B);
303fb4d8502Sjsg 			/* fixed S0.13 format */
304fb4d8502Sjsg 			set_reg_field_value(
305fb4d8502Sjsg 				value,
306fb4d8502Sjsg 				tbl_entry->regval[7],
307fb4d8502Sjsg 				OUTPUT_CSC_C23_C24_B,
308fb4d8502Sjsg 				OUTPUT_CSC_C24_B);
309fb4d8502Sjsg 
310fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
311fb4d8502Sjsg 		}
312fb4d8502Sjsg 		{
313fb4d8502Sjsg 			uint32_t value = 0;
314fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C31_C32_B;
315fb4d8502Sjsg 			/* fixed S2.13 format */
316fb4d8502Sjsg 			set_reg_field_value(
317fb4d8502Sjsg 				value,
318fb4d8502Sjsg 				tbl_entry->regval[8],
319fb4d8502Sjsg 				OUTPUT_CSC_C31_C32_B,
320fb4d8502Sjsg 				OUTPUT_CSC_C31_B);
321fb4d8502Sjsg 			/* fixed S0.13 format */
322fb4d8502Sjsg 			set_reg_field_value(
323fb4d8502Sjsg 				value,
324fb4d8502Sjsg 				tbl_entry->regval[9],
325fb4d8502Sjsg 				OUTPUT_CSC_C31_C32_B,
326fb4d8502Sjsg 				OUTPUT_CSC_C32_B);
327fb4d8502Sjsg 
328fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
329fb4d8502Sjsg 		}
330fb4d8502Sjsg 		{
331fb4d8502Sjsg 			uint32_t value = 0;
332fb4d8502Sjsg 			uint32_t addr = mmOUTPUT_CSC_C33_C34_B;
333fb4d8502Sjsg 			/* fixed S2.13 format */
334fb4d8502Sjsg 			set_reg_field_value(
335fb4d8502Sjsg 				value,
336fb4d8502Sjsg 				tbl_entry->regval[10],
337fb4d8502Sjsg 				OUTPUT_CSC_C33_C34_B,
338fb4d8502Sjsg 				OUTPUT_CSC_C33_B);
339fb4d8502Sjsg 			/* fixed S0.13 format */
340fb4d8502Sjsg 			set_reg_field_value(
341fb4d8502Sjsg 				value,
342fb4d8502Sjsg 				tbl_entry->regval[11],
343fb4d8502Sjsg 				OUTPUT_CSC_C33_C34_B,
344fb4d8502Sjsg 				OUTPUT_CSC_C34_B);
345fb4d8502Sjsg 
346fb4d8502Sjsg 			dm_write_reg(ctx, addr, value);
347fb4d8502Sjsg 		}
348fb4d8502Sjsg 		set_reg_field_value(
349fb4d8502Sjsg 			cntl_value,
350fb4d8502Sjsg 			5,
351fb4d8502Sjsg 			COL_MAN_OUTPUT_CSC_CONTROL,
352fb4d8502Sjsg 			OUTPUT_CSC_MODE);
353fb4d8502Sjsg 	}
354fb4d8502Sjsg 
355fb4d8502Sjsg 	dm_write_reg(ctx, mmCOL_MAN_OUTPUT_CSC_CONTROL, cntl_value);
356fb4d8502Sjsg }
357fb4d8502Sjsg 
configure_graphics_mode_v(struct dce_transform * xfm_dce,enum csc_color_mode config,enum graphics_csc_adjust_type csc_adjust_type,enum dc_color_space color_space)358fb4d8502Sjsg static bool configure_graphics_mode_v(
359fb4d8502Sjsg 	struct dce_transform *xfm_dce,
360fb4d8502Sjsg 	enum csc_color_mode config,
361fb4d8502Sjsg 	enum graphics_csc_adjust_type csc_adjust_type,
362fb4d8502Sjsg 	enum dc_color_space color_space)
363fb4d8502Sjsg {
364fb4d8502Sjsg 	struct dc_context *ctx = xfm_dce->base.ctx;
365fb4d8502Sjsg 	uint32_t addr = mmCOL_MAN_OUTPUT_CSC_CONTROL;
366fb4d8502Sjsg 	uint32_t value = dm_read_reg(ctx, addr);
367fb4d8502Sjsg 
368fb4d8502Sjsg 	set_reg_field_value(
369fb4d8502Sjsg 		value,
370fb4d8502Sjsg 		0,
371fb4d8502Sjsg 		COL_MAN_OUTPUT_CSC_CONTROL,
372fb4d8502Sjsg 		OUTPUT_CSC_MODE);
373fb4d8502Sjsg 
374fb4d8502Sjsg 	if (csc_adjust_type == GRAPHICS_CSC_ADJUST_TYPE_SW) {
375fb4d8502Sjsg 		if (config == CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC)
376fb4d8502Sjsg 			return true;
377fb4d8502Sjsg 
378fb4d8502Sjsg 		switch (color_space) {
379fb4d8502Sjsg 		case COLOR_SPACE_SRGB:
380fb4d8502Sjsg 			/* by pass */
381fb4d8502Sjsg 			set_reg_field_value(
382fb4d8502Sjsg 				value,
383fb4d8502Sjsg 				0,
384fb4d8502Sjsg 				COL_MAN_OUTPUT_CSC_CONTROL,
385fb4d8502Sjsg 				OUTPUT_CSC_MODE);
386fb4d8502Sjsg 			break;
387fb4d8502Sjsg 		case COLOR_SPACE_SRGB_LIMITED:
388fb4d8502Sjsg 			/* not supported for underlay on CZ */
389fb4d8502Sjsg 			return false;
390fb4d8502Sjsg 
391fb4d8502Sjsg 		case COLOR_SPACE_YCBCR601_LIMITED:
392fb4d8502Sjsg 			/* YCbCr601 */
393fb4d8502Sjsg 			set_reg_field_value(
394fb4d8502Sjsg 				value,
395fb4d8502Sjsg 				2,
396fb4d8502Sjsg 				COL_MAN_OUTPUT_CSC_CONTROL,
397fb4d8502Sjsg 				OUTPUT_CSC_MODE);
398fb4d8502Sjsg 			break;
399fb4d8502Sjsg 		case COLOR_SPACE_YCBCR709:
400fb4d8502Sjsg 		case COLOR_SPACE_YCBCR709_LIMITED:
401fb4d8502Sjsg 			/* YCbCr709 */
402fb4d8502Sjsg 			set_reg_field_value(
403fb4d8502Sjsg 				value,
404fb4d8502Sjsg 				3,
405fb4d8502Sjsg 				COL_MAN_OUTPUT_CSC_CONTROL,
406fb4d8502Sjsg 				OUTPUT_CSC_MODE);
407fb4d8502Sjsg 			break;
408fb4d8502Sjsg 		default:
409fb4d8502Sjsg 			return false;
410fb4d8502Sjsg 		}
411fb4d8502Sjsg 
412fb4d8502Sjsg 	} else if (csc_adjust_type == GRAPHICS_CSC_ADJUST_TYPE_HW) {
413fb4d8502Sjsg 		switch (color_space) {
414fb4d8502Sjsg 		case COLOR_SPACE_SRGB:
415fb4d8502Sjsg 			/* by pass */
416fb4d8502Sjsg 			set_reg_field_value(
417fb4d8502Sjsg 				value,
418fb4d8502Sjsg 				0,
419fb4d8502Sjsg 				COL_MAN_OUTPUT_CSC_CONTROL,
420fb4d8502Sjsg 				OUTPUT_CSC_MODE);
421fb4d8502Sjsg 			break;
422fb4d8502Sjsg 		case COLOR_SPACE_SRGB_LIMITED:
423fb4d8502Sjsg 			/* not supported for underlay on CZ */
424fb4d8502Sjsg 			return false;
425fb4d8502Sjsg 		case COLOR_SPACE_YCBCR601:
426fb4d8502Sjsg 		case COLOR_SPACE_YCBCR601_LIMITED:
427fb4d8502Sjsg 			/* YCbCr601 */
428fb4d8502Sjsg 			set_reg_field_value(
429fb4d8502Sjsg 				value,
430fb4d8502Sjsg 				2,
431fb4d8502Sjsg 				COL_MAN_OUTPUT_CSC_CONTROL,
432fb4d8502Sjsg 				OUTPUT_CSC_MODE);
433fb4d8502Sjsg 			break;
434fb4d8502Sjsg 		case COLOR_SPACE_YCBCR709:
435fb4d8502Sjsg 		case COLOR_SPACE_YCBCR709_LIMITED:
436fb4d8502Sjsg 			 /* YCbCr709 */
437fb4d8502Sjsg 			set_reg_field_value(
438fb4d8502Sjsg 				value,
439fb4d8502Sjsg 				3,
440fb4d8502Sjsg 				COL_MAN_OUTPUT_CSC_CONTROL,
441fb4d8502Sjsg 				OUTPUT_CSC_MODE);
442fb4d8502Sjsg 			break;
443fb4d8502Sjsg 		default:
444fb4d8502Sjsg 			return false;
445fb4d8502Sjsg 		}
446fb4d8502Sjsg 
447fb4d8502Sjsg 	} else
448fb4d8502Sjsg 		/* by pass */
449fb4d8502Sjsg 		set_reg_field_value(
450fb4d8502Sjsg 			value,
451fb4d8502Sjsg 			0,
452fb4d8502Sjsg 			COL_MAN_OUTPUT_CSC_CONTROL,
453fb4d8502Sjsg 			OUTPUT_CSC_MODE);
454fb4d8502Sjsg 
455fb4d8502Sjsg 	addr = mmCOL_MAN_OUTPUT_CSC_CONTROL;
456fb4d8502Sjsg 	dm_write_reg(ctx, addr, value);
457fb4d8502Sjsg 
458fb4d8502Sjsg 	return true;
459fb4d8502Sjsg }
460fb4d8502Sjsg 
461fb4d8502Sjsg /*TODO: color depth is not correct when this is called*/
set_Denormalization(struct transform * xfm,enum dc_color_depth color_depth)462fb4d8502Sjsg static void set_Denormalization(struct transform *xfm,
463fb4d8502Sjsg 		enum dc_color_depth color_depth)
464fb4d8502Sjsg {
465fb4d8502Sjsg 	uint32_t value = dm_read_reg(xfm->ctx, mmDENORM_CLAMP_CONTROL);
466fb4d8502Sjsg 
467fb4d8502Sjsg 	switch (color_depth) {
468fb4d8502Sjsg 	case COLOR_DEPTH_888:
469fb4d8502Sjsg 		/* 255/256 for 8 bit output color depth */
470fb4d8502Sjsg 		set_reg_field_value(
471fb4d8502Sjsg 			value,
472fb4d8502Sjsg 			1,
473fb4d8502Sjsg 			DENORM_CLAMP_CONTROL,
474fb4d8502Sjsg 			DENORM_MODE);
475fb4d8502Sjsg 		break;
476fb4d8502Sjsg 	case COLOR_DEPTH_101010:
477fb4d8502Sjsg 		/* 1023/1024 for 10 bit output color depth */
478fb4d8502Sjsg 		set_reg_field_value(
479fb4d8502Sjsg 			value,
480fb4d8502Sjsg 			2,
481fb4d8502Sjsg 			DENORM_CLAMP_CONTROL,
482fb4d8502Sjsg 			DENORM_MODE);
483fb4d8502Sjsg 		break;
484fb4d8502Sjsg 	case COLOR_DEPTH_121212:
485fb4d8502Sjsg 		/* 4095/4096 for 12 bit output color depth */
486fb4d8502Sjsg 		set_reg_field_value(
487fb4d8502Sjsg 			value,
488fb4d8502Sjsg 			3,
489fb4d8502Sjsg 			DENORM_CLAMP_CONTROL,
490fb4d8502Sjsg 			DENORM_MODE);
491fb4d8502Sjsg 		break;
492fb4d8502Sjsg 	default:
493fb4d8502Sjsg 		/* not valid case */
494fb4d8502Sjsg 		break;
495fb4d8502Sjsg 	}
496fb4d8502Sjsg 
497fb4d8502Sjsg 	set_reg_field_value(
498fb4d8502Sjsg 		value,
499fb4d8502Sjsg 		1,
500fb4d8502Sjsg 		DENORM_CLAMP_CONTROL,
501fb4d8502Sjsg 		DENORM_10BIT_OUT);
502fb4d8502Sjsg 
503fb4d8502Sjsg 	dm_write_reg(xfm->ctx, mmDENORM_CLAMP_CONTROL, value);
504fb4d8502Sjsg }
505fb4d8502Sjsg 
506fb4d8502Sjsg struct input_csc_matrix {
507fb4d8502Sjsg 	enum dc_color_space color_space;
508fb4d8502Sjsg 	uint32_t regval[12];
509fb4d8502Sjsg };
510fb4d8502Sjsg 
511fb4d8502Sjsg static const struct input_csc_matrix input_csc_matrix[] = {
512fb4d8502Sjsg 	{COLOR_SPACE_SRGB,
513fb4d8502Sjsg /*1_1   1_2   1_3   1_4   2_1   2_2   2_3   2_4   3_1   3_2   3_3   3_4 */
514fb4d8502Sjsg 		{0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} },
515fb4d8502Sjsg 	{COLOR_SPACE_SRGB_LIMITED,
516fb4d8502Sjsg 		{0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} },
517fb4d8502Sjsg 	{COLOR_SPACE_YCBCR601,
518fb4d8502Sjsg 		{0x2cdd, 0x2000, 0x0, 0xe991, 0xe926, 0x2000, 0xf4fd, 0x10ef,
519fb4d8502Sjsg 						0x0, 0x2000, 0x38b4, 0xe3a6} },
520fb4d8502Sjsg 	{COLOR_SPACE_YCBCR601_LIMITED,
521fb4d8502Sjsg 		{0x3353, 0x2568, 0x0, 0xe400, 0xe5dc, 0x2568, 0xf367, 0x1108,
522fb4d8502Sjsg 						0x0, 0x2568, 0x40de, 0xdd3a} },
523fb4d8502Sjsg 	{COLOR_SPACE_YCBCR709,
524fb4d8502Sjsg 		{0x3265, 0x2000, 0, 0xe6ce, 0xf105, 0x2000, 0xfa01, 0xa7d, 0,
525fb4d8502Sjsg 						0x2000, 0x3b61, 0xe24f} },
526fb4d8502Sjsg 	{COLOR_SPACE_YCBCR709_LIMITED,
527fb4d8502Sjsg 		{0x39a6, 0x2568, 0, 0xe0d6, 0xeedd, 0x2568, 0xf925, 0x9a8, 0,
528fb4d8502Sjsg 						0x2568, 0x43ee, 0xdbb2} }
529fb4d8502Sjsg };
530fb4d8502Sjsg 
program_input_csc(struct transform * xfm,enum dc_color_space color_space)531fb4d8502Sjsg static void program_input_csc(
532fb4d8502Sjsg 		struct transform *xfm, enum dc_color_space color_space)
533fb4d8502Sjsg {
534fb4d8502Sjsg 	int arr_size = sizeof(input_csc_matrix)/sizeof(struct input_csc_matrix);
535fb4d8502Sjsg 	struct dc_context *ctx = xfm->ctx;
536fb4d8502Sjsg 	const uint32_t *regval = NULL;
537fb4d8502Sjsg 	bool use_set_a;
538fb4d8502Sjsg 	uint32_t value;
539fb4d8502Sjsg 	int i;
540fb4d8502Sjsg 
541fb4d8502Sjsg 	for (i = 0; i < arr_size; i++)
542fb4d8502Sjsg 		if (input_csc_matrix[i].color_space == color_space) {
543fb4d8502Sjsg 			regval = input_csc_matrix[i].regval;
544fb4d8502Sjsg 			break;
545fb4d8502Sjsg 		}
546fb4d8502Sjsg 	if (regval == NULL) {
547fb4d8502Sjsg 		BREAK_TO_DEBUGGER();
548fb4d8502Sjsg 		return;
549fb4d8502Sjsg 	}
550fb4d8502Sjsg 
551fb4d8502Sjsg 	/*
552fb4d8502Sjsg 	 * 1 == set A, the logic is 'if currently we're not using set A,
553fb4d8502Sjsg 	 * then use set A, otherwise use set B'
554fb4d8502Sjsg 	 */
555fb4d8502Sjsg 	value = dm_read_reg(ctx, mmCOL_MAN_INPUT_CSC_CONTROL);
556fb4d8502Sjsg 	use_set_a = get_reg_field_value(
557fb4d8502Sjsg 		value, COL_MAN_INPUT_CSC_CONTROL, INPUT_CSC_MODE) != 1;
558fb4d8502Sjsg 
559fb4d8502Sjsg 	if (use_set_a) {
560fb4d8502Sjsg 		/* fixed S2.13 format */
561fb4d8502Sjsg 		value = 0;
562fb4d8502Sjsg 		set_reg_field_value(
563fb4d8502Sjsg 			value, regval[0], INPUT_CSC_C11_C12_A, INPUT_CSC_C11_A);
564fb4d8502Sjsg 		set_reg_field_value(
565fb4d8502Sjsg 			value, regval[1], INPUT_CSC_C11_C12_A, INPUT_CSC_C12_A);
566fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C11_C12_A, value);
567fb4d8502Sjsg 
568fb4d8502Sjsg 		value = 0;
569fb4d8502Sjsg 		set_reg_field_value(
570fb4d8502Sjsg 			value, regval[2], INPUT_CSC_C13_C14_A, INPUT_CSC_C13_A);
571fb4d8502Sjsg 		set_reg_field_value(
572fb4d8502Sjsg 			value, regval[3], INPUT_CSC_C13_C14_A, INPUT_CSC_C14_A);
573fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C13_C14_A, value);
574fb4d8502Sjsg 
575fb4d8502Sjsg 		value = 0;
576fb4d8502Sjsg 		set_reg_field_value(
577fb4d8502Sjsg 			value, regval[4], INPUT_CSC_C21_C22_A, INPUT_CSC_C21_A);
578fb4d8502Sjsg 		set_reg_field_value(
579fb4d8502Sjsg 			value, regval[5], INPUT_CSC_C21_C22_A, INPUT_CSC_C22_A);
580fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C21_C22_A, value);
581fb4d8502Sjsg 
582fb4d8502Sjsg 		value = 0;
583fb4d8502Sjsg 		set_reg_field_value(
584fb4d8502Sjsg 			value, regval[6], INPUT_CSC_C23_C24_A, INPUT_CSC_C23_A);
585fb4d8502Sjsg 		set_reg_field_value(
586fb4d8502Sjsg 			value, regval[7], INPUT_CSC_C23_C24_A, INPUT_CSC_C24_A);
587fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C23_C24_A, value);
588fb4d8502Sjsg 
589fb4d8502Sjsg 		value = 0;
590fb4d8502Sjsg 		set_reg_field_value(
591fb4d8502Sjsg 			value, regval[8], INPUT_CSC_C31_C32_A, INPUT_CSC_C31_A);
592fb4d8502Sjsg 		set_reg_field_value(
593fb4d8502Sjsg 			value, regval[9], INPUT_CSC_C31_C32_A, INPUT_CSC_C32_A);
594fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C31_C32_A, value);
595fb4d8502Sjsg 
596fb4d8502Sjsg 		value = 0;
597fb4d8502Sjsg 		set_reg_field_value(
598fb4d8502Sjsg 			value, regval[10], INPUT_CSC_C33_C34_A, INPUT_CSC_C33_A);
599fb4d8502Sjsg 		set_reg_field_value(
600fb4d8502Sjsg 			value, regval[11], INPUT_CSC_C33_C34_A, INPUT_CSC_C34_A);
601fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C33_C34_A, value);
602fb4d8502Sjsg 	} else {
603fb4d8502Sjsg 		/* fixed S2.13 format */
604fb4d8502Sjsg 		value = 0;
605fb4d8502Sjsg 		set_reg_field_value(
606fb4d8502Sjsg 			value, regval[0], INPUT_CSC_C11_C12_B, INPUT_CSC_C11_B);
607fb4d8502Sjsg 		set_reg_field_value(
608fb4d8502Sjsg 			value, regval[1], INPUT_CSC_C11_C12_B, INPUT_CSC_C12_B);
609fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C11_C12_B, value);
610fb4d8502Sjsg 
611fb4d8502Sjsg 		value = 0;
612fb4d8502Sjsg 		set_reg_field_value(
613fb4d8502Sjsg 			value, regval[2], INPUT_CSC_C13_C14_B, INPUT_CSC_C13_B);
614fb4d8502Sjsg 		set_reg_field_value(
615fb4d8502Sjsg 			value, regval[3], INPUT_CSC_C13_C14_B, INPUT_CSC_C14_B);
616fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C13_C14_B, value);
617fb4d8502Sjsg 
618fb4d8502Sjsg 		value = 0;
619fb4d8502Sjsg 		set_reg_field_value(
620fb4d8502Sjsg 			value, regval[4], INPUT_CSC_C21_C22_B, INPUT_CSC_C21_B);
621fb4d8502Sjsg 		set_reg_field_value(
622fb4d8502Sjsg 			value, regval[5], INPUT_CSC_C21_C22_B, INPUT_CSC_C22_B);
623fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C21_C22_B, value);
624fb4d8502Sjsg 
625fb4d8502Sjsg 		value = 0;
626fb4d8502Sjsg 		set_reg_field_value(
627fb4d8502Sjsg 			value, regval[6], INPUT_CSC_C23_C24_B, INPUT_CSC_C23_B);
628fb4d8502Sjsg 		set_reg_field_value(
629fb4d8502Sjsg 			value, regval[7], INPUT_CSC_C23_C24_B, INPUT_CSC_C24_B);
630fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C23_C24_B, value);
631fb4d8502Sjsg 
632fb4d8502Sjsg 		value = 0;
633fb4d8502Sjsg 		set_reg_field_value(
634fb4d8502Sjsg 			value, regval[8], INPUT_CSC_C31_C32_B, INPUT_CSC_C31_B);
635fb4d8502Sjsg 		set_reg_field_value(
636fb4d8502Sjsg 			value, regval[9], INPUT_CSC_C31_C32_B, INPUT_CSC_C32_B);
637fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C31_C32_B, value);
638fb4d8502Sjsg 
639fb4d8502Sjsg 		value = 0;
640fb4d8502Sjsg 		set_reg_field_value(
641fb4d8502Sjsg 			value, regval[10], INPUT_CSC_C33_C34_B, INPUT_CSC_C33_B);
642fb4d8502Sjsg 		set_reg_field_value(
643fb4d8502Sjsg 			value, regval[11], INPUT_CSC_C33_C34_B, INPUT_CSC_C34_B);
644fb4d8502Sjsg 		dm_write_reg(ctx, mmINPUT_CSC_C33_C34_B, value);
645fb4d8502Sjsg 	}
646fb4d8502Sjsg 
647fb4d8502Sjsg 	/* KK: leave INPUT_CSC_CONVERSION_MODE at default */
648fb4d8502Sjsg 	value = 0;
649fb4d8502Sjsg 	/*
650fb4d8502Sjsg 	 * select 8.4 input type instead of default 12.0. From the discussion
651fb4d8502Sjsg 	 * with HW team, this format depends on the UNP surface format, so for
652fb4d8502Sjsg 	 * 8-bit we should select 8.4 (4 bits truncated). For 10 it should be
653fb4d8502Sjsg 	 * 10.2. For Carrizo we only support 8-bit surfaces on underlay pipe
654fb4d8502Sjsg 	 * so we can always keep this at 8.4 (input_type=2). If the later asics
655fb4d8502Sjsg 	 * start supporting 10+ bits, we will have a problem: surface
656fb4d8502Sjsg 	 * programming including UNP_GRPH* is being done in DalISR after this,
657fb4d8502Sjsg 	 * so either we pass surface format to here, or move this logic to ISR
658fb4d8502Sjsg 	 */
659fb4d8502Sjsg 
660fb4d8502Sjsg 	set_reg_field_value(
661fb4d8502Sjsg 		value, 2, COL_MAN_INPUT_CSC_CONTROL, INPUT_CSC_INPUT_TYPE);
662fb4d8502Sjsg 	set_reg_field_value(
663fb4d8502Sjsg 		value,
664fb4d8502Sjsg 		use_set_a ? 1 : 2,
665fb4d8502Sjsg 		COL_MAN_INPUT_CSC_CONTROL,
666fb4d8502Sjsg 		INPUT_CSC_MODE);
667fb4d8502Sjsg 
668fb4d8502Sjsg 	dm_write_reg(ctx, mmCOL_MAN_INPUT_CSC_CONTROL, value);
669fb4d8502Sjsg }
670fb4d8502Sjsg 
dce110_opp_v_set_csc_default(struct transform * xfm,const struct default_adjustment * default_adjust)671fb4d8502Sjsg void dce110_opp_v_set_csc_default(
672fb4d8502Sjsg 	struct transform *xfm,
673fb4d8502Sjsg 	const struct default_adjustment *default_adjust)
674fb4d8502Sjsg {
675fb4d8502Sjsg 	struct dce_transform *xfm_dce = TO_DCE_TRANSFORM(xfm);
676fb4d8502Sjsg 	enum csc_color_mode config =
677fb4d8502Sjsg 			CSC_COLOR_MODE_GRAPHICS_PREDEFINED;
678fb4d8502Sjsg 
679fb4d8502Sjsg 	if (default_adjust->force_hw_default == false) {
680fb4d8502Sjsg 		const struct out_csc_color_matrix *elm;
681fb4d8502Sjsg 		/* currently parameter not in use */
682*ad8b1aafSjsg 		enum grph_color_adjust_option option;
683fb4d8502Sjsg 		uint32_t i;
684fb4d8502Sjsg 		/*
685fb4d8502Sjsg 		 * HW default false we program locally defined matrix
686fb4d8502Sjsg 		 * HW default true  we use predefined hw matrix and we
687fb4d8502Sjsg 		 * do not need to program matrix
688fb4d8502Sjsg 		 * OEM wants the HW default via runtime parameter.
689fb4d8502Sjsg 		 */
690fb4d8502Sjsg 		option = GRPH_COLOR_MATRIX_SW;
691fb4d8502Sjsg 
692fb4d8502Sjsg 		for (i = 0; i < ARRAY_SIZE(global_color_matrix); ++i) {
693fb4d8502Sjsg 			elm = &global_color_matrix[i];
694fb4d8502Sjsg 			if (elm->color_space != default_adjust->out_color_space)
695fb4d8502Sjsg 				continue;
696fb4d8502Sjsg 			/* program the matrix with default values from this
697fb4d8502Sjsg 			 * file
698fb4d8502Sjsg 			 */
699fb4d8502Sjsg 			program_color_matrix_v(xfm_dce, elm, option);
700fb4d8502Sjsg 			config = CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC;
701fb4d8502Sjsg 			break;
702fb4d8502Sjsg 		}
703fb4d8502Sjsg 	}
704fb4d8502Sjsg 
705fb4d8502Sjsg 	program_input_csc(xfm, default_adjust->in_color_space);
706fb4d8502Sjsg 
707fb4d8502Sjsg 	/* configure the what we programmed :
708fb4d8502Sjsg 	 * 1. Default values from this file
709fb4d8502Sjsg 	 * 2. Use hardware default from ROM_A and we do not need to program
710fb4d8502Sjsg 	 * matrix
711fb4d8502Sjsg 	 */
712fb4d8502Sjsg 
713fb4d8502Sjsg 	configure_graphics_mode_v(xfm_dce, config,
714fb4d8502Sjsg 		default_adjust->csc_adjust_type,
715fb4d8502Sjsg 		default_adjust->out_color_space);
716fb4d8502Sjsg 
717fb4d8502Sjsg 	set_Denormalization(xfm, default_adjust->color_depth);
718fb4d8502Sjsg }
719fb4d8502Sjsg 
dce110_opp_v_set_csc_adjustment(struct transform * xfm,const struct out_csc_color_matrix * tbl_entry)720fb4d8502Sjsg void dce110_opp_v_set_csc_adjustment(
721fb4d8502Sjsg 	struct transform *xfm,
722fb4d8502Sjsg 	const struct out_csc_color_matrix *tbl_entry)
723fb4d8502Sjsg {
724fb4d8502Sjsg 	struct dce_transform *xfm_dce = TO_DCE_TRANSFORM(xfm);
725fb4d8502Sjsg 	enum csc_color_mode config =
726fb4d8502Sjsg 			CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC;
727fb4d8502Sjsg 
728fb4d8502Sjsg 	program_color_matrix_v(
729fb4d8502Sjsg 			xfm_dce, tbl_entry, GRPH_COLOR_MATRIX_SW);
730fb4d8502Sjsg 
731fb4d8502Sjsg 	/*  We did everything ,now program DxOUTPUT_CSC_CONTROL */
732fb4d8502Sjsg 	configure_graphics_mode_v(xfm_dce, config, GRAPHICS_CSC_ADJUST_TYPE_SW,
733fb4d8502Sjsg 			tbl_entry->color_space);
734fb4d8502Sjsg 
735fb4d8502Sjsg 	/*TODO: Check if denormalization is needed*/
736fb4d8502Sjsg 	/*set_Denormalization(opp, adjust->color_depth);*/
737fb4d8502Sjsg }
738