radeon_connectors.c 83.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*
 * Copyright 2007-8 Advanced Micro Devices, Inc.
 * Copyright 2008 Red Hat Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * Authors: Dave Airlie
 *          Alex Deucher
 */
26 27 28 29
#include <drm/drmP.h>
#include <drm/drm_edid.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_fb_helper.h>
30
#include <drm/drm_dp_mst_helper.h>
31
#include <drm/radeon_drm.h>
32
#include "radeon.h"
33
#include "radeon_audio.h"
34
#include "atom.h"
35

36
#include <linux/pm_runtime.h>
37
#include <linux/vga_switcheroo.h>
38

39 40 41 42 43 44 45 46 47 48
static int radeon_dp_handle_hpd(struct drm_connector *connector)
{
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	int ret;

	ret = radeon_dp_mst_check_status(radeon_connector);
	if (ret == -EINVAL)
		return 1;
	return 0;
}
A
Alex Deucher 已提交
49 50 51 52 53 54
void radeon_connector_hotplug(struct drm_connector *connector)
{
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);

55 56 57 58 59 60 61 62 63 64 65
	if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
		struct radeon_connector_atom_dig *dig_connector =
			radeon_connector->con_priv;

		if (radeon_connector->is_mst_connector)
			return;
		if (dig_connector->is_mst) {
			radeon_dp_handle_hpd(connector);
			return;
		}
	}
66 67 68 69 70 71
	/* bail if the connector does not have hpd pin, e.g.,
	 * VGA, TV, etc.
	 */
	if (radeon_connector->hpd.hpd == RADEON_HPD_NONE)
		return;

72
	radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
A
Alex Deucher 已提交
73

74
	/* if the connector is already off, don't turn it back on */
75
	/* FIXME: This access isn't protected by any locks. */
76 77 78
	if (connector->dpms != DRM_MODE_DPMS_ON)
		return;

79 80
	/* just deal with DP (not eDP) here. */
	if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
81 82
		struct radeon_connector_atom_dig *dig_connector =
			radeon_connector->con_priv;
83

84 85 86 87 88 89 90 91 92
		/* if existing sink type was not DP no need to retrain */
		if (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_DISPLAYPORT)
			return;

		/* first get sink type as it may be reset after (un)plug */
		dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
		/* don't do anything if sink is not display port, i.e.,
		 * passive dp->(dvi|hdmi) adaptor
		 */
93 94 95 96 97 98
		if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT &&
		    radeon_hpd_sense(rdev, radeon_connector->hpd.hpd) &&
		    radeon_dp_needs_link_train(radeon_connector)) {
			/* Don't start link training before we have the DPCD */
			if (!radeon_dp_getdpcd(radeon_connector))
				return;
99

100 101 102 103 104
			/* Turn the connector off and back on immediately, which
			 * will trigger link training
			 */
			drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
			drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
105
		}
A
Alex Deucher 已提交
106 107 108
	}
}

109 110 111 112 113 114
static void radeon_property_change_mode(struct drm_encoder *encoder)
{
	struct drm_crtc *crtc = encoder->crtc;

	if (crtc && crtc->enabled) {
		drm_crtc_helper_set_mode(crtc, &crtc->mode,
115
					 crtc->x, crtc->y, crtc->primary->fb);
116 117
	}
}
118 119 120 121 122 123 124 125

int radeon_get_monitor_bpc(struct drm_connector *connector)
{
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	struct radeon_connector_atom_dig *dig_connector;
	int bpc = 8;
126
	int mode_clock, max_tmds_clock;
127 128 129 130 131

	switch (connector->connector_type) {
	case DRM_MODE_CONNECTOR_DVII:
	case DRM_MODE_CONNECTOR_HDMIB:
		if (radeon_connector->use_digital) {
132
			if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
133 134 135 136 137 138 139
				if (connector->display_info.bpc)
					bpc = connector->display_info.bpc;
			}
		}
		break;
	case DRM_MODE_CONNECTOR_DVID:
	case DRM_MODE_CONNECTOR_HDMIA:
140
		if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
141 142 143 144 145 146 147 148
			if (connector->display_info.bpc)
				bpc = connector->display_info.bpc;
		}
		break;
	case DRM_MODE_CONNECTOR_DisplayPort:
		dig_connector = radeon_connector->con_priv;
		if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
		    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) ||
149
		    drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
150 151 152 153 154 155 156 157 158
			if (connector->display_info.bpc)
				bpc = connector->display_info.bpc;
		}
		break;
	case DRM_MODE_CONNECTOR_eDP:
	case DRM_MODE_CONNECTOR_LVDS:
		if (connector->display_info.bpc)
			bpc = connector->display_info.bpc;
		else if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
159
			const struct drm_connector_helper_funcs *connector_funcs =
160 161 162 163 164 165 166 167 168 169 170 171
				connector->helper_private;
			struct drm_encoder *encoder = connector_funcs->best_encoder(connector);
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
			struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;

			if (dig->lcd_misc & ATOM_PANEL_MISC_V13_6BIT_PER_COLOR)
				bpc = 6;
			else if (dig->lcd_misc & ATOM_PANEL_MISC_V13_8BIT_PER_COLOR)
				bpc = 8;
		}
		break;
	}
172

173
	if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
174 175 176
		/* hdmi deep color only implemented on DCE4+ */
		if ((bpc > 8) && !ASIC_IS_DCE4(rdev)) {
			DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 8 bpc.\n",
177
					  connector->name, bpc);
178 179 180 181 182 183 184 185 186 187 188
			bpc = 8;
		}

		/*
		 * Pre DCE-8 hw can't handle > 12 bpc, and more than 12 bpc doesn't make
		 * much sense without support for > 12 bpc framebuffers. RGB 4:4:4 at
		 * 12 bpc is always supported on hdmi deep color sinks, as this is
		 * required by the HDMI-1.3 spec. Clamp to a safe 12 bpc maximum.
		 */
		if (bpc > 12) {
			DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 12 bpc.\n",
189
					  connector->name, bpc);
190 191
			bpc = 12;
		}
192 193

		/* Any defined maximum tmds clock limit we must not exceed? */
194
		if (connector->display_info.max_tmds_clock > 0) {
195 196 197 198
			/* mode_clock is clock in kHz for mode to be modeset on this connector */
			mode_clock = radeon_connector->pixelclock_for_modeset;

			/* Maximum allowable input clock in kHz */
199
			max_tmds_clock = connector->display_info.max_tmds_clock;
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221

			DRM_DEBUG("%s: hdmi mode dotclock %d kHz, max tmds input clock %d kHz.\n",
					  connector->name, mode_clock, max_tmds_clock);

			/* Check if bpc is within clock limit. Try to degrade gracefully otherwise */
			if ((bpc == 12) && (mode_clock * 3/2 > max_tmds_clock)) {
				if ((connector->display_info.edid_hdmi_dc_modes & DRM_EDID_HDMI_DC_30) &&
					(mode_clock * 5/4 <= max_tmds_clock))
					bpc = 10;
				else
					bpc = 8;

				DRM_DEBUG("%s: HDMI deep color 12 bpc exceeds max tmds clock. Using %d bpc.\n",
						  connector->name, bpc);
			}

			if ((bpc == 10) && (mode_clock * 5/4 > max_tmds_clock)) {
				bpc = 8;
				DRM_DEBUG("%s: HDMI deep color 10 bpc exceeds max tmds clock. Using %d bpc.\n",
						  connector->name, bpc);
			}
		}
222 223 224 225 226 227
		else if (bpc > 8) {
			/* max_tmds_clock missing, but hdmi spec mandates it for deep color. */
			DRM_DEBUG("%s: Required max tmds clock for HDMI deep color missing. Using 8 bpc.\n",
					  connector->name);
			bpc = 8;
		}
228 229
	}

230 231 232
	if ((radeon_deep_color == 0) && (bpc > 8)) {
		DRM_DEBUG("%s: Deep color disabled. Set radeon module param deep_color=1 to enable.\n",
				  connector->name);
233
		bpc = 8;
234
	}
235

236
	DRM_DEBUG("%s: Display bpc=%d, returned bpc=%d\n",
237
			  connector->name, connector->display_info.bpc, bpc);
238

239 240 241
	return bpc;
}

242 243 244 245 246 247 248
static void
radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status)
{
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
	struct drm_encoder *best_encoder = NULL;
	struct drm_encoder *encoder = NULL;
249
	const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
250 251 252 253 254 255 256 257 258
	bool connected;
	int i;

	best_encoder = connector_funcs->best_encoder(connector);

	for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
		if (connector->encoder_ids[i] == 0)
			break;

259
		encoder = drm_encoder_find(connector->dev, NULL,
R
Rob Clark 已提交
260 261
					   connector->encoder_ids[i]);
		if (!encoder)
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
			continue;

		if ((encoder == best_encoder) && (status == connector_status_connected))
			connected = true;
		else
			connected = false;

		if (rdev->is_atom_bios)
			radeon_atombios_connected_scratch_regs(connector, encoder, connected);
		else
			radeon_combios_connected_scratch_regs(connector, encoder, connected);

	}
}

277
static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type)
278 279 280 281 282 283 284 285
{
	struct drm_encoder *encoder;
	int i;

	for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
		if (connector->encoder_ids[i] == 0)
			break;

286
		encoder = drm_encoder_find(connector->dev, NULL, connector->encoder_ids[i]);
R
Rob Clark 已提交
287
		if (!encoder)
288 289 290 291 292 293 294 295
			continue;

		if (encoder->encoder_type == encoder_type)
			return encoder;
	}
	return NULL;
}

296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
struct edid *radeon_connector_edid(struct drm_connector *connector)
{
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	struct drm_property_blob *edid_blob = connector->edid_blob_ptr;

	if (radeon_connector->edid) {
		return radeon_connector->edid;
	} else if (edid_blob) {
		struct edid *edid = kmemdup(edid_blob->data, edid_blob->length, GFP_KERNEL);
		if (edid)
			radeon_connector->edid = edid;
	}
	return radeon_connector->edid;
}

311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
static void radeon_connector_get_edid(struct drm_connector *connector)
{
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);

	if (radeon_connector->edid)
		return;

	/* on hw with routers, select right port */
	if (radeon_connector->router.ddc_valid)
		radeon_router_select_ddc_port(radeon_connector);

	if ((radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
	     ENCODER_OBJECT_ID_NONE) &&
	    radeon_connector->ddc_bus->has_aux) {
		radeon_connector->edid = drm_get_edid(connector,
						      &radeon_connector->ddc_bus->aux.ddc);
	} else if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
		   (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
		struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;

		if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||
		     dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) &&
		    radeon_connector->ddc_bus->has_aux)
			radeon_connector->edid = drm_get_edid(&radeon_connector->base,
							      &radeon_connector->ddc_bus->aux.ddc);
		else if (radeon_connector->ddc_bus)
			radeon_connector->edid = drm_get_edid(&radeon_connector->base,
							      &radeon_connector->ddc_bus->adapter);
