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
59
static void nouveau_connector_hotplug(void *, int);

60
struct nouveau_encoder *
61
find_encoder(struct drm_connector *connector, int type)
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
{
	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));

78
		if (type == DCB_OUTPUT_ANY || nv_encoder->dcb->type == type)
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
			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
100
nouveau_connector_destroy(struct drm_connector *connector)
101
{
102
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
103
104
	struct nouveau_gpio *gpio;
	struct nouveau_drm *drm;
105
	struct drm_device *dev;
106

107
	if (!nv_connector)
108
109
		return;

110
111
112
	dev  = nv_connector->base.dev;
	drm  = nouveau_drm(dev);
	gpio = nouveau_gpio(drm->device);
113

114
115
	if (gpio && nv_connector->hpd.func != DCB_GPIO_UNUSED) {
		gpio->isr_del(gpio, 0, nv_connector->hpd.func, 0xff,
116
			      nouveau_connector_hotplug, connector);
117
118
	}

119
	kfree(nv_connector->edid);
120
121
122
	drm_sysfs_connector_remove(connector);
	drm_connector_cleanup(connector);
	kfree(connector);
123
124
}

125
static struct nouveau_i2c_port *
126
127
128
129
nouveau_connector_ddc_detect(struct drm_connector *connector,
			     struct nouveau_encoder **pnv_encoder)
{
	struct drm_device *dev = connector->dev;
130
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
131
	struct nouveau_drm *drm = nouveau_drm(dev);
132
	struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
133
	struct nouveau_i2c *i2c = nouveau_i2c(drm->device);
134
135
136
137
138
139
140
141
142
143
144
145
146
147
	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);
		}
	}
148
149
150
151
152
153
154
155
156
157
158
159
160
161

	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));
162
163

		if (nv_encoder->dcb->i2c_index < 0xf)
164
165
			port = i2c->find(i2c, nv_encoder->dcb->i2c_index);
		if (port && nv_probe_i2c(port, 0x50)) {
166
			*pnv_encoder = nv_encoder;
167
			break;
168
		}
169
170

		port = NULL;
171
172
	}

173
174
175
176
177
178
179
	/* 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;
180
181
}

182
183
184
185
186
187
188
189
190
191
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 ||
192
193
	    !((nv_encoder = find_encoder(connector, DCB_OUTPUT_TMDS)) ||
	      (nv_encoder = find_encoder(connector, DCB_OUTPUT_ANALOG))))
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
		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;
}

212
213
214
215
216
static void
nouveau_connector_set_encoder(struct drm_connector *connector,
			      struct nouveau_encoder *nv_encoder)
{
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
217
	struct nouveau_drm *drm = nouveau_drm(connector->dev);
218
219
220
221
222
223
	struct drm_device *dev = connector->dev;

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

224
	if (nv_device(drm->device)->card_type >= NV_50) {
225
226
227
		connector->interlace_allowed = true;
		connector->doublescan_allowed = true;
	} else
228
229
	if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS ||
	    nv_encoder->dcb->type == DCB_OUTPUT_TMDS) {
230
231
232
233
		connector->doublescan_allowed = false;
		connector->interlace_allowed = false;
	} else {
		connector->doublescan_allowed = true;
234
235
		if (nv_device(drm->device)->card_type == NV_20 ||
		   (nv_device(drm->device)->card_type == NV_10 &&
236
237
238
239
240
241
242
243
		    (dev->pci_device & 0x0ff0) != 0x0100 &&
		    (dev->pci_device & 0x0ff0) != 0x0150))
			/* HW is broken */
			connector->interlace_allowed = false;
		else
			connector->interlace_allowed = true;
	}

244
	if (nv_connector->type == DCB_CONNECTOR_DVI_I) {
245
		drm_object_property_set_value(&connector->base,
246
			dev->mode_config.dvi_i_subconnector_property,
247
			nv_encoder->dcb->type == DCB_OUTPUT_TMDS ?
248
249
250
251
252
253
			DRM_MODE_SUBCONNECTOR_DVID :
			DRM_MODE_SUBCONNECTOR_DVIA);
	}
}

