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