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 <drm/drmP.h>
27#include <drm/drm_crtc_helper.h>
28#include <drm/radeon_drm.h>
29#include "radeon.h"
30#include "atom.h"
31#include <linux/backlight.h>
32
33extern int atom_debug;
34
35static u8
36radeon_atom_get_backlight_level_from_reg(struct radeon_device *rdev)
37{
38 u8 backlight_level;
39 u32 bios_2_scratch;
40
41 if (rdev->family >= CHIP_R600)
42 bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
43 else
44 bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
45
46 backlight_level = ((bios_2_scratch & ATOM_S2_CURRENT_BL_LEVEL_MASK) >>
47 ATOM_S2_CURRENT_BL_LEVEL_SHIFT);
48
49 return backlight_level;
50}
51
52static void
53radeon_atom_set_backlight_level_to_reg(struct radeon_device *rdev,
54 u8 backlight_level)
55{
56 u32 bios_2_scratch;
57
58 if (rdev->family >= CHIP_R600)
59 bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
60 else
61 bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
62
63 bios_2_scratch &= ~ATOM_S2_CURRENT_BL_LEVEL_MASK;
64 bios_2_scratch |= ((backlight_level << ATOM_S2_CURRENT_BL_LEVEL_SHIFT) &
65 ATOM_S2_CURRENT_BL_LEVEL_MASK);
66
67 if (rdev->family >= CHIP_R600)
68 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
69 else
70 WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
71}
72
73u8
74atombios_get_backlight_level(struct radeon_encoder *radeon_encoder)
75{
76 struct drm_device *dev = radeon_encoder->base.dev;
77 struct radeon_device *rdev = dev->dev_private;
78
79 if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
80 return 0;
81
82 return radeon_atom_get_backlight_level_from_reg(rdev);
83}
84
85void
86atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level)
87{
88 struct drm_encoder *encoder = &radeon_encoder->base;
89 struct drm_device *dev = radeon_encoder->base.dev;
90 struct radeon_device *rdev = dev->dev_private;
91 struct radeon_encoder_atom_dig *dig;
92 DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args;
93 int index;
94
95 if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
96 return;
97
98 if ((radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) &&
99 radeon_encoder->enc_priv) {
100 dig = radeon_encoder->enc_priv;
101 dig->backlight_level = level;
102 radeon_atom_set_backlight_level_to_reg(rdev, dig->backlight_level);
103
104 switch (radeon_encoder->encoder_id) {
105 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
106 case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
107 index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl);
108 if (dig->backlight_level == 0) {
109 args.ucAction = ATOM_LCD_BLOFF;
110 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
111 } else {
112 args.ucAction = ATOM_LCD_BL_BRIGHTNESS_CONTROL;
113 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
114 args.ucAction = ATOM_LCD_BLON;
115 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
116 }
117 break;
118 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
119 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
120 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
121 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
122 if (dig->backlight_level == 0)
123 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0);
124 else {
125 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_BL_BRIGHTNESS_CONTROL, 0, 0);
126 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0);
127 }
128 break;
129 default:
130 break;
131 }
132 }
133}
134
135#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
136
137static u8 radeon_atom_bl_level(struct backlight_device *bd)
138{
139 u8 level;
140
141
142 if (bd->props.brightness < 0)
143 level = 0;
144 else if (bd->props.brightness > RADEON_MAX_BL_LEVEL)
145 level = RADEON_MAX_BL_LEVEL;
146 else
147 level = bd->props.brightness;
148
149 return level;
150}
151
152static int radeon_atom_backlight_update_status(struct backlight_device *bd)
153{
154 struct radeon_backlight_privdata *pdata = bl_get_data(bd);
155 struct radeon_encoder *radeon_encoder = pdata->encoder;
156
157 atombios_set_backlight_level(radeon_encoder, radeon_atom_bl_level(bd));
158
159 return 0;
160}
161
162static int radeon_atom_backlight_get_brightness(struct backlight_device *bd)
163{
164 struct radeon_backlight_privdata *pdata = bl_get_data(bd);
165 struct radeon_encoder *radeon_encoder = pdata->encoder;
166 struct drm_device *dev = radeon_encoder->base.dev;
167 struct radeon_device *rdev = dev->dev_private;
168
169 return radeon_atom_get_backlight_level_from_reg(rdev);
170}
171
172static const struct backlight_ops radeon_atom_backlight_ops = {
173 .get_brightness = radeon_atom_backlight_get_brightness,
174 .update_status = radeon_atom_backlight_update_status,
175};
176
177void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder,
178 struct drm_connector *drm_connector)
179{
180 struct drm_device *dev = radeon_encoder->base.dev;
181 struct radeon_device *rdev = dev->dev_private;
182 struct backlight_device *bd;
183 struct backlight_properties props;
184 struct radeon_backlight_privdata *pdata;
185 struct radeon_encoder_atom_dig *dig;
186 u8 backlight_level;
187 char bl_name[16];
188
189
190
191
192 if ((rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) &&
193 (rdev->pdev->device == 0x6741))
194 return;
195
196 if (!radeon_encoder->enc_priv)
197 return;
198
199 if (!rdev->is_atom_bios)
200 return;
201
202 if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
203 return;
204
205 pdata = kmalloc(sizeof(struct radeon_backlight_privdata), GFP_KERNEL);
206 if (!pdata) {
207 DRM_ERROR("Memory allocation failed\n");
208 goto error;
209 }
210
211 memset(&props, 0, sizeof(props));
212 props.max_brightness = RADEON_MAX_BL_LEVEL;
213 props.type = BACKLIGHT_RAW;
214 snprintf(bl_name, sizeof(bl_name),
215 "radeon_bl%d", dev->primary->index);
216 bd = backlight_device_register(bl_name, &drm_connector->kdev,
217 pdata, &radeon_atom_backlight_ops, &props);
218 if (IS_ERR(bd)) {
219 DRM_ERROR("Backlight registration failed\n");
220 goto error;
221 }
222
223 pdata->encoder = radeon_encoder;
224
225 backlight_level = radeon_atom_get_backlight_level_from_reg(rdev);
226
227 dig = radeon_encoder->enc_priv;
228 dig->bl_dev = bd;
229
230 bd->props.brightness = radeon_atom_backlight_get_brightness(bd);
231 bd->props.power = FB_BLANK_UNBLANK;
232 backlight_update_status(bd);
233
234 DRM_INFO("radeon atom DIG backlight initialized\n");
235
236 return;
237
238error:
239 kfree(pdata);
240 return;
241}
242
243static void radeon_atom_backlight_exit(struct radeon_encoder *radeon_encoder)
244{
245 struct drm_device *dev = radeon_encoder->base.dev;
246 struct radeon_device *rdev = dev->dev_private;
247 struct backlight_device *bd = NULL;
248 struct radeon_encoder_atom_dig *dig;
249
250 if (!radeon_encoder->enc_priv)
251 return;
252
253 if (!rdev->is_atom_bios)
254 return;
255
256 if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
257 return;
258
259 dig = radeon_encoder->enc_priv;
260 bd = dig->bl_dev;
261 dig->bl_dev = NULL;
262
263 if (bd) {
264 struct radeon_legacy_backlight_privdata *pdata;
265
266 pdata = bl_get_data(bd);
267 backlight_device_unregister(bd);
268 kfree(pdata);
269
270 DRM_INFO("radeon atom LVDS backlight unloaded\n");
271 }
272}
273
274#else
275
276void radeon_atom_backlight_init(struct radeon_encoder *encoder)
277{
278}
279
280static void radeon_atom_backlight_exit(struct radeon_encoder *encoder)
281{
282}
283
284#endif
285
286
287bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
288 struct drm_display_mode *mode);
289
290
291static inline bool radeon_encoder_is_digital(struct drm_encoder *encoder)
292{
293 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
294 switch (radeon_encoder->encoder_id) {
295 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
296 case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
297 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
298 case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
299 case ENCODER_OBJECT_ID_INTERNAL_DVO1:
300 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
301 case ENCODER_OBJECT_ID_INTERNAL_DDI:
302 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
303 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
304 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
305 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
306 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
307 return true;
308 default:
309 return false;
310 }
311}
312
313static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
314 const struct drm_display_mode *mode,
315 struct drm_display_mode *adjusted_mode)
316{
317 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
318 struct drm_device *dev = encoder->dev;
319 struct radeon_device *rdev = dev->dev_private;
320
321
322 radeon_encoder_set_active_device(encoder);
323 drm_mode_set_crtcinfo(adjusted_mode, 0);
324
325
326 if ((mode->flags & DRM_MODE_FLAG_INTERLACE)
327 && (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
328 adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
329
330
331 if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT))
332 radeon_panel_mode_fixup(encoder, adjusted_mode);
333
334
335 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) {
336 struct radeon_encoder_atom_dac *tv_dac = radeon_encoder->enc_priv;
337 if (tv_dac) {
338 if (tv_dac->tv_std == TV_STD_NTSC ||
339 tv_dac->tv_std == TV_STD_NTSC_J ||
340 tv_dac->tv_std == TV_STD_PAL_M)
341 radeon_atom_get_tv_timings(rdev, 0, adjusted_mode);
342 else
343 radeon_atom_get_tv_timings(rdev, 1, adjusted_mode);
344 }
345 }
346
347 if (ASIC_IS_DCE3(rdev) &&
348 ((radeon_encoder->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
349 (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE))) {
350 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
351 radeon_dp_set_link_config(connector, adjusted_mode);
352 }
353
354 return true;
355}
356
357static void
358atombios_dac_setup(struct drm_encoder *encoder, int action)
359{
360 struct drm_device *dev = encoder->dev;
361 struct radeon_device *rdev = dev->dev_private;
362 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
363 DAC_ENCODER_CONTROL_PS_ALLOCATION args;
364 int index = 0;
365 struct radeon_encoder_atom_dac *dac_info = radeon_encoder->enc_priv;
366
367 memset(&args, 0, sizeof(args));
368
369 switch (radeon_encoder->encoder_id) {
370 case ENCODER_OBJECT_ID_INTERNAL_DAC1:
371 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
372 index = GetIndexIntoMasterTable(COMMAND, DAC1EncoderControl);
373 break;
374 case ENCODER_OBJECT_ID_INTERNAL_DAC2:
375 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
376 index = GetIndexIntoMasterTable(COMMAND, DAC2EncoderControl);
377 break;
378 }
379
380 args.ucAction = action;
381
382 if (radeon_encoder->active_device & (ATOM_DEVICE_CRT_SUPPORT))
383 args.ucDacStandard = ATOM_DAC1_PS2;
384 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
385 args.ucDacStandard = ATOM_DAC1_CV;
386 else {
387 switch (dac_info->tv_std) {
388 case TV_STD_PAL:
389 case TV_STD_PAL_M:
390 case TV_STD_SCART_PAL:
391 case TV_STD_SECAM:
392 case TV_STD_PAL_CN:
393 args.ucDacStandard = ATOM_DAC1_PAL;
394 break;
395 case TV_STD_NTSC:
396 case TV_STD_NTSC_J:
397 case TV_STD_PAL_60:
398 default:
399 args.ucDacStandard = ATOM_DAC1_NTSC;
400 break;
401 }
402 }
403 args.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
404
405 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
406
407}
408
409static void
410atombios_tv_setup(struct drm_encoder *encoder, int action)
411{
412 struct drm_device *dev = encoder->dev;
413 struct radeon_device *rdev = dev->dev_private;
414 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
415 TV_ENCODER_CONTROL_PS_ALLOCATION args;
416 int index = 0;
417 struct radeon_encoder_atom_dac *dac_info = radeon_encoder->enc_priv;
418
419 memset(&args, 0, sizeof(args));
420
421 index = GetIndexIntoMasterTable(COMMAND, TVEncoderControl);
422
423 args.sTVEncoder.ucAction = action;
424
425 if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
426 args.sTVEncoder.ucTvStandard = ATOM_TV_CV;
427 else {
428 switch (dac_info->tv_std) {
429 case TV_STD_NTSC:
430 args.sTVEncoder.ucTvStandard = ATOM_TV_NTSC;
431 break;
432 case TV_STD_PAL:
433 args.sTVEncoder.ucTvStandard = ATOM_TV_PAL;
434 break;
435 case TV_STD_PAL_M:
436 args.sTVEncoder.ucTvStandard = ATOM_TV_PALM;
437 break;
438 case TV_STD_PAL_60:
439 args.sTVEncoder.ucTvStandard = ATOM_TV_PAL60;
440 break;
441 case TV_STD_NTSC_J:
442 args.sTVEncoder.ucTvStandard = ATOM_TV_NTSCJ;
443 break;
444 case TV_STD_SCART_PAL:
445 args.sTVEncoder.ucTvStandard = ATOM_TV_PAL;
446 break;
447 case TV_STD_SECAM:
448 args.sTVEncoder.ucTvStandard = ATOM_TV_SECAM;
449 break;
450 case TV_STD_PAL_CN:
451 args.sTVEncoder.ucTvStandard = ATOM_TV_PALCN;
452 break;
453 default:
454 args.sTVEncoder.ucTvStandard = ATOM_TV_NTSC;
455 break;
456 }
457 }
458
459 args.sTVEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
460
461 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
462
463}
464
465static u8 radeon_atom_get_bpc(struct drm_encoder *encoder)
466{
467 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
468 int bpc = 8;
469
470 if (connector)
471 bpc = radeon_get_monitor_bpc(connector);
472
473 switch (bpc) {
474 case 0:
475 return PANEL_BPC_UNDEFINE;
476 case 6:
477 return PANEL_6BIT_PER_COLOR;
478 case 8:
479 default:
480 return PANEL_8BIT_PER_COLOR;
481 case 10:
482 return PANEL_10BIT_PER_COLOR;
483 case 12:
484 return PANEL_12BIT_PER_COLOR;
485 case 16:
486 return PANEL_16BIT_PER_COLOR;
487 }
488}
489
490union dvo_encoder_control {
491 ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION ext_tmds;
492 DVO_ENCODER_CONTROL_PS_ALLOCATION dvo;
493 DVO_ENCODER_CONTROL_PS_ALLOCATION_V3 dvo_v3;
494 DVO_ENCODER_CONTROL_PS_ALLOCATION_V1_4 dvo_v4;
495};
496
497void
498atombios_dvo_setup(struct drm_encoder *encoder, int action)
499{
500 struct drm_device *dev = encoder->dev;
501 struct radeon_device *rdev = dev->dev_private;
502 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
503 union dvo_encoder_control args;
504 int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
505 uint8_t frev, crev;
506
507 memset(&args, 0, sizeof(args));
508
509 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
510 return;
511
512
513 if (rdev->family <= CHIP_RV410)
514 frev = 1;
515
516 switch (frev) {
517 case 1:
518 switch (crev) {
519 case 1:
520
521 args.ext_tmds.sXTmdsEncoder.ucEnable = action;
522
523 if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
524 args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL;
525
526 args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB;
527 break;
528 case 2:
529
530 args.dvo.sDVOEncoder.ucAction = action;
531 args.dvo.sDVOEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
532
533 args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX;
534
535 if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
536 args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL;
537 break;
538 case 3:
539
540 args.dvo_v3.ucAction = action;
541 args.dvo_v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
542 args.dvo_v3.ucDVOConfig = 0;
543 break;
544 case 4:
545
546 args.dvo_v4.ucAction = action;
547 args.dvo_v4.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
548 args.dvo_v4.ucDVOConfig = 0;
549 args.dvo_v4.ucBitPerColor = radeon_atom_get_bpc(encoder);
550 break;
551 default:
552 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
553 break;
554 }
555 break;
556 default:
557 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
558 break;
559 }
560
561 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
562}
563
564union lvds_encoder_control {
565 LVDS_ENCODER_CONTROL_PS_ALLOCATION v1;
566 LVDS_ENCODER_CONTROL_PS_ALLOCATION_V2 v2;
567};
568
569void
570atombios_digital_setup(struct drm_encoder *encoder, int action)
571{
572 struct drm_device *dev = encoder->dev;
573 struct radeon_device *rdev = dev->dev_private;
574 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
575 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
576 union lvds_encoder_control args;
577 int index = 0;
578 int hdmi_detected = 0;
579 uint8_t frev, crev;
580
581 if (!dig)
582 return;
583
584 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI)
585 hdmi_detected = 1;
586
587 memset(&args, 0, sizeof(args));
588
589 switch (radeon_encoder->encoder_id) {
590 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
591 index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl);
592 break;
593 case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
594 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
595 index = GetIndexIntoMasterTable(COMMAND, TMDS1EncoderControl);
596 break;
597 case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
598 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
599 index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl);
600 else
601 index = GetIndexIntoMasterTable(COMMAND, TMDS2EncoderControl);
602 break;
603 }
604
605 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
606 return;
607
608 switch (frev) {
609 case 1:
610 case 2:
611 switch (crev) {
612 case 1:
613 args.v1.ucMisc = 0;
614 args.v1.ucAction = action;
615 if (hdmi_detected)
616 args.v1.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE;
617 args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
618 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
619 if (dig->lcd_misc & ATOM_PANEL_MISC_DUAL)
620 args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL;
621 if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB)
622 args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB;
623 } else {
624 if (dig->linkb)
625 args.v1.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB;
626 if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
627 args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL;
628
629 args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB;
630 }
631 break;
632 case 2:
633 case 3:
634 args.v2.ucMisc = 0;
635 args.v2.ucAction = action;
636 if (crev == 3) {
637 if (dig->coherent_mode)
638 args.v2.ucMisc |= PANEL_ENCODER_MISC_COHERENT;
639 }
640 if (hdmi_detected)
641 args.v2.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE;
642 args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
643 args.v2.ucTruncate = 0;
644 args.v2.ucSpatial = 0;
645 args.v2.ucTemporal = 0;
646 args.v2.ucFRC = 0;
647 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
648 if (dig->lcd_misc & ATOM_PANEL_MISC_DUAL)
649 args.v2.ucMisc |= PANEL_ENCODER_MISC_DUAL;
650 if (dig->lcd_misc & ATOM_PANEL_MISC_SPATIAL) {
651 args.v2.ucSpatial = PANEL_ENCODER_SPATIAL_DITHER_EN;
652 if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB)
653 args.v2.ucSpatial |= PANEL_ENCODER_SPATIAL_DITHER_DEPTH;
654 }
655 if (dig->lcd_misc & ATOM_PANEL_MISC_TEMPORAL) {
656 args.v2.ucTemporal = PANEL_ENCODER_TEMPORAL_DITHER_EN;
657 if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB)
658 args.v2.ucTemporal |= PANEL_ENCODER_TEMPORAL_DITHER_DEPTH;
659 if (((dig->lcd_misc >> ATOM_PANEL_MISC_GREY_LEVEL_SHIFT) & 0x3) == 2)
660 args.v2.ucTemporal |= PANEL_ENCODER_TEMPORAL_LEVEL_4;
661 }
662 } else {
663 if (dig->linkb)
664 args.v2.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB;
665 if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
666 args.v2.ucMisc |= PANEL_ENCODER_MISC_DUAL;
667 }
668 break;
669 default:
670 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
671 break;
672 }
673 break;
674 default:
675 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
676 break;
677 }
678
679 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
680}
681
682int
683atombios_get_encoder_mode(struct drm_encoder *encoder)
684{
685 struct drm_device *dev = encoder->dev;
686 struct radeon_device *rdev = dev->dev_private;
687 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
688 struct drm_connector *connector;
689 struct radeon_connector *radeon_connector;
690 struct radeon_connector_atom_dig *dig_connector;
691
692
693 if (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE)
694 return ATOM_ENCODER_MODE_DP;
695
696
697 if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DVO1) ||
698 (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1))
699 return ATOM_ENCODER_MODE_DVO;
700
701 connector = radeon_get_connector_for_encoder(encoder);
702
703
704
705 if (!connector)
706 connector = radeon_get_connector_for_encoder_init(encoder);
707 radeon_connector = to_radeon_connector(connector);
708
709 switch (connector->connector_type) {
710 case DRM_MODE_CONNECTOR_DVII:
711 case DRM_MODE_CONNECTOR_HDMIB:
712 if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
713 radeon_audio &&
714 !ASIC_IS_DCE6(rdev))
715 return ATOM_ENCODER_MODE_HDMI;
716 else if (radeon_connector->use_digital)
717 return ATOM_ENCODER_MODE_DVI;
718 else
719 return ATOM_ENCODER_MODE_CRT;
720 break;
721 case DRM_MODE_CONNECTOR_DVID:
722 case DRM_MODE_CONNECTOR_HDMIA:
723 default:
724 if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
725 radeon_audio &&
726 !ASIC_IS_DCE6(rdev))
727 return ATOM_ENCODER_MODE_HDMI;
728 else
729 return ATOM_ENCODER_MODE_DVI;
730 break;
731 case DRM_MODE_CONNECTOR_LVDS:
732 return ATOM_ENCODER_MODE_LVDS;
733 break;
734 case DRM_MODE_CONNECTOR_DisplayPort:
735 dig_connector = radeon_connector->con_priv;
736 if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
737 (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
738 return ATOM_ENCODER_MODE_DP;
739 else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
740 radeon_audio &&
741 !ASIC_IS_DCE6(rdev))
742 return ATOM_ENCODER_MODE_HDMI;
743 else
744 return ATOM_ENCODER_MODE_DVI;
745 break;
746 case DRM_MODE_CONNECTOR_eDP:
747 return ATOM_ENCODER_MODE_DP;
748 case DRM_MODE_CONNECTOR_DVIA:
749 case DRM_MODE_CONNECTOR_VGA:
750 return ATOM_ENCODER_MODE_CRT;
751 break;
752 case DRM_MODE_CONNECTOR_Composite:
753 case DRM_MODE_CONNECTOR_SVIDEO:
754 case DRM_MODE_CONNECTOR_9PinDIN:
755
756 return ATOM_ENCODER_MODE_TV;
757
758 break;
759 }
760}
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809union dig_encoder_control {
810 DIG_ENCODER_CONTROL_PS_ALLOCATION v1;
811 DIG_ENCODER_CONTROL_PARAMETERS_V2 v2;
812 DIG_ENCODER_CONTROL_PARAMETERS_V3 v3;
813 DIG_ENCODER_CONTROL_PARAMETERS_V4 v4;
814};
815
816void
817atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode)
818{
819 struct drm_device *dev = encoder->dev;
820 struct radeon_device *rdev = dev->dev_private;
821 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
822 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
823 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
824 union dig_encoder_control args;
825 int index = 0;
826 uint8_t frev, crev;
827 int dp_clock = 0;
828 int dp_lane_count = 0;
829 int hpd_id = RADEON_HPD_NONE;
830
831 if (connector) {
832 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
833 struct radeon_connector_atom_dig *dig_connector =
834 radeon_connector->con_priv;
835
836 dp_clock = dig_connector->dp_clock;
837 dp_lane_count = dig_connector->dp_lane_count;
838 hpd_id = radeon_connector->hpd.hpd;
839 }
840
841
842 if (dig->dig_encoder == -1)
843 return;
844
845 memset(&args, 0, sizeof(args));
846
847 if (ASIC_IS_DCE4(rdev))
848 index = GetIndexIntoMasterTable(COMMAND, DIGxEncoderControl);
849 else {
850 if (dig->dig_encoder)
851 index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl);
852 else
853 index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl);
854 }
855
856 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
857 return;
858
859 switch (frev) {
860 case 1:
861 switch (crev) {
862 case 1:
863 args.v1.ucAction = action;
864 args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
865 if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
866 args.v3.ucPanelMode = panel_mode;
867 else
868 args.v1.ucEncoderMode = atombios_get_encoder_mode(encoder);
869
870 if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode))
871 args.v1.ucLaneNum = dp_lane_count;
872 else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
873 args.v1.ucLaneNum = 8;
874 else
875 args.v1.ucLaneNum = 4;
876
877 if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000))
878 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
879 switch (radeon_encoder->encoder_id) {
880 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
881 args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1;
882 break;
883 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
884 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
885 args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER2;
886 break;
887 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
888 args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER3;
889 break;
890 }
891 if (dig->linkb)
892 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKB;
893 else
894 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKA;
895 break;
896 case 2:
897 case 3:
898 args.v3.ucAction = action;
899 args.v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
900 if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
901 args.v3.ucPanelMode = panel_mode;
902 else
903 args.v3.ucEncoderMode = atombios_get_encoder_mode(encoder);
904
905 if (ENCODER_MODE_IS_DP(args.v3.ucEncoderMode))
906 args.v3.ucLaneNum = dp_lane_count;
907 else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
908 args.v3.ucLaneNum = 8;
909 else
910 args.v3.ucLaneNum = 4;
911
912 if (ENCODER_MODE_IS_DP(args.v3.ucEncoderMode) && (dp_clock == 270000))
913 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
914 args.v3.acConfig.ucDigSel = dig->dig_encoder;
915 args.v3.ucBitPerColor = radeon_atom_get_bpc(encoder);
916 break;
917 case 4:
918 args.v4.ucAction = action;
919 args.v4.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
920 if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
921 args.v4.ucPanelMode = panel_mode;
922 else
923 args.v4.ucEncoderMode = atombios_get_encoder_mode(encoder);
924
925 if (ENCODER_MODE_IS_DP(args.v4.ucEncoderMode))
926 args.v4.ucLaneNum = dp_lane_count;
927 else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
928 args.v4.ucLaneNum = 8;
929 else
930 args.v4.ucLaneNum = 4;
931
932 if (ENCODER_MODE_IS_DP(args.v4.ucEncoderMode)) {
933 if (dp_clock == 540000)
934 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_5_40GHZ;
935 else if (dp_clock == 324000)
936 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_3_24GHZ;
937 else if (dp_clock == 270000)
938 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_2_70GHZ;
939 else
940 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_1_62GHZ;
941 }
942 args.v4.acConfig.ucDigSel = dig->dig_encoder;
943 args.v4.ucBitPerColor = radeon_atom_get_bpc(encoder);
944 if (hpd_id == RADEON_HPD_NONE)
945 args.v4.ucHPD_ID = 0;
946 else
947 args.v4.ucHPD_ID = hpd_id + 1;
948 break;
949 default:
950 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
951 break;
952 }
953 break;
954 default:
955 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
956 break;
957 }
958
959 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
960
961}
962
963union dig_transmitter_control {
964 DIG_TRANSMITTER_CONTROL_PS_ALLOCATION v1;
965 DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2;
966 DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3;
967 DIG_TRANSMITTER_CONTROL_PARAMETERS_V4 v4;
968 DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_5 v5;
969};
970
971void
972atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t lane_num, uint8_t lane_set)
973{
974 struct drm_device *dev = encoder->dev;
975 struct radeon_device *rdev = dev->dev_private;
976 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
977 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
978 struct drm_connector *connector;
979 union dig_transmitter_control args;
980 int index = 0;
981 uint8_t frev, crev;
982 bool is_dp = false;
983 int pll_id = 0;
984 int dp_clock = 0;
985 int dp_lane_count = 0;
986 int connector_object_id = 0;
987 int igp_lane_info = 0;
988 int dig_encoder = dig->dig_encoder;
989 int hpd_id = RADEON_HPD_NONE;
990
991 if (action == ATOM_TRANSMITTER_ACTION_INIT) {
992 connector = radeon_get_connector_for_encoder_init(encoder);
993
994
995
996 dig_encoder = 0;
997 } else
998 connector = radeon_get_connector_for_encoder(encoder);
999
1000 if (connector) {
1001 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1002 struct radeon_connector_atom_dig *dig_connector =
1003 radeon_connector->con_priv;
1004
1005 hpd_id = radeon_connector->hpd.hpd;
1006 dp_clock = dig_connector->dp_clock;
1007 dp_lane_count = dig_connector->dp_lane_count;
1008 connector_object_id =
1009 (radeon_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
1010 igp_lane_info = dig_connector->igp_lane_info;
1011 }
1012
1013 if (encoder->crtc) {
1014 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1015 pll_id = radeon_crtc->pll_id;
1016 }
1017
1018
1019 if (dig_encoder == -1)
1020 return;
1021
1022 if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)))
1023 is_dp = true;
1024
1025 memset(&args, 0, sizeof(args));
1026
1027 switch (radeon_encoder->encoder_id) {
1028 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1029 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl);
1030 break;
1031 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1032 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1033 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1034 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1035 index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl);
1036 break;
1037 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1038 index = GetIndexIntoMasterTable(COMMAND, LVTMATransmitterControl);
1039 break;
1040 }
1041
1042 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
1043 return;
1044
1045 switch (frev) {
1046 case 1:
1047 switch (crev) {
1048 case 1:
1049 args.v1.ucAction = action;
1050 if (action == ATOM_TRANSMITTER_ACTION_INIT) {
1051 args.v1.usInitInfo = cpu_to_le16(connector_object_id);
1052 } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
1053 args.v1.asMode.ucLaneSel = lane_num;
1054 args.v1.asMode.ucLaneSet = lane_set;
1055 } else {
1056 if (is_dp)
1057 args.v1.usPixelClock = cpu_to_le16(dp_clock / 10);
1058 else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1059 args.v1.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
1060 else
1061 args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
1062 }
1063
1064 args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL;
1065
1066 if (dig_encoder)
1067 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER;
1068 else
1069 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER;
1070
1071 if ((rdev->flags & RADEON_IS_IGP) &&
1072 (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_UNIPHY)) {
1073 if (is_dp ||
1074 !radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) {
1075 if (igp_lane_info & 0x1)
1076 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_3;
1077 else if (igp_lane_info & 0x2)
1078 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_4_7;
1079 else if (igp_lane_info & 0x4)
1080 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_8_11;
1081 else if (igp_lane_info & 0x8)
1082 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_12_15;
1083 } else {
1084 if (igp_lane_info & 0x3)
1085 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_7;
1086 else if (igp_lane_info & 0xc)
1087 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_8_15;
1088 }
1089 }
1090
1091 if (dig->linkb)
1092 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKB;
1093 else
1094 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKA;
1095
1096 if (is_dp)
1097 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;
1098 else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
1099 if (dig->coherent_mode)
1100 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;
1101 if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1102 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_8LANE_LINK;
1103 }
1104 break;
1105 case 2:
1106 args.v2.ucAction = action;
1107 if (action == ATOM_TRANSMITTER_ACTION_INIT) {
1108 args.v2.usInitInfo = cpu_to_le16(connector_object_id);
1109 } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
1110 args.v2.asMode.ucLaneSel = lane_num;
1111 args.v2.asMode.ucLaneSet = lane_set;
1112 } else {
1113 if (is_dp)
1114 args.v2.usPixelClock = cpu_to_le16(dp_clock / 10);
1115 else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1116 args.v2.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
1117 else
1118 args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
1119 }
1120
1121 args.v2.acConfig.ucEncoderSel = dig_encoder;
1122 if (dig->linkb)
1123 args.v2.acConfig.ucLinkSel = 1;
1124
1125 switch (radeon_encoder->encoder_id) {
1126 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1127 args.v2.acConfig.ucTransmitterSel = 0;
1128 break;
1129 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1130 args.v2.acConfig.ucTransmitterSel = 1;
1131 break;
1132 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1133 args.v2.acConfig.ucTransmitterSel = 2;
1134 break;
1135 }
1136
1137 if (is_dp) {
1138 args.v2.acConfig.fCoherentMode = 1;
1139 args.v2.acConfig.fDPConnector = 1;
1140 } else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
1141 if (dig->coherent_mode)
1142 args.v2.acConfig.fCoherentMode = 1;
1143 if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1144 args.v2.acConfig.fDualLinkConnector = 1;
1145 }
1146 break;
1147 case 3:
1148 args.v3.ucAction = action;
1149 if (action == ATOM_TRANSMITTER_ACTION_INIT) {
1150 args.v3.usInitInfo = cpu_to_le16(connector_object_id);
1151 } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
1152 args.v3.asMode.ucLaneSel = lane_num;
1153 args.v3.asMode.ucLaneSet = lane_set;
1154 } else {
1155 if (is_dp)
1156 args.v3.usPixelClock = cpu_to_le16(dp_clock / 10);
1157 else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1158 args.v3.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
1159 else
1160 args.v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
1161 }
1162
1163 if (is_dp)
1164 args.v3.ucLaneNum = dp_lane_count;
1165 else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1166 args.v3.ucLaneNum = 8;
1167 else
1168 args.v3.ucLaneNum = 4;
1169
1170 if (dig->linkb)
1171 args.v3.acConfig.ucLinkSel = 1;
1172 if (dig_encoder & 1)
1173 args.v3.acConfig.ucEncoderSel = 1;
1174
1175
1176
1177
1178
1179
1180 if (is_dp && rdev->clock.dp_extclk)
1181 args.v3.acConfig.ucRefClkSource = 2;
1182 else
1183 args.v3.acConfig.ucRefClkSource = pll_id;
1184
1185 switch (radeon_encoder->encoder_id) {
1186 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1187 args.v3.acConfig.ucTransmitterSel = 0;
1188 break;
1189 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1190 args.v3.acConfig.ucTransmitterSel = 1;
1191 break;
1192 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1193 args.v3.acConfig.ucTransmitterSel = 2;
1194 break;
1195 }
1196
1197 if (is_dp)
1198 args.v3.acConfig.fCoherentMode = 1;
1199 else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
1200 if (dig->coherent_mode)
1201 args.v3.acConfig.fCoherentMode = 1;
1202 if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1203 args.v3.acConfig.fDualLinkConnector = 1;
1204 }
1205 break;
1206 case 4:
1207 args.v4.ucAction = action;
1208 if (action == ATOM_TRANSMITTER_ACTION_INIT) {
1209 args.v4.usInitInfo = cpu_to_le16(connector_object_id);
1210 } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
1211 args.v4.asMode.ucLaneSel = lane_num;
1212 args.v4.asMode.ucLaneSet = lane_set;
1213 } else {
1214 if (is_dp)
1215 args.v4.usPixelClock = cpu_to_le16(dp_clock / 10);
1216 else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1217 args.v4.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
1218 else
1219 args.v4.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
1220 }
1221
1222 if (is_dp)
1223 args.v4.ucLaneNum = dp_lane_count;
1224 else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1225 args.v4.ucLaneNum = 8;
1226 else
1227 args.v4.ucLaneNum = 4;
1228
1229 if (dig->linkb)
1230 args.v4.acConfig.ucLinkSel = 1;
1231 if (dig_encoder & 1)
1232 args.v4.acConfig.ucEncoderSel = 1;
1233
1234
1235
1236
1237
1238
1239 if (is_dp) {
1240 if (rdev->clock.dp_extclk)
1241 args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_EXTCLK;
1242 else
1243 args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_DCPLL;
1244 } else
1245 args.v4.acConfig.ucRefClkSource = pll_id;
1246
1247 switch (radeon_encoder->encoder_id) {
1248 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1249 args.v4.acConfig.ucTransmitterSel = 0;
1250 break;
1251 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1252 args.v4.acConfig.ucTransmitterSel = 1;
1253 break;
1254 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1255 args.v4.acConfig.ucTransmitterSel = 2;
1256 break;
1257 }
1258
1259 if (is_dp)
1260 args.v4.acConfig.fCoherentMode = 1;
1261 else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
1262 if (dig->coherent_mode)
1263 args.v4.acConfig.fCoherentMode = 1;
1264 if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1265 args.v4.acConfig.fDualLinkConnector = 1;
1266 }
1267 break;
1268 case 5:
1269 args.v5.ucAction = action;
1270 if (is_dp)
1271 args.v5.usSymClock = cpu_to_le16(dp_clock / 10);
1272 else
1273 args.v5.usSymClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
1274
1275 switch (radeon_encoder->encoder_id) {
1276 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1277 if (dig->linkb)
1278 args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYB;
1279 else
1280 args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYA;
1281 break;
1282 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1283 if (dig->linkb)
1284 args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYD;
1285 else
1286 args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYC;
1287 break;
1288 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1289 if (dig->linkb)
1290 args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYF;
1291 else
1292 args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYE;
1293 break;
1294 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1295 args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYG;
1296 break;
1297 }
1298 if (is_dp)
1299 args.v5.ucLaneNum = dp_lane_count;
1300 else if (radeon_encoder->pixel_clock > 165000)
1301 args.v5.ucLaneNum = 8;
1302 else
1303 args.v5.ucLaneNum = 4;
1304 args.v5.ucConnObjId = connector_object_id;
1305 args.v5.ucDigMode = atombios_get_encoder_mode(encoder);
1306
1307 if (is_dp && rdev->clock.dp_extclk)
1308 args.v5.asConfig.ucPhyClkSrcId = ENCODER_REFCLK_SRC_EXTCLK;
1309 else
1310 args.v5.asConfig.ucPhyClkSrcId = pll_id;
1311
1312 if (is_dp)
1313 args.v5.asConfig.ucCoherentMode = 1;
1314 else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
1315 if (dig->coherent_mode)
1316 args.v5.asConfig.ucCoherentMode = 1;
1317 }
1318 if (hpd_id == RADEON_HPD_NONE)
1319 args.v5.asConfig.ucHPDSel = 0;
1320 else
1321 args.v5.asConfig.ucHPDSel = hpd_id + 1;
1322 args.v5.ucDigEncoderSel = 1 << dig_encoder;
1323 args.v5.ucDPLaneSet = lane_set;
1324 break;
1325 default:
1326 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
1327 break;
1328 }
1329 break;
1330 default:
1331 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
1332 break;
1333 }
1334
1335 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1336}
1337
1338bool
1339atombios_set_edp_panel_power(struct drm_connector *connector, int action)
1340{
1341 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1342 struct drm_device *dev = radeon_connector->base.dev;
1343 struct radeon_device *rdev = dev->dev_private;
1344 union dig_transmitter_control args;
1345 int index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl);
1346 uint8_t frev, crev;
1347
1348 if (connector->connector_type != DRM_MODE_CONNECTOR_eDP)
1349 goto done;
1350
1351 if (!ASIC_IS_DCE4(rdev))
1352 goto done;
1353
1354 if ((action != ATOM_TRANSMITTER_ACTION_POWER_ON) &&
1355 (action != ATOM_TRANSMITTER_ACTION_POWER_OFF))
1356 goto done;
1357
1358 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
1359 goto done;
1360
1361 memset(&args, 0, sizeof(args));
1362
1363 args.v1.ucAction = action;
1364
1365 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1366
1367
1368 if (action == ATOM_TRANSMITTER_ACTION_POWER_ON) {
1369 int i;
1370
1371 for (i = 0; i < 300; i++) {
1372 if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))
1373 return true;
1374 mdelay(1);
1375 }
1376 return false;
1377 }
1378done:
1379 return true;
1380}
1381
1382union external_encoder_control {
1383 EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION v1;
1384 EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION_V3 v3;
1385};
1386
1387static void
1388atombios_external_encoder_setup(struct drm_encoder *encoder,
1389 struct drm_encoder *ext_encoder,
1390 int action)
1391{
1392 struct drm_device *dev = encoder->dev;
1393 struct radeon_device *rdev = dev->dev_private;
1394 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1395 struct radeon_encoder *ext_radeon_encoder = to_radeon_encoder(ext_encoder);
1396 union external_encoder_control args;
1397 struct drm_connector *connector;
1398 int index = GetIndexIntoMasterTable(COMMAND, ExternalEncoderControl);
1399 u8 frev, crev;
1400 int dp_clock = 0;
1401 int dp_lane_count = 0;
1402 int connector_object_id = 0;
1403 u32 ext_enum = (ext_radeon_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1404
1405 if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
1406 connector = radeon_get_connector_for_encoder_init(encoder);
1407 else
1408 connector = radeon_get_connector_for_encoder(encoder);
1409
1410 if (connector) {
1411 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1412 struct radeon_connector_atom_dig *dig_connector =
1413 radeon_connector->con_priv;
1414
1415 dp_clock = dig_connector->dp_clock;
1416 dp_lane_count = dig_connector->dp_lane_count;
1417 connector_object_id =
1418 (radeon_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
1419 }
1420
1421 memset(&args, 0, sizeof(args));
1422
1423 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
1424 return;
1425
1426 switch (frev) {
1427 case 1:
1428
1429 break;
1430 case 2:
1431 switch (crev) {
1432 case 1:
1433 case 2:
1434 args.v1.sDigEncoder.ucAction = action;
1435 args.v1.sDigEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
1436 args.v1.sDigEncoder.ucEncoderMode = atombios_get_encoder_mode(encoder);
1437
1438 if (ENCODER_MODE_IS_DP(args.v1.sDigEncoder.ucEncoderMode)) {
1439 if (dp_clock == 270000)
1440 args.v1.sDigEncoder.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
1441 args.v1.sDigEncoder.ucLaneNum = dp_lane_count;
1442 } else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1443 args.v1.sDigEncoder.ucLaneNum = 8;
1444 else
1445 args.v1.sDigEncoder.ucLaneNum = 4;
1446 break;
1447 case 3:
1448 args.v3.sExtEncoder.ucAction = action;
1449 if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
1450 args.v3.sExtEncoder.usConnectorId = cpu_to_le16(connector_object_id);
1451 else
1452 args.v3.sExtEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
1453 args.v3.sExtEncoder.ucEncoderMode = atombios_get_encoder_mode(encoder);
1454
1455 if (ENCODER_MODE_IS_DP(args.v3.sExtEncoder.ucEncoderMode)) {
1456 if (dp_clock == 270000)
1457 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
1458 else if (dp_clock == 540000)
1459 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_5_40GHZ;
1460 args.v3.sExtEncoder.ucLaneNum = dp_lane_count;
1461 } else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock))
1462 args.v3.sExtEncoder.ucLaneNum = 8;
1463 else
1464 args.v3.sExtEncoder.ucLaneNum = 4;
1465 switch (ext_enum) {
1466 case GRAPH_OBJECT_ENUM_ID1:
1467 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER1;
1468 break;
1469 case GRAPH_OBJECT_ENUM_ID2:
1470 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER2;
1471 break;
1472 case GRAPH_OBJECT_ENUM_ID3:
1473 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER3;
1474 break;
1475 }
1476 args.v3.sExtEncoder.ucBitPerColor = radeon_atom_get_bpc(encoder);
1477 break;
1478 default:
1479 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1480 return;
1481 }
1482 break;
1483 default:
1484 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1485 return;
1486 }
1487 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1488}
1489
1490static void
1491atombios_yuv_setup(struct drm_encoder *encoder, bool enable)
1492{
1493 struct drm_device *dev = encoder->dev;
1494 struct radeon_device *rdev = dev->dev_private;
1495 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1496 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1497 ENABLE_YUV_PS_ALLOCATION args;
1498 int index = GetIndexIntoMasterTable(COMMAND, EnableYUV);
1499 uint32_t temp, reg;
1500
1501 memset(&args, 0, sizeof(args));
1502
1503 if (rdev->family >= CHIP_R600)
1504 reg = R600_BIOS_3_SCRATCH;
1505 else
1506 reg = RADEON_BIOS_3_SCRATCH;
1507
1508
1509 temp = RREG32(reg);
1510 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1511 WREG32(reg, (ATOM_S3_TV1_ACTIVE |
1512 (radeon_crtc->crtc_id << 18)));
1513 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1514 WREG32(reg, (ATOM_S3_CV_ACTIVE | (radeon_crtc->crtc_id << 24)));
1515 else
1516 WREG32(reg, 0);
1517
1518 if (enable)
1519 args.ucEnable = ATOM_ENABLE;
1520 args.ucCRTC = radeon_crtc->crtc_id;
1521
1522 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1523
1524 WREG32(reg, temp);
1525}
1526
1527static void
1528radeon_atom_encoder_dpms_avivo(struct drm_encoder *encoder, int mode)
1529{
1530 struct drm_device *dev = encoder->dev;
1531 struct radeon_device *rdev = dev->dev_private;
1532 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1533 DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args;
1534 int index = 0;
1535
1536 memset(&args, 0, sizeof(args));
1537
1538 switch (radeon_encoder->encoder_id) {
1539 case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
1540 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
1541 index = GetIndexIntoMasterTable(COMMAND, TMDSAOutputControl);
1542 break;
1543 case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1544 case ENCODER_OBJECT_ID_INTERNAL_DDI:
1545 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1546 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl);
1547 break;
1548 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
1549 index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl);
1550 break;
1551 case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
1552 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1553 index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl);
1554 else
1555 index = GetIndexIntoMasterTable(COMMAND, LVTMAOutputControl);
1556 break;
1557 case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1558 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1559 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1560 index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
1561 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1562 index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
1563 else
1564 index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl);
1565 break;
1566 case ENCODER_OBJECT_ID_INTERNAL_DAC2:
1567 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1568 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1569 index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
1570 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1571 index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
1572 else
1573 index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl);
1574 break;
1575 default:
1576 return;
1577 }
1578
1579 switch (mode) {
1580 case DRM_MODE_DPMS_ON:
1581 args.ucAction = ATOM_ENABLE;
1582
1583 if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DDI) {
1584 u32 reg = RREG32(RADEON_BIOS_3_SCRATCH);
1585 WREG32(RADEON_BIOS_3_SCRATCH, reg & ~ATOM_S3_DFP2I_ACTIVE);
1586 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1587 WREG32(RADEON_BIOS_3_SCRATCH, reg);
1588 } else
1589 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1590 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1591 args.ucAction = ATOM_LCD_BLON;
1592 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1593 }
1594 break;
1595 case DRM_MODE_DPMS_STANDBY:
1596 case DRM_MODE_DPMS_SUSPEND:
1597 case DRM_MODE_DPMS_OFF:
1598 args.ucAction = ATOM_DISABLE;
1599 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1600 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1601 args.ucAction = ATOM_LCD_BLOFF;
1602 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1603 }
1604 break;
1605 }
1606}
1607
1608static void
1609radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode)
1610{
1611 struct drm_device *dev = encoder->dev;
1612 struct radeon_device *rdev = dev->dev_private;
1613 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1614 struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder);
1615 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
1616 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
1617 struct radeon_connector *radeon_connector = NULL;
1618 struct radeon_connector_atom_dig *radeon_dig_connector = NULL;
1619
1620 if (connector) {
1621 radeon_connector = to_radeon_connector(connector);
1622 radeon_dig_connector = radeon_connector->con_priv;
1623 }
1624
1625 switch (mode) {
1626 case DRM_MODE_DPMS_ON:
1627 if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
1628 if (!connector)
1629 dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
1630 else
1631 dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector);
1632
1633
1634 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0);
1635 atombios_dig_encoder_setup(encoder,
1636 ATOM_ENCODER_CMD_SETUP_PANEL_MODE,
1637 dig->panel_mode);
1638 if (ext_encoder) {
1639 if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev))
1640 atombios_external_encoder_setup(encoder, ext_encoder,
1641 EXTERNAL_ENCODER_ACTION_V3_ENCODER_SETUP);
1642 }
1643 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
1644 } else if (ASIC_IS_DCE4(rdev)) {
1645
1646 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0);
1647
1648 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
1649 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0);
1650 } else {
1651
1652 atombios_dig_encoder_setup(encoder, ATOM_ENABLE, 0);
1653 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0);
1654 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
1655
1656 if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730))
1657 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0);
1658 }
1659 if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) {
1660 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1661 atombios_set_edp_panel_power(connector,
1662 ATOM_TRANSMITTER_ACTION_POWER_ON);
1663 radeon_dig_connector->edp_on = true;
1664 }
1665 radeon_dp_link_train(encoder, connector);
1666 if (ASIC_IS_DCE4(rdev))
1667 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0);
1668 }
1669 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1670 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0);
1671 break;
1672 case DRM_MODE_DPMS_STANDBY:
1673 case DRM_MODE_DPMS_SUSPEND:
1674 case DRM_MODE_DPMS_OFF:
1675 if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
1676
1677 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
1678 } else if (ASIC_IS_DCE4(rdev)) {
1679
1680 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0);
1681 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
1682 } else {
1683
1684 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0);
1685 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
1686 atombios_dig_encoder_setup(encoder, ATOM_DISABLE, 0);
1687 }
1688 if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) {
1689 if (ASIC_IS_DCE4(rdev))
1690 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0);
1691 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1692 atombios_set_edp_panel_power(connector,
1693 ATOM_TRANSMITTER_ACTION_POWER_OFF);
1694 radeon_dig_connector->edp_on = false;
1695 }
1696 }
1697 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1698 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0);
1699 break;
1700 }
1701}
1702
1703static void
1704radeon_atom_encoder_dpms_ext(struct drm_encoder *encoder,
1705 struct drm_encoder *ext_encoder,
1706 int mode)
1707{
1708 struct drm_device *dev = encoder->dev;
1709 struct radeon_device *rdev = dev->dev_private;
1710
1711 switch (mode) {
1712 case DRM_MODE_DPMS_ON:
1713 default:
1714 if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev)) {
1715 atombios_external_encoder_setup(encoder, ext_encoder,
1716 EXTERNAL_ENCODER_ACTION_V3_ENABLE_OUTPUT);
1717 atombios_external_encoder_setup(encoder, ext_encoder,
1718 EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING_OFF);
1719 } else
1720 atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE);
1721 break;
1722 case DRM_MODE_DPMS_STANDBY:
1723 case DRM_MODE_DPMS_SUSPEND:
1724 case DRM_MODE_DPMS_OFF:
1725 if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev)) {
1726 atombios_external_encoder_setup(encoder, ext_encoder,
1727 EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING);
1728 atombios_external_encoder_setup(encoder, ext_encoder,
1729 EXTERNAL_ENCODER_ACTION_V3_DISABLE_OUTPUT);
1730 } else
1731 atombios_external_encoder_setup(encoder, ext_encoder, ATOM_DISABLE);
1732 break;
1733 }
1734}
1735
1736static void
1737radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)
1738{
1739 struct drm_device *dev = encoder->dev;
1740 struct radeon_device *rdev = dev->dev_private;
1741 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1742 struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder);
1743
1744 DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n",
1745 radeon_encoder->encoder_id, mode, radeon_encoder->devices,
1746 radeon_encoder->active_device);
1747 switch (radeon_encoder->encoder_id) {
1748 case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
1749 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
1750 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
1751 case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
1752 case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1753 case ENCODER_OBJECT_ID_INTERNAL_DDI:
1754 case ENCODER_OBJECT_ID_INTERNAL_DAC2:
1755 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1756 radeon_atom_encoder_dpms_avivo(encoder, mode);
1757 break;
1758 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1759 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1760 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1761 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1762 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1763 radeon_atom_encoder_dpms_dig(encoder, mode);
1764 break;
1765 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1766 if (ASIC_IS_DCE5(rdev)) {
1767 switch (mode) {
1768 case DRM_MODE_DPMS_ON:
1769 atombios_dvo_setup(encoder, ATOM_ENABLE);
1770 break;
1771 case DRM_MODE_DPMS_STANDBY:
1772 case DRM_MODE_DPMS_SUSPEND:
1773 case DRM_MODE_DPMS_OFF:
1774 atombios_dvo_setup(encoder, ATOM_DISABLE);
1775 break;
1776 }
1777 } else if (ASIC_IS_DCE3(rdev))
1778 radeon_atom_encoder_dpms_dig(encoder, mode);
1779 else
1780 radeon_atom_encoder_dpms_avivo(encoder, mode);
1781 break;
1782 case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1783 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1784 if (ASIC_IS_DCE5(rdev)) {
1785 switch (mode) {
1786 case DRM_MODE_DPMS_ON:
1787 atombios_dac_setup(encoder, ATOM_ENABLE);
1788 break;
1789 case DRM_MODE_DPMS_STANDBY:
1790 case DRM_MODE_DPMS_SUSPEND:
1791 case DRM_MODE_DPMS_OFF:
1792 atombios_dac_setup(encoder, ATOM_DISABLE);
1793 break;
1794 }
1795 } else
1796 radeon_atom_encoder_dpms_avivo(encoder, mode);
1797 break;
1798 default:
1799 return;
1800 }
1801
1802 if (ext_encoder)
1803 radeon_atom_encoder_dpms_ext(encoder, ext_encoder, mode);
1804
1805 radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
1806
1807}
1808
1809union crtc_source_param {
1810 SELECT_CRTC_SOURCE_PS_ALLOCATION v1;
1811 SELECT_CRTC_SOURCE_PARAMETERS_V2 v2;
1812};
1813
1814static void
1815atombios_set_encoder_crtc_source(struct drm_encoder *encoder)
1816{
1817 struct drm_device *dev = encoder->dev;
1818 struct radeon_device *rdev = dev->dev_private;
1819 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1820 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1821 union crtc_source_param args;
1822 int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source);
1823 uint8_t frev, crev;
1824 struct radeon_encoder_atom_dig *dig;
1825
1826 memset(&args, 0, sizeof(args));
1827
1828 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
1829 return;
1830
1831 switch (frev) {
1832 case 1:
1833 switch (crev) {
1834 case 1:
1835 default:
1836 if (ASIC_IS_AVIVO(rdev))
1837 args.v1.ucCRTC = radeon_crtc->crtc_id;
1838 else {
1839 if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DAC1) {
1840 args.v1.ucCRTC = radeon_crtc->crtc_id;
1841 } else {
1842 args.v1.ucCRTC = radeon_crtc->crtc_id << 2;
1843 }
1844 }
1845 switch (radeon_encoder->encoder_id) {
1846 case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
1847 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
1848 args.v1.ucDevice = ATOM_DEVICE_DFP1_INDEX;
1849 break;
1850 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
1851 case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
1852 if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT)
1853 args.v1.ucDevice = ATOM_DEVICE_LCD1_INDEX;
1854 else
1855 args.v1.ucDevice = ATOM_DEVICE_DFP3_INDEX;
1856 break;
1857 case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1858 case ENCODER_OBJECT_ID_INTERNAL_DDI:
1859 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1860 args.v1.ucDevice = ATOM_DEVICE_DFP2_INDEX;
1861 break;
1862 case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1863 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1864 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1865 args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX;
1866 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1867 args.v1.ucDevice = ATOM_DEVICE_CV_INDEX;
1868 else
1869 args.v1.ucDevice = ATOM_DEVICE_CRT1_INDEX;
1870 break;
1871 case ENCODER_OBJECT_ID_INTERNAL_DAC2:
1872 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1873 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1874 args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX;
1875 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1876 args.v1.ucDevice = ATOM_DEVICE_CV_INDEX;
1877 else
1878 args.v1.ucDevice = ATOM_DEVICE_CRT2_INDEX;
1879 break;
1880 }
1881 break;
1882 case 2:
1883 args.v2.ucCRTC = radeon_crtc->crtc_id;
1884 if (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE) {
1885 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
1886
1887 if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
1888 args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
1889 else if (connector->connector_type == DRM_MODE_CONNECTOR_VGA)
1890 args.v2.ucEncodeMode = ATOM_ENCODER_MODE_CRT;
1891 else
1892 args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder);
1893 } else
1894 args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder);
1895 switch (radeon_encoder->encoder_id) {
1896 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1897 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1898 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1899 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1900 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1901 dig = radeon_encoder->enc_priv;
1902 switch (dig->dig_encoder) {
1903 case 0:
1904 args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
1905 break;
1906 case 1:
1907 args.v2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID;
1908 break;
1909 case 2:
1910 args.v2.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID;
1911 break;
1912 case 3:
1913 args.v2.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID;
1914 break;
1915 case 4:
1916 args.v2.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID;
1917 break;
1918 case 5:
1919 args.v2.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID;
1920 break;
1921 case 6:
1922 args.v2.ucEncoderID = ASIC_INT_DIG7_ENCODER_ID;
1923 break;
1924 }
1925 break;
1926 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1927 args.v2.ucEncoderID = ASIC_INT_DVO_ENCODER_ID;
1928 break;
1929 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1930 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1931 args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1932 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1933 args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1934 else
1935 args.v2.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID;
1936 break;
1937 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1938 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1939 args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1940 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1941 args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1942 else
1943 args.v2.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID;
1944 break;
1945 }
1946 break;
1947 }
1948 break;
1949 default:
1950 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1951 return;
1952 }
1953
1954 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1955
1956
1957 radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
1958}
1959
1960static void
1961atombios_apply_encoder_quirks(struct drm_encoder *encoder,
1962 struct drm_display_mode *mode)
1963{
1964 struct drm_device *dev = encoder->dev;
1965 struct radeon_device *rdev = dev->dev_private;
1966 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1967 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1968
1969
1970 if ((dev->pdev->device == 0x71C5) &&
1971 (dev->pdev->subsystem_vendor == 0x106b) &&
1972 (dev->pdev->subsystem_device == 0x0080)) {
1973 if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
1974 uint32_t lvtma_bit_depth_control = RREG32(AVIVO_LVTMA_BIT_DEPTH_CONTROL);
1975
1976 lvtma_bit_depth_control &= ~AVIVO_LVTMA_BIT_DEPTH_CONTROL_TRUNCATE_EN;
1977 lvtma_bit_depth_control &= ~AVIVO_LVTMA_BIT_DEPTH_CONTROL_SPATIAL_DITHER_EN;
1978
1979 WREG32(AVIVO_LVTMA_BIT_DEPTH_CONTROL, lvtma_bit_depth_control);
1980 }
1981 }
1982
1983
1984 if (ASIC_IS_AVIVO(rdev) &&
1985 (!(radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)))) {
1986 if (ASIC_IS_DCE8(rdev)) {
1987 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
1988 WREG32(CIK_LB_DATA_FORMAT + radeon_crtc->crtc_offset,
1989 CIK_INTERLEAVE_EN);
1990 else
1991 WREG32(CIK_LB_DATA_FORMAT + radeon_crtc->crtc_offset, 0);
1992 } else if (ASIC_IS_DCE4(rdev)) {
1993 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
1994 WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset,
1995 EVERGREEN_INTERLEAVE_EN);
1996 else
1997 WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 0);
1998 } else {
1999 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2000 WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset,
2001 AVIVO_D1MODE_INTERLEAVE_EN);
2002 else
2003 WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 0);
2004 }
2005 }
2006}
2007
2008static int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder)
2009{
2010 struct drm_device *dev = encoder->dev;
2011 struct radeon_device *rdev = dev->dev_private;
2012 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
2013 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2014 struct drm_encoder *test_encoder;
2015 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
2016 uint32_t dig_enc_in_use = 0;
2017
2018 if (ASIC_IS_DCE6(rdev)) {
2019
2020 switch (radeon_encoder->encoder_id) {
2021 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
2022 if (dig->linkb)
2023 return 1;
2024 else
2025 return 0;
2026 break;
2027 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
2028 if (dig->linkb)
2029 return 3;
2030 else
2031 return 2;
2032 break;
2033 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
2034 if (dig->linkb)
2035 return 5;
2036 else
2037 return 4;
2038 break;
2039 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
2040 return 6;
2041 break;
2042 }
2043 } else if (ASIC_IS_DCE4(rdev)) {
2044
2045 if (ASIC_IS_DCE41(rdev) && !ASIC_IS_DCE61(rdev)) {
2046
2047 if (rdev->family == CHIP_PALM) {
2048 if (dig->linkb)
2049 return 1;
2050 else
2051 return 0;
2052 } else
2053
2054 return radeon_crtc->crtc_id;
2055 } else {
2056 switch (radeon_encoder->encoder_id) {
2057 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
2058 if (dig->linkb)
2059 return 1;
2060 else
2061 return 0;
2062 break;
2063 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
2064 if (dig->linkb)
2065 return 3;
2066 else
2067 return 2;
2068 break;
2069 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
2070 if (dig->linkb)
2071 return 5;
2072 else
2073 return 4;
2074 break;
2075 }
2076 }
2077 }
2078
2079
2080 if (ASIC_IS_DCE32(rdev)) {
2081 return radeon_crtc->crtc_id;
2082 }
2083
2084
2085 list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) {
2086 struct radeon_encoder *radeon_test_encoder;
2087
2088 if (encoder == test_encoder)
2089 continue;
2090
2091 if (!radeon_encoder_is_digital(test_encoder))
2092 continue;
2093
2094 radeon_test_encoder = to_radeon_encoder(test_encoder);
2095 dig = radeon_test_encoder->enc_priv;
2096
2097 if (dig->dig_encoder >= 0)
2098 dig_enc_in_use |= (1 << dig->dig_encoder);
2099 }
2100
2101 if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA) {
2102 if (dig_enc_in_use & 0x2)
2103 DRM_ERROR("LVDS required digital encoder 2 but it was in use - stealing\n");
2104 return 1;
2105 }
2106 if (!(dig_enc_in_use & 1))
2107 return 0;
2108 return 1;
2109}
2110
2111
2112void
2113radeon_atom_encoder_init(struct radeon_device *rdev)
2114{
2115 struct drm_device *dev = rdev->ddev;
2116 struct drm_encoder *encoder;
2117
2118 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
2119 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2120 struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder);
2121
2122 switch (radeon_encoder->encoder_id) {
2123 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
2124 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
2125 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
2126 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
2127 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
2128 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_INIT, 0, 0);
2129 break;
2130 default:
2131 break;
2132 }
2133
2134 if (ext_encoder && (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev)))
2135 atombios_external_encoder_setup(encoder, ext_encoder,
2136 EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT);
2137 }
2138}
2139
2140static void
2141radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
2142 struct drm_display_mode *mode,
2143 struct drm_display_mode *adjusted_mode)
2144{
2145 struct drm_device *dev = encoder->dev;
2146 struct radeon_device *rdev = dev->dev_private;
2147 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2148
2149 radeon_encoder->pixel_clock = adjusted_mode->clock;
2150
2151
2152 radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
2153
2154 if (ASIC_IS_AVIVO(rdev) && !ASIC_IS_DCE4(rdev)) {
2155 if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT))
2156 atombios_yuv_setup(encoder, true);
2157 else
2158 atombios_yuv_setup(encoder, false);
2159 }
2160
2161 switch (radeon_encoder->encoder_id) {
2162 case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
2163 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
2164 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
2165 case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
2166 atombios_digital_setup(encoder, PANEL_ENCODER_ACTION_ENABLE);
2167 break;
2168 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
2169 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
2170 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
2171 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
2172 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
2173
2174 break;
2175 case ENCODER_OBJECT_ID_INTERNAL_DDI:
2176 case ENCODER_OBJECT_ID_INTERNAL_DVO1:
2177 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
2178 atombios_dvo_setup(encoder, ATOM_ENABLE);
2179 break;
2180 case ENCODER_OBJECT_ID_INTERNAL_DAC1:
2181 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
2182 case ENCODER_OBJECT_ID_INTERNAL_DAC2:
2183 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
2184 atombios_dac_setup(encoder, ATOM_ENABLE);
2185 if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) {
2186 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))
2187 atombios_tv_setup(encoder, ATOM_ENABLE);
2188 else
2189 atombios_tv_setup(encoder, ATOM_DISABLE);
2190 }
2191 break;
2192 }
2193
2194 atombios_apply_encoder_quirks(encoder, adjusted_mode);
2195
2196 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
2197 if (rdev->asic->display.hdmi_enable)
2198 radeon_hdmi_enable(rdev, encoder, true);
2199 if (rdev->asic->display.hdmi_setmode)
2200 radeon_hdmi_setmode(rdev, encoder, adjusted_mode);
2201 }
2202}
2203
2204static bool
2205atombios_dac_load_detect(struct drm_encoder *encoder, struct drm_connector *connector)
2206{
2207 struct drm_device *dev = encoder->dev;
2208 struct radeon_device *rdev = dev->dev_private;
2209 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2210 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
2211
2212 if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT |
2213 ATOM_DEVICE_CV_SUPPORT |
2214 ATOM_DEVICE_CRT_SUPPORT)) {
2215 DAC_LOAD_DETECTION_PS_ALLOCATION args;
2216 int index = GetIndexIntoMasterTable(COMMAND, DAC_LoadDetection);
2217 uint8_t frev, crev;
2218
2219 memset(&args, 0, sizeof(args));
2220
2221 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2222 return false;
2223
2224 args.sDacload.ucMisc = 0;
2225
2226 if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DAC1) ||
2227 (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1))
2228 args.sDacload.ucDacType = ATOM_DAC_A;
2229 else
2230 args.sDacload.ucDacType = ATOM_DAC_B;
2231
2232 if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)
2233 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT1_SUPPORT);
2234 else if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)
2235 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT2_SUPPORT);
2236 else if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
2237 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CV_SUPPORT);
2238 if (crev >= 3)
2239 args.sDacload.ucMisc = DAC_LOAD_MISC_YPrPb;
2240 } else if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
2241 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_TV1_SUPPORT);
2242 if (crev >= 3)
2243 args.sDacload.ucMisc = DAC_LOAD_MISC_YPrPb;
2244 }
2245
2246 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2247
2248 return true;
2249 } else
2250 return false;
2251}
2252
2253static enum drm_connector_status
2254radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)
2255{
2256 struct drm_device *dev = encoder->dev;
2257 struct radeon_device *rdev = dev->dev_private;
2258 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2259 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
2260 uint32_t bios_0_scratch;
2261
2262 if (!atombios_dac_load_detect(encoder, connector)) {
2263 DRM_DEBUG_KMS("detect returned false \n");
2264 return connector_status_unknown;
2265 }
2266
2267 if (rdev->family >= CHIP_R600)
2268 bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
2269 else
2270 bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH);
2271
2272 DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices);
2273 if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) {
2274 if (bios_0_scratch & ATOM_S0_CRT1_MASK)
2275 return connector_status_connected;
2276 }
2277 if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) {
2278 if (bios_0_scratch & ATOM_S0_CRT2_MASK)
2279 return connector_status_connected;
2280 }
2281 if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
2282 if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
2283 return connector_status_connected;
2284 }
2285 if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
2286 if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
2287 return connector_status_connected;
2288 else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
2289 return connector_status_connected;
2290 }
2291 return connector_status_disconnected;
2292}
2293
2294static enum drm_connector_status
2295radeon_atom_dig_detect(struct drm_encoder *encoder, struct drm_connector *connector)
2296{
2297 struct drm_device *dev = encoder->dev;
2298 struct radeon_device *rdev = dev->dev_private;
2299 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2300 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
2301 struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder);
2302 u32 bios_0_scratch;
2303
2304 if (!ASIC_IS_DCE4(rdev))
2305 return connector_status_unknown;
2306
2307 if (!ext_encoder)
2308 return connector_status_unknown;
2309
2310 if ((radeon_connector->devices & ATOM_DEVICE_CRT_SUPPORT) == 0)
2311 return connector_status_unknown;
2312
2313
2314 atombios_external_encoder_setup(encoder, ext_encoder,
2315 EXTERNAL_ENCODER_ACTION_V3_DACLOAD_DETECTION);
2316
2317 bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
2318
2319 DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices);
2320 if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) {
2321 if (bios_0_scratch & ATOM_S0_CRT1_MASK)
2322 return connector_status_connected;
2323 }
2324 if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) {
2325 if (bios_0_scratch & ATOM_S0_CRT2_MASK)
2326 return connector_status_connected;
2327 }
2328 if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
2329 if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
2330 return connector_status_connected;
2331 }
2332 if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
2333 if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
2334 return connector_status_connected;
2335 else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
2336 return connector_status_connected;
2337 }
2338 return connector_status_disconnected;
2339}
2340
2341void
2342radeon_atom_ext_encoder_setup_ddc(struct drm_encoder *encoder)
2343{
2344 struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder);
2345
2346 if (ext_encoder)
2347
2348 atombios_external_encoder_setup(encoder, ext_encoder,
2349 EXTERNAL_ENCODER_ACTION_V3_DDC_SETUP);
2350
2351}
2352
2353static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
2354{
2355 struct radeon_device *rdev = encoder->dev->dev_private;
2356 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2357 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
2358
2359 if ((radeon_encoder->active_device &
2360 (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
2361 (radeon_encoder_get_dp_bridge_encoder_id(encoder) !=
2362 ENCODER_OBJECT_ID_NONE)) {
2363 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
2364 if (dig) {
2365 dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder);
2366 if (radeon_encoder->active_device & ATOM_DEVICE_DFP_SUPPORT) {
2367 if (rdev->family >= CHIP_R600)
2368 dig->afmt = rdev->mode_info.afmt[dig->dig_encoder];
2369 else
2370
2371 dig->afmt = rdev->mode_info.afmt[0];
2372 }
2373 }
2374 }
2375
2376 radeon_atom_output_lock(encoder, true);
2377
2378 if (connector) {
2379 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
2380
2381
2382 if (radeon_connector->router.cd_valid)
2383 radeon_router_select_cd_port(radeon_connector);
2384
2385
2386 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
2387 atombios_set_edp_panel_power(connector,
2388 ATOM_TRANSMITTER_ACTION_POWER_ON);
2389 }
2390
2391
2392 atombios_set_encoder_crtc_source(encoder);
2393}
2394
2395static void radeon_atom_encoder_commit(struct drm_encoder *encoder)
2396{
2397
2398 radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_ON);
2399 radeon_atom_output_lock(encoder, false);
2400}
2401
2402static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
2403{
2404 struct drm_device *dev = encoder->dev;
2405 struct radeon_device *rdev = dev->dev_private;
2406 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2407 struct radeon_encoder_atom_dig *dig;
2408
2409
2410
2411
2412
2413 if (!ASIC_IS_DCE3(rdev)) {
2414 struct drm_encoder *other_encoder;
2415 struct radeon_encoder *other_radeon_encoder;
2416
2417 list_for_each_entry(other_encoder, &dev->mode_config.encoder_list, head) {
2418 other_radeon_encoder = to_radeon_encoder(other_encoder);
2419 if ((radeon_encoder->encoder_id == other_radeon_encoder->encoder_id) &&
2420 drm_helper_encoder_in_use(other_encoder))
2421 goto disable_done;
2422 }
2423 }
2424
2425 radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
2426
2427 switch (radeon_encoder->encoder_id) {
2428 case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
2429 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
2430 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
2431 case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
2432 atombios_digital_setup(encoder, PANEL_ENCODER_ACTION_DISABLE);
2433 break;
2434 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
2435 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
2436 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
2437 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
2438 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
2439
2440 break;
2441 case ENCODER_OBJECT_ID_INTERNAL_DDI:
2442 case ENCODER_OBJECT_ID_INTERNAL_DVO1:
2443 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
2444 atombios_dvo_setup(encoder, ATOM_DISABLE);
2445 break;
2446 case ENCODER_OBJECT_ID_INTERNAL_DAC1:
2447 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
2448 case ENCODER_OBJECT_ID_INTERNAL_DAC2:
2449 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
2450 atombios_dac_setup(encoder, ATOM_DISABLE);
2451 if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))
2452 atombios_tv_setup(encoder, ATOM_DISABLE);
2453 break;
2454 }
2455
2456disable_done:
2457 if (radeon_encoder_is_digital(encoder)) {
2458 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
2459 if (rdev->asic->display.hdmi_enable)
2460 radeon_hdmi_enable(rdev, encoder, false);
2461 }
2462 dig = radeon_encoder->enc_priv;
2463 dig->dig_encoder = -1;
2464 }
2465 radeon_encoder->active_device = 0;
2466}
2467
2468
2469static void radeon_atom_ext_prepare(struct drm_encoder *encoder)
2470{
2471
2472}
2473
2474static void radeon_atom_ext_commit(struct drm_encoder *encoder)
2475{
2476
2477}
2478
2479static void
2480radeon_atom_ext_mode_set(struct drm_encoder *encoder,
2481 struct drm_display_mode *mode,
2482 struct drm_display_mode *adjusted_mode)
2483{
2484
2485}
2486
2487static void radeon_atom_ext_disable(struct drm_encoder *encoder)
2488{
2489
2490}
2491
2492static void
2493radeon_atom_ext_dpms(struct drm_encoder *encoder, int mode)
2494{
2495
2496}
2497
2498static bool radeon_atom_ext_mode_fixup(struct drm_encoder *encoder,
2499 const struct drm_display_mode *mode,
2500 struct drm_display_mode *adjusted_mode)
2501{
2502 return true;
2503}
2504
2505static const struct drm_encoder_helper_funcs radeon_atom_ext_helper_funcs = {
2506 .dpms = radeon_atom_ext_dpms,
2507 .mode_fixup = radeon_atom_ext_mode_fixup,
2508 .prepare = radeon_atom_ext_prepare,
2509 .mode_set = radeon_atom_ext_mode_set,
2510 .commit = radeon_atom_ext_commit,
2511 .disable = radeon_atom_ext_disable,
2512
2513};
2514
2515static const struct drm_encoder_helper_funcs radeon_atom_dig_helper_funcs = {
2516 .dpms = radeon_atom_encoder_dpms,
2517 .mode_fixup = radeon_atom_mode_fixup,
2518 .prepare = radeon_atom_encoder_prepare,
2519 .mode_set = radeon_atom_encoder_mode_set,
2520 .commit = radeon_atom_encoder_commit,
2521 .disable = radeon_atom_encoder_disable,
2522 .detect = radeon_atom_dig_detect,
2523};
2524
2525static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = {
2526 .dpms = radeon_atom_encoder_dpms,
2527 .mode_fixup = radeon_atom_mode_fixup,
2528 .prepare = radeon_atom_encoder_prepare,
2529 .mode_set = radeon_atom_encoder_mode_set,
2530 .commit = radeon_atom_encoder_commit,
2531 .detect = radeon_atom_dac_detect,
2532};
2533
2534void radeon_enc_destroy(struct drm_encoder *encoder)
2535{
2536 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2537 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
2538 radeon_atom_backlight_exit(radeon_encoder);
2539 kfree(radeon_encoder->enc_priv);
2540 drm_encoder_cleanup(encoder);
2541 kfree(radeon_encoder);
2542}
2543
2544static const struct drm_encoder_funcs radeon_atom_enc_funcs = {
2545 .destroy = radeon_enc_destroy,
2546};
2547
2548static struct radeon_encoder_atom_dac *
2549radeon_atombios_set_dac_info(struct radeon_encoder *radeon_encoder)
2550{
2551 struct drm_device *dev = radeon_encoder->base.dev;
2552 struct radeon_device *rdev = dev->dev_private;
2553 struct radeon_encoder_atom_dac *dac = kzalloc(sizeof(struct radeon_encoder_atom_dac), GFP_KERNEL);
2554
2555 if (!dac)
2556 return NULL;
2557
2558 dac->tv_std = radeon_atombios_get_tv_info(rdev);
2559 return dac;
2560}
2561
2562static struct radeon_encoder_atom_dig *
2563radeon_atombios_set_dig_info(struct radeon_encoder *radeon_encoder)
2564{
2565 int encoder_enum = (radeon_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
2566 struct radeon_encoder_atom_dig *dig = kzalloc(sizeof(struct radeon_encoder_atom_dig), GFP_KERNEL);
2567
2568 if (!dig)
2569 return NULL;
2570
2571
2572 dig->coherent_mode = true;
2573 dig->dig_encoder = -1;
2574
2575 if (encoder_enum == 2)
2576 dig->linkb = true;
2577 else
2578 dig->linkb = false;
2579
2580 return dig;
2581}
2582
2583void
2584radeon_add_atom_encoder(struct drm_device *dev,
2585 uint32_t encoder_enum,
2586 uint32_t supported_device,
2587 u16 caps)
2588{
2589 struct radeon_device *rdev = dev->dev_private;
2590 struct drm_encoder *encoder;
2591 struct radeon_encoder *radeon_encoder;
2592
2593
2594 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
2595 radeon_encoder = to_radeon_encoder(encoder);
2596 if (radeon_encoder->encoder_enum == encoder_enum) {
2597 radeon_encoder->devices |= supported_device;
2598 return;
2599 }
2600
2601 }
2602
2603
2604 radeon_encoder = kzalloc(sizeof(struct radeon_encoder), GFP_KERNEL);
2605 if (!radeon_encoder)
2606 return;
2607
2608 encoder = &radeon_encoder->base;
2609 switch (rdev->num_crtc) {
2610 case 1:
2611 encoder->possible_crtcs = 0x1;
2612 break;
2613 case 2:
2614 default:
2615 encoder->possible_crtcs = 0x3;
2616 break;
2617 case 4:
2618 encoder->possible_crtcs = 0xf;
2619 break;
2620 case 6:
2621 encoder->possible_crtcs = 0x3f;
2622 break;
2623 }
2624
2625 radeon_encoder->enc_priv = NULL;
2626
2627 radeon_encoder->encoder_enum = encoder_enum;
2628 radeon_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
2629 radeon_encoder->devices = supported_device;
2630 radeon_encoder->rmx_type = RMX_OFF;
2631 radeon_encoder->underscan_type = UNDERSCAN_OFF;
2632 radeon_encoder->is_ext_encoder = false;
2633 radeon_encoder->caps = caps;
2634
2635 switch (radeon_encoder->encoder_id) {
2636 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
2637 case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
2638 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
2639 case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
2640 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
2641 radeon_encoder->rmx_type = RMX_FULL;
2642 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_LVDS);
2643 radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder);
2644 } else {
2645 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS);
2646 radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder);
2647 }
2648 drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs);
2649 break;
2650 case ENCODER_OBJECT_ID_INTERNAL_DAC1:
2651 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_DAC);
2652 radeon_encoder->enc_priv = radeon_atombios_set_dac_info(radeon_encoder);
2653 drm_encoder_helper_add(encoder, &radeon_atom_dac_helper_funcs);
2654 break;
2655 case ENCODER_OBJECT_ID_INTERNAL_DAC2:
2656 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
2657 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
2658 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TVDAC);
2659 radeon_encoder->enc_priv = radeon_atombios_set_dac_info(radeon_encoder);
2660 drm_encoder_helper_add(encoder, &radeon_atom_dac_helper_funcs);
2661 break;
2662 case ENCODER_OBJECT_ID_INTERNAL_DVO1:
2663 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
2664 case ENCODER_OBJECT_ID_INTERNAL_DDI:
2665 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
2666 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
2667 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
2668 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
2669 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
2670 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
2671 radeon_encoder->rmx_type = RMX_FULL;
2672 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_LVDS);
2673 radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder);
2674 } else if (radeon_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT)) {
2675 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_DAC);
2676 radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder);
2677 } else {
2678 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS);
2679 radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder);
2680 }
2681 drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs);
2682 break;
2683 case ENCODER_OBJECT_ID_SI170B:
2684 case ENCODER_OBJECT_ID_CH7303:
2685 case ENCODER_OBJECT_ID_EXTERNAL_SDVOA:
2686 case ENCODER_OBJECT_ID_EXTERNAL_SDVOB:
2687 case ENCODER_OBJECT_ID_TITFP513:
2688 case ENCODER_OBJECT_ID_VT1623:
2689 case ENCODER_OBJECT_ID_HDMI_SI1930:
2690 case ENCODER_OBJECT_ID_TRAVIS:
2691 case ENCODER_OBJECT_ID_NUTMEG:
2692
2693 radeon_encoder->is_ext_encoder = true;
2694 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
2695 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_LVDS);
2696 else if (radeon_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT))
2697 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_DAC);
2698 else
2699 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS);
2700 drm_encoder_helper_add(encoder, &radeon_atom_ext_helper_funcs);
2701 break;
2702 }
2703}
2704