static enum drm_connector_status
254
nouveau_connector_detect(struct drm_connector *connector, bool force)
255
256
{
	struct drm_device *dev = connector->dev;
257
	struct nouveau_drm *drm = nouveau_drm(dev);
258
259
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder = NULL;
260
	struct nouveau_encoder *nv_partner;
261
	struct nouveau_i2c_port *i2c;
262
	int type;
263

264
265
266
267
268
269
	/* 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;
	}
270

271
272
273
274
275
276
	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) {
277
			NV_ERROR(drm, "DDC responded, but no EDID for %s\n",
278
				 drm_get_connector_name(connector));
279
			goto detect_analog;
280
281
		}

282
		if (nv_encoder->dcb->type == DCB_OUTPUT_DP &&
283
		    !nouveau_dp_detect(to_drm_encoder(nv_encoder))) {
284
			NV_ERROR(drm, "Detected %s, but failed init\n",
285
286
287
288
289
290
291
292
293
				 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.
		 */
294
		nv_partner = NULL;
295
296
297
298
299
300
301
302
303
		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))) {
304
			if (nv_connector->edid->input & DRM_EDID_INPUT_DIGITAL)
305
				type = DCB_OUTPUT_TMDS;
306
			else
307
				type = DCB_OUTPUT_ANALOG;
308

309
			nv_encoder = find_encoder(connector, type);
310
311
312
313
314
315
		}

		nouveau_connector_set_encoder(connector, nv_encoder);
		return connector_status_connected;
	}

316
317
318
319
320
321
	nv_encoder = nouveau_connector_of_detect(connector);
	if (nv_encoder) {
		nouveau_connector_set_encoder(connector, nv_encoder);
		return connector_status_connected;
	}

322
detect_analog:
323
	nv_encoder = find_encoder(connector, DCB_OUTPUT_ANALOG);
324
	if (!nv_encoder && !nouveau_tv_disable)
325
		nv_encoder = find_encoder(connector, DCB_OUTPUT_TV);
326
	if (nv_encoder && force) {
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
		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;
}

342
static enum drm_connector_status
343
nouveau_connector_detect_lvds(struct drm_connector *connector, bool force)
344
345
{
	struct drm_device *dev = connector->dev;
346
	struct nouveau_drm *drm = nouveau_drm(dev);
347
348
349
350
351
352
353
354
355
356
357
	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;
	}

358
	nv_encoder = find_encoder(connector, DCB_OUTPUT_LVDS);
359
360
361
	if (!nv_encoder)
		return connector_status_disconnected;

362
	/* Try retrieving EDID via DDC */
363
	if (!drm->vbios.fp_no_ddc) {
364
		status = nouveau_connector_detect(connector, force);
365
366
367
368
		if (status == connector_status_connected)
			goto out;
	}

369
370
371
372
373
374
375
376
377
378
	/* 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) {
379
		if ((nv_connector->edid = nouveau_acpi_edid(dev, connector))) {
380
381
382
383
384
			status = connector_status_connected;
			goto out;
		}
	}

385
386
387
388
	/* 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.
	 */
389
	if (nouveau_bios_fp_mode(dev, NULL) && (drm->vbios.fp_no_ddc ||
390
391
392
393
394
395
396
397
	    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.
	 */
398
	if (!drm->vbios.fp_no_ddc) {
399
400
401
		struct edid *edid =
			(struct edid *)nouveau_bios_embedded_edid(dev);
		if (edid) {
402
403
404
405
			nv_connector->edid =
					kmemdup(edid, EDID_LENGTH, GFP_KERNEL);
			if (nv_connector->edid)
				status = connector_status_connected;
406
407
408
409
410
411
412
413
414
415
416
417
		}
	}

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);
418
	nouveau_connector_set_encoder(connector, nv_encoder);
419
420
421
	return status;
}

