Merge drm/drm-next into drm-intel-next
[platform/kernel/linux-starfive.git] / drivers / gpu / drm / nouveau / nouveau_connector.c
1 /*
2  * Copyright (C) 2008 Maarten Maathuis.
3  * All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the
14  * next paragraph) shall be included in all copies or substantial
15  * portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20  * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  *
25  */
26
27 #include <acpi/button.h>
28
29 #include <linux/pm_runtime.h>
30 #include <linux/vga_switcheroo.h>
31
32 #include <drm/drm_atomic_helper.h>
33 #include <drm/drm_edid.h>
34 #include <drm/drm_crtc_helper.h>
35 #include <drm/drm_probe_helper.h>
36 #include <drm/drm_atomic.h>
37
38 #include "nouveau_reg.h"
39 #include "nouveau_drv.h"
40 #include "dispnv04/hw.h"
41 #include "dispnv50/disp.h"
42 #include "nouveau_acpi.h"
43
44 #include "nouveau_display.h"
45 #include "nouveau_connector.h"
46 #include "nouveau_encoder.h"
47 #include "nouveau_crtc.h"
48
49 #include <nvif/class.h>
50 #include <nvif/cl0046.h>
51 #include <nvif/event.h>
52
53 struct drm_display_mode *
54 nouveau_conn_native_mode(struct drm_connector *connector)
55 {
56         const struct drm_connector_helper_funcs *helper = connector->helper_private;
57         struct nouveau_drm *drm = nouveau_drm(connector->dev);
58         struct drm_device *dev = connector->dev;
59         struct drm_display_mode *mode, *largest = NULL;
60         int high_w = 0, high_h = 0, high_v = 0;
61
62         list_for_each_entry(mode, &connector->probed_modes, head) {
63                 if (helper->mode_valid(connector, mode) != MODE_OK ||
64                     (mode->flags & DRM_MODE_FLAG_INTERLACE))
65                         continue;
66
67                 /* Use preferred mode if there is one.. */
68                 if (mode->type & DRM_MODE_TYPE_PREFERRED) {
69                         NV_DEBUG(drm, "native mode from preferred\n");
70                         return drm_mode_duplicate(dev, mode);
71                 }
72
73                 /* Otherwise, take the resolution with the largest width, then
74                  * height, then vertical refresh
75                  */
76                 if (mode->hdisplay < high_w)
77                         continue;
78
79                 if (mode->hdisplay == high_w && mode->vdisplay < high_h)
80                         continue;
81
82                 if (mode->hdisplay == high_w && mode->vdisplay == high_h &&
83                     drm_mode_vrefresh(mode) < high_v)
84                         continue;
85
86                 high_w = mode->hdisplay;
87                 high_h = mode->vdisplay;
88                 high_v = drm_mode_vrefresh(mode);
89                 largest = mode;
90         }
91
92         NV_DEBUG(drm, "native mode from largest: %dx%d@%d\n",
93                       high_w, high_h, high_v);
94         return largest ? drm_mode_duplicate(dev, largest) : NULL;
95 }
96
97 int
98 nouveau_conn_atomic_get_property(struct drm_connector *connector,
99                                  const struct drm_connector_state *state,
100                                  struct drm_property *property, u64 *val)
101 {
102         struct nouveau_conn_atom *asyc = nouveau_conn_atom(state);
103         struct nouveau_display *disp = nouveau_display(connector->dev);
104         struct drm_device *dev = connector->dev;
105
106         if (property == dev->mode_config.scaling_mode_property)
107                 *val = asyc->scaler.mode;
108         else if (property == disp->underscan_property)
109                 *val = asyc->scaler.underscan.mode;
110         else if (property == disp->underscan_hborder_property)
111                 *val = asyc->scaler.underscan.hborder;
112         else if (property == disp->underscan_vborder_property)
113                 *val = asyc->scaler.underscan.vborder;
114         else if (property == disp->dithering_mode)
115                 *val = asyc->dither.mode;
116         else if (property == disp->dithering_depth)
117                 *val = asyc->dither.depth;
118         else if (property == disp->vibrant_hue_property)
119                 *val = asyc->procamp.vibrant_hue;
120         else if (property == disp->color_vibrance_property)
121                 *val = asyc->procamp.color_vibrance;
122         else
123                 return -EINVAL;
124
125         return 0;
126 }
127
128 int
129 nouveau_conn_atomic_set_property(struct drm_connector *connector,
130                                  struct drm_connector_state *state,
131                                  struct drm_property *property, u64 val)
132 {
133         struct drm_device *dev = connector->dev;
134         struct nouveau_conn_atom *asyc = nouveau_conn_atom(state);
135         struct nouveau_display *disp = nouveau_display(dev);
136
137         if (property == dev->mode_config.scaling_mode_property) {
138                 switch (val) {
139                 case DRM_MODE_SCALE_NONE:
140                         /* We allow 'None' for EDID modes, even on a fixed
141                          * panel (some exist with support for lower refresh
142                          * rates, which people might want to use for power-
143                          * saving purposes).
144                          *
145                          * Non-EDID modes will force the use of GPU scaling
146                          * to the native mode regardless of this setting.
147                          */
148                         switch (connector->connector_type) {
149                         case DRM_MODE_CONNECTOR_LVDS:
150                         case DRM_MODE_CONNECTOR_eDP:
151                                 /* ... except prior to G80, where the code
152                                  * doesn't support such things.
153                                  */
154                                 if (disp->disp.object.oclass < NV50_DISP)
155                                         return -EINVAL;
156                                 break;
157                         default:
158                                 break;
159                         }
160                         break;
161                 case DRM_MODE_SCALE_FULLSCREEN:
162                 case DRM_MODE_SCALE_CENTER:
163                 case DRM_MODE_SCALE_ASPECT:
164                         break;
165                 default:
166                         return -EINVAL;
167                 }
168
169                 if (asyc->scaler.mode != val) {
170                         asyc->scaler.mode = val;
171                         asyc->set.scaler = true;
172                 }
173         } else
174         if (property == disp->underscan_property) {
175                 if (asyc->scaler.underscan.mode != val) {
176                         asyc->scaler.underscan.mode = val;
177                         asyc->set.scaler = true;
178                 }
179         } else
180         if (property == disp->underscan_hborder_property) {
181                 if (asyc->scaler.underscan.hborder != val) {
182                         asyc->scaler.underscan.hborder = val;
183                         asyc->set.scaler = true;
184                 }
185         } else
186         if (property == disp->underscan_vborder_property) {
187                 if (asyc->scaler.underscan.vborder != val) {
188                         asyc->scaler.underscan.vborder = val;
189                         asyc->set.scaler = true;
190                 }
191         } else
192         if (property == disp->dithering_mode) {
193                 if (asyc->dither.mode != val) {
194                         asyc->dither.mode = val;
195                         asyc->set.dither = true;
196                 }
197         } else
198         if (property == disp->dithering_depth) {
199                 if (asyc->dither.mode != val) {
200                         asyc->dither.depth = val;
201                         asyc->set.dither = true;
202                 }
203         } else
204         if (property == disp->vibrant_hue_property) {
205                 if (asyc->procamp.vibrant_hue != val) {
206                         asyc->procamp.vibrant_hue = val;
207                         asyc->set.procamp = true;
208                 }
209         } else
210         if (property == disp->color_vibrance_property) {
211                 if (asyc->procamp.color_vibrance != val) {
212                         asyc->procamp.color_vibrance = val;
213                         asyc->set.procamp = true;
214                 }
215         } else {
216                 return -EINVAL;
217         }
218
219         return 0;
220 }
221
222 void
223 nouveau_conn_atomic_destroy_state(struct drm_connector *connector,
224                                   struct drm_connector_state *state)
225 {
226         struct nouveau_conn_atom *asyc = nouveau_conn_atom(state);
227         __drm_atomic_helper_connector_destroy_state(&asyc->state);
228         kfree(asyc);
229 }
230
231 struct drm_connector_state *
232 nouveau_conn_atomic_duplicate_state(struct drm_connector *connector)
233 {
234         struct nouveau_conn_atom *armc = nouveau_conn_atom(connector->state);
235         struct nouveau_conn_atom *asyc;
236         if (!(asyc = kmalloc(sizeof(*asyc), GFP_KERNEL)))
237                 return NULL;
238         __drm_atomic_helper_connector_duplicate_state(connector, &asyc->state);
239         asyc->dither = armc->dither;
240         asyc->scaler = armc->scaler;
241         asyc->procamp = armc->procamp;
242         asyc->set.mask = 0;
243         return &asyc->state;
244 }
245
246 void
247 nouveau_conn_reset(struct drm_connector *connector)
248 {
249         struct nouveau_connector *nv_connector = nouveau_connector(connector);
250         struct nouveau_conn_atom *asyc;
251
252         if (drm_drv_uses_atomic_modeset(connector->dev)) {
253                 if (WARN_ON(!(asyc = kzalloc(sizeof(*asyc), GFP_KERNEL))))
254                         return;
255
256                 if (connector->state)
257                         nouveau_conn_atomic_destroy_state(connector,
258                                                           connector->state);
259
260                 __drm_atomic_helper_connector_reset(connector, &asyc->state);
261         } else {
262                 asyc = &nv_connector->properties_state;
263         }
264
265         asyc->dither.mode = DITHERING_MODE_AUTO;
266         asyc->dither.depth = DITHERING_DEPTH_AUTO;
267         asyc->scaler.mode = DRM_MODE_SCALE_NONE;
268         asyc->scaler.underscan.mode = UNDERSCAN_OFF;
269         asyc->procamp.color_vibrance = 150;
270         asyc->procamp.vibrant_hue = 90;
271
272         if (nouveau_display(connector->dev)->disp.object.oclass < NV50_DISP) {
273                 switch (connector->connector_type) {
274                 case DRM_MODE_CONNECTOR_LVDS:
275                         /* See note in nouveau_conn_atomic_set_property(). */
276                         asyc->scaler.mode = DRM_MODE_SCALE_FULLSCREEN;
277                         break;
278                 default:
279                         break;
280                 }
281         }
282 }
283
284 void
285 nouveau_conn_attach_properties(struct drm_connector *connector)
286 {
287         struct drm_device *dev = connector->dev;
288         struct nouveau_display *disp = nouveau_display(dev);
289         struct nouveau_connector *nv_connector = nouveau_connector(connector);
290         struct nouveau_conn_atom *armc;
291
292         if (drm_drv_uses_atomic_modeset(connector->dev))
293                 armc = nouveau_conn_atom(connector->state);
294         else
295                 armc = &nv_connector->properties_state;
296
297         /* Init DVI-I specific properties. */
298         if (connector->connector_type == DRM_MODE_CONNECTOR_DVII)
299                 drm_object_attach_property(&connector->base, dev->mode_config.
300                                            dvi_i_subconnector_property, 0);
301
302         /* Add overscan compensation options to digital outputs. */
303         if (disp->underscan_property &&
304             (connector->connector_type == DRM_MODE_CONNECTOR_DVID ||
305              connector->connector_type == DRM_MODE_CONNECTOR_DVII ||
306              connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
307              connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort)) {
308                 drm_object_attach_property(&connector->base,
309                                            disp->underscan_property,
310                                            UNDERSCAN_OFF);
311                 drm_object_attach_property(&connector->base,
312                                            disp->underscan_hborder_property, 0);
313                 drm_object_attach_property(&connector->base,
314                                            disp->underscan_vborder_property, 0);
315         }
316
317         /* Add hue and saturation options. */
318         if (disp->vibrant_hue_property)
319                 drm_object_attach_property(&connector->base,
320                                            disp->vibrant_hue_property,
321                                            armc->procamp.vibrant_hue);
322         if (disp->color_vibrance_property)
323                 drm_object_attach_property(&connector->base,
324                                            disp->color_vibrance_property,
325                                            armc->procamp.color_vibrance);
326
327         /* Scaling mode property. */
328         switch (connector->connector_type) {
329         case DRM_MODE_CONNECTOR_TV:
330                 break;
331         case DRM_MODE_CONNECTOR_VGA:
332                 if (disp->disp.object.oclass < NV50_DISP)
333                         break; /* Can only scale on DFPs. */
334                 fallthrough;
335         default:
336                 drm_object_attach_property(&connector->base, dev->mode_config.
337                                            scaling_mode_property,
338                                            armc->scaler.mode);
339                 break;
340         }
341
342         /* Dithering properties. */
343         switch (connector->connector_type) {
344         case DRM_MODE_CONNECTOR_TV:
345         case DRM_MODE_CONNECTOR_VGA:
346                 break;
347         default:
348                 if (disp->dithering_mode) {
349                         drm_object_attach_property(&connector->base,
350                                                    disp->dithering_mode,
351                                                    armc->dither.mode);
352                 }
353                 if (disp->dithering_depth) {
354                         drm_object_attach_property(&connector->base,
355                                                    disp->dithering_depth,
356                                                    armc->dither.depth);
357                 }
358                 break;
359         }
360 }
361
362 MODULE_PARM_DESC(tv_disable, "Disable TV-out detection");
363 int nouveau_tv_disable = 0;
364 module_param_named(tv_disable, nouveau_tv_disable, int, 0400);
365
366 MODULE_PARM_DESC(ignorelid, "Ignore ACPI lid status");
367 int nouveau_ignorelid = 0;
368 module_param_named(ignorelid, nouveau_ignorelid, int, 0400);
369
370 MODULE_PARM_DESC(duallink, "Allow dual-link TMDS (default: enabled)");
371 int nouveau_duallink = 1;
372 module_param_named(duallink, nouveau_duallink, int, 0400);
373
374 MODULE_PARM_DESC(hdmimhz, "Force a maximum HDMI pixel clock (in MHz)");
375 int nouveau_hdmimhz = 0;
376 module_param_named(hdmimhz, nouveau_hdmimhz, int, 0400);
377
378 struct nouveau_encoder *
379 find_encoder(struct drm_connector *connector, int type)
380 {
381         struct nouveau_encoder *nv_encoder;
382         struct drm_encoder *enc;
383
384         drm_connector_for_each_possible_encoder(connector, enc) {
385                 nv_encoder = nouveau_encoder(enc);
386
387                 if (type == DCB_OUTPUT_ANY ||
388                     (nv_encoder->dcb && nv_encoder->dcb->type == type))
389                         return nv_encoder;
390         }
391
392         return NULL;
393 }
394
395 static void
396 nouveau_connector_destroy(struct drm_connector *connector)
397 {
398         struct nouveau_connector *nv_connector = nouveau_connector(connector);
399         nvif_notify_dtor(&nv_connector->hpd);
400         kfree(nv_connector->edid);
401         drm_connector_unregister(connector);
402         drm_connector_cleanup(connector);
403         if (nv_connector->aux.transfer) {
404                 drm_dp_cec_unregister_connector(&nv_connector->aux);
405                 kfree(nv_connector->aux.name);
406         }
407         kfree(connector);
408 }
409
410 static struct nouveau_encoder *
411 nouveau_connector_ddc_detect(struct drm_connector *connector)
412 {
413         struct drm_device *dev = connector->dev;
414         struct pci_dev *pdev = to_pci_dev(dev->dev);
415         struct nouveau_encoder *nv_encoder = NULL, *found = NULL;
416         struct drm_encoder *encoder;
417         int ret;
418         bool switcheroo_ddc = false;
419
420         drm_connector_for_each_possible_encoder(connector, encoder) {
421                 nv_encoder = nouveau_encoder(encoder);
422
423                 switch (nv_encoder->dcb->type) {
424                 case DCB_OUTPUT_DP:
425                         ret = nouveau_dp_detect(nouveau_connector(connector),
426                                                 nv_encoder);
427                         if (ret == NOUVEAU_DP_MST)
428                                 return NULL;
429                         else if (ret == NOUVEAU_DP_SST)
430                                 found = nv_encoder;
431
432                         break;
433                 case DCB_OUTPUT_LVDS:
434                         switcheroo_ddc = !!(vga_switcheroo_handler_flags() &
435                                             VGA_SWITCHEROO_CAN_SWITCH_DDC);
436                         fallthrough;
437                 default:
438                         if (!nv_encoder->i2c)
439                                 break;
440
441                         if (switcheroo_ddc)
442                                 vga_switcheroo_lock_ddc(pdev);
443                         if (nvkm_probe_i2c(nv_encoder->i2c, 0x50))
444                                 found = nv_encoder;
445                         if (switcheroo_ddc)
446                                 vga_switcheroo_unlock_ddc(pdev);
447
448                         break;
449                 }
450                 if (found)
451                         break;
452         }
453
454         return found;
455 }
456
457 static struct nouveau_encoder *
458 nouveau_connector_of_detect(struct drm_connector *connector)
459 {
460 #ifdef __powerpc__
461         struct drm_device *dev = connector->dev;
462         struct nouveau_connector *nv_connector = nouveau_connector(connector);
463         struct nouveau_encoder *nv_encoder;
464         struct pci_dev *pdev = to_pci_dev(dev->dev);
465         struct device_node *cn, *dn = pci_device_to_OF_node(pdev);
466
467         if (!dn ||
468             !((nv_encoder = find_encoder(connector, DCB_OUTPUT_TMDS)) ||
469               (nv_encoder = find_encoder(connector, DCB_OUTPUT_ANALOG))))
470                 return NULL;
471
472         for_each_child_of_node(dn, cn) {
473                 const char *name = of_get_property(cn, "name", NULL);
474                 const void *edid = of_get_property(cn, "EDID", NULL);
475                 int idx = name ? name[strlen(name) - 1] - 'A' : 0;
476
477                 if (nv_encoder->dcb->i2c_index == idx && edid) {
478                         nv_connector->edid =
479                                 kmemdup(edid, EDID_LENGTH, GFP_KERNEL);
480                         of_node_put(cn);
481                         return nv_encoder;
482                 }
483         }
484 #endif
485         return NULL;
486 }
487
488 static void
489 nouveau_connector_set_encoder(struct drm_connector *connector,
490                               struct nouveau_encoder *nv_encoder)
491 {
492         struct nouveau_connector *nv_connector = nouveau_connector(connector);
493         struct nouveau_drm *drm = nouveau_drm(connector->dev);
494         struct drm_device *dev = connector->dev;
495         struct pci_dev *pdev = to_pci_dev(dev->dev);
496
497         if (nv_connector->detected_encoder == nv_encoder)
498                 return;
499         nv_connector->detected_encoder = nv_encoder;
500
501         if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
502                 if (nv_encoder->dcb->type == DCB_OUTPUT_DP)
503                         connector->interlace_allowed =
504                                 nv_encoder->caps.dp_interlace;
505                 else
506                         connector->interlace_allowed = true;
507                 connector->doublescan_allowed = true;
508         } else
509         if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS ||
510             nv_encoder->dcb->type == DCB_OUTPUT_TMDS) {
511                 connector->doublescan_allowed = false;
512                 connector->interlace_allowed = false;
513         } else {
514                 connector->doublescan_allowed = true;
515                 if (drm->client.device.info.family == NV_DEVICE_INFO_V0_KELVIN ||
516                     (drm->client.device.info.family == NV_DEVICE_INFO_V0_CELSIUS &&
517                      (pdev->device & 0x0ff0) != 0x0100 &&
518                      (pdev->device & 0x0ff0) != 0x0150))
519                         /* HW is broken */
520                         connector->interlace_allowed = false;
521                 else
522                         connector->interlace_allowed = true;
523         }
524
525         if (nv_connector->type == DCB_CONNECTOR_DVI_I) {
526                 drm_object_property_set_value(&connector->base,
527                         dev->mode_config.dvi_i_subconnector_property,
528                         nv_encoder->dcb->type == DCB_OUTPUT_TMDS ?
529                         DRM_MODE_SUBCONNECTOR_DVID :
530                         DRM_MODE_SUBCONNECTOR_DVIA);
531         }
532 }
533
534 static void
535 nouveau_connector_set_edid(struct nouveau_connector *nv_connector,
536                            struct edid *edid)
537 {
538         if (nv_connector->edid != edid) {
539                 struct edid *old_edid = nv_connector->edid;
540
541                 drm_connector_update_edid_property(&nv_connector->base, edid);
542                 kfree(old_edid);
543                 nv_connector->edid = edid;
544         }
545 }
546
547 static enum drm_connector_status
548 nouveau_connector_detect(struct drm_connector *connector, bool force)
549 {
550         struct drm_device *dev = connector->dev;
551         struct nouveau_drm *drm = nouveau_drm(dev);
552         struct nouveau_connector *nv_connector = nouveau_connector(connector);
553         struct nouveau_encoder *nv_encoder = NULL;
554         struct nouveau_encoder *nv_partner;
555         struct i2c_adapter *i2c;
556         int type;
557         int ret;
558         enum drm_connector_status conn_status = connector_status_disconnected;
559
560         /* Outputs are only polled while runtime active, so resuming the
561          * device here is unnecessary (and would deadlock upon runtime suspend
562          * because it waits for polling to finish). We do however, want to
563          * prevent the autosuspend timer from elapsing during this operation
564          * if possible.
565          */
566         if (drm_kms_helper_is_poll_worker()) {
567                 pm_runtime_get_noresume(dev->dev);
568         } else {
569                 ret = pm_runtime_get_sync(dev->dev);
570                 if (ret < 0 && ret != -EACCES) {
571                         pm_runtime_put_autosuspend(dev->dev);
572                         nouveau_connector_set_edid(nv_connector, NULL);
573                         return conn_status;
574                 }
575         }
576
577         nv_encoder = nouveau_connector_ddc_detect(connector);
578         if (nv_encoder && (i2c = nv_encoder->i2c) != NULL) {
579                 struct edid *new_edid;
580
581                 if ((vga_switcheroo_handler_flags() &
582                      VGA_SWITCHEROO_CAN_SWITCH_DDC) &&
583                     nv_connector->type == DCB_CONNECTOR_LVDS)
584                         new_edid = drm_get_edid_switcheroo(connector, i2c);
585                 else
586                         new_edid = drm_get_edid(connector, i2c);
587
588                 nouveau_connector_set_edid(nv_connector, new_edid);
589                 if (!nv_connector->edid) {
590                         NV_ERROR(drm, "DDC responded, but no EDID for %s\n",
591                                  connector->name);
592                         goto detect_analog;
593                 }
594
595                 /* Override encoder type for DVI-I based on whether EDID
596                  * says the display is digital or analog, both use the
597                  * same i2c channel so the value returned from ddc_detect
598                  * isn't necessarily correct.
599                  */
600                 nv_partner = NULL;
601                 if (nv_encoder->dcb->type == DCB_OUTPUT_TMDS)
602                         nv_partner = find_encoder(connector, DCB_OUTPUT_ANALOG);
603                 if (nv_encoder->dcb->type == DCB_OUTPUT_ANALOG)
604                         nv_partner = find_encoder(connector, DCB_OUTPUT_TMDS);
605
606                 if (nv_partner && ((nv_encoder->dcb->type == DCB_OUTPUT_ANALOG &&
607                                     nv_partner->dcb->type == DCB_OUTPUT_TMDS) ||
608                                    (nv_encoder->dcb->type == DCB_OUTPUT_TMDS &&
609                                     nv_partner->dcb->type == DCB_OUTPUT_ANALOG))) {
610                         if (nv_connector->edid->input & DRM_EDID_INPUT_DIGITAL)
611                                 type = DCB_OUTPUT_TMDS;
612                         else
613                                 type = DCB_OUTPUT_ANALOG;
614
615                         nv_encoder = find_encoder(connector, type);
616                 }
617
618                 nouveau_connector_set_encoder(connector, nv_encoder);
619                 conn_status = connector_status_connected;
620                 drm_dp_cec_set_edid(&nv_connector->aux, nv_connector->edid);
621                 goto out;
622         } else {
623                 nouveau_connector_set_edid(nv_connector, NULL);
624         }
625
626         nv_encoder = nouveau_connector_of_detect(connector);
627         if (nv_encoder) {
628                 nouveau_connector_set_encoder(connector, nv_encoder);
629                 conn_status = connector_status_connected;
630                 goto out;
631         }
632
633 detect_analog:
634         nv_encoder = find_encoder(connector, DCB_OUTPUT_ANALOG);
635         if (!nv_encoder && !nouveau_tv_disable)
636                 nv_encoder = find_encoder(connector, DCB_OUTPUT_TV);
637         if (nv_encoder && force) {
638                 struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
639                 const struct drm_encoder_helper_funcs *helper =
640                                                 encoder->helper_private;
641
642                 if (helper->detect(encoder, connector) ==
643                                                 connector_status_connected) {
644                         nouveau_connector_set_encoder(connector, nv_encoder);
645                         conn_status = connector_status_connected;
646                         goto out;
647                 }
648         }
649
650  out:
651         if (!nv_connector->edid)
652                 drm_dp_cec_unset_edid(&nv_connector->aux);
653
654         pm_runtime_mark_last_busy(dev->dev);
655         pm_runtime_put_autosuspend(dev->dev);
656
657         return conn_status;
658 }
659
660 static enum drm_connector_status
661 nouveau_connector_detect_lvds(struct drm_connector *connector, bool force)
662 {
663         struct drm_device *dev = connector->dev;
664         struct nouveau_drm *drm = nouveau_drm(dev);
665         struct nouveau_connector *nv_connector = nouveau_connector(connector);
666         struct nouveau_encoder *nv_encoder = NULL;
667         struct edid *edid = NULL;
668         enum drm_connector_status status = connector_status_disconnected;
669
670         nv_encoder = find_encoder(connector, DCB_OUTPUT_LVDS);
671         if (!nv_encoder)
672                 goto out;
673
674         /* Try retrieving EDID via DDC */
675         if (!drm->vbios.fp_no_ddc) {
676                 status = nouveau_connector_detect(connector, force);
677                 if (status == connector_status_connected) {
678                         edid = nv_connector->edid;
679                         goto out;
680                 }
681         }
682
683         /* On some laptops (Sony, i'm looking at you) there appears to
684          * be no direct way of accessing the panel's EDID.  The only
685          * option available to us appears to be to ask ACPI for help..
686          *
687          * It's important this check's before trying straps, one of the
688          * said manufacturer's laptops are configured in such a way
689          * the nouveau decides an entry in the VBIOS FP mode table is
690          * valid - it's not (rh#613284)
691          */
692         if (nv_encoder->dcb->lvdsconf.use_acpi_for_edid) {
693                 edid = nouveau_acpi_edid(dev, connector);
694                 if (edid) {
695                         status = connector_status_connected;
696                         goto out;
697                 }
698         }
699
700         /* If no EDID found above, and the VBIOS indicates a hardcoded
701          * modeline is avalilable for the panel, set it as the panel's
702          * native mode and exit.
703          */
704         if (nouveau_bios_fp_mode(dev, NULL) && (drm->vbios.fp_no_ddc ||
705             nv_encoder->dcb->lvdsconf.use_straps_for_mode)) {
706                 status = connector_status_connected;
707                 goto out;
708         }
709
710         /* Still nothing, some VBIOS images have a hardcoded EDID block
711          * stored for the panel stored in them.
712          */
713         if (!drm->vbios.fp_no_ddc) {
714                 edid = (struct edid *)nouveau_bios_embedded_edid(dev);
715                 if (edid) {
716                         edid = kmemdup(edid, EDID_LENGTH, GFP_KERNEL);
717                         if (edid)
718                                 status = connector_status_connected;
719                 }
720         }
721
722 out:
723 #if defined(CONFIG_ACPI_BUTTON) || \
724         (defined(CONFIG_ACPI_BUTTON_MODULE) && defined(MODULE))
725         if (status == connector_status_connected &&
726             !nouveau_ignorelid && !acpi_lid_open())
727                 status = connector_status_unknown;
728 #endif
729
730         nouveau_connector_set_edid(nv_connector, edid);
731         nouveau_connector_set_encoder(connector, nv_encoder);
732         return status;
733 }
734
735 static void
736 nouveau_connector_force(struct drm_connector *connector)
737 {
738         struct nouveau_drm *drm = nouveau_drm(connector->dev);
739         struct nouveau_connector *nv_connector = nouveau_connector(connector);
740         struct nouveau_encoder *nv_encoder;
741         int type;
742
743         if (nv_connector->type == DCB_CONNECTOR_DVI_I) {
744                 if (connector->force == DRM_FORCE_ON_DIGITAL)
745                         type = DCB_OUTPUT_TMDS;
746                 else
747                         type = DCB_OUTPUT_ANALOG;
748         } else
749                 type = DCB_OUTPUT_ANY;
750
751         nv_encoder = find_encoder(connector, type);
752         if (!nv_encoder) {
753                 NV_ERROR(drm, "can't find encoder to force %s on!\n",
754                          connector->name);
755                 connector->status = connector_status_disconnected;
756                 return;
757         }
758
759         nouveau_connector_set_encoder(connector, nv_encoder);
760 }
761
762 static int
763 nouveau_connector_set_property(struct drm_connector *connector,
764                                struct drm_property *property, uint64_t value)
765 {
766         struct nouveau_connector *nv_connector = nouveau_connector(connector);
767         struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
768         struct nouveau_conn_atom *asyc = &nv_connector->properties_state;
769         struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
770         int ret;
771
772         ret = connector->funcs->atomic_set_property(&nv_connector->base,
773                                                     &asyc->state,
774                                                     property, value);
775         if (ret) {
776                 if (nv_encoder && nv_encoder->dcb->type == DCB_OUTPUT_TV)
777                         return get_slave_funcs(encoder)->set_property(
778                                 encoder, connector, property, value);
779                 return ret;
780         }
781
782         nv_connector->scaling_mode = asyc->scaler.mode;
783         nv_connector->dithering_mode = asyc->dither.mode;
784
785         if (connector->encoder && connector->encoder->crtc) {
786                 ret = drm_crtc_helper_set_mode(connector->encoder->crtc,
787                                               &connector->encoder->crtc->mode,
788                                                connector->encoder->crtc->x,
789                                                connector->encoder->crtc->y,
790                                                NULL);
791                 if (!ret)
792                         return -EINVAL;
793         }
794
795         return 0;
796 }
797
798 struct moderec {
799         int hdisplay;
800         int vdisplay;
801 };
802
803 static struct moderec scaler_modes[] = {
804         { 1920, 1200 },
805         { 1920, 1080 },
806         { 1680, 1050 },
807         { 1600, 1200 },
808         { 1400, 1050 },
809         { 1280, 1024 },
810         { 1280, 960 },
811         { 1152, 864 },
812         { 1024, 768 },
813         { 800, 600 },
814         { 720, 400 },
815         { 640, 480 },
816         { 640, 400 },
817         { 640, 350 },
818         {}
819 };
820
821 static int
822 nouveau_connector_scaler_modes_add(struct drm_connector *connector)
823 {
824         struct nouveau_connector *nv_connector = nouveau_connector(connector);
825         struct drm_display_mode *native = nv_connector->native_mode, *m;
826         struct drm_device *dev = connector->dev;
827         struct moderec *mode = &scaler_modes[0];
828         int modes = 0;
829
830         if (!native)
831                 return 0;
832
833         while (mode->hdisplay) {
834                 if (mode->hdisplay <= native->hdisplay &&
835                     mode->vdisplay <= native->vdisplay &&
836                     (mode->hdisplay != native->hdisplay ||
837                      mode->vdisplay != native->vdisplay)) {
838                         m = drm_cvt_mode(dev, mode->hdisplay, mode->vdisplay,
839                                          drm_mode_vrefresh(native), false,
840                                          false, false);
841                         if (!m)
842                                 continue;
843
844                         drm_mode_probed_add(connector, m);
845                         modes++;
846                 }
847
848                 mode++;
849         }
850
851         return modes;
852 }
853
854 static void
855 nouveau_connector_detect_depth(struct drm_connector *connector)
856 {
857         struct nouveau_drm *drm = nouveau_drm(connector->dev);
858         struct nouveau_connector *nv_connector = nouveau_connector(connector);
859         struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
860         struct nvbios *bios = &drm->vbios;
861         struct drm_display_mode *mode = nv_connector->native_mode;
862         bool duallink;
863
864         /* if the edid is feeling nice enough to provide this info, use it */
865         if (nv_connector->edid && connector->display_info.bpc)
866                 return;
867
868         /* EDID 1.4 is *supposed* to be supported on eDP, but, Apple... */
869         if (nv_connector->type == DCB_CONNECTOR_eDP) {
870                 connector->display_info.bpc = 6;
871                 return;
872         }
873
874         /* we're out of options unless we're LVDS, default to 8bpc */
875         if (nv_encoder->dcb->type != DCB_OUTPUT_LVDS) {
876                 connector->display_info.bpc = 8;
877                 return;
878         }
879
880         connector->display_info.bpc = 6;
881
882         /* LVDS: panel straps */
883         if (bios->fp_no_ddc) {
884                 if (bios->fp.if_is_24bit)
885                         connector->display_info.bpc = 8;
886                 return;
887         }
888
889         /* LVDS: DDC panel, need to first determine the number of links to
890          * know which if_is_24bit flag to check...
891          */
892         if (nv_connector->edid &&
893             nv_connector->type == DCB_CONNECTOR_LVDS_SPWG)
894                 duallink = ((u8 *)nv_connector->edid)[121] == 2;
895         else
896                 duallink = mode->clock >= bios->fp.duallink_transition_clk;
897
898         if ((!duallink && (bios->fp.strapless_is_24bit & 1)) ||
899             ( duallink && (bios->fp.strapless_is_24bit & 2)))
900                 connector->display_info.bpc = 8;
901 }
902
903 static int
904 nouveau_connector_late_register(struct drm_connector *connector)
905 {
906         int ret;
907
908         ret = nouveau_backlight_init(connector);
909         if (ret)
910                 return ret;
911
912         if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
913             connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
914                 ret = drm_dp_aux_register(&nouveau_connector(connector)->aux);
915                 if (ret)
916                         goto backlight_fini;
917         }
918
919         return 0;
920 backlight_fini:
921         nouveau_backlight_fini(connector);
922         return ret;
923 }
924
925 static void
926 nouveau_connector_early_unregister(struct drm_connector *connector)
927 {
928         if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
929             connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort)
930                 drm_dp_aux_unregister(&nouveau_connector(connector)->aux);
931
932         nouveau_backlight_fini(connector);
933 }
934
935 static int
936 nouveau_connector_get_modes(struct drm_connector *connector)
937 {
938         struct drm_device *dev = connector->dev;
939         struct nouveau_drm *drm = nouveau_drm(dev);
940         struct nouveau_connector *nv_connector = nouveau_connector(connector);
941         struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
942         struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
943         int ret = 0;
944
945         /* destroy the native mode, the attached monitor could have changed.
946          */
947         if (nv_connector->native_mode) {
948                 drm_mode_destroy(dev, nv_connector->native_mode);
949                 nv_connector->native_mode = NULL;
950         }
951
952         if (nv_connector->edid)
953                 ret = drm_add_edid_modes(connector, nv_connector->edid);
954         else
955         if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS &&
956             (nv_encoder->dcb->lvdsconf.use_straps_for_mode ||
957              drm->vbios.fp_no_ddc) && nouveau_bios_fp_mode(dev, NULL)) {
958                 struct drm_display_mode mode;
959
960                 nouveau_bios_fp_mode(dev, &mode);
961                 nv_connector->native_mode = drm_mode_duplicate(dev, &mode);
962         }
963
964         /* Determine display colour depth for everything except LVDS now,
965          * DP requires this before mode_valid() is called.
966          */
967         if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS)
968                 nouveau_connector_detect_depth(connector);
969
970         /* Find the native mode if this is a digital panel, if we didn't
971          * find any modes through DDC previously add the native mode to
972          * the list of modes.
973          */
974         if (!nv_connector->native_mode)
975                 nv_connector->native_mode = nouveau_conn_native_mode(connector);
976         if (ret == 0 && nv_connector->native_mode) {
977                 struct drm_display_mode *mode;
978
979                 mode = drm_mode_duplicate(dev, nv_connector->native_mode);
980                 drm_mode_probed_add(connector, mode);
981                 ret = 1;
982         }
983
984         /* Determine LVDS colour depth, must happen after determining
985          * "native" mode as some VBIOS tables require us to use the
986          * pixel clock as part of the lookup...
987          */
988         if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
989                 nouveau_connector_detect_depth(connector);
990
991         if (nv_encoder->dcb->type == DCB_OUTPUT_TV)
992                 ret = get_slave_funcs(encoder)->get_modes(encoder, connector);
993
994         if (nv_connector->type == DCB_CONNECTOR_LVDS ||
995             nv_connector->type == DCB_CONNECTOR_LVDS_SPWG ||
996             nv_connector->type == DCB_CONNECTOR_eDP)
997                 ret += nouveau_connector_scaler_modes_add(connector);
998
999         return ret;
1000 }
1001
1002 static unsigned
1003 get_tmds_link_bandwidth(struct drm_connector *connector)
1004 {
1005         struct nouveau_connector *nv_connector = nouveau_connector(connector);
1006         struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
1007         struct nouveau_drm *drm = nouveau_drm(connector->dev);
1008         struct dcb_output *dcb = nv_connector->detected_encoder->dcb;
1009         struct drm_display_info *info = NULL;
1010         unsigned duallink_scale =
1011                 nouveau_duallink && nv_encoder->dcb->duallink_possible ? 2 : 1;
1012
1013         if (drm_detect_hdmi_monitor(nv_connector->edid)) {
1014                 info = &nv_connector->base.display_info;
1015                 duallink_scale = 1;
1016         }
1017
1018         if (info) {
1019                 if (nouveau_hdmimhz > 0)
1020                         return nouveau_hdmimhz * 1000;
1021                 /* Note: these limits are conservative, some Fermi's
1022                  * can do 297 MHz. Unclear how this can be determined.
1023                  */
1024                 if (drm->client.device.info.chipset >= 0x120) {
1025                         const int max_tmds_clock =
1026                                 info->hdmi.scdc.scrambling.supported ?
1027                                 594000 : 340000;
1028                         return info->max_tmds_clock ?
1029                                 min(info->max_tmds_clock, max_tmds_clock) :
1030                                 max_tmds_clock;
1031                 }
1032                 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_KEPLER)
1033                         return 297000;
1034                 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_FERMI)
1035                         return 225000;
1036         }
1037
1038         if (dcb->location != DCB_LOC_ON_CHIP ||
1039             drm->client.device.info.chipset >= 0x46)
1040                 return 165000 * duallink_scale;
1041         else if (drm->client.device.info.chipset >= 0x40)
1042                 return 155000 * duallink_scale;
1043         else if (drm->client.device.info.chipset >= 0x18)
1044                 return 135000 * duallink_scale;
1045         else
1046                 return 112000 * duallink_scale;
1047 }
1048
1049 static enum drm_mode_status
1050 nouveau_connector_mode_valid(struct drm_connector *connector,
1051                              struct drm_display_mode *mode)
1052 {
1053         struct nouveau_connector *nv_connector = nouveau_connector(connector);
1054         struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
1055         struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
1056         unsigned int min_clock = 25000, max_clock = min_clock, clock = mode->clock;
1057
1058         switch (nv_encoder->dcb->type) {
1059         case DCB_OUTPUT_LVDS:
1060                 if (nv_connector->native_mode &&
1061                     (mode->hdisplay > nv_connector->native_mode->hdisplay ||
1062                      mode->vdisplay > nv_connector->native_mode->vdisplay))
1063                         return MODE_PANEL;
1064
1065                 min_clock = 0;
1066                 max_clock = 400000;
1067                 break;
1068         case DCB_OUTPUT_TMDS:
1069                 max_clock = get_tmds_link_bandwidth(connector);
1070                 break;
1071         case DCB_OUTPUT_ANALOG:
1072                 max_clock = nv_encoder->dcb->crtconf.maxfreq;
1073                 if (!max_clock)
1074                         max_clock = 350000;
1075                 break;
1076         case DCB_OUTPUT_TV:
1077                 return get_slave_funcs(encoder)->mode_valid(encoder, mode);
1078         case DCB_OUTPUT_DP:
1079                 return nv50_dp_mode_valid(connector, nv_encoder, mode, NULL);
1080         default:
1081                 BUG();
1082                 return MODE_BAD;
1083         }
1084
1085         if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING)
1086                 clock *= 2;
1087
1088         if (clock < min_clock)
1089                 return MODE_CLOCK_LOW;
1090         if (clock > max_clock)
1091                 return MODE_CLOCK_HIGH;
1092
1093         return MODE_OK;
1094 }
1095
1096 static struct drm_encoder *
1097 nouveau_connector_best_encoder(struct drm_connector *connector)
1098 {
1099         struct nouveau_connector *nv_connector = nouveau_connector(connector);
1100
1101         if (nv_connector->detected_encoder)
1102                 return to_drm_encoder(nv_connector->detected_encoder);
1103
1104         return NULL;
1105 }
1106
1107 static const struct drm_connector_helper_funcs
1108 nouveau_connector_helper_funcs = {
1109         .get_modes = nouveau_connector_get_modes,
1110         .mode_valid = nouveau_connector_mode_valid,
1111         .best_encoder = nouveau_connector_best_encoder,
1112 };
1113
1114 static const struct drm_connector_funcs
1115 nouveau_connector_funcs = {
1116         .dpms = drm_helper_connector_dpms,
1117         .reset = nouveau_conn_reset,
1118         .detect = nouveau_connector_detect,
1119         .force = nouveau_connector_force,
1120         .fill_modes = drm_helper_probe_single_connector_modes,
1121         .set_property = nouveau_connector_set_property,
1122         .destroy = nouveau_connector_destroy,
1123         .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state,
1124         .atomic_destroy_state = nouveau_conn_atomic_destroy_state,
1125         .atomic_set_property = nouveau_conn_atomic_set_property,
1126         .atomic_get_property = nouveau_conn_atomic_get_property,
1127         .late_register = nouveau_connector_late_register,
1128         .early_unregister = nouveau_connector_early_unregister,
1129 };
1130
1131 static const struct drm_connector_funcs
1132 nouveau_connector_funcs_lvds = {
1133         .dpms = drm_helper_connector_dpms,
1134         .reset = nouveau_conn_reset,
1135         .detect = nouveau_connector_detect_lvds,
1136         .force = nouveau_connector_force,
1137         .fill_modes = drm_helper_probe_single_connector_modes,
1138         .set_property = nouveau_connector_set_property,
1139         .destroy = nouveau_connector_destroy,
1140         .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state,
1141         .atomic_destroy_state = nouveau_conn_atomic_destroy_state,
1142         .atomic_set_property = nouveau_conn_atomic_set_property,
1143         .atomic_get_property = nouveau_conn_atomic_get_property,
1144         .late_register = nouveau_connector_late_register,
1145         .early_unregister = nouveau_connector_early_unregister,
1146 };
1147
1148 void
1149 nouveau_connector_hpd(struct drm_connector *connector)
1150 {
1151         struct nouveau_drm *drm = nouveau_drm(connector->dev);
1152         u32 mask = drm_connector_mask(connector);
1153
1154         mutex_lock(&drm->hpd_lock);
1155         if (!(drm->hpd_pending & mask)) {
1156                 drm->hpd_pending |= mask;
1157                 schedule_work(&drm->hpd_work);
1158         }
1159         mutex_unlock(&drm->hpd_lock);
1160 }
1161
1162 static int
1163 nouveau_connector_hotplug(struct nvif_notify *notify)
1164 {
1165         struct nouveau_connector *nv_connector =
1166                 container_of(notify, typeof(*nv_connector), hpd);
1167         struct drm_connector *connector = &nv_connector->base;
1168         struct drm_device *dev = connector->dev;
1169         struct nouveau_drm *drm = nouveau_drm(dev);
1170         const struct nvif_notify_conn_rep_v0 *rep = notify->data;
1171         bool plugged = (rep->mask != NVIF_NOTIFY_CONN_V0_UNPLUG);
1172
1173         if (rep->mask & NVIF_NOTIFY_CONN_V0_IRQ) {
1174                 nouveau_dp_irq(drm, nv_connector);
1175                 return NVIF_NOTIFY_KEEP;
1176         }
1177
1178         NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un", connector->name);
1179         nouveau_connector_hpd(connector);
1180
1181         return NVIF_NOTIFY_KEEP;
1182 }
1183
1184 static ssize_t
1185 nouveau_connector_aux_xfer(struct drm_dp_aux *obj, struct drm_dp_aux_msg *msg)
1186 {
1187         struct nouveau_connector *nv_connector =
1188                 container_of(obj, typeof(*nv_connector), aux);
1189         struct nouveau_encoder *nv_encoder;
1190         struct nvkm_i2c_aux *aux;
1191         u8 size = msg->size;
1192         int ret;
1193
1194         nv_encoder = find_encoder(&nv_connector->base, DCB_OUTPUT_DP);
1195         if (!nv_encoder || !(aux = nv_encoder->aux))
1196                 return -ENODEV;
1197         if (WARN_ON(msg->size > 16))
1198                 return -E2BIG;
1199
1200         ret = nvkm_i2c_aux_acquire(aux);
1201         if (ret)
1202                 return ret;
1203
1204         ret = nvkm_i2c_aux_xfer(aux, false, msg->request, msg->address,
1205                                 msg->buffer, &size);
1206         nvkm_i2c_aux_release(aux);
1207         if (ret >= 0) {
1208                 msg->reply = ret;
1209                 return size;
1210         }
1211
1212         return ret;
1213 }
1214
1215 static int
1216 drm_conntype_from_dcb(enum dcb_connector_type dcb)
1217 {
1218         switch (dcb) {
1219         case DCB_CONNECTOR_VGA      : return DRM_MODE_CONNECTOR_VGA;
1220         case DCB_CONNECTOR_TV_0     :
1221         case DCB_CONNECTOR_TV_1     :
1222         case DCB_CONNECTOR_TV_3     : return DRM_MODE_CONNECTOR_TV;
1223         case DCB_CONNECTOR_DMS59_0  :
1224         case DCB_CONNECTOR_DMS59_1  :
1225         case DCB_CONNECTOR_DVI_I    : return DRM_MODE_CONNECTOR_DVII;
1226         case DCB_CONNECTOR_DVI_D    : return DRM_MODE_CONNECTOR_DVID;
1227         case DCB_CONNECTOR_LVDS     :
1228         case DCB_CONNECTOR_LVDS_SPWG: return DRM_MODE_CONNECTOR_LVDS;
1229         case DCB_CONNECTOR_DMS59_DP0:
1230         case DCB_CONNECTOR_DMS59_DP1:
1231         case DCB_CONNECTOR_DP       :
1232         case DCB_CONNECTOR_mDP      :
1233         case DCB_CONNECTOR_USB_C    : return DRM_MODE_CONNECTOR_DisplayPort;
1234         case DCB_CONNECTOR_eDP      : return DRM_MODE_CONNECTOR_eDP;
1235         case DCB_CONNECTOR_HDMI_0   :
1236         case DCB_CONNECTOR_HDMI_1   :
1237         case DCB_CONNECTOR_HDMI_C   : return DRM_MODE_CONNECTOR_HDMIA;
1238         case DCB_CONNECTOR_WFD      : return DRM_MODE_CONNECTOR_VIRTUAL;
1239         default:
1240                 break;
1241         }
1242
1243         return DRM_MODE_CONNECTOR_Unknown;
1244 }
1245
1246 struct drm_connector *
1247 nouveau_connector_create(struct drm_device *dev,
1248                          const struct dcb_output *dcbe)
1249 {
1250         const struct drm_connector_funcs *funcs = &nouveau_connector_funcs;
1251         struct nouveau_drm *drm = nouveau_drm(dev);
1252         struct nouveau_display *disp = nouveau_display(dev);
1253         struct nouveau_connector *nv_connector = NULL;
1254         struct drm_connector *connector;
1255         struct drm_connector_list_iter conn_iter;
1256         char aux_name[48] = {0};
1257         int index = dcbe->connector;
1258         int type, ret = 0;
1259         bool dummy;
1260
1261         drm_connector_list_iter_begin(dev, &conn_iter);
1262         nouveau_for_each_non_mst_connector_iter(connector, &conn_iter) {
1263                 nv_connector = nouveau_connector(connector);
1264                 if (nv_connector->index == index) {
1265                         drm_connector_list_iter_end(&conn_iter);
1266                         return connector;
1267                 }
1268         }
1269         drm_connector_list_iter_end(&conn_iter);
1270
1271         nv_connector = kzalloc(sizeof(*nv_connector), GFP_KERNEL);
1272         if (!nv_connector)
1273                 return ERR_PTR(-ENOMEM);
1274
1275         connector = &nv_connector->base;
1276         nv_connector->index = index;
1277
1278         /* attempt to parse vbios connector type and hotplug gpio */
1279         nv_connector->dcb = olddcb_conn(dev, index);
1280         if (nv_connector->dcb) {
1281                 u32 entry = ROM16(nv_connector->dcb[0]);
1282                 if (olddcb_conntab(dev)[3] >= 4)
1283                         entry |= (u32)ROM16(nv_connector->dcb[2]) << 16;
1284
1285                 nv_connector->type = nv_connector->dcb[0];
1286                 if (drm_conntype_from_dcb(nv_connector->type) ==
1287                                           DRM_MODE_CONNECTOR_Unknown) {
1288                         NV_WARN(drm, "unknown connector type %02x\n",
1289                                 nv_connector->type);
1290                         nv_connector->type = DCB_CONNECTOR_NONE;
1291                 }
1292
1293                 /* Gigabyte NX85T */
1294                 if (nv_match_device(dev, 0x0421, 0x1458, 0x344c)) {
1295                         if (nv_connector->type == DCB_CONNECTOR_HDMI_1)
1296                                 nv_connector->type = DCB_CONNECTOR_DVI_I;
1297                 }
1298
1299                 /* Gigabyte GV-NX86T512H */
1300                 if (nv_match_device(dev, 0x0402, 0x1458, 0x3455)) {
1301                         if (nv_connector->type == DCB_CONNECTOR_HDMI_1)
1302                                 nv_connector->type = DCB_CONNECTOR_DVI_I;
1303                 }
1304         } else {
1305                 nv_connector->type = DCB_CONNECTOR_NONE;
1306         }
1307
1308         /* no vbios data, or an unknown dcb connector type - attempt to
1309          * figure out something suitable ourselves
1310          */
1311         if (nv_connector->type == DCB_CONNECTOR_NONE) {
1312                 struct nouveau_drm *drm = nouveau_drm(dev);
1313                 struct dcb_table *dcbt = &drm->vbios.dcb;
1314                 u32 encoders = 0;
1315                 int i;
1316
1317                 for (i = 0; i < dcbt->entries; i++) {
1318                         if (dcbt->entry[i].connector == nv_connector->index)
1319                                 encoders |= (1 << dcbt->entry[i].type);
1320                 }
1321
1322                 if (encoders & (1 << DCB_OUTPUT_DP)) {
1323                         if (encoders & (1 << DCB_OUTPUT_TMDS))
1324                                 nv_connector->type = DCB_CONNECTOR_DP;
1325                         else
1326                                 nv_connector->type = DCB_CONNECTOR_eDP;
1327                 } else
1328                 if (encoders & (1 << DCB_OUTPUT_TMDS)) {
1329                         if (encoders & (1 << DCB_OUTPUT_ANALOG))
1330                                 nv_connector->type = DCB_CONNECTOR_DVI_I;
1331                         else
1332                                 nv_connector->type = DCB_CONNECTOR_DVI_D;
1333                 } else
1334                 if (encoders & (1 << DCB_OUTPUT_ANALOG)) {
1335                         nv_connector->type = DCB_CONNECTOR_VGA;
1336                 } else
1337                 if (encoders & (1 << DCB_OUTPUT_LVDS)) {
1338                         nv_connector->type = DCB_CONNECTOR_LVDS;
1339                 } else
1340                 if (encoders & (1 << DCB_OUTPUT_TV)) {
1341                         nv_connector->type = DCB_CONNECTOR_TV_0;
1342                 }
1343         }
1344
1345         switch ((type = drm_conntype_from_dcb(nv_connector->type))) {
1346         case DRM_MODE_CONNECTOR_LVDS:
1347                 ret = nouveau_bios_parse_lvds_table(dev, 0, &dummy, &dummy);
1348                 if (ret) {
1349                         NV_ERROR(drm, "Error parsing LVDS table, disabling\n");
1350                         kfree(nv_connector);
1351                         return ERR_PTR(ret);
1352                 }
1353
1354                 funcs = &nouveau_connector_funcs_lvds;
1355                 break;
1356         case DRM_MODE_CONNECTOR_DisplayPort:
1357         case DRM_MODE_CONNECTOR_eDP:
1358                 nv_connector->aux.dev = connector->kdev;
1359                 nv_connector->aux.drm_dev = dev;
1360                 nv_connector->aux.transfer = nouveau_connector_aux_xfer;
1361                 snprintf(aux_name, sizeof(aux_name), "sor-%04x-%04x",
1362                          dcbe->hasht, dcbe->hashm);
1363                 nv_connector->aux.name = kstrdup(aux_name, GFP_KERNEL);
1364                 drm_dp_aux_init(&nv_connector->aux);
1365                 if (ret) {
1366                         NV_ERROR(drm, "Failed to init AUX adapter for sor-%04x-%04x: %d\n",
1367                                  dcbe->hasht, dcbe->hashm, ret);
1368                         kfree(nv_connector);
1369                         return ERR_PTR(ret);
1370                 }
1371                 fallthrough;
1372         default:
1373                 funcs = &nouveau_connector_funcs;
1374                 break;
1375         }
1376
1377         /* HDMI 3D support */
1378         if ((disp->disp.object.oclass >= G82_DISP)
1379             && ((type == DRM_MODE_CONNECTOR_DisplayPort)
1380                 || (type == DRM_MODE_CONNECTOR_eDP)
1381                 || (type == DRM_MODE_CONNECTOR_HDMIA)))
1382                 connector->stereo_allowed = true;
1383
1384         /* defaults, will get overridden in detect() */
1385         connector->interlace_allowed = false;
1386         connector->doublescan_allowed = false;
1387
1388         drm_connector_init(dev, connector, funcs, type);
1389         drm_connector_helper_add(connector, &nouveau_connector_helper_funcs);
1390
1391         connector->funcs->reset(connector);
1392         nouveau_conn_attach_properties(connector);
1393
1394         /* Default scaling mode */
1395         switch (nv_connector->type) {
1396         case DCB_CONNECTOR_LVDS:
1397         case DCB_CONNECTOR_LVDS_SPWG:
1398         case DCB_CONNECTOR_eDP:
1399                 /* see note in nouveau_connector_set_property() */
1400                 if (disp->disp.object.oclass < NV50_DISP) {
1401                         nv_connector->scaling_mode = DRM_MODE_SCALE_FULLSCREEN;
1402                         break;
1403                 }
1404                 nv_connector->scaling_mode = DRM_MODE_SCALE_NONE;
1405                 break;
1406         default:
1407                 nv_connector->scaling_mode = DRM_MODE_SCALE_NONE;
1408                 break;
1409         }
1410
1411         /* dithering properties */
1412         switch (nv_connector->type) {
1413         case DCB_CONNECTOR_TV_0:
1414         case DCB_CONNECTOR_TV_1:
1415         case DCB_CONNECTOR_TV_3:
1416         case DCB_CONNECTOR_VGA:
1417                 break;
1418         default:
1419                 nv_connector->dithering_mode = DITHERING_MODE_AUTO;
1420                 break;
1421         }
1422
1423         switch (type) {
1424         case DRM_MODE_CONNECTOR_DisplayPort:
1425         case DRM_MODE_CONNECTOR_eDP:
1426                 drm_dp_cec_register_connector(&nv_connector->aux, connector);
1427                 break;
1428         }
1429
1430         ret = nvif_notify_ctor(&disp->disp.object, "kmsHotplug",
1431                                nouveau_connector_hotplug,
1432                                true, NV04_DISP_NTFY_CONN,
1433                                &(struct nvif_notify_conn_req_v0) {
1434                                 .mask = NVIF_NOTIFY_CONN_V0_ANY,
1435                                 .conn = index,
1436                                },
1437                                sizeof(struct nvif_notify_conn_req_v0),
1438                                sizeof(struct nvif_notify_conn_rep_v0),
1439                                &nv_connector->hpd);
1440         if (ret)
1441                 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1442         else
1443                 connector->polled = DRM_CONNECTOR_POLL_HPD;
1444
1445         drm_connector_register(connector);
1446         return connector;
1447 }