341 342 343 344 345
	} else if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC &&
		   connector->connector_type == DRM_MODE_CONNECTOR_LVDS &&
		   radeon_connector->ddc_bus) {
		radeon_connector->edid = drm_get_edid_switcheroo(&radeon_connector->base,
								 &radeon_connector->ddc_bus->adapter);
346 347 348 349 350 351
	} else if (radeon_connector->ddc_bus) {
		radeon_connector->edid = drm_get_edid(&radeon_connector->base,
						      &radeon_connector->ddc_bus->adapter);
	}

	if (!radeon_connector->edid) {
352 353 354 355 356 357
		/* don't fetch the edid from the vbios if ddc fails and runpm is
		 * enabled so we report disconnected.
		 */
		if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))
			return;

358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
		if (rdev->is_atom_bios) {
			/* some laptops provide a hardcoded edid in rom for LCDs */
			if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) ||
			     (connector->connector_type == DRM_MODE_CONNECTOR_eDP)))
				radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
		} else {
			/* some servers provide a hardcoded edid in rom for KVMs */
			radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
		}
	}
}

static void radeon_connector_free_edid(struct drm_connector *connector)
{
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);

	if (radeon_connector->edid) {
		kfree(radeon_connector->edid);
		radeon_connector->edid = NULL;
	}
}

static int radeon_ddc_get_modes(struct drm_connector *connector)
{
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	int ret;

	if (radeon_connector->edid) {
		drm_mode_connector_update_edid_property(connector, radeon_connector->edid);
		ret = drm_add_edid_modes(connector, radeon_connector->edid);
		return ret;
	}
	drm_mode_connector_update_edid_property(connector, NULL);
	return 0;
}

394
static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
395 396 397
{
	int enc_id = connector->encoder_ids[0];
	/* pick the encoder ids */
R
Rob Clark 已提交
398
	if (enc_id)
399
		return drm_encoder_find(connector->dev, NULL, enc_id);
400 401 402
	return NULL;
}

403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
static void radeon_get_native_mode(struct drm_connector *connector)
{
	struct drm_encoder *encoder = radeon_best_single_encoder(connector);
	struct radeon_encoder *radeon_encoder;

	if (encoder == NULL)
		return;

	radeon_encoder = to_radeon_encoder(encoder);

	if (!list_empty(&connector->probed_modes)) {
		struct drm_display_mode *preferred_mode =
			list_first_entry(&connector->probed_modes,
					 struct drm_display_mode, head);

		radeon_encoder->native_mode = *preferred_mode;
	} else {
		radeon_encoder->native_mode.clock = 0;
	}
}

424 425 426 427 428 429 430 431 432 433 434 435 436 437
/*
 * radeon_connector_analog_encoder_conflict_solve
 * - search for other connectors sharing this encoder
 *   if priority is true, then set them disconnected if this is connected
 *   if priority is false, set us disconnected if they are connected
 */
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)
{
	struct drm_device *dev = connector->dev;
	struct drm_connector *conflict;
438
	struct radeon_connector *radeon_conflict;
439 440 441 442 443 444
	int i;

	list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {
		if (conflict == connector)
			continue;

445
		radeon_conflict = to_radeon_connector(conflict);
446 447 448 449 450 451 452 453
		for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
			if (conflict->encoder_ids[i] == 0)
				break;

			/* if the IDs match */
			if (conflict->encoder_ids[i] == encoder->base.id) {
				if (conflict->status != connector_status_connected)
					continue;
454 455 456

				if (radeon_conflict->use_digital)
					continue;
457 458

				if (priority == true) {
459 460 461 462
					DRM_DEBUG_KMS("1: conflicting encoders switching off %s\n",
						      conflict->name);
					DRM_DEBUG_KMS("in favor of %s\n",
						      connector->name);
463 464 465
					conflict->status = connector_status_disconnected;
					radeon_connector_update_scratch_regs(conflict, connector_status_disconnected);
				} else {
466 467 468 469
					DRM_DEBUG_KMS("2: conflicting encoders switching off %s\n",
						      connector->name);
					DRM_DEBUG_KMS("in favor of %s\n",
						      conflict->name);
470 471 472 473 474 475 476 477 478 479
					current_status = connector_status_disconnected;
				}
				break;
			}
		}
	}
	return current_status;

}

480 481 482 483 484
static struct drm_display_mode *radeon_fp_native_mode(struct drm_encoder *encoder)
{
	struct drm_device *dev = encoder->dev;
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
	struct drm_display_mode *mode = NULL;
485
	struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
486

487 488 489
	if (native_mode->hdisplay != 0 &&
	    native_mode->vdisplay != 0 &&
	    native_mode->clock != 0) {
490
		mode = drm_mode_duplicate(dev, native_mode);
491 492 493
		mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
		drm_mode_set_name(mode);

494
		DRM_DEBUG_KMS("Adding native panel mode %s\n", mode->name);
495 496 497 498 499 500 501 502 503 504 505
	} else if (native_mode->hdisplay != 0 &&
		   native_mode->vdisplay != 0) {
		/* mac laptops without an edid */
		/* Note that this is not necessarily the exact panel mode,
		 * but an approximation based on the cvt formula.  For these
		 * systems we should ideally read the mode info out of the
		 * registers or add a mode table, but this works and is much
		 * simpler.
		 */
		mode = drm_cvt_mode(dev, native_mode->hdisplay, native_mode->vdisplay, 60, true, false, false);
		mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
506
		DRM_DEBUG_KMS("Adding cvt approximation of native panel mode %s\n", mode->name);
507 508 509 510
	}
	return mode;
}

511 512 513 514 515
static void radeon_add_common_modes(struct drm_encoder *encoder, struct drm_connector *connector)
{
	struct drm_device *dev = encoder->dev;
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
	struct drm_display_mode *mode = NULL;
516
	struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
	int i;
	struct mode_size {
		int w;
		int h;
	} common_modes[17] = {
		{ 640,  480},
		{ 720,  480},
		{ 800,  600},
		{ 848,  480},
		{1024,  768},
		{1152,  768},
		{1280,  720},
		{1280,  800},
		{1280,  854},
		{1280,  960},
		{1280, 1024},
		{1440,  900},
		{1400, 1050},
		{1680, 1050},
		{1600, 1200},
		{1920, 1080},
		{1920, 1200}
	};

	for (i = 0; i < 17; i++) {
542 543 544 545 546
		if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT)) {
			if (common_modes[i].w > 1024 ||
			    common_modes[i].h > 768)
				continue;
		}
547
		if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
548 549 550 551
			if (common_modes[i].w > native_mode->hdisplay ||
			    common_modes[i].h > native_mode->vdisplay ||
			    (common_modes[i].w == native_mode->hdisplay &&
			     common_modes[i].h == native_mode->vdisplay))
552 553 554 555 556
				continue;
		}
		if (common_modes[i].w < 320 || common_modes[i].h < 200)
			continue;

557
		mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false);
558 559 560 561
		drm_mode_probed_add(connector, mode);
	}
}

562
static int radeon_connector_set_property(struct drm_connector *connector, struct drm_property *property,
563 564
				  uint64_t val)
{
565 566 567 568 569 570 571
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
	struct drm_encoder *encoder;
	struct radeon_encoder *radeon_encoder;

	if (property == rdev->mode_info.coherent_mode_property) {
		struct radeon_encoder_atom_dig *dig;
572
		bool new_coherent_mode;
573 574 575 576 577 578 579 580 581 582 583 584

		/* need to find digital encoder on connector */
		encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
		if (!encoder)
			return 0;

		radeon_encoder = to_radeon_encoder(encoder);

		if (!radeon_encoder->enc_priv)
			return 0;

		dig = radeon_encoder->enc_priv;
585 586 587 588 589
		new_coherent_mode = val ? true : false;
		if (dig->coherent_mode != new_coherent_mode) {
			dig->coherent_mode = new_coherent_mode;
			radeon_property_change_mode(&radeon_encoder->base);
		}
590 591
	}

592 593 594 595 596 597 598 599 600 601 602 603 604 605 606
	if (property == rdev->mode_info.audio_property) {
		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
		/* need to find digital encoder on connector */
		encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
		if (!encoder)
			return 0;

		radeon_encoder = to_radeon_encoder(encoder);

		if (radeon_connector->audio != val) {
			radeon_connector->audio = val;
			radeon_property_change_mode(&radeon_encoder->base);
		}
	}

607 608 609 610 611 612 613 614 615 616 617 618 619 620 621
	if (property == rdev->mode_info.dither_property) {
		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
		/* need to find digital encoder on connector */
		encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
		if (!encoder)
			return 0;

		radeon_encoder = to_radeon_encoder(encoder);

		if (radeon_connector->dither != val) {
			radeon_connector->dither = val;
			radeon_property_change_mode(&radeon_encoder->base);
		}
	}

622 623 624 625 626 627 628 629 630 631 632 633 634 635
	if (property == rdev->mode_info.underscan_property) {
		/* need to find digital encoder on connector */
		encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
		if (!encoder)
			return 0;

		radeon_encoder = to_radeon_encoder(encoder);

		if (radeon_encoder->underscan_type != val) {
			radeon_encoder->underscan_type = val;
			radeon_property_change_mode(&radeon_encoder->base);
		}
	}

636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663
	if (property == rdev->mode_info.underscan_hborder_property) {
		/* need to find digital encoder on connector */
		encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
		if (!encoder)
			return 0;

		radeon_encoder = to_radeon_encoder(encoder);

		if (radeon_encoder->underscan_hborder != val) {
			radeon_encoder->underscan_hborder = val;
			radeon_property_change_mode(&radeon_encoder->base);
		}
	}

	if (property == rdev->mode_info.underscan_vborder_property) {
		/* need to find digital encoder on connector */
		encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
		if (!encoder)
			return 0;

		radeon_encoder = to_radeon_encoder(encoder);

		if (radeon_encoder->underscan_vborder != val) {
			radeon_encoder->underscan_vborder = val;
			radeon_property_change_mode(&radeon_encoder->base);
		}
	}

664 665 666 667 668 669 670 671 672 673 674 675
	if (property == rdev->mode_info.tv_std_property) {
		encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC);
		if (!encoder) {
			encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_DAC);
		}

		if (!encoder)
			return 0;

		radeon_encoder = to_radeon_encoder(encoder);
		if (!radeon_encoder->enc_priv)
			return 0;
676
		if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom) {
677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723
			struct radeon_encoder_atom_dac *dac_int;
			dac_int = radeon_encoder->enc_priv;
			dac_int->tv_std = val;
		} else {
			struct radeon_encoder_tv_dac *dac_int;
			dac_int = radeon_encoder->enc_priv;
			dac_int->tv_std = val;
		}
		radeon_property_change_mode(&radeon_encoder->base);
	}

	if (property == rdev->mode_info.load_detect_property) {
		struct radeon_connector *radeon_connector =
			to_radeon_connector(connector);

		if (val == 0)
			radeon_connector->dac_load_detect = false;
		else
			radeon_connector->dac_load_detect = true;
	}

	if (property == rdev->mode_info.tmds_pll_property) {
		struct radeon_encoder_int_tmds *tmds = NULL;
		bool ret = false;
		/* need to find digital encoder on connector */
		encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
		if (!encoder)
			return 0;

		radeon_encoder = to_radeon_encoder(encoder);

		tmds = radeon_encoder->enc_priv;
		if (!tmds)
			return 0;

		if (val == 0) {
			if (rdev->is_atom_bios)
				ret = radeon_atombios_get_tmds_info(radeon_encoder, tmds);
			else
				ret = radeon_legacy_get_tmds_info_from_combios(radeon_encoder, tmds);
		}
		if (val == 1 || ret == false) {
			radeon_legacy_get_tmds_info_from_table(radeon_encoder, tmds);
		}
		radeon_property_change_mode(&radeon_encoder->base);
	}

