Lines Matching full:connector

56  * track of a per-connector hpd interrupt.
90 struct drm_connector *connector, in drm_mode_validate_pipeline() argument
94 struct drm_device *dev = connector->dev; in drm_mode_validate_pipeline()
98 /* Step 1: Validate against connector */ in drm_mode_validate_pipeline()
99 ret = drm_connector_mode_valid(connector, mode, ctx, status); in drm_mode_validate_pipeline()
104 drm_connector_for_each_possible_encoder(connector, encoder) { in drm_mode_validate_pipeline()
119 &connector->display_info, in drm_mode_validate_pipeline()
144 static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector) in drm_helper_probe_add_cmdline_mode() argument
149 cmdline_mode = &connector->cmdline_mode; in drm_helper_probe_add_cmdline_mode()
154 list_for_each_entry(mode, &connector->probed_modes, head) { in drm_helper_probe_add_cmdline_mode()
170 mode = drm_mode_create_from_cmdline_mode(connector->dev, in drm_helper_probe_add_cmdline_mode()
175 drm_mode_probed_add(connector, mode); in drm_helper_probe_add_cmdline_mode()
203 drm_connector_mode_valid(struct drm_connector *connector, in drm_connector_mode_valid() argument
209 connector->helper_private; in drm_connector_mode_valid()
215 ret = connector_funcs->mode_valid_ctx(connector, mode, ctx, in drm_connector_mode_valid()
218 *status = connector_funcs->mode_valid(connector, mode); in drm_connector_mode_valid()
227 struct drm_connector *connector; in drm_kms_helper_disable_hpd() local
231 drm_for_each_connector_iter(connector, &conn_iter) { in drm_kms_helper_disable_hpd()
233 connector->helper_private; in drm_kms_helper_disable_hpd()
236 funcs->disable_hpd(connector); in drm_kms_helper_disable_hpd()
244 struct drm_connector *connector; in drm_kms_helper_enable_hpd() local
248 drm_for_each_connector_iter(connector, &conn_iter) { in drm_kms_helper_enable_hpd()
250 connector->helper_private; in drm_kms_helper_enable_hpd()
253 funcs->enable_hpd(connector); in drm_kms_helper_enable_hpd()
255 if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | in drm_kms_helper_enable_hpd()
319 * connector has been enabled.
321 * Drivers must call this helper after enabling polling for a connector by
324 * flags for a connector will stop the output polling work automatically if
338 drm_helper_probe_detect_ctx(struct drm_connector *connector, bool force) in drm_helper_probe_detect_ctx() argument
340 const struct drm_connector_helper_funcs *funcs = connector->helper_private; in drm_helper_probe_detect_ctx()
347 ret = drm_modeset_lock(&connector->dev->mode_config.connection_mutex, &ctx); in drm_helper_probe_detect_ctx()
350 ret = funcs->detect_ctx(connector, &ctx, force); in drm_helper_probe_detect_ctx()
351 else if (connector->funcs->detect) in drm_helper_probe_detect_ctx()
352 ret = connector->funcs->detect(connector, force); in drm_helper_probe_detect_ctx()
365 if (ret != connector->status) in drm_helper_probe_detect_ctx()
366 connector->epoch_counter += 1; in drm_helper_probe_detect_ctx()
375 * drm_helper_probe_detect - probe connector status
376 * @connector: connector to probe
380 * This function calls the detect callbacks of the connector.
385 drm_helper_probe_detect(struct drm_connector *connector, in drm_helper_probe_detect() argument
389 const struct drm_connector_helper_funcs *funcs = connector->helper_private; in drm_helper_probe_detect()
390 struct drm_device *dev = connector->dev; in drm_helper_probe_detect()
394 return drm_helper_probe_detect_ctx(connector, force); in drm_helper_probe_detect()
401 ret = funcs->detect_ctx(connector, ctx, force); in drm_helper_probe_detect()
402 else if (connector->funcs->detect) in drm_helper_probe_detect()
403 ret = connector->funcs->detect(connector, force); in drm_helper_probe_detect()
407 if (ret != connector->status) in drm_helper_probe_detect()
408 connector->epoch_counter += 1; in drm_helper_probe_detect()
414 static int drm_helper_probe_get_modes(struct drm_connector *connector) in drm_helper_probe_get_modes() argument
417 connector->helper_private; in drm_helper_probe_get_modes()
420 count = connector_funcs->get_modes(connector); in drm_helper_probe_get_modes()
426 if (count == 0 && connector->status == connector_status_connected) in drm_helper_probe_get_modes()
427 count = drm_edid_override_connector_update(connector); in drm_helper_probe_get_modes()
432 static int __drm_helper_update_and_validate(struct drm_connector *connector, in __drm_helper_update_and_validate() argument
436 struct drm_device *dev = connector->dev; in __drm_helper_update_and_validate()
441 drm_connector_list_update(connector); in __drm_helper_update_and_validate()
443 if (connector->interlace_allowed) in __drm_helper_update_and_validate()
445 if (connector->doublescan_allowed) in __drm_helper_update_and_validate()
447 if (connector->stereo_allowed) in __drm_helper_update_and_validate()
450 list_for_each_entry(mode, &connector->modes, head) { in __drm_helper_update_and_validate()
466 ret = drm_mode_validate_pipeline(mode, connector, ctx, in __drm_helper_update_and_validate()
481 mode->status = drm_mode_validate_ycbcr420(mode, connector); in __drm_helper_update_and_validate()
489 * @connector: connector to probe
493 * Based on the helper callbacks implemented by @connector in struct
495 * be added to the connector's probed_modes list, then culled (based on validity
504 * 1. All modes currently on the connector's modes list are marked as stale
506 * 2. New modes are added to the connector's probed_modes list with
511 * - if the connector status is connector_status_connected, standard
529 * - drm_mode_validate_flag() checks the modes against basic connector
539 * 5. Any mode whose status is not OK is pruned from the connector's modes list,
544 * The number of modes found on @connector.
546 int drm_helper_probe_single_connector_modes(struct drm_connector *connector, in drm_helper_probe_single_connector_modes() argument
549 struct drm_device *dev = connector->dev; in drm_helper_probe_single_connector_modes()
559 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id, in drm_helper_probe_single_connector_modes()
560 connector->name); in drm_helper_probe_single_connector_modes()
571 list_for_each_entry(mode, &connector->modes, head) in drm_helper_probe_single_connector_modes()
574 old_status = connector->status; in drm_helper_probe_single_connector_modes()
576 if (connector->force) { in drm_helper_probe_single_connector_modes()
577 if (connector->force == DRM_FORCE_ON || in drm_helper_probe_single_connector_modes()
578 connector->force == DRM_FORCE_ON_DIGITAL) in drm_helper_probe_single_connector_modes()
579 connector->status = connector_status_connected; in drm_helper_probe_single_connector_modes()
581 connector->status = connector_status_disconnected; in drm_helper_probe_single_connector_modes()
582 if (connector->funcs->force) in drm_helper_probe_single_connector_modes()
583 connector->funcs->force(connector); in drm_helper_probe_single_connector_modes()
585 ret = drm_helper_probe_detect(connector, &ctx, true); in drm_helper_probe_single_connector_modes()
590 } else if (WARN(ret < 0, "Invalid return value %i for connector detection\n", ret)) in drm_helper_probe_single_connector_modes()
593 connector->status = ret; in drm_helper_probe_single_connector_modes()
602 if (old_status != connector->status) { in drm_helper_probe_single_connector_modes()
603 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n", in drm_helper_probe_single_connector_modes()
604 connector->base.id, in drm_helper_probe_single_connector_modes()
605 connector->name, in drm_helper_probe_single_connector_modes()
607 drm_get_connector_status_name(connector->status)); in drm_helper_probe_single_connector_modes()
625 if (connector->status == connector_status_disconnected) { in drm_helper_probe_single_connector_modes()
626 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] disconnected\n", in drm_helper_probe_single_connector_modes()
627 connector->base.id, connector->name); in drm_helper_probe_single_connector_modes()
628 drm_connector_update_edid_property(connector, NULL); in drm_helper_probe_single_connector_modes()
629 drm_mode_prune_invalid(dev, &connector->modes, false); in drm_helper_probe_single_connector_modes()
633 count = drm_helper_probe_get_modes(connector); in drm_helper_probe_single_connector_modes()
635 if (count == 0 && (connector->status == connector_status_connected || in drm_helper_probe_single_connector_modes()
636 connector->status == connector_status_unknown)) { in drm_helper_probe_single_connector_modes()
637 count = drm_add_modes_noedid(connector, 1024, 768); in drm_helper_probe_single_connector_modes()
644 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) in drm_helper_probe_single_connector_modes()
645 drm_set_preferred_mode(connector, 640, 480); in drm_helper_probe_single_connector_modes()
647 count += drm_helper_probe_add_cmdline_mode(connector); in drm_helper_probe_single_connector_modes()
649 ret = __drm_helper_update_and_validate(connector, maxX, maxY, &ctx); in drm_helper_probe_single_connector_modes()
656 drm_mode_prune_invalid(dev, &connector->modes, true); in drm_helper_probe_single_connector_modes()
665 if (list_empty(&connector->modes) && in drm_helper_probe_single_connector_modes()
666 connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { in drm_helper_probe_single_connector_modes()
667 count = drm_add_modes_noedid(connector, 640, 480); in drm_helper_probe_single_connector_modes()
668 ret = __drm_helper_update_and_validate(connector, maxX, maxY, &ctx); in drm_helper_probe_single_connector_modes()
673 drm_mode_prune_invalid(dev, &connector->modes, true); in drm_helper_probe_single_connector_modes()
680 if (list_empty(&connector->modes)) in drm_helper_probe_single_connector_modes()
683 drm_mode_sort(&connector->modes); in drm_helper_probe_single_connector_modes()
685 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] probed modes :\n", connector->base.id, in drm_helper_probe_single_connector_modes()
686 connector->name); in drm_helper_probe_single_connector_modes()
687 list_for_each_entry(mode, &connector->modes, head) { in drm_helper_probe_single_connector_modes()
698 * @dev: drm_device whose connector state changed
712 * If only a single connector has changed, consider calling
727 * drm_kms_helper_connector_hotplug_event - fire off a KMS connector hotplug event
728 * @connector: drm_connector which has changed
731 * fine-grained uevent for a single connector.
733 void drm_kms_helper_connector_hotplug_event(struct drm_connector *connector) in drm_kms_helper_connector_hotplug_event() argument
735 struct drm_device *dev = connector->dev; in drm_kms_helper_connector_hotplug_event()
738 drm_sysfs_connector_hotplug_event(connector); in drm_kms_helper_connector_hotplug_event()
750 struct drm_connector *connector; in output_poll_execute() local
777 drm_for_each_connector_iter(connector, &conn_iter) { in output_poll_execute()
779 if (connector->force) in output_poll_execute()
784 if (!connector->polled || connector->polled == DRM_CONNECTOR_POLL_HPD) in output_poll_execute()
787 old_status = connector->status; in output_poll_execute()
791 !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT)) in output_poll_execute()
796 old_epoch_counter = connector->epoch_counter; in output_poll_execute()
797 connector->status = drm_helper_probe_detect(connector, NULL, false); in output_poll_execute()
798 if (old_epoch_counter != connector->epoch_counter) { in output_poll_execute()
814 if (connector->status == connector_status_unknown) { in output_poll_execute()
815 connector->status = old_status; in output_poll_execute()
820 new = drm_get_connector_status_name(connector->status); in output_poll_execute()
822 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] " in output_poll_execute()
824 connector->base.id, in output_poll_execute()
825 connector->name, in output_poll_execute()
827 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] epoch counter %llu -> %llu\n", in output_poll_execute()
828 connector->base.id, connector->name, in output_poll_execute()
829 old_epoch_counter, connector->epoch_counter); in output_poll_execute()
856 * connector ->detect hook.
907 * Note that a connector can be both polled and probed from the hotplug handler,
934 static bool check_connector_changed(struct drm_connector *connector) in check_connector_changed() argument
936 struct drm_device *dev = connector->dev; in check_connector_changed()
941 drm_WARN_ON(dev, !(connector->polled & DRM_CONNECTOR_POLL_HPD)); in check_connector_changed()
945 old_status = connector->status; in check_connector_changed()
946 old_epoch_counter = connector->epoch_counter; in check_connector_changed()
947 connector->status = drm_helper_probe_detect(connector, NULL, false); in check_connector_changed()
949 if (old_epoch_counter == connector->epoch_counter) { in check_connector_changed()
950 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Same epoch counter %llu\n", in check_connector_changed()
951 connector->base.id, in check_connector_changed()
952 connector->name, in check_connector_changed()
953 connector->epoch_counter); in check_connector_changed()
958 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] status updated from %s to %s\n", in check_connector_changed()
959 connector->base.id, in check_connector_changed()
960 connector->name, in check_connector_changed()
962 drm_get_connector_status_name(connector->status)); in check_connector_changed()
964 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Changed epoch counter %llu => %llu\n", in check_connector_changed()
965 connector->base.id, in check_connector_changed()
966 connector->name, in check_connector_changed()
968 connector->epoch_counter); in check_connector_changed()
975 * @connector: drm_connector
977 * Drivers can use this helper function to run a detect cycle on a connector
981 * interrupts for a single connector. Drivers that want to send a
983 * per connector need to use drm_helper_hpd_irq_event().
988 * Note that a connector can be both polled and probed from the hotplug
992 * A boolean indicating whether the connector status changed or not
994 bool drm_connector_helper_hpd_irq_event(struct drm_connector *connector) in drm_connector_helper_hpd_irq_event() argument
996 struct drm_device *dev = connector->dev; in drm_connector_helper_hpd_irq_event()
1000 changed = check_connector_changed(connector); in drm_connector_helper_hpd_irq_event()
1004 drm_kms_helper_connector_hotplug_event(connector); in drm_connector_helper_hpd_irq_event()
1005 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Sent hotplug event\n", in drm_connector_helper_hpd_irq_event()
1006 connector->base.id, in drm_connector_helper_hpd_irq_event()
1007 connector->name); in drm_connector_helper_hpd_irq_event()
1024 * interrupts for each connector.
1026 * Drivers which support hotplug interrupts for each connector individually and
1029 * code and directly call drm_kms_helper_hotplug_event() in case the connector
1035 * Note that a connector can be both polled and probed from the hotplug handler,
1039 * A boolean indicating whether the connector status changed or not
1043 struct drm_connector *connector, *first_changed_connector = NULL; in drm_helper_hpd_irq_event() local
1052 drm_for_each_connector_iter(connector, &conn_iter) { in drm_helper_hpd_irq_event()
1054 if (!(connector->polled & DRM_CONNECTOR_POLL_HPD)) in drm_helper_hpd_irq_event()
1057 if (check_connector_changed(connector)) { in drm_helper_hpd_irq_event()
1059 drm_connector_get(connector); in drm_helper_hpd_irq_event()
1060 first_changed_connector = connector; in drm_helper_hpd_irq_event()
1106 * drm_connector_helper_get_modes_from_ddc - Updates the connector's EDID
1107 * property from the connector's
1109 * @connector: The connector
1114 * Uses a connector's DDC channel to retrieve EDID data and update the
1115 * connector's EDID property and display modes. Drivers can use this
1119 int drm_connector_helper_get_modes_from_ddc(struct drm_connector *connector) in drm_connector_helper_get_modes_from_ddc() argument
1124 if (!connector->ddc) in drm_connector_helper_get_modes_from_ddc()
1127 edid = drm_get_edid(connector, connector->ddc); in drm_connector_helper_get_modes_from_ddc()
1130 drm_connector_update_edid_property(connector, edid); in drm_connector_helper_get_modes_from_ddc()
1133 count = drm_add_edid_modes(connector, edid); in drm_connector_helper_get_modes_from_ddc()
1142 * drm_connector_helper_get_modes_fixed - Duplicates a display mode for a connector
1143 * @connector: the connector
1146 * This function duplicates a display modes for a connector. Drivers for hardware
1147 * that only supports a single fixed mode can use this function in their connector's
1153 int drm_connector_helper_get_modes_fixed(struct drm_connector *connector, in drm_connector_helper_get_modes_fixed() argument
1156 struct drm_device *dev = connector->dev; in drm_connector_helper_get_modes_fixed()
1170 drm_mode_probed_add(connector, mode); in drm_connector_helper_get_modes_fixed()
1173 connector->display_info.width_mm = mode->width_mm; in drm_connector_helper_get_modes_fixed()
1175 connector->display_info.height_mm = mode->height_mm; in drm_connector_helper_get_modes_fixed()
1182 * drm_connector_helper_get_modes - Read EDID and update connector.
1183 * @connector: The connector
1185 * Read the EDID using drm_edid_read() (which requires that connector->ddc is
1186 * set), and update the connector using the EDID.
1188 * This can be used as the "default" connector helper .get_modes() hook if the
1190 * custom .get_modes() hooks should do regarding EDID read and connector update.
1194 int drm_connector_helper_get_modes(struct drm_connector *connector) in drm_connector_helper_get_modes() argument
1199 drm_edid = drm_edid_read(connector); in drm_connector_helper_get_modes()
1202 * Unconditionally update the connector. If the EDID was read in drm_connector_helper_get_modes()
1203 * successfully, fill in the connector information derived from the in drm_connector_helper_get_modes()
1204 * EDID. Otherwise, if the EDID is NULL, clear the connector in drm_connector_helper_get_modes()
1207 drm_edid_connector_update(connector, drm_edid); in drm_connector_helper_get_modes()
1209 count = drm_edid_connector_add_modes(connector); in drm_connector_helper_get_modes()
1218 * drm_connector_helper_tv_get_modes - Fills the modes availables to a TV connector
1219 * @connector: The connector
1221 * Fills the available modes for a TV connector based on the supported
1224 * This can be used as the default TV connector helper .get_modes() hook
1228 * The number of modes added to the connector.
1230 int drm_connector_helper_tv_get_modes(struct drm_connector *connector) in drm_connector_helper_tv_get_modes() argument
1232 struct drm_device *dev = connector->dev; in drm_connector_helper_tv_get_modes()
1235 struct drm_cmdline_mode *cmdline = &connector->cmdline_mode; in drm_connector_helper_tv_get_modes()
1256 if (drm_object_property_get_default_value(&connector->base, in drm_connector_helper_tv_get_modes()
1292 drm_mode_probed_add(connector, mode); in drm_connector_helper_tv_get_modes()