nouveau_connector.c 33.3 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 26
/*
 * Copyright (C) 2008 Maarten Maathuis.
 * All Rights Reserved.
 *
 * 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 (including the
 * next paragraph) 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 OWNER(S) AND/OR ITS SUPPLIERS 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.
 *
 */

27 28
#include <acpi/button.h>

29 30 31
#include <drm/drmP.h>
#include <drm/drm_edid.h>
#include <drm/drm_crtc_helper.h>
32

33
#include "nouveau_reg.h"
34
#include "nouveau_drm.h"
35
#include "nouveau_hw.h"
36
#include "nouveau_acpi.h"
37

38 39
#include "nouveau_display.h"
#include "nouveau_connector.h"
40 41
#include "nouveau_encoder.h"
#include "nouveau_crtc.h"
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

#include <subdev/i2c.h>
#include <subdev/gpio.h>

MODULE_PARM_DESC(tv_disable, "Disable TV-out detection");
static int nouveau_tv_disable = 0;
module_param_named(tv_disable, nouveau_tv_disable, int, 0400);

MODULE_PARM_DESC(ignorelid, "Ignore ACPI lid status");
static int nouveau_ignorelid = 0;
module_param_named(ignorelid, nouveau_ignorelid, int, 0400);

MODULE_PARM_DESC(duallink, "Allow dual-link TMDS (default: enabled)");
static int nouveau_duallink = 1;
module_param_named(duallink, nouveau_duallink, int, 0400);
57

58
struct nouveau_encoder *
59
find_encoder(struct drm_connector *connector, int type)
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
{
	struct drm_device *dev = connector->dev;
	struct nouveau_encoder *nv_encoder;
	struct drm_mode_object *obj;
	int i, id;

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

		obj = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER);
		if (!obj)
			continue;
		nv_encoder = nouveau_encoder(obj_to_encoder(obj));

76
		if (type == DCB_OUTPUT_ANY || nv_encoder->dcb->type == type)
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
			return nv_encoder;
	}

	return NULL;
}

struct nouveau_connector *
nouveau_encoder_connector_get(struct nouveau_encoder *encoder)
{
	struct drm_device *dev = to_drm_encoder(encoder)->dev;
	struct drm_connector *drm_connector;

	list_for_each_entry(drm_connector, &dev->mode_config.connector_list, head) {
		if (drm_connector->encoder == to_drm_encoder(encoder))
			return nouveau_connector(drm_connector);
	}

	return NULL;
}

static void
98
nouveau_connector_destroy(struct drm_connector *connector)
99
{
100
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
101
	kfree(nv_connector->edid);
102 103 104
	drm_sysfs_connector_remove(connector);
	drm_connector_cleanup(connector);
	kfree(connector);
105 106
}

107
static struct nouveau_i2c_port *
108 109 110 111
nouveau_connector_ddc_detect(struct drm_connector *connector,
			     struct nouveau_encoder **pnv_encoder)
{
	struct drm_device *dev = connector->dev;
112
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
113
	struct nouveau_drm *drm = nouveau_drm(dev);
114
	struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
115
	struct nouveau_i2c *i2c = nouveau_i2c(drm->device);
116 117 118 119 120 121 122 123 124 125 126 127 128 129
	struct nouveau_i2c_port *port = NULL;
	int i, panel = -ENODEV;

	/* eDP panels need powering on by us (if the VBIOS doesn't default it
	 * to on) before doing any AUX channel transactions.  LVDS panel power
	 * is handled by the SOR itself, and not required for LVDS DDC.
	 */
	if (nv_connector->type == DCB_CONNECTOR_eDP) {
		panel = gpio->get(gpio, 0, DCB_GPIO_PANEL_POWER, 0xff);
		if (panel == 0) {
			gpio->set(gpio, 0, DCB_GPIO_PANEL_POWER, 0xff, 1);
			msleep(300);
		}
	}
130 131 132 133 134 135 136 137 138 139 140 141 142 143

	for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
		struct nouveau_encoder *nv_encoder;
		struct drm_mode_object *obj;
		int id;

		id = connector->encoder_ids[i];
		if (!id)
			break;

		obj = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER);
		if (!obj)
			continue;
		nv_encoder = nouveau_encoder(obj_to_encoder(obj));
144 145

		if (nv_encoder->dcb->i2c_index < 0xf)
146 147
			port = i2c->find(i2c, nv_encoder->dcb->i2c_index);
		if (port && nv_probe_i2c(port, 0x50)) {
148
			*pnv_encoder = nv_encoder;
149
			break;
150
		}
151 152

		port = NULL;
153 154
	}

155 156 157 158 159 160 161
	/* eDP panel not detected, restore panel power GPIO to previous
	 * state to avoid confusing the SOR for other output types.
	 */
	if (!port && panel == 0)
		gpio->set(gpio, 0, DCB_GPIO_PANEL_POWER, 0xff, panel);

	return port;
162 163
}

164 165 166 167 168 169 170 171 172 173
static struct nouveau_encoder *
nouveau_connector_of_detect(struct drm_connector *connector)
{
#ifdef __powerpc__
	struct drm_device *dev = connector->dev;
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder;
	struct device_node *cn, *dn = pci_device_to_OF_node(dev->pdev);

	if (!dn ||
174 175
	    !((nv_encoder = find_encoder(connector, DCB_OUTPUT_TMDS)) ||
	      (nv_encoder = find_encoder(connector, DCB_OUTPUT_ANALOG))))
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
		return NULL;

	for_each_child_of_node(dn, cn) {
		const char *name = of_get_property(cn, "name", NULL);
		const void *edid = of_get_property(cn, "EDID", NULL);
		int idx = name ? name[strlen(name) - 1] - 'A' : 0;

		if (nv_encoder->dcb->i2c_index == idx && edid) {
			nv_connector->edid =
				kmemdup(edid, EDID_LENGTH, GFP_KERNEL);
			of_node_put(cn);
			return nv_encoder;
		}
	}
#endif
	return NULL;
}