724 725 726 727 728 729
	if (property == dev->mode_config.scaling_mode_property) {
		enum radeon_rmx_type rmx_type;

		if (connector->encoder)
			radeon_encoder = to_radeon_encoder(connector->encoder);
		else {
730
			const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752
			radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
		}

		switch (val) {
		default:
		case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;
		case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break;
		case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break;
		case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break;
		}
		if (radeon_encoder->rmx_type == rmx_type)
			return 0;

		if ((rmx_type != DRM_MODE_SCALE_NONE) &&
		    (radeon_encoder->native_mode.clock == 0))
			return 0;

		radeon_encoder->rmx_type = rmx_type;

		radeon_property_change_mode(&radeon_encoder->base);
	}

753 754 755 756
	if (property == rdev->mode_info.output_csc_property) {
		if (connector->encoder)
			radeon_encoder = to_radeon_encoder(connector->encoder);
		else {
757
			const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
758 759 760 761 762 763 764 765 766 767 768 769 770 771
			radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
		}

		if (radeon_encoder->output_csc == val)
			return 0;

		radeon_encoder->output_csc = val;

		if (connector->encoder->crtc) {
			struct drm_crtc *crtc  = connector->encoder->crtc;
			struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);

			radeon_crtc->output_csc = radeon_encoder->output_csc;

772 773 774 775 776
			/*
			 * Our .gamma_set assumes the .gamma_store has been
			 * prefilled and don't care about its arguments.
			 */
			crtc->funcs->gamma_set(crtc, NULL, NULL, NULL, 0, NULL);
777 778 779
		}
	}

780 781 782
	return 0;
}

783 784 785 786
static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,
					  struct drm_connector *connector)
{
	struct radeon_encoder *radeon_encoder =	to_radeon_encoder(encoder);
787
	struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
788 789 790 791 792 793 794 795 796 797
	struct drm_display_mode *t, *mode;

	/* If the EDID preferred mode doesn't match the native mode, use it */
	list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
		if (mode->type & DRM_MODE_TYPE_PREFERRED) {
			if (mode->hdisplay != native_mode->hdisplay ||
			    mode->vdisplay != native_mode->vdisplay)
				memcpy(native_mode, mode, sizeof(*mode));
		}
	}
798 799

	/* Try to get native mode details from EDID if necessary */
800
	if (!native_mode->clock) {
801
		list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
802 803 804 805
			if (mode->hdisplay == native_mode->hdisplay &&
			    mode->vdisplay == native_mode->vdisplay) {
				*native_mode = *mode;
				drm_mode_set_crtcinfo(native_mode, CRTC_INTERLACE_HALVE_V);
806
				DRM_DEBUG_KMS("Determined LVDS native mode details from EDID\n");
807 808 809 810
				break;
			}
		}
	}
811

812
	if (!native_mode->clock) {
813
		DRM_DEBUG_KMS("No LVDS native mode details, disabling RMX\n");
814 815 816
		radeon_encoder->rmx_type = RMX_OFF;
	}
}
817 818 819 820 821 822 823

static int radeon_lvds_get_modes(struct drm_connector *connector)
{
	struct drm_encoder *encoder;
	int ret = 0;
	struct drm_display_mode *mode;

824 825 826 827 828 829 830 831
	radeon_connector_get_edid(connector);
	ret = radeon_ddc_get_modes(connector);
	if (ret > 0) {
		encoder = radeon_best_single_encoder(connector);
		if (encoder) {
			radeon_fixup_lvds_native_mode(encoder, connector);
			/* add scaled modes */
			radeon_add_common_modes(encoder, connector);
832
		}
833
		return ret;
834 835 836 837 838 839 840 841 842 843 844
	}

	encoder = radeon_best_single_encoder(connector);
	if (!encoder)
		return 0;

	/* we have no EDID modes */
	mode = radeon_fp_native_mode(encoder);
	if (mode) {
		ret = 1;
		drm_mode_probed_add(connector, mode);
845 846 847
		/* add the width/height from vbios tables if available */
		connector->display_info.width_mm = mode->width_mm;
		connector->display_info.height_mm = mode->height_mm;
848 849
		/* add scaled modes */
		radeon_add_common_modes(encoder, connector);
850
	}
851

852 853 854
	return ret;
}

855
static enum drm_mode_status radeon_lvds_mode_valid(struct drm_connector *connector,
856 857
				  struct drm_display_mode *mode)
{
858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881
	struct drm_encoder *encoder = radeon_best_single_encoder(connector);

	if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
		return MODE_PANEL;

	if (encoder) {
		struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
		struct drm_display_mode *native_mode = &radeon_encoder->native_mode;

		/* AVIVO hardware supports downscaling modes larger than the panel
		 * to the panel size, but I'm not sure this is desirable.
		 */
		if ((mode->hdisplay > native_mode->hdisplay) ||
		    (mode->vdisplay > native_mode->vdisplay))
			return MODE_PANEL;

		/* if scaling is disabled, block non-native modes */
		if (radeon_encoder->rmx_type == RMX_OFF) {
			if ((mode->hdisplay != native_mode->hdisplay) ||
			    (mode->vdisplay != native_mode->vdisplay))
				return MODE_PANEL;
		}
	}

882 883 884
	return MODE_OK;
}

885
static enum drm_connector_status
886
radeon_lvds_detect(struct drm_connector *connector, bool force)
887
{
888 889
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
890
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
891
	struct drm_encoder *encoder = radeon_best_single_encoder(connector);
892
	enum drm_connector_status ret = connector_status_disconnected;
893 894
	int r;

895 896 897 898 899
	if (!drm_kms_helper_is_poll_worker()) {
		r = pm_runtime_get_sync(connector->dev->dev);
		if (r < 0)
			return connector_status_disconnected;
	}
900 901 902

	if (encoder) {
		struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
903
		struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
904 905

		/* check if panel is valid */
906
		if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
907
			ret = connector_status_connected;
908 909 910 911 912
		/* don't fetch the edid from the vbios if ddc fails and runpm is
		 * enabled so we report disconnected.
		 */
		if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))
			ret = connector_status_disconnected;
913
	}
914 915

	/* check for edid as well */
916
	radeon_connector_get_edid(connector);
917 918
	if (radeon_connector->edid)
		ret = connector_status_connected;
919
	/* check acpi lid status ??? */
920

921
	radeon_connector_update_scratch_regs(connector, ret);
922 923 924 925 926 927

	if (!drm_kms_helper_is_poll_worker()) {
		pm_runtime_mark_last_busy(connector->dev->dev);
		pm_runtime_put_autosuspend(connector->dev->dev);
	}

928 929 930
	return ret;
}

931 932 933 934
static void radeon_connector_unregister(struct drm_connector *connector)
{
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);

935
	if (radeon_connector->ddc_bus && radeon_connector->ddc_bus->has_aux) {
936 937 938 939 940
		drm_dp_aux_unregister(&radeon_connector->ddc_bus->aux);
		radeon_connector->ddc_bus->has_aux = false;
	}
}

941 942 943 944
static void radeon_connector_destroy(struct drm_connector *connector)
{
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);

945
	radeon_connector_free_edid(connector);
946
	kfree(radeon_connector->con_priv);
947
	drm_connector_unregister(connector);
948 949 950 951
	drm_connector_cleanup(connector);
	kfree(connector);
}

952 953 954 955 956 957 958 959
static int radeon_lvds_set_property(struct drm_connector *connector,
				    struct drm_property *property,
				    uint64_t value)
{
	struct drm_device *dev = connector->dev;
	struct radeon_encoder *radeon_encoder;
	enum radeon_rmx_type rmx_type;

960
	DRM_DEBUG_KMS("\n");
961 962 963 964 965 966
	if (property != dev->mode_config.scaling_mode_property)
		return 0;

	if (connector->encoder)
		radeon_encoder = to_radeon_encoder(connector->encoder);
	else {
967
		const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987
		radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
	}

	switch (value) {
	case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;
	case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break;
	case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break;
	default:
	case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break;
	}
	if (radeon_encoder->rmx_type == rmx_type)
		return 0;

	radeon_encoder->rmx_type = rmx_type;

	radeon_property_change_mode(&radeon_encoder->base);
	return 0;
}


988
static const struct drm_connector_helper_funcs radeon_lvds_connector_helper_funcs = {
989 990 991 992 993
	.get_modes = radeon_lvds_get_modes,
	.mode_valid = radeon_lvds_mode_valid,
	.best_encoder = radeon_best_single_encoder,
};

994
static const struct drm_connector_funcs radeon_lvds_connector_funcs = {
995 996 997
	.dpms = drm_helper_connector_dpms,
	.detect = radeon_lvds_detect,
	.fill_modes = drm_helper_probe_single_connector_modes,
998
	.early_unregister = radeon_connector_unregister,
999
	.destroy = radeon_connector_destroy,
1000
	.set_property = radeon_lvds_set_property,
1001 1002 1003 1004 1005 1006
};

static int radeon_vga_get_modes(struct drm_connector *connector)
{
	int ret;

1007 1008
	radeon_connector_get_edid(connector);
	ret = radeon_ddc_get_modes(connector);
1009

1010 1011
	radeon_get_native_mode(connector);

1012 1013 1014
	return ret;
}

1015
static enum drm_mode_status radeon_vga_mode_valid(struct drm_connector *connector,
1016 1017
				  struct drm_display_mode *mode)
{
1018 1019 1020
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;

1021
	/* XXX check mode bandwidth */
1022 1023 1024 1025

	if ((mode->clock / 10) > rdev->clock.max_pixel_clock)
		return MODE_CLOCK_HIGH;

1026 1027 1028
	return MODE_OK;
}

1029
static enum drm_connector_status
1030
radeon_vga_detect(struct drm_connector *connector, bool force)
1031
{
1032 1033
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
1034 1035
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	struct drm_encoder *encoder;
1036
	const struct drm_encoder_helper_funcs *encoder_funcs;
1037
	bool dret = false;
1038
	enum drm_connector_status ret = connector_status_disconnected;
1039 1040
	int r;

1041 1042 1043 1044 1045
	if (!drm_kms_helper_is_poll_worker()) {
		r = pm_runtime_get_sync(connector->dev->dev);
		if (r < 0)
			return connector_status_disconnected;
	}
1046

1047 1048 1049 1050
	encoder = radeon_best_single_encoder(connector);
	if (!encoder)
		ret = connector_status_disconnected;

1051
	if (radeon_connector->ddc_bus)
1052
		dret = radeon_ddc_probe(radeon_connector, false);
1053
	if (dret) {
1054
		radeon_connector->detected_by_load = false;
1055 1056
		radeon_connector_free_edid(connector);
		radeon_connector_get_edid(connector);
1057 1058

		if (!radeon_connector->edid) {
1059
			DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
1060
					connector->name);
1061
			ret = connector_status_connected;
1062
		} else {
1063 1064
			radeon_connector->use_digital =
				!!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
1065 1066 1067 1068 1069

			/* some oems have boards with separate digital and analog connectors
			 * with a shared ddc line (often vga + hdmi)
			 */
			if (radeon_connector->use_digital && radeon_connector->shared_ddc) {
1070
				radeon_connector_free_edid(connector);
1071
				ret = connector_status_disconnected;
1072
			} else {
1073
				ret = connector_status_connected;
1074
			}
1075 1076
		}
	} else {
1077 1078

		/* if we aren't forcing don't do destructive polling */
1079 1080 1081 1082 1083
		if (!force) {
			/* only return the previous status if we last
			 * detected a monitor via load.
			 */
			if (radeon_connector->detected_by_load)
1084 1085
				ret = connector->status;
			goto out;
1086
		}
1087

1088
		if (radeon_connector->dac_load_detect && encoder) {
1089 1090
			encoder_funcs = encoder->helper_private;
			ret = encoder_funcs->detect(encoder, connector);
1091
			if (ret != connector_status_disconnected)
1092
				radeon_connector->detected_by_load = true;
1093
		}
1094 1095
	}