422
423
424
static void
nouveau_connector_force(struct drm_connector *connector)
{
425
	struct nouveau_drm *drm = nouveau_drm(connector->dev);
426
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
427
428
429
	struct nouveau_encoder *nv_encoder;
	int type;

430
	if (nv_connector->type == DCB_CONNECTOR_DVI_I) {
431
		if (connector->force == DRM_FORCE_ON_DIGITAL)
432
			type = DCB_OUTPUT_TMDS;
433
		else
434
			type = DCB_OUTPUT_ANALOG;
435
	} else
436
		type = DCB_OUTPUT_ANY;
437

438
	nv_encoder = find_encoder(connector, type);
439
	if (!nv_encoder) {
440
		NV_ERROR(drm, "can't find encoder to force %s on!\n",
441
442
443
444
445
446
447
448
449
450
451
452
			 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)
{
453
	struct nouveau_display *disp = nouveau_display(connector->dev);
454
455
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
456
	struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
457
	struct drm_device *dev = connector->dev;
458
	struct nouveau_crtc *nv_crtc;
459
460
	int ret;

461
462
463
464
	nv_crtc = NULL;
	if (connector->encoder && connector->encoder->crtc)
		nv_crtc = nouveau_crtc(connector->encoder->crtc);

465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
	/* 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 */
480
		if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS &&
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
		    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 {
503
			ret = nv_crtc->set_scale(nv_crtc, true);
504
505
506
507
508
509
510
			if (ret)
				return ret;
		}

		return 0;
	}

511
512
513
514
515
516
517
	/* Underscan */
	if (property == disp->underscan_property) {
		if (nv_connector->underscan != value) {
			nv_connector->underscan = value;
			if (!nv_crtc || !nv_crtc->set_scale)
				return 0;

518
			return nv_crtc->set_scale(nv_crtc, true);
519
520
521
522
523
524
525
526
527
528
529
		}

		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;

530
			return nv_crtc->set_scale(nv_crtc, true);
531
532
533
534
535
536
537
538
539
540
541
		}

		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;

542
			return nv_crtc->set_scale(nv_crtc, true);
543
544
545
546
547
		}

		return 0;
	}

548
	/* Dithering */
549
550
551
552
553
554
555
	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);
	}
556

557
558
	if (property == disp->dithering_depth) {
		nv_connector->dithering_depth = value;
559
560
561
		if (!nv_crtc || !nv_crtc->set_dither)
			return 0;

562
		return nv_crtc->set_dither(nv_crtc, true);
563
564
	}

565
566
567
568
569
570
571
572
573
574
575
576
577
	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);
		}
	}

578
	if (nv_encoder && nv_encoder->dcb->type == DCB_OUTPUT_TV)
579
580
		return get_slave_funcs(encoder)->set_property(
			encoder, connector, property, value);
581
582
583
584
585

	return -EINVAL;
}

static struct drm_display_mode *
586
nouveau_connector_native_mode(struct drm_connector *connector)
587
{
588
	struct drm_connector_helper_funcs *helper = connector->helper_private;
589
	struct nouveau_drm *drm = nouveau_drm(connector->dev);
590
591
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct drm_device *dev = connector->dev;
592
593
594
	struct drm_display_mode *mode, *largest = NULL;
	int high_w = 0, high_h = 0, high_v = 0;

595
	list_for_each_entry(mode, &nv_connector->base.probed_modes, head) {
596
		mode->vrefresh = drm_mode_vrefresh(mode);
597
598
		if (helper->mode_valid(connector, mode) != MODE_OK ||
		    (mode->flags & DRM_MODE_FLAG_INTERLACE))
599
600
601
			continue;

		/* Use preferred mode if there is one.. */
602
		if (mode->type & DRM_MODE_TYPE_PREFERRED) {
603
			NV_DEBUG(drm, "native mode from preferred\n");
604
605
606
			return drm_mode_duplicate(dev, mode);
		}

607
608
609
		/* Otherwise, take the resolution with the largest width, then
		 * height, then vertical refresh
		 */
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
		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;
	}

626
	NV_DEBUG(drm, "native mode from largest: %dx%d@%d\n",
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
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
		      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;
}

687
688
689
static void
nouveau_connector_detect_depth(struct drm_connector *connector)
{
690
	struct nouveau_drm *drm = nouveau_drm(connector->dev);
691
692
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
693
	struct nvbios *bios = &drm->vbios;
694
695
696
697
698
699
700
	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;

701
702
703
704
705
706
707
	/* 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 */
708
	if (nv_encoder->dcb->type != DCB_OUTPUT_LVDS) {
709
		connector->display_info.bpc = 8;
710
		return;
711
712
713
	}

	connector->display_info.bpc = 6;
714
715
716
717
718
719
720
721
722
723
724
725

	/* 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 &&
726
	    nv_connector->type == DCB_CONNECTOR_LVDS_SPWG)
727
728
729
730
731
732
733
734
735
		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;
}

736
737
738
739
static int
nouveau_connector_get_modes(struct drm_connector *connector)
{
	struct drm_device *dev = connector->dev;
740
	struct nouveau_drm *drm = nouveau_drm(dev);
741
742
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
743
	struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
744
745
	int ret = 0;

746
	/* destroy the native mode, the attached monitor could have changed.
747
	 */
748
	if (nv_connector->native_mode) {
749
750
751
752
753
754
		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);
755
	else
756
	if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS &&
757
	    (nv_encoder->dcb->lvdsconf.use_straps_for_mode ||
758
	     drm->vbios.fp_no_ddc) && nouveau_bios_fp_mode(dev, NULL)) {
759
760
761
762
		struct drm_display_mode mode;

		nouveau_bios_fp_mode(dev, &mode);
		nv_connector->native_mode = drm_mode_duplicate(dev, &mode);
763
	}
764

765
766
767
768
769
770
	/* 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);

771
772
773
774
775
776
	/* 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 =
777
			nouveau_connector_native_mode(connector);
778
779
780
781
782
783
784
785
	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;
	}

786
787
788
	/* 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...
789
	 */
790
791
	if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
		nouveau_connector_detect_depth(connector);
792

793
	if (nv_encoder->dcb->type == DCB_OUTPUT_TV)
794
		ret = get_slave_funcs(encoder)->get_modes(encoder, connector);
795

796
797
798
	if (nv_connector->type == DCB_CONNECTOR_LVDS ||
	    nv_connector->type == DCB_CONNECTOR_LVDS_SPWG ||
	    nv_connector->type == DCB_CONNECTOR_eDP)
799
800
801
802
803
		ret += nouveau_connector_scaler_modes_add(connector);

	return ret;
}