194 195 196 197 198
static void
nouveau_connector_set_encoder(struct drm_connector *connector,
			      struct nouveau_encoder *nv_encoder)
{
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
199
	struct nouveau_drm *drm = nouveau_drm(connector->dev);
200 201 202 203 204 205
	struct drm_device *dev = connector->dev;

	if (nv_connector->detected_encoder == nv_encoder)
		return;
	nv_connector->detected_encoder = nv_encoder;

206
	if (nv_device(drm->device)->card_type >= NV_50) {
207 208 209
		connector->interlace_allowed = true;
		connector->doublescan_allowed = true;
	} else
210 211
	if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS ||
	    nv_encoder->dcb->type == DCB_OUTPUT_TMDS) {
212 213 214 215
		connector->doublescan_allowed = false;
		connector->interlace_allowed = false;
	} else {
		connector->doublescan_allowed = true;
216 217
		if (nv_device(drm->device)->card_type == NV_20 ||
		   (nv_device(drm->device)->card_type == NV_10 &&
218 219 220 221 222 223 224 225
		    (dev->pci_device & 0x0ff0) != 0x0100 &&
		    (dev->pci_device & 0x0ff0) != 0x0150))
			/* HW is broken */
			connector->interlace_allowed = false;
		else
			connector->interlace_allowed = true;
	}

226
	if (nv_connector->type == DCB_CONNECTOR_DVI_I) {
227
		drm_object_property_set_value(&connector->base,
228
			dev->mode_config.dvi_i_subconnector_property,
229
			nv_encoder->dcb->type == DCB_OUTPUT_TMDS ?
230 231 232 233 234 235
			DRM_MODE_SUBCONNECTOR_DVID :
			DRM_MODE_SUBCONNECTOR_DVIA);
	}
}

static enum drm_connector_status
236
nouveau_connector_detect(struct drm_connector *connector, bool force)
237 238
{
	struct drm_device *dev = connector->dev;
239
	struct nouveau_drm *drm = nouveau_drm(dev);
240 241
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder = NULL;
242
	struct nouveau_encoder *nv_partner;
243
	struct nouveau_i2c_port *i2c;
244
	int type;
245

246 247 248 249 250 251
	/* Cleanup the previous EDID block. */
	if (nv_connector->edid) {
		drm_mode_connector_update_edid_property(connector, NULL);
		kfree(nv_connector->edid);
		nv_connector->edid = NULL;
	}
252

253 254 255 256 257 258
	i2c = nouveau_connector_ddc_detect(connector, &nv_encoder);
	if (i2c) {
		nv_connector->edid = drm_get_edid(connector, &i2c->adapter);
		drm_mode_connector_update_edid_property(connector,
							nv_connector->edid);
		if (!nv_connector->edid) {
259
			NV_ERROR(drm, "DDC responded, but no EDID for %s\n",
260
				 drm_get_connector_name(connector));
261
			goto detect_analog;
262 263
		}

264
		if (nv_encoder->dcb->type == DCB_OUTPUT_DP &&
265
		    !nouveau_dp_detect(to_drm_encoder(nv_encoder))) {
266
			NV_ERROR(drm, "Detected %s, but failed init\n",
267 268 269 270 271 272 273 274 275
				 drm_get_connector_name(connector));
			return connector_status_disconnected;
		}

		/* Override encoder type for DVI-I based on whether EDID
		 * says the display is digital or analog, both use the
		 * same i2c channel so the value returned from ddc_detect
		 * isn't necessarily correct.
		 */
276
		nv_partner = NULL;
277 278 279 280 281 282 283 284 285
		if (nv_encoder->dcb->type == DCB_OUTPUT_TMDS)
			nv_partner = find_encoder(connector, DCB_OUTPUT_ANALOG);
		if (nv_encoder->dcb->type == DCB_OUTPUT_ANALOG)
			nv_partner = find_encoder(connector, DCB_OUTPUT_TMDS);

		if (nv_partner && ((nv_encoder->dcb->type == DCB_OUTPUT_ANALOG &&
				    nv_partner->dcb->type == DCB_OUTPUT_TMDS) ||
				   (nv_encoder->dcb->type == DCB_OUTPUT_TMDS &&
				    nv_partner->dcb->type == DCB_OUTPUT_ANALOG))) {
286
			if (nv_connector->edid->input & DRM_EDID_INPUT_DIGITAL)
287
				type = DCB_OUTPUT_TMDS;
288
			else
289
				type = DCB_OUTPUT_ANALOG;
290

291
			nv_encoder = find_encoder(connector, type);
292 293 294 295 296 297
		}

		nouveau_connector_set_encoder(connector, nv_encoder);
		return connector_status_connected;
	}

298 299 300 301 302 303
	nv_encoder = nouveau_connector_of_detect(connector);
	if (nv_encoder) {
		nouveau_connector_set_encoder(connector, nv_encoder);
		return connector_status_connected;
	}

304
detect_analog:
305
	nv_encoder = find_encoder(connector, DCB_OUTPUT_ANALOG);
306
	if (!nv_encoder && !nouveau_tv_disable)
307
		nv_encoder = find_encoder(connector, DCB_OUTPUT_TV);
308
	if (nv_encoder && force) {
309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
		struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
		struct drm_encoder_helper_funcs *helper =
						encoder->helper_private;

		if (helper->detect(encoder, connector) ==
						connector_status_connected) {
			nouveau_connector_set_encoder(connector, nv_encoder);
			return connector_status_connected;
		}

	}

	return connector_status_disconnected;
}

