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