1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include "dm_services.h"
27#include "dce110_transform_v.h"
28#include "basics/conversion.h"
29
30
31#include "dce/dce_11_0_d.h"
32#include "dce/dce_11_0_sh_mask.h"
33#include "dce/dce_11_0_enum.h"
34
35enum {
36 OUTPUT_CSC_MATRIX_SIZE = 12
37};
38
39
40#define UNDERLAY_CONTRAST_DEFAULT 100
41#define UNDERLAY_CONTRAST_MAX 200
42#define UNDERLAY_CONTRAST_MIN 0
43#define UNDERLAY_CONTRAST_STEP 1
44#define UNDERLAY_CONTRAST_DIVIDER 100
45
46
47#define UNDERLAY_SATURATION_DEFAULT 100
48#define UNDERLAY_SATURATION_MIN 0
49#define UNDERLAY_SATURATION_MAX 200
50#define UNDERLAY_SATURATION_STEP 1
51
52
53
54
55
56#define UNDERLAY_HUE_DEFAULT 0
57#define UNDERLAY_HUE_MIN -300
58#define UNDERLAY_HUE_MAX 300
59#define UNDERLAY_HUE_STEP 5
60#define UNDERLAY_HUE_DIVIDER 10
61#define UNDERLAY_SATURATION_DIVIDER 100
62
63
64
65
66
67
68
69
70
71#define UNDERLAY_BRIGHTNESS_DEFAULT 0
72#define UNDERLAY_BRIGHTNESS_MIN -46
73#define UNDERLAY_BRIGHTNESS_MAX 46
74#define UNDERLAY_BRIGHTNESS_STEP 1
75#define UNDERLAY_BRIGHTNESS_DIVIDER 100
76
77static const struct out_csc_color_matrix global_color_matrix[] = {
78{ COLOR_SPACE_SRGB,
79 { 0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} },
80{ COLOR_SPACE_SRGB_LIMITED,
81 { 0x1B60, 0, 0, 0x200, 0, 0x1B60, 0, 0x200, 0, 0, 0x1B60, 0x200} },
82{ COLOR_SPACE_YCBCR601,
83 { 0xE00, 0xF447, 0xFDB9, 0x1000, 0x82F, 0x1012, 0x31F, 0x200, 0xFB47,
84 0xF6B9, 0xE00, 0x1000} },
85{ COLOR_SPACE_YCBCR709, { 0xE00, 0xF349, 0xFEB7, 0x1000, 0x5D2, 0x1394, 0x1FA,
86 0x200, 0xFCCB, 0xF535, 0xE00, 0x1000} },
87
88{ COLOR_SPACE_YCBCR601_LIMITED, { 0xE00, 0xF447, 0xFDB9, 0x1000, 0x991,
89 0x12C9, 0x3A6, 0x200, 0xFB47, 0xF6B9, 0xE00, 0x1000} },
90{ COLOR_SPACE_YCBCR709_LIMITED, { 0xE00, 0xF349, 0xFEB7, 0x1000, 0x6CE, 0x16E3,
91 0x24F, 0x200, 0xFCCB, 0xF535, 0xE00, 0x1000} }
92};
93
94enum csc_color_mode {
95
96 CSC_COLOR_MODE_GRAPHICS_BYPASS,
97
98 CSC_COLOR_MODE_GRAPHICS_PREDEFINED,
99
100 CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC,
101};
102
103enum grph_color_adjust_option {
104 GRPH_COLOR_MATRIX_HW_DEFAULT = 1,
105 GRPH_COLOR_MATRIX_SW
106};
107
108static void program_color_matrix_v(
109 struct dce_transform *xfm_dce,
110 const struct out_csc_color_matrix *tbl_entry,
111 enum grph_color_adjust_option options)
112{
113 struct dc_context *ctx = xfm_dce->base.ctx;
114 uint32_t cntl_value = dm_read_reg(ctx, mmCOL_MAN_OUTPUT_CSC_CONTROL);
115 bool use_set_a = (get_reg_field_value(cntl_value,
116 COL_MAN_OUTPUT_CSC_CONTROL,
117 OUTPUT_CSC_MODE) != 4);
118
119 set_reg_field_value(
120 cntl_value,
121 0,
122 COL_MAN_OUTPUT_CSC_CONTROL,
123 OUTPUT_CSC_MODE);
124
125 if (use_set_a) {
126 {
127 uint32_t value = 0;
128 uint32_t addr = mmOUTPUT_CSC_C11_C12_A;
129
130 set_reg_field_value(
131 value,
132 tbl_entry->regval[0],
133 OUTPUT_CSC_C11_C12_A,
134 OUTPUT_CSC_C11_A);
135
136 set_reg_field_value(
137 value,
138 tbl_entry->regval[1],
139 OUTPUT_CSC_C11_C12_A,
140 OUTPUT_CSC_C12_A);
141
142 dm_write_reg(ctx, addr, value);
143 }
144 {
145 uint32_t value = 0;
146 uint32_t addr = mmOUTPUT_CSC_C13_C14_A;
147
148 set_reg_field_value(
149 value,
150 tbl_entry->regval[2],
151 OUTPUT_CSC_C13_C14_A,
152 OUTPUT_CSC_C13_A);
153
154 set_reg_field_value(
155 value,
156 tbl_entry->regval[3],
157 OUTPUT_CSC_C13_C14_A,
158 OUTPUT_CSC_C14_A);
159
160 dm_write_reg(ctx, addr, value);
161 }
162 {
163 uint32_t value = 0;
164 uint32_t addr = mmOUTPUT_CSC_C21_C22_A;
165
166 set_reg_field_value(
167 value,
168 tbl_entry->regval[4],
169 OUTPUT_CSC_C21_C22_A,
170 OUTPUT_CSC_C21_A);
171
172 set_reg_field_value(
173 value,
174 tbl_entry->regval[5],
175 OUTPUT_CSC_C21_C22_A,
176 OUTPUT_CSC_C22_A);
177
178 dm_write_reg(ctx, addr, value);
179 }
180 {
181 uint32_t value = 0;
182 uint32_t addr = mmOUTPUT_CSC_C23_C24_A;
183
184 set_reg_field_value(
185 value,
186 tbl_entry->regval[6],
187 OUTPUT_CSC_C23_C24_A,
188 OUTPUT_CSC_C23_A);
189
190 set_reg_field_value(
191 value,
192 tbl_entry->regval[7],
193 OUTPUT_CSC_C23_C24_A,
194 OUTPUT_CSC_C24_A);
195
196 dm_write_reg(ctx, addr, value);
197 }
198 {
199 uint32_t value = 0;
200 uint32_t addr = mmOUTPUT_CSC_C31_C32_A;
201
202 set_reg_field_value(
203 value,
204 tbl_entry->regval[8],
205 OUTPUT_CSC_C31_C32_A,
206 OUTPUT_CSC_C31_A);
207
208 set_reg_field_value(
209 value,
210 tbl_entry->regval[9],
211 OUTPUT_CSC_C31_C32_A,
212 OUTPUT_CSC_C32_A);
213
214 dm_write_reg(ctx, addr, value);
215 }
216 {
217 uint32_t value = 0;
218 uint32_t addr = mmOUTPUT_CSC_C33_C34_A;
219
220 set_reg_field_value(
221 value,
222 tbl_entry->regval[10],
223 OUTPUT_CSC_C33_C34_A,
224 OUTPUT_CSC_C33_A);
225
226 set_reg_field_value(
227 value,
228 tbl_entry->regval[11],
229 OUTPUT_CSC_C33_C34_A,
230 OUTPUT_CSC_C34_A);
231
232 dm_write_reg(ctx, addr, value);
233 }
234 set_reg_field_value(
235 cntl_value,
236 4,
237 COL_MAN_OUTPUT_CSC_CONTROL,
238 OUTPUT_CSC_MODE);
239 } else {
240 {
241 uint32_t value = 0;
242 uint32_t addr = mmOUTPUT_CSC_C11_C12_B;
243
244 set_reg_field_value(
245 value,
246 tbl_entry->regval[0],
247 OUTPUT_CSC_C11_C12_B,
248 OUTPUT_CSC_C11_B);
249
250 set_reg_field_value(
251 value,
252 tbl_entry->regval[1],
253 OUTPUT_CSC_C11_C12_B,
254 OUTPUT_CSC_C12_B);
255
256 dm_write_reg(ctx, addr, value);
257 }
258 {
259 uint32_t value = 0;
260 uint32_t addr = mmOUTPUT_CSC_C13_C14_B;
261
262 set_reg_field_value(
263 value,
264 tbl_entry->regval[2],
265 OUTPUT_CSC_C13_C14_B,
266 OUTPUT_CSC_C13_B);
267
268 set_reg_field_value(
269 value,
270 tbl_entry->regval[3],
271 OUTPUT_CSC_C13_C14_B,
272 OUTPUT_CSC_C14_B);
273
274 dm_write_reg(ctx, addr, value);
275 }
276 {
277 uint32_t value = 0;
278 uint32_t addr = mmOUTPUT_CSC_C21_C22_B;
279
280 set_reg_field_value(
281 value,
282 tbl_entry->regval[4],
283 OUTPUT_CSC_C21_C22_B,
284 OUTPUT_CSC_C21_B);
285
286 set_reg_field_value(
287 value,
288 tbl_entry->regval[5],
289 OUTPUT_CSC_C21_C22_B,
290 OUTPUT_CSC_C22_B);
291
292 dm_write_reg(ctx, addr, value);
293 }
294 {
295 uint32_t value = 0;
296 uint32_t addr = mmOUTPUT_CSC_C23_C24_B;
297
298 set_reg_field_value(
299 value,
300 tbl_entry->regval[6],
301 OUTPUT_CSC_C23_C24_B,
302 OUTPUT_CSC_C23_B);
303
304 set_reg_field_value(
305 value,
306 tbl_entry->regval[7],
307 OUTPUT_CSC_C23_C24_B,
308 OUTPUT_CSC_C24_B);
309
310 dm_write_reg(ctx, addr, value);
311 }
312 {
313 uint32_t value = 0;
314 uint32_t addr = mmOUTPUT_CSC_C31_C32_B;
315
316 set_reg_field_value(
317 value,
318 tbl_entry->regval[8],
319 OUTPUT_CSC_C31_C32_B,
320 OUTPUT_CSC_C31_B);
321
322 set_reg_field_value(
323 value,
324 tbl_entry->regval[9],
325 OUTPUT_CSC_C31_C32_B,
326 OUTPUT_CSC_C32_B);
327
328 dm_write_reg(ctx, addr, value);
329 }
330 {
331 uint32_t value = 0;
332 uint32_t addr = mmOUTPUT_CSC_C33_C34_B;
333
334 set_reg_field_value(
335 value,
336 tbl_entry->regval[10],
337 OUTPUT_CSC_C33_C34_B,
338 OUTPUT_CSC_C33_B);
339
340 set_reg_field_value(
341 value,
342 tbl_entry->regval[11],
343 OUTPUT_CSC_C33_C34_B,
344 OUTPUT_CSC_C34_B);
345
346 dm_write_reg(ctx, addr, value);
347 }
348 set_reg_field_value(
349 cntl_value,
350 5,
351 COL_MAN_OUTPUT_CSC_CONTROL,
352 OUTPUT_CSC_MODE);
353 }
354
355 dm_write_reg(ctx, mmCOL_MAN_OUTPUT_CSC_CONTROL, cntl_value);
356}
357
358static bool configure_graphics_mode_v(
359 struct dce_transform *xfm_dce,
360 enum csc_color_mode config,
361 enum graphics_csc_adjust_type csc_adjust_type,
362 enum dc_color_space color_space)
363{
364 struct dc_context *ctx = xfm_dce->base.ctx;
365 uint32_t addr = mmCOL_MAN_OUTPUT_CSC_CONTROL;
366 uint32_t value = dm_read_reg(ctx, addr);
367
368 set_reg_field_value(
369 value,
370 0,
371 COL_MAN_OUTPUT_CSC_CONTROL,
372 OUTPUT_CSC_MODE);
373
374 if (csc_adjust_type == GRAPHICS_CSC_ADJUST_TYPE_SW) {
375 if (config == CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC)
376 return true;
377
378 switch (color_space) {
379 case COLOR_SPACE_SRGB:
380
381 set_reg_field_value(
382 value,
383 0,
384 COL_MAN_OUTPUT_CSC_CONTROL,
385 OUTPUT_CSC_MODE);
386 break;
387 case COLOR_SPACE_SRGB_LIMITED:
388
389 return false;
390
391 case COLOR_SPACE_YCBCR601_LIMITED:
392
393 set_reg_field_value(
394 value,
395 2,
396 COL_MAN_OUTPUT_CSC_CONTROL,
397 OUTPUT_CSC_MODE);
398 break;
399 case COLOR_SPACE_YCBCR709:
400 case COLOR_SPACE_YCBCR709_LIMITED:
401
402 set_reg_field_value(
403 value,
404 3,
405 COL_MAN_OUTPUT_CSC_CONTROL,
406 OUTPUT_CSC_MODE);
407 break;
408 default:
409 return false;
410 }
411
412 } else if (csc_adjust_type == GRAPHICS_CSC_ADJUST_TYPE_HW) {
413 switch (color_space) {
414 case COLOR_SPACE_SRGB:
415
416 set_reg_field_value(
417 value,
418 0,
419 COL_MAN_OUTPUT_CSC_CONTROL,
420 OUTPUT_CSC_MODE);
421 break;
422 case COLOR_SPACE_SRGB_LIMITED:
423
424 return false;
425 case COLOR_SPACE_YCBCR601:
426 case COLOR_SPACE_YCBCR601_LIMITED:
427
428 set_reg_field_value(
429 value,
430 2,
431 COL_MAN_OUTPUT_CSC_CONTROL,
432 OUTPUT_CSC_MODE);
433 break;
434 case COLOR_SPACE_YCBCR709:
435 case COLOR_SPACE_YCBCR709_LIMITED:
436
437 set_reg_field_value(
438 value,
439 3,
440 COL_MAN_OUTPUT_CSC_CONTROL,
441 OUTPUT_CSC_MODE);
442 break;
443 default:
444 return false;
445 }
446
447 } else
448
449 set_reg_field_value(
450 value,
451 0,
452 COL_MAN_OUTPUT_CSC_CONTROL,
453 OUTPUT_CSC_MODE);
454
455 addr = mmCOL_MAN_OUTPUT_CSC_CONTROL;
456 dm_write_reg(ctx, addr, value);
457
458 return true;
459}
460
461
462static void set_Denormalization(struct transform *xfm,
463 enum dc_color_depth color_depth)
464{
465 uint32_t value = dm_read_reg(xfm->ctx, mmDENORM_CLAMP_CONTROL);
466
467 switch (color_depth) {
468 case COLOR_DEPTH_888:
469
470 set_reg_field_value(
471 value,
472 1,
473 DENORM_CLAMP_CONTROL,
474 DENORM_MODE);
475 break;
476 case COLOR_DEPTH_101010:
477
478 set_reg_field_value(
479 value,
480 2,
481 DENORM_CLAMP_CONTROL,
482 DENORM_MODE);
483 break;
484 case COLOR_DEPTH_121212:
485
486 set_reg_field_value(
487 value,
488 3,
489 DENORM_CLAMP_CONTROL,
490 DENORM_MODE);
491 break;
492 default:
493
494 break;
495 }
496
497 set_reg_field_value(
498 value,
499 1,
500 DENORM_CLAMP_CONTROL,
501 DENORM_10BIT_OUT);
502
503 dm_write_reg(xfm->ctx, mmDENORM_CLAMP_CONTROL, value);
504}
505
506struct input_csc_matrix {
507 enum dc_color_space color_space;
508 uint32_t regval[12];
509};
510
511static const struct input_csc_matrix input_csc_matrix[] = {
512 {COLOR_SPACE_SRGB,
513
514 {0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} },
515 {COLOR_SPACE_SRGB_LIMITED,
516 {0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} },
517 {COLOR_SPACE_YCBCR601,
518 {0x2cdd, 0x2000, 0x0, 0xe991, 0xe926, 0x2000, 0xf4fd, 0x10ef,
519 0x0, 0x2000, 0x38b4, 0xe3a6} },
520 {COLOR_SPACE_YCBCR601_LIMITED,
521 {0x3353, 0x2568, 0x0, 0xe400, 0xe5dc, 0x2568, 0xf367, 0x1108,
522 0x0, 0x2568, 0x40de, 0xdd3a} },
523 {COLOR_SPACE_YCBCR709,
524 {0x3265, 0x2000, 0, 0xe6ce, 0xf105, 0x2000, 0xfa01, 0xa7d, 0,
525 0x2000, 0x3b61, 0xe24f} },
526 {COLOR_SPACE_YCBCR709_LIMITED,
527 {0x39a6, 0x2568, 0, 0xe0d6, 0xeedd, 0x2568, 0xf925, 0x9a8, 0,
528 0x2568, 0x43ee, 0xdbb2} }
529};
530
531static void program_input_csc(
532 struct transform *xfm, enum dc_color_space color_space)
533{
534 int arr_size = sizeof(input_csc_matrix)/sizeof(struct input_csc_matrix);
535 struct dc_context *ctx = xfm->ctx;
536 const uint32_t *regval = NULL;
537 bool use_set_a;
538 uint32_t value;
539 int i;
540
541 for (i = 0; i < arr_size; i++)
542 if (input_csc_matrix[i].color_space == color_space) {
543 regval = input_csc_matrix[i].regval;
544 break;
545 }
546 if (regval == NULL) {
547 BREAK_TO_DEBUGGER();
548 return;
549 }
550
551
552
553
554
555 value = dm_read_reg(ctx, mmCOL_MAN_INPUT_CSC_CONTROL);
556 use_set_a = get_reg_field_value(
557 value, COL_MAN_INPUT_CSC_CONTROL, INPUT_CSC_MODE) != 1;
558
559 if (use_set_a) {
560
561 value = 0;
562 set_reg_field_value(
563 value, regval[0], INPUT_CSC_C11_C12_A, INPUT_CSC_C11_A);
564 set_reg_field_value(
565 value, regval[1], INPUT_CSC_C11_C12_A, INPUT_CSC_C12_A);
566 dm_write_reg(ctx, mmINPUT_CSC_C11_C12_A, value);
567
568 value = 0;
569 set_reg_field_value(
570 value, regval[2], INPUT_CSC_C13_C14_A, INPUT_CSC_C13_A);
571 set_reg_field_value(
572 value, regval[3], INPUT_CSC_C13_C14_A, INPUT_CSC_C14_A);
573 dm_write_reg(ctx, mmINPUT_CSC_C13_C14_A, value);
574
575 value = 0;
576 set_reg_field_value(
577 value, regval[4], INPUT_CSC_C21_C22_A, INPUT_CSC_C21_A);
578 set_reg_field_value(
579 value, regval[5], INPUT_CSC_C21_C22_A, INPUT_CSC_C22_A);
580 dm_write_reg(ctx, mmINPUT_CSC_C21_C22_A, value);
581
582 value = 0;
583 set_reg_field_value(
584 value, regval[6], INPUT_CSC_C23_C24_A, INPUT_CSC_C23_A);
585 set_reg_field_value(
586 value, regval[7], INPUT_CSC_C23_C24_A, INPUT_CSC_C24_A);
587 dm_write_reg(ctx, mmINPUT_CSC_C23_C24_A, value);
588
589 value = 0;
590 set_reg_field_value(
591 value, regval[8], INPUT_CSC_C31_C32_A, INPUT_CSC_C31_A);
592 set_reg_field_value(
593 value, regval[9], INPUT_CSC_C31_C32_A, INPUT_CSC_C32_A);
594 dm_write_reg(ctx, mmINPUT_CSC_C31_C32_A, value);
595
596 value = 0;
597 set_reg_field_value(
598 value, regval[10], INPUT_CSC_C33_C34_A, INPUT_CSC_C33_A);
599 set_reg_field_value(
600 value, regval[11], INPUT_CSC_C33_C34_A, INPUT_CSC_C34_A);
601 dm_write_reg(ctx, mmINPUT_CSC_C33_C34_A, value);
602 } else {
603
604 value = 0;
605 set_reg_field_value(
606 value, regval[0], INPUT_CSC_C11_C12_B, INPUT_CSC_C11_B);
607 set_reg_field_value(
608 value, regval[1], INPUT_CSC_C11_C12_B, INPUT_CSC_C12_B);
609 dm_write_reg(ctx, mmINPUT_CSC_C11_C12_B, value);
610
611 value = 0;
612 set_reg_field_value(
613 value, regval[2], INPUT_CSC_C13_C14_B, INPUT_CSC_C13_B);
614 set_reg_field_value(
615 value, regval[3], INPUT_CSC_C13_C14_B, INPUT_CSC_C14_B);
616 dm_write_reg(ctx, mmINPUT_CSC_C13_C14_B, value);
617
618 value = 0;
619 set_reg_field_value(
620 value, regval[4], INPUT_CSC_C21_C22_B, INPUT_CSC_C21_B);
621 set_reg_field_value(
622 value, regval[5], INPUT_CSC_C21_C22_B, INPUT_CSC_C22_B);
623 dm_write_reg(ctx, mmINPUT_CSC_C21_C22_B, value);
624
625 value = 0;
626 set_reg_field_value(
627 value, regval[6], INPUT_CSC_C23_C24_B, INPUT_CSC_C23_B);
628 set_reg_field_value(
629 value, regval[7], INPUT_CSC_C23_C24_B, INPUT_CSC_C24_B);
630 dm_write_reg(ctx, mmINPUT_CSC_C23_C24_B, value);
631
632 value = 0;
633 set_reg_field_value(
634 value, regval[8], INPUT_CSC_C31_C32_B, INPUT_CSC_C31_B);
635 set_reg_field_value(
636 value, regval[9], INPUT_CSC_C31_C32_B, INPUT_CSC_C32_B);
637 dm_write_reg(ctx, mmINPUT_CSC_C31_C32_B, value);
638
639 value = 0;
640 set_reg_field_value(
641 value, regval[10], INPUT_CSC_C33_C34_B, INPUT_CSC_C33_B);
642 set_reg_field_value(
643 value, regval[11], INPUT_CSC_C33_C34_B, INPUT_CSC_C34_B);
644 dm_write_reg(ctx, mmINPUT_CSC_C33_C34_B, value);
645 }
646
647
648 value = 0;
649
650
651
652
653
654
655
656
657
658
659
660 set_reg_field_value(
661 value, 2, COL_MAN_INPUT_CSC_CONTROL, INPUT_CSC_INPUT_TYPE);
662 set_reg_field_value(
663 value,
664 use_set_a ? 1 : 2,
665 COL_MAN_INPUT_CSC_CONTROL,
666 INPUT_CSC_MODE);
667
668 dm_write_reg(ctx, mmCOL_MAN_INPUT_CSC_CONTROL, value);
669}
670
671void dce110_opp_v_set_csc_default(
672 struct transform *xfm,
673 const struct default_adjustment *default_adjust)
674{
675 struct dce_transform *xfm_dce = TO_DCE_TRANSFORM(xfm);
676 enum csc_color_mode config =
677 CSC_COLOR_MODE_GRAPHICS_PREDEFINED;
678
679 if (default_adjust->force_hw_default == false) {
680 const struct out_csc_color_matrix *elm;
681
682 enum grph_color_adjust_option option;
683 uint32_t i;
684
685
686
687
688
689
690 option = GRPH_COLOR_MATRIX_SW;
691
692 for (i = 0; i < ARRAY_SIZE(global_color_matrix); ++i) {
693 elm = &global_color_matrix[i];
694 if (elm->color_space != default_adjust->out_color_space)
695 continue;
696
697
698
699 program_color_matrix_v(xfm_dce, elm, option);
700 config = CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC;
701 break;
702 }
703 }
704
705 program_input_csc(xfm, default_adjust->in_color_space);
706
707
708
709
710
711
712
713 configure_graphics_mode_v(xfm_dce, config,
714 default_adjust->csc_adjust_type,
715 default_adjust->out_color_space);
716
717 set_Denormalization(xfm, default_adjust->color_depth);
718}
719
720void dce110_opp_v_set_csc_adjustment(
721 struct transform *xfm,
722 const struct out_csc_color_matrix *tbl_entry)
723{
724 struct dce_transform *xfm_dce = TO_DCE_TRANSFORM(xfm);
725 enum csc_color_mode config =
726 CSC_COLOR_MODE_GRAPHICS_OUTPUT_CSC;
727
728 program_color_matrix_v(
729 xfm_dce, tbl_entry, GRPH_COLOR_MATRIX_SW);
730
731
732 configure_graphics_mode_v(xfm_dce, config, GRAPHICS_CSC_ADJUST_TYPE_SW,
733 tbl_entry->color_space);
734
735
736
737}
738