324
static enum drm_connector_status
325
nouveau_connector_detect_lvds(struct drm_connector *connector, bool force)
326 327
{
	struct drm_device *dev = connector->dev;
328
	struct nouveau_drm *drm = nouveau_drm(dev);
329 330 331 332 333 334 335 336 337 338 339
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder = NULL;
	enum drm_connector_status status = connector_status_disconnected;

	/* Cleanup the previous EDID block. */
	if (nv_connector->edid) {
		drm_mode_connector_update_edid_property(connector, NULL);
		kfree(nv_connector->edid);
		nv_connector->edid = NULL;
	}

340
	nv_encoder = find_encoder(connector, DCB_OUTPUT_LVDS);
341 342 343
	if (!nv_encoder)
		return connector_status_disconnected;

344
	/* Try retrieving EDID via DDC */
345
	if (!drm->vbios.fp_no_ddc) {
346
		status = nouveau_connector_detect(connector, force);
347 348 349 350
		if (status == connector_status_connected)
			goto out;
	}

351 352 353 354 355 356 357 358 359 360
	/* On some laptops (Sony, i'm looking at you) there appears to
	 * be no direct way of accessing the panel's EDID.  The only
	 * option available to us appears to be to ask ACPI for help..
	 *
	 * It's important this check's before trying straps, one of the
	 * said manufacturer's laptops are configured in such a way
	 * the nouveau decides an entry in the VBIOS FP mode table is
	 * valid - it's not (rh#613284)
	 */
	if (nv_encoder->dcb->lvdsconf.use_acpi_for_edid) {
361
		if ((nv_connector->edid = nouveau_acpi_edid(dev, connector))) {
362 363 364 365 366
			status = connector_status_connected;
			goto out;
		}
	}

367 368 369 370
	/* If no EDID found above, and the VBIOS indicates a hardcoded
	 * modeline is avalilable for the panel, set it as the panel's
	 * native mode and exit.
	 */
371
	if (nouveau_bios_fp_mode(dev, NULL) && (drm->vbios.fp_no_ddc ||
372 373 374 375 376 377 378 379
	    nv_encoder->dcb->lvdsconf.use_straps_for_mode)) {
		status = connector_status_connected;
		goto out;
	}

	/* Still nothing, some VBIOS images have a hardcoded EDID block
	 * stored for the panel stored in them.
	 */
380
	if (!drm->vbios.fp_no_ddc) {
381 382 383
		struct edid *edid =
			(struct edid *)nouveau_bios_embedded_edid(dev);
		if (edid) {
384 385 386 387
			nv_connector->edid =
					kmemdup(edid, EDID_LENGTH, GFP_KERNEL);
			if (nv_connector->edid)
				status = connector_status_connected;
388 389 390 391 392 393 394 395 396 397 398 399
		}
	}

out:
#if defined(CONFIG_ACPI_BUTTON) || \
	(defined(CONFIG_ACPI_BUTTON_MODULE) && defined(MODULE))
	if (status == connector_status_connected &&
	    !nouveau_ignorelid && !acpi_lid_open())
		status = connector_status_unknown;
#endif

	drm_mode_connector_update_edid_property(connector, nv_connector->edid);
A
Albert Damen 已提交
400
	nouveau_connector_set_encoder(connector, nv_encoder);
401 402 403
	return status;
}

404 405 406
static void
nouveau_connector_force(struct drm_connector *connector)
{
407
	struct nouveau_drm *drm = nouveau_drm(connector->dev);
408
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
409 410 411
	struct nouveau_encoder *nv_encoder;
	int type;

412
	if (nv_connector->type == DCB_CONNECTOR_DVI_I) {
413
		if (connector->force == DRM_FORCE_ON_DIGITAL)
414
			type = DCB_OUTPUT_TMDS;
415
		else
416
			type = DCB_OUTPUT_ANALOG;
417
	} else
418
		type = DCB_OUTPUT_ANY;
419

420
	nv_encoder = find_encoder(connector, type);
421
	if (!nv_encoder) {
422
		NV_ERROR(drm, "can't find encoder to force %s on!\n",
423 424 425 426 427 428 429 430 431 432 433 434
			 drm_get_connector_name(connector));
		connector->status = connector_status_disconnected;
		return;
	}

	nouveau_connector_set_encoder(connector, nv_encoder);
}

static int
nouveau_connector_set_property(struct drm_connector *connector,
			       struct drm_property *property, uint64_t value)
{
435
	struct nouveau_display *disp = nouveau_display(connector->dev);
436 437
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
438
	struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
439
	struct drm_device *dev = connector->dev;
440
	struct nouveau_crtc *nv_crtc;
441 442
	int ret;

443 444 445 446
	nv_crtc = NULL;
	if (connector->encoder && connector->encoder->crtc)
		nv_crtc = nouveau_crtc(connector->encoder->crtc);

447 448 449 450 451 452 453 454 455 456 457 458 459 460 461
	/* Scaling mode */
	if (property == dev->mode_config.scaling_mode_property) {
		bool modeset = false;

		switch (value) {
		case DRM_MODE_SCALE_NONE:
		case DRM_MODE_SCALE_FULLSCREEN:
		case DRM_MODE_SCALE_CENTER:
		case DRM_MODE_SCALE_ASPECT:
			break;
		default:
			return -EINVAL;
		}

		/* LVDS always needs gpu scaling */
462
		if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS &&
463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484
		    value == DRM_MODE_SCALE_NONE)
			return -EINVAL;

