Lines Matching +full:poll +full:- +full:retry +full:- +full:count

2  * Copyright (c) 2006-2008 Intel Corporation
57 * track of a per-connector hpd interrupt.
68 module_param_named(poll, drm_kms_helper_poll, bool, 0600);
74 if ((mode->flags & DRM_MODE_FLAG_INTERLACE) && in drm_mode_validate_flag()
78 if ((mode->flags & DRM_MODE_FLAG_DBLSCAN) && in drm_mode_validate_flag()
82 if ((mode->flags & DRM_MODE_FLAG_3D_MASK) && in drm_mode_validate_flag()
95 struct drm_device *dev = connector->dev; in drm_mode_validate_pipeline()
120 &connector->display_info, in drm_mode_validate_pipeline()
150 cmdline_mode = &connector->cmdline_mode; in drm_helper_probe_add_cmdline_mode()
151 if (!cmdline_mode->specified) in drm_helper_probe_add_cmdline_mode()
155 list_for_each_entry(mode, &connector->probed_modes, head) { in drm_helper_probe_add_cmdline_mode()
156 if (mode->hdisplay != cmdline_mode->xres || in drm_helper_probe_add_cmdline_mode()
157 mode->vdisplay != cmdline_mode->yres) in drm_helper_probe_add_cmdline_mode()
160 if (cmdline_mode->refresh_specified) { in drm_helper_probe_add_cmdline_mode()
162 if (drm_mode_vrefresh(mode) != cmdline_mode->refresh) in drm_helper_probe_add_cmdline_mode()
167 mode->type |= DRM_MODE_TYPE_USERDEF; in drm_helper_probe_add_cmdline_mode()
171 mode = drm_mode_create_from_cmdline_mode(connector->dev, in drm_helper_probe_add_cmdline_mode()
183 const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; in drm_crtc_mode_valid()
185 if (!crtc_funcs || !crtc_funcs->mode_valid) in drm_crtc_mode_valid()
188 return crtc_funcs->mode_valid(crtc, mode); in drm_crtc_mode_valid()
195 encoder->helper_private; in drm_encoder_mode_valid()
197 if (!encoder_funcs || !encoder_funcs->mode_valid) in drm_encoder_mode_valid()
200 return encoder_funcs->mode_valid(encoder, mode); in drm_encoder_mode_valid()
210 connector->helper_private; in drm_connector_mode_valid()
215 else if (connector_funcs->mode_valid_ctx) in drm_connector_mode_valid()
216 ret = connector_funcs->mode_valid_ctx(connector, mode, ctx, in drm_connector_mode_valid()
218 else if (connector_funcs->mode_valid) in drm_connector_mode_valid()
219 *status = connector_funcs->mode_valid(connector, mode); in drm_connector_mode_valid()
234 connector->helper_private; in drm_kms_helper_disable_hpd()
236 if (funcs && funcs->disable_hpd) in drm_kms_helper_disable_hpd()
237 funcs->disable_hpd(connector); in drm_kms_helper_disable_hpd()
244 bool poll = false; in drm_kms_helper_enable_hpd() local
251 connector->helper_private; in drm_kms_helper_enable_hpd()
253 if (funcs && funcs->enable_hpd) in drm_kms_helper_enable_hpd()
254 funcs->enable_hpd(connector); in drm_kms_helper_enable_hpd()
256 if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | in drm_kms_helper_enable_hpd()
258 poll = true; in drm_kms_helper_enable_hpd()
262 return poll; in drm_kms_helper_enable_hpd()
270 if (dev->mode_config.delayed_event) in reschedule_output_poll_work()
278 * drm_helper_probe_single_connector_modes() in case the poll in reschedule_output_poll_work()
283 schedule_delayed_work(&dev->mode_config.output_poll_work, delay); in reschedule_output_poll_work()
287 * drm_kms_helper_poll_enable - re-enable output polling.
290 * This function re-enables the output polling work, after it has been
306 if (drm_WARN_ON_ONCE(dev, !dev->mode_config.poll_enabled) || in drm_kms_helper_poll_enable()
307 !drm_kms_helper_poll || dev->mode_config.poll_running) in drm_kms_helper_poll_enable()
311 dev->mode_config.delayed_event) in drm_kms_helper_poll_enable()
314 dev->mode_config.poll_running = true; in drm_kms_helper_poll_enable()
319 * drm_kms_helper_poll_reschedule - reschedule the output polling work
336 if (dev->mode_config.poll_running) in drm_kms_helper_poll_reschedule()
345 const struct drm_connector_helper_funcs *funcs = connector->helper_private; in detect_connector_status()
347 if (funcs->detect_ctx) in detect_connector_status()
348 return funcs->detect_ctx(connector, ctx, force); in detect_connector_status()
349 else if (connector->funcs->detect) in detect_connector_status()
350 return connector->funcs->detect(connector, force); in detect_connector_status()
363 retry: in drm_helper_probe_detect_ctx()
364 ret = drm_modeset_lock(&connector->dev->mode_config.connection_mutex, &ctx); in drm_helper_probe_detect_ctx()
368 if (ret == -EDEADLK) { in drm_helper_probe_detect_ctx()
370 goto retry; in drm_helper_probe_detect_ctx()
376 if (ret != connector->status) in drm_helper_probe_detect_ctx()
377 connector->epoch_counter += 1; in drm_helper_probe_detect_ctx()
386 * drm_helper_probe_detect - probe connector status
393 * if @ctx is set, it might also return -EDEADLK.
400 struct drm_device *dev = connector->dev; in drm_helper_probe_detect()
406 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, ctx); in drm_helper_probe_detect()
412 if (ret != connector->status) in drm_helper_probe_detect()
413 connector->epoch_counter += 1; in drm_helper_probe_detect()
422 connector->helper_private; in drm_helper_probe_get_modes()
423 int count; in drm_helper_probe_get_modes() local
425 count = connector_funcs->get_modes(connector); in drm_helper_probe_get_modes()
428 if (count < 0) { in drm_helper_probe_get_modes()
429 drm_err(connector->dev, ".get_modes() returned %pe\n", in drm_helper_probe_get_modes()
430 ERR_PTR(count)); in drm_helper_probe_get_modes()
431 count = 0; in drm_helper_probe_get_modes()
438 if (count == 0 && connector->status == connector_status_connected) in drm_helper_probe_get_modes()
439 count = drm_edid_override_connector_update(connector); in drm_helper_probe_get_modes()
441 return count; in drm_helper_probe_get_modes()
448 struct drm_device *dev = connector->dev; in __drm_helper_update_and_validate()
455 if (connector->interlace_allowed) in __drm_helper_update_and_validate()
457 if (connector->doublescan_allowed) in __drm_helper_update_and_validate()
459 if (connector->stereo_allowed) in __drm_helper_update_and_validate()
462 list_for_each_entry(mode, &connector->modes, head) { in __drm_helper_update_and_validate()
463 if (mode->status != MODE_OK) in __drm_helper_update_and_validate()
466 mode->status = drm_mode_validate_driver(dev, mode); in __drm_helper_update_and_validate()
467 if (mode->status != MODE_OK) in __drm_helper_update_and_validate()
470 mode->status = drm_mode_validate_size(mode, maxX, maxY); in __drm_helper_update_and_validate()
471 if (mode->status != MODE_OK) in __drm_helper_update_and_validate()
474 mode->status = drm_mode_validate_flag(mode, mode_flags); in __drm_helper_update_and_validate()
475 if (mode->status != MODE_OK) in __drm_helper_update_and_validate()
478 mode->status = drm_mode_validate_ycbcr420(mode, connector); in __drm_helper_update_and_validate()
479 if (mode->status != MODE_OK) in __drm_helper_update_and_validate()
483 &mode->status); in __drm_helper_update_and_validate()
489 if (drm_WARN_ON_ONCE(dev, ret != -EDEADLK)) in __drm_helper_update_and_validate()
490 mode->status = MODE_ERROR; in __drm_helper_update_and_validate()
492 return -EDEADLK; in __drm_helper_update_and_validate()
500 * drm_helper_probe_single_connector_modes - get complete set of display modes
522 * - &drm_connector_helper_funcs.get_modes vfunc
523 * - if the connector status is connector_status_connected, standard
536 * 4. Any non-stale mode on the modes list then undergoes validation
538 * - drm_mode_validate_basic() performs basic sanity checks
539 * - drm_mode_validate_size() filters out modes larger than @maxX and @maxY
541 * - drm_mode_validate_flag() checks the modes against basic connector
543 * - the optional &drm_connector_helper_funcs.mode_valid or
546 * - the optional &drm_crtc_helper_funcs.mode_valid,
561 struct drm_device *dev = connector->dev; in drm_helper_probe_single_connector_modes()
563 int count = 0, ret; in drm_helper_probe_single_connector_modes() local
567 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); in drm_helper_probe_single_connector_modes()
571 drm_dbg_kms(dev, "[CONNECTOR:%d:%s]\n", connector->base.id, in drm_helper_probe_single_connector_modes()
572 connector->name); in drm_helper_probe_single_connector_modes()
574 retry: in drm_helper_probe_single_connector_modes()
575 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, &ctx); in drm_helper_probe_single_connector_modes()
576 if (ret == -EDEADLK) { in drm_helper_probe_single_connector_modes()
578 goto retry; in drm_helper_probe_single_connector_modes()
583 list_for_each_entry(mode, &connector->modes, head) in drm_helper_probe_single_connector_modes()
584 mode->status = MODE_STALE; in drm_helper_probe_single_connector_modes()
586 old_status = connector->status; in drm_helper_probe_single_connector_modes()
588 if (connector->force) { in drm_helper_probe_single_connector_modes()
589 if (connector->force == DRM_FORCE_ON || in drm_helper_probe_single_connector_modes()
590 connector->force == DRM_FORCE_ON_DIGITAL) in drm_helper_probe_single_connector_modes()
591 connector->status = connector_status_connected; in drm_helper_probe_single_connector_modes()
593 connector->status = connector_status_disconnected; in drm_helper_probe_single_connector_modes()
594 if (connector->funcs->force) in drm_helper_probe_single_connector_modes()
595 connector->funcs->force(connector); in drm_helper_probe_single_connector_modes()
599 if (ret == -EDEADLK) { in drm_helper_probe_single_connector_modes()
601 goto retry; in drm_helper_probe_single_connector_modes()
605 connector->status = ret; in drm_helper_probe_single_connector_modes()
609 * Normally either the driver's hpd code or the poll loop should in drm_helper_probe_single_connector_modes()
614 if (old_status != connector->status) { in drm_helper_probe_single_connector_modes()
616 connector->base.id, connector->name, in drm_helper_probe_single_connector_modes()
618 drm_get_connector_status_name(connector->status)); in drm_helper_probe_single_connector_modes()
623 * locks. Fire up the poll struct instead, it will in drm_helper_probe_single_connector_modes()
626 dev->mode_config.delayed_event = true; in drm_helper_probe_single_connector_modes()
627 if (dev->mode_config.poll_enabled) in drm_helper_probe_single_connector_modes()
629 &dev->mode_config.output_poll_work, in drm_helper_probe_single_connector_modes()
634 * Re-enable polling in case the global poll config changed but polling in drm_helper_probe_single_connector_modes()
637 if (dev->mode_config.poll_enabled) in drm_helper_probe_single_connector_modes()
640 if (connector->status == connector_status_disconnected) { in drm_helper_probe_single_connector_modes()
642 connector->base.id, connector->name); in drm_helper_probe_single_connector_modes()
644 drm_mode_prune_invalid(dev, &connector->modes, false); in drm_helper_probe_single_connector_modes()
648 count = drm_helper_probe_get_modes(connector); in drm_helper_probe_single_connector_modes()
650 if (count == 0 && (connector->status == connector_status_connected || in drm_helper_probe_single_connector_modes()
651 connector->status == connector_status_unknown)) { in drm_helper_probe_single_connector_modes()
652 count = drm_add_modes_noedid(connector, 1024, 768); in drm_helper_probe_single_connector_modes()
659 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) in drm_helper_probe_single_connector_modes()
662 count += drm_helper_probe_add_cmdline_mode(connector); in drm_helper_probe_single_connector_modes()
663 if (count != 0) { in drm_helper_probe_single_connector_modes()
665 if (ret == -EDEADLK) { in drm_helper_probe_single_connector_modes()
667 goto retry; in drm_helper_probe_single_connector_modes()
671 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()
681 connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { in drm_helper_probe_single_connector_modes()
682 count = drm_add_modes_noedid(connector, 640, 480); in drm_helper_probe_single_connector_modes()
684 if (ret == -EDEADLK) { in drm_helper_probe_single_connector_modes()
686 goto retry; in drm_helper_probe_single_connector_modes()
688 drm_mode_prune_invalid(dev, &connector->modes, true); in drm_helper_probe_single_connector_modes()
695 if (list_empty(&connector->modes)) in drm_helper_probe_single_connector_modes()
698 drm_mode_sort(&connector->modes); in drm_helper_probe_single_connector_modes()
701 connector->base.id, connector->name); in drm_helper_probe_single_connector_modes()
703 list_for_each_entry(mode, &connector->modes, head) { in drm_helper_probe_single_connector_modes()
709 return count; in drm_helper_probe_single_connector_modes()
714 * drm_kms_helper_hotplug_event - fire off KMS hotplug events
723 * own, like drm_helper_hpd_irq_event() does - this is assumed to be done by the
740 * drm_kms_helper_connector_hotplug_event - fire off a KMS connector hotplug event
744 * fine-grained uevent for a single connector.
748 struct drm_device *dev = connector->dev; in drm_kms_helper_connector_hotplug_event()
765 if (!dev->mode_config.poll_enabled) in output_poll_execute()
769 changed = dev->mode_config.delayed_event; in output_poll_execute()
770 dev->mode_config.delayed_event = false; in output_poll_execute()
773 if (dev->mode_config.poll_running) { in output_poll_execute()
775 dev->mode_config.poll_running = false; in output_poll_execute()
780 if (!mutex_trylock(&dev->mode_config.mutex)) { in output_poll_execute()
788 if (connector->force) in output_poll_execute()
793 if (!connector->polled || connector->polled == DRM_CONNECTOR_POLL_HPD) in output_poll_execute()
796 old_status = connector->status; in output_poll_execute()
797 /* if we are connected and don't want to poll for disconnect in output_poll_execute()
800 !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT)) in output_poll_execute()
805 old_epoch_counter = connector->epoch_counter; in output_poll_execute()
806 connector->status = drm_helper_probe_detect(connector, NULL, false); in output_poll_execute()
807 if (old_epoch_counter != connector->epoch_counter) { in output_poll_execute()
811 * The poll work sets force=false when calling detect so in output_poll_execute()
815 * flip-flop between unknown here in the poll work and in output_poll_execute()
823 if (connector->status == connector_status_unknown) { in output_poll_execute()
824 connector->status = old_status; in output_poll_execute()
829 new = drm_get_connector_status_name(connector->status); in output_poll_execute()
832 connector->base.id, connector->name, in output_poll_execute()
834 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] epoch counter %llu -> %llu\n", in output_poll_execute()
835 connector->base.id, connector->name, in output_poll_execute()
836 old_epoch_counter, connector->epoch_counter); in output_poll_execute()
843 mutex_unlock(&dev->mode_config.mutex); in output_poll_execute()
854 * drm_kms_helper_is_poll_worker - is %current task an output poll worker?
856 * Determine if %current task is an output poll worker. This can be used
859 * One use case is to avoid a deadlock between the output poll worker and
863 * connector ->detect hook.
869 return work && work->func == output_poll_execute; in drm_kms_helper_is_poll_worker()
874 * drm_kms_helper_poll_disable - disable output polling
881 * disabled. Polling is re-enabled by calling drm_kms_helper_poll_enable().
892 if (drm_WARN_ON(dev, !dev->mode_config.poll_enabled)) in drm_kms_helper_poll_disable()
895 if (dev->mode_config.poll_running) in drm_kms_helper_poll_disable()
898 cancel_delayed_work_sync(&dev->mode_config.output_poll_work); in drm_kms_helper_poll_disable()
900 dev->mode_config.poll_running = false; in drm_kms_helper_poll_disable()
905 * drm_kms_helper_poll_init - initialize and enable output polling
910 * this helper infrastructure to regularly poll such connectors for changes in
925 INIT_DELAYED_WORK(&dev->mode_config.output_poll_work, output_poll_execute); in drm_kms_helper_poll_init()
926 dev->mode_config.poll_enabled = true; in drm_kms_helper_poll_init()
933 * drm_kms_helper_poll_fini - disable output polling and clean it up
938 if (!dev->mode_config.poll_enabled) in drm_kms_helper_poll_fini()
943 dev->mode_config.poll_enabled = false; in drm_kms_helper_poll_fini()
953 * drmm_kms_helper_poll_init - initialize and enable output polling
975 struct drm_device *dev = connector->dev; in check_connector_changed()
980 drm_WARN_ON(dev, !(connector->polled & DRM_CONNECTOR_POLL_HPD)); in check_connector_changed()
982 drm_WARN_ON(dev, !mutex_is_locked(&dev->mode_config.mutex)); in check_connector_changed()
984 old_status = connector->status; in check_connector_changed()
985 old_epoch_counter = connector->epoch_counter; in check_connector_changed()
986 connector->status = drm_helper_probe_detect(connector, NULL, false); in check_connector_changed()
988 if (old_epoch_counter == connector->epoch_counter) { in check_connector_changed()
990 connector->base.id, in check_connector_changed()
991 connector->name, in check_connector_changed()
992 connector->epoch_counter); in check_connector_changed()
998 connector->base.id, in check_connector_changed()
999 connector->name, in check_connector_changed()
1001 drm_get_connector_status_name(connector->status)); in check_connector_changed()
1004 connector->base.id, in check_connector_changed()
1005 connector->name, in check_connector_changed()
1007 connector->epoch_counter); in check_connector_changed()
1013 * drm_connector_helper_hpd_irq_event - hotplug processing
1035 struct drm_device *dev = connector->dev; in drm_connector_helper_hpd_irq_event()
1038 mutex_lock(&dev->mode_config.mutex); in drm_connector_helper_hpd_irq_event()
1040 mutex_unlock(&dev->mode_config.mutex); in drm_connector_helper_hpd_irq_event()
1045 connector->base.id, in drm_connector_helper_hpd_irq_event()
1046 connector->name); in drm_connector_helper_hpd_irq_event()
1054 * drm_helper_hpd_irq_event - hotplug processing
1066 * which have a more fine-grained detect logic can use
1086 if (!dev->mode_config.poll_enabled) in drm_helper_hpd_irq_event()
1089 mutex_lock(&dev->mode_config.mutex); in drm_helper_hpd_irq_event()
1093 if (!(connector->polled & DRM_CONNECTOR_POLL_HPD)) in drm_helper_hpd_irq_event()
1106 mutex_unlock(&dev->mode_config.mutex); in drm_helper_hpd_irq_event()
1121 * drm_crtc_helper_mode_valid_fixed - Validates a display mode
1127 * MODE_OK on success, or another mode-status code otherwise.
1133 if (mode->hdisplay != fixed_mode->hdisplay && mode->vdisplay != fixed_mode->vdisplay) in drm_crtc_helper_mode_valid_fixed()
1135 else if (mode->hdisplay != fixed_mode->hdisplay) in drm_crtc_helper_mode_valid_fixed()
1137 else if (mode->vdisplay != fixed_mode->vdisplay) in drm_crtc_helper_mode_valid_fixed()
1145 * drm_connector_helper_get_modes_fixed - Duplicates a display mode for a connector
1159 struct drm_device *dev = connector->dev; in drm_connector_helper_get_modes_fixed()
1169 if (mode->name[0] == '\0') in drm_connector_helper_get_modes_fixed()
1172 mode->type |= DRM_MODE_TYPE_PREFERRED; in drm_connector_helper_get_modes_fixed()
1175 if (mode->width_mm) in drm_connector_helper_get_modes_fixed()
1176 connector->display_info.width_mm = mode->width_mm; in drm_connector_helper_get_modes_fixed()
1177 if (mode->height_mm) in drm_connector_helper_get_modes_fixed()
1178 connector->display_info.height_mm = mode->height_mm; in drm_connector_helper_get_modes_fixed()
1185 * drm_connector_helper_get_modes - Read EDID and update connector.
1188 * Read the EDID using drm_edid_read() (which requires that connector->ddc is
1200 int count; in drm_connector_helper_get_modes() local
1212 count = drm_edid_connector_add_modes(connector); in drm_connector_helper_get_modes()
1216 return count; in drm_connector_helper_get_modes()
1221 * drm_connector_helper_tv_get_modes - Fills the modes availables to a TV connector
1235 struct drm_device *dev = connector->dev; in drm_connector_helper_tv_get_modes()
1237 dev->mode_config.tv_mode_property; in drm_connector_helper_tv_get_modes()
1238 struct drm_cmdline_mode *cmdline = &connector->cmdline_mode; in drm_connector_helper_tv_get_modes()
1252 for (i = 0; i < tv_mode_property->num_values; i++) in drm_connector_helper_tv_get_modes()
1253 supported_tv_modes |= BIT(tv_mode_property->values[i]); in drm_connector_helper_tv_get_modes()
1260 if (drm_object_property_get_default_value(&connector->base, in drm_connector_helper_tv_get_modes()
1265 if (cmdline->tv_mode_specified) in drm_connector_helper_tv_get_modes()
1266 default_mode = cmdline->tv_mode; in drm_connector_helper_tv_get_modes()
1295 mode->type |= DRM_MODE_TYPE_PREFERRED; in drm_connector_helper_tv_get_modes()
1304 * drm_connector_helper_detect_from_ddc - Read EDID and detect connector status.
1307 * @force: Perform screen-destructive operations, if necessary
1310 * which requires connector->ddc to be set. Returns connector_status_connected
1320 struct i2c_adapter *ddc = connector->ddc; in drm_connector_helper_detect_from_ddc()