Lines Matching +full:native +full:- +full:mode
56 const struct drm_connector_helper_funcs *helper = connector->helper_private; in nouveau_conn_native_mode()
57 struct nouveau_drm *drm = nouveau_drm(connector->dev); in nouveau_conn_native_mode()
58 struct drm_device *dev = connector->dev; in nouveau_conn_native_mode()
59 struct drm_display_mode *mode, *largest = NULL; in nouveau_conn_native_mode() local
62 list_for_each_entry(mode, &connector->probed_modes, head) { in nouveau_conn_native_mode()
63 if (helper->mode_valid(connector, mode) != MODE_OK || in nouveau_conn_native_mode()
64 (mode->flags & DRM_MODE_FLAG_INTERLACE)) in nouveau_conn_native_mode()
67 /* Use preferred mode if there is one.. */ in nouveau_conn_native_mode()
68 if (mode->type & DRM_MODE_TYPE_PREFERRED) { in nouveau_conn_native_mode()
69 NV_DEBUG(drm, "native mode from preferred\n"); in nouveau_conn_native_mode()
70 return drm_mode_duplicate(dev, mode); in nouveau_conn_native_mode()
76 if (mode->hdisplay < high_w) in nouveau_conn_native_mode()
79 if (mode->hdisplay == high_w && mode->vdisplay < high_h) in nouveau_conn_native_mode()
82 if (mode->hdisplay == high_w && mode->vdisplay == high_h && in nouveau_conn_native_mode()
83 drm_mode_vrefresh(mode) < high_v) in nouveau_conn_native_mode()
86 high_w = mode->hdisplay; in nouveau_conn_native_mode()
87 high_h = mode->vdisplay; in nouveau_conn_native_mode()
88 high_v = drm_mode_vrefresh(mode); in nouveau_conn_native_mode()
89 largest = mode; in nouveau_conn_native_mode()
92 NV_DEBUG(drm, "native mode from largest: %dx%d@%d\n", in nouveau_conn_native_mode()
103 struct nouveau_display *disp = nouveau_display(connector->dev); in nouveau_conn_atomic_get_property()
104 struct drm_device *dev = connector->dev; in nouveau_conn_atomic_get_property()
106 if (property == dev->mode_config.scaling_mode_property) in nouveau_conn_atomic_get_property()
107 *val = asyc->scaler.mode; in nouveau_conn_atomic_get_property()
108 else if (property == disp->underscan_property) in nouveau_conn_atomic_get_property()
109 *val = asyc->scaler.underscan.mode; in nouveau_conn_atomic_get_property()
110 else if (property == disp->underscan_hborder_property) in nouveau_conn_atomic_get_property()
111 *val = asyc->scaler.underscan.hborder; in nouveau_conn_atomic_get_property()
112 else if (property == disp->underscan_vborder_property) in nouveau_conn_atomic_get_property()
113 *val = asyc->scaler.underscan.vborder; in nouveau_conn_atomic_get_property()
114 else if (property == disp->dithering_mode) in nouveau_conn_atomic_get_property()
115 *val = asyc->dither.mode; in nouveau_conn_atomic_get_property()
116 else if (property == disp->dithering_depth) in nouveau_conn_atomic_get_property()
117 *val = asyc->dither.depth; in nouveau_conn_atomic_get_property()
118 else if (property == disp->vibrant_hue_property) in nouveau_conn_atomic_get_property()
119 *val = asyc->procamp.vibrant_hue; in nouveau_conn_atomic_get_property()
120 else if (property == disp->color_vibrance_property) in nouveau_conn_atomic_get_property()
121 *val = asyc->procamp.color_vibrance; in nouveau_conn_atomic_get_property()
123 return -EINVAL; in nouveau_conn_atomic_get_property()
133 struct drm_device *dev = connector->dev; in nouveau_conn_atomic_set_property()
137 if (property == dev->mode_config.scaling_mode_property) { in nouveau_conn_atomic_set_property()
142 * rates, which people might want to use for power- in nouveau_conn_atomic_set_property()
145 * Non-EDID modes will force the use of GPU scaling in nouveau_conn_atomic_set_property()
146 * to the native mode regardless of this setting. in nouveau_conn_atomic_set_property()
148 switch (connector->connector_type) { in nouveau_conn_atomic_set_property()
154 if (disp->disp.object.oclass < NV50_DISP) in nouveau_conn_atomic_set_property()
155 return -EINVAL; in nouveau_conn_atomic_set_property()
166 return -EINVAL; in nouveau_conn_atomic_set_property()
169 if (asyc->scaler.mode != val) { in nouveau_conn_atomic_set_property()
170 asyc->scaler.mode = val; in nouveau_conn_atomic_set_property()
171 asyc->set.scaler = true; in nouveau_conn_atomic_set_property()
174 if (property == disp->underscan_property) { in nouveau_conn_atomic_set_property()
175 if (asyc->scaler.underscan.mode != val) { in nouveau_conn_atomic_set_property()
176 asyc->scaler.underscan.mode = val; in nouveau_conn_atomic_set_property()
177 asyc->set.scaler = true; in nouveau_conn_atomic_set_property()
180 if (property == disp->underscan_hborder_property) { in nouveau_conn_atomic_set_property()
181 if (asyc->scaler.underscan.hborder != val) { in nouveau_conn_atomic_set_property()
182 asyc->scaler.underscan.hborder = val; in nouveau_conn_atomic_set_property()
183 asyc->set.scaler = true; in nouveau_conn_atomic_set_property()
186 if (property == disp->underscan_vborder_property) { in nouveau_conn_atomic_set_property()
187 if (asyc->scaler.underscan.vborder != val) { in nouveau_conn_atomic_set_property()
188 asyc->scaler.underscan.vborder = val; in nouveau_conn_atomic_set_property()
189 asyc->set.scaler = true; in nouveau_conn_atomic_set_property()
192 if (property == disp->dithering_mode) { in nouveau_conn_atomic_set_property()
193 if (asyc->dither.mode != val) { in nouveau_conn_atomic_set_property()
194 asyc->dither.mode = val; in nouveau_conn_atomic_set_property()
195 asyc->set.dither = true; in nouveau_conn_atomic_set_property()
198 if (property == disp->dithering_depth) { in nouveau_conn_atomic_set_property()
199 if (asyc->dither.mode != val) { in nouveau_conn_atomic_set_property()
200 asyc->dither.depth = val; in nouveau_conn_atomic_set_property()
201 asyc->set.dither = true; in nouveau_conn_atomic_set_property()
204 if (property == disp->vibrant_hue_property) { in nouveau_conn_atomic_set_property()
205 if (asyc->procamp.vibrant_hue != val) { in nouveau_conn_atomic_set_property()
206 asyc->procamp.vibrant_hue = val; in nouveau_conn_atomic_set_property()
207 asyc->set.procamp = true; in nouveau_conn_atomic_set_property()
210 if (property == disp->color_vibrance_property) { in nouveau_conn_atomic_set_property()
211 if (asyc->procamp.color_vibrance != val) { in nouveau_conn_atomic_set_property()
212 asyc->procamp.color_vibrance = val; in nouveau_conn_atomic_set_property()
213 asyc->set.procamp = true; in nouveau_conn_atomic_set_property()
216 return -EINVAL; in nouveau_conn_atomic_set_property()
227 __drm_atomic_helper_connector_destroy_state(&asyc->state); in nouveau_conn_atomic_destroy_state()
234 struct nouveau_conn_atom *armc = nouveau_conn_atom(connector->state); in nouveau_conn_atomic_duplicate_state()
238 __drm_atomic_helper_connector_duplicate_state(connector, &asyc->state); in nouveau_conn_atomic_duplicate_state()
239 asyc->dither = armc->dither; in nouveau_conn_atomic_duplicate_state()
240 asyc->scaler = armc->scaler; in nouveau_conn_atomic_duplicate_state()
241 asyc->procamp = armc->procamp; in nouveau_conn_atomic_duplicate_state()
242 asyc->set.mask = 0; in nouveau_conn_atomic_duplicate_state()
243 return &asyc->state; in nouveau_conn_atomic_duplicate_state()
252 if (drm_drv_uses_atomic_modeset(connector->dev)) { in nouveau_conn_reset()
256 if (connector->state) in nouveau_conn_reset()
258 connector->state); in nouveau_conn_reset()
260 __drm_atomic_helper_connector_reset(connector, &asyc->state); in nouveau_conn_reset()
262 asyc = &nv_connector->properties_state; in nouveau_conn_reset()
265 asyc->dither.mode = DITHERING_MODE_AUTO; in nouveau_conn_reset()
266 asyc->dither.depth = DITHERING_DEPTH_AUTO; in nouveau_conn_reset()
267 asyc->scaler.mode = DRM_MODE_SCALE_NONE; in nouveau_conn_reset()
268 asyc->scaler.underscan.mode = UNDERSCAN_OFF; in nouveau_conn_reset()
269 asyc->procamp.color_vibrance = 150; in nouveau_conn_reset()
270 asyc->procamp.vibrant_hue = 90; in nouveau_conn_reset()
272 if (nouveau_display(connector->dev)->disp.object.oclass < NV50_DISP) { in nouveau_conn_reset()
273 switch (connector->connector_type) { in nouveau_conn_reset()
276 asyc->scaler.mode = DRM_MODE_SCALE_FULLSCREEN; in nouveau_conn_reset()
287 struct drm_device *dev = connector->dev; in nouveau_conn_attach_properties()
292 if (drm_drv_uses_atomic_modeset(connector->dev)) in nouveau_conn_attach_properties()
293 armc = nouveau_conn_atom(connector->state); in nouveau_conn_attach_properties()
295 armc = &nv_connector->properties_state; in nouveau_conn_attach_properties()
297 /* Init DVI-I specific properties. */ in nouveau_conn_attach_properties()
298 if (connector->connector_type == DRM_MODE_CONNECTOR_DVII) in nouveau_conn_attach_properties()
299 drm_object_attach_property(&connector->base, dev->mode_config. in nouveau_conn_attach_properties()
303 if (disp->underscan_property && in nouveau_conn_attach_properties()
304 (connector->connector_type == DRM_MODE_CONNECTOR_DVID || in nouveau_conn_attach_properties()
305 connector->connector_type == DRM_MODE_CONNECTOR_DVII || in nouveau_conn_attach_properties()
306 connector->connector_type == DRM_MODE_CONNECTOR_HDMIA || in nouveau_conn_attach_properties()
307 connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort)) { in nouveau_conn_attach_properties()
308 drm_object_attach_property(&connector->base, in nouveau_conn_attach_properties()
309 disp->underscan_property, in nouveau_conn_attach_properties()
311 drm_object_attach_property(&connector->base, in nouveau_conn_attach_properties()
312 disp->underscan_hborder_property, 0); in nouveau_conn_attach_properties()
313 drm_object_attach_property(&connector->base, in nouveau_conn_attach_properties()
314 disp->underscan_vborder_property, 0); in nouveau_conn_attach_properties()
318 if (disp->vibrant_hue_property) in nouveau_conn_attach_properties()
319 drm_object_attach_property(&connector->base, in nouveau_conn_attach_properties()
320 disp->vibrant_hue_property, in nouveau_conn_attach_properties()
321 armc->procamp.vibrant_hue); in nouveau_conn_attach_properties()
322 if (disp->color_vibrance_property) in nouveau_conn_attach_properties()
323 drm_object_attach_property(&connector->base, in nouveau_conn_attach_properties()
324 disp->color_vibrance_property, in nouveau_conn_attach_properties()
325 armc->procamp.color_vibrance); in nouveau_conn_attach_properties()
327 /* Scaling mode property. */ in nouveau_conn_attach_properties()
328 switch (connector->connector_type) { in nouveau_conn_attach_properties()
332 if (disp->disp.object.oclass < NV50_DISP) in nouveau_conn_attach_properties()
336 drm_object_attach_property(&connector->base, dev->mode_config. in nouveau_conn_attach_properties()
338 armc->scaler.mode); in nouveau_conn_attach_properties()
343 switch (connector->connector_type) { in nouveau_conn_attach_properties()
348 if (disp->dithering_mode) { in nouveau_conn_attach_properties()
349 drm_object_attach_property(&connector->base, in nouveau_conn_attach_properties()
350 disp->dithering_mode, in nouveau_conn_attach_properties()
351 armc->dither.mode); in nouveau_conn_attach_properties()
353 if (disp->dithering_depth) { in nouveau_conn_attach_properties()
354 drm_object_attach_property(&connector->base, in nouveau_conn_attach_properties()
355 disp->dithering_depth, in nouveau_conn_attach_properties()
356 armc->dither.depth); in nouveau_conn_attach_properties()
362 MODULE_PARM_DESC(tv_disable, "Disable TV-out detection");
370 MODULE_PARM_DESC(duallink, "Allow dual-link TMDS (default: enabled)");
388 (nv_encoder->dcb && nv_encoder->dcb->type == type)) in find_encoder()
399 nvif_notify_dtor(&nv_connector->hpd); in nouveau_connector_destroy()
400 kfree(nv_connector->edid); in nouveau_connector_destroy()
403 if (nv_connector->aux.transfer) { in nouveau_connector_destroy()
404 drm_dp_cec_unregister_connector(&nv_connector->aux); in nouveau_connector_destroy()
405 kfree(nv_connector->aux.name); in nouveau_connector_destroy()
407 nvif_conn_dtor(&nv_connector->conn); in nouveau_connector_destroy()
414 struct drm_device *dev = connector->dev; in nouveau_connector_ddc_detect()
415 struct pci_dev *pdev = to_pci_dev(dev->dev); in nouveau_connector_ddc_detect()
424 switch (nv_encoder->dcb->type) { in nouveau_connector_ddc_detect()
439 if (!nv_encoder->i2c) in nouveau_connector_ddc_detect()
444 if (nvkm_probe_i2c(nv_encoder->i2c, 0x50)) in nouveau_connector_ddc_detect()
462 struct drm_device *dev = connector->dev; in nouveau_connector_of_detect()
465 struct pci_dev *pdev = to_pci_dev(dev->dev); in nouveau_connector_of_detect()
476 int idx = name ? name[strlen(name) - 1] - 'A' : 0; in nouveau_connector_of_detect()
478 if (nv_encoder->dcb->i2c_index == idx && edid) { in nouveau_connector_of_detect()
479 nv_connector->edid = in nouveau_connector_of_detect()
494 struct nouveau_drm *drm = nouveau_drm(connector->dev); in nouveau_connector_set_encoder()
495 struct drm_device *dev = connector->dev; in nouveau_connector_set_encoder()
496 struct pci_dev *pdev = to_pci_dev(dev->dev); in nouveau_connector_set_encoder()
498 if (nv_connector->detected_encoder == nv_encoder) in nouveau_connector_set_encoder()
500 nv_connector->detected_encoder = nv_encoder; in nouveau_connector_set_encoder()
502 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) { in nouveau_connector_set_encoder()
503 if (nv_encoder->dcb->type == DCB_OUTPUT_DP) in nouveau_connector_set_encoder()
504 connector->interlace_allowed = in nouveau_connector_set_encoder()
505 nv_encoder->caps.dp_interlace; in nouveau_connector_set_encoder()
507 connector->interlace_allowed = in nouveau_connector_set_encoder()
508 drm->client.device.info.family < NV_DEVICE_INFO_V0_VOLTA; in nouveau_connector_set_encoder()
509 connector->doublescan_allowed = true; in nouveau_connector_set_encoder()
511 if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS || in nouveau_connector_set_encoder()
512 nv_encoder->dcb->type == DCB_OUTPUT_TMDS) { in nouveau_connector_set_encoder()
513 connector->doublescan_allowed = false; in nouveau_connector_set_encoder()
514 connector->interlace_allowed = false; in nouveau_connector_set_encoder()
516 connector->doublescan_allowed = true; in nouveau_connector_set_encoder()
517 if (drm->client.device.info.family == NV_DEVICE_INFO_V0_KELVIN || in nouveau_connector_set_encoder()
518 (drm->client.device.info.family == NV_DEVICE_INFO_V0_CELSIUS && in nouveau_connector_set_encoder()
519 (pdev->device & 0x0ff0) != 0x0100 && in nouveau_connector_set_encoder()
520 (pdev->device & 0x0ff0) != 0x0150)) in nouveau_connector_set_encoder()
522 connector->interlace_allowed = false; in nouveau_connector_set_encoder()
524 connector->interlace_allowed = true; in nouveau_connector_set_encoder()
527 if (nv_connector->type == DCB_CONNECTOR_DVI_I) { in nouveau_connector_set_encoder()
528 drm_object_property_set_value(&connector->base, in nouveau_connector_set_encoder()
529 dev->mode_config.dvi_i_subconnector_property, in nouveau_connector_set_encoder()
530 nv_encoder->dcb->type == DCB_OUTPUT_TMDS ? in nouveau_connector_set_encoder()
540 if (nv_connector->edid != edid) { in nouveau_connector_set_edid()
541 struct edid *old_edid = nv_connector->edid; in nouveau_connector_set_edid()
543 drm_connector_update_edid_property(&nv_connector->base, edid); in nouveau_connector_set_edid()
545 nv_connector->edid = edid; in nouveau_connector_set_edid()
552 struct drm_device *dev = connector->dev; in nouveau_connector_detect()
569 pm_runtime_get_noresume(dev->dev); in nouveau_connector_detect()
571 ret = pm_runtime_get_sync(dev->dev); in nouveau_connector_detect()
572 if (ret < 0 && ret != -EACCES) { in nouveau_connector_detect()
573 pm_runtime_put_autosuspend(dev->dev); in nouveau_connector_detect()
580 if (nv_encoder && (i2c = nv_encoder->i2c) != NULL) { in nouveau_connector_detect()
585 nv_connector->type == DCB_CONNECTOR_LVDS) in nouveau_connector_detect()
591 if (!nv_connector->edid) { in nouveau_connector_detect()
593 connector->name); in nouveau_connector_detect()
597 /* Override encoder type for DVI-I based on whether EDID in nouveau_connector_detect()
603 if (nv_encoder->dcb->type == DCB_OUTPUT_TMDS) in nouveau_connector_detect()
605 if (nv_encoder->dcb->type == DCB_OUTPUT_ANALOG) in nouveau_connector_detect()
608 if (nv_partner && ((nv_encoder->dcb->type == DCB_OUTPUT_ANALOG && in nouveau_connector_detect()
609 nv_partner->dcb->type == DCB_OUTPUT_TMDS) || in nouveau_connector_detect()
610 (nv_encoder->dcb->type == DCB_OUTPUT_TMDS && in nouveau_connector_detect()
611 nv_partner->dcb->type == DCB_OUTPUT_ANALOG))) { in nouveau_connector_detect()
612 if (nv_connector->edid->input & DRM_EDID_INPUT_DIGITAL) in nouveau_connector_detect()
622 drm_dp_cec_set_edid(&nv_connector->aux, nv_connector->edid); in nouveau_connector_detect()
642 encoder->helper_private; in nouveau_connector_detect()
644 if (helper->detect(encoder, connector) == in nouveau_connector_detect()
653 if (!nv_connector->edid) in nouveau_connector_detect()
654 drm_dp_cec_unset_edid(&nv_connector->aux); in nouveau_connector_detect()
656 pm_runtime_mark_last_busy(dev->dev); in nouveau_connector_detect()
657 pm_runtime_put_autosuspend(dev->dev); in nouveau_connector_detect()
665 struct drm_device *dev = connector->dev; in nouveau_connector_detect_lvds()
677 if (!drm->vbios.fp_no_ddc) { in nouveau_connector_detect_lvds()
680 edid = nv_connector->edid; in nouveau_connector_detect_lvds()
691 * the nouveau decides an entry in the VBIOS FP mode table is in nouveau_connector_detect_lvds()
692 * valid - it's not (rh#613284) in nouveau_connector_detect_lvds()
694 if (nv_encoder->dcb->lvdsconf.use_acpi_for_edid) { in nouveau_connector_detect_lvds()
704 * native mode and exit. in nouveau_connector_detect_lvds()
706 if (nouveau_bios_fp_mode(dev, NULL) && (drm->vbios.fp_no_ddc || in nouveau_connector_detect_lvds()
707 nv_encoder->dcb->lvdsconf.use_straps_for_mode)) { in nouveau_connector_detect_lvds()
715 if (!drm->vbios.fp_no_ddc) { in nouveau_connector_detect_lvds()
740 struct nouveau_drm *drm = nouveau_drm(connector->dev); in nouveau_connector_force()
745 if (nv_connector->type == DCB_CONNECTOR_DVI_I) { in nouveau_connector_force()
746 if (connector->force == DRM_FORCE_ON_DIGITAL) in nouveau_connector_force()
756 connector->name); in nouveau_connector_force()
757 connector->status = connector_status_disconnected; in nouveau_connector_force()
769 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; in nouveau_connector_set_property()
770 struct nouveau_conn_atom *asyc = &nv_connector->properties_state; in nouveau_connector_set_property()
774 ret = connector->funcs->atomic_set_property(&nv_connector->base, in nouveau_connector_set_property()
775 &asyc->state, in nouveau_connector_set_property()
778 if (nv_encoder && nv_encoder->dcb->type == DCB_OUTPUT_TV) in nouveau_connector_set_property()
779 return get_slave_funcs(encoder)->set_property( in nouveau_connector_set_property()
784 nv_connector->scaling_mode = asyc->scaler.mode; in nouveau_connector_set_property()
785 nv_connector->dithering_mode = asyc->dither.mode; in nouveau_connector_set_property()
787 if (connector->encoder && connector->encoder->crtc) { in nouveau_connector_set_property()
788 ret = drm_crtc_helper_set_mode(connector->encoder->crtc, in nouveau_connector_set_property()
789 &connector->encoder->crtc->mode, in nouveau_connector_set_property()
790 connector->encoder->crtc->x, in nouveau_connector_set_property()
791 connector->encoder->crtc->y, in nouveau_connector_set_property()
794 return -EINVAL; in nouveau_connector_set_property()
827 struct drm_display_mode *native = nv_connector->native_mode, *m; in nouveau_connector_scaler_modes_add() local
828 struct drm_device *dev = connector->dev; in nouveau_connector_scaler_modes_add()
829 struct moderec *mode = &scaler_modes[0]; in nouveau_connector_scaler_modes_add() local
832 if (!native) in nouveau_connector_scaler_modes_add()
835 while (mode->hdisplay) { in nouveau_connector_scaler_modes_add()
836 if (mode->hdisplay <= native->hdisplay && in nouveau_connector_scaler_modes_add()
837 mode->vdisplay <= native->vdisplay && in nouveau_connector_scaler_modes_add()
838 (mode->hdisplay != native->hdisplay || in nouveau_connector_scaler_modes_add()
839 mode->vdisplay != native->vdisplay)) { in nouveau_connector_scaler_modes_add()
840 m = drm_cvt_mode(dev, mode->hdisplay, mode->vdisplay, in nouveau_connector_scaler_modes_add()
841 drm_mode_vrefresh(native), false, in nouveau_connector_scaler_modes_add()
850 mode++; in nouveau_connector_scaler_modes_add()
859 struct nouveau_drm *drm = nouveau_drm(connector->dev); in nouveau_connector_detect_depth()
861 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; in nouveau_connector_detect_depth()
862 struct nvbios *bios = &drm->vbios; in nouveau_connector_detect_depth()
863 struct drm_display_mode *mode = nv_connector->native_mode; in nouveau_connector_detect_depth() local
867 if (nv_connector->edid && connector->display_info.bpc) in nouveau_connector_detect_depth()
871 if (nv_connector->type == DCB_CONNECTOR_eDP) { in nouveau_connector_detect_depth()
872 connector->display_info.bpc = 6; in nouveau_connector_detect_depth()
877 if (nv_encoder->dcb->type != DCB_OUTPUT_LVDS) { in nouveau_connector_detect_depth()
878 connector->display_info.bpc = 8; in nouveau_connector_detect_depth()
882 connector->display_info.bpc = 6; in nouveau_connector_detect_depth()
885 if (bios->fp_no_ddc) { in nouveau_connector_detect_depth()
886 if (bios->fp.if_is_24bit) in nouveau_connector_detect_depth()
887 connector->display_info.bpc = 8; in nouveau_connector_detect_depth()
894 if (nv_connector->edid && in nouveau_connector_detect_depth()
895 nv_connector->type == DCB_CONNECTOR_LVDS_SPWG) in nouveau_connector_detect_depth()
896 duallink = ((u8 *)nv_connector->edid)[121] == 2; in nouveau_connector_detect_depth()
898 duallink = mode->clock >= bios->fp.duallink_transition_clk; in nouveau_connector_detect_depth()
900 if ((!duallink && (bios->fp.strapless_is_24bit & 1)) || in nouveau_connector_detect_depth()
901 ( duallink && (bios->fp.strapless_is_24bit & 2))) in nouveau_connector_detect_depth()
902 connector->display_info.bpc = 8; in nouveau_connector_detect_depth()
914 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || in nouveau_connector_late_register()
915 connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { in nouveau_connector_late_register()
916 ret = drm_dp_aux_register(&nouveau_connector(connector)->aux); in nouveau_connector_late_register()
930 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || in nouveau_connector_early_unregister()
931 connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) in nouveau_connector_early_unregister()
932 drm_dp_aux_unregister(&nouveau_connector(connector)->aux); in nouveau_connector_early_unregister()
940 struct drm_device *dev = connector->dev; in nouveau_connector_get_modes()
943 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; in nouveau_connector_get_modes()
947 /* destroy the native mode, the attached monitor could have changed. in nouveau_connector_get_modes()
949 if (nv_connector->native_mode) { in nouveau_connector_get_modes()
950 drm_mode_destroy(dev, nv_connector->native_mode); in nouveau_connector_get_modes()
951 nv_connector->native_mode = NULL; in nouveau_connector_get_modes()
954 if (nv_connector->edid) in nouveau_connector_get_modes()
955 ret = drm_add_edid_modes(connector, nv_connector->edid); in nouveau_connector_get_modes()
957 if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS && in nouveau_connector_get_modes()
958 (nv_encoder->dcb->lvdsconf.use_straps_for_mode || in nouveau_connector_get_modes()
959 drm->vbios.fp_no_ddc) && nouveau_bios_fp_mode(dev, NULL)) { in nouveau_connector_get_modes()
960 struct drm_display_mode mode; in nouveau_connector_get_modes() local
962 nouveau_bios_fp_mode(dev, &mode); in nouveau_connector_get_modes()
963 nv_connector->native_mode = drm_mode_duplicate(dev, &mode); in nouveau_connector_get_modes()
969 if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS) in nouveau_connector_get_modes()
972 /* Find the native mode if this is a digital panel, if we didn't in nouveau_connector_get_modes()
973 * find any modes through DDC previously add the native mode to in nouveau_connector_get_modes()
976 if (!nv_connector->native_mode) in nouveau_connector_get_modes()
977 nv_connector->native_mode = nouveau_conn_native_mode(connector); in nouveau_connector_get_modes()
978 if (ret == 0 && nv_connector->native_mode) { in nouveau_connector_get_modes()
979 struct drm_display_mode *mode; in nouveau_connector_get_modes() local
981 mode = drm_mode_duplicate(dev, nv_connector->native_mode); in nouveau_connector_get_modes()
982 drm_mode_probed_add(connector, mode); in nouveau_connector_get_modes()
987 * "native" mode as some VBIOS tables require us to use the in nouveau_connector_get_modes()
990 if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS) in nouveau_connector_get_modes()
993 if (nv_encoder->dcb->type == DCB_OUTPUT_TV) in nouveau_connector_get_modes()
994 ret = get_slave_funcs(encoder)->get_modes(encoder, connector); in nouveau_connector_get_modes()
996 if (nv_connector->type == DCB_CONNECTOR_LVDS || in nouveau_connector_get_modes()
997 nv_connector->type == DCB_CONNECTOR_LVDS_SPWG || in nouveau_connector_get_modes()
998 nv_connector->type == DCB_CONNECTOR_eDP) in nouveau_connector_get_modes()
1008 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; in get_tmds_link_bandwidth()
1009 struct nouveau_drm *drm = nouveau_drm(connector->dev); in get_tmds_link_bandwidth()
1010 struct dcb_output *dcb = nv_connector->detected_encoder->dcb; in get_tmds_link_bandwidth()
1013 nouveau_duallink && nv_encoder->dcb->duallink_possible ? 2 : 1; in get_tmds_link_bandwidth()
1015 if (drm_detect_hdmi_monitor(nv_connector->edid)) { in get_tmds_link_bandwidth()
1016 info = &nv_connector->base.display_info; in get_tmds_link_bandwidth()
1026 if (drm->client.device.info.chipset >= 0x120) { in get_tmds_link_bandwidth()
1028 info->hdmi.scdc.scrambling.supported ? in get_tmds_link_bandwidth()
1030 return info->max_tmds_clock ? in get_tmds_link_bandwidth()
1031 min(info->max_tmds_clock, max_tmds_clock) : in get_tmds_link_bandwidth()
1034 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_KEPLER) in get_tmds_link_bandwidth()
1036 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_FERMI) in get_tmds_link_bandwidth()
1040 if (dcb->location != DCB_LOC_ON_CHIP || in get_tmds_link_bandwidth()
1041 drm->client.device.info.chipset >= 0x46) in get_tmds_link_bandwidth()
1043 else if (drm->client.device.info.chipset >= 0x40) in get_tmds_link_bandwidth()
1045 else if (drm->client.device.info.chipset >= 0x18) in get_tmds_link_bandwidth()
1053 struct drm_display_mode *mode) in nouveau_connector_mode_valid() argument
1056 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; in nouveau_connector_mode_valid()
1058 unsigned int min_clock = 25000, max_clock = min_clock, clock = mode->clock; in nouveau_connector_mode_valid()
1060 switch (nv_encoder->dcb->type) { in nouveau_connector_mode_valid()
1062 if (nv_connector->native_mode && in nouveau_connector_mode_valid()
1063 (mode->hdisplay > nv_connector->native_mode->hdisplay || in nouveau_connector_mode_valid()
1064 mode->vdisplay > nv_connector->native_mode->vdisplay)) in nouveau_connector_mode_valid()
1074 max_clock = nv_encoder->dcb->crtconf.maxfreq; in nouveau_connector_mode_valid()
1079 return get_slave_funcs(encoder)->mode_valid(encoder, mode); in nouveau_connector_mode_valid()
1081 return nv50_dp_mode_valid(connector, nv_encoder, mode, NULL); in nouveau_connector_mode_valid()
1087 if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING) in nouveau_connector_mode_valid()
1103 if (nv_connector->detected_encoder) in nouveau_connector_best_encoder()
1104 return to_drm_encoder(nv_connector->detected_encoder); in nouveau_connector_best_encoder()
1116 if (!nv_conn->dp_encoder || !nv50_has_mst(nouveau_drm(connector->dev))) in nouveau_connector_atomic_check()
1119 return drm_dp_mst_root_conn_atomic_check(conn_state, &nv_conn->dp_encoder->dp.mstm->mgr); in nouveau_connector_atomic_check()
1167 struct nouveau_drm *drm = nouveau_drm(connector->dev); in nouveau_connector_hpd()
1170 mutex_lock(&drm->hpd_lock); in nouveau_connector_hpd()
1171 if (!(drm->hpd_pending & mask)) { in nouveau_connector_hpd()
1172 drm->hpd_pending |= mask; in nouveau_connector_hpd()
1173 schedule_work(&drm->hpd_work); in nouveau_connector_hpd()
1175 mutex_unlock(&drm->hpd_lock); in nouveau_connector_hpd()
1183 struct drm_connector *connector = &nv_connector->base; in nouveau_connector_hotplug()
1184 struct drm_device *dev = connector->dev; in nouveau_connector_hotplug()
1186 const struct nvif_notify_conn_rep_v0 *rep = notify->data; in nouveau_connector_hotplug()
1187 bool plugged = (rep->mask != NVIF_NOTIFY_CONN_V0_UNPLUG); in nouveau_connector_hotplug()
1189 if (rep->mask & NVIF_NOTIFY_CONN_V0_IRQ) { in nouveau_connector_hotplug()
1194 NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un", connector->name); in nouveau_connector_hotplug()
1207 u8 size = msg->size; in nouveau_connector_aux_xfer()
1210 nv_encoder = find_encoder(&nv_connector->base, DCB_OUTPUT_DP); in nouveau_connector_aux_xfer()
1211 if (!nv_encoder || !(aux = nv_encoder->aux)) in nouveau_connector_aux_xfer()
1212 return -ENODEV; in nouveau_connector_aux_xfer()
1213 if (WARN_ON(msg->size > 16)) in nouveau_connector_aux_xfer()
1214 return -E2BIG; in nouveau_connector_aux_xfer()
1220 ret = nvkm_i2c_aux_xfer(aux, false, msg->request, msg->address, in nouveau_connector_aux_xfer()
1221 msg->buffer, &size); in nouveau_connector_aux_xfer()
1224 msg->reply = ret; in nouveau_connector_aux_xfer()
1273 int index = dcbe->connector; in nouveau_connector_create()
1280 if (nv_connector->index == index) { in nouveau_connector_create()
1289 return ERR_PTR(-ENOMEM); in nouveau_connector_create()
1291 connector = &nv_connector->base; in nouveau_connector_create()
1292 nv_connector->index = index; in nouveau_connector_create()
1295 nv_connector->dcb = olddcb_conn(dev, index); in nouveau_connector_create()
1296 if (nv_connector->dcb) { in nouveau_connector_create()
1297 u32 entry = ROM16(nv_connector->dcb[0]); in nouveau_connector_create()
1299 entry |= (u32)ROM16(nv_connector->dcb[2]) << 16; in nouveau_connector_create()
1301 nv_connector->type = nv_connector->dcb[0]; in nouveau_connector_create()
1302 if (drm_conntype_from_dcb(nv_connector->type) == in nouveau_connector_create()
1305 nv_connector->type); in nouveau_connector_create()
1306 nv_connector->type = DCB_CONNECTOR_NONE; in nouveau_connector_create()
1311 if (nv_connector->type == DCB_CONNECTOR_HDMI_1) in nouveau_connector_create()
1312 nv_connector->type = DCB_CONNECTOR_DVI_I; in nouveau_connector_create()
1315 /* Gigabyte GV-NX86T512H */ in nouveau_connector_create()
1317 if (nv_connector->type == DCB_CONNECTOR_HDMI_1) in nouveau_connector_create()
1318 nv_connector->type = DCB_CONNECTOR_DVI_I; in nouveau_connector_create()
1321 nv_connector->type = DCB_CONNECTOR_NONE; in nouveau_connector_create()
1324 /* no vbios data, or an unknown dcb connector type - attempt to in nouveau_connector_create()
1327 if (nv_connector->type == DCB_CONNECTOR_NONE) { in nouveau_connector_create()
1329 struct dcb_table *dcbt = &drm->vbios.dcb; in nouveau_connector_create()
1333 for (i = 0; i < dcbt->entries; i++) { in nouveau_connector_create()
1334 if (dcbt->entry[i].connector == nv_connector->index) in nouveau_connector_create()
1335 encoders |= (1 << dcbt->entry[i].type); in nouveau_connector_create()
1340 nv_connector->type = DCB_CONNECTOR_DP; in nouveau_connector_create()
1342 nv_connector->type = DCB_CONNECTOR_eDP; in nouveau_connector_create()
1346 nv_connector->type = DCB_CONNECTOR_DVI_I; in nouveau_connector_create()
1348 nv_connector->type = DCB_CONNECTOR_DVI_D; in nouveau_connector_create()
1351 nv_connector->type = DCB_CONNECTOR_VGA; in nouveau_connector_create()
1354 nv_connector->type = DCB_CONNECTOR_LVDS; in nouveau_connector_create()
1357 nv_connector->type = DCB_CONNECTOR_TV_0; in nouveau_connector_create()
1361 switch ((type = drm_conntype_from_dcb(nv_connector->type))) { in nouveau_connector_create()
1374 nv_connector->aux.dev = connector->kdev; in nouveau_connector_create()
1375 nv_connector->aux.drm_dev = dev; in nouveau_connector_create()
1376 nv_connector->aux.transfer = nouveau_connector_aux_xfer; in nouveau_connector_create()
1377 snprintf(aux_name, sizeof(aux_name), "sor-%04x-%04x", in nouveau_connector_create()
1378 dcbe->hasht, dcbe->hashm); in nouveau_connector_create()
1379 nv_connector->aux.name = kstrdup(aux_name, GFP_KERNEL); in nouveau_connector_create()
1380 if (!nv_connector->aux.name) { in nouveau_connector_create()
1382 return ERR_PTR(-ENOMEM); in nouveau_connector_create()
1384 drm_dp_aux_init(&nv_connector->aux); in nouveau_connector_create()
1392 if ((disp->disp.object.oclass >= G82_DISP) in nouveau_connector_create()
1396 connector->stereo_allowed = true; in nouveau_connector_create()
1399 connector->interlace_allowed = false; in nouveau_connector_create()
1400 connector->doublescan_allowed = false; in nouveau_connector_create()
1405 if (nv_connector->dcb && (disp->disp.conn_mask & BIT(nv_connector->index))) { in nouveau_connector_create()
1406 ret = nvif_conn_ctor(&disp->disp, nv_connector->base.name, nv_connector->index, in nouveau_connector_create()
1407 &nv_connector->conn); in nouveau_connector_create()
1414 connector->funcs->reset(connector); in nouveau_connector_create()
1417 /* Default scaling mode */ in nouveau_connector_create()
1418 switch (nv_connector->type) { in nouveau_connector_create()
1423 if (disp->disp.object.oclass < NV50_DISP) { in nouveau_connector_create()
1424 nv_connector->scaling_mode = DRM_MODE_SCALE_FULLSCREEN; in nouveau_connector_create()
1427 nv_connector->scaling_mode = DRM_MODE_SCALE_NONE; in nouveau_connector_create()
1430 nv_connector->scaling_mode = DRM_MODE_SCALE_NONE; in nouveau_connector_create()
1435 switch (nv_connector->type) { in nouveau_connector_create()
1442 nv_connector->dithering_mode = DITHERING_MODE_AUTO; in nouveau_connector_create()
1448 nv_connector->dp_encoder = find_encoder(&nv_connector->base, DCB_OUTPUT_DP); in nouveau_connector_create()
1451 drm_dp_cec_register_connector(&nv_connector->aux, connector); in nouveau_connector_create()
1455 ret = nvif_notify_ctor(&disp->disp.object, "kmsHotplug", in nouveau_connector_create()
1464 &nv_connector->hpd); in nouveau_connector_create()
1466 connector->polled = DRM_CONNECTOR_POLL_CONNECT; in nouveau_connector_create()
1468 connector->polled = DRM_CONNECTOR_POLL_HPD; in nouveau_connector_create()