1096 1097
	if (ret == connector_status_connected)
		ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108

	/* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
	 * vbios to deal with KVMs. If we have one and are not able to detect a monitor
	 * by other means, assume the CRT is connected and use that EDID.
	 */
	if ((!rdev->is_atom_bios) &&
	    (ret == connector_status_disconnected) &&
	    rdev->mode_info.bios_hardcoded_edid_size) {
		ret = connector_status_connected;
	}

1109
	radeon_connector_update_scratch_regs(connector, ret);
1110 1111

out:
1112 1113 1114 1115
	if (!drm_kms_helper_is_poll_worker()) {
		pm_runtime_mark_last_busy(connector->dev->dev);
		pm_runtime_put_autosuspend(connector->dev->dev);
	}
1116

1117 1118 1119
	return ret;
}

1120
static const struct drm_connector_helper_funcs radeon_vga_connector_helper_funcs = {
1121 1122 1123 1124 1125
	.get_modes = radeon_vga_get_modes,
	.mode_valid = radeon_vga_mode_valid,
	.best_encoder = radeon_best_single_encoder,
};

1126
static const struct drm_connector_funcs radeon_vga_connector_funcs = {
1127 1128 1129
	.dpms = drm_helper_connector_dpms,
	.detect = radeon_vga_detect,
	.fill_modes = drm_helper_probe_single_connector_modes,
1130
	.early_unregister = radeon_connector_unregister,
1131 1132 1133 1134
	.destroy = radeon_connector_destroy,
	.set_property = radeon_connector_set_property,
};

1135 1136 1137
static int radeon_tv_get_modes(struct drm_connector *connector)
{
	struct drm_device *dev = connector->dev;
1138
	struct radeon_device *rdev = dev->dev_private;
1139
	struct drm_display_mode *tv_mode;
1140
	struct drm_encoder *encoder;
1141

1142 1143 1144
	encoder = radeon_best_single_encoder(connector);
	if (!encoder)
		return 0;
1145

1146 1147 1148 1149 1150 1151
	/* avivo chips can scale any mode */
	if (rdev->family >= CHIP_RS600)
		/* add scaled modes */
		radeon_add_common_modes(encoder, connector);
	else {
		/* only 800x600 is supported right now on pre-avivo chips */
1152
		tv_mode = drm_cvt_mode(dev, 800, 600, 60, false, false, false);
1153 1154 1155
		tv_mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
		drm_mode_probed_add(connector, tv_mode);
	}
1156 1157 1158
	return 1;
}

1159
static enum drm_mode_status radeon_tv_mode_valid(struct drm_connector *connector,
1160 1161
				struct drm_display_mode *mode)
{
1162 1163
	if ((mode->hdisplay > 1024) || (mode->vdisplay > 768))
		return MODE_CLOCK_RANGE;
1164 1165 1166
	return MODE_OK;
}

1167
static enum drm_connector_status
1168
radeon_tv_detect(struct drm_connector *connector, bool force)
1169 1170
{
	struct drm_encoder *encoder;
1171
	const struct drm_encoder_helper_funcs *encoder_funcs;
1172 1173
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	enum drm_connector_status ret = connector_status_disconnected;
1174
	int r;
1175 1176 1177

	if (!radeon_connector->dac_load_detect)
		return ret;
1178

1179 1180 1181 1182 1183
	if (!drm_kms_helper_is_poll_worker()) {
		r = pm_runtime_get_sync(connector->dev->dev);
		if (r < 0)
			return connector_status_disconnected;
	}
1184

1185 1186 1187 1188 1189 1190 1191 1192 1193 1194
	encoder = radeon_best_single_encoder(connector);
	if (!encoder)
		ret = connector_status_disconnected;
	else {
		encoder_funcs = encoder->helper_private;
		ret = encoder_funcs->detect(encoder, connector);
	}
	if (ret == connector_status_connected)
		ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, false);
	radeon_connector_update_scratch_regs(connector, ret);
1195 1196 1197 1198 1199 1200

	if (!drm_kms_helper_is_poll_worker()) {
		pm_runtime_mark_last_busy(connector->dev->dev);
		pm_runtime_put_autosuspend(connector->dev->dev);
	}

1201 1202 1203
	return ret;
}

1204
static const struct drm_connector_helper_funcs radeon_tv_connector_helper_funcs = {
1205 1206 1207 1208 1209
	.get_modes = radeon_tv_get_modes,
	.mode_valid = radeon_tv_mode_valid,
	.best_encoder = radeon_best_single_encoder,
};

1210
static const struct drm_connector_funcs radeon_tv_connector_funcs = {
1211 1212 1213
	.dpms = drm_helper_connector_dpms,
	.detect = radeon_tv_detect,
	.fill_modes = drm_helper_probe_single_connector_modes,
1214
	.early_unregister = radeon_connector_unregister,
1215 1216 1217 1218
	.destroy = radeon_connector_destroy,
	.set_property = radeon_connector_set_property,
};

1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239
static bool radeon_check_hpd_status_unchanged(struct drm_connector *connector)
{
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	enum drm_connector_status status;

	/* We only trust HPD on R600 and newer ASICS. */
	if (rdev->family >= CHIP_R600
	  && radeon_connector->hpd.hpd != RADEON_HPD_NONE) {
		if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))
			status = connector_status_connected;
		else
			status = connector_status_disconnected;
		if (connector->status == status)
			return true;
	}

	return false;
}

1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
/*
 * DVI is complicated
 * Do a DDC probe, if DDC probe passes, get the full EDID so
 * we can do analog/digital monitor detection at this point.
 * If the monitor is an analog monitor or we got no DDC,
 * we need to find the DAC encoder object for this connector.
 * If we got no DDC, we do load detection on the DAC encoder object.
 * If we got analog DDC or load detection passes on the DAC encoder
 * we have to check if this analog encoder is shared with anyone else (TV)
 * if its shared we have to set the other connector to disconnected.
 */
1251
static enum drm_connector_status
1252
radeon_dvi_detect(struct drm_connector *connector, bool force)
1253
{
1254 1255
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
1256
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1257
	struct drm_encoder *encoder = NULL;
1258
	const struct drm_encoder_helper_funcs *encoder_funcs;
1259
	int i, r;
1260
	enum drm_connector_status ret = connector_status_disconnected;
1261
	bool dret = false, broken_edid = false;
1262

1263 1264 1265 1266 1267
	if (!drm_kms_helper_is_poll_worker()) {
		r = pm_runtime_get_sync(connector->dev->dev);
		if (r < 0)
			return connector_status_disconnected;
	}
1268

1269 1270 1271 1272 1273
	if (radeon_connector->detected_hpd_without_ddc) {
		force = true;
		radeon_connector->detected_hpd_without_ddc = false;
	}

1274 1275 1276 1277
	if (!force && radeon_check_hpd_status_unchanged(connector)) {
		ret = connector->status;
		goto exit;
	}
1278

1279
	if (radeon_connector->ddc_bus) {
1280
		dret = radeon_ddc_probe(radeon_connector, false);
1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294

		/* Sometimes the pins required for the DDC probe on DVI
		 * connectors don't make contact at the same time that the ones
		 * for HPD do. If the DDC probe fails even though we had an HPD
		 * signal, try again later */
		if (!dret && !force &&
		    connector->status != connector_status_connected) {
			DRM_DEBUG_KMS("hpd detected without ddc, retrying in 1 second\n");
			radeon_connector->detected_hpd_without_ddc = true;
			schedule_delayed_work(&rdev->hotplug_work,
					      msecs_to_jiffies(1000));
			goto exit;
		}
	}
1295
	if (dret) {
1296
		radeon_connector->detected_by_load = false;
1297 1298
		radeon_connector_free_edid(connector);
		radeon_connector_get_edid(connector);
1299 1300

		if (!radeon_connector->edid) {
1301
			DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
1302
					connector->name);
1303 1304
			/* rs690 seems to have a problem with connectors not existing and always
			 * return a block of 0's. If we see this just stop polling on this output */
1305 1306
			if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) &&
			    radeon_connector->base.null_edid_counter) {
1307
				ret = connector_status_disconnected;
1308 1309
				DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n",
					  connector->name);
1310
				radeon_connector->ddc_bus = NULL;
1311 1312 1313
			} else {
				ret = connector_status_connected;
				broken_edid = true; /* defer use_digital to later */
1314
			}
1315
		} else {
1316 1317
			radeon_connector->use_digital =
				!!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
1318

1319 1320 1321 1322
			/* some oems have boards with separate digital and analog connectors
			 * with a shared ddc line (often vga + hdmi)
			 */
			if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) {
1323
				radeon_connector_free_edid(connector);
1324
				ret = connector_status_disconnected;
1325
			} else {
1326
				ret = connector_status_connected;
1327
			}
1328 1329 1330 1331
			/* This gets complicated.  We have boards with VGA + HDMI with a
			 * shared DDC line and we have boards with DVI-D + HDMI with a shared
			 * DDC line.  The latter is more complex because with DVI<->HDMI adapters
			 * you don't really know what's connected to which port as both are digital.
1332
			 */
1333
			if (radeon_connector->shared_ddc && (ret == connector_status_connected)) {
1334 1335 1336 1337 1338 1339
				struct drm_connector *list_connector;
				struct radeon_connector *list_radeon_connector;
				list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {
					if (connector == list_connector)
						continue;
					list_radeon_connector = to_radeon_connector(list_connector);
1340 1341 1342
					if (list_radeon_connector->shared_ddc &&
					    (list_radeon_connector->ddc_bus->rec.i2c_id ==
					     radeon_connector->ddc_bus->rec.i2c_id)) {
1343 1344 1345 1346
						/* cases where both connectors are digital */
						if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) {
							/* hpd is our only option in this case */
							if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
1347
								radeon_connector_free_edid(connector);
1348 1349 1350 1351 1352 1353
								ret = connector_status_disconnected;
							}
						}
					}
				}
			}
1354 1355 1356 1357 1358 1359
		}
	}

	if ((ret == connector_status_connected) && (radeon_connector->use_digital == true))
		goto out;

1360 1361 1362 1363 1364
	/* DVI-D and HDMI-A are digital only */
	if ((connector->connector_type == DRM_MODE_CONNECTOR_DVID) ||
	    (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA))
		goto out;

1365
	/* if we aren't forcing don't do destructive polling */