		/* Changing between GPU and panel scaling requires a full
		 * modeset
		 */
		if ((nv_connector->scaling_mode == DRM_MODE_SCALE_NONE) ||
		    (value == DRM_MODE_SCALE_NONE))
			modeset = true;
		nv_connector->scaling_mode = value;

		if (!nv_crtc)
			return 0;

		if (modeset || !nv_crtc->set_scale) {
			ret = drm_crtc_helper_set_mode(&nv_crtc->base,
							&nv_crtc->base.mode,
							nv_crtc->base.x,
							nv_crtc->base.y, NULL);
			if (!ret)
				return -EINVAL;
		} else {
485
			ret = nv_crtc->set_scale(nv_crtc, true);
486 487 488 489 490 491 492
			if (ret)
				return ret;
		}

		return 0;
	}

493 494 495 496 497 498 499
	/* Underscan */
	if (property == disp->underscan_property) {
		if (nv_connector->underscan != value) {
			nv_connector->underscan = value;
			if (!nv_crtc || !nv_crtc->set_scale)
				return 0;

500
			return nv_crtc->set_scale(nv_crtc, true);
501 502 503 504 505 506 507 508 509 510 511
		}

		return 0;
	}

	if (property == disp->underscan_hborder_property) {
		if (nv_connector->underscan_hborder != value) {
			nv_connector->underscan_hborder = value;
			if (!nv_crtc || !nv_crtc->set_scale)
				return 0;

512
			return nv_crtc->set_scale(nv_crtc, true);
513 514 515 516 517 518 519 520 521 522 523
		}

		return 0;
	}

	if (property == disp->underscan_vborder_property) {
		if (nv_connector->underscan_vborder != value) {
			nv_connector->underscan_vborder = value;
			if (!nv_crtc || !nv_crtc->set_scale)
				return 0;

524
			return nv_crtc->set_scale(nv_crtc, true);
525 526 527 528 529
		}

		return 0;
	}

530
	/* Dithering */
531 532 533 534 535 536 537
	if (property == disp->dithering_mode) {
		nv_connector->dithering_mode = value;
		if (!nv_crtc || !nv_crtc->set_dither)
			return 0;

		return nv_crtc->set_dither(nv_crtc, true);
	}
538

539 540
	if (property == disp->dithering_depth) {
		nv_connector->dithering_depth = value;
541 542 543
		if (!nv_crtc || !nv_crtc->set_dither)
			return 0;

544
		return nv_crtc->set_dither(nv_crtc, true);
545 546
	}

547 548 549 550 551 552 553 554 555 556 557 558 559
	if (nv_crtc && nv_crtc->set_color_vibrance) {
		/* Hue */
		if (property == disp->vibrant_hue_property) {
			nv_crtc->vibrant_hue = value - 90;
			return nv_crtc->set_color_vibrance(nv_crtc, true);
		}
		/* Saturation */
		if (property == disp->color_vibrance_property) {
			nv_crtc->color_vibrance = value - 100;
			return nv_crtc->set_color_vibrance(nv_crtc, true);
		}
	}

560
	if (nv_encoder && nv_encoder->dcb->type == DCB_OUTPUT_TV)
561 562
		return get_slave_funcs(encoder)->set_property(
			encoder, connector, property, value);
563 564 565 566 567

	return -EINVAL;
}

static struct drm_display_mode *
568
nouveau_connector_native_mode(struct drm_connector *connector)
569
{
570
	struct drm_connector_helper_funcs *helper = connector->helper_private;
571
	struct nouveau_drm *drm = nouveau_drm(connector->dev);
572 573
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct drm_device *dev = connector->dev;
574 575 576
	struct drm_display_mode *mode, *largest = NULL;
	int high_w = 0, high_h = 0, high_v = 0;

577
	list_for_each_entry(mode, &nv_connector->base.probed_modes, head) {
578
		mode->vrefresh = drm_mode_vrefresh(mode);
579 580
		if (helper->mode_valid(connector, mode) != MODE_OK ||
		    (mode->flags & DRM_MODE_FLAG_INTERLACE))
581 582 583
			continue;

		/* Use preferred mode if there is one.. */
584
		if (mode->type & DRM_MODE_TYPE_PREFERRED) {
585
			NV_DEBUG(drm, "native mode from preferred\n");
586 587 588
			return drm_mode_duplicate(dev, mode);
		}

589 590 591
		/* Otherwise, take the resolution with the largest width, then
		 * height, then vertical refresh
		 */
592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607
		if (mode->hdisplay < high_w)
			continue;

		if (mode->hdisplay == high_w && mode->vdisplay < high_h)
			continue;

		if (mode->hdisplay == high_w && mode->vdisplay == high_h &&
		    mode->vrefresh < high_v)
			continue;

		high_w = mode->hdisplay;
		high_h = mode->vdisplay;
		high_v = mode->vrefresh;
		largest = mode;
	}

608
	NV_DEBUG(drm, "native mode from largest: %dx%d@%d\n",
609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 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 664 665 666 667 668
		      high_w, high_h, high_v);
	return largest ? drm_mode_duplicate(dev, largest) : NULL;
}

