xref: /trueos/sys/dev/drm2/radeon/radeon_connectors.c (revision 8943816bb4812ac55b5f3738b955ac07db05a3b2)
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 #ifdef FREEBSD_WIP /* FreeBSD: to please GCC 4.2. */
39 extern void
40 radeon_combios_connected_scratch_regs(struct drm_connector *connector,
41 				      struct drm_encoder *encoder,
42 				      bool connected);
43 extern void
44 radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
45 				       struct drm_encoder *encoder,
46 				       bool connected);
47 #endif
48 
radeon_connector_hotplug(struct drm_connector * connector)49 void 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 
radeon_property_change_mode(struct drm_encoder * encoder)99 static 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 
radeon_get_monitor_bpc(struct drm_connector * connector)109 int 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 
164 static void
radeon_connector_update_scratch_regs(struct drm_connector * connector,enum drm_connector_status status)165 radeon_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 
radeon_find_encoder(struct drm_connector * connector,int encoder_type)203 static 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 
radeon_best_single_encoder(struct drm_connector * connector)224 static 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  */
247 static enum drm_connector_status
radeon_connector_analog_encoder_conflict_solve(struct drm_connector * connector,struct drm_encoder * encoder,enum drm_connector_status current_status,bool priority)248 radeon_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 
radeon_fp_native_mode(struct drm_encoder * encoder)293 static 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 
radeon_add_common_modes(struct drm_encoder * encoder,struct drm_connector * connector)324 static 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 
radeon_connector_set_property(struct drm_connector * connector,struct drm_property * property,uint64_t val)375 static 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 
radeon_fixup_lvds_native_mode(struct drm_encoder * encoder,struct drm_connector * connector)510 static 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 
radeon_lvds_get_modes(struct drm_connector * connector)545 static 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 
radeon_lvds_mode_valid(struct drm_connector * connector,struct drm_display_mode * mode)584 static 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 
614 static enum drm_connector_status
radeon_lvds_detect(struct drm_connector * connector,bool force)615 radeon_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 
radeon_connector_destroy(struct drm_connector * connector)648 static 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 
radeon_lvds_set_property(struct drm_connector * connector,struct drm_property * property,uint64_t value)662 static 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 
698 static 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 
704 static 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 
radeon_vga_get_modes(struct drm_connector * connector)712 static 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 
radeon_vga_mode_valid(struct drm_connector * connector,struct drm_display_mode * mode)722 static 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 
736 static enum drm_connector_status
radeon_vga_detect(struct drm_connector * connector,bool force)737 radeon_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 
816 static 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 
822 static 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 
radeon_tv_get_modes(struct drm_connector * connector)830 static 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 
radeon_tv_mode_valid(struct drm_connector * connector,struct drm_display_mode * mode)854 static 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 
862 static enum drm_connector_status
radeon_tv_detect(struct drm_connector * connector,bool force)863 radeon_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 
886 static 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 
892 static 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 
radeon_dvi_get_modes(struct drm_connector * connector)900 static 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 
radeon_check_hpd_status_unchanged(struct drm_connector * connector)909 static 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  */
941 static enum drm_connector_status
radeon_dvi_detect(struct drm_connector * connector,bool force)942 radeon_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 	 */
1096 out:
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 */
radeon_dvi_encoder(struct drm_connector * connector)1110 static 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 
radeon_dvi_force(struct drm_connector * connector)1151 static 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 
radeon_dvi_mode_valid(struct drm_connector * connector,struct drm_display_mode * mode)1160 static 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 
1200 static 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 
1206 static 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 
radeon_dp_connector_destroy(struct drm_connector * connector)1215 static 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 
radeon_dp_get_modes(struct drm_connector * connector)1232 static 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 
radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector * connector)1297 u16 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 
radeon_connector_encoder_is_hbr2(struct drm_connector * connector)1327 bool 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 
radeon_connector_is_dp12_capable(struct drm_connector * connector)1352 bool 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 
1366 static enum drm_connector_status
radeon_dp_detect(struct drm_connector * connector,bool force)1367 radeon_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 
radeon_dp_mode_valid(struct drm_connector * connector,struct drm_display_mode * mode)1444 static 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 
1487 static 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 
1493 static 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 
1502 void
radeon_add_atom_connector(struct drm_device * dev,uint32_t connector_id,uint32_t supported_device,int connector_type,struct radeon_i2c_bus_rec * i2c_bus,uint32_t igp_lane_info,uint16_t connector_object_id,struct radeon_hpd * hpd,struct radeon_router * router)1503 radeon_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 
1893 failed:
1894 	drm_connector_cleanup(connector);
1895 	free(connector, DRM_MEM_DRIVER);
1896 }
1897 
1898 void
radeon_add_legacy_connector(struct drm_device * dev,uint32_t connector_id,uint32_t supported_device,int connector_type,struct radeon_i2c_bus_rec * i2c_bus,uint16_t connector_object_id,struct radeon_hpd * hpd)1899 radeon_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