drm/radeon: Poll for both connect/disconnect on analog connectors
[pandora-kernel.git] / drivers / gpu / drm / radeon / radeon_connectors.c
1 /*
2  * Copyright 2007-8 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_edid.h"
28 #include "drm_crtc_helper.h"
29 #include "drm_fb_helper.h"
30 #include "radeon_drm.h"
31 #include "radeon.h"
32 #include "atom.h"
33
34 extern void
35 radeon_combios_connected_scratch_regs(struct drm_connector *connector,
36                                       struct drm_encoder *encoder,
37                                       bool connected);
38 extern void
39 radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
40                                        struct drm_encoder *encoder,
41                                        bool connected);
42
43 extern void
44 radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder,
45                              struct drm_connector *drm_connector);
46
47 void radeon_connector_hotplug(struct drm_connector *connector)
48 {
49         struct drm_device *dev = connector->dev;
50         struct radeon_device *rdev = dev->dev_private;
51         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
52
53         /* bail if the connector does not have hpd pin, e.g.,
54          * VGA, TV, etc.
55          */
56         if (radeon_connector->hpd.hpd == RADEON_HPD_NONE)
57                 return;
58
59         radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
60
61         /* if the connector is already off, don't turn it back on */
62         if (connector->dpms != DRM_MODE_DPMS_ON)
63                 return;
64
65         /* just deal with DP (not eDP) here. */
66         if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
67                 struct radeon_connector_atom_dig *dig_connector =
68                         radeon_connector->con_priv;
69
70                 /* if existing sink type was not DP no need to retrain */
71                 if (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_DISPLAYPORT)
72                         return;
73
74                 /* first get sink type as it may be reset after (un)plug */
75                 dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
76                 /* don't do anything if sink is not display port, i.e.,
77                  * passive dp->(dvi|hdmi) adaptor
78                  */
79                 if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
80                         int saved_dpms = connector->dpms;
81                         /* Only turn off the display if it's physically disconnected */
82                         if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
83                                 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
84                         } else if (radeon_dp_needs_link_train(radeon_connector)) {
85                                 /* Don't try to start link training before we
86                                  * have the dpcd */
87                                 if (!radeon_dp_getdpcd(radeon_connector))
88                                         return;
89
90                                 /* set it to OFF so that drm_helper_connector_dpms()
91                                  * won't return immediately since the current state
92                                  * is ON at this point.
93                                  */
94                                 connector->dpms = DRM_MODE_DPMS_OFF;
95                                 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
96                         }
97                         connector->dpms = saved_dpms;
98                 }
99         }
100 }
101
102 static void radeon_property_change_mode(struct drm_encoder *encoder)
103 {
104         struct drm_crtc *crtc = encoder->crtc;
105
106         if (crtc && crtc->enabled) {
107                 drm_crtc_helper_set_mode(crtc, &crtc->mode,
108                                          crtc->x, crtc->y, crtc->fb);
109         }
110 }
111 static void
112 radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status)
113 {
114         struct drm_device *dev = connector->dev;
115         struct radeon_device *rdev = dev->dev_private;
116         struct drm_encoder *best_encoder = NULL;
117         struct drm_encoder *encoder = NULL;
118         struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
119         struct drm_mode_object *obj;
120         bool connected;
121         int i;
122
123         best_encoder = connector_funcs->best_encoder(connector);
124
125         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
126                 if (connector->encoder_ids[i] == 0)
127                         break;
128
129                 obj = drm_mode_object_find(connector->dev,
130                                            connector->encoder_ids[i],
131                                            DRM_MODE_OBJECT_ENCODER);
132                 if (!obj)
133                         continue;
134
135                 encoder = obj_to_encoder(obj);
136
137                 if ((encoder == best_encoder) && (status == connector_status_connected))
138                         connected = true;
139                 else
140                         connected = false;
141
142                 if (rdev->is_atom_bios)
143                         radeon_atombios_connected_scratch_regs(connector, encoder, connected);
144                 else
145                         radeon_combios_connected_scratch_regs(connector, encoder, connected);
146
147         }
148 }
149
150 struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type)
151 {
152         struct drm_mode_object *obj;
153         struct drm_encoder *encoder;
154         int i;
155
156         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
157                 if (connector->encoder_ids[i] == 0)
158                         break;
159
160                 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
161                 if (!obj)
162                         continue;
163
164                 encoder = obj_to_encoder(obj);
165                 if (encoder->encoder_type == encoder_type)
166                         return encoder;
167         }
168         return NULL;
169 }
170
171 struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
172 {
173         int enc_id = connector->encoder_ids[0];
174         struct drm_mode_object *obj;
175         struct drm_encoder *encoder;
176
177         /* pick the encoder ids */
178         if (enc_id) {
179                 obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
180                 if (!obj)
181                         return NULL;
182                 encoder = obj_to_encoder(obj);
183                 return encoder;
184         }
185         return NULL;
186 }
187
188 /*
189  * radeon_connector_analog_encoder_conflict_solve
190  * - search for other connectors sharing this encoder
191  *   if priority is true, then set them disconnected if this is connected
192  *   if priority is false, set us disconnected if they are connected
193  */
194 static enum drm_connector_status
195 radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
196                                                struct drm_encoder *encoder,
197                                                enum drm_connector_status current_status,
198                                                bool priority)
199 {
200         struct drm_device *dev = connector->dev;
201         struct drm_connector *conflict;
202         struct radeon_connector *radeon_conflict;
203         int i;
204
205         list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {
206                 if (conflict == connector)
207                         continue;
208
209                 radeon_conflict = to_radeon_connector(conflict);
210                 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
211                         if (conflict->encoder_ids[i] == 0)
212                                 break;
213
214                         /* if the IDs match */
215                         if (conflict->encoder_ids[i] == encoder->base.id) {
216                                 if (conflict->status != connector_status_connected)
217                                         continue;
218
219                                 if (radeon_conflict->use_digital)
220                                         continue;
221
222                                 if (priority == true) {
223                                         DRM_DEBUG_KMS("1: conflicting encoders switching off %s\n", drm_get_connector_name(conflict));
224                                         DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(connector));
225                                         conflict->status = connector_status_disconnected;
226                                         radeon_connector_update_scratch_regs(conflict, connector_status_disconnected);
227                                 } else {
228                                         DRM_DEBUG_KMS("2: conflicting encoders switching off %s\n", drm_get_connector_name(connector));
229                                         DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(conflict));
230                                         current_status = connector_status_disconnected;
231                                 }
232                                 break;
233                         }
234                 }
235         }
236         return current_status;
237
238 }
239
240 static struct drm_display_mode *radeon_fp_native_mode(struct drm_encoder *encoder)
241 {
242         struct drm_device *dev = encoder->dev;
243         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
244         struct drm_display_mode *mode = NULL;
245         struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
246
247         if (native_mode->hdisplay != 0 &&
248             native_mode->vdisplay != 0 &&
249             native_mode->clock != 0) {
250                 mode = drm_mode_duplicate(dev, native_mode);
251                 mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
252                 drm_mode_set_name(mode);
253
254                 DRM_DEBUG_KMS("Adding native panel mode %s\n", mode->name);
255         } else if (native_mode->hdisplay != 0 &&
256                    native_mode->vdisplay != 0) {
257                 /* mac laptops without an edid */
258                 /* Note that this is not necessarily the exact panel mode,
259                  * but an approximation based on the cvt formula.  For these
260                  * systems we should ideally read the mode info out of the
261                  * registers or add a mode table, but this works and is much
262                  * simpler.
263                  */
264                 mode = drm_cvt_mode(dev, native_mode->hdisplay, native_mode->vdisplay, 60, true, false, false);
265                 mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
266                 DRM_DEBUG_KMS("Adding cvt approximation of native panel mode %s\n", mode->name);
267         }
268         return mode;
269 }
270
271 static void radeon_add_common_modes(struct drm_encoder *encoder, struct drm_connector *connector)
272 {
273         struct drm_device *dev = encoder->dev;
274         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
275         struct drm_display_mode *mode = NULL;
276         struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
277         int i;
278         struct mode_size {
279                 int w;
280                 int h;
281         } common_modes[17] = {
282                 { 640,  480},
283                 { 720,  480},
284                 { 800,  600},
285                 { 848,  480},
286                 {1024,  768},
287                 {1152,  768},
288                 {1280,  720},
289                 {1280,  800},
290                 {1280,  854},
291                 {1280,  960},
292                 {1280, 1024},
293                 {1440,  900},
294                 {1400, 1050},
295                 {1680, 1050},
296                 {1600, 1200},
297                 {1920, 1080},
298                 {1920, 1200}
299         };
300
301         for (i = 0; i < 17; i++) {
302                 if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT)) {
303                         if (common_modes[i].w > 1024 ||
304                             common_modes[i].h > 768)
305                                 continue;
306                 }
307                 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
308                         if (common_modes[i].w > native_mode->hdisplay ||
309                             common_modes[i].h > native_mode->vdisplay ||
310                             (common_modes[i].w == native_mode->hdisplay &&
311                              common_modes[i].h == native_mode->vdisplay))
312                                 continue;
313                 }
314                 if (common_modes[i].w < 320 || common_modes[i].h < 200)
315                         continue;
316
317                 mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false);
318                 drm_mode_probed_add(connector, mode);
319         }
320 }
321
322 int radeon_connector_set_property(struct drm_connector *connector, struct drm_property *property,
323                                   uint64_t val)
324 {
325         struct drm_device *dev = connector->dev;
326         struct radeon_device *rdev = dev->dev_private;
327         struct drm_encoder *encoder;
328         struct radeon_encoder *radeon_encoder;
329
330         if (property == rdev->mode_info.coherent_mode_property) {
331                 struct radeon_encoder_atom_dig *dig;
332                 bool new_coherent_mode;
333
334                 /* need to find digital encoder on connector */
335                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
336                 if (!encoder)
337                         return 0;
338
339                 radeon_encoder = to_radeon_encoder(encoder);
340
341                 if (!radeon_encoder->enc_priv)
342                         return 0;
343
344                 dig = radeon_encoder->enc_priv;
345                 new_coherent_mode = val ? true : false;
346                 if (dig->coherent_mode != new_coherent_mode) {
347                         dig->coherent_mode = new_coherent_mode;
348                         radeon_property_change_mode(&radeon_encoder->base);
349                 }
350         }
351
352         if (property == rdev->mode_info.underscan_property) {
353                 /* need to find digital encoder on connector */
354                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
355                 if (!encoder)
356                         return 0;
357
358                 radeon_encoder = to_radeon_encoder(encoder);
359
360                 if (radeon_encoder->underscan_type != val) {
361                         radeon_encoder->underscan_type = val;
362                         radeon_property_change_mode(&radeon_encoder->base);
363                 }
364         }
365
366         if (property == rdev->mode_info.underscan_hborder_property) {
367                 /* need to find digital encoder on connector */
368                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
369                 if (!encoder)
370                         return 0;
371
372                 radeon_encoder = to_radeon_encoder(encoder);
373
374                 if (radeon_encoder->underscan_hborder != val) {
375                         radeon_encoder->underscan_hborder = val;
376                         radeon_property_change_mode(&radeon_encoder->base);
377                 }
378         }
379
380         if (property == rdev->mode_info.underscan_vborder_property) {
381                 /* need to find digital encoder on connector */
382                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
383                 if (!encoder)
384                         return 0;
385
386                 radeon_encoder = to_radeon_encoder(encoder);
387
388                 if (radeon_encoder->underscan_vborder != val) {
389                         radeon_encoder->underscan_vborder = val;
390                         radeon_property_change_mode(&radeon_encoder->base);
391                 }
392         }
393
394         if (property == rdev->mode_info.tv_std_property) {
395                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC);
396                 if (!encoder) {
397                         encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_DAC);
398                 }
399
400                 if (!encoder)
401                         return 0;
402
403                 radeon_encoder = to_radeon_encoder(encoder);
404                 if (!radeon_encoder->enc_priv)
405                         return 0;
406                 if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom) {
407                         struct radeon_encoder_atom_dac *dac_int;
408                         dac_int = radeon_encoder->enc_priv;
409                         dac_int->tv_std = val;
410                 } else {
411                         struct radeon_encoder_tv_dac *dac_int;
412                         dac_int = radeon_encoder->enc_priv;
413                         dac_int->tv_std = val;
414                 }
415                 radeon_property_change_mode(&radeon_encoder->base);
416         }
417
418         if (property == rdev->mode_info.load_detect_property) {
419                 struct radeon_connector *radeon_connector =
420                         to_radeon_connector(connector);
421
422                 if (val == 0)
423                         radeon_connector->dac_load_detect = false;
424                 else
425                         radeon_connector->dac_load_detect = true;
426         }
427
428         if (property == rdev->mode_info.tmds_pll_property) {
429                 struct radeon_encoder_int_tmds *tmds = NULL;
430                 bool ret = false;
431                 /* need to find digital encoder on connector */
432                 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
433                 if (!encoder)
434                         return 0;
435
436                 radeon_encoder = to_radeon_encoder(encoder);
437
438                 tmds = radeon_encoder->enc_priv;
439                 if (!tmds)
440                         return 0;
441
442                 if (val == 0) {
443                         if (rdev->is_atom_bios)
444                                 ret = radeon_atombios_get_tmds_info(radeon_encoder, tmds);
445                         else
446                                 ret = radeon_legacy_get_tmds_info_from_combios(radeon_encoder, tmds);
447                 }
448                 if (val == 1 || ret == false) {
449                         radeon_legacy_get_tmds_info_from_table(radeon_encoder, tmds);
450                 }
451                 radeon_property_change_mode(&radeon_encoder->base);
452         }
453
454         return 0;
455 }
456
457 static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,
458                                           struct drm_connector *connector)
459 {
460         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
461         struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
462         struct drm_display_mode *t, *mode;
463
464         /* If the EDID preferred mode doesn't match the native mode, use it */
465         list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
466                 if (mode->type & DRM_MODE_TYPE_PREFERRED) {
467                         if (mode->hdisplay != native_mode->hdisplay ||
468                             mode->vdisplay != native_mode->vdisplay)
469                                 memcpy(native_mode, mode, sizeof(*mode));
470                 }
471         }
472
473         /* Try to get native mode details from EDID if necessary */
474         if (!native_mode->clock) {
475                 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
476                         if (mode->hdisplay == native_mode->hdisplay &&
477                             mode->vdisplay == native_mode->vdisplay) {
478                                 *native_mode = *mode;
479                                 drm_mode_set_crtcinfo(native_mode, CRTC_INTERLACE_HALVE_V);
480                                 DRM_DEBUG_KMS("Determined LVDS native mode details from EDID\n");
481                                 break;
482                         }
483                 }
484         }
485
486         if (!native_mode->clock) {
487                 DRM_DEBUG_KMS("No LVDS native mode details, disabling RMX\n");
488                 radeon_encoder->rmx_type = RMX_OFF;
489         }
490 }
491
492 static int radeon_lvds_get_modes(struct drm_connector *connector)
493 {
494         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
495         struct drm_encoder *encoder;
496         int ret = 0;
497         struct drm_display_mode *mode;
498
499         if (radeon_connector->ddc_bus) {
500                 ret = radeon_ddc_get_modes(radeon_connector);
501                 if (ret > 0) {
502                         encoder = radeon_best_single_encoder(connector);
503                         if (encoder) {
504                                 radeon_fixup_lvds_native_mode(encoder, connector);
505                                 /* add scaled modes */
506                                 radeon_add_common_modes(encoder, connector);
507                         }
508                         return ret;
509                 }
510         }
511
512         encoder = radeon_best_single_encoder(connector);
513         if (!encoder)
514                 return 0;
515
516         /* we have no EDID modes */
517         mode = radeon_fp_native_mode(encoder);
518         if (mode) {
519                 ret = 1;
520                 drm_mode_probed_add(connector, mode);
521                 /* add the width/height from vbios tables if available */
522                 connector->display_info.width_mm = mode->width_mm;
523                 connector->display_info.height_mm = mode->height_mm;
524                 /* add scaled modes */
525                 radeon_add_common_modes(encoder, connector);
526         }
527
528         return ret;
529 }
530
531 static int radeon_lvds_mode_valid(struct drm_connector *connector,
532                                   struct drm_display_mode *mode)
533 {
534         struct drm_encoder *encoder = radeon_best_single_encoder(connector);
535
536         if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
537                 return MODE_PANEL;
538
539         if (encoder) {
540                 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
541                 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
542
543                 /* AVIVO hardware supports downscaling modes larger than the panel
544                  * to the panel size, but I'm not sure this is desirable.
545                  */
546                 if ((mode->hdisplay > native_mode->hdisplay) ||
547                     (mode->vdisplay > native_mode->vdisplay))
548                         return MODE_PANEL;
549
550                 /* if scaling is disabled, block non-native modes */
551                 if (radeon_encoder->rmx_type == RMX_OFF) {
552                         if ((mode->hdisplay != native_mode->hdisplay) ||
553                             (mode->vdisplay != native_mode->vdisplay))
554                                 return MODE_PANEL;
555                 }
556         }
557
558         return MODE_OK;
559 }
560
561 static enum drm_connector_status
562 radeon_lvds_detect(struct drm_connector *connector, bool force)
563 {
564         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
565         struct drm_encoder *encoder = radeon_best_single_encoder(connector);
566         enum drm_connector_status ret = connector_status_disconnected;
567
568         if (encoder) {
569                 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
570                 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
571
572                 /* check if panel is valid */
573                 if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
574                         ret = connector_status_connected;
575
576         }
577
578         /* check for edid as well */
579         if (radeon_connector->edid)
580                 ret = connector_status_connected;
581         else {
582                 if (radeon_connector->ddc_bus) {
583                         radeon_connector->edid = drm_get_edid(&radeon_connector->base,
584                                                               &radeon_connector->ddc_bus->adapter);
585                         if (radeon_connector->edid)
586                                 ret = connector_status_connected;
587                 }
588         }
589         /* check acpi lid status ??? */
590
591         radeon_connector_update_scratch_regs(connector, ret);
592         return ret;
593 }
594
595 static void radeon_connector_destroy(struct drm_connector *connector)
596 {
597         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
598
599         if (radeon_connector->edid)
600                 kfree(radeon_connector->edid);
601         kfree(radeon_connector->con_priv);
602         drm_sysfs_connector_remove(connector);
603         drm_connector_cleanup(connector);
604         kfree(connector);
605 }
606
607 static int radeon_lvds_set_property(struct drm_connector *connector,
608                                     struct drm_property *property,
609                                     uint64_t value)
610 {
611         struct drm_device *dev = connector->dev;
612         struct radeon_encoder *radeon_encoder;
613         enum radeon_rmx_type rmx_type;
614
615         DRM_DEBUG_KMS("\n");
616         if (property != dev->mode_config.scaling_mode_property)
617                 return 0;
618
619         if (connector->encoder)
620                 radeon_encoder = to_radeon_encoder(connector->encoder);
621         else {
622                 struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
623                 radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
624         }
625
626         switch (value) {
627         case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;
628         case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break;
629         case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break;
630         default:
631         case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break;
632         }
633         if (radeon_encoder->rmx_type == rmx_type)
634                 return 0;
635
636         radeon_encoder->rmx_type = rmx_type;
637
638         radeon_property_change_mode(&radeon_encoder->base);
639         return 0;
640 }
641
642
643 struct drm_connector_helper_funcs radeon_lvds_connector_helper_funcs = {
644         .get_modes = radeon_lvds_get_modes,
645         .mode_valid = radeon_lvds_mode_valid,
646         .best_encoder = radeon_best_single_encoder,
647 };
648
649 struct drm_connector_funcs radeon_lvds_connector_funcs = {
650         .dpms = drm_helper_connector_dpms,
651         .detect = radeon_lvds_detect,
652         .fill_modes = drm_helper_probe_single_connector_modes,
653         .destroy = radeon_connector_destroy,
654         .set_property = radeon_lvds_set_property,
655 };
656
657 static int radeon_vga_get_modes(struct drm_connector *connector)
658 {
659         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
660         int ret;
661
662         ret = radeon_ddc_get_modes(radeon_connector);
663
664         return ret;
665 }
666
667 static int radeon_vga_mode_valid(struct drm_connector *connector,
668                                   struct drm_display_mode *mode)
669 {
670         struct drm_device *dev = connector->dev;
671         struct radeon_device *rdev = dev->dev_private;
672
673         /* XXX check mode bandwidth */
674
675         if ((mode->clock / 10) > rdev->clock.max_pixel_clock)
676                 return MODE_CLOCK_HIGH;
677
678         return MODE_OK;
679 }
680
681 static enum drm_connector_status
682 radeon_vga_detect(struct drm_connector *connector, bool force)
683 {
684         struct drm_device *dev = connector->dev;
685         struct radeon_device *rdev = dev->dev_private;
686         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
687         struct drm_encoder *encoder;
688         struct drm_encoder_helper_funcs *encoder_funcs;
689         bool dret = false;
690         enum drm_connector_status ret = connector_status_disconnected;
691
692         encoder = radeon_best_single_encoder(connector);
693         if (!encoder)
694                 ret = connector_status_disconnected;
695
696         if (radeon_connector->ddc_bus)
697                 dret = radeon_ddc_probe(radeon_connector, false);
698         if (dret) {
699                 radeon_connector->detected_by_load = false;
700                 if (radeon_connector->edid) {
701                         kfree(radeon_connector->edid);
702                         radeon_connector->edid = NULL;
703                 }
704                 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
705
706                 if (!radeon_connector->edid) {
707                         DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
708                                         drm_get_connector_name(connector));
709                         ret = connector_status_connected;
710                 } else {
711                         radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
712
713                         /* some oems have boards with separate digital and analog connectors
714                          * with a shared ddc line (often vga + hdmi)
715                          */
716                         if (radeon_connector->use_digital && radeon_connector->shared_ddc) {
717                                 kfree(radeon_connector->edid);
718                                 radeon_connector->edid = NULL;
719                                 ret = connector_status_disconnected;
720                         } else
721                                 ret = connector_status_connected;
722                 }
723         } else {
724
725                 /* if we aren't forcing don't do destructive polling */
726                 if (!force) {
727                         /* only return the previous status if we last
728                          * detected a monitor via load.
729                          */
730                         if (radeon_connector->detected_by_load)
731                                 return connector->status;
732                         else
733                                 return ret;
734                 }
735
736                 if (radeon_connector->dac_load_detect && encoder) {
737                         encoder_funcs = encoder->helper_private;
738                         ret = encoder_funcs->detect(encoder, connector);
739                         if (ret != connector_status_disconnected)
740                                 radeon_connector->detected_by_load = true;
741                 }
742         }
743
744         if (ret == connector_status_connected)
745                 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
746
747         /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
748          * vbios to deal with KVMs. If we have one and are not able to detect a monitor
749          * by other means, assume the CRT is connected and use that EDID.
750          */
751         if ((!rdev->is_atom_bios) &&
752             (ret == connector_status_disconnected) &&
753             rdev->mode_info.bios_hardcoded_edid_size) {
754                 ret = connector_status_connected;
755         }
756
757         radeon_connector_update_scratch_regs(connector, ret);
758         return ret;
759 }
760
761 struct drm_connector_helper_funcs radeon_vga_connector_helper_funcs = {
762         .get_modes = radeon_vga_get_modes,
763         .mode_valid = radeon_vga_mode_valid,
764         .best_encoder = radeon_best_single_encoder,
765 };
766
767 struct drm_connector_funcs radeon_vga_connector_funcs = {
768         .dpms = drm_helper_connector_dpms,
769         .detect = radeon_vga_detect,
770         .fill_modes = drm_helper_probe_single_connector_modes,
771         .destroy = radeon_connector_destroy,
772         .set_property = radeon_connector_set_property,
773 };
774
775 static int radeon_tv_get_modes(struct drm_connector *connector)
776 {
777         struct drm_device *dev = connector->dev;
778         struct radeon_device *rdev = dev->dev_private;
779         struct drm_display_mode *tv_mode;
780         struct drm_encoder *encoder;
781
782         encoder = radeon_best_single_encoder(connector);
783         if (!encoder)
784                 return 0;
785
786         /* avivo chips can scale any mode */
787         if (rdev->family >= CHIP_RS600)
788                 /* add scaled modes */
789                 radeon_add_common_modes(encoder, connector);
790         else {
791                 /* only 800x600 is supported right now on pre-avivo chips */
792                 tv_mode = drm_cvt_mode(dev, 800, 600, 60, false, false, false);
793                 tv_mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
794                 drm_mode_probed_add(connector, tv_mode);
795         }
796         return 1;
797 }
798
799 static int radeon_tv_mode_valid(struct drm_connector *connector,
800                                 struct drm_display_mode *mode)
801 {
802         if ((mode->hdisplay > 1024) || (mode->vdisplay > 768))
803                 return MODE_CLOCK_RANGE;
804         return MODE_OK;
805 }
806
807 static enum drm_connector_status
808 radeon_tv_detect(struct drm_connector *connector, bool force)
809 {
810         struct drm_encoder *encoder;
811         struct drm_encoder_helper_funcs *encoder_funcs;
812         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
813         enum drm_connector_status ret = connector_status_disconnected;
814
815         if (!radeon_connector->dac_load_detect)
816                 return ret;
817
818         encoder = radeon_best_single_encoder(connector);
819         if (!encoder)
820                 ret = connector_status_disconnected;
821         else {
822                 encoder_funcs = encoder->helper_private;
823                 ret = encoder_funcs->detect(encoder, connector);
824         }
825         if (ret == connector_status_connected)
826                 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, false);
827         radeon_connector_update_scratch_regs(connector, ret);
828         return ret;
829 }
830
831 struct drm_connector_helper_funcs radeon_tv_connector_helper_funcs = {
832         .get_modes = radeon_tv_get_modes,
833         .mode_valid = radeon_tv_mode_valid,
834         .best_encoder = radeon_best_single_encoder,
835 };
836
837 struct drm_connector_funcs radeon_tv_connector_funcs = {
838         .dpms = drm_helper_connector_dpms,
839         .detect = radeon_tv_detect,
840         .fill_modes = drm_helper_probe_single_connector_modes,
841         .destroy = radeon_connector_destroy,
842         .set_property = radeon_connector_set_property,
843 };
844
845 static int radeon_dvi_get_modes(struct drm_connector *connector)
846 {
847         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
848         int ret;
849
850         ret = radeon_ddc_get_modes(radeon_connector);
851         return ret;
852 }
853
854 /*
855  * DVI is complicated
856  * Do a DDC probe, if DDC probe passes, get the full EDID so
857  * we can do analog/digital monitor detection at this point.
858  * If the monitor is an analog monitor or we got no DDC,
859  * we need to find the DAC encoder object for this connector.
860  * If we got no DDC, we do load detection on the DAC encoder object.
861  * If we got analog DDC or load detection passes on the DAC encoder
862  * we have to check if this analog encoder is shared with anyone else (TV)
863  * if its shared we have to set the other connector to disconnected.
864  */
865 static enum drm_connector_status
866 radeon_dvi_detect(struct drm_connector *connector, bool force)
867 {
868         struct drm_device *dev = connector->dev;
869         struct radeon_device *rdev = dev->dev_private;
870         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
871         struct drm_encoder *encoder = NULL;
872         struct drm_encoder_helper_funcs *encoder_funcs;
873         struct drm_mode_object *obj;
874         int i;
875         enum drm_connector_status ret = connector_status_disconnected;
876         bool dret = false;
877
878         if (radeon_connector->ddc_bus)
879                 dret = radeon_ddc_probe(radeon_connector, false);
880         if (dret) {
881                 radeon_connector->detected_by_load = false;
882                 if (radeon_connector->edid) {
883                         kfree(radeon_connector->edid);
884                         radeon_connector->edid = NULL;
885                 }
886                 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
887
888                 if (!radeon_connector->edid) {
889                         DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
890                                         drm_get_connector_name(connector));
891                         /* rs690 seems to have a problem with connectors not existing and always
892                          * return a block of 0's. If we see this just stop polling on this output */
893                         if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) {
894                                 ret = connector_status_disconnected;
895                                 DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", drm_get_connector_name(connector));
896                                 radeon_connector->ddc_bus = NULL;
897                         }
898                 } else {
899                         radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
900
901                         /* some oems have boards with separate digital and analog connectors
902                          * with a shared ddc line (often vga + hdmi)
903                          */
904                         if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) {
905                                 kfree(radeon_connector->edid);
906                                 radeon_connector->edid = NULL;
907                                 ret = connector_status_disconnected;
908                         } else
909                                 ret = connector_status_connected;
910
911                         /* This gets complicated.  We have boards with VGA + HDMI with a
912                          * shared DDC line and we have boards with DVI-D + HDMI with a shared
913                          * DDC line.  The latter is more complex because with DVI<->HDMI adapters
914                          * you don't really know what's connected to which port as both are digital.
915                          */
916                         if (radeon_connector->shared_ddc && (ret == connector_status_connected)) {
917                                 struct drm_connector *list_connector;
918                                 struct radeon_connector *list_radeon_connector;
919                                 list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {
920                                         if (connector == list_connector)
921                                                 continue;
922                                         list_radeon_connector = to_radeon_connector(list_connector);
923                                         if (list_radeon_connector->shared_ddc &&
924                                             (list_radeon_connector->ddc_bus->rec.i2c_id ==
925                                              radeon_connector->ddc_bus->rec.i2c_id)) {
926                                                 /* cases where both connectors are digital */
927                                                 if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) {
928                                                         /* hpd is our only option in this case */
929                                                         if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
930                                                                 kfree(radeon_connector->edid);
931                                                                 radeon_connector->edid = NULL;
932                                                                 ret = connector_status_disconnected;
933                                                         }
934                                                 }
935                                         }
936                                 }
937                         }
938                 }
939         }
940
941         if ((ret == connector_status_connected) && (radeon_connector->use_digital == true))
942                 goto out;
943
944         /* DVI-D and HDMI-A are digital only */
945         if ((connector->connector_type == DRM_MODE_CONNECTOR_DVID) ||
946             (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA))
947                 goto out;
948
949         /* if we aren't forcing don't do destructive polling */
950         if (!force) {
951                 /* only return the previous status if we last
952                  * detected a monitor via load.
953                  */
954                 if (radeon_connector->detected_by_load)
955                         ret = connector->status;
956                 goto out;
957         }
958
959         /* find analog encoder */
960         if (radeon_connector->dac_load_detect) {
961                 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
962                         if (connector->encoder_ids[i] == 0)
963                                 break;
964
965                         obj = drm_mode_object_find(connector->dev,
966                                                    connector->encoder_ids[i],
967                                                    DRM_MODE_OBJECT_ENCODER);
968                         if (!obj)
969                                 continue;
970
971                         encoder = obj_to_encoder(obj);
972
973                         if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
974                             encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
975                                 continue;
976
977                         encoder_funcs = encoder->helper_private;
978                         if (encoder_funcs->detect) {
979                                 if (ret != connector_status_connected) {
980                                         ret = encoder_funcs->detect(encoder, connector);
981                                         if (ret == connector_status_connected) {
982                                                 radeon_connector->use_digital = false;
983                                         }
984                                         if (ret != connector_status_disconnected)
985                                                 radeon_connector->detected_by_load = true;
986                                 }
987                                 break;
988                         }
989                 }
990         }
991
992         if ((ret == connector_status_connected) && (radeon_connector->use_digital == false) &&
993             encoder) {
994                 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
995         }
996
997         /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
998          * vbios to deal with KVMs. If we have one and are not able to detect a monitor
999          * by other means, assume the DFP is connected and use that EDID.  In most
1000          * cases the DVI port is actually a virtual KVM port connected to the service
1001          * processor.
1002          */
1003 out:
1004         if ((!rdev->is_atom_bios) &&
1005             (ret == connector_status_disconnected) &&
1006             rdev->mode_info.bios_hardcoded_edid_size) {
1007                 radeon_connector->use_digital = true;
1008                 ret = connector_status_connected;
1009         }
1010
1011         /* updated in get modes as well since we need to know if it's analog or digital */
1012         radeon_connector_update_scratch_regs(connector, ret);
1013         return ret;
1014 }
1015
1016 /* okay need to be smart in here about which encoder to pick */
1017 struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
1018 {
1019         int enc_id = connector->encoder_ids[0];
1020         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1021         struct drm_mode_object *obj;
1022         struct drm_encoder *encoder;
1023         int i;
1024         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1025                 if (connector->encoder_ids[i] == 0)
1026                         break;
1027
1028                 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1029                 if (!obj)
1030                         continue;
1031
1032                 encoder = obj_to_encoder(obj);
1033
1034                 if (radeon_connector->use_digital == true) {
1035                         if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
1036                                 return encoder;
1037                 } else {
1038                         if (encoder->encoder_type == DRM_MODE_ENCODER_DAC ||
1039                             encoder->encoder_type == DRM_MODE_ENCODER_TVDAC)
1040                                 return encoder;
1041                 }
1042         }
1043
1044         /* see if we have a default encoder  TODO */
1045
1046         /* then check use digitial */
1047         /* pick the first one */
1048         if (enc_id) {
1049                 obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
1050                 if (!obj)
1051                         return NULL;
1052                 encoder = obj_to_encoder(obj);
1053                 return encoder;
1054         }
1055         return NULL;
1056 }
1057
1058 static void radeon_dvi_force(struct drm_connector *connector)
1059 {
1060         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1061         if (connector->force == DRM_FORCE_ON)
1062                 radeon_connector->use_digital = false;
1063         if (connector->force == DRM_FORCE_ON_DIGITAL)
1064                 radeon_connector->use_digital = true;
1065 }
1066
1067 static int radeon_dvi_mode_valid(struct drm_connector *connector,
1068                                   struct drm_display_mode *mode)
1069 {
1070         struct drm_device *dev = connector->dev;
1071         struct radeon_device *rdev = dev->dev_private;
1072         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1073
1074         /* XXX check mode bandwidth */
1075
1076         /* clocks over 135 MHz have heat issues with DVI on RV100 */
1077         if (radeon_connector->use_digital &&
1078             (rdev->family == CHIP_RV100) &&
1079             (mode->clock > 135000))
1080                 return MODE_CLOCK_HIGH;
1081
1082         if (radeon_connector->use_digital && (mode->clock > 165000)) {
1083                 if ((radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) ||
1084                     (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
1085                     (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
1086                         return MODE_OK;
1087                 else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) {
1088                         if (ASIC_IS_DCE3(rdev)) {
1089                                 /* HDMI 1.3+ supports max clock of 340 Mhz */
1090                                 if (mode->clock > 340000)
1091                                         return MODE_CLOCK_HIGH;
1092                                 else
1093                                         return MODE_OK;
1094                         } else
1095                                 return MODE_CLOCK_HIGH;
1096                 } else
1097                         return MODE_CLOCK_HIGH;
1098         }
1099
1100         /* check against the max pixel clock */
1101         if ((mode->clock / 10) > rdev->clock.max_pixel_clock)
1102                 return MODE_CLOCK_HIGH;
1103
1104         return MODE_OK;
1105 }
1106
1107 struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = {
1108         .get_modes = radeon_dvi_get_modes,
1109         .mode_valid = radeon_dvi_mode_valid,
1110         .best_encoder = radeon_dvi_encoder,
1111 };
1112
1113 struct drm_connector_funcs radeon_dvi_connector_funcs = {
1114         .dpms = drm_helper_connector_dpms,
1115         .detect = radeon_dvi_detect,
1116         .fill_modes = drm_helper_probe_single_connector_modes,
1117         .set_property = radeon_connector_set_property,
1118         .destroy = radeon_connector_destroy,
1119         .force = radeon_dvi_force,
1120 };
1121
1122 static void radeon_dp_connector_destroy(struct drm_connector *connector)
1123 {
1124         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1125         struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1126
1127         if (radeon_connector->edid)
1128                 kfree(radeon_connector->edid);
1129         if (radeon_dig_connector->dp_i2c_bus)
1130                 radeon_i2c_destroy(radeon_dig_connector->dp_i2c_bus);
1131         kfree(radeon_connector->con_priv);
1132         drm_sysfs_connector_remove(connector);
1133         drm_connector_cleanup(connector);
1134         kfree(connector);
1135 }
1136
1137 static int radeon_dp_get_modes(struct drm_connector *connector)
1138 {
1139         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1140         struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1141         struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1142         int ret;
1143
1144         if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1145             (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1146                 struct drm_display_mode *mode;
1147
1148                 if (!radeon_dig_connector->edp_on)
1149                         atombios_set_edp_panel_power(connector,
1150                                                      ATOM_TRANSMITTER_ACTION_POWER_ON);
1151                 ret = radeon_ddc_get_modes(radeon_connector);
1152                 if (!radeon_dig_connector->edp_on)
1153                         atombios_set_edp_panel_power(connector,
1154                                                      ATOM_TRANSMITTER_ACTION_POWER_OFF);
1155
1156                 if (ret > 0) {
1157                         if (encoder) {
1158                                 radeon_fixup_lvds_native_mode(encoder, connector);
1159                                 /* add scaled modes */
1160                                 radeon_add_common_modes(encoder, connector);
1161                         }
1162                         return ret;
1163                 }
1164
1165                 encoder = radeon_best_single_encoder(connector);
1166                 if (!encoder)
1167                         return 0;
1168
1169                 /* we have no EDID modes */
1170                 mode = radeon_fp_native_mode(encoder);
1171                 if (mode) {
1172                         ret = 1;
1173                         drm_mode_probed_add(connector, mode);
1174                         /* add the width/height from vbios tables if available */
1175                         connector->display_info.width_mm = mode->width_mm;
1176                         connector->display_info.height_mm = mode->height_mm;
1177                         /* add scaled modes */
1178                         radeon_add_common_modes(encoder, connector);
1179                 }
1180         } else {
1181                 /* need to setup ddc on the bridge */
1182                 if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
1183                         ENCODER_OBJECT_ID_NONE) {
1184                         if (encoder)
1185                                 radeon_atom_ext_encoder_setup_ddc(encoder);
1186                 }
1187                 ret = radeon_ddc_get_modes(radeon_connector);
1188         }
1189
1190         return ret;
1191 }
1192
1193 u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector)
1194 {
1195         struct drm_mode_object *obj;
1196         struct drm_encoder *encoder;
1197         struct radeon_encoder *radeon_encoder;
1198         int i;
1199
1200         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1201                 if (connector->encoder_ids[i] == 0)
1202                         break;
1203
1204                 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1205                 if (!obj)
1206                         continue;
1207
1208                 encoder = obj_to_encoder(obj);
1209                 radeon_encoder = to_radeon_encoder(encoder);
1210
1211                 switch (radeon_encoder->encoder_id) {
1212                 case ENCODER_OBJECT_ID_TRAVIS:
1213                 case ENCODER_OBJECT_ID_NUTMEG:
1214                         return radeon_encoder->encoder_id;
1215                 default:
1216                         break;
1217                 }
1218         }
1219
1220         return ENCODER_OBJECT_ID_NONE;
1221 }
1222
1223 bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
1224 {
1225         struct drm_mode_object *obj;
1226         struct drm_encoder *encoder;
1227         struct radeon_encoder *radeon_encoder;
1228         int i;
1229         bool found = false;
1230
1231         for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1232                 if (connector->encoder_ids[i] == 0)
1233                         break;
1234
1235                 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1236                 if (!obj)
1237                         continue;
1238
1239                 encoder = obj_to_encoder(obj);
1240                 radeon_encoder = to_radeon_encoder(encoder);
1241                 if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
1242                         found = true;
1243         }
1244
1245         return found;
1246 }
1247
1248 bool radeon_connector_is_dp12_capable(struct drm_connector *connector)
1249 {
1250         struct drm_device *dev = connector->dev;
1251         struct radeon_device *rdev = dev->dev_private;
1252
1253         if (ASIC_IS_DCE5(rdev) &&
1254             (rdev->clock.default_dispclk >= 53900) &&
1255             radeon_connector_encoder_is_hbr2(connector)) {
1256                 return true;
1257         }
1258
1259         return false;
1260 }
1261
1262 static enum drm_connector_status
1263 radeon_dp_detect(struct drm_connector *connector, bool force)
1264 {
1265         struct drm_device *dev = connector->dev;
1266         struct radeon_device *rdev = dev->dev_private;
1267         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1268         enum drm_connector_status ret = connector_status_disconnected;
1269         struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1270         struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1271
1272         if (radeon_connector->edid) {
1273                 kfree(radeon_connector->edid);
1274                 radeon_connector->edid = NULL;
1275         }
1276
1277         if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1278             (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1279                 if (encoder) {
1280                         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1281                         struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
1282
1283                         /* check if panel is valid */
1284                         if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
1285                                 ret = connector_status_connected;
1286                 }
1287                 /* eDP is always DP */
1288                 radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
1289                 if (!radeon_dig_connector->edp_on)
1290                         atombios_set_edp_panel_power(connector,
1291                                                      ATOM_TRANSMITTER_ACTION_POWER_ON);
1292                 if (radeon_dp_getdpcd(radeon_connector))
1293                         ret = connector_status_connected;
1294                 if (!radeon_dig_connector->edp_on)
1295                         atombios_set_edp_panel_power(connector,
1296                                                      ATOM_TRANSMITTER_ACTION_POWER_OFF);
1297         } else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
1298                    ENCODER_OBJECT_ID_NONE) {
1299                 /* DP bridges are always DP */
1300                 radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
1301                 /* get the DPCD from the bridge */
1302                 radeon_dp_getdpcd(radeon_connector);
1303
1304                 if (encoder) {
1305                         /* setup ddc on the bridge */
1306                         radeon_atom_ext_encoder_setup_ddc(encoder);
1307                         /* bridge chips are always aux */
1308                         if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */
1309                                 ret = connector_status_connected;
1310                         else if (radeon_connector->dac_load_detect) { /* try load detection */
1311                                 struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
1312                                 ret = encoder_funcs->detect(encoder, connector);
1313                         }
1314                 }
1315         } else {
1316                 radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
1317                 if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
1318                         ret = connector_status_connected;
1319                         if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT)
1320                                 radeon_dp_getdpcd(radeon_connector);
1321                 } else {
1322                         if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
1323                                 if (radeon_dp_getdpcd(radeon_connector))
1324                                         ret = connector_status_connected;
1325                         } else {
1326                                 /* try non-aux ddc (DP to DVI/HMDI/etc. adapter) */
1327                                 if (radeon_ddc_probe(radeon_connector, false))
1328                                         ret = connector_status_connected;
1329                         }
1330                 }
1331         }
1332
1333         radeon_connector_update_scratch_regs(connector, ret);
1334         return ret;
1335 }
1336
1337 static int radeon_dp_mode_valid(struct drm_connector *connector,
1338                                   struct drm_display_mode *mode)
1339 {
1340         struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1341         struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1342
1343         /* XXX check mode bandwidth */
1344
1345         if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1346             (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1347                 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1348
1349                 if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
1350                         return MODE_PANEL;
1351
1352                 if (encoder) {
1353                         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1354                         struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
1355
1356                         /* AVIVO hardware supports downscaling modes larger than the panel
1357                          * to the panel size, but I'm not sure this is desirable.
1358                          */
1359                         if ((mode->hdisplay > native_mode->hdisplay) ||
1360                             (mode->vdisplay > native_mode->vdisplay))
1361                                 return MODE_PANEL;
1362
1363                         /* if scaling is disabled, block non-native modes */
1364                         if (radeon_encoder->rmx_type == RMX_OFF) {
1365                                 if ((mode->hdisplay != native_mode->hdisplay) ||
1366                                     (mode->vdisplay != native_mode->vdisplay))
1367                                         return MODE_PANEL;
1368                         }
1369                 }
1370                 return MODE_OK;
1371         } else {
1372                 if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
1373                     (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
1374                         return radeon_dp_mode_valid_helper(connector, mode);
1375                 else
1376                         return MODE_OK;
1377         }
1378 }
1379
1380 struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = {
1381         .get_modes = radeon_dp_get_modes,
1382         .mode_valid = radeon_dp_mode_valid,
1383         .best_encoder = radeon_dvi_encoder,
1384 };
1385
1386 struct drm_connector_funcs radeon_dp_connector_funcs = {
1387         .dpms = drm_helper_connector_dpms,
1388         .detect = radeon_dp_detect,
1389         .fill_modes = drm_helper_probe_single_connector_modes,
1390         .set_property = radeon_connector_set_property,
1391         .destroy = radeon_dp_connector_destroy,
1392         .force = radeon_dvi_force,
1393 };
1394
1395 static const struct drm_connector_funcs radeon_edp_connector_funcs = {
1396         .dpms = drm_helper_connector_dpms,
1397         .detect = radeon_dp_detect,
1398         .fill_modes = drm_helper_probe_single_connector_modes,
1399         .set_property = radeon_lvds_set_property,
1400         .destroy = radeon_dp_connector_destroy,
1401         .force = radeon_dvi_force,
1402 };
1403
1404 static const struct drm_connector_funcs radeon_lvds_bridge_connector_funcs = {
1405         .dpms = drm_helper_connector_dpms,
1406         .detect = radeon_dp_detect,
1407         .fill_modes = drm_helper_probe_single_connector_modes,
1408         .set_property = radeon_lvds_set_property,
1409         .destroy = radeon_dp_connector_destroy,
1410         .force = radeon_dvi_force,
1411 };
1412
1413 void
1414 radeon_add_atom_connector(struct drm_device *dev,
1415                           uint32_t connector_id,
1416                           uint32_t supported_device,
1417                           int connector_type,
1418                           struct radeon_i2c_bus_rec *i2c_bus,
1419                           uint32_t igp_lane_info,
1420                           uint16_t connector_object_id,
1421                           struct radeon_hpd *hpd,
1422                           struct radeon_router *router)
1423 {
1424         struct radeon_device *rdev = dev->dev_private;
1425         struct drm_connector *connector;
1426         struct radeon_connector *radeon_connector;
1427         struct radeon_connector_atom_dig *radeon_dig_connector;
1428         struct drm_encoder *encoder;
1429         struct radeon_encoder *radeon_encoder;
1430         uint32_t subpixel_order = SubPixelNone;
1431         bool shared_ddc = false;
1432         bool is_dp_bridge = false;
1433
1434         if (connector_type == DRM_MODE_CONNECTOR_Unknown)
1435                 return;
1436
1437         /* if the user selected tv=0 don't try and add the connector */
1438         if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
1439              (connector_type == DRM_MODE_CONNECTOR_Composite) ||
1440              (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
1441             (radeon_tv == 0))
1442                 return;
1443
1444         /* see if we already added it */
1445         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1446                 radeon_connector = to_radeon_connector(connector);
1447                 if (radeon_connector->connector_id == connector_id) {
1448                         radeon_connector->devices |= supported_device;
1449                         return;
1450                 }
1451                 if (radeon_connector->ddc_bus && i2c_bus->valid) {
1452                         if (radeon_connector->ddc_bus->rec.i2c_id == i2c_bus->i2c_id) {
1453                                 radeon_connector->shared_ddc = true;
1454                                 shared_ddc = true;
1455                         }
1456                         if (radeon_connector->router_bus && router->ddc_valid &&
1457                             (radeon_connector->router.router_id == router->router_id)) {
1458                                 radeon_connector->shared_ddc = false;
1459                                 shared_ddc = false;
1460                         }
1461                 }
1462         }
1463
1464         /* check if it's a dp bridge */
1465         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
1466                 radeon_encoder = to_radeon_encoder(encoder);
1467                 if (radeon_encoder->devices & supported_device) {
1468                         switch (radeon_encoder->encoder_id) {
1469                         case ENCODER_OBJECT_ID_TRAVIS:
1470                         case ENCODER_OBJECT_ID_NUTMEG:
1471                                 is_dp_bridge = true;
1472                                 break;
1473                         default:
1474                                 break;
1475                         }
1476                 }
1477         }
1478
1479         radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
1480         if (!radeon_connector)
1481                 return;
1482
1483         connector = &radeon_connector->base;
1484
1485         radeon_connector->connector_id = connector_id;
1486         radeon_connector->devices = supported_device;
1487         radeon_connector->shared_ddc = shared_ddc;
1488         radeon_connector->connector_object_id = connector_object_id;
1489         radeon_connector->hpd = *hpd;
1490
1491         radeon_connector->router = *router;
1492         if (router->ddc_valid || router->cd_valid) {
1493                 radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info);
1494                 if (!radeon_connector->router_bus)
1495                         DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n");
1496         }
1497
1498         if (is_dp_bridge) {
1499                 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1500                 if (!radeon_dig_connector)
1501                         goto failed;
1502                 radeon_dig_connector->igp_lane_info = igp_lane_info;
1503                 radeon_connector->con_priv = radeon_dig_connector;
1504                 if (i2c_bus->valid) {
1505                         /* add DP i2c bus */
1506                         if (connector_type == DRM_MODE_CONNECTOR_eDP)
1507                                 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch");
1508                         else
1509                                 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch");
1510                         if (!radeon_dig_connector->dp_i2c_bus)
1511                                 DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1512                         radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1513                         if (!radeon_connector->ddc_bus)
1514                                 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1515                 }
1516                 switch (connector_type) {
1517                 case DRM_MODE_CONNECTOR_VGA:
1518                 case DRM_MODE_CONNECTOR_DVIA:
1519                 default:
1520                         drm_connector_init(dev, &radeon_connector->base,
1521                                            &radeon_dp_connector_funcs, connector_type);
1522                         drm_connector_helper_add(&radeon_connector->base,
1523                                                  &radeon_dp_connector_helper_funcs);
1524                         connector->interlace_allowed = true;
1525                         connector->doublescan_allowed = true;
1526                         radeon_connector->dac_load_detect = true;
1527                         drm_connector_attach_property(&radeon_connector->base,
1528                                                       rdev->mode_info.load_detect_property,
1529                                                       1);
1530                         break;
1531                 case DRM_MODE_CONNECTOR_DVII:
1532                 case DRM_MODE_CONNECTOR_DVID:
1533                 case DRM_MODE_CONNECTOR_HDMIA:
1534                 case DRM_MODE_CONNECTOR_HDMIB:
1535                 case DRM_MODE_CONNECTOR_DisplayPort:
1536                         drm_connector_init(dev, &radeon_connector->base,
1537                                            &radeon_dp_connector_funcs, connector_type);
1538                         drm_connector_helper_add(&radeon_connector->base,
1539                                                  &radeon_dp_connector_helper_funcs);
1540                         drm_connector_attach_property(&radeon_connector->base,
1541                                                       rdev->mode_info.underscan_property,
1542                                                       UNDERSCAN_OFF);
1543                         drm_connector_attach_property(&radeon_connector->base,
1544                                                       rdev->mode_info.underscan_hborder_property,
1545                                                       0);
1546                         drm_connector_attach_property(&radeon_connector->base,
1547                                                       rdev->mode_info.underscan_vborder_property,
1548                                                       0);
1549                         subpixel_order = SubPixelHorizontalRGB;
1550                         connector->interlace_allowed = true;
1551                         if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
1552                                 connector->doublescan_allowed = true;
1553                         else
1554                                 connector->doublescan_allowed = false;
1555                         if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1556                                 radeon_connector->dac_load_detect = true;
1557                                 drm_connector_attach_property(&radeon_connector->base,
1558                                                               rdev->mode_info.load_detect_property,
1559                                                               1);
1560                         }
1561                         break;
1562                 case DRM_MODE_CONNECTOR_LVDS:
1563                 case DRM_MODE_CONNECTOR_eDP:
1564                         drm_connector_init(dev, &radeon_connector->base,
1565                                            &radeon_lvds_bridge_connector_funcs, connector_type);
1566                         drm_connector_helper_add(&radeon_connector->base,
1567                                                  &radeon_dp_connector_helper_funcs);
1568                         drm_connector_attach_property(&radeon_connector->base,
1569                                                       dev->mode_config.scaling_mode_property,
1570                                                       DRM_MODE_SCALE_FULLSCREEN);
1571                         subpixel_order = SubPixelHorizontalRGB;
1572                         connector->interlace_allowed = false;
1573                         connector->doublescan_allowed = false;
1574                         break;
1575                 }
1576         } else {
1577                 switch (connector_type) {
1578                 case DRM_MODE_CONNECTOR_VGA:
1579                         drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1580                         drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1581                         if (i2c_bus->valid) {
1582                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1583                                 if (!radeon_connector->ddc_bus)
1584                                         DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1585                         }
1586                         radeon_connector->dac_load_detect = true;
1587                         drm_connector_attach_property(&radeon_connector->base,
1588                                                       rdev->mode_info.load_detect_property,
1589                                                       1);
1590                         /* no HPD on analog connectors */
1591                         radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1592                         connector->interlace_allowed = true;
1593                         connector->doublescan_allowed = true;
1594                         break;
1595                 case DRM_MODE_CONNECTOR_DVIA:
1596                         drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1597                         drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1598                         if (i2c_bus->valid) {
1599                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1600                                 if (!radeon_connector->ddc_bus)
1601                                         DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1602                         }
1603                         radeon_connector->dac_load_detect = true;
1604                         drm_connector_attach_property(&radeon_connector->base,
1605                                                       rdev->mode_info.load_detect_property,
1606                                                       1);
1607                         /* no HPD on analog connectors */
1608                         radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1609                         connector->interlace_allowed = true;
1610                         connector->doublescan_allowed = true;
1611                         break;
1612                 case DRM_MODE_CONNECTOR_DVII:
1613                 case DRM_MODE_CONNECTOR_DVID:
1614                         radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1615                         if (!radeon_dig_connector)
1616                                 goto failed;
1617                         radeon_dig_connector->igp_lane_info = igp_lane_info;
1618                         radeon_connector->con_priv = radeon_dig_connector;
1619                         drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
1620                         drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
1621                         if (i2c_bus->valid) {
1622                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1623                                 if (!radeon_connector->ddc_bus)
1624                                         DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1625                         }
1626                         subpixel_order = SubPixelHorizontalRGB;
1627                         drm_connector_attach_property(&radeon_connector->base,
1628                                                       rdev->mode_info.coherent_mode_property,
1629                                                       1);
1630                         if (ASIC_IS_AVIVO(rdev)) {
1631                                 drm_connector_attach_property(&radeon_connector->base,
1632                                                               rdev->mode_info.underscan_property,
1633                                                               UNDERSCAN_OFF);
1634                                 drm_connector_attach_property(&radeon_connector->base,
1635                                                               rdev->mode_info.underscan_hborder_property,
1636                                                               0);
1637                                 drm_connector_attach_property(&radeon_connector->base,
1638                                                               rdev->mode_info.underscan_vborder_property,
1639                                                               0);
1640                         }
1641                         if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1642                                 radeon_connector->dac_load_detect = true;
1643                                 drm_connector_attach_property(&radeon_connector->base,
1644                                                               rdev->mode_info.load_detect_property,
1645                                                               1);
1646                         }
1647                         connector->interlace_allowed = true;
1648                         if (connector_type == DRM_MODE_CONNECTOR_DVII)
1649                                 connector->doublescan_allowed = true;
1650                         else
1651                                 connector->doublescan_allowed = false;
1652                         break;
1653                 case DRM_MODE_CONNECTOR_HDMIA:
1654                 case DRM_MODE_CONNECTOR_HDMIB:
1655                         radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1656                         if (!radeon_dig_connector)
1657                                 goto failed;
1658                         radeon_dig_connector->igp_lane_info = igp_lane_info;
1659                         radeon_connector->con_priv = radeon_dig_connector;
1660                         drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
1661                         drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
1662                         if (i2c_bus->valid) {
1663                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1664                                 if (!radeon_connector->ddc_bus)
1665                                         DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1666                         }
1667                         drm_connector_attach_property(&radeon_connector->base,
1668                                                       rdev->mode_info.coherent_mode_property,
1669                                                       1);
1670                         if (ASIC_IS_AVIVO(rdev)) {
1671                                 drm_connector_attach_property(&radeon_connector->base,
1672                                                               rdev->mode_info.underscan_property,
1673                                                               UNDERSCAN_OFF);
1674                                 drm_connector_attach_property(&radeon_connector->base,
1675                                                               rdev->mode_info.underscan_hborder_property,
1676                                                               0);
1677                                 drm_connector_attach_property(&radeon_connector->base,
1678                                                               rdev->mode_info.underscan_vborder_property,
1679                                                               0);
1680                         }
1681                         subpixel_order = SubPixelHorizontalRGB;
1682                         connector->interlace_allowed = true;
1683                         if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
1684                                 connector->doublescan_allowed = true;
1685                         else
1686                                 connector->doublescan_allowed = false;
1687                         break;
1688                 case DRM_MODE_CONNECTOR_DisplayPort:
1689                         radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1690                         if (!radeon_dig_connector)
1691                                 goto failed;
1692                         radeon_dig_connector->igp_lane_info = igp_lane_info;
1693                         radeon_connector->con_priv = radeon_dig_connector;
1694                         drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
1695                         drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
1696                         if (i2c_bus->valid) {
1697                                 /* add DP i2c bus */
1698                                 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch");
1699                                 if (!radeon_dig_connector->dp_i2c_bus)
1700                                         DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1701                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1702                                 if (!radeon_connector->ddc_bus)
1703                                         DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1704                         }
1705                         subpixel_order = SubPixelHorizontalRGB;
1706                         drm_connector_attach_property(&radeon_connector->base,
1707                                                       rdev->mode_info.coherent_mode_property,
1708                                                       1);
1709                         if (ASIC_IS_AVIVO(rdev)) {
1710                                 drm_connector_attach_property(&radeon_connector->base,
1711                                                               rdev->mode_info.underscan_property,
1712                                                               UNDERSCAN_OFF);
1713                                 drm_connector_attach_property(&radeon_connector->base,
1714                                                               rdev->mode_info.underscan_hborder_property,
1715                                                               0);
1716                                 drm_connector_attach_property(&radeon_connector->base,
1717                                                               rdev->mode_info.underscan_vborder_property,
1718                                                               0);
1719                         }
1720                         connector->interlace_allowed = true;
1721                         /* in theory with a DP to VGA converter... */
1722                         connector->doublescan_allowed = false;
1723                         break;
1724                 case DRM_MODE_CONNECTOR_eDP:
1725                         radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1726                         if (!radeon_dig_connector)
1727                                 goto failed;
1728                         radeon_dig_connector->igp_lane_info = igp_lane_info;
1729                         radeon_connector->con_priv = radeon_dig_connector;
1730                         drm_connector_init(dev, &radeon_connector->base, &radeon_edp_connector_funcs, connector_type);
1731                         drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
1732                         if (i2c_bus->valid) {
1733                                 /* add DP i2c bus */
1734                                 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch");
1735                                 if (!radeon_dig_connector->dp_i2c_bus)
1736                                         DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1737                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1738                                 if (!radeon_connector->ddc_bus)
1739                                         DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1740                         }
1741                         drm_connector_attach_property(&radeon_connector->base,
1742                                                       dev->mode_config.scaling_mode_property,
1743                                                       DRM_MODE_SCALE_FULLSCREEN);
1744                         subpixel_order = SubPixelHorizontalRGB;
1745                         connector->interlace_allowed = false;
1746                         connector->doublescan_allowed = false;
1747                         break;
1748                 case DRM_MODE_CONNECTOR_SVIDEO:
1749                 case DRM_MODE_CONNECTOR_Composite:
1750                 case DRM_MODE_CONNECTOR_9PinDIN:
1751                         drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
1752                         drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
1753                         radeon_connector->dac_load_detect = true;
1754                         drm_connector_attach_property(&radeon_connector->base,
1755                                                       rdev->mode_info.load_detect_property,
1756                                                       1);
1757                         drm_connector_attach_property(&radeon_connector->base,
1758                                                       rdev->mode_info.tv_std_property,
1759                                                       radeon_atombios_get_tv_info(rdev));
1760                         /* no HPD on analog connectors */
1761                         radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1762                         connector->interlace_allowed = false;
1763                         connector->doublescan_allowed = false;
1764                         break;
1765                 case DRM_MODE_CONNECTOR_LVDS:
1766                         radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1767                         if (!radeon_dig_connector)
1768                                 goto failed;
1769                         radeon_dig_connector->igp_lane_info = igp_lane_info;
1770                         radeon_connector->con_priv = radeon_dig_connector;
1771                         drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
1772                         drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
1773                         if (i2c_bus->valid) {
1774                                 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1775                                 if (!radeon_connector->ddc_bus)
1776                                         DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1777                         }
1778                         drm_connector_attach_property(&radeon_connector->base,
1779                                                       dev->mode_config.scaling_mode_property,
1780                                                       DRM_MODE_SCALE_FULLSCREEN);
1781                         subpixel_order = SubPixelHorizontalRGB;
1782                         connector->interlace_allowed = false;
1783                         connector->doublescan_allowed = false;
1784                         break;
1785                 }
1786         }
1787
1788         if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
1789                 if (i2c_bus->valid) {
1790                         connector->polled = DRM_CONNECTOR_POLL_CONNECT |
1791                                             DRM_CONNECTOR_POLL_DISCONNECT;
1792                 }
1793         } else
1794                 connector->polled = DRM_CONNECTOR_POLL_HPD;
1795
1796         connector->display_info.subpixel_order = subpixel_order;
1797         drm_sysfs_connector_add(connector);
1798         return;
1799
1800 failed:
1801         drm_connector_cleanup(connector);
1802         kfree(connector);
1803 }
1804
1805 void
1806 radeon_add_legacy_connector(struct drm_device *dev,
1807                             uint32_t connector_id,
1808                             uint32_t supported_device,
1809                             int connector_type,
1810                             struct radeon_i2c_bus_rec *i2c_bus,
1811                             uint16_t connector_object_id,
1812                             struct radeon_hpd *hpd)
1813 {
1814         struct radeon_device *rdev = dev->dev_private;
1815         struct drm_connector *connector;
1816         struct radeon_connector *radeon_connector;
1817         uint32_t subpixel_order = SubPixelNone;
1818
1819         if (connector_type == DRM_MODE_CONNECTOR_Unknown)
1820                 return;
1821
1822         /* if the user selected tv=0 don't try and add the connector */
1823         if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
1824              (connector_type == DRM_MODE_CONNECTOR_Composite) ||
1825              (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
1826             (radeon_tv == 0))
1827                 return;
1828
1829         /* see if we already added it */
1830         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1831                 radeon_connector = to_radeon_connector(connector);
1832                 if (radeon_connector->connector_id == connector_id) {
1833                         radeon_connector->devices |= supported_device;
1834                         return;
1835                 }
1836         }
1837
1838         radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
1839         if (!radeon_connector)
1840                 return;
1841
1842         connector = &radeon_connector->base;
1843
1844         radeon_connector->connector_id = connector_id;
1845         radeon_connector->devices = supported_device;
1846         radeon_connector->connector_object_id = connector_object_id;
1847         radeon_connector->hpd = *hpd;
1848
1849         switch (connector_type) {
1850         case DRM_MODE_CONNECTOR_VGA:
1851                 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1852                 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1853                 if (i2c_bus->valid) {
1854                         radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1855                         if (!radeon_connector->ddc_bus)
1856                                 DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1857                 }
1858                 radeon_connector->dac_load_detect = true;
1859                 drm_connector_attach_property(&radeon_connector->base,
1860                                               rdev->mode_info.load_detect_property,
1861                                               1);
1862                 /* no HPD on analog connectors */
1863                 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1864                 connector->interlace_allowed = true;
1865                 connector->doublescan_allowed = true;
1866                 break;
1867         case DRM_MODE_CONNECTOR_DVIA:
1868                 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1869                 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1870                 if (i2c_bus->valid) {
1871                         radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1872                         if (!radeon_connector->ddc_bus)
1873                                 DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1874                 }
1875                 radeon_connector->dac_load_detect = true;
1876                 drm_connector_attach_property(&radeon_connector->base,
1877                                               rdev->mode_info.load_detect_property,
1878                                               1);
1879                 /* no HPD on analog connectors */
1880                 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1881                 connector->interlace_allowed = true;
1882                 connector->doublescan_allowed = true;
1883                 break;
1884         case DRM_MODE_CONNECTOR_DVII:
1885         case DRM_MODE_CONNECTOR_DVID:
1886                 drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
1887                 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
1888                 if (i2c_bus->valid) {
1889                         radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1890                         if (!radeon_connector->ddc_bus)
1891                                 DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1892                 }
1893                 if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1894                         radeon_connector->dac_load_detect = true;
1895                         drm_connector_attach_property(&radeon_connector->base,
1896                                                       rdev->mode_info.load_detect_property,
1897                                                       1);
1898                 }
1899                 subpixel_order = SubPixelHorizontalRGB;
1900                 connector->interlace_allowed = true;
1901                 if (connector_type == DRM_MODE_CONNECTOR_DVII)
1902                         connector->doublescan_allowed = true;
1903                 else
1904                         connector->doublescan_allowed = false;
1905                 break;
1906         case DRM_MODE_CONNECTOR_SVIDEO:
1907         case DRM_MODE_CONNECTOR_Composite:
1908         case DRM_MODE_CONNECTOR_9PinDIN:
1909                 drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
1910                 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
1911                 radeon_connector->dac_load_detect = true;
1912                 /* RS400,RC410,RS480 chipset seems to report a lot
1913                  * of false positive on load detect, we haven't yet
1914                  * found a way to make load detect reliable on those
1915                  * chipset, thus just disable it for TV.
1916                  */
1917                 if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480)
1918                         radeon_connector->dac_load_detect = false;
1919                 drm_connector_attach_property(&radeon_connector->base,
1920                                               rdev->mode_info.load_detect_property,
1921                                               radeon_connector->dac_load_detect);
1922                 drm_connector_attach_property(&radeon_connector->base,
1923                                               rdev->mode_info.tv_std_property,
1924                                               radeon_combios_get_tv_info(rdev));
1925                 /* no HPD on analog connectors */
1926                 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1927                 connector->interlace_allowed = false;
1928                 connector->doublescan_allowed = false;
1929                 break;
1930         case DRM_MODE_CONNECTOR_LVDS:
1931                 drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
1932                 drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
1933                 if (i2c_bus->valid) {
1934                         radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1935                         if (!radeon_connector->ddc_bus)
1936                                 DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1937                 }
1938                 drm_connector_attach_property(&radeon_connector->base,
1939                                               dev->mode_config.scaling_mode_property,
1940                                               DRM_MODE_SCALE_FULLSCREEN);
1941                 subpixel_order = SubPixelHorizontalRGB;
1942                 connector->interlace_allowed = false;
1943                 connector->doublescan_allowed = false;
1944                 break;
1945         }
1946
1947         if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
1948                 if (i2c_bus->valid) {
1949                         connector->polled = DRM_CONNECTOR_POLL_CONNECT |
1950                                             DRM_CONNECTOR_POLL_DISCONNECT;
1951                 }
1952         } else
1953                 connector->polled = DRM_CONNECTOR_POLL_HPD;
1954
1955         connector->display_info.subpixel_order = subpixel_order;
1956         drm_sysfs_connector_add(connector);
1957         if (connector_type == DRM_MODE_CONNECTOR_LVDS) {
1958                 struct drm_encoder *drm_encoder;
1959
1960                 list_for_each_entry(drm_encoder, &dev->mode_config.encoder_list, head) {
1961                         struct radeon_encoder *radeon_encoder;
1962
1963                         radeon_encoder = to_radeon_encoder(drm_encoder);
1964                         if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_LVDS)
1965                                 radeon_legacy_backlight_init(radeon_encoder, connector);
1966                 }
1967         }
1968 }