1366
	if (!force) {
1367 1368 1369 1370 1371
		/* only return the previous status if we last
		 * detected a monitor via load.
		 */
		if (radeon_connector->detected_by_load)
			ret = connector->status;
1372 1373 1374
		goto out;
	}

1375
	/* find analog encoder */
1376 1377 1378 1379
	if (radeon_connector->dac_load_detect) {
		for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
			if (connector->encoder_ids[i] == 0)
				break;
1380

1381
			encoder = drm_encoder_find(connector->dev, NULL,
R
Rob Clark 已提交
1382 1383
						   connector->encoder_ids[i]);
			if (!encoder)
1384
				continue;
1385

1386
			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
1387 1388 1389
			    encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
				continue;

1390 1391
			encoder_funcs = encoder->helper_private;
			if (encoder_funcs->detect) {
1392 1393 1394 1395 1396 1397 1398 1399 1400
				if (!broken_edid) {
					if (ret != connector_status_connected) {
						/* deal with analog monitors without DDC */
						ret = encoder_funcs->detect(encoder, connector);
						if (ret == connector_status_connected) {
							radeon_connector->use_digital = false;
						}
						if (ret != connector_status_disconnected)
							radeon_connector->detected_by_load = true;
1401
					}
1402 1403 1404 1405 1406 1407 1408 1409
				} else {
					enum drm_connector_status lret;
					/* assume digital unless load detected otherwise */
					radeon_connector->use_digital = true;
					lret = encoder_funcs->detect(encoder, connector);
					DRM_DEBUG_KMS("load_detect %x returned: %x\n",encoder->encoder_type,lret);
					if (lret == connector_status_connected)
						radeon_connector->use_digital = false;
1410
				}
1411
				break;
1412 1413 1414 1415
			}
		}
	}

1416 1417 1418 1419 1420
	if ((ret == connector_status_connected) && (radeon_connector->use_digital == false) &&
	    encoder) {
		ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
	}

1421 1422 1423 1424 1425 1426
	/* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
	 * vbios to deal with KVMs. If we have one and are not able to detect a monitor
	 * by other means, assume the DFP is connected and use that EDID.  In most
	 * cases the DVI port is actually a virtual KVM port connected to the service
	 * processor.
	 */
1427
out:
1428 1429 1430 1431 1432 1433 1434
	if ((!rdev->is_atom_bios) &&
	    (ret == connector_status_disconnected) &&
	    rdev->mode_info.bios_hardcoded_edid_size) {
		radeon_connector->use_digital = true;
		ret = connector_status_connected;
	}

1435 1436
	/* updated in get modes as well since we need to know if it's analog or digital */
	radeon_connector_update_scratch_regs(connector, ret);
1437

1438 1439 1440 1441 1442 1443 1444 1445 1446 1447
	if ((radeon_audio != 0) && radeon_connector->use_digital) {
		const struct drm_connector_helper_funcs *connector_funcs =
			connector->helper_private;

		encoder = connector_funcs->best_encoder(connector);
		if (encoder && (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)) {
			radeon_connector_get_edid(connector);
			radeon_audio_detect(connector, encoder, ret);
		}
	}
1448

1449
exit:
1450 1451 1452 1453
	if (!drm_kms_helper_is_poll_worker()) {
		pm_runtime_mark_last_busy(connector->dev->dev);
		pm_runtime_put_autosuspend(connector->dev->dev);
	}
1454

1455 1456 1457 1458
	return ret;
}

/* okay need to be smart in here about which encoder to pick */
1459
static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
1460 1461 1462 1463 1464 1465 1466 1467 1468
{
	int enc_id = connector->encoder_ids[0];
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	struct drm_encoder *encoder;
	int i;
	for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
		if (connector->encoder_ids[i] == 0)
			break;

1469
		encoder = drm_encoder_find(connector->dev, NULL, connector->encoder_ids[i]);
R
Rob Clark 已提交
1470
		if (!encoder)
1471 1472
			continue;

1473
		if (radeon_connector->use_digital == true) {
1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486
			if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
				return encoder;
		} else {
			if (encoder->encoder_type == DRM_MODE_ENCODER_DAC ||
			    encoder->encoder_type == DRM_MODE_ENCODER_TVDAC)
				return encoder;
		}
	}

	/* see if we have a default encoder  TODO */

	/* then check use digitial */
	/* pick the first one */
R
Rob Clark 已提交
1487
	if (enc_id)
1488
		return drm_encoder_find(connector->dev, NULL, enc_id);
1489 1490 1491
	return NULL;
}

1492 1493 1494 1495 1496 1497 1498 1499 1500
static void radeon_dvi_force(struct drm_connector *connector)
{
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	if (connector->force == DRM_FORCE_ON)
		radeon_connector->use_digital = false;
	if (connector->force == DRM_FORCE_ON_DIGITAL)
		radeon_connector->use_digital = true;
}

1501
static enum drm_mode_status radeon_dvi_mode_valid(struct drm_connector *connector,
1502 1503
				  struct drm_display_mode *mode)
{
1504 1505
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
1506 1507 1508 1509
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);

	/* XXX check mode bandwidth */

1510 1511 1512 1513 1514 1515
	/* clocks over 135 MHz have heat issues with DVI on RV100 */
	if (radeon_connector->use_digital &&
	    (rdev->family == CHIP_RV100) &&
	    (mode->clock > 135000))
		return MODE_CLOCK_HIGH;

1516 1517 1518 1519 1520
	if (radeon_connector->use_digital && (mode->clock > 165000)) {
		if ((radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) ||
		    (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
		    (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
			return MODE_OK;
1521
		else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
1522 1523
			/* HDMI 1.3+ supports max clock of 340 Mhz */
			if (mode->clock > 340000)
1524
				return MODE_CLOCK_HIGH;
1525 1526 1527
			else
				return MODE_OK;
		} else {
1528
			return MODE_CLOCK_HIGH;
1529
		}
1530
	}
1531 1532 1533 1534 1535

	/* check against the max pixel clock */
	if ((mode->clock / 10) > rdev->clock.max_pixel_clock)
		return MODE_CLOCK_HIGH;

1536 1537 1538
	return MODE_OK;
}

1539
static const struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = {
1540
	.get_modes = radeon_vga_get_modes,
1541
	.mode_valid = radeon_dvi_mode_valid,
1542 1543 1544
	.best_encoder = radeon_dvi_encoder,
};

1545
static const struct drm_connector_funcs radeon_dvi_connector_funcs = {
1546 1547 1548 1549
	.dpms = drm_helper_connector_dpms,
	.detect = radeon_dvi_detect,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.set_property = radeon_connector_set_property,
1550
	.early_unregister = radeon_connector_unregister,
1551
	.destroy = radeon_connector_destroy,
1552
	.force = radeon_dvi_force,
1553 1554
};

1555 1556 1557
static int radeon_dp_get_modes(struct drm_connector *connector)
{
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1558
	struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1559
	struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1560 1561
	int ret;

1562 1563
	if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
	    (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1564 1565
		struct drm_display_mode *mode;

1566 1567 1568 1569
		if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
			if (!radeon_dig_connector->edp_on)
				atombios_set_edp_panel_power(connector,
							     ATOM_TRANSMITTER_ACTION_POWER_ON);
1570 1571
			radeon_connector_get_edid(connector);
			ret = radeon_ddc_get_modes(connector);
1572 1573 1574 1575 1576 1577 1578 1579 1580 1581
			if (!radeon_dig_connector->edp_on)
				atombios_set_edp_panel_power(connector,
							     ATOM_TRANSMITTER_ACTION_POWER_OFF);
		} else {
			/* need to setup ddc on the bridge */
			if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
			    ENCODER_OBJECT_ID_NONE) {
				if (encoder)
					radeon_atom_ext_encoder_setup_ddc(encoder);
			}
1582 1583
			radeon_connector_get_edid(connector);
			ret = radeon_ddc_get_modes(connector);
1584
		}
1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608

		if (ret > 0) {
			if (encoder) {
				radeon_fixup_lvds_native_mode(encoder, connector);
				/* add scaled modes */
				radeon_add_common_modes(encoder, connector);
			}
			return ret;
		}

		if (!encoder)
			return 0;

		/* we have no EDID modes */
		mode = radeon_fp_native_mode(encoder);
		if (mode) {
			ret = 1;
			drm_mode_probed_add(connector, mode);
			/* add the width/height from vbios tables if available */
			connector->display_info.width_mm = mode->width_mm;
			connector->display_info.height_mm = mode->height_mm;
			/* add scaled modes */
			radeon_add_common_modes(encoder, connector);
		}
1609 1610
	} else {
		/* need to setup ddc on the bridge */
1611 1612
		if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
			ENCODER_OBJECT_ID_NONE) {
1613 1614 1615
			if (encoder)
				radeon_atom_ext_encoder_setup_ddc(encoder);
		}
1616 1617
		radeon_connector_get_edid(connector);
		ret = radeon_ddc_get_modes(connector);
1618 1619

		radeon_get_native_mode(connector);
1620
	}
1621

1622 1623 1624
	return ret;
}

1625
u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector)
1626 1627 1628 1629 1630 1631 1632 1633 1634
{
	struct drm_encoder *encoder;
	struct radeon_encoder *radeon_encoder;
	int i;

	for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
		if (connector->encoder_ids[i] == 0)
			break;

1635
		encoder = drm_encoder_find(connector->dev, NULL, connector->encoder_ids[i]);
R
Rob Clark 已提交
1636
		if (!encoder)
1637 1638 1639 1640 1641 1642 1643
			continue;

		radeon_encoder = to_radeon_encoder(encoder);

		switch (radeon_encoder->encoder_id) {
		case ENCODER_OBJECT_ID_TRAVIS:
		case ENCODER_OBJECT_ID_NUTMEG:
1644
			return radeon_encoder->encoder_id;
1645 1646 1647 1648 1649
		default:
			break;
		}
	}

1650
	return ENCODER_OBJECT_ID_NONE;
1651 1652
}

1653
static bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
1654 1655 1656 1657 1658 1659 1660 1661 1662 1663
{
	struct drm_encoder *encoder;
	struct radeon_encoder *radeon_encoder;
	int i;
	bool found = false;

	for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
		if (connector->encoder_ids[i] == 0)
			break;

1664
		encoder = drm_encoder_find(connector->dev, NULL, connector->encoder_ids[i]);
R
Rob Clark 已提交
1665
		if (!encoder)
1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681
			continue;

		radeon_encoder = to_radeon_encoder(encoder);
		if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
			found = true;
	}

	return found;
}

bool radeon_connector_is_dp12_capable(struct drm_connector *connector)
{
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;

	if (ASIC_IS_DCE5(rdev) &&
1682
	    (rdev->clock.default_dispclk >= 53900) &&
1683 1684 1685 1686 1687 1688 1689
	    radeon_connector_encoder_is_hbr2(connector)) {
		return true;
	}

	return false;
}