struct moderec {
	int hdisplay;
	int vdisplay;
};

static struct moderec scaler_modes[] = {
	{ 1920, 1200 },
	{ 1920, 1080 },
	{ 1680, 1050 },
	{ 1600, 1200 },
	{ 1400, 1050 },
	{ 1280, 1024 },
	{ 1280, 960 },
	{ 1152, 864 },
	{ 1024, 768 },
	{ 800, 600 },
	{ 720, 400 },
	{ 640, 480 },
	{ 640, 400 },
	{ 640, 350 },
	{}
};

static int
nouveau_connector_scaler_modes_add(struct drm_connector *connector)
{
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct drm_display_mode *native = nv_connector->native_mode, *m;
	struct drm_device *dev = connector->dev;
	struct moderec *mode = &scaler_modes[0];
	int modes = 0;

	if (!native)
		return 0;

	while (mode->hdisplay) {
		if (mode->hdisplay <= native->hdisplay &&
		    mode->vdisplay <= native->vdisplay) {
			m = drm_cvt_mode(dev, mode->hdisplay, mode->vdisplay,
					 drm_mode_vrefresh(native), false,
					 false, false);
			if (!m)
				continue;

			m->type |= DRM_MODE_TYPE_DRIVER;

			drm_mode_probed_add(connector, m);
			modes++;
		}

		mode++;
	}

	return modes;
}

669 670 671
static void
nouveau_connector_detect_depth(struct drm_connector *connector)
{
672
	struct nouveau_drm *drm = nouveau_drm(connector->dev);
673 674
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
675
	struct nvbios *bios = &drm->vbios;
676 677 678 679 680 681 682
	struct drm_display_mode *mode = nv_connector->native_mode;
	bool duallink;

	/* if the edid is feeling nice enough to provide this info, use it */
	if (nv_connector->edid && connector->display_info.bpc)
		return;

683 684 685 686 687 688 689
	/* EDID 1.4 is *supposed* to be supported on eDP, but, Apple... */
	if (nv_connector->type == DCB_CONNECTOR_eDP) {
		connector->display_info.bpc = 6;
		return;
	}

	/* we're out of options unless we're LVDS, default to 8bpc */
690
	if (nv_encoder->dcb->type != DCB_OUTPUT_LVDS) {
691
		connector->display_info.bpc = 8;
692
		return;
693 694 695
	}

	connector->display_info.bpc = 6;
696 697 698 699 700 701 702 703 704 705 706 707

	/* LVDS: panel straps */
	if (bios->fp_no_ddc) {
		if (bios->fp.if_is_24bit)
			connector->display_info.bpc = 8;
		return;
	}

	/* LVDS: DDC panel, need to first determine the number of links to
	 * know which if_is_24bit flag to check...
	 */
	if (nv_connector->edid &&
708
	    nv_connector->type == DCB_CONNECTOR_LVDS_SPWG)
709 710 711 712 713 714 715 716 717
		duallink = ((u8 *)nv_connector->edid)[121] == 2;
	else
		duallink = mode->clock >= bios->fp.duallink_transition_clk;

	if ((!duallink && (bios->fp.strapless_is_24bit & 1)) ||
	    ( duallink && (bios->fp.strapless_is_24bit & 2)))
		connector->display_info.bpc = 8;
}

718 719 720 721
static int
nouveau_connector_get_modes(struct drm_connector *connector)
{
	struct drm_device *dev = connector->dev;
722
	struct nouveau_drm *drm = nouveau_drm(dev);
723 724
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
725
	struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
726 727
	int ret = 0;

728
	/* destroy the native mode, the attached monitor could have changed.
729
	 */
730
	if (nv_connector->native_mode) {
731 732 733 734 735 736
		drm_mode_destroy(dev, nv_connector->native_mode);
		nv_connector->native_mode = NULL;
	}

	if (nv_connector->edid)
		ret = drm_add_edid_modes(connector, nv_connector->edid);
737
	else
738
	if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS &&
739
	    (nv_encoder->dcb->lvdsconf.use_straps_for_mode ||
740
	     drm->vbios.fp_no_ddc) && nouveau_bios_fp_mode(dev, NULL)) {
741 742 743 744
		struct drm_display_mode mode;

		nouveau_bios_fp_mode(dev, &mode);
		nv_connector->native_mode = drm_mode_duplicate(dev, &mode);
745
	}
746

747 748 749 750 751 752
	/* Determine display colour depth for everything except LVDS now,
	 * DP requires this before mode_valid() is called.
	 */
	if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS)
		nouveau_connector_detect_depth(connector);

753 754 755 756 757 758
	/* Find the native mode if this is a digital panel, if we didn't
	 * find any modes through DDC previously add the native mode to
	 * the list of modes.
	 */
	if (!nv_connector->native_mode)
		nv_connector->native_mode =
759
			nouveau_connector_native_mode(connector);
760 761 762 763 764 765 766 767
	if (ret == 0 && nv_connector->native_mode) {
		struct drm_display_mode *mode;

		mode = drm_mode_duplicate(dev, nv_connector->native_mode);
		drm_mode_probed_add(connector, mode);
		ret = 1;
	}

768 769 770
	/* Determine LVDS colour depth, must happen after determining
	 * "native" mode as some VBIOS tables require us to use the
	 * pixel clock as part of the lookup...
771
	 */