804
805
806
807
static unsigned
get_tmds_link_bandwidth(struct drm_connector *connector)
{
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
808
	struct nouveau_drm *drm = nouveau_drm(connector->dev);
809
	struct dcb_output *dcb = nv_connector->detected_encoder->dcb;
810
811

	if (dcb->location != DCB_LOC_ON_CHIP ||
812
	    nv_device(drm->device)->chipset >= 0x46)
813
		return 165000;
814
	else if (nv_device(drm->device)->chipset >= 0x40)
815
		return 155000;
816
	else if (nv_device(drm->device)->chipset >= 0x18)
817
818
819
820
821
		return 135000;
	else
		return 112000;
}

822
823
824
825
826
827
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;
828
	struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
829
830
831
832
	unsigned min_clock = 25000, max_clock = min_clock;
	unsigned clock = mode->clock;

	switch (nv_encoder->dcb->type) {
833
	case DCB_OUTPUT_LVDS:
834
835
836
		if (nv_connector->native_mode &&
		    (mode->hdisplay > nv_connector->native_mode->hdisplay ||
		     mode->vdisplay > nv_connector->native_mode->vdisplay))
837
838
839
840
841
			return MODE_PANEL;

		min_clock = 0;
		max_clock = 400000;
		break;
842
	case DCB_OUTPUT_TMDS:
843
844
845
		max_clock = get_tmds_link_bandwidth(connector);
		if (nouveau_duallink && nv_encoder->dcb->duallink_possible)
			max_clock *= 2;
846
		break;
847
	case DCB_OUTPUT_ANALOG:
848
849
850
851
		max_clock = nv_encoder->dcb->crtconf.maxfreq;
		if (!max_clock)
			max_clock = 350000;
		break;
852
	case DCB_OUTPUT_TV:
853
		return get_slave_funcs(encoder)->mode_valid(encoder, mode);
854
	case DCB_OUTPUT_DP:
855
856
		max_clock  = nv_encoder->dp.link_nr;
		max_clock *= nv_encoder->dp.link_bw;
857
		clock = clock * (connector->display_info.bpc * 3) / 10;
858
		break;
859
860
861
	default:
		BUG_ON(1);
		return MODE_BAD;
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
	}

	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
};

903
904
905
906
907
908
909
910
911
912
913
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
};
914