1690
static enum drm_connector_status
1691
radeon_dp_detect(struct drm_connector *connector, bool force)
1692
{
1693 1694
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
1695 1696
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	enum drm_connector_status ret = connector_status_disconnected;
1697
	struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1698
	struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1699
	int r;
1700

1701 1702 1703
	if (radeon_dig_connector->is_mst)
		return connector_status_disconnected;

1704 1705 1706 1707 1708
	if (!drm_kms_helper_is_poll_worker()) {
		r = pm_runtime_get_sync(connector->dev->dev);
		if (r < 0)
			return connector_status_disconnected;
	}
1709 1710 1711 1712 1713

	if (!force && radeon_check_hpd_status_unchanged(connector)) {
		ret = connector->status;
		goto out;
	}
1714

1715
	radeon_connector_free_edid(connector);
1716

1717 1718
	if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
	    (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1719 1720 1721 1722 1723 1724 1725
		if (encoder) {
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
			struct drm_display_mode *native_mode = &radeon_encoder->native_mode;

			/* check if panel is valid */
			if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
				ret = connector_status_connected;
1726 1727 1728 1729 1730
			/* don't fetch the edid from the vbios if ddc fails and runpm is
			 * enabled so we report disconnected.
			 */
			if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))
				ret = connector_status_disconnected;
1731
		}
1732 1733
		/* eDP is always DP */
		radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
1734 1735 1736
		if (!radeon_dig_connector->edp_on)
			atombios_set_edp_panel_power(connector,
						     ATOM_TRANSMITTER_ACTION_POWER_ON);
1737
		if (radeon_dp_getdpcd(radeon_connector))
A
Alex Deucher 已提交
1738
			ret = connector_status_connected;
1739 1740 1741
		if (!radeon_dig_connector->edp_on)
			atombios_set_edp_panel_power(connector,
						     ATOM_TRANSMITTER_ACTION_POWER_OFF);
1742 1743
	} else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
		   ENCODER_OBJECT_ID_NONE) {
1744 1745 1746 1747 1748
		/* DP bridges are always DP */
		radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
		/* get the DPCD from the bridge */
		radeon_dp_getdpcd(radeon_connector);

1749 1750 1751
		if (encoder) {
			/* setup ddc on the bridge */
			radeon_atom_ext_encoder_setup_ddc(encoder);
1752 1753
			/* bridge chips are always aux */
			if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */
1754
				ret = connector_status_connected;
1755
			else if (radeon_connector->dac_load_detect) { /* try load detection */
1756
				const struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
1757 1758
				ret = encoder_funcs->detect(encoder, connector);
			}
1759
		}
1760
	} else {
1761
		radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
1762 1763
		if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
			ret = connector_status_connected;
1764
			if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
1765
				radeon_dp_getdpcd(radeon_connector);
1766 1767 1768 1769
				r = radeon_dp_mst_probe(radeon_connector);
				if (r == 1)
					ret = connector_status_disconnected;
			}
1770
		} else {
1771
			if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
1772 1773 1774 1775 1776 1777 1778
				if (radeon_dp_getdpcd(radeon_connector)) {
					r = radeon_dp_mst_probe(radeon_connector);
					if (r == 1)
						ret = connector_status_disconnected;
					else
						ret = connector_status_connected;
				}
1779
			} else {
D
Damien Lespiau 已提交
1780
				/* try non-aux ddc (DP to DVI/HDMI/etc. adapter) */
1781
				if (radeon_ddc_probe(radeon_connector, false))
1782 1783
					ret = connector_status_connected;
			}
1784
		}
1785
	}
1786

1787
	radeon_connector_update_scratch_regs(connector, ret);
1788

1789 1790 1791 1792
	if ((radeon_audio != 0) && encoder) {
		radeon_connector_get_edid(connector);
		radeon_audio_detect(connector, encoder, ret);
	}
1793

1794
out:
1795 1796 1797 1798
	if (!drm_kms_helper_is_poll_worker()) {
		pm_runtime_mark_last_busy(connector->dev->dev);
		pm_runtime_put_autosuspend(connector->dev->dev);
	}
1799

1800 1801 1802
	return ret;
}

1803
static enum drm_mode_status radeon_dp_mode_valid(struct drm_connector *connector,
1804 1805
				  struct drm_display_mode *mode)
{
1806 1807
	struct drm_device *dev = connector->dev;
	struct radeon_device *rdev = dev->dev_private;
1808 1809 1810 1811 1812
	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
	struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;

	/* XXX check mode bandwidth */

1813 1814
	if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
	    (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1815 1816 1817 1818 1819 1820 1821 1822 1823
		struct drm_encoder *encoder = radeon_best_single_encoder(connector);

		if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
			return MODE_PANEL;

		if (encoder) {
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
			struct drm_display_mode *native_mode = &radeon_encoder->native_mode;

1824
			/* AVIVO hardware supports downscaling modes larger than the panel
1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839
			 * to the panel size, but I'm not sure this is desirable.
			 */
			if ((mode->hdisplay > native_mode->hdisplay) ||
			    (mode->vdisplay > native_mode->vdisplay))
				return MODE_PANEL;

			/* if scaling is disabled, block non-native modes */
			if (radeon_encoder->rmx_type == RMX_OFF) {
				if ((mode->hdisplay != native_mode->hdisplay) ||
				    (mode->vdisplay != native_mode->vdisplay))
					return MODE_PANEL;
			}
		}
	} else {
		if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
1840
		    (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
1841
			return radeon_dp_mode_valid_helper(connector, mode);
1842
		} else {
1843
			if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
1844 1845 1846 1847 1848 1849 1850 1851
				/* HDMI 1.3+ supports max clock of 340 Mhz */
				if (mode->clock > 340000)
					return MODE_CLOCK_HIGH;
			} else {
				if (mode->clock > 165000)
					return MODE_CLOCK_HIGH;
			}
		}
1852
	}
1853 1854

	return MODE_OK;
1855 1856
}

1857
static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = {
1858
	.get_modes = radeon_dp_get_modes,
1859
	.mode_valid = radeon_dp_mode_valid,
1860 1861 1862
	.best_encoder = radeon_dvi_encoder,
};

1863
static const struct drm_connector_funcs radeon_dp_connector_funcs = {
1864 1865 1866 1867
	.dpms = drm_helper_connector_dpms,
	.detect = radeon_dp_detect,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.set_property = radeon_connector_set_property,
1868
	.early_unregister = radeon_connector_unregister,
1869
	.destroy = radeon_connector_destroy,
1870 1871 1872
	.force = radeon_dvi_force,
};

1873 1874 1875 1876 1877
static const struct drm_connector_funcs radeon_edp_connector_funcs = {
	.dpms = drm_helper_connector_dpms,
	.detect = radeon_dp_detect,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.set_property = radeon_lvds_set_property,
1878
	.early_unregister = radeon_connector_unregister,
1879
	.destroy = radeon_connector_destroy,
1880 1881 1882 1883 1884 1885 1886 1887
	.force = radeon_dvi_force,
};

static const struct drm_connector_funcs radeon_lvds_bridge_connector_funcs = {
	.dpms = drm_helper_connector_dpms,
	.detect = radeon_dp_detect,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.set_property = radeon_lvds_set_property,
1888
	.early_unregister = radeon_connector_unregister,
1889
	.destroy = radeon_connector_destroy,
1890 1891 1892
	.force = radeon_dvi_force,
};

1893 1894 1895 1896 1897 1898
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,
1899
			  uint32_t igp_lane_info,
1900
			  uint16_t connector_object_id,
1901 1902
			  struct radeon_hpd *hpd,
			  struct radeon_router *router)
1903
{
1904
	struct radeon_device *rdev = dev->dev_private;
1905 1906 1907
	struct drm_connector *connector;
	struct radeon_connector *radeon_connector;
	struct radeon_connector_atom_dig *radeon_dig_connector;
A
Alex Deucher 已提交
1908 1909
	struct drm_encoder *encoder;
	struct radeon_encoder *radeon_encoder;
1910
	uint32_t subpixel_order = SubPixelNone;
1911
	bool shared_ddc = false;
A
Alex Deucher 已提交
1912
	bool is_dp_bridge = false;
1913
	bool has_aux = false;
1914

1915
	if (connector_type == DRM_MODE_CONNECTOR_Unknown)
1916 1917
		return;

1918 1919 1920 1921 1922 1923 1924
	/* if the user selected tv=0 don't try and add the connector */
	if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
	     (connector_type == DRM_MODE_CONNECTOR_Composite) ||
	     (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
	    (radeon_tv == 0))
		return;

1925 1926 1927 1928 1929 1930 1931
	/* see if we already added it */
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
		radeon_connector = to_radeon_connector(connector);
		if (radeon_connector->connector_id == connector_id) {
			radeon_connector->devices |= supported_device;
			return;
		}
1932
		if (radeon_connector->ddc_bus && i2c_bus->valid) {
1933
			if (radeon_connector->ddc_bus->rec.i2c_id == i2c_bus->i2c_id) {
1934 1935 1936
				radeon_connector->shared_ddc = true;
				shared_ddc = true;
			}
1937
			if (radeon_connector->router_bus && router->ddc_valid &&
1938 1939 1940 1941
			    (radeon_connector->router.router_id == router->router_id)) {
				radeon_connector->shared_ddc = false;
				shared_ddc = false;
			}
1942
		}
1943 1944
	}

A
Alex Deucher 已提交
1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959
	/* check if it's a dp bridge */
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
		radeon_encoder = to_radeon_encoder(encoder);
		if (radeon_encoder->devices & supported_device) {
			switch (radeon_encoder->encoder_id) {
			case ENCODER_OBJECT_ID_TRAVIS:
			case ENCODER_OBJECT_ID_NUTMEG:
				is_dp_bridge = true;
				break;
			default:
				break;
			}
		}
	}

1960 1961 1962 1963 1964 1965 1966 1967
	radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
	if (!radeon_connector)
		return;

	connector = &radeon_connector->base;

	radeon_connector->connector_id = connector_id;
	radeon_connector->devices = supported_device;
1968
	radeon_connector->shared_ddc = shared_ddc;
1969
	radeon_connector->connector_object_id = connector_object_id;
1970
	radeon_connector->hpd = *hpd;
1971

1972
	radeon_connector->router = *router;
1973
	if (router->ddc_valid || router->cd_valid) {
1974 1975
		radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info);
		if (!radeon_connector->router_bus)
1976
			DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n");
1977
	}