772 773
	if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
		nouveau_connector_detect_depth(connector);
774

775
	if (nv_encoder->dcb->type == DCB_OUTPUT_TV)
776
		ret = get_slave_funcs(encoder)->get_modes(encoder, connector);
777

778 779 780
	if (nv_connector->type == DCB_CONNECTOR_LVDS ||
	    nv_connector->type == DCB_CONNECTOR_LVDS_SPWG ||
	    nv_connector->type == DCB_CONNECTOR_eDP)
781 782 783 784 785
		ret += nouveau_connector_scaler_modes_add(connector);

	return ret;
}

786 787 788 789
static unsigned
get_tmds_link_bandwidth(struct drm_connector *connector)
{
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
790
	struct nouveau_drm *drm = nouveau_drm(connector->dev);
791
	struct dcb_output *dcb = nv_connector->detected_encoder->dcb;
792 793

	if (dcb->location != DCB_LOC_ON_CHIP ||
794
	    nv_device(drm->device)->chipset >= 0x46)
795
		return 165000;
796
	else if (nv_device(drm->device)->chipset >= 0x40)
797
		return 155000;
798
	else if (nv_device(drm->device)->chipset >= 0x18)
799 800 801 802 803
		return 135000;
	else
		return 112000;
}

804 805 806 807 808 809
static int
nouveau_connector_mode_valid(struct drm_connector *connector,
			     struct drm_display_mode *mode)
{
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
810
	struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
811 812 813 814
	unsigned min_clock = 25000, max_clock = min_clock;
	unsigned clock = mode->clock;

	switch (nv_encoder->dcb->type) {
815
	case DCB_OUTPUT_LVDS:
816 817 818
		if (nv_connector->native_mode &&
		    (mode->hdisplay > nv_connector->native_mode->hdisplay ||
		     mode->vdisplay > nv_connector->native_mode->vdisplay))
819 820 821 822 823
			return MODE_PANEL;

		min_clock = 0;
		max_clock = 400000;
		break;
824
	case DCB_OUTPUT_TMDS:
825 826 827
		max_clock = get_tmds_link_bandwidth(connector);
		if (nouveau_duallink && nv_encoder->dcb->duallink_possible)
			max_clock *= 2;
828
		break;
829
	case DCB_OUTPUT_ANALOG:
830 831 832 833
		max_clock = nv_encoder->dcb->crtconf.maxfreq;
		if (!max_clock)
			max_clock = 350000;
		break;
834
	case DCB_OUTPUT_TV:
835
		return get_slave_funcs(encoder)->mode_valid(encoder, mode);
836
	case DCB_OUTPUT_DP:
837 838
		max_clock  = nv_encoder->dp.link_nr;
		max_clock *= nv_encoder->dp.link_bw;
839
		clock = clock * (connector->display_info.bpc * 3) / 10;
840
		break;
841 842 843
	default:
		BUG_ON(1);
		return MODE_BAD;
844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884
	}

	if (clock < min_clock)
		return MODE_CLOCK_LOW;

	if (clock > max_clock)
		return MODE_CLOCK_HIGH;

	return MODE_OK;
}

static struct drm_encoder *
nouveau_connector_best_encoder(struct drm_connector *connector)
{
	struct nouveau_connector *nv_connector = nouveau_connector(connector);

	if (nv_connector->detected_encoder)
		return to_drm_encoder(nv_connector->detected_encoder);

	return NULL;
}

static const struct drm_connector_helper_funcs
nouveau_connector_helper_funcs = {
	.get_modes = nouveau_connector_get_modes,
	.mode_valid = nouveau_connector_mode_valid,
	.best_encoder = nouveau_connector_best_encoder,
};

static const struct drm_connector_funcs
nouveau_connector_funcs = {
	.dpms = drm_helper_connector_dpms,
	.save = NULL,
	.restore = NULL,
	.detect = nouveau_connector_detect,
	.destroy = nouveau_connector_destroy,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.set_property = nouveau_connector_set_property,
	.force = nouveau_connector_force
};

885 886 887 888 889 890 891 892 893 894 895
static const struct drm_connector_funcs
nouveau_connector_funcs_lvds = {
	.dpms = drm_helper_connector_dpms,
	.save = NULL,
	.restore = NULL,
	.detect = nouveau_connector_detect_lvds,
	.destroy = nouveau_connector_destroy,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.set_property = nouveau_connector_set_property,
	.force = nouveau_connector_force
};
896

897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927
static void
nouveau_connector_hotplug_work(struct work_struct *work)
{
	struct nouveau_connector *nv_connector =
		container_of(work, struct nouveau_connector, hpd_work);
	struct drm_connector *connector = &nv_connector->base;
	struct drm_device *dev = connector->dev;
	struct nouveau_drm *drm = nouveau_drm(dev);
	struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
	bool plugged = gpio->get(gpio, 0, nv_connector->hpd.func, 0xff);

	NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un",
		 drm_get_connector_name(connector));

	if (plugged)
		drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
	else
		drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);

	drm_helper_hpd_irq_event(dev);
}

static int
nouveau_connector_hotplug(struct nouveau_eventh *event, int index)
{
	struct nouveau_connector *nv_connector =
		container_of(event, struct nouveau_connector, hpd_func);
	schedule_work(&nv_connector->hpd_work);
	return NVKM_EVENT_KEEP;
}

