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()
413 struct drm_device *dev = connector->dev; in nouveau_connector_ddc_detect()
414 struct pci_dev *pdev = to_pci_dev(dev->dev); in nouveau_connector_ddc_detect()
423 switch (nv_encoder->dcb->type) { in nouveau_connector_ddc_detect()
438 if (!nv_encoder->i2c) in nouveau_connector_ddc_detect()
443 if (nvkm_probe_i2c(nv_encoder->i2c, 0x50)) in nouveau_connector_ddc_detect()
461 struct drm_device *dev = connector->dev; in nouveau_connector_of_detect()
464 struct pci_dev *pdev = to_pci_dev(dev->dev); in nouveau_connector_of_detect()
475 int idx = name ? name[strlen(name) - 1] - 'A' : 0; in nouveau_connector_of_detect()
477 if (nv_encoder->dcb->i2c_index == idx && edid) { in nouveau_connector_of_detect()
478 nv_connector->edid = in nouveau_connector_of_detect()
493 struct nouveau_drm *drm = nouveau_drm(connector->dev); in nouveau_connector_set_encoder()
494 struct drm_device *dev = connector->dev; in nouveau_connector_set_encoder()
495 struct pci_dev *pdev = to_pci_dev(dev->dev); in nouveau_connector_set_encoder()
497 if (nv_connector->detected_encoder == nv_encoder) in nouveau_connector_set_encoder()
499 nv_connector->detected_encoder = nv_encoder; in nouveau_connector_set_encoder()
501 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) { in nouveau_connector_set_encoder()
502 if (nv_encoder->dcb->type == DCB_OUTPUT_DP) in nouveau_connector_set_encoder()
503 connector->interlace_allowed = in nouveau_connector_set_encoder()
504 nv_encoder->caps.dp_interlace; in nouveau_connector_set_encoder()
506 connector->interlace_allowed = true; in nouveau_connector_set_encoder()
507 connector->doublescan_allowed = true; in nouveau_connector_set_encoder()
509 if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS || in nouveau_connector_set_encoder()
510 nv_encoder->dcb->type == DCB_OUTPUT_TMDS) { in nouveau_connector_set_encoder()
511 connector->doublescan_allowed = false; in nouveau_connector_set_encoder()
512 connector->interlace_allowed = false; in nouveau_connector_set_encoder()
514 connector->doublescan_allowed = true; in nouveau_connector_set_encoder()
515 if (drm->client.device.info.family == NV_DEVICE_INFO_V0_KELVIN || in nouveau_connector_set_encoder()
516 (drm->client.device.info.family == NV_DEVICE_INFO_V0_CELSIUS && in nouveau_connector_set_encoder()
517 (pdev->device & 0x0ff0) != 0x0100 && in nouveau_connector_set_encoder()
518 (pdev->device & 0x0ff0) != 0x0150)) in nouveau_connector_set_encoder()
520 connector->interlace_allowed = false; in nouveau_connector_set_encoder()
522 connector->interlace_allowed = true; in nouveau_connector_set_encoder()
525 if (nv_connector->type == DCB_CONNECTOR_DVI_I) { in nouveau_connector_set_encoder()
526 drm_object_property_set_value(&connector->base, in nouveau_connector_set_encoder()
527 dev->mode_config.dvi_i_subconnector_property, in nouveau_connector_set_encoder()
528 nv_encoder->dcb->type == DCB_OUTPUT_TMDS ? in nouveau_connector_set_encoder()
538 if (nv_connector->edid != edid) { in nouveau_connector_set_edid()
539 struct edid *old_edid = nv_connector->edid; in nouveau_connector_set_edid()
541 drm_connector_update_edid_property(&nv_connector->base, edid); in nouveau_connector_set_edid()
543 nv_connector->edid = edid; in nouveau_connector_set_edid()
550 struct drm_device *dev = connector->dev; in nouveau_connector_detect()
567 pm_runtime_get_noresume(dev->dev); in nouveau_connector_detect()
569 ret = pm_runtime_get_sync(dev->dev); in nouveau_connector_detect()
570 if (ret < 0 && ret != -EACCES) { in nouveau_connector_detect()
571 pm_runtime_put_autosuspend(dev->dev); in nouveau_connector_detect()
578 if (nv_encoder && (i2c = nv_encoder->i2c) != NULL) { in nouveau_connector_detect()
583 nv_connector->type == DCB_CONNECTOR_LVDS) in nouveau_connector_detect()
589 if (!nv_connector->edid) { in nouveau_connector_detect()
591 connector->name); in nouveau_connector_detect()
595 /* Override encoder type for DVI-I based on whether EDID in nouveau_connector_detect()
601 if (nv_encoder->dcb->type == DCB_OUTPUT_TMDS) in nouveau_connector_detect()
603 if (nv_encoder->dcb->type == DCB_OUTPUT_ANALOG) in nouveau_connector_detect()
606 if (nv_partner && ((nv_encoder->dcb->type == DCB_OUTPUT_ANALOG && in nouveau_connector_detect()
607 nv_partner->dcb->type == DCB_OUTPUT_TMDS) || in nouveau_connector_detect()
608 (nv_encoder->dcb->type == DCB_OUTPUT_TMDS && in nouveau_connector_detect()
609 nv_partner->dcb->type == DCB_OUTPUT_ANALOG))) { in nouveau_connector_detect()
610 if (nv_connector->edid->input & DRM_EDID_INPUT_DIGITAL) in nouveau_connector_detect()
620 drm_dp_cec_set_edid(&nv_connector->aux, nv_connector->edid); in nouveau_connector_detect()
640 encoder->helper_private; in nouveau_connector_detect()
642 if (helper->detect(encoder, connector) == in nouveau_connector_detect()
651 if (!nv_connector->edid) in nouveau_connector_detect()
652 drm_dp_cec_unset_edid(&nv_connector->aux); in nouveau_connector_detect()
654 pm_runtime_mark_last_busy(dev->dev); in nouveau_connector_detect()
655 pm_runtime_put_autosuspend(dev->dev); in nouveau_connector_detect()
663 struct drm_device *dev = connector->dev; in nouveau_connector_detect_lvds()
675 if (!drm->vbios.fp_no_ddc) { in nouveau_connector_detect_lvds()
678 edid = nv_connector->edid; in nouveau_connector_detect_lvds()
689 * the nouveau decides an entry in the VBIOS FP mode table is in nouveau_connector_detect_lvds()
690 * valid - it's not (rh#613284) in nouveau_connector_detect_lvds()
692 if (nv_encoder->dcb->lvdsconf.use_acpi_for_edid) { in nouveau_connector_detect_lvds()
702 * native mode and exit. in nouveau_connector_detect_lvds()
704 if (nouveau_bios_fp_mode(dev, NULL) && (drm->vbios.fp_no_ddc || in nouveau_connector_detect_lvds()
705 nv_encoder->dcb->lvdsconf.use_straps_for_mode)) { in nouveau_connector_detect_lvds()
713 if (!drm->vbios.fp_no_ddc) { in nouveau_connector_detect_lvds()
738 struct nouveau_drm *drm = nouveau_drm(connector->dev); in nouveau_connector_force()
743 if (nv_connector->type == DCB_CONNECTOR_DVI_I) { in nouveau_connector_force()
744 if (connector->force == DRM_FORCE_ON_DIGITAL) in nouveau_connector_force()
754 connector->name); in nouveau_connector_force()
755 connector->status = connector_status_disconnected; in nouveau_connector_force()
767 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; in nouveau_connector_set_property()
768 struct nouveau_conn_atom *asyc = &nv_connector->properties_state; in nouveau_connector_set_property()
772 ret = connector->funcs->atomic_set_property(&nv_connector->base, in nouveau_connector_set_property()
773 &asyc->state, in nouveau_connector_set_property()
776 if (nv_encoder && nv_encoder->dcb->type == DCB_OUTPUT_TV) in nouveau_connector_set_property()
777 return get_slave_funcs(encoder)->set_property( in nouveau_connector_set_property()
782 nv_connector->scaling_mode = asyc->scaler.mode; in nouveau_connector_set_property()
783 nv_connector->dithering_mode = asyc->dither.mode; in nouveau_connector_set_property()
785 if (connector->encoder && connector->encoder->crtc) { in nouveau_connector_set_property()
786 ret = drm_crtc_helper_set_mode(connector->encoder->crtc, in nouveau_connector_set_property()
787 &connector->encoder->crtc->mode, in nouveau_connector_set_property()
788 connector->encoder->crtc->x, in nouveau_connector_set_property()
789 connector->encoder->crtc->y, in nouveau_connector_set_property()
792 return -EINVAL; in nouveau_connector_set_property()
825 struct drm_display_mode *native = nv_connector->native_mode, *m; in nouveau_connector_scaler_modes_add() local
826 struct drm_device *dev = connector->dev; in nouveau_connector_scaler_modes_add()
827 struct moderec *mode = &scaler_modes[0]; in nouveau_connector_scaler_modes_add() local
830 if (!native) in nouveau_connector_scaler_modes_add()
833 while (mode->hdisplay) { in nouveau_connector_scaler_modes_add()
834 if (mode->hdisplay <= native->hdisplay && in nouveau_connector_scaler_modes_add()
835 mode->vdisplay <= native->vdisplay && in nouveau_connector_scaler_modes_add()
836 (mode->hdisplay != native->hdisplay || in nouveau_connector_scaler_modes_add()
837 mode->vdisplay != native->vdisplay)) { in nouveau_connector_scaler_modes_add()
838 m = drm_cvt_mode(dev, mode->hdisplay, mode->vdisplay, in nouveau_connector_scaler_modes_add()
839 drm_mode_vrefresh(native), false, in nouveau_connector_scaler_modes_add()
848 mode++; in nouveau_connector_scaler_modes_add()
857 struct nouveau_drm *drm = nouveau_drm(connector->dev); in nouveau_connector_detect_depth()
859 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; in nouveau_connector_detect_depth()
860 struct nvbios *bios = &drm->vbios; in nouveau_connector_detect_depth()
861 struct drm_display_mode *mode = nv_connector->native_mode; in nouveau_connector_detect_depth() local
865 if (nv_connector->edid && connector->display_info.bpc) in nouveau_connector_detect_depth()
869 if (nv_connector->type == DCB_CONNECTOR_eDP) { in nouveau_connector_detect_depth()
870 connector->display_info.bpc = 6; in nouveau_connector_detect_depth()
875 if (nv_encoder->dcb->type != DCB_OUTPUT_LVDS) { in nouveau_connector_detect_depth()
876 connector->display_info.bpc = 8; in nouveau_connector_detect_depth()
880 connector->display_info.bpc = 6; in nouveau_connector_detect_depth()
883 if (bios->fp_no_ddc) { in nouveau_connector_detect_depth()
884 if (bios->fp.if_is_24bit) in nouveau_connector_detect_depth()
885 connector->display_info.bpc = 8; in nouveau_connector_detect_depth()
892 if (nv_connector->edid && in nouveau_connector_detect_depth()
893 nv_connector->type == DCB_CONNECTOR_LVDS_SPWG) in nouveau_connector_detect_depth()
894 duallink = ((u8 *)nv_connector->edid)[121] == 2; in nouveau_connector_detect_depth()
896 duallink = mode->clock >= bios->fp.duallink_transition_clk; in nouveau_connector_detect_depth()
898 if ((!duallink && (bios->fp.strapless_is_24bit & 1)) || in nouveau_connector_detect_depth()
899 ( duallink && (bios->fp.strapless_is_24bit & 2))) in nouveau_connector_detect_depth()
900 connector->display_info.bpc = 8; in nouveau_connector_detect_depth()
912 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || in nouveau_connector_late_register()
913 connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { in nouveau_connector_late_register()
914 ret = drm_dp_aux_register(&nouveau_connector(connector)->aux); in nouveau_connector_late_register()
928 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || in nouveau_connector_early_unregister()
929 connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) in nouveau_connector_early_unregister()
930 drm_dp_aux_unregister(&nouveau_connector(connector)->aux); in nouveau_connector_early_unregister()
938 struct drm_device *dev = connector->dev; in nouveau_connector_get_modes()
941 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; in nouveau_connector_get_modes()
945 /* destroy the native mode, the attached monitor could have changed. in nouveau_connector_get_modes()
947 if (nv_connector->native_mode) { in nouveau_connector_get_modes()
948 drm_mode_destroy(dev, nv_connector->native_mode); in nouveau_connector_get_modes()
949 nv_connector->native_mode = NULL; in nouveau_connector_get_modes()
952 if (nv_connector->edid) in nouveau_connector_get_modes()
953 ret = drm_add_edid_modes(connector, nv_connector->edid); in nouveau_connector_get_modes()
955 if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS && in nouveau_connector_get_modes()
956 (nv_encoder->dcb->lvdsconf.use_straps_for_mode || in nouveau_connector_get_modes()
957 drm->vbios.fp_no_ddc) && nouveau_bios_fp_mode(dev, NULL)) { in nouveau_connector_get_modes()
958 struct drm_display_mode mode; in nouveau_connector_get_modes() local
960 nouveau_bios_fp_mode(dev, &mode); in nouveau_connector_get_modes()
961 nv_connector->native_mode = drm_mode_duplicate(dev, &mode); in nouveau_connector_get_modes()
967 if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS) in nouveau_connector_get_modes()
970 /* Find the native mode if this is a digital panel, if we didn't in nouveau_connector_get_modes()
971 * find any modes through DDC previously add the native mode to in nouveau_connector_get_modes()
974 if (!nv_connector->native_mode) in nouveau_connector_get_modes()
975 nv_connector->native_mode = nouveau_conn_native_mode(connector); in nouveau_connector_get_modes()
976 if (ret == 0 && nv_connector->native_mode) { in nouveau_connector_get_modes()
977 struct drm_display_mode *mode; in nouveau_connector_get_modes() local
979 mode = drm_mode_duplicate(dev, nv_connector->native_mode); in nouveau_connector_get_modes()
980 drm_mode_probed_add(connector, mode); in nouveau_connector_get_modes()
985 * "native" mode as some VBIOS tables require us to use the in nouveau_connector_get_modes()
988 if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS) in nouveau_connector_get_modes()
991 if (nv_encoder->dcb->type == DCB_OUTPUT_TV) in nouveau_connector_get_modes()
992 ret = get_slave_funcs(encoder)->get_modes(encoder, connector); in nouveau_connector_get_modes()
994 if (nv_connector->type == DCB_CONNECTOR_LVDS || in nouveau_connector_get_modes()
995 nv_connector->type == DCB_CONNECTOR_LVDS_SPWG || in nouveau_connector_get_modes()
996 nv_connector->type == DCB_CONNECTOR_eDP) in nouveau_connector_get_modes()
1006 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; in get_tmds_link_bandwidth()
1007 struct nouveau_drm *drm = nouveau_drm(connector->dev); in get_tmds_link_bandwidth()
1008 struct dcb_output *dcb = nv_connector->detected_encoder->dcb; in get_tmds_link_bandwidth()
1011 nouveau_duallink && nv_encoder->dcb->duallink_possible ? 2 : 1; in get_tmds_link_bandwidth()
1013 if (drm_detect_hdmi_monitor(nv_connector->edid)) { in get_tmds_link_bandwidth()
1014 info = &nv_connector->base.display_info; in get_tmds_link_bandwidth()
1024 if (drm->client.device.info.chipset >= 0x120) { in get_tmds_link_bandwidth()
1026 info->hdmi.scdc.scrambling.supported ? in get_tmds_link_bandwidth()
1028 return info->max_tmds_clock ? in get_tmds_link_bandwidth()
1029 min(info->max_tmds_clock, max_tmds_clock) : in get_tmds_link_bandwidth()
1032 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_KEPLER) in get_tmds_link_bandwidth()
1034 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_FERMI) in get_tmds_link_bandwidth()
1038 if (dcb->location != DCB_LOC_ON_CHIP || in get_tmds_link_bandwidth()
1039 drm->client.device.info.chipset >= 0x46) in get_tmds_link_bandwidth()
1041 else if (drm->client.device.info.chipset >= 0x40) in get_tmds_link_bandwidth()
1043 else if (drm->client.device.info.chipset >= 0x18) in get_tmds_link_bandwidth()
1051 struct drm_display_mode *mode) in nouveau_connector_mode_valid() argument
1054 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; in nouveau_connector_mode_valid()
1056 unsigned int min_clock = 25000, max_clock = min_clock, clock = mode->clock; in nouveau_connector_mode_valid()
1058 switch (nv_encoder->dcb->type) { in nouveau_connector_mode_valid()
1060 if (nv_connector->native_mode && in nouveau_connector_mode_valid()
1061 (mode->hdisplay > nv_connector->native_mode->hdisplay || in nouveau_connector_mode_valid()
1062 mode->vdisplay > nv_connector->native_mode->vdisplay)) in nouveau_connector_mode_valid()
1072 max_clock = nv_encoder->dcb->crtconf.maxfreq; in nouveau_connector_mode_valid()
1077 return get_slave_funcs(encoder)->mode_valid(encoder, mode); in nouveau_connector_mode_valid()
1079 return nv50_dp_mode_valid(connector, nv_encoder, mode, NULL); in nouveau_connector_mode_valid()
1085 if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING) in nouveau_connector_mode_valid()
1101 if (nv_connector->detected_encoder) in nouveau_connector_best_encoder()
1102 return to_drm_encoder(nv_connector->detected_encoder); in nouveau_connector_best_encoder()
1151 struct nouveau_drm *drm = nouveau_drm(connector->dev); in nouveau_connector_hpd()
1154 mutex_lock(&drm->hpd_lock); in nouveau_connector_hpd()
1155 if (!(drm->hpd_pending & mask)) { in nouveau_connector_hpd()
1156 drm->hpd_pending |= mask; in nouveau_connector_hpd()
1157 schedule_work(&drm->hpd_work); in nouveau_connector_hpd()
1159 mutex_unlock(&drm->hpd_lock); in nouveau_connector_hpd()
1167 struct drm_connector *connector = &nv_connector->base; in nouveau_connector_hotplug()
1168 struct drm_device *dev = connector->dev; in nouveau_connector_hotplug()
1170 const struct nvif_notify_conn_rep_v0 *rep = notify->data; in nouveau_connector_hotplug()
1171 bool plugged = (rep->mask != NVIF_NOTIFY_CONN_V0_UNPLUG); in nouveau_connector_hotplug()
1173 if (rep->mask & NVIF_NOTIFY_CONN_V0_IRQ) { in nouveau_connector_hotplug()
1178 NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un", connector->name); in nouveau_connector_hotplug()
1191 u8 size = msg->size; in nouveau_connector_aux_xfer()
1194 nv_encoder = find_encoder(&nv_connector->base, DCB_OUTPUT_DP); in nouveau_connector_aux_xfer()
1195 if (!nv_encoder || !(aux = nv_encoder->aux)) in nouveau_connector_aux_xfer()
1196 return -ENODEV; in nouveau_connector_aux_xfer()
1197 if (WARN_ON(msg->size > 16)) in nouveau_connector_aux_xfer()
1198 return -E2BIG; in nouveau_connector_aux_xfer()
1204 ret = nvkm_i2c_aux_xfer(aux, false, msg->request, msg->address, in nouveau_connector_aux_xfer()
1205 msg->buffer, &size); in nouveau_connector_aux_xfer()
1208 msg->reply = ret; in nouveau_connector_aux_xfer()
1257 int index = dcbe->connector; in nouveau_connector_create()
1264 if (nv_connector->index == index) { in nouveau_connector_create()
1273 return ERR_PTR(-ENOMEM); in nouveau_connector_create()
1275 connector = &nv_connector->base; in nouveau_connector_create()
1276 nv_connector->index = index; in nouveau_connector_create()
1279 nv_connector->dcb = olddcb_conn(dev, index); in nouveau_connector_create()
1280 if (nv_connector->dcb) { in nouveau_connector_create()
1281 u32 entry = ROM16(nv_connector->dcb[0]); in nouveau_connector_create()
1283 entry |= (u32)ROM16(nv_connector->dcb[2]) << 16; in nouveau_connector_create()
1285 nv_connector->type = nv_connector->dcb[0]; in nouveau_connector_create()
1286 if (drm_conntype_from_dcb(nv_connector->type) == in nouveau_connector_create()
1289 nv_connector->type); in nouveau_connector_create()
1290 nv_connector->type = DCB_CONNECTOR_NONE; in nouveau_connector_create()
1295 if (nv_connector->type == DCB_CONNECTOR_HDMI_1) in nouveau_connector_create()
1296 nv_connector->type = DCB_CONNECTOR_DVI_I; in nouveau_connector_create()
1299 /* Gigabyte GV-NX86T512H */ in nouveau_connector_create()
1301 if (nv_connector->type == DCB_CONNECTOR_HDMI_1) in nouveau_connector_create()
1302 nv_connector->type = DCB_CONNECTOR_DVI_I; in nouveau_connector_create()
1305 nv_connector->type = DCB_CONNECTOR_NONE; in nouveau_connector_create()
1308 /* no vbios data, or an unknown dcb connector type - attempt to in nouveau_connector_create()
1311 if (nv_connector->type == DCB_CONNECTOR_NONE) { in nouveau_connector_create()
1313 struct dcb_table *dcbt = &drm->vbios.dcb; in nouveau_connector_create()
1317 for (i = 0; i < dcbt->entries; i++) { in nouveau_connector_create()
1318 if (dcbt->entry[i].connector == nv_connector->index) in nouveau_connector_create()
1319 encoders |= (1 << dcbt->entry[i].type); in nouveau_connector_create()
1324 nv_connector->type = DCB_CONNECTOR_DP; in nouveau_connector_create()
1326 nv_connector->type = DCB_CONNECTOR_eDP; in nouveau_connector_create()
1330 nv_connector->type = DCB_CONNECTOR_DVI_I; in nouveau_connector_create()
1332 nv_connector->type = DCB_CONNECTOR_DVI_D; in nouveau_connector_create()
1335 nv_connector->type = DCB_CONNECTOR_VGA; in nouveau_connector_create()
1338 nv_connector->type = DCB_CONNECTOR_LVDS; in nouveau_connector_create()
1341 nv_connector->type = DCB_CONNECTOR_TV_0; in nouveau_connector_create()
1345 switch ((type = drm_conntype_from_dcb(nv_connector->type))) { in nouveau_connector_create()
1358 nv_connector->aux.dev = connector->kdev; in nouveau_connector_create()
1359 nv_connector->aux.drm_dev = dev; in nouveau_connector_create()
1360 nv_connector->aux.transfer = nouveau_connector_aux_xfer; in nouveau_connector_create()
1361 snprintf(aux_name, sizeof(aux_name), "sor-%04x-%04x", in nouveau_connector_create()
1362 dcbe->hasht, dcbe->hashm); in nouveau_connector_create()
1363 nv_connector->aux.name = kstrdup(aux_name, GFP_KERNEL); in nouveau_connector_create()
1364 drm_dp_aux_init(&nv_connector->aux); in nouveau_connector_create()
1366 NV_ERROR(drm, "Failed to init AUX adapter for sor-%04x-%04x: %d\n", in nouveau_connector_create()
1367 dcbe->hasht, dcbe->hashm, ret); in nouveau_connector_create()
1378 if ((disp->disp.object.oclass >= G82_DISP) in nouveau_connector_create()
1382 connector->stereo_allowed = true; in nouveau_connector_create()
1385 connector->interlace_allowed = false; in nouveau_connector_create()
1386 connector->doublescan_allowed = false; in nouveau_connector_create()
1391 connector->funcs->reset(connector); in nouveau_connector_create()
1394 /* Default scaling mode */ in nouveau_connector_create()
1395 switch (nv_connector->type) { in nouveau_connector_create()
1400 if (disp->disp.object.oclass < NV50_DISP) { in nouveau_connector_create()
1401 nv_connector->scaling_mode = DRM_MODE_SCALE_FULLSCREEN; in nouveau_connector_create()
1404 nv_connector->scaling_mode = DRM_MODE_SCALE_NONE; in nouveau_connector_create()
1407 nv_connector->scaling_mode = DRM_MODE_SCALE_NONE; in nouveau_connector_create()
1412 switch (nv_connector->type) { in nouveau_connector_create()
1419 nv_connector->dithering_mode = DITHERING_MODE_AUTO; in nouveau_connector_create()
1426 drm_dp_cec_register_connector(&nv_connector->aux, connector); in nouveau_connector_create()
1430 ret = nvif_notify_ctor(&disp->disp.object, "kmsHotplug", in nouveau_connector_create()
1439 &nv_connector->hpd); in nouveau_connector_create()
1441 connector->polled = DRM_CONNECTOR_POLL_CONNECT; in nouveau_connector_create()
1443 connector->polled = DRM_CONNECTOR_POLL_HPD; in nouveau_connector_create()