A
Alex Deucher 已提交
1978 1979

	if (is_dp_bridge) {
1980 1981 1982 1983 1984 1985
		radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
		if (!radeon_dig_connector)
			goto failed;
		radeon_dig_connector->igp_lane_info = igp_lane_info;
		radeon_connector->con_priv = radeon_dig_connector;
		if (i2c_bus->valid) {
1986 1987
			radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
			if (radeon_connector->ddc_bus)
1988 1989
				has_aux = true;
			else
A
Alex Deucher 已提交
1990
				DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1991
		}
A
Alex Deucher 已提交
1992 1993 1994 1995
		switch (connector_type) {
		case DRM_MODE_CONNECTOR_VGA:
		case DRM_MODE_CONNECTOR_DVIA:
		default:
1996 1997 1998 1999
			drm_connector_init(dev, &radeon_connector->base,
					   &radeon_dp_connector_funcs, connector_type);
			drm_connector_helper_add(&radeon_connector->base,
						 &radeon_dp_connector_helper_funcs);
A
Alex Deucher 已提交
2000 2001
			connector->interlace_allowed = true;
			connector->doublescan_allowed = true;
2002
			radeon_connector->dac_load_detect = true;
2003
			drm_object_attach_property(&radeon_connector->base.base,
2004 2005
						      rdev->mode_info.load_detect_property,
						      1);
2006 2007 2008
			drm_object_attach_property(&radeon_connector->base.base,
						   dev->mode_config.scaling_mode_property,
						   DRM_MODE_SCALE_NONE);
2009 2010 2011 2012
			if (ASIC_IS_DCE5(rdev))
				drm_object_attach_property(&radeon_connector->base.base,
							   rdev->mode_info.output_csc_property,
							   RADEON_OUTPUT_CSC_BYPASS);
A
Alex Deucher 已提交
2013 2014 2015 2016 2017 2018
			break;
		case DRM_MODE_CONNECTOR_DVII:
		case DRM_MODE_CONNECTOR_DVID:
		case DRM_MODE_CONNECTOR_HDMIA:
		case DRM_MODE_CONNECTOR_HDMIB:
		case DRM_MODE_CONNECTOR_DisplayPort:
2019 2020 2021 2022
			drm_connector_init(dev, &radeon_connector->base,
					   &radeon_dp_connector_funcs, connector_type);
			drm_connector_helper_add(&radeon_connector->base,
						 &radeon_dp_connector_helper_funcs);
2023
			drm_object_attach_property(&radeon_connector->base.base,
2024
						      rdev->mode_info.underscan_property,
2025
						      UNDERSCAN_OFF);
2026
			drm_object_attach_property(&radeon_connector->base.base,
2027 2028
						      rdev->mode_info.underscan_hborder_property,
						      0);
2029
			drm_object_attach_property(&radeon_connector->base.base,
2030 2031
						      rdev->mode_info.underscan_vborder_property,
						      0);
2032

2033 2034 2035 2036
			drm_object_attach_property(&radeon_connector->base.base,
						      dev->mode_config.scaling_mode_property,
						      DRM_MODE_SCALE_NONE);

2037 2038 2039
			drm_object_attach_property(&radeon_connector->base.base,
						   rdev->mode_info.dither_property,
						   RADEON_FMT_DITHER_DISABLE);
2040

2041
			if (radeon_audio != 0) {
A
Alex Deucher 已提交
2042 2043
				drm_object_attach_property(&radeon_connector->base.base,
							   rdev->mode_info.audio_property,
2044
							   RADEON_AUDIO_AUTO);
2045 2046
				radeon_connector->audio = RADEON_AUDIO_AUTO;
			}
2047 2048 2049 2050
			if (ASIC_IS_DCE5(rdev))
				drm_object_attach_property(&radeon_connector->base.base,
							   rdev->mode_info.output_csc_property,
							   RADEON_OUTPUT_CSC_BYPASS);
2051

A
Alex Deucher 已提交
2052 2053 2054 2055 2056 2057
			subpixel_order = SubPixelHorizontalRGB;
			connector->interlace_allowed = true;
			if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
				connector->doublescan_allowed = true;
			else
				connector->doublescan_allowed = false;
2058 2059
			if (connector_type == DRM_MODE_CONNECTOR_DVII) {
				radeon_connector->dac_load_detect = true;
2060
				drm_object_attach_property(&radeon_connector->base.base,
2061 2062 2063
							      rdev->mode_info.load_detect_property,
							      1);
			}
A
Alex Deucher 已提交
2064 2065 2066
			break;
		case DRM_MODE_CONNECTOR_LVDS:
		case DRM_MODE_CONNECTOR_eDP:
2067 2068 2069 2070
			drm_connector_init(dev, &radeon_connector->base,
					   &radeon_lvds_bridge_connector_funcs, connector_type);
			drm_connector_helper_add(&radeon_connector->base,
						 &radeon_dp_connector_helper_funcs);
2071
			drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2072 2073 2074 2075 2076 2077
						      dev->mode_config.scaling_mode_property,
						      DRM_MODE_SCALE_FULLSCREEN);
			subpixel_order = SubPixelHorizontalRGB;
			connector->interlace_allowed = false;
			connector->doublescan_allowed = false;
			break;
2078
		}
A
Alex Deucher 已提交
2079 2080 2081 2082 2083 2084 2085 2086 2087 2088
	} else {
		switch (connector_type) {
		case DRM_MODE_CONNECTOR_VGA:
			drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
			drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
			if (i2c_bus->valid) {
				radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
				if (!radeon_connector->ddc_bus)
					DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
			}
A
Alex Deucher 已提交
2089
			radeon_connector->dac_load_detect = true;
2090
			drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2091 2092
						      rdev->mode_info.load_detect_property,
						      1);
2093 2094 2095 2096
			if (ASIC_IS_AVIVO(rdev))
				drm_object_attach_property(&radeon_connector->base.base,
							   dev->mode_config.scaling_mode_property,
							   DRM_MODE_SCALE_NONE);
2097 2098 2099 2100
			if (ASIC_IS_DCE5(rdev))
				drm_object_attach_property(&radeon_connector->base.base,
							   rdev->mode_info.output_csc_property,
							   RADEON_OUTPUT_CSC_BYPASS);
A
Alex Deucher 已提交
2101 2102 2103
			/* no HPD on analog connectors */
			radeon_connector->hpd.hpd = RADEON_HPD_NONE;
			connector->interlace_allowed = true;
2104
			connector->doublescan_allowed = true;
A
Alex Deucher 已提交
2105 2106 2107 2108 2109 2110 2111 2112 2113 2114
			break;
		case DRM_MODE_CONNECTOR_DVIA:
			drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
			drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
			if (i2c_bus->valid) {
				radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
				if (!radeon_connector->ddc_bus)
					DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
			}
			radeon_connector->dac_load_detect = true;
2115
			drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2116 2117
						      rdev->mode_info.load_detect_property,
						      1);
2118 2119 2120 2121
			if (ASIC_IS_AVIVO(rdev))
				drm_object_attach_property(&radeon_connector->base.base,
							   dev->mode_config.scaling_mode_property,
							   DRM_MODE_SCALE_NONE);
2122 2123 2124 2125
			if (ASIC_IS_DCE5(rdev))
				drm_object_attach_property(&radeon_connector->base.base,
							   rdev->mode_info.output_csc_property,
							   RADEON_OUTPUT_CSC_BYPASS);
A
Alex Deucher 已提交
2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145
			/* no HPD on analog connectors */
			radeon_connector->hpd.hpd = RADEON_HPD_NONE;
			connector->interlace_allowed = true;
			connector->doublescan_allowed = true;
			break;
		case DRM_MODE_CONNECTOR_DVII:
		case DRM_MODE_CONNECTOR_DVID:
			radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
			if (!radeon_dig_connector)
				goto failed;
			radeon_dig_connector->igp_lane_info = igp_lane_info;
			radeon_connector->con_priv = radeon_dig_connector;
			drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
			drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
			if (i2c_bus->valid) {
				radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
				if (!radeon_connector->ddc_bus)
					DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
			}
			subpixel_order = SubPixelHorizontalRGB;
2146
			drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2147 2148 2149
						      rdev->mode_info.coherent_mode_property,
						      1);
			if (ASIC_IS_AVIVO(rdev)) {
2150
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2151 2152
							      rdev->mode_info.underscan_property,
							      UNDERSCAN_OFF);
2153
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2154 2155
							      rdev->mode_info.underscan_hborder_property,
							      0);
2156
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2157 2158
							      rdev->mode_info.underscan_vborder_property,
							      0);
2159 2160 2161 2162 2163 2164
				drm_object_attach_property(&radeon_connector->base.base,
							   rdev->mode_info.dither_property,
							   RADEON_FMT_DITHER_DISABLE);
				drm_object_attach_property(&radeon_connector->base.base,
							   dev->mode_config.scaling_mode_property,
							   DRM_MODE_SCALE_NONE);
A
Alex Deucher 已提交
2165
			}
A
Alex Deucher 已提交
2166
			if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {
2167
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2168
							   rdev->mode_info.audio_property,
2169
							   RADEON_AUDIO_AUTO);
2170
				radeon_connector->audio = RADEON_AUDIO_AUTO;
2171
			}
A
Alex Deucher 已提交
2172 2173
			if (connector_type == DRM_MODE_CONNECTOR_DVII) {
				radeon_connector->dac_load_detect = true;
2174
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2175 2176 2177
							      rdev->mode_info.load_detect_property,
							      1);
			}
2178 2179 2180 2181
			if (ASIC_IS_DCE5(rdev))
				drm_object_attach_property(&radeon_connector->base.base,
							   rdev->mode_info.output_csc_property,
							   RADEON_OUTPUT_CSC_BYPASS);
A
Alex Deucher 已提交
2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201
			connector->interlace_allowed = true;
			if (connector_type == DRM_MODE_CONNECTOR_DVII)
				connector->doublescan_allowed = true;
			else
				connector->doublescan_allowed = false;
			break;
		case DRM_MODE_CONNECTOR_HDMIA:
		case DRM_MODE_CONNECTOR_HDMIB:
			radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
			if (!radeon_dig_connector)
				goto failed;
			radeon_dig_connector->igp_lane_info = igp_lane_info;
			radeon_connector->con_priv = radeon_dig_connector;
			drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
			drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
			if (i2c_bus->valid) {
				radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
				if (!radeon_connector->ddc_bus)
					DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
			}
2202
			drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2203 2204 2205
						      rdev->mode_info.coherent_mode_property,
						      1);
			if (ASIC_IS_AVIVO(rdev)) {
2206
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2207 2208
							      rdev->mode_info.underscan_property,
							      UNDERSCAN_OFF);
2209
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2210 2211
							      rdev->mode_info.underscan_hborder_property,
							      0);
2212
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2213 2214
							      rdev->mode_info.underscan_vborder_property,
							      0);
2215 2216 2217 2218 2219 2220
				drm_object_attach_property(&radeon_connector->base.base,
							   rdev->mode_info.dither_property,
							   RADEON_FMT_DITHER_DISABLE);
				drm_object_attach_property(&radeon_connector->base.base,
							   dev->mode_config.scaling_mode_property,
							   DRM_MODE_SCALE_NONE);
A
Alex Deucher 已提交
2221
			}
A
Alex Deucher 已提交
2222
			if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {
2223
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2224
							   rdev->mode_info.audio_property,
2225
							   RADEON_AUDIO_AUTO);
2226
				radeon_connector->audio = RADEON_AUDIO_AUTO;
2227
			}
2228 2229 2230 2231
			if (ASIC_IS_DCE5(rdev))
				drm_object_attach_property(&radeon_connector->base.base,
							   rdev->mode_info.output_csc_property,
							   RADEON_OUTPUT_CSC_BYPASS);
A
Alex Deucher 已提交
2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248
			subpixel_order = SubPixelHorizontalRGB;
			connector->interlace_allowed = true;
			if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
				connector->doublescan_allowed = true;
			else
				connector->doublescan_allowed = false;
			break;
		case DRM_MODE_CONNECTOR_DisplayPort:
			radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
			if (!radeon_dig_connector)
				goto failed;
			radeon_dig_connector->igp_lane_info = igp_lane_info;
			radeon_connector->con_priv = radeon_dig_connector;
			drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
			drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
			if (i2c_bus->valid) {
				radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
2249 2250 2251
				if (radeon_connector->ddc_bus)
					has_aux = true;
				else
A
Alex Deucher 已提交
2252 2253 2254
					DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
			}
			subpixel_order = SubPixelHorizontalRGB;
