drm/radeon: fix eDP clk and lane setup for scaled modes
[pandora-kernel.git] / drivers / gpu / drm / radeon / atombios_encoders.c
1 /*
2  * Copyright 2007-11 Advanced Micro Devices, Inc.
3  * Copyright 2008 Red Hat Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  * OTHER DEALINGS IN THE SOFTWARE.
22  *
23  * Authors: Dave Airlie
24  *          Alex Deucher
25  */
26 #include "drmP.h"
27 #include "drm_crtc_helper.h"
28 #include "radeon_drm.h"
29 #include "radeon.h"
30 #include "atom.h"
31
32 extern int atom_debug;
33
34 /* evil but including atombios.h is much worse */
35 bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
36                                 struct drm_display_mode *mode);
37
38
39 static inline bool radeon_encoder_is_digital(struct drm_encoder *encoder)
40 {
41         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
42         switch (radeon_encoder->encoder_id) {
43         case ENCODER_OBJECT_ID_INTERNAL_LVDS:
44         case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
45         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
46         case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
47         case ENCODER_OBJECT_ID_INTERNAL_DVO1:
48         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
49         case ENCODER_OBJECT_ID_INTERNAL_DDI:
50         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
51         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
52         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
53         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
54                 return true;
55         default:
56                 return false;
57         }
58 }
59
60 static struct drm_connector *
61 radeon_get_connector_for_encoder_init(struct drm_encoder *encoder)
62 {
63         struct drm_device *dev = encoder->dev;
64         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
65         struct drm_connector *connector;
66         struct radeon_connector *radeon_connector;
67
68         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
69                 radeon_connector = to_radeon_connector(connector);
70                 if (radeon_encoder->devices & radeon_connector->devices)
71                         return connector;
72         }
73         return NULL;
74 }
75
76 static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
77                                    struct drm_display_mode *mode,
78                                    struct drm_display_mode *adjusted_mode)
79 {
80         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
81         struct drm_device *dev = encoder->dev;
82         struct radeon_device *rdev = dev->dev_private;
83
84         /* set the active encoder to connector routing */
85         radeon_encoder_set_active_device(encoder);
86         drm_mode_set_crtcinfo(adjusted_mode, 0);
87
88         /* hw bug */
89         if ((mode->flags & DRM_MODE_FLAG_INTERLACE)
90             && (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
91                 adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
92
93         /* get the native mode for LVDS */
94         if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT))
95                 radeon_panel_mode_fixup(encoder, adjusted_mode);
96
97         /* get the native mode for TV */
98         if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) {
99                 struct radeon_encoder_atom_dac *tv_dac = radeon_encoder->enc_priv;
100                 if (tv_dac) {
101                         if (tv_dac->tv_std == TV_STD_NTSC ||
102                             tv_dac->tv_std == TV_STD_NTSC_J ||
103                             tv_dac->tv_std == TV_STD_PAL_M)
104                                 radeon_atom_get_tv_timings(rdev, 0, adjusted_mode);
105                         else
106                                 radeon_atom_get_tv_timings(rdev, 1, adjusted_mode);
107                 }
108         }
109
110         if (ASIC_IS_DCE3(rdev) &&
111             ((radeon_encoder->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
112              (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE))) {
113                 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
114                 radeon_dp_set_link_config(connector, adjusted_mode);
115         }
116
117         return true;
118 }
119
120 static void
121 atombios_dac_setup(struct drm_encoder *encoder, int action)
122 {
123         struct drm_device *dev = encoder->dev;
124         struct radeon_device *rdev = dev->dev_private;
125         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
126         DAC_ENCODER_CONTROL_PS_ALLOCATION args;
127         int index = 0;
128         struct radeon_encoder_atom_dac *dac_info = radeon_encoder->enc_priv;
129
130         memset(&args, 0, sizeof(args));
131
132         switch (radeon_encoder->encoder_id) {
133         case ENCODER_OBJECT_ID_INTERNAL_DAC1:
134         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
135                 index = GetIndexIntoMasterTable(COMMAND, DAC1EncoderControl);
136                 break;
137         case ENCODER_OBJECT_ID_INTERNAL_DAC2:
138         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
139                 index = GetIndexIntoMasterTable(COMMAND, DAC2EncoderControl);
140                 break;
141         }
142
143         args.ucAction = action;
144
145         if (radeon_encoder->active_device & (ATOM_DEVICE_CRT_SUPPORT))
146                 args.ucDacStandard = ATOM_DAC1_PS2;
147         else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
148                 args.ucDacStandard = ATOM_DAC1_CV;
149         else {
150                 switch (dac_info->tv_std) {
151                 case TV_STD_PAL:
152                 case TV_STD_PAL_M:
153                 case TV_STD_SCART_PAL:
154                 case TV_STD_SECAM:
155                 case TV_STD_PAL_CN:
156                         args.ucDacStandard = ATOM_DAC1_PAL;
157                         break;
158                 case TV_STD_NTSC:
159                 case TV_STD_NTSC_J:
160                 case TV_STD_PAL_60:
161                 default:
162                         args.ucDacStandard = ATOM_DAC1_NTSC;
163                         break;
164                 }
165         }
166         args.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
167
168         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
169
170 }
171
172 static void
173 atombios_tv_setup(struct drm_encoder *encoder, int action)
174 {
175         struct drm_device *dev = encoder->dev;
176         struct radeon_device *rdev = dev->dev_private;
177         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
178         TV_ENCODER_CONTROL_PS_ALLOCATION args;
179         int index = 0;
180         struct radeon_encoder_atom_dac *dac_info = radeon_encoder->enc_priv;
181
182         memset(&args, 0, sizeof(args));
183
184         index = GetIndexIntoMasterTable(COMMAND, TVEncoderControl);
185
186         args.sTVEncoder.ucAction = action;
187
188         if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
189                 args.sTVEncoder.ucTvStandard = ATOM_TV_CV;
190         else {
191                 switch (dac_info->tv_std) {
192                 case TV_STD_NTSC:
193                         args.sTVEncoder.ucTvStandard = ATOM_TV_NTSC;
194                         break;
195                 case TV_STD_PAL:
196                         args.sTVEncoder.ucTvStandard = ATOM_TV_PAL;
197                         break;
198                 case TV_STD_PAL_M:
199                         args.sTVEncoder.ucTvStandard = ATOM_TV_PALM;
200                         break;
201                 case TV_STD_PAL_60:
202                         args.sTVEncoder.ucTvStandard = ATOM_TV_PAL60;
203                         break;
204                 case TV_STD_NTSC_J:
205                         args.sTVEncoder.ucTvStandard = ATOM_TV_NTSCJ;
206                         break;
207                 case TV_STD_SCART_PAL:
208                         args.sTVEncoder.ucTvStandard = ATOM_TV_PAL; /* ??? */
209                         break;
210                 case TV_STD_SECAM:
211                         args.sTVEncoder.ucTvStandard = ATOM_TV_SECAM;
212                         break;
213                 case TV_STD_PAL_CN:
214                         args.sTVEncoder.ucTvStandard = ATOM_TV_PALCN;
215                         break;
216                 default:
217                         args.sTVEncoder.ucTvStandard = ATOM_TV_NTSC;
218                         break;
219                 }
220         }
221
222         args.sTVEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
223
224         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
225
226 }
227
228 union dvo_encoder_control {
229         ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION ext_tmds;
230         DVO_ENCODER_CONTROL_PS_ALLOCATION dvo;
231         DVO_ENCODER_CONTROL_PS_ALLOCATION_V3 dvo_v3;
232 };
233
234 void
235 atombios_dvo_setup(struct drm_encoder *encoder, int action)
236 {
237         struct drm_device *dev = encoder->dev;
238         struct radeon_device *rdev = dev->dev_private;
239         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
240         union dvo_encoder_control args;
241         int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
242         uint8_t frev, crev;
243
244         memset(&args, 0, sizeof(args));
245
246         if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
247                 return;
248
249         /* some R4xx chips have the wrong frev */
250         if (rdev->family <= CHIP_RV410)
251                 frev = 1;
252
253         switch (frev) {
254         case 1:
255                 switch (crev) {
256                 case 1:
257                         /* R4xx, R5xx */
258                         args.ext_tmds.sXTmdsEncoder.ucEnable = action;
259
260                         if (radeon_encoder->pixel_clock > 165000)
261                                 args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL;
262
263                         args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB;
264                         break;
265                 case 2:
266                         /* RS600/690/740 */
267                         args.dvo.sDVOEncoder.ucAction = action;
268                         args.dvo.sDVOEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
269                         /* DFP1, CRT1, TV1 depending on the type of port */
270                         args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX;
271
272                         if (radeon_encoder->pixel_clock > 165000)
273                                 args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL;
274                         break;
275                 case 3:
276                         /* R6xx */
277                         args.dvo_v3.ucAction = action;
278                         args.dvo_v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
279                         args.dvo_v3.ucDVOConfig = 0; /* XXX */
280                         break;
281                 default:
282                         DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
283                         break;
284                 }
285                 break;
286         default:
287                 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
288                 break;
289         }
290
291         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
292 }
293
294 union lvds_encoder_control {
295         LVDS_ENCODER_CONTROL_PS_ALLOCATION    v1;
296         LVDS_ENCODER_CONTROL_PS_ALLOCATION_V2 v2;
297 };
298
299 void
300 atombios_digital_setup(struct drm_encoder *encoder, int action)
301 {
302         struct drm_device *dev = encoder->dev;
303         struct radeon_device *rdev = dev->dev_private;
304         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
305         struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
306         union lvds_encoder_control args;
307         int index = 0;
308         int hdmi_detected = 0;
309         uint8_t frev, crev;
310
311         if (!dig)
312                 return;
313
314         if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI)
315                 hdmi_detected = 1;
316
317         memset(&args, 0, sizeof(args));
318
319         switch (radeon_encoder->encoder_id) {
320         case ENCODER_OBJECT_ID_INTERNAL_LVDS:
321                 index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl);
322                 break;
323         case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
324         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
325                 index = GetIndexIntoMasterTable(COMMAND, TMDS1EncoderControl);
326                 break;
327         case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
328                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
329                         index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl);
330                 else
331                         index = GetIndexIntoMasterTable(COMMAND, TMDS2EncoderControl);
332                 break;
333         }
334
335         if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
336                 return;
337
338         switch (frev) {
339         case 1:
340         case 2:
341                 switch (crev) {
342                 case 1:
343                         args.v1.ucMisc = 0;
344                         args.v1.ucAction = action;
345                         if (hdmi_detected)
346                                 args.v1.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE;
347                         args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
348                         if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
349                                 if (dig->lcd_misc & ATOM_PANEL_MISC_DUAL)
350                                         args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL;
351                                 if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB)
352                                         args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB;
353                         } else {
354                                 if (dig->linkb)
355                                         args.v1.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB;
356                                 if (radeon_encoder->pixel_clock > 165000)
357                                         args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL;
358                                 /*if (pScrn->rgbBits == 8) */
359                                 args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB;
360                         }
361                         break;
362                 case 2:
363                 case 3:
364                         args.v2.ucMisc = 0;
365                         args.v2.ucAction = action;
366                         if (crev == 3) {
367                                 if (dig->coherent_mode)
368                                         args.v2.ucMisc |= PANEL_ENCODER_MISC_COHERENT;
369                         }
370                         if (hdmi_detected)
371                                 args.v2.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE;
372                         args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
373                         args.v2.ucTruncate = 0;
374                         args.v2.ucSpatial = 0;
375                         args.v2.ucTemporal = 0;
376                         args.v2.ucFRC = 0;
377                         if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
378                                 if (dig->lcd_misc & ATOM_PANEL_MISC_DUAL)
379                                         args.v2.ucMisc |= PANEL_ENCODER_MISC_DUAL;
380                                 if (dig->lcd_misc & ATOM_PANEL_MISC_SPATIAL) {
381                                         args.v2.ucSpatial = PANEL_ENCODER_SPATIAL_DITHER_EN;
382                                         if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB)
383                                                 args.v2.ucSpatial |= PANEL_ENCODER_SPATIAL_DITHER_DEPTH;
384                                 }
385                                 if (dig->lcd_misc & ATOM_PANEL_MISC_TEMPORAL) {
386                                         args.v2.ucTemporal = PANEL_ENCODER_TEMPORAL_DITHER_EN;
387                                         if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB)
388                                                 args.v2.ucTemporal |= PANEL_ENCODER_TEMPORAL_DITHER_DEPTH;
389                                         if (((dig->lcd_misc >> ATOM_PANEL_MISC_GREY_LEVEL_SHIFT) & 0x3) == 2)
390                                                 args.v2.ucTemporal |= PANEL_ENCODER_TEMPORAL_LEVEL_4;
391                                 }
392                         } else {
393                                 if (dig->linkb)
394                                         args.v2.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB;
395                                 if (radeon_encoder->pixel_clock > 165000)
396                                         args.v2.ucMisc |= PANEL_ENCODER_MISC_DUAL;
397                         }
398                         break;
399                 default:
400                         DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
401                         break;
402                 }
403                 break;
404         default:
405                 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
406                 break;
407         }
408
409         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
410 }
411
412 int
413 atombios_get_encoder_mode(struct drm_encoder *encoder)
414 {
415         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
416         struct drm_device *dev = encoder->dev;
417         struct radeon_device *rdev = dev->dev_private;
418         struct drm_connector *connector;
419         struct radeon_connector *radeon_connector;
420         struct radeon_connector_atom_dig *dig_connector;
421
422         /* dp bridges are always DP */
423         if (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE)
424                 return ATOM_ENCODER_MODE_DP;
425
426         /* DVO is always DVO */
427         if (radeon_encoder->encoder_id == ATOM_ENCODER_MODE_DVO)
428                 return ATOM_ENCODER_MODE_DVO;
429
430         connector = radeon_get_connector_for_encoder(encoder);
431         /* if we don't have an active device yet, just use one of
432          * the connectors tied to the encoder.
433          */
434         if (!connector)
435                 connector = radeon_get_connector_for_encoder_init(encoder);
436         radeon_connector = to_radeon_connector(connector);
437
438         switch (connector->connector_type) {
439         case DRM_MODE_CONNECTOR_DVII:
440         case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */
441                 if (drm_detect_monitor_audio(radeon_connector->edid) && radeon_audio) {
442                         /* fix me */
443                         if (ASIC_IS_DCE4(rdev))
444                                 return ATOM_ENCODER_MODE_DVI;
445                         else
446                                 return ATOM_ENCODER_MODE_HDMI;
447                 } else if (radeon_connector->use_digital)
448                         return ATOM_ENCODER_MODE_DVI;
449                 else
450                         return ATOM_ENCODER_MODE_CRT;
451                 break;
452         case DRM_MODE_CONNECTOR_DVID:
453         case DRM_MODE_CONNECTOR_HDMIA:
454         default:
455                 if (drm_detect_monitor_audio(radeon_connector->edid) && radeon_audio) {
456                         /* fix me */
457                         if (ASIC_IS_DCE4(rdev))
458                                 return ATOM_ENCODER_MODE_DVI;
459                         else
460                                 return ATOM_ENCODER_MODE_HDMI;
461                 } else
462                         return ATOM_ENCODER_MODE_DVI;
463                 break;
464         case DRM_MODE_CONNECTOR_LVDS:
465                 return ATOM_ENCODER_MODE_LVDS;
466                 break;
467         case DRM_MODE_CONNECTOR_DisplayPort:
468                 dig_connector = radeon_connector->con_priv;
469                 if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
470                     (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
471                         return ATOM_ENCODER_MODE_DP;
472                 else if (drm_detect_monitor_audio(radeon_connector->edid) && radeon_audio) {
473                         /* fix me */
474                         if (ASIC_IS_DCE4(rdev))
475                                 return ATOM_ENCODER_MODE_DVI;
476                         else
477                                 return ATOM_ENCODER_MODE_HDMI;
478                 } else
479                         return ATOM_ENCODER_MODE_DVI;
480                 break;
481         case DRM_MODE_CONNECTOR_eDP:
482                 return ATOM_ENCODER_MODE_DP;
483         case DRM_MODE_CONNECTOR_DVIA:
484         case DRM_MODE_CONNECTOR_VGA:
485                 return ATOM_ENCODER_MODE_CRT;
486                 break;
487         case DRM_MODE_CONNECTOR_Composite:
488         case DRM_MODE_CONNECTOR_SVIDEO:
489         case DRM_MODE_CONNECTOR_9PinDIN:
490                 /* fix me */
491                 return ATOM_ENCODER_MODE_TV;
492                 /*return ATOM_ENCODER_MODE_CV;*/
493                 break;
494         }
495 }
496
497 /*
498  * DIG Encoder/Transmitter Setup
499  *
500  * DCE 3.0/3.1
501  * - 2 DIG transmitter blocks. UNIPHY (links A and B) and LVTMA.
502  * Supports up to 3 digital outputs
503  * - 2 DIG encoder blocks.
504  * DIG1 can drive UNIPHY link A or link B
505  * DIG2 can drive UNIPHY link B or LVTMA
506  *
507  * DCE 3.2
508  * - 3 DIG transmitter blocks. UNIPHY0/1/2 (links A and B).
509  * Supports up to 5 digital outputs
510  * - 2 DIG encoder blocks.
511  * DIG1/2 can drive UNIPHY0/1/2 link A or link B
512  *
513  * DCE 4.0/5.0
514  * - 3 DIG transmitter blocks UNIPHY0/1/2 (links A and B).
515  * Supports up to 6 digital outputs
516  * - 6 DIG encoder blocks.
517  * - DIG to PHY mapping is hardcoded
518  * DIG1 drives UNIPHY0 link A, A+B
519  * DIG2 drives UNIPHY0 link B
520  * DIG3 drives UNIPHY1 link A, A+B
521  * DIG4 drives UNIPHY1 link B
522  * DIG5 drives UNIPHY2 link A, A+B
523  * DIG6 drives UNIPHY2 link B
524  *
525  * DCE 4.1
526  * - 3 DIG transmitter blocks UNIPHY0/1/2 (links A and B).
527  * Supports up to 6 digital outputs
528  * - 2 DIG encoder blocks.
529  * DIG1/2 can drive UNIPHY0/1/2 link A or link B
530  *
531  * Routing
532  * crtc -> dig encoder -> UNIPHY/LVTMA (1 or 2 links)
533  * Examples:
534  * crtc0 -> dig2 -> LVTMA   links A+B -> TMDS/HDMI
535  * crtc1 -> dig1 -> UNIPHY0 link  B   -> DP
536  * crtc0 -> dig1 -> UNIPHY2 link  A   -> LVDS
537  * crtc1 -> dig2 -> UNIPHY1 link  B+A -> TMDS/HDMI
538  */
539
540 union dig_encoder_control {
541         DIG_ENCODER_CONTROL_PS_ALLOCATION v1;
542         DIG_ENCODER_CONTROL_PARAMETERS_V2 v2;
543         DIG_ENCODER_CONTROL_PARAMETERS_V3 v3;
544         DIG_ENCODER_CONTROL_PARAMETERS_V4 v4;
545 };
546
547 void
548 atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode)
549 {
550         struct drm_device *dev = encoder->dev;
551         struct radeon_device *rdev = dev->dev_private;
552         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
553         struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
554         struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
555         union dig_encoder_control args;
556         int index = 0;
557         uint8_t frev, crev;
558         int dp_clock = 0;
559         int dp_lane_count = 0;
560         int hpd_id = RADEON_HPD_NONE;
561         int bpc = 8;
562
563         if (connector) {
564                 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
565                 struct radeon_connector_atom_dig *dig_connector =
566                         radeon_connector->con_priv;
567
568                 dp_clock = dig_connector->dp_clock;
569                 dp_lane_count = dig_connector->dp_lane_count;
570                 hpd_id = radeon_connector->hpd.hpd;
571                 bpc = connector->display_info.bpc;
572         }
573
574         /* no dig encoder assigned */
575         if (dig->dig_encoder == -1)
576                 return;
577
578         memset(&args, 0, sizeof(args));
579
580         if (ASIC_IS_DCE4(rdev))
581                 index = GetIndexIntoMasterTable(COMMAND, DIGxEncoderControl);
582         else {
583                 if (dig->dig_encoder)
584                         index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl);
585                 else
586                         index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl);
587         }
588
589         if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
590                 return;
591
592         switch (frev) {
593         case 1:
594                 switch (crev) {
595                 case 1:
596                         args.v1.ucAction = action;
597                         args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
598                         if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
599                                 args.v3.ucPanelMode = panel_mode;
600                         else
601                                 args.v1.ucEncoderMode = atombios_get_encoder_mode(encoder);
602
603                         if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode))
604                                 args.v1.ucLaneNum = dp_lane_count;
605                         else if (radeon_encoder->pixel_clock > 165000)
606                                 args.v1.ucLaneNum = 8;
607                         else
608                                 args.v1.ucLaneNum = 4;
609
610                         if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000))
611                                 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
612                         switch (radeon_encoder->encoder_id) {
613                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
614                                 args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1;
615                                 break;
616                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
617                         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
618                                 args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER2;
619                                 break;
620                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
621                                 args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER3;
622                                 break;
623                         }
624                         if (dig->linkb)
625                                 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKB;
626                         else
627                                 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKA;
628                         break;
629                 case 2:
630                 case 3:
631                         args.v3.ucAction = action;
632                         args.v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
633                         if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
634                                 args.v3.ucPanelMode = panel_mode;
635                         else
636                                 args.v3.ucEncoderMode = atombios_get_encoder_mode(encoder);
637
638                         if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode))
639                                 args.v3.ucLaneNum = dp_lane_count;
640                         else if (radeon_encoder->pixel_clock > 165000)
641                                 args.v3.ucLaneNum = 8;
642                         else
643                                 args.v3.ucLaneNum = 4;
644
645                         if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000))
646                                 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
647                         args.v3.acConfig.ucDigSel = dig->dig_encoder;
648                         switch (bpc) {
649                         case 0:
650                                 args.v3.ucBitPerColor = PANEL_BPC_UNDEFINE;
651                                 break;
652                         case 6:
653                                 args.v3.ucBitPerColor = PANEL_6BIT_PER_COLOR;
654                                 break;
655                         case 8:
656                         default:
657                                 args.v3.ucBitPerColor = PANEL_8BIT_PER_COLOR;
658                                 break;
659                         case 10:
660                                 args.v3.ucBitPerColor = PANEL_10BIT_PER_COLOR;
661                                 break;
662                         case 12:
663                                 args.v3.ucBitPerColor = PANEL_12BIT_PER_COLOR;
664                                 break;
665                         case 16:
666                                 args.v3.ucBitPerColor = PANEL_16BIT_PER_COLOR;
667                                 break;
668                         }
669                         break;
670                 case 4:
671                         args.v4.ucAction = action;
672                         args.v4.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
673                         if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
674                                 args.v4.ucPanelMode = panel_mode;
675                         else
676                                 args.v4.ucEncoderMode = atombios_get_encoder_mode(encoder);
677
678                         if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode))
679                                 args.v4.ucLaneNum = dp_lane_count;
680                         else if (radeon_encoder->pixel_clock > 165000)
681                                 args.v4.ucLaneNum = 8;
682                         else
683                                 args.v4.ucLaneNum = 4;
684
685                         if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode)) {
686                                 if (dp_clock == 270000)
687                                         args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_2_70GHZ;
688                                 else if (dp_clock == 540000)
689                                         args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_5_40GHZ;
690                         }
691                         args.v4.acConfig.ucDigSel = dig->dig_encoder;
692                         switch (bpc) {
693                         case 0:
694                                 args.v4.ucBitPerColor = PANEL_BPC_UNDEFINE;
695                                 break;
696                         case 6:
697                                 args.v4.ucBitPerColor = PANEL_6BIT_PER_COLOR;
698                                 break;
699                         case 8:
700                         default:
701                                 args.v4.ucBitPerColor = PANEL_8BIT_PER_COLOR;
702                                 break;
703                         case 10:
704                                 args.v4.ucBitPerColor = PANEL_10BIT_PER_COLOR;
705                                 break;
706                         case 12:
707                                 args.v4.ucBitPerColor = PANEL_12BIT_PER_COLOR;
708                                 break;
709                         case 16:
710                                 args.v4.ucBitPerColor = PANEL_16BIT_PER_COLOR;
711                                 break;
712                         }
713                         if (hpd_id == RADEON_HPD_NONE)
714                                 args.v4.ucHPD_ID = 0;
715                         else
716                                 args.v4.ucHPD_ID = hpd_id + 1;
717                         break;
718                 default:
719                         DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
720                         break;
721                 }
722                 break;
723         default:
724                 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
725                 break;
726         }
727
728         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
729
730 }
731
732 union dig_transmitter_control {
733         DIG_TRANSMITTER_CONTROL_PS_ALLOCATION v1;
734         DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2;
735         DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3;
736         DIG_TRANSMITTER_CONTROL_PARAMETERS_V4 v4;
737 };
738
739 void
740 atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t lane_num, uint8_t lane_set)
741 {
742         struct drm_device *dev = encoder->dev;
743         struct radeon_device *rdev = dev->dev_private;
744         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
745         struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
746         struct drm_connector *connector;
747         union dig_transmitter_control args;
748         int index = 0;
749         uint8_t frev, crev;
750         bool is_dp = false;
751         int pll_id = 0;
752         int dp_clock = 0;
753         int dp_lane_count = 0;
754         int connector_object_id = 0;
755         int igp_lane_info = 0;
756         int dig_encoder = dig->dig_encoder;
757
758         if (action == ATOM_TRANSMITTER_ACTION_INIT) {
759                 connector = radeon_get_connector_for_encoder_init(encoder);
760                 /* just needed to avoid bailing in the encoder check.  the encoder
761                  * isn't used for init
762                  */
763                 dig_encoder = 0;
764         } else
765                 connector = radeon_get_connector_for_encoder(encoder);
766
767         if (connector) {
768                 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
769                 struct radeon_connector_atom_dig *dig_connector =
770                         radeon_connector->con_priv;
771
772                 dp_clock = dig_connector->dp_clock;
773                 dp_lane_count = dig_connector->dp_lane_count;
774                 connector_object_id =
775                         (radeon_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
776                 igp_lane_info = dig_connector->igp_lane_info;
777         }
778
779         if (encoder->crtc) {
780                 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
781                 pll_id = radeon_crtc->pll_id;
782         }
783
784         /* no dig encoder assigned */
785         if (dig_encoder == -1)
786                 return;
787
788         if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)))
789                 is_dp = true;
790
791         memset(&args, 0, sizeof(args));
792
793         switch (radeon_encoder->encoder_id) {
794         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
795                 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl);
796                 break;
797         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
798         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
799         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
800                 index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl);
801                 break;
802         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
803                 index = GetIndexIntoMasterTable(COMMAND, LVTMATransmitterControl);
804                 break;
805         }
806
807         if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
808                 return;
809
810         switch (frev) {
811         case 1:
812                 switch (crev) {
813                 case 1:
814                         args.v1.ucAction = action;
815                         if (action == ATOM_TRANSMITTER_ACTION_INIT) {
816                                 args.v1.usInitInfo = cpu_to_le16(connector_object_id);
817                         } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
818                                 args.v1.asMode.ucLaneSel = lane_num;
819                                 args.v1.asMode.ucLaneSet = lane_set;
820                         } else {
821                                 if (is_dp)
822                                         args.v1.usPixelClock =
823                                                 cpu_to_le16(dp_clock / 10);
824                                 else if (radeon_encoder->pixel_clock > 165000)
825                                         args.v1.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
826                                 else
827                                         args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
828                         }
829
830                         args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL;
831
832                         if (dig_encoder)
833                                 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER;
834                         else
835                                 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER;
836
837                         if ((rdev->flags & RADEON_IS_IGP) &&
838                             (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_UNIPHY)) {
839                                 if (is_dp || (radeon_encoder->pixel_clock <= 165000)) {
840                                         if (igp_lane_info & 0x1)
841                                                 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_3;
842                                         else if (igp_lane_info & 0x2)
843                                                 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_4_7;
844                                         else if (igp_lane_info & 0x4)
845                                                 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_8_11;
846                                         else if (igp_lane_info & 0x8)
847                                                 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_12_15;
848                                 } else {
849                                         if (igp_lane_info & 0x3)
850                                                 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_7;
851                                         else if (igp_lane_info & 0xc)
852                                                 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_8_15;
853                                 }
854                         }
855
856                         if (dig->linkb)
857                                 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKB;
858                         else
859                                 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKA;
860
861                         if (is_dp)
862                                 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;
863                         else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
864                                 if (dig->coherent_mode)
865                                         args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;
866                                 if (radeon_encoder->pixel_clock > 165000)
867                                         args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_8LANE_LINK;
868                         }
869                         break;
870                 case 2:
871                         args.v2.ucAction = action;
872                         if (action == ATOM_TRANSMITTER_ACTION_INIT) {
873                                 args.v2.usInitInfo = cpu_to_le16(connector_object_id);
874                         } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
875                                 args.v2.asMode.ucLaneSel = lane_num;
876                                 args.v2.asMode.ucLaneSet = lane_set;
877                         } else {
878                                 if (is_dp)
879                                         args.v2.usPixelClock =
880                                                 cpu_to_le16(dp_clock / 10);
881                                 else if (radeon_encoder->pixel_clock > 165000)
882                                         args.v2.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
883                                 else
884                                         args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
885                         }
886
887                         args.v2.acConfig.ucEncoderSel = dig_encoder;
888                         if (dig->linkb)
889                                 args.v2.acConfig.ucLinkSel = 1;
890
891                         switch (radeon_encoder->encoder_id) {
892                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
893                                 args.v2.acConfig.ucTransmitterSel = 0;
894                                 break;
895                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
896                                 args.v2.acConfig.ucTransmitterSel = 1;
897                                 break;
898                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
899                                 args.v2.acConfig.ucTransmitterSel = 2;
900                                 break;
901                         }
902
903                         if (is_dp) {
904                                 args.v2.acConfig.fCoherentMode = 1;
905                                 args.v2.acConfig.fDPConnector = 1;
906                         } else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
907                                 if (dig->coherent_mode)
908                                         args.v2.acConfig.fCoherentMode = 1;
909                                 if (radeon_encoder->pixel_clock > 165000)
910                                         args.v2.acConfig.fDualLinkConnector = 1;
911                         }
912                         break;
913                 case 3:
914                         args.v3.ucAction = action;
915                         if (action == ATOM_TRANSMITTER_ACTION_INIT) {
916                                 args.v3.usInitInfo = cpu_to_le16(connector_object_id);
917                         } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
918                                 args.v3.asMode.ucLaneSel = lane_num;
919                                 args.v3.asMode.ucLaneSet = lane_set;
920                         } else {
921                                 if (is_dp)
922                                         args.v3.usPixelClock =
923                                                 cpu_to_le16(dp_clock / 10);
924                                 else if (radeon_encoder->pixel_clock > 165000)
925                                         args.v3.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
926                                 else
927                                         args.v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
928                         }
929
930                         if (is_dp)
931                                 args.v3.ucLaneNum = dp_lane_count;
932                         else if (radeon_encoder->pixel_clock > 165000)
933                                 args.v3.ucLaneNum = 8;
934                         else
935                                 args.v3.ucLaneNum = 4;
936
937                         if (dig->linkb)
938                                 args.v3.acConfig.ucLinkSel = 1;
939                         if (dig_encoder & 1)
940                                 args.v3.acConfig.ucEncoderSel = 1;
941
942                         /* Select the PLL for the PHY
943                          * DP PHY should be clocked from external src if there is
944                          * one.
945                          */
946                         /* On DCE4, if there is an external clock, it generates the DP ref clock */
947                         if (is_dp && rdev->clock.dp_extclk)
948                                 args.v3.acConfig.ucRefClkSource = 2; /* external src */
949                         else
950                                 args.v3.acConfig.ucRefClkSource = pll_id;
951
952                         switch (radeon_encoder->encoder_id) {
953                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
954                                 args.v3.acConfig.ucTransmitterSel = 0;
955                                 break;
956                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
957                                 args.v3.acConfig.ucTransmitterSel = 1;
958                                 break;
959                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
960                                 args.v3.acConfig.ucTransmitterSel = 2;
961                                 break;
962                         }
963
964                         if (is_dp)
965                                 args.v3.acConfig.fCoherentMode = 1; /* DP requires coherent */
966                         else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
967                                 if (dig->coherent_mode)
968                                         args.v3.acConfig.fCoherentMode = 1;
969                                 if (radeon_encoder->pixel_clock > 165000)
970                                         args.v3.acConfig.fDualLinkConnector = 1;
971                         }
972                         break;
973                 case 4:
974                         args.v4.ucAction = action;
975                         if (action == ATOM_TRANSMITTER_ACTION_INIT) {
976                                 args.v4.usInitInfo = cpu_to_le16(connector_object_id);
977                         } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
978                                 args.v4.asMode.ucLaneSel = lane_num;
979                                 args.v4.asMode.ucLaneSet = lane_set;
980                         } else {
981                                 if (is_dp)
982                                         args.v4.usPixelClock =
983                                                 cpu_to_le16(dp_clock / 10);
984                                 else if (radeon_encoder->pixel_clock > 165000)
985                                         args.v4.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10);
986                                 else
987                                         args.v4.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
988                         }
989
990                         if (is_dp)
991                                 args.v4.ucLaneNum = dp_lane_count;
992                         else if (radeon_encoder->pixel_clock > 165000)
993                                 args.v4.ucLaneNum = 8;
994                         else
995                                 args.v4.ucLaneNum = 4;
996
997                         if (dig->linkb)
998                                 args.v4.acConfig.ucLinkSel = 1;
999                         if (dig_encoder & 1)
1000                                 args.v4.acConfig.ucEncoderSel = 1;
1001
1002                         /* Select the PLL for the PHY
1003                          * DP PHY should be clocked from external src if there is
1004                          * one.
1005                          */
1006                         /* On DCE5 DCPLL usually generates the DP ref clock */
1007                         if (is_dp) {
1008                                 if (rdev->clock.dp_extclk)
1009                                         args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_EXTCLK;
1010                                 else
1011                                         args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_DCPLL;
1012                         } else
1013                                 args.v4.acConfig.ucRefClkSource = pll_id;
1014
1015                         switch (radeon_encoder->encoder_id) {
1016                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1017                                 args.v4.acConfig.ucTransmitterSel = 0;
1018                                 break;
1019                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1020                                 args.v4.acConfig.ucTransmitterSel = 1;
1021                                 break;
1022                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1023                                 args.v4.acConfig.ucTransmitterSel = 2;
1024                                 break;
1025                         }
1026
1027                         if (is_dp)
1028                                 args.v4.acConfig.fCoherentMode = 1; /* DP requires coherent */
1029                         else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
1030                                 if (dig->coherent_mode)
1031                                         args.v4.acConfig.fCoherentMode = 1;
1032                                 if (radeon_encoder->pixel_clock > 165000)
1033                                         args.v4.acConfig.fDualLinkConnector = 1;
1034                         }
1035                         break;
1036                 default:
1037                         DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
1038                         break;
1039                 }
1040                 break;
1041         default:
1042                 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
1043                 break;
1044         }
1045
1046         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1047 }
1048
1049 bool
1050 atombios_set_edp_panel_power(struct drm_connector *connector, int action)
1051 {
1052         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1053         struct drm_device *dev = radeon_connector->base.dev;
1054         struct radeon_device *rdev = dev->dev_private;
1055         union dig_transmitter_control args;
1056         int index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl);
1057         uint8_t frev, crev;
1058
1059         if (connector->connector_type != DRM_MODE_CONNECTOR_eDP)
1060                 goto done;
1061
1062         if (!ASIC_IS_DCE4(rdev))
1063                 goto done;
1064
1065         if ((action != ATOM_TRANSMITTER_ACTION_POWER_ON) &&
1066             (action != ATOM_TRANSMITTER_ACTION_POWER_OFF))
1067                 goto done;
1068
1069         if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
1070                 goto done;
1071
1072         memset(&args, 0, sizeof(args));
1073
1074         args.v1.ucAction = action;
1075
1076         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1077
1078         /* wait for the panel to power up */
1079         if (action == ATOM_TRANSMITTER_ACTION_POWER_ON) {
1080                 int i;
1081
1082                 for (i = 0; i < 300; i++) {
1083                         if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))
1084                                 return true;
1085                         mdelay(1);
1086                 }
1087                 return false;
1088         }
1089 done:
1090         return true;
1091 }
1092
1093 union external_encoder_control {
1094         EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION v1;
1095         EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION_V3 v3;
1096 };
1097
1098 static void
1099 atombios_external_encoder_setup(struct drm_encoder *encoder,
1100                                 struct drm_encoder *ext_encoder,
1101                                 int action)
1102 {
1103         struct drm_device *dev = encoder->dev;
1104         struct radeon_device *rdev = dev->dev_private;
1105         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1106         struct radeon_encoder *ext_radeon_encoder = to_radeon_encoder(ext_encoder);
1107         union external_encoder_control args;
1108         struct drm_connector *connector;
1109         int index = GetIndexIntoMasterTable(COMMAND, ExternalEncoderControl);
1110         u8 frev, crev;
1111         int dp_clock = 0;
1112         int dp_lane_count = 0;
1113         int connector_object_id = 0;
1114         u32 ext_enum = (ext_radeon_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1115         int bpc = 8;
1116
1117         if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
1118                 connector = radeon_get_connector_for_encoder_init(encoder);
1119         else
1120                 connector = radeon_get_connector_for_encoder(encoder);
1121
1122         if (connector) {
1123                 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1124                 struct radeon_connector_atom_dig *dig_connector =
1125                         radeon_connector->con_priv;
1126
1127                 dp_clock = dig_connector->dp_clock;
1128                 dp_lane_count = dig_connector->dp_lane_count;
1129                 connector_object_id =
1130                         (radeon_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
1131                 bpc = connector->display_info.bpc;
1132         }
1133
1134         memset(&args, 0, sizeof(args));
1135
1136         if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
1137                 return;
1138
1139         switch (frev) {
1140         case 1:
1141                 /* no params on frev 1 */
1142                 break;
1143         case 2:
1144                 switch (crev) {
1145                 case 1:
1146                 case 2:
1147                         args.v1.sDigEncoder.ucAction = action;
1148                         args.v1.sDigEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
1149                         args.v1.sDigEncoder.ucEncoderMode = atombios_get_encoder_mode(encoder);
1150
1151                         if (ENCODER_MODE_IS_DP(args.v1.sDigEncoder.ucEncoderMode)) {
1152                                 if (dp_clock == 270000)
1153                                         args.v1.sDigEncoder.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
1154                                 args.v1.sDigEncoder.ucLaneNum = dp_lane_count;
1155                         } else if (radeon_encoder->pixel_clock > 165000)
1156                                 args.v1.sDigEncoder.ucLaneNum = 8;
1157                         else
1158                                 args.v1.sDigEncoder.ucLaneNum = 4;
1159                         break;
1160                 case 3:
1161                         args.v3.sExtEncoder.ucAction = action;
1162                         if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
1163                                 args.v3.sExtEncoder.usConnectorId = cpu_to_le16(connector_object_id);
1164                         else
1165                                 args.v3.sExtEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
1166                         args.v3.sExtEncoder.ucEncoderMode = atombios_get_encoder_mode(encoder);
1167
1168                         if (ENCODER_MODE_IS_DP(args.v3.sExtEncoder.ucEncoderMode)) {
1169                                 if (dp_clock == 270000)
1170                                         args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
1171                                 else if (dp_clock == 540000)
1172                                         args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_5_40GHZ;
1173                                 args.v3.sExtEncoder.ucLaneNum = dp_lane_count;
1174                         } else if (radeon_encoder->pixel_clock > 165000)
1175                                 args.v3.sExtEncoder.ucLaneNum = 8;
1176                         else
1177                                 args.v3.sExtEncoder.ucLaneNum = 4;
1178                         switch (ext_enum) {
1179                         case GRAPH_OBJECT_ENUM_ID1:
1180                                 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER1;
1181                                 break;
1182                         case GRAPH_OBJECT_ENUM_ID2:
1183                                 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER2;
1184                                 break;
1185                         case GRAPH_OBJECT_ENUM_ID3:
1186                                 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER3;
1187                                 break;
1188                         }
1189                         switch (bpc) {
1190                         case 0:
1191                                 args.v3.sExtEncoder.ucBitPerColor = PANEL_BPC_UNDEFINE;
1192                                 break;
1193                         case 6:
1194                                 args.v3.sExtEncoder.ucBitPerColor = PANEL_6BIT_PER_COLOR;
1195                                 break;
1196                         case 8:
1197                         default:
1198                                 args.v3.sExtEncoder.ucBitPerColor = PANEL_8BIT_PER_COLOR;
1199                                 break;
1200                         case 10:
1201                                 args.v3.sExtEncoder.ucBitPerColor = PANEL_10BIT_PER_COLOR;
1202                                 break;
1203                         case 12:
1204                                 args.v3.sExtEncoder.ucBitPerColor = PANEL_12BIT_PER_COLOR;
1205                                 break;
1206                         case 16:
1207                                 args.v3.sExtEncoder.ucBitPerColor = PANEL_16BIT_PER_COLOR;
1208                                 break;
1209                         }
1210                         break;
1211                 default:
1212                         DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1213                         return;
1214                 }
1215                 break;
1216         default:
1217                 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1218                 return;
1219         }
1220         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1221 }
1222
1223 static void
1224 atombios_yuv_setup(struct drm_encoder *encoder, bool enable)
1225 {
1226         struct drm_device *dev = encoder->dev;
1227         struct radeon_device *rdev = dev->dev_private;
1228         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1229         struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1230         ENABLE_YUV_PS_ALLOCATION args;
1231         int index = GetIndexIntoMasterTable(COMMAND, EnableYUV);
1232         uint32_t temp, reg;
1233
1234         memset(&args, 0, sizeof(args));
1235
1236         if (rdev->family >= CHIP_R600)
1237                 reg = R600_BIOS_3_SCRATCH;
1238         else
1239                 reg = RADEON_BIOS_3_SCRATCH;
1240
1241         /* XXX: fix up scratch reg handling */
1242         temp = RREG32(reg);
1243         if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1244                 WREG32(reg, (ATOM_S3_TV1_ACTIVE |
1245                              (radeon_crtc->crtc_id << 18)));
1246         else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1247                 WREG32(reg, (ATOM_S3_CV_ACTIVE | (radeon_crtc->crtc_id << 24)));
1248         else
1249                 WREG32(reg, 0);
1250
1251         if (enable)
1252                 args.ucEnable = ATOM_ENABLE;
1253         args.ucCRTC = radeon_crtc->crtc_id;
1254
1255         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1256
1257         WREG32(reg, temp);
1258 }
1259
1260 static void
1261 radeon_atom_encoder_dpms_avivo(struct drm_encoder *encoder, int mode)
1262 {
1263         struct drm_device *dev = encoder->dev;
1264         struct radeon_device *rdev = dev->dev_private;
1265         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1266         DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args;
1267         int index = 0;
1268
1269         memset(&args, 0, sizeof(args));
1270
1271         switch (radeon_encoder->encoder_id) {
1272         case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
1273         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
1274                 index = GetIndexIntoMasterTable(COMMAND, TMDSAOutputControl);
1275                 break;
1276         case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1277         case ENCODER_OBJECT_ID_INTERNAL_DDI:
1278         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1279                 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl);
1280                 break;
1281         case ENCODER_OBJECT_ID_INTERNAL_LVDS:
1282                 index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl);
1283                 break;
1284         case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
1285                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1286                         index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl);
1287                 else
1288                         index = GetIndexIntoMasterTable(COMMAND, LVTMAOutputControl);
1289                 break;
1290         case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1291         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1292                 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1293                         index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
1294                 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1295                         index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
1296                 else
1297                         index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl);
1298                 break;
1299         case ENCODER_OBJECT_ID_INTERNAL_DAC2:
1300         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1301                 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1302                         index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
1303                 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1304                         index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
1305                 else
1306                         index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl);
1307                 break;
1308         default:
1309                 return;
1310         }
1311
1312         switch (mode) {
1313         case DRM_MODE_DPMS_ON:
1314                 args.ucAction = ATOM_ENABLE;
1315                 /* workaround for DVOOutputControl on some RS690 systems */
1316                 if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DDI) {
1317                         u32 reg = RREG32(RADEON_BIOS_3_SCRATCH);
1318                         WREG32(RADEON_BIOS_3_SCRATCH, reg & ~ATOM_S3_DFP2I_ACTIVE);
1319                         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1320                         WREG32(RADEON_BIOS_3_SCRATCH, reg);
1321                 } else
1322                         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1323                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1324                         args.ucAction = ATOM_LCD_BLON;
1325                         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1326                 }
1327                 break;
1328         case DRM_MODE_DPMS_STANDBY:
1329         case DRM_MODE_DPMS_SUSPEND:
1330         case DRM_MODE_DPMS_OFF:
1331                 args.ucAction = ATOM_DISABLE;
1332                 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1333                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1334                         args.ucAction = ATOM_LCD_BLOFF;
1335                         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1336                 }
1337                 break;
1338         }
1339 }
1340
1341 static void
1342 radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode)
1343 {
1344         struct drm_device *dev = encoder->dev;
1345         struct radeon_device *rdev = dev->dev_private;
1346         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1347         struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder);
1348         struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
1349         struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
1350         struct radeon_connector *radeon_connector = NULL;
1351         struct radeon_connector_atom_dig *radeon_dig_connector = NULL;
1352
1353         if (connector) {
1354                 radeon_connector = to_radeon_connector(connector);
1355                 radeon_dig_connector = radeon_connector->con_priv;
1356         }
1357
1358         switch (mode) {
1359         case DRM_MODE_DPMS_ON:
1360                 if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
1361                         if (!connector)
1362                                 dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
1363                         else
1364                                 dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector);
1365
1366                         /* setup and enable the encoder */
1367                         atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0);
1368                         atombios_dig_encoder_setup(encoder,
1369                                                    ATOM_ENCODER_CMD_SETUP_PANEL_MODE,
1370                                                    dig->panel_mode);
1371                         if (ext_encoder) {
1372                                 if (ASIC_IS_DCE41(rdev))
1373                                         atombios_external_encoder_setup(encoder, ext_encoder,
1374                                                                         EXTERNAL_ENCODER_ACTION_V3_ENCODER_SETUP);
1375                         }
1376                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
1377                 } else if (ASIC_IS_DCE4(rdev)) {
1378                         /* setup and enable the encoder */
1379                         atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0);
1380                         /* enable the transmitter */
1381                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
1382                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0);
1383                 } else {
1384                         /* setup and enable the encoder and transmitter */
1385                         atombios_dig_encoder_setup(encoder, ATOM_ENABLE, 0);
1386                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0);
1387                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
1388                         /* some early dce3.2 boards have a bug in their transmitter control table */
1389                         if ((rdev->family != CHIP_RV710) && (rdev->family != CHIP_RV730))
1390                                 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0);
1391                 }
1392                 if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) {
1393                         if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1394                                 atombios_set_edp_panel_power(connector,
1395                                                              ATOM_TRANSMITTER_ACTION_POWER_ON);
1396                                 radeon_dig_connector->edp_on = true;
1397                         }
1398                         radeon_dp_link_train(encoder, connector);
1399                         if (ASIC_IS_DCE4(rdev))
1400                                 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0);
1401                 }
1402                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1403                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0);
1404                 break;
1405         case DRM_MODE_DPMS_STANDBY:
1406         case DRM_MODE_DPMS_SUSPEND:
1407         case DRM_MODE_DPMS_OFF:
1408                 if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
1409                         /* disable the transmitter */
1410                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
1411                 } else if (ASIC_IS_DCE4(rdev)) {
1412                         /* disable the transmitter */
1413                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0);
1414                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
1415                 } else {
1416                         /* disable the encoder and transmitter */
1417                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0);
1418                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
1419                         atombios_dig_encoder_setup(encoder, ATOM_DISABLE, 0);
1420                 }
1421                 if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) {
1422                         if (ASIC_IS_DCE4(rdev))
1423                                 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0);
1424                         if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1425                                 atombios_set_edp_panel_power(connector,
1426                                                              ATOM_TRANSMITTER_ACTION_POWER_OFF);
1427                                 radeon_dig_connector->edp_on = false;
1428                         }
1429                 }
1430                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1431                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0);
1432                 break;
1433         }
1434 }
1435
1436 static void
1437 radeon_atom_encoder_dpms_ext(struct drm_encoder *encoder,
1438                              struct drm_encoder *ext_encoder,
1439                              int mode)
1440 {
1441         struct drm_device *dev = encoder->dev;
1442         struct radeon_device *rdev = dev->dev_private;
1443
1444         switch (mode) {
1445         case DRM_MODE_DPMS_ON:
1446         default:
1447                 if (ASIC_IS_DCE41(rdev)) {
1448                         atombios_external_encoder_setup(encoder, ext_encoder,
1449                                                         EXTERNAL_ENCODER_ACTION_V3_ENABLE_OUTPUT);
1450                         atombios_external_encoder_setup(encoder, ext_encoder,
1451                                                         EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING_OFF);
1452                 } else
1453                         atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE);
1454                 break;
1455         case DRM_MODE_DPMS_STANDBY:
1456         case DRM_MODE_DPMS_SUSPEND:
1457         case DRM_MODE_DPMS_OFF:
1458                 if (ASIC_IS_DCE41(rdev)) {
1459                         atombios_external_encoder_setup(encoder, ext_encoder,
1460                                                         EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING);
1461                         atombios_external_encoder_setup(encoder, ext_encoder,
1462                                                         EXTERNAL_ENCODER_ACTION_V3_DISABLE_OUTPUT);
1463                 } else
1464                         atombios_external_encoder_setup(encoder, ext_encoder, ATOM_DISABLE);
1465                 break;
1466         }
1467 }
1468
1469 static void
1470 radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)
1471 {
1472         struct drm_device *dev = encoder->dev;
1473         struct radeon_device *rdev = dev->dev_private;
1474         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1475         struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder);
1476
1477         DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n",
1478                   radeon_encoder->encoder_id, mode, radeon_encoder->devices,
1479                   radeon_encoder->active_device);
1480         switch (radeon_encoder->encoder_id) {
1481         case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
1482         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
1483         case ENCODER_OBJECT_ID_INTERNAL_LVDS:
1484         case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
1485         case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1486         case ENCODER_OBJECT_ID_INTERNAL_DDI:
1487         case ENCODER_OBJECT_ID_INTERNAL_DAC2:
1488         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1489                 radeon_atom_encoder_dpms_avivo(encoder, mode);
1490                 break;
1491         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1492         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1493         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1494         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1495                 radeon_atom_encoder_dpms_dig(encoder, mode);
1496                 break;
1497         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1498                 if (ASIC_IS_DCE5(rdev)) {
1499                         switch (mode) {
1500                         case DRM_MODE_DPMS_ON:
1501                                 atombios_dvo_setup(encoder, ATOM_ENABLE);
1502                                 break;
1503                         case DRM_MODE_DPMS_STANDBY:
1504                         case DRM_MODE_DPMS_SUSPEND:
1505                         case DRM_MODE_DPMS_OFF:
1506                                 atombios_dvo_setup(encoder, ATOM_DISABLE);
1507                                 break;
1508                         }
1509                 } else if (ASIC_IS_DCE3(rdev))
1510                         radeon_atom_encoder_dpms_dig(encoder, mode);
1511                 else
1512                         radeon_atom_encoder_dpms_avivo(encoder, mode);
1513                 break;
1514         case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1515         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1516                 if (ASIC_IS_DCE5(rdev)) {
1517                         switch (mode) {
1518                         case DRM_MODE_DPMS_ON:
1519                                 atombios_dac_setup(encoder, ATOM_ENABLE);
1520                                 break;
1521                         case DRM_MODE_DPMS_STANDBY:
1522                         case DRM_MODE_DPMS_SUSPEND:
1523                         case DRM_MODE_DPMS_OFF:
1524                                 atombios_dac_setup(encoder, ATOM_DISABLE);
1525                                 break;
1526                         }
1527                 } else
1528                         radeon_atom_encoder_dpms_avivo(encoder, mode);
1529                 break;
1530         default:
1531                 return;
1532         }
1533
1534         if (ext_encoder)
1535                 radeon_atom_encoder_dpms_ext(encoder, ext_encoder, mode);
1536
1537         radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
1538
1539 }
1540
1541 union crtc_source_param {
1542         SELECT_CRTC_SOURCE_PS_ALLOCATION v1;
1543         SELECT_CRTC_SOURCE_PARAMETERS_V2 v2;
1544 };
1545
1546 static void
1547 atombios_set_encoder_crtc_source(struct drm_encoder *encoder)
1548 {
1549         struct drm_device *dev = encoder->dev;
1550         struct radeon_device *rdev = dev->dev_private;
1551         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1552         struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1553         union crtc_source_param args;
1554         int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source);
1555         uint8_t frev, crev;
1556         struct radeon_encoder_atom_dig *dig;
1557
1558         memset(&args, 0, sizeof(args));
1559
1560         if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
1561                 return;
1562
1563         switch (frev) {
1564         case 1:
1565                 switch (crev) {
1566                 case 1:
1567                 default:
1568                         if (ASIC_IS_AVIVO(rdev))
1569                                 args.v1.ucCRTC = radeon_crtc->crtc_id;
1570                         else {
1571                                 if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DAC1) {
1572                                         args.v1.ucCRTC = radeon_crtc->crtc_id;
1573                                 } else {
1574                                         args.v1.ucCRTC = radeon_crtc->crtc_id << 2;
1575                                 }
1576                         }
1577                         switch (radeon_encoder->encoder_id) {
1578                         case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
1579                         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
1580                                 args.v1.ucDevice = ATOM_DEVICE_DFP1_INDEX;
1581                                 break;
1582                         case ENCODER_OBJECT_ID_INTERNAL_LVDS:
1583                         case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
1584                                 if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT)
1585                                         args.v1.ucDevice = ATOM_DEVICE_LCD1_INDEX;
1586                                 else
1587                                         args.v1.ucDevice = ATOM_DEVICE_DFP3_INDEX;
1588                                 break;
1589                         case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1590                         case ENCODER_OBJECT_ID_INTERNAL_DDI:
1591                         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1592                                 args.v1.ucDevice = ATOM_DEVICE_DFP2_INDEX;
1593                                 break;
1594                         case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1595                         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1596                                 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1597                                         args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX;
1598                                 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1599                                         args.v1.ucDevice = ATOM_DEVICE_CV_INDEX;
1600                                 else
1601                                         args.v1.ucDevice = ATOM_DEVICE_CRT1_INDEX;
1602                                 break;
1603                         case ENCODER_OBJECT_ID_INTERNAL_DAC2:
1604                         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1605                                 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1606                                         args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX;
1607                                 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1608                                         args.v1.ucDevice = ATOM_DEVICE_CV_INDEX;
1609                                 else
1610                                         args.v1.ucDevice = ATOM_DEVICE_CRT2_INDEX;
1611                                 break;
1612                         }
1613                         break;
1614                 case 2:
1615                         args.v2.ucCRTC = radeon_crtc->crtc_id;
1616                         if (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE) {
1617                                 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
1618
1619                                 if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
1620                                         args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
1621                                 else if (connector->connector_type == DRM_MODE_CONNECTOR_VGA)
1622                                         args.v2.ucEncodeMode = ATOM_ENCODER_MODE_CRT;
1623                                 else
1624                                         args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder);
1625                         } else
1626                                 args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder);
1627                         switch (radeon_encoder->encoder_id) {
1628                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1629                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1630                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1631                         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1632                                 dig = radeon_encoder->enc_priv;
1633                                 switch (dig->dig_encoder) {
1634                                 case 0:
1635                                         args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
1636                                         break;
1637                                 case 1:
1638                                         args.v2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID;
1639                                         break;
1640                                 case 2:
1641                                         args.v2.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID;
1642                                         break;
1643                                 case 3:
1644                                         args.v2.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID;
1645                                         break;
1646                                 case 4:
1647                                         args.v2.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID;
1648                                         break;
1649                                 case 5:
1650                                         args.v2.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID;
1651                                         break;
1652                                 }
1653                                 break;
1654                         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1655                                 args.v2.ucEncoderID = ASIC_INT_DVO_ENCODER_ID;
1656                                 break;
1657                         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1658                                 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1659                                         args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1660                                 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1661                                         args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1662                                 else
1663                                         args.v2.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID;
1664                                 break;
1665                         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1666                                 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1667                                         args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1668                                 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1669                                         args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1670                                 else
1671                                         args.v2.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID;
1672                                 break;
1673                         }
1674                         break;
1675                 }
1676                 break;
1677         default:
1678                 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1679                 return;
1680         }
1681
1682         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1683
1684         /* update scratch regs with new routing */
1685         radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
1686 }
1687
1688 static void
1689 atombios_apply_encoder_quirks(struct drm_encoder *encoder,
1690                               struct drm_display_mode *mode)
1691 {
1692         struct drm_device *dev = encoder->dev;
1693         struct radeon_device *rdev = dev->dev_private;
1694         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1695         struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1696
1697         /* Funky macbooks */
1698         if ((dev->pdev->device == 0x71C5) &&
1699             (dev->pdev->subsystem_vendor == 0x106b) &&
1700             (dev->pdev->subsystem_device == 0x0080)) {
1701                 if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
1702                         uint32_t lvtma_bit_depth_control = RREG32(AVIVO_LVTMA_BIT_DEPTH_CONTROL);
1703
1704                         lvtma_bit_depth_control &= ~AVIVO_LVTMA_BIT_DEPTH_CONTROL_TRUNCATE_EN;
1705                         lvtma_bit_depth_control &= ~AVIVO_LVTMA_BIT_DEPTH_CONTROL_SPATIAL_DITHER_EN;
1706
1707                         WREG32(AVIVO_LVTMA_BIT_DEPTH_CONTROL, lvtma_bit_depth_control);
1708                 }
1709         }
1710
1711         /* set scaler clears this on some chips */
1712         if (ASIC_IS_AVIVO(rdev) &&
1713             (!(radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)))) {
1714                 if (ASIC_IS_DCE4(rdev)) {
1715                         if (mode->flags & DRM_MODE_FLAG_INTERLACE)
1716                                 WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset,
1717                                        EVERGREEN_INTERLEAVE_EN);
1718                         else
1719                                 WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 0);
1720                 } else {
1721                         if (mode->flags & DRM_MODE_FLAG_INTERLACE)
1722                                 WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset,
1723                                        AVIVO_D1MODE_INTERLEAVE_EN);
1724                         else
1725                                 WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 0);
1726                 }
1727         }
1728 }
1729
1730 static int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder)
1731 {
1732         struct drm_device *dev = encoder->dev;
1733         struct radeon_device *rdev = dev->dev_private;
1734         struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1735         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1736         struct drm_encoder *test_encoder;
1737         struct radeon_encoder_atom_dig *dig;
1738         uint32_t dig_enc_in_use = 0;
1739
1740         /* DCE4/5 */
1741         if (ASIC_IS_DCE4(rdev)) {
1742                 dig = radeon_encoder->enc_priv;
1743                 if (ASIC_IS_DCE41(rdev)) {
1744                         /* ontario follows DCE4 */
1745                         if (rdev->family == CHIP_PALM) {
1746                                 if (dig->linkb)
1747                                         return 1;
1748                                 else
1749                                         return 0;
1750                         } else
1751                                 /* llano follows DCE3.2 */
1752                                 return radeon_crtc->crtc_id;
1753                 } else {
1754                         switch (radeon_encoder->encoder_id) {
1755                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1756                                 if (dig->linkb)
1757                                         return 1;
1758                                 else
1759                                         return 0;
1760                                 break;
1761                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1762                                 if (dig->linkb)
1763                                         return 3;
1764                                 else
1765                                         return 2;
1766                                 break;
1767                         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1768                                 if (dig->linkb)
1769                                         return 5;
1770                                 else
1771                                         return 4;
1772                                 break;
1773                         }
1774                 }
1775         }
1776
1777         /* on DCE32 and encoder can driver any block so just crtc id */
1778         if (ASIC_IS_DCE32(rdev)) {
1779                 return radeon_crtc->crtc_id;
1780         }
1781
1782         /* on DCE3 - LVTMA can only be driven by DIGB */
1783         list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) {
1784                 struct radeon_encoder *radeon_test_encoder;
1785
1786                 if (encoder == test_encoder)
1787                         continue;
1788
1789                 if (!radeon_encoder_is_digital(test_encoder))
1790                         continue;
1791
1792                 radeon_test_encoder = to_radeon_encoder(test_encoder);
1793                 dig = radeon_test_encoder->enc_priv;
1794
1795                 if (dig->dig_encoder >= 0)
1796                         dig_enc_in_use |= (1 << dig->dig_encoder);
1797         }
1798
1799         if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA) {
1800                 if (dig_enc_in_use & 0x2)
1801                         DRM_ERROR("LVDS required digital encoder 2 but it was in use - stealing\n");
1802                 return 1;
1803         }
1804         if (!(dig_enc_in_use & 1))
1805                 return 0;
1806         return 1;
1807 }
1808
1809 /* This only needs to be called once at startup */
1810 void
1811 radeon_atom_encoder_init(struct radeon_device *rdev)
1812 {
1813         struct drm_device *dev = rdev->ddev;
1814         struct drm_encoder *encoder;
1815
1816         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
1817                 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1818                 struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder);
1819
1820                 switch (radeon_encoder->encoder_id) {
1821                 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1822                 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1823                 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1824                 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1825                         atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_INIT, 0, 0);
1826                         break;
1827                 default:
1828                         break;
1829                 }
1830
1831                 if (ext_encoder && ASIC_IS_DCE41(rdev))
1832                         atombios_external_encoder_setup(encoder, ext_encoder,
1833                                                         EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT);
1834         }
1835 }
1836
1837 static void
1838 radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
1839                              struct drm_display_mode *mode,
1840                              struct drm_display_mode *adjusted_mode)
1841 {
1842         struct drm_device *dev = encoder->dev;
1843         struct radeon_device *rdev = dev->dev_private;
1844         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1845
1846         radeon_encoder->pixel_clock = adjusted_mode->clock;
1847
1848         /* need to call this here rather than in prepare() since we need some crtc info */
1849         radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
1850
1851         if (ASIC_IS_AVIVO(rdev) && !ASIC_IS_DCE4(rdev)) {
1852                 if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT))
1853                         atombios_yuv_setup(encoder, true);
1854                 else
1855                         atombios_yuv_setup(encoder, false);
1856         }
1857
1858         switch (radeon_encoder->encoder_id) {
1859         case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
1860         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
1861         case ENCODER_OBJECT_ID_INTERNAL_LVDS:
1862         case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
1863                 atombios_digital_setup(encoder, PANEL_ENCODER_ACTION_ENABLE);
1864                 break;
1865         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1866         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1867         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1868         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1869                 /* handled in dpms */
1870                 break;
1871         case ENCODER_OBJECT_ID_INTERNAL_DDI:
1872         case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1873         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1874                 atombios_dvo_setup(encoder, ATOM_ENABLE);
1875                 break;
1876         case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1877         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1878         case ENCODER_OBJECT_ID_INTERNAL_DAC2:
1879         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1880                 atombios_dac_setup(encoder, ATOM_ENABLE);
1881                 if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) {
1882                         if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))
1883                                 atombios_tv_setup(encoder, ATOM_ENABLE);
1884                         else
1885                                 atombios_tv_setup(encoder, ATOM_DISABLE);
1886                 }
1887                 break;
1888         }
1889
1890         atombios_apply_encoder_quirks(encoder, adjusted_mode);
1891
1892         if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
1893                 r600_hdmi_enable(encoder);
1894                 r600_hdmi_setmode(encoder, adjusted_mode);
1895         }
1896 }
1897
1898 static bool
1899 atombios_dac_load_detect(struct drm_encoder *encoder, struct drm_connector *connector)
1900 {
1901         struct drm_device *dev = encoder->dev;
1902         struct radeon_device *rdev = dev->dev_private;
1903         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1904         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1905
1906         if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT |
1907                                        ATOM_DEVICE_CV_SUPPORT |
1908                                        ATOM_DEVICE_CRT_SUPPORT)) {
1909                 DAC_LOAD_DETECTION_PS_ALLOCATION args;
1910                 int index = GetIndexIntoMasterTable(COMMAND, DAC_LoadDetection);
1911                 uint8_t frev, crev;
1912
1913                 memset(&args, 0, sizeof(args));
1914
1915                 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
1916                         return false;
1917
1918                 args.sDacload.ucMisc = 0;
1919
1920                 if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DAC1) ||
1921                     (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1))
1922                         args.sDacload.ucDacType = ATOM_DAC_A;
1923                 else
1924                         args.sDacload.ucDacType = ATOM_DAC_B;
1925
1926                 if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)
1927                         args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT1_SUPPORT);
1928                 else if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)
1929                         args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT2_SUPPORT);
1930                 else if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
1931                         args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CV_SUPPORT);
1932                         if (crev >= 3)
1933                                 args.sDacload.ucMisc = DAC_LOAD_MISC_YPrPb;
1934                 } else if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
1935                         args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_TV1_SUPPORT);
1936                         if (crev >= 3)
1937                                 args.sDacload.ucMisc = DAC_LOAD_MISC_YPrPb;
1938                 }
1939
1940                 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1941
1942                 return true;
1943         } else
1944                 return false;
1945 }
1946
1947 static enum drm_connector_status
1948 radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)
1949 {
1950         struct drm_device *dev = encoder->dev;
1951         struct radeon_device *rdev = dev->dev_private;
1952         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1953         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1954         uint32_t bios_0_scratch;
1955
1956         if (!atombios_dac_load_detect(encoder, connector)) {
1957                 DRM_DEBUG_KMS("detect returned false \n");
1958                 return connector_status_unknown;
1959         }
1960
1961         if (rdev->family >= CHIP_R600)
1962                 bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
1963         else
1964                 bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH);
1965
1966         DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices);
1967         if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) {
1968                 if (bios_0_scratch & ATOM_S0_CRT1_MASK)
1969                         return connector_status_connected;
1970         }
1971         if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) {
1972                 if (bios_0_scratch & ATOM_S0_CRT2_MASK)
1973                         return connector_status_connected;
1974         }
1975         if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
1976                 if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
1977                         return connector_status_connected;
1978         }
1979         if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
1980                 if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
1981                         return connector_status_connected; /* CTV */
1982                 else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
1983                         return connector_status_connected; /* STV */
1984         }
1985         return connector_status_disconnected;
1986 }
1987
1988 static enum drm_connector_status
1989 radeon_atom_dig_detect(struct drm_encoder *encoder, struct drm_connector *connector)
1990 {
1991         struct drm_device *dev = encoder->dev;
1992         struct radeon_device *rdev = dev->dev_private;
1993         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1994         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1995         struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder);
1996         u32 bios_0_scratch;
1997
1998         if (!ASIC_IS_DCE4(rdev))
1999                 return connector_status_unknown;
2000
2001         if (!ext_encoder)
2002                 return connector_status_unknown;
2003
2004         if ((radeon_connector->devices & ATOM_DEVICE_CRT_SUPPORT) == 0)
2005                 return connector_status_unknown;
2006
2007         /* load detect on the dp bridge */
2008         atombios_external_encoder_setup(encoder, ext_encoder,
2009                                         EXTERNAL_ENCODER_ACTION_V3_DACLOAD_DETECTION);
2010
2011         bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
2012
2013         DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices);
2014         if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) {
2015                 if (bios_0_scratch & ATOM_S0_CRT1_MASK)
2016                         return connector_status_connected;
2017         }
2018         if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) {
2019                 if (bios_0_scratch & ATOM_S0_CRT2_MASK)
2020                         return connector_status_connected;
2021         }
2022         if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
2023                 if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
2024                         return connector_status_connected;
2025         }
2026         if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
2027                 if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
2028                         return connector_status_connected; /* CTV */
2029                 else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
2030                         return connector_status_connected; /* STV */
2031         }
2032         return connector_status_disconnected;
2033 }
2034
2035 void
2036 radeon_atom_ext_encoder_setup_ddc(struct drm_encoder *encoder)
2037 {
2038         struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder);
2039
2040         if (ext_encoder)
2041                 /* ddc_setup on the dp bridge */
2042                 atombios_external_encoder_setup(encoder, ext_encoder,
2043                                                 EXTERNAL_ENCODER_ACTION_V3_DDC_SETUP);
2044
2045 }
2046
2047 static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
2048 {
2049         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2050         struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
2051
2052         if ((radeon_encoder->active_device &
2053              (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
2054             (radeon_encoder_get_dp_bridge_encoder_id(encoder) !=
2055              ENCODER_OBJECT_ID_NONE)) {
2056                 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
2057                 if (dig)
2058                         dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder);
2059         }
2060
2061         radeon_atom_output_lock(encoder, true);
2062
2063         if (connector) {
2064                 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
2065
2066                 /* select the clock/data port if it uses a router */
2067                 if (radeon_connector->router.cd_valid)
2068                         radeon_router_select_cd_port(radeon_connector);
2069
2070                 /* turn eDP panel on for mode set */
2071                 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
2072                         atombios_set_edp_panel_power(connector,
2073                                                      ATOM_TRANSMITTER_ACTION_POWER_ON);
2074         }
2075
2076         /* this is needed for the pll/ss setup to work correctly in some cases */
2077         atombios_set_encoder_crtc_source(encoder);
2078 }
2079
2080 static void radeon_atom_encoder_commit(struct drm_encoder *encoder)
2081 {
2082         /* need to call this here as we need the crtc set up */
2083         radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_ON);
2084         radeon_atom_output_lock(encoder, false);
2085 }
2086
2087 static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
2088 {
2089         struct drm_device *dev = encoder->dev;
2090         struct radeon_device *rdev = dev->dev_private;
2091         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2092         struct radeon_encoder_atom_dig *dig;
2093
2094         /* check for pre-DCE3 cards with shared encoders;
2095          * can't really use the links individually, so don't disable
2096          * the encoder if it's in use by another connector
2097          */
2098         if (!ASIC_IS_DCE3(rdev)) {
2099                 struct drm_encoder *other_encoder;
2100                 struct radeon_encoder *other_radeon_encoder;
2101
2102                 list_for_each_entry(other_encoder, &dev->mode_config.encoder_list, head) {
2103                         other_radeon_encoder = to_radeon_encoder(other_encoder);
2104                         if ((radeon_encoder->encoder_id == other_radeon_encoder->encoder_id) &&
2105                             drm_helper_encoder_in_use(other_encoder))
2106                                 goto disable_done;
2107                 }
2108         }
2109
2110         radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
2111
2112         switch (radeon_encoder->encoder_id) {
2113         case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
2114         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
2115         case ENCODER_OBJECT_ID_INTERNAL_LVDS:
2116         case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
2117                 atombios_digital_setup(encoder, PANEL_ENCODER_ACTION_DISABLE);
2118                 break;
2119         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
2120         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
2121         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
2122         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
2123                 /* handled in dpms */
2124                 break;
2125         case ENCODER_OBJECT_ID_INTERNAL_DDI:
2126         case ENCODER_OBJECT_ID_INTERNAL_DVO1:
2127         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
2128                 atombios_dvo_setup(encoder, ATOM_DISABLE);
2129                 break;
2130         case ENCODER_OBJECT_ID_INTERNAL_DAC1:
2131         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
2132         case ENCODER_OBJECT_ID_INTERNAL_DAC2:
2133         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
2134                 atombios_dac_setup(encoder, ATOM_DISABLE);
2135                 if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))
2136                         atombios_tv_setup(encoder, ATOM_DISABLE);
2137                 break;
2138         }
2139
2140 disable_done:
2141         if (radeon_encoder_is_digital(encoder)) {
2142                 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI)
2143                         r600_hdmi_disable(encoder);
2144                 dig = radeon_encoder->enc_priv;
2145                 dig->dig_encoder = -1;
2146         }
2147         radeon_encoder->active_device = 0;
2148 }
2149
2150 /* these are handled by the primary encoders */
2151 static void radeon_atom_ext_prepare(struct drm_encoder *encoder)
2152 {
2153
2154 }
2155
2156 static void radeon_atom_ext_commit(struct drm_encoder *encoder)
2157 {
2158
2159 }
2160
2161 static void
2162 radeon_atom_ext_mode_set(struct drm_encoder *encoder,
2163                          struct drm_display_mode *mode,
2164                          struct drm_display_mode *adjusted_mode)
2165 {
2166
2167 }
2168
2169 static void radeon_atom_ext_disable(struct drm_encoder *encoder)
2170 {
2171
2172 }
2173
2174 static void
2175 radeon_atom_ext_dpms(struct drm_encoder *encoder, int mode)
2176 {
2177
2178 }
2179
2180 static bool radeon_atom_ext_mode_fixup(struct drm_encoder *encoder,
2181                                        struct drm_display_mode *mode,
2182                                        struct drm_display_mode *adjusted_mode)
2183 {
2184         return true;
2185 }
2186
2187 static const struct drm_encoder_helper_funcs radeon_atom_ext_helper_funcs = {
2188         .dpms = radeon_atom_ext_dpms,
2189         .mode_fixup = radeon_atom_ext_mode_fixup,
2190         .prepare = radeon_atom_ext_prepare,
2191         .mode_set = radeon_atom_ext_mode_set,
2192         .commit = radeon_atom_ext_commit,
2193         .disable = radeon_atom_ext_disable,
2194         /* no detect for TMDS/LVDS yet */
2195 };
2196
2197 static const struct drm_encoder_helper_funcs radeon_atom_dig_helper_funcs = {
2198         .dpms = radeon_atom_encoder_dpms,
2199         .mode_fixup = radeon_atom_mode_fixup,
2200         .prepare = radeon_atom_encoder_prepare,
2201         .mode_set = radeon_atom_encoder_mode_set,
2202         .commit = radeon_atom_encoder_commit,
2203         .disable = radeon_atom_encoder_disable,
2204         .detect = radeon_atom_dig_detect,
2205 };
2206
2207 static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = {
2208         .dpms = radeon_atom_encoder_dpms,
2209         .mode_fixup = radeon_atom_mode_fixup,
2210         .prepare = radeon_atom_encoder_prepare,
2211         .mode_set = radeon_atom_encoder_mode_set,
2212         .commit = radeon_atom_encoder_commit,
2213         .detect = radeon_atom_dac_detect,
2214 };
2215
2216 void radeon_enc_destroy(struct drm_encoder *encoder)
2217 {
2218         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2219         kfree(radeon_encoder->enc_priv);
2220         drm_encoder_cleanup(encoder);
2221         kfree(radeon_encoder);
2222 }
2223
2224 static const struct drm_encoder_funcs radeon_atom_enc_funcs = {
2225         .destroy = radeon_enc_destroy,
2226 };
2227
2228 struct radeon_encoder_atom_dac *
2229 radeon_atombios_set_dac_info(struct radeon_encoder *radeon_encoder)
2230 {
2231         struct drm_device *dev = radeon_encoder->base.dev;
2232         struct radeon_device *rdev = dev->dev_private;
2233         struct radeon_encoder_atom_dac *dac = kzalloc(sizeof(struct radeon_encoder_atom_dac), GFP_KERNEL);
2234
2235         if (!dac)
2236                 return NULL;
2237
2238         dac->tv_std = radeon_atombios_get_tv_info(rdev);
2239         return dac;
2240 }
2241
2242 struct radeon_encoder_atom_dig *
2243 radeon_atombios_set_dig_info(struct radeon_encoder *radeon_encoder)
2244 {
2245         int encoder_enum = (radeon_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
2246         struct radeon_encoder_atom_dig *dig = kzalloc(sizeof(struct radeon_encoder_atom_dig), GFP_KERNEL);
2247
2248         if (!dig)
2249                 return NULL;
2250
2251         /* coherent mode by default */
2252         dig->coherent_mode = true;
2253         dig->dig_encoder = -1;
2254
2255         if (encoder_enum == 2)
2256                 dig->linkb = true;
2257         else
2258                 dig->linkb = false;
2259
2260         return dig;
2261 }
2262
2263 void
2264 radeon_add_atom_encoder(struct drm_device *dev,
2265                         uint32_t encoder_enum,
2266                         uint32_t supported_device,
2267                         u16 caps)
2268 {
2269         struct radeon_device *rdev = dev->dev_private;
2270         struct drm_encoder *encoder;
2271         struct radeon_encoder *radeon_encoder;
2272
2273         /* see if we already added it */
2274         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
2275                 radeon_encoder = to_radeon_encoder(encoder);
2276                 if (radeon_encoder->encoder_enum == encoder_enum) {
2277                         radeon_encoder->devices |= supported_device;
2278                         return;
2279                 }
2280
2281         }
2282
2283         /* add a new one */
2284         radeon_encoder = kzalloc(sizeof(struct radeon_encoder), GFP_KERNEL);
2285         if (!radeon_encoder)
2286                 return;
2287
2288         encoder = &radeon_encoder->base;
2289         switch (rdev->num_crtc) {
2290         case 1:
2291                 encoder->possible_crtcs = 0x1;
2292                 break;
2293         case 2:
2294         default:
2295                 encoder->possible_crtcs = 0x3;
2296                 break;
2297         case 4:
2298                 encoder->possible_crtcs = 0xf;
2299                 break;
2300         case 6:
2301                 encoder->possible_crtcs = 0x3f;
2302                 break;
2303         }
2304
2305         radeon_encoder->enc_priv = NULL;
2306
2307         radeon_encoder->encoder_enum = encoder_enum;
2308         radeon_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
2309         radeon_encoder->devices = supported_device;
2310         radeon_encoder->rmx_type = RMX_OFF;
2311         radeon_encoder->underscan_type = UNDERSCAN_OFF;
2312         radeon_encoder->is_ext_encoder = false;
2313         radeon_encoder->caps = caps;
2314
2315         switch (radeon_encoder->encoder_id) {
2316         case ENCODER_OBJECT_ID_INTERNAL_LVDS:
2317         case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
2318         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
2319         case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
2320                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
2321                         radeon_encoder->rmx_type = RMX_FULL;
2322                         drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_LVDS);
2323                         radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder);
2324                 } else {
2325                         drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS);
2326                         radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder);
2327                 }
2328                 drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs);
2329                 break;
2330         case ENCODER_OBJECT_ID_INTERNAL_DAC1:
2331                 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_DAC);
2332                 radeon_encoder->enc_priv = radeon_atombios_set_dac_info(radeon_encoder);
2333                 drm_encoder_helper_add(encoder, &radeon_atom_dac_helper_funcs);
2334                 break;
2335         case ENCODER_OBJECT_ID_INTERNAL_DAC2:
2336         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
2337         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
2338                 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TVDAC);
2339                 radeon_encoder->enc_priv = radeon_atombios_set_dac_info(radeon_encoder);
2340                 drm_encoder_helper_add(encoder, &radeon_atom_dac_helper_funcs);
2341                 break;
2342         case ENCODER_OBJECT_ID_INTERNAL_DVO1:
2343         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
2344         case ENCODER_OBJECT_ID_INTERNAL_DDI:
2345         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
2346         case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
2347         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
2348         case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
2349                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
2350                         radeon_encoder->rmx_type = RMX_FULL;
2351                         drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_LVDS);
2352                         radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder);
2353                 } else if (radeon_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT)) {
2354                         drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_DAC);
2355                         radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder);
2356                 } else {
2357                         drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS);
2358                         radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder);
2359                 }
2360                 drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs);
2361                 break;
2362         case ENCODER_OBJECT_ID_SI170B:
2363         case ENCODER_OBJECT_ID_CH7303:
2364         case ENCODER_OBJECT_ID_EXTERNAL_SDVOA:
2365         case ENCODER_OBJECT_ID_EXTERNAL_SDVOB:
2366         case ENCODER_OBJECT_ID_TITFP513:
2367         case ENCODER_OBJECT_ID_VT1623:
2368         case ENCODER_OBJECT_ID_HDMI_SI1930:
2369         case ENCODER_OBJECT_ID_TRAVIS:
2370         case ENCODER_OBJECT_ID_NUTMEG:
2371                 /* these are handled by the primary encoders */
2372                 radeon_encoder->is_ext_encoder = true;
2373                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
2374                         drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_LVDS);
2375                 else if (radeon_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT))
2376                         drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_DAC);
2377                 else
2378                         drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS);
2379                 drm_encoder_helper_add(encoder, &radeon_atom_ext_helper_funcs);
2380                 break;
2381         }
2382 }