915
916
917
918
919
920
921
922
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;
923
924
	case DCB_CONNECTOR_DMS59_0  :
	case DCB_CONNECTOR_DMS59_1  :
925
926
927
928
	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;
929
930
	case DCB_CONNECTOR_DMS59_DP0:
	case DCB_CONNECTOR_DMS59_DP1:
931
932
933
934
935
936
937
938
939
940
941
	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;
}

942
943
struct drm_connector *
nouveau_connector_create(struct drm_device *dev, int index)
944
{
945
	const struct drm_connector_funcs *funcs = &nouveau_connector_funcs;
946
947
948
	struct nouveau_drm *drm = nouveau_drm(dev);
	struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
	struct nouveau_display *disp = nouveau_display(dev);
949
950
	struct nouveau_connector *nv_connector = NULL;
	struct drm_connector *connector;
951
	int type, ret = 0;
952
	bool dummy;
953

954
955
956
957
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
		nv_connector = nouveau_connector(connector);
		if (nv_connector->index == index)
			return connector;
958
959
	}

960
961
	nv_connector = kzalloc(sizeof(*nv_connector), GFP_KERNEL);
	if (!nv_connector)
962
		return ERR_PTR(-ENOMEM);
963

964
	connector = &nv_connector->base;
965
966
967
	nv_connector->index = index;

	/* attempt to parse vbios connector type and hotplug gpio */
968
	nv_connector->dcb = olddcb_conn(dev, index);
969
970
971
972
973
974
975
	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]);
976
		if (olddcb_conntab(dev)[3] >= 4)
977
978
			entry |= (u32)ROM16(nv_connector->dcb[2]) << 16;

979
980
981
982
		ret = gpio->find(gpio, 0, hpd[ffs((entry & 0x07033000) >> 12)],
				 DCB_GPIO_UNUSED, &nv_connector->hpd);
		if (ret)
			nv_connector->hpd.func = DCB_GPIO_UNUSED;
983
984
985
986

		nv_connector->type = nv_connector->dcb[0];
		if (drm_conntype_from_dcb(nv_connector->type) ==
					  DRM_MODE_CONNECTOR_Unknown) {
987
			NV_WARN(drm, "unknown connector type %02x\n",
988
989
990
				nv_connector->type);
			nv_connector->type = DCB_CONNECTOR_NONE;
		}
991

992
993
994
995
996
		/* 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;
		}
997

998
999
1000
1001
1002
1003
1004
		/* 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;
1005
		nv_connector->hpd.func = DCB_GPIO_UNUSED;
1006
1007
1008
1009
1010
1011
	}

	/* no vbios data, or an unknown dcb connector type - attempt to
	 * figure out something suitable ourselves
	 */
	if (nv_connector->type == DCB_CONNECTOR_NONE) {
1012
1013
		struct nouveau_drm *drm = nouveau_drm(dev);
		struct dcb_table *dcbt = &drm->vbios.dcb;
1014
1015
1016
1017
1018
1019
1020
		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);
		}
1021

1022
1023
		if (encoders & (1 << DCB_OUTPUT_DP)) {
			if (encoders & (1 << DCB_OUTPUT_TMDS))
1024
1025
1026
1027
				nv_connector->type = DCB_CONNECTOR_DP;
			else
				nv_connector->type = DCB_CONNECTOR_eDP;
		} else
1028
1029
		if (encoders & (1 << DCB_OUTPUT_TMDS)) {
			if (encoders & (1 << DCB_OUTPUT_ANALOG))
1030
1031
1032
1033
				nv_connector->type = DCB_CONNECTOR_DVI_I;
			else
				nv_connector->type = DCB_CONNECTOR_DVI_D;
		} else
1034
		if (encoders & (1 << DCB_OUTPUT_ANALOG)) {
1035
1036
			nv_connector->type = DCB_CONNECTOR_VGA;
		} else
1037
		if (encoders & (1 << DCB_OUTPUT_LVDS)) {
1038
1039
			nv_connector->type = DCB_CONNECTOR_LVDS;
		} else
1040
		if (encoders & (1 << DCB_OUTPUT_TV)) {
1041
1042
1043
			nv_connector->type = DCB_CONNECTOR_TV_0;
		}
	}
1044