2255
			drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2256 2257 2258
						      rdev->mode_info.coherent_mode_property,
						      1);
			if (ASIC_IS_AVIVO(rdev)) {
2259
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2260 2261
							      rdev->mode_info.underscan_property,
							      UNDERSCAN_OFF);
2262
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2263 2264
							      rdev->mode_info.underscan_hborder_property,
							      0);
2265
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2266 2267
							      rdev->mode_info.underscan_vborder_property,
							      0);
2268 2269 2270 2271 2272 2273
				drm_object_attach_property(&radeon_connector->base.base,
							   rdev->mode_info.dither_property,
							   RADEON_FMT_DITHER_DISABLE);
				drm_object_attach_property(&radeon_connector->base.base,
							   dev->mode_config.scaling_mode_property,
							   DRM_MODE_SCALE_NONE);
A
Alex Deucher 已提交
2274
			}
A
Alex Deucher 已提交
2275
			if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {
2276
				drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2277
							   rdev->mode_info.audio_property,
2278
							   RADEON_AUDIO_AUTO);
2279
				radeon_connector->audio = RADEON_AUDIO_AUTO;
2280
			}
2281 2282 2283 2284
			if (ASIC_IS_DCE5(rdev))
				drm_object_attach_property(&radeon_connector->base.base,
							   rdev->mode_info.output_csc_property,
							   RADEON_OUTPUT_CSC_BYPASS);
A
Alex Deucher 已提交
2285 2286
			connector->interlace_allowed = true;
			/* in theory with a DP to VGA converter... */
2287
			connector->doublescan_allowed = false;
A
Alex Deucher 已提交
2288 2289 2290 2291 2292 2293 2294
			break;
		case DRM_MODE_CONNECTOR_eDP:
			radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
			if (!radeon_dig_connector)
				goto failed;
			radeon_dig_connector->igp_lane_info = igp_lane_info;
			radeon_connector->con_priv = radeon_dig_connector;
2295
			drm_connector_init(dev, &radeon_connector->base, &radeon_edp_connector_funcs, connector_type);
A
Alex Deucher 已提交
2296 2297
			drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
			if (i2c_bus->valid) {
2298 2299
				radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
				if (radeon_connector->ddc_bus)
2300 2301
					has_aux = true;
				else
A
Alex Deucher 已提交
2302 2303
					DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
			}
2304
			drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316
						      dev->mode_config.scaling_mode_property,
						      DRM_MODE_SCALE_FULLSCREEN);
			subpixel_order = SubPixelHorizontalRGB;
			connector->interlace_allowed = false;
			connector->doublescan_allowed = false;
			break;
		case DRM_MODE_CONNECTOR_SVIDEO:
		case DRM_MODE_CONNECTOR_Composite:
		case DRM_MODE_CONNECTOR_9PinDIN:
			drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
			drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
			radeon_connector->dac_load_detect = true;
2317
			drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2318 2319
						      rdev->mode_info.load_detect_property,
						      1);
2320
			drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340
						      rdev->mode_info.tv_std_property,
						      radeon_atombios_get_tv_info(rdev));
			/* no HPD on analog connectors */
			radeon_connector->hpd.hpd = RADEON_HPD_NONE;
			connector->interlace_allowed = false;
			connector->doublescan_allowed = false;
			break;
		case DRM_MODE_CONNECTOR_LVDS:
			radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
			if (!radeon_dig_connector)
				goto failed;
			radeon_dig_connector->igp_lane_info = igp_lane_info;
			radeon_connector->con_priv = radeon_dig_connector;
			drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
			drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
			if (i2c_bus->valid) {
				radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
				if (!radeon_connector->ddc_bus)
					DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
			}
2341
			drm_object_attach_property(&radeon_connector->base.base,
A
Alex Deucher 已提交
2342 2343 2344 2345 2346 2347
						      dev->mode_config.scaling_mode_property,
						      DRM_MODE_SCALE_FULLSCREEN);
			subpixel_order = SubPixelHorizontalRGB;
			connector->interlace_allowed = false;
			connector->doublescan_allowed = false;
			break;
2348 2349 2350
		}
	}

2351
	if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
2352 2353 2354 2355
		if (i2c_bus->valid) {
			connector->polled = DRM_CONNECTOR_POLL_CONNECT |
			                    DRM_CONNECTOR_POLL_DISCONNECT;
		}
2356 2357 2358
	} else
		connector->polled = DRM_CONNECTOR_POLL_HPD;

2359
	connector->display_info.subpixel_order = subpixel_order;
2360
	drm_connector_register(connector);
2361 2362 2363 2364

	if (has_aux)
		radeon_dp_aux_init(radeon_connector);

2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376
	return;

failed:
	drm_connector_cleanup(connector);
	kfree(connector);
}

void
radeon_add_legacy_connector(struct drm_device *dev,
			    uint32_t connector_id,
			    uint32_t supported_device,
			    int connector_type,
2377
			    struct radeon_i2c_bus_rec *i2c_bus,
2378 2379
			    uint16_t connector_object_id,
			    struct radeon_hpd *hpd)
2380
{
2381
	struct radeon_device *rdev = dev->dev_private;
2382 2383 2384 2385
	struct drm_connector *connector;
	struct radeon_connector *radeon_connector;
	uint32_t subpixel_order = SubPixelNone;

2386
	if (connector_type == DRM_MODE_CONNECTOR_Unknown)
2387 2388
		return;

2389 2390 2391 2392 2393 2394 2395
	/* if the user selected tv=0 don't try and add the connector */
	if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
	     (connector_type == DRM_MODE_CONNECTOR_Composite) ||
	     (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
	    (radeon_tv == 0))
		return;

2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412
	/* see if we already added it */
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
		radeon_connector = to_radeon_connector(connector);
		if (radeon_connector->connector_id == connector_id) {
			radeon_connector->devices |= supported_device;
			return;
		}
	}

	radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
	if (!radeon_connector)
		return;

	connector = &radeon_connector->base;

	radeon_connector->connector_id = connector_id;
	radeon_connector->devices = supported_device;
2413
	radeon_connector->connector_object_id = connector_object_id;
2414
	radeon_connector->hpd = *hpd;
2415

2416 2417 2418
	switch (connector_type) {
	case DRM_MODE_CONNECTOR_VGA:
		drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
2419
		drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
2420
		if (i2c_bus->valid) {
2421
			radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
2422
			if (!radeon_connector->ddc_bus)
2423
				DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
2424
		}
2425
		radeon_connector->dac_load_detect = true;
2426
		drm_object_attach_property(&radeon_connector->base.base,
2427 2428
					      rdev->mode_info.load_detect_property,
					      1);
2429 2430
		/* no HPD on analog connectors */
		radeon_connector->hpd.hpd = RADEON_HPD_NONE;
2431 2432
		connector->interlace_allowed = true;
		connector->doublescan_allowed = true;
2433 2434 2435
		break;
	case DRM_MODE_CONNECTOR_DVIA:
		drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
2436
		drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
2437
		if (i2c_bus->valid) {
2438
			radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
2439
			if (!radeon_connector->ddc_bus)
2440
				DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
2441
		}
2442
		radeon_connector->dac_load_detect = true;
2443
		drm_object_attach_property(&radeon_connector->base.base,
2444 2445
					      rdev->mode_info.load_detect_property,
					      1);
2446 2447
		/* no HPD on analog connectors */
		radeon_connector->hpd.hpd = RADEON_HPD_NONE;
2448 2449
		connector->interlace_allowed = true;
		connector->doublescan_allowed = true;
2450 2451 2452 2453
		break;
	case DRM_MODE_CONNECTOR_DVII:
	case DRM_MODE_CONNECTOR_DVID:
		drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
2454
		drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
2455
		if (i2c_bus->valid) {
2456
			radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
2457
			if (!radeon_connector->ddc_bus)
2458
				DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
2459 2460
		}
		if (connector_type == DRM_MODE_CONNECTOR_DVII) {
2461
			radeon_connector->dac_load_detect = true;
2462
			drm_object_attach_property(&radeon_connector->base.base,
2463 2464
						      rdev->mode_info.load_detect_property,
						      1);
2465 2466
		}
		subpixel_order = SubPixelHorizontalRGB;
2467 2468 2469 2470 2471
		connector->interlace_allowed = true;
		if (connector_type == DRM_MODE_CONNECTOR_DVII)
			connector->doublescan_allowed = true;
		else
			connector->doublescan_allowed = false;
2472 2473 2474 2475
		break;
	case DRM_MODE_CONNECTOR_SVIDEO:
	case DRM_MODE_CONNECTOR_Composite:
	case DRM_MODE_CONNECTOR_9PinDIN:
2476 2477 2478 2479 2480 2481 2482 2483 2484 2485
		drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
		drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
		radeon_connector->dac_load_detect = true;
		/* RS400,RC410,RS480 chipset seems to report a lot
		 * of false positive on load detect, we haven't yet
		 * found a way to make load detect reliable on those
		 * chipset, thus just disable it for TV.
		 */
		if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480)
			radeon_connector->dac_load_detect = false;
2486
		drm_object_attach_property(&radeon_connector->base.base,
2487 2488
					      rdev->mode_info.load_detect_property,
					      radeon_connector->dac_load_detect);
2489
		drm_object_attach_property(&radeon_connector->base.base,
2490 2491 2492 2493
					      rdev->mode_info.tv_std_property,
					      radeon_combios_get_tv_info(rdev));
		/* no HPD on analog connectors */
		radeon_connector->hpd.hpd = RADEON_HPD_NONE;
2494 2495
		connector->interlace_allowed = false;
		connector->doublescan_allowed = false;
2496 2497 2498
		break;
	case DRM_MODE_CONNECTOR_LVDS:
		drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
2499
		drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
2500
		if (i2c_bus->valid) {
2501
			radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
2502
			if (!radeon_connector->ddc_bus)
2503
				DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
2504
		}
2505
		drm_object_attach_property(&radeon_connector->base.base,
2506 2507
					      dev->mode_config.scaling_mode_property,
					      DRM_MODE_SCALE_FULLSCREEN);
2508
		subpixel_order = SubPixelHorizontalRGB;
2509 2510
		connector->interlace_allowed = false;
		connector->doublescan_allowed = false;
2511 2512 2513
		break;
	}

2514
	if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
2515 2516 2517 2518
		if (i2c_bus->valid) {
			connector->polled = DRM_CONNECTOR_POLL_CONNECT |
			                    DRM_CONNECTOR_POLL_DISCONNECT;
		}
2519 2520
	} else
		connector->polled = DRM_CONNECTOR_POLL_HPD;
2521

2522
	connector->display_info.subpixel_order = subpixel_order;
2523
	drm_connector_register(connector);
2524
}
2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548

void radeon_setup_mst_connector(struct drm_device *dev)
{
	struct radeon_device *rdev = dev->dev_private;
	struct drm_connector *connector;
	struct radeon_connector *radeon_connector;

	if (!ASIC_IS_DCE5(rdev))
		return;

	if (radeon_mst == 0)
		return;

	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
		int ret;

		radeon_connector = to_radeon_connector(connector);

		if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
			continue;

		ret = radeon_dp_mst_init(radeon_connector);
	}
}