928 929 930 931 932 933 934 935
static int
drm_conntype_from_dcb(enum dcb_connector_type dcb)
{
	switch (dcb) {
	case DCB_CONNECTOR_VGA      : return DRM_MODE_CONNECTOR_VGA;
	case DCB_CONNECTOR_TV_0     :
	case DCB_CONNECTOR_TV_1     :
	case DCB_CONNECTOR_TV_3     : return DRM_MODE_CONNECTOR_TV;
936 937
	case DCB_CONNECTOR_DMS59_0  :
	case DCB_CONNECTOR_DMS59_1  :
938 939 940 941
	case DCB_CONNECTOR_DVI_I    : return DRM_MODE_CONNECTOR_DVII;
	case DCB_CONNECTOR_DVI_D    : return DRM_MODE_CONNECTOR_DVID;
	case DCB_CONNECTOR_LVDS     :
	case DCB_CONNECTOR_LVDS_SPWG: return DRM_MODE_CONNECTOR_LVDS;
942 943
	case DCB_CONNECTOR_DMS59_DP0:
	case DCB_CONNECTOR_DMS59_DP1:
944 945 946 947 948 949 950 951 952 953 954
	case DCB_CONNECTOR_DP       : return DRM_MODE_CONNECTOR_DisplayPort;
	case DCB_CONNECTOR_eDP      : return DRM_MODE_CONNECTOR_eDP;
	case DCB_CONNECTOR_HDMI_0   :
	case DCB_CONNECTOR_HDMI_1   : return DRM_MODE_CONNECTOR_HDMIA;
	default:
		break;
	}

	return DRM_MODE_CONNECTOR_Unknown;
}

955 956
struct drm_connector *
nouveau_connector_create(struct drm_device *dev, int index)
957
{
958
	const struct drm_connector_funcs *funcs = &nouveau_connector_funcs;
959 960 961
	struct nouveau_drm *drm = nouveau_drm(dev);
	struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
	struct nouveau_display *disp = nouveau_display(dev);
962 963
	struct nouveau_connector *nv_connector = NULL;
	struct drm_connector *connector;
964
	int type, ret = 0;
965
	bool dummy;
966

967 968 969 970
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
		nv_connector = nouveau_connector(connector);
		if (nv_connector->index == index)
			return connector;
971 972
	}

973 974
	nv_connector = kzalloc(sizeof(*nv_connector), GFP_KERNEL);
	if (!nv_connector)
975
		return ERR_PTR(-ENOMEM);
976

977
	connector = &nv_connector->base;
978
	INIT_WORK(&nv_connector->hpd_work, nouveau_connector_hotplug_work);
979 980 981
	nv_connector->index = index;

	/* attempt to parse vbios connector type and hotplug gpio */
982
	nv_connector->dcb = olddcb_conn(dev, index);
983 984 985 986 987 988 989
	if (nv_connector->dcb) {
		static const u8 hpd[16] = {
			0xff, 0x07, 0x08, 0xff, 0xff, 0x51, 0x52, 0xff,
			0xff, 0xff, 0xff, 0xff, 0xff, 0x5e, 0x5f, 0x60,
		};

		u32 entry = ROM16(nv_connector->dcb[0]);
990
		if (olddcb_conntab(dev)[3] >= 4)
991 992
			entry |= (u32)ROM16(nv_connector->dcb[2]) << 16;

993 994
		ret = gpio->find(gpio, 0, hpd[ffs((entry & 0x07033000) >> 12)],
				 DCB_GPIO_UNUSED, &nv_connector->hpd);
995
		nv_connector->hpd_func.func = nouveau_connector_hotplug;
996 997
		if (ret)
			nv_connector->hpd.func = DCB_GPIO_UNUSED;
998 999 1000 1001

		nv_connector->type = nv_connector->dcb[0];
		if (drm_conntype_from_dcb(nv_connector->type) ==
					  DRM_MODE_CONNECTOR_Unknown) {
1002
			NV_WARN(drm, "unknown connector type %02x\n",
1003 1004 1005
				nv_connector->type);
			nv_connector->type = DCB_CONNECTOR_NONE;
		}
1006

1007 1008 1009 1010 1011
		/* Gigabyte NX85T */
		if (nv_match_device(dev, 0x0421, 0x1458, 0x344c)) {
			if (nv_connector->type == DCB_CONNECTOR_HDMI_1)
				nv_connector->type = DCB_CONNECTOR_DVI_I;
		}
1012

1013 1014 1015 1016 1017 1018 1019
		/* Gigabyte GV-NX86T512H */
		if (nv_match_device(dev, 0x0402, 0x1458, 0x3455)) {
			if (nv_connector->type == DCB_CONNECTOR_HDMI_1)
				nv_connector->type = DCB_CONNECTOR_DVI_I;
		}
	} else {
		nv_connector->type = DCB_CONNECTOR_NONE;
1020
		nv_connector->hpd.func = DCB_GPIO_UNUSED;
1021 1022 1023 1024 1025 1026
	}

	/* no vbios data, or an unknown dcb connector type - attempt to
	 * figure out something suitable ourselves
	 */
	if (nv_connector->type == DCB_CONNECTOR_NONE) {
1027 1028
		struct nouveau_drm *drm = nouveau_drm(dev);
		struct dcb_table *dcbt = &drm->vbios.dcb;
1029 1030 1031 1032 1033 1034 1035
		u32 encoders = 0;
		int i;

		for (i = 0; i < dcbt->entries; i++) {
			if (dcbt->entry[i].connector == nv_connector->index)
				encoders |= (1 << dcbt->entry[i].type);
		}
1036

1037 1038
		if (encoders & (1 << DCB_OUTPUT_DP)) {
			if (encoders & (1 << DCB_OUTPUT_TMDS))
1039 1040 1041 1042
				nv_connector->type = DCB_CONNECTOR_DP;
			else
				nv_connector->type = DCB_CONNECTOR_eDP;
		} else
1043 1044
		if (encoders & (1 << DCB_OUTPUT_TMDS)) {
			if (encoders & (1 << DCB_OUTPUT_ANALOG))
1045 1046 1047 1048
				nv_connector->type = DCB_CONNECTOR_DVI_I;
			else
				nv_connector->type = DCB_CONNECTOR_DVI_D;
		} else
1049
		if (encoders & (1 << DCB_OUTPUT_ANALOG)) {
1050 1051
			nv_connector->type = DCB_CONNECTOR_VGA;
		} else
1052
		if (encoders & (1 << DCB_OUTPUT_LVDS)) {
1053 1054
			nv_connector->type = DCB_CONNECTOR_LVDS;
		} else
1055
		if (encoders & (1 << DCB_OUTPUT_TV)) {
1056 1057 1058
			nv_connector->type = DCB_CONNECTOR_TV_0;
		}
	}
1059

1060 1061 1062
	type = drm_conntype_from_dcb(nv_connector->type);
	if (type == DRM_MODE_CONNECTOR_LVDS) {
		ret = nouveau_bios_parse_lvds_table(dev, 0, &dummy, &dummy);
1063
		if (ret) {
1064
			NV_ERROR(drm, "Error parsing LVDS table, disabling\n");
1065 1066
			kfree(nv_connector);
			return ERR_PTR(ret);
1067
		}
1068 1069 1070 1071

		funcs = &nouveau_connector_funcs_lvds;
	} else {
		funcs = &nouveau_connector_funcs;
1072 1073
	}

1074 1075 1076 1077 1078 1079 1080
	/* defaults, will get overridden in detect() */
	connector->interlace_allowed = false;
	connector->doublescan_allowed = false;

	drm_connector_init(dev, connector, funcs, type);
	drm_connector_helper_add(connector, &nouveau_connector_helper_funcs);

1081
	/* Init DVI-I specific properties */
1082
	if (nv_connector->type == DCB_CONNECTOR_DVI_I)
1083
		drm_object_attach_property(&connector->base, dev->mode_config.dvi_i_subconnector_property, 0);
1084

1085
	/* Add overscan compensation options to digital outputs */
1086
	if (disp->underscan_property &&
1087 1088 1089 1090
	    (type == DRM_MODE_CONNECTOR_DVID ||
	     type == DRM_MODE_CONNECTOR_DVII ||
	     type == DRM_MODE_CONNECTOR_HDMIA ||
	     type == DRM_MODE_CONNECTOR_DisplayPort)) {
1091
		drm_object_attach_property(&connector->base,
1092 1093
					      disp->underscan_property,
					      UNDERSCAN_OFF);
1094
		drm_object_attach_property(&connector->base,
1095 1096
					      disp->underscan_hborder_property,
					      0);
1097
		drm_object_attach_property(&connector->base,
1098 1099 1100 1101
					      disp->underscan_vborder_property,
					      0);
	}

1102 1103
	/* Add hue and saturation options */
	if (disp->vibrant_hue_property)
1104
		drm_object_attach_property(&connector->base,
1105 1106 1107
					      disp->vibrant_hue_property,
					      90);
	if (disp->color_vibrance_property)
1108
		drm_object_attach_property(&connector->base,
1109 1110 1111
					      disp->color_vibrance_property,
					      150);

1112
	switch (nv_connector->type) {
1113
	case DCB_CONNECTOR_VGA:
1114
		if (nv_device(drm->device)->card_type >= NV_50) {
1115
			drm_object_attach_property(&connector->base,
1116 1117 1118
					dev->mode_config.scaling_mode_property,
					nv_connector->scaling_mode);
		}
1119 1120 1121 1122 1123 1124 1125 1126 1127
		/* fall-through */
	case DCB_CONNECTOR_TV_0:
	case DCB_CONNECTOR_TV_1:
	case DCB_CONNECTOR_TV_3:
		nv_connector->scaling_mode = DRM_MODE_SCALE_NONE;
		break;
	default:
		nv_connector->scaling_mode = DRM_MODE_SCALE_FULLSCREEN;

1128
		drm_object_attach_property(&connector->base,
1129 1130
				dev->mode_config.scaling_mode_property,
				nv_connector->scaling_mode);
1131 1132
		if (disp->dithering_mode) {
			nv_connector->dithering_mode = DITHERING_MODE_AUTO;
1133
			drm_object_attach_property(&connector->base,
1134 1135 1136 1137 1138
						disp->dithering_mode,
						nv_connector->dithering_mode);
		}
		if (disp->dithering_depth) {
			nv_connector->dithering_depth = DITHERING_DEPTH_AUTO;
1139
			drm_object_attach_property(&connector->base,
1140 1141 1142
						disp->dithering_depth,
						nv_connector->dithering_depth);
		}
1143
		break;
1144 1145
	}

1146
	connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1147 1148
	if (nv_connector->hpd.func != DCB_GPIO_UNUSED)
		connector->polled = DRM_CONNECTOR_POLL_HPD;
1149

1150
	drm_sysfs_connector_add(connector);
1151
	return connector;
1152
}