1045
1046
1047
	type = drm_conntype_from_dcb(nv_connector->type);
	if (type == DRM_MODE_CONNECTOR_LVDS) {
		ret = nouveau_bios_parse_lvds_table(dev, 0, &dummy, &dummy);
1048
		if (ret) {
1049
			NV_ERROR(drm, "Error parsing LVDS table, disabling\n");
1050
1051
			kfree(nv_connector);
			return ERR_PTR(ret);
1052
		}
1053
1054
1055
1056

		funcs = &nouveau_connector_funcs_lvds;
	} else {
		funcs = &nouveau_connector_funcs;
1057
1058
	}

1059
1060
1061
1062
1063
1064
1065
	/* 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);

1066
	/* Init DVI-I specific properties */
1067
	if (nv_connector->type == DCB_CONNECTOR_DVI_I)
1068
		drm_object_attach_property(&connector->base, dev->mode_config.dvi_i_subconnector_property, 0);
1069

1070
	/* Add overscan compensation options to digital outputs */
1071
	if (disp->underscan_property &&
1072
1073
1074
1075
	    (type == DRM_MODE_CONNECTOR_DVID ||
	     type == DRM_MODE_CONNECTOR_DVII ||
	     type == DRM_MODE_CONNECTOR_HDMIA ||
	     type == DRM_MODE_CONNECTOR_DisplayPort)) {
1076
		drm_object_attach_property(&connector->base,
1077
1078
					      disp->underscan_property,
					      UNDERSCAN_OFF);
1079
		drm_object_attach_property(&connector->base,
1080
1081
					      disp->underscan_hborder_property,
					      0);
1082
		drm_object_attach_property(&connector->base,
1083
1084
1085
1086
					      disp->underscan_vborder_property,
					      0);
	}

1087
1088
	/* Add hue and saturation options */
	if (disp->vibrant_hue_property)
1089
		drm_object_attach_property(&connector->base,
1090
1091
1092
					      disp->vibrant_hue_property,
					      90);
	if (disp->color_vibrance_property)
1093
		drm_object_attach_property(&connector->base,
1094
1095
1096
					      disp->color_vibrance_property,
					      150);

1097
	switch (nv_connector->type) {
1098
	case DCB_CONNECTOR_VGA:
1099
		if (nv_device(drm->device)->card_type >= NV_50) {
1100
			drm_object_attach_property(&connector->base,
1101
1102
1103
					dev->mode_config.scaling_mode_property,
					nv_connector->scaling_mode);
		}
1104
1105
1106
1107
1108
1109
1110
1111
1112
		/* 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;

1113
		drm_object_attach_property(&connector->base,
1114
1115
				dev->mode_config.scaling_mode_property,
				nv_connector->scaling_mode);
1116
1117
		if (disp->dithering_mode) {
			nv_connector->dithering_mode = DITHERING_MODE_AUTO;
1118
			drm_object_attach_property(&connector->base,
1119
1120
1121
1122
1123
						disp->dithering_mode,
						nv_connector->dithering_mode);
		}
		if (disp->dithering_depth) {
			nv_connector->dithering_depth = DITHERING_DEPTH_AUTO;
1124
			drm_object_attach_property(&connector->base,
1125
1126
1127
						disp->dithering_depth,
						nv_connector->dithering_depth);
		}
1128
		break;
1129
1130
	}

1131
	connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1132
1133
	if (gpio && nv_connector->hpd.func != DCB_GPIO_UNUSED) {
		ret = gpio->isr_add(gpio, 0, nv_connector->hpd.func, 0xff,
1134
				    nouveau_connector_hotplug, connector);
1135
1136
		if (ret == 0)
			connector->polled = DRM_CONNECTOR_POLL_HPD;
1137
1138
	}

1139
	drm_sysfs_connector_add(connector);
1140
	return connector;
1141
}
1142
1143
1144
1145
1146
1147

static void
nouveau_connector_hotplug(void *data, int plugged)
{
	struct drm_connector *connector = data;
	struct drm_device *dev = connector->dev;
1148
	struct nouveau_drm *drm = nouveau_drm(dev);
1149

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

1153
1154
1155
1156
	if (plugged)
		drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
	else
		drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
1157
1158
1159

	drm_helper_hpd_irq_event(dev);
}