brintos

brintos / linux-shallow public Read only

0
0
Text · 40.4 KiB · 92f2176 Raw
1330 lines · c
1/*2 * Copyright (c) 2006-2008 Intel Corporation3 * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>4 *5 * DRM core CRTC related functions6 *7 * Permission to use, copy, modify, distribute, and sell this software and its8 * documentation for any purpose is hereby granted without fee, provided that9 * the above copyright notice appear in all copies and that both that copyright10 * notice and this permission notice appear in supporting documentation, and11 * that the name of the copyright holders not be used in advertising or12 * publicity pertaining to distribution of the software without specific,13 * written prior permission.  The copyright holders make no representations14 * about the suitability of this software for any purpose.  It is provided "as15 * is" without express or implied warranty.16 *17 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,18 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO19 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR20 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,21 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER22 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE23 * OF THIS SOFTWARE.24 *25 * Authors:26 *      Keith Packard27 *	Eric Anholt <eric@anholt.net>28 *      Dave Airlie <airlied@linux.ie>29 *      Jesse Barnes <jesse.barnes@intel.com>30 */31 32#include <linux/export.h>33#include <linux/moduleparam.h>34 35#include <drm/drm_bridge.h>36#include <drm/drm_client.h>37#include <drm/drm_crtc.h>38#include <drm/drm_edid.h>39#include <drm/drm_fourcc.h>40#include <drm/drm_managed.h>41#include <drm/drm_modeset_helper_vtables.h>42#include <drm/drm_print.h>43#include <drm/drm_probe_helper.h>44#include <drm/drm_sysfs.h>45 46#include "drm_crtc_helper_internal.h"47 48/**49 * DOC: output probing helper overview50 *51 * This library provides some helper code for output probing. It provides an52 * implementation of the core &drm_connector_funcs.fill_modes interface with53 * drm_helper_probe_single_connector_modes().54 *55 * It also provides support for polling connectors with a work item and for56 * generic hotplug interrupt handling where the driver doesn't or cannot keep57 * track of a per-connector hpd interrupt.58 *59 * This helper library can be used independently of the modeset helper library.60 * Drivers can also overwrite different parts e.g. use their own hotplug61 * handling code to avoid probing unrelated outputs.62 *63 * The probe helpers share the function table structures with other display64 * helper libraries. See &struct drm_connector_helper_funcs for the details.65 */66 67static bool drm_kms_helper_poll = true;68module_param_named(poll, drm_kms_helper_poll, bool, 0600);69 70static enum drm_mode_status71drm_mode_validate_flag(const struct drm_display_mode *mode,72		       int flags)73{74	if ((mode->flags & DRM_MODE_FLAG_INTERLACE) &&75	    !(flags & DRM_MODE_FLAG_INTERLACE))76		return MODE_NO_INTERLACE;77 78	if ((mode->flags & DRM_MODE_FLAG_DBLSCAN) &&79	    !(flags & DRM_MODE_FLAG_DBLSCAN))80		return MODE_NO_DBLESCAN;81 82	if ((mode->flags & DRM_MODE_FLAG_3D_MASK) &&83	    !(flags & DRM_MODE_FLAG_3D_MASK))84		return MODE_NO_STEREO;85 86	return MODE_OK;87}88 89static int90drm_mode_validate_pipeline(struct drm_display_mode *mode,91			   struct drm_connector *connector,92			   struct drm_modeset_acquire_ctx *ctx,93			   enum drm_mode_status *status)94{95	struct drm_device *dev = connector->dev;96	struct drm_encoder *encoder;97	int ret;98 99	/* Step 1: Validate against connector */100	ret = drm_connector_mode_valid(connector, mode, ctx, status);101	if (ret || *status != MODE_OK)102		return ret;103 104	/* Step 2: Validate against encoders and crtcs */105	drm_connector_for_each_possible_encoder(connector, encoder) {106		struct drm_bridge *bridge;107		struct drm_crtc *crtc;108 109		*status = drm_encoder_mode_valid(encoder, mode);110		if (*status != MODE_OK) {111			/* No point in continuing for crtc check as this encoder112			 * will not accept the mode anyway. If all encoders113			 * reject the mode then, at exit, ret will not be114			 * MODE_OK. */115			continue;116		}117 118		bridge = drm_bridge_chain_get_first_bridge(encoder);119		*status = drm_bridge_chain_mode_valid(bridge,120						      &connector->display_info,121						      mode);122		if (*status != MODE_OK) {123			/* There is also no point in continuing for crtc check124			 * here. */125			continue;126		}127 128		drm_for_each_crtc(crtc, dev) {129			if (!drm_encoder_crtc_ok(encoder, crtc))130				continue;131 132			*status = drm_crtc_mode_valid(crtc, mode);133			if (*status == MODE_OK) {134				/* If we get to this point there is at least135				 * one combination of encoder+crtc that works136				 * for this mode. Lets return now. */137				return 0;138			}139		}140	}141 142	return 0;143}144 145static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector)146{147	struct drm_cmdline_mode *cmdline_mode;148	struct drm_display_mode *mode;149 150	cmdline_mode = &connector->cmdline_mode;151	if (!cmdline_mode->specified)152		return 0;153 154	/* Only add a GTF mode if we find no matching probed modes */155	list_for_each_entry(mode, &connector->probed_modes, head) {156		if (mode->hdisplay != cmdline_mode->xres ||157		    mode->vdisplay != cmdline_mode->yres)158			continue;159 160		if (cmdline_mode->refresh_specified) {161			/* The probed mode's vrefresh is set until later */162			if (drm_mode_vrefresh(mode) != cmdline_mode->refresh)163				continue;164		}165 166		/* Mark the matching mode as being preferred by the user */167		mode->type |= DRM_MODE_TYPE_USERDEF;168		return 0;169	}170 171	mode = drm_mode_create_from_cmdline_mode(connector->dev,172						 cmdline_mode);173	if (mode == NULL)174		return 0;175 176	drm_mode_probed_add(connector, mode);177	return 1;178}179 180enum drm_mode_status drm_crtc_mode_valid(struct drm_crtc *crtc,181					 const struct drm_display_mode *mode)182{183	const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;184 185	if (!crtc_funcs || !crtc_funcs->mode_valid)186		return MODE_OK;187 188	return crtc_funcs->mode_valid(crtc, mode);189}190 191enum drm_mode_status drm_encoder_mode_valid(struct drm_encoder *encoder,192					    const struct drm_display_mode *mode)193{194	const struct drm_encoder_helper_funcs *encoder_funcs =195		encoder->helper_private;196 197	if (!encoder_funcs || !encoder_funcs->mode_valid)198		return MODE_OK;199 200	return encoder_funcs->mode_valid(encoder, mode);201}202 203int204drm_connector_mode_valid(struct drm_connector *connector,205			 struct drm_display_mode *mode,206			 struct drm_modeset_acquire_ctx *ctx,207			 enum drm_mode_status *status)208{209	const struct drm_connector_helper_funcs *connector_funcs =210		connector->helper_private;211	int ret = 0;212 213	if (!connector_funcs)214		*status = MODE_OK;215	else if (connector_funcs->mode_valid_ctx)216		ret = connector_funcs->mode_valid_ctx(connector, mode, ctx,217						      status);218	else if (connector_funcs->mode_valid)219		*status = connector_funcs->mode_valid(connector, mode);220	else221		*status = MODE_OK;222 223	return ret;224}225 226static void drm_kms_helper_disable_hpd(struct drm_device *dev)227{228	struct drm_connector *connector;229	struct drm_connector_list_iter conn_iter;230 231	drm_connector_list_iter_begin(dev, &conn_iter);232	drm_for_each_connector_iter(connector, &conn_iter) {233		const struct drm_connector_helper_funcs *funcs =234			connector->helper_private;235 236		if (funcs && funcs->disable_hpd)237			funcs->disable_hpd(connector);238	}239	drm_connector_list_iter_end(&conn_iter);240}241 242static bool drm_kms_helper_enable_hpd(struct drm_device *dev)243{244	bool poll = false;245	struct drm_connector *connector;246	struct drm_connector_list_iter conn_iter;247 248	drm_connector_list_iter_begin(dev, &conn_iter);249	drm_for_each_connector_iter(connector, &conn_iter) {250		const struct drm_connector_helper_funcs *funcs =251			connector->helper_private;252 253		if (funcs && funcs->enable_hpd)254			funcs->enable_hpd(connector);255 256		if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT |257					 DRM_CONNECTOR_POLL_DISCONNECT))258			poll = true;259	}260	drm_connector_list_iter_end(&conn_iter);261 262	return poll;263}264 265#define DRM_OUTPUT_POLL_PERIOD (10*HZ)266static void reschedule_output_poll_work(struct drm_device *dev)267{268	unsigned long delay = DRM_OUTPUT_POLL_PERIOD;269 270	if (dev->mode_config.delayed_event)271		/*272		 * FIXME:273		 *274		 * Use short (1s) delay to handle the initial delayed event.275		 * This delay should not be needed, but Optimus/nouveau will276		 * fail in a mysterious way if the delayed event is handled as277		 * soon as possible like it is done in278		 * drm_helper_probe_single_connector_modes() in case the poll279		 * was enabled before.280		 */281		delay = HZ;282 283	schedule_delayed_work(&dev->mode_config.output_poll_work, delay);284}285 286/**287 * drm_kms_helper_poll_enable - re-enable output polling.288 * @dev: drm_device289 *290 * This function re-enables the output polling work, after it has been291 * temporarily disabled using drm_kms_helper_poll_disable(), for example over292 * suspend/resume.293 *294 * Drivers can call this helper from their device resume implementation. It is295 * not an error to call this even when output polling isn't enabled.296 *297 * If device polling was never initialized before, this call will trigger a298 * warning and return.299 *300 * Note that calls to enable and disable polling must be strictly ordered, which301 * is automatically the case when they're only call from suspend/resume302 * callbacks.303 */304void drm_kms_helper_poll_enable(struct drm_device *dev)305{306	if (drm_WARN_ON_ONCE(dev, !dev->mode_config.poll_enabled) ||307	    !drm_kms_helper_poll || dev->mode_config.poll_running)308		return;309 310	if (drm_kms_helper_enable_hpd(dev) ||311	    dev->mode_config.delayed_event)312		reschedule_output_poll_work(dev);313 314	dev->mode_config.poll_running = true;315}316EXPORT_SYMBOL(drm_kms_helper_poll_enable);317 318/**319 * drm_kms_helper_poll_reschedule - reschedule the output polling work320 * @dev: drm_device321 *322 * This function reschedules the output polling work, after polling for a323 * connector has been enabled.324 *325 * Drivers must call this helper after enabling polling for a connector by326 * setting %DRM_CONNECTOR_POLL_CONNECT / %DRM_CONNECTOR_POLL_DISCONNECT flags327 * in drm_connector::polled. Note that after disabling polling by clearing these328 * flags for a connector will stop the output polling work automatically if329 * the polling is disabled for all other connectors as well.330 *331 * The function can be called only after polling has been enabled by calling332 * drm_kms_helper_poll_init() / drm_kms_helper_poll_enable().333 */334void drm_kms_helper_poll_reschedule(struct drm_device *dev)335{336	if (dev->mode_config.poll_running)337		reschedule_output_poll_work(dev);338}339EXPORT_SYMBOL(drm_kms_helper_poll_reschedule);340 341static enum drm_connector_status342drm_helper_probe_detect_ctx(struct drm_connector *connector, bool force)343{344	const struct drm_connector_helper_funcs *funcs = connector->helper_private;345	struct drm_modeset_acquire_ctx ctx;346	int ret;347 348	drm_modeset_acquire_init(&ctx, 0);349 350retry:351	ret = drm_modeset_lock(&connector->dev->mode_config.connection_mutex, &ctx);352	if (!ret) {353		if (funcs->detect_ctx)354			ret = funcs->detect_ctx(connector, &ctx, force);355		else if (connector->funcs->detect)356			ret = connector->funcs->detect(connector, force);357		else358			ret = connector_status_connected;359	}360 361	if (ret == -EDEADLK) {362		drm_modeset_backoff(&ctx);363		goto retry;364	}365 366	if (WARN_ON(ret < 0))367		ret = connector_status_unknown;368 369	if (ret != connector->status)370		connector->epoch_counter += 1;371 372	drm_modeset_drop_locks(&ctx);373	drm_modeset_acquire_fini(&ctx);374 375	return ret;376}377 378/**379 * drm_helper_probe_detect - probe connector status380 * @connector: connector to probe381 * @ctx: acquire_ctx, or NULL to let this function handle locking.382 * @force: Whether destructive probe operations should be performed.383 *384 * This function calls the detect callbacks of the connector.385 * This function returns &drm_connector_status, or386 * if @ctx is set, it might also return -EDEADLK.387 */388int389drm_helper_probe_detect(struct drm_connector *connector,390			struct drm_modeset_acquire_ctx *ctx,391			bool force)392{393	const struct drm_connector_helper_funcs *funcs = connector->helper_private;394	struct drm_device *dev = connector->dev;395	int ret;396 397	if (!ctx)398		return drm_helper_probe_detect_ctx(connector, force);399 400	ret = drm_modeset_lock(&dev->mode_config.connection_mutex, ctx);401	if (ret)402		return ret;403 404	if (funcs->detect_ctx)405		ret = funcs->detect_ctx(connector, ctx, force);406	else if (connector->funcs->detect)407		ret = connector->funcs->detect(connector, force);408	else409		ret = connector_status_connected;410 411	if (ret != connector->status)412		connector->epoch_counter += 1;413 414	return ret;415}416EXPORT_SYMBOL(drm_helper_probe_detect);417 418static int drm_helper_probe_get_modes(struct drm_connector *connector)419{420	const struct drm_connector_helper_funcs *connector_funcs =421		connector->helper_private;422	int count;423 424	count = connector_funcs->get_modes(connector);425 426	/* The .get_modes() callback should not return negative values. */427	if (count < 0) {428		drm_err(connector->dev, ".get_modes() returned %pe\n",429			ERR_PTR(count));430		count = 0;431	}432 433	/*434	 * Fallback for when DDC probe failed in drm_get_edid() and thus skipped435	 * override/firmware EDID.436	 */437	if (count == 0 && connector->status == connector_status_connected)438		count = drm_edid_override_connector_update(connector);439 440	return count;441}442 443static int __drm_helper_update_and_validate(struct drm_connector *connector,444					    uint32_t maxX, uint32_t maxY,445					    struct drm_modeset_acquire_ctx *ctx)446{447	struct drm_device *dev = connector->dev;448	struct drm_display_mode *mode;449	int mode_flags = 0;450	int ret;451 452	drm_connector_list_update(connector);453 454	if (connector->interlace_allowed)455		mode_flags |= DRM_MODE_FLAG_INTERLACE;456	if (connector->doublescan_allowed)457		mode_flags |= DRM_MODE_FLAG_DBLSCAN;458	if (connector->stereo_allowed)459		mode_flags |= DRM_MODE_FLAG_3D_MASK;460 461	list_for_each_entry(mode, &connector->modes, head) {462		if (mode->status != MODE_OK)463			continue;464 465		mode->status = drm_mode_validate_driver(dev, mode);466		if (mode->status != MODE_OK)467			continue;468 469		mode->status = drm_mode_validate_size(mode, maxX, maxY);470		if (mode->status != MODE_OK)471			continue;472 473		mode->status = drm_mode_validate_flag(mode, mode_flags);474		if (mode->status != MODE_OK)475			continue;476 477		mode->status = drm_mode_validate_ycbcr420(mode, connector);478		if (mode->status != MODE_OK)479			continue;480 481		ret = drm_mode_validate_pipeline(mode, connector, ctx,482						 &mode->status);483		if (ret) {484			drm_dbg_kms(dev,485				    "drm_mode_validate_pipeline failed: %d\n",486				    ret);487 488			if (drm_WARN_ON_ONCE(dev, ret != -EDEADLK))489				mode->status = MODE_ERROR;490			else491				return -EDEADLK;492		}493	}494 495	return 0;496}497 498/**499 * drm_helper_probe_single_connector_modes - get complete set of display modes500 * @connector: connector to probe501 * @maxX: max width for modes502 * @maxY: max height for modes503 *504 * Based on the helper callbacks implemented by @connector in struct505 * &drm_connector_helper_funcs try to detect all valid modes.  Modes will first506 * be added to the connector's probed_modes list, then culled (based on validity507 * and the @maxX, @maxY parameters) and put into the normal modes list.508 *509 * Intended to be used as a generic implementation of the510 * &drm_connector_funcs.fill_modes() vfunc for drivers that use the CRTC helpers511 * for output mode filtering and detection.512 *513 * The basic procedure is as follows514 *515 * 1. All modes currently on the connector's modes list are marked as stale516 *517 * 2. New modes are added to the connector's probed_modes list with518 *    drm_mode_probed_add(). New modes start their life with status as OK.519 *    Modes are added from a single source using the following priority order.520 *521 *    - &drm_connector_helper_funcs.get_modes vfunc522 *    - if the connector status is connector_status_connected, standard523 *      VESA DMT modes up to 1024x768 are automatically added524 *      (drm_add_modes_noedid())525 *526 *    Finally modes specified via the kernel command line (video=...) are527 *    added in addition to what the earlier probes produced528 *    (drm_helper_probe_add_cmdline_mode()). These modes are generated529 *    using the VESA GTF/CVT formulas.530 *531 * 3. Modes are moved from the probed_modes list to the modes list. Potential532 *    duplicates are merged together (see drm_connector_list_update()).533 *    After this step the probed_modes list will be empty again.534 *535 * 4. Any non-stale mode on the modes list then undergoes validation536 *537 *    - drm_mode_validate_basic() performs basic sanity checks538 *    - drm_mode_validate_size() filters out modes larger than @maxX and @maxY539 *      (if specified)540 *    - drm_mode_validate_flag() checks the modes against basic connector541 *      capabilities (interlace_allowed,doublescan_allowed,stereo_allowed)542 *    - the optional &drm_connector_helper_funcs.mode_valid or543 *      &drm_connector_helper_funcs.mode_valid_ctx helpers can perform driver544 *      and/or sink specific checks545 *    - the optional &drm_crtc_helper_funcs.mode_valid,546 *      &drm_bridge_funcs.mode_valid and &drm_encoder_helper_funcs.mode_valid547 *      helpers can perform driver and/or source specific checks which are also548 *      enforced by the modeset/atomic helpers549 *550 * 5. Any mode whose status is not OK is pruned from the connector's modes list,551 *    accompanied by a debug message indicating the reason for the mode's552 *    rejection (see drm_mode_prune_invalid()).553 *554 * Returns:555 * The number of modes found on @connector.556 */557int drm_helper_probe_single_connector_modes(struct drm_connector *connector,558					    uint32_t maxX, uint32_t maxY)559{560	struct drm_device *dev = connector->dev;561	struct drm_display_mode *mode;562	int count = 0, ret;563	enum drm_connector_status old_status;564	struct drm_modeset_acquire_ctx ctx;565 566	WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));567 568	drm_modeset_acquire_init(&ctx, 0);569 570	drm_dbg_kms(dev, "[CONNECTOR:%d:%s]\n", connector->base.id,571		    connector->name);572 573retry:574	ret = drm_modeset_lock(&dev->mode_config.connection_mutex, &ctx);575	if (ret == -EDEADLK) {576		drm_modeset_backoff(&ctx);577		goto retry;578	} else579		WARN_ON(ret < 0);580 581	/* set all old modes to the stale state */582	list_for_each_entry(mode, &connector->modes, head)583		mode->status = MODE_STALE;584 585	old_status = connector->status;586 587	if (connector->force) {588		if (connector->force == DRM_FORCE_ON ||589		    connector->force == DRM_FORCE_ON_DIGITAL)590			connector->status = connector_status_connected;591		else592			connector->status = connector_status_disconnected;593		if (connector->funcs->force)594			connector->funcs->force(connector);595	} else {596		ret = drm_helper_probe_detect(connector, &ctx, true);597 598		if (ret == -EDEADLK) {599			drm_modeset_backoff(&ctx);600			goto retry;601		} else if (WARN(ret < 0, "Invalid return value %i for connector detection\n", ret))602			ret = connector_status_unknown;603 604		connector->status = ret;605	}606 607	/*608	 * Normally either the driver's hpd code or the poll loop should609	 * pick up any changes and fire the hotplug event. But if610	 * userspace sneaks in a probe, we might miss a change. Hence611	 * check here, and if anything changed start the hotplug code.612	 */613	if (old_status != connector->status) {614		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] status updated from %s to %s\n",615			    connector->base.id, connector->name,616			    drm_get_connector_status_name(old_status),617			    drm_get_connector_status_name(connector->status));618 619		/*620		 * The hotplug event code might call into the fb621		 * helpers, and so expects that we do not hold any622		 * locks. Fire up the poll struct instead, it will623		 * disable itself again.624		 */625		dev->mode_config.delayed_event = true;626		if (dev->mode_config.poll_enabled)627			mod_delayed_work(system_wq,628					 &dev->mode_config.output_poll_work,629					 0);630	}631 632	/*633	 * Re-enable polling in case the global poll config changed but polling634	 * is still initialized.635	 */636	if (dev->mode_config.poll_enabled)637		drm_kms_helper_poll_enable(dev);638 639	if (connector->status == connector_status_disconnected) {640		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] disconnected\n",641			    connector->base.id, connector->name);642		drm_connector_update_edid_property(connector, NULL);643		drm_mode_prune_invalid(dev, &connector->modes, false);644		goto exit;645	}646 647	count = drm_helper_probe_get_modes(connector);648 649	if (count == 0 && (connector->status == connector_status_connected ||650			   connector->status == connector_status_unknown)) {651		count = drm_add_modes_noedid(connector, 1024, 768);652 653		/*654		 * Section 4.2.2.6 (EDID Corruption Detection) of the DP 1.4a655		 * Link CTS specifies that 640x480 (the official "failsafe"656		 * mode) needs to be the default if there's no EDID.657		 */658		if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort)659			drm_set_preferred_mode(connector, 640, 480);660	}661	count += drm_helper_probe_add_cmdline_mode(connector);662	if (count != 0) {663		ret = __drm_helper_update_and_validate(connector, maxX, maxY, &ctx);664		if (ret == -EDEADLK) {665			drm_modeset_backoff(&ctx);666			goto retry;667		}668	}669 670	drm_mode_prune_invalid(dev, &connector->modes, true);671 672	/*673	 * Displayport spec section 5.2.1.2 ("Video Timing Format") says that674	 * all detachable sinks shall support 640x480 @60Hz as a fail safe675	 * mode. If all modes were pruned, perhaps because they need more676	 * lanes or a higher pixel clock than available, at least try to add677	 * in 640x480.678	 */679	if (list_empty(&connector->modes) &&680	    connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {681		count = drm_add_modes_noedid(connector, 640, 480);682		ret = __drm_helper_update_and_validate(connector, maxX, maxY, &ctx);683		if (ret == -EDEADLK) {684			drm_modeset_backoff(&ctx);685			goto retry;686		}687		drm_mode_prune_invalid(dev, &connector->modes, true);688	}689 690exit:691	drm_modeset_drop_locks(&ctx);692	drm_modeset_acquire_fini(&ctx);693 694	if (list_empty(&connector->modes))695		return 0;696 697	drm_mode_sort(&connector->modes);698 699	drm_dbg_kms(dev, "[CONNECTOR:%d:%s] probed modes:\n",700		    connector->base.id, connector->name);701 702	list_for_each_entry(mode, &connector->modes, head) {703		drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);704		drm_dbg_kms(dev, "Probed mode: " DRM_MODE_FMT "\n",705			    DRM_MODE_ARG(mode));706	}707 708	return count;709}710EXPORT_SYMBOL(drm_helper_probe_single_connector_modes);711 712/**713 * drm_kms_helper_hotplug_event - fire off KMS hotplug events714 * @dev: drm_device whose connector state changed715 *716 * This function fires off the uevent for userspace and also calls the717 * client hotplug function, which is most commonly used to inform the fbdev718 * emulation code and allow it to update the fbcon output configuration.719 *720 * Drivers should call this from their hotplug handling code when a change is721 * detected. Note that this function does not do any output detection of its722 * own, like drm_helper_hpd_irq_event() does - this is assumed to be done by the723 * driver already.724 *725 * This function must be called from process context with no mode726 * setting locks held.727 *728 * If only a single connector has changed, consider calling729 * drm_kms_helper_connector_hotplug_event() instead.730 */731void drm_kms_helper_hotplug_event(struct drm_device *dev)732{733	drm_sysfs_hotplug_event(dev);734	drm_client_dev_hotplug(dev);735}736EXPORT_SYMBOL(drm_kms_helper_hotplug_event);737 738/**739 * drm_kms_helper_connector_hotplug_event - fire off a KMS connector hotplug event740 * @connector: drm_connector which has changed741 *742 * This is the same as drm_kms_helper_hotplug_event(), except it fires a more743 * fine-grained uevent for a single connector.744 */745void drm_kms_helper_connector_hotplug_event(struct drm_connector *connector)746{747	struct drm_device *dev = connector->dev;748 749	drm_sysfs_connector_hotplug_event(connector);750	drm_client_dev_hotplug(dev);751}752EXPORT_SYMBOL(drm_kms_helper_connector_hotplug_event);753 754static void output_poll_execute(struct work_struct *work)755{756	struct delayed_work *delayed_work = to_delayed_work(work);757	struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_work);758	struct drm_connector *connector;759	struct drm_connector_list_iter conn_iter;760	enum drm_connector_status old_status;761	bool repoll = false, changed;762	u64 old_epoch_counter;763 764	if (!dev->mode_config.poll_enabled)765		return;766 767	/* Pick up any changes detected by the probe functions. */768	changed = dev->mode_config.delayed_event;769	dev->mode_config.delayed_event = false;770 771	if (!drm_kms_helper_poll) {772		if (dev->mode_config.poll_running) {773			drm_kms_helper_disable_hpd(dev);774			dev->mode_config.poll_running = false;775		}776		goto out;777	}778 779	if (!mutex_trylock(&dev->mode_config.mutex)) {780		repoll = true;781		goto out;782	}783 784	drm_connector_list_iter_begin(dev, &conn_iter);785	drm_for_each_connector_iter(connector, &conn_iter) {786		/* Ignore forced connectors. */787		if (connector->force)788			continue;789 790		/* Ignore HPD capable connectors and connectors where we don't791		 * want any hotplug detection at all for polling. */792		if (!connector->polled || connector->polled == DRM_CONNECTOR_POLL_HPD)793			continue;794 795		old_status = connector->status;796		/* if we are connected and don't want to poll for disconnect797		   skip it */798		if (old_status == connector_status_connected &&799		    !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT))800			continue;801 802		repoll = true;803 804		old_epoch_counter = connector->epoch_counter;805		connector->status = drm_helper_probe_detect(connector, NULL, false);806		if (old_epoch_counter != connector->epoch_counter) {807			const char *old, *new;808 809			/*810			 * The poll work sets force=false when calling detect so811			 * that drivers can avoid to do disruptive tests (e.g.812			 * when load detect cycles could cause flickering on813			 * other, running displays). This bears the risk that we814			 * flip-flop between unknown here in the poll work and815			 * the real state when userspace forces a full detect816			 * call after receiving a hotplug event due to this817			 * change.818			 *819			 * Hence clamp an unknown detect status to the old820			 * value.821			 */822			if (connector->status == connector_status_unknown) {823				connector->status = old_status;824				continue;825			}826 827			old = drm_get_connector_status_name(old_status);828			new = drm_get_connector_status_name(connector->status);829 830			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] status updated from %s to %s\n",831				    connector->base.id, connector->name,832				    old, new);833			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] epoch counter %llu -> %llu\n",834				    connector->base.id, connector->name,835				    old_epoch_counter, connector->epoch_counter);836 837			changed = true;838		}839	}840	drm_connector_list_iter_end(&conn_iter);841 842	mutex_unlock(&dev->mode_config.mutex);843 844out:845	if (changed)846		drm_kms_helper_hotplug_event(dev);847 848	if (repoll)849		schedule_delayed_work(delayed_work, DRM_OUTPUT_POLL_PERIOD);850}851 852/**853 * drm_kms_helper_is_poll_worker - is %current task an output poll worker?854 *855 * Determine if %current task is an output poll worker.  This can be used856 * to select distinct code paths for output polling versus other contexts.857 *858 * One use case is to avoid a deadlock between the output poll worker and859 * the autosuspend worker wherein the latter waits for polling to finish860 * upon calling drm_kms_helper_poll_disable(), while the former waits for861 * runtime suspend to finish upon calling pm_runtime_get_sync() in a862 * connector ->detect hook.863 */864bool drm_kms_helper_is_poll_worker(void)865{866	struct work_struct *work = current_work();867 868	return work && work->func == output_poll_execute;869}870EXPORT_SYMBOL(drm_kms_helper_is_poll_worker);871 872/**873 * drm_kms_helper_poll_disable - disable output polling874 * @dev: drm_device875 *876 * This function disables the output polling work.877 *878 * Drivers can call this helper from their device suspend implementation. It is879 * not an error to call this even when output polling isn't enabled or already880 * disabled. Polling is re-enabled by calling drm_kms_helper_poll_enable().881 *882 * If however, the polling was never initialized, this call will trigger a883 * warning and return.884 *885 * Note that calls to enable and disable polling must be strictly ordered, which886 * is automatically the case when they're only call from suspend/resume887 * callbacks.888 */889void drm_kms_helper_poll_disable(struct drm_device *dev)890{891	if (drm_WARN_ON(dev, !dev->mode_config.poll_enabled))892		return;893 894	if (dev->mode_config.poll_running)895		drm_kms_helper_disable_hpd(dev);896 897	cancel_delayed_work_sync(&dev->mode_config.output_poll_work);898 899	dev->mode_config.poll_running = false;900}901EXPORT_SYMBOL(drm_kms_helper_poll_disable);902 903/**904 * drm_kms_helper_poll_init - initialize and enable output polling905 * @dev: drm_device906 *907 * This function initializes and then also enables output polling support for908 * @dev. Drivers which do not have reliable hotplug support in hardware can use909 * this helper infrastructure to regularly poll such connectors for changes in910 * their connection state.911 *912 * Drivers can control which connectors are polled by setting the913 * DRM_CONNECTOR_POLL_CONNECT and DRM_CONNECTOR_POLL_DISCONNECT flags. On914 * connectors where probing live outputs can result in visual distortion drivers915 * should not set the DRM_CONNECTOR_POLL_DISCONNECT flag to avoid this.916 * Connectors which have no flag or only DRM_CONNECTOR_POLL_HPD set are917 * completely ignored by the polling logic.918 *919 * Note that a connector can be both polled and probed from the hotplug handler,920 * in case the hotplug interrupt is known to be unreliable.921 */922void drm_kms_helper_poll_init(struct drm_device *dev)923{924	INIT_DELAYED_WORK(&dev->mode_config.output_poll_work, output_poll_execute);925	dev->mode_config.poll_enabled = true;926 927	drm_kms_helper_poll_enable(dev);928}929EXPORT_SYMBOL(drm_kms_helper_poll_init);930 931/**932 * drm_kms_helper_poll_fini - disable output polling and clean it up933 * @dev: drm_device934 */935void drm_kms_helper_poll_fini(struct drm_device *dev)936{937	if (!dev->mode_config.poll_enabled)938		return;939 940	drm_kms_helper_poll_disable(dev);941 942	dev->mode_config.poll_enabled = false;943}944EXPORT_SYMBOL(drm_kms_helper_poll_fini);945 946static void drm_kms_helper_poll_init_release(struct drm_device *dev, void *res)947{948	drm_kms_helper_poll_fini(dev);949}950 951/**952 * drmm_kms_helper_poll_init - initialize and enable output polling953 * @dev: drm_device954 *955 * This function initializes and then also enables output polling support for956 * @dev similar to drm_kms_helper_poll_init(). Polling will automatically be957 * cleaned up when the DRM device goes away.958 *959 * See drm_kms_helper_poll_init() for more information.960 *961 * Returns:962 * 0 on success, or a negative errno code otherwise.963 */964int drmm_kms_helper_poll_init(struct drm_device *dev)965{966	drm_kms_helper_poll_init(dev);967 968	return drmm_add_action_or_reset(dev, drm_kms_helper_poll_init_release, dev);969}970EXPORT_SYMBOL(drmm_kms_helper_poll_init);971 972static bool check_connector_changed(struct drm_connector *connector)973{974	struct drm_device *dev = connector->dev;975	enum drm_connector_status old_status;976	u64 old_epoch_counter;977 978	/* Only handle HPD capable connectors. */979	drm_WARN_ON(dev, !(connector->polled & DRM_CONNECTOR_POLL_HPD));980 981	drm_WARN_ON(dev, !mutex_is_locked(&dev->mode_config.mutex));982 983	old_status = connector->status;984	old_epoch_counter = connector->epoch_counter;985	connector->status = drm_helper_probe_detect(connector, NULL, false);986 987	if (old_epoch_counter == connector->epoch_counter) {988		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Same epoch counter %llu\n",989			    connector->base.id,990			    connector->name,991			    connector->epoch_counter);992 993		return false;994	}995 996	drm_dbg_kms(dev, "[CONNECTOR:%d:%s] status updated from %s to %s\n",997		    connector->base.id,998		    connector->name,999		    drm_get_connector_status_name(old_status),1000		    drm_get_connector_status_name(connector->status));1001 1002	drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Changed epoch counter %llu => %llu\n",1003		    connector->base.id,1004		    connector->name,1005		    old_epoch_counter,1006		    connector->epoch_counter);1007 1008	return true;1009}1010 1011/**1012 * drm_connector_helper_hpd_irq_event - hotplug processing1013 * @connector: drm_connector1014 *1015 * Drivers can use this helper function to run a detect cycle on a connector1016 * which has the DRM_CONNECTOR_POLL_HPD flag set in its &polled member.1017 *1018 * This helper function is useful for drivers which can track hotplug1019 * interrupts for a single connector. Drivers that want to send a1020 * hotplug event for all connectors or can't track hotplug interrupts1021 * per connector need to use drm_helper_hpd_irq_event().1022 *1023 * This function must be called from process context with no mode1024 * setting locks held.1025 *1026 * Note that a connector can be both polled and probed from the hotplug1027 * handler, in case the hotplug interrupt is known to be unreliable.1028 *1029 * Returns:1030 * A boolean indicating whether the connector status changed or not1031 */1032bool drm_connector_helper_hpd_irq_event(struct drm_connector *connector)1033{1034	struct drm_device *dev = connector->dev;1035	bool changed;1036 1037	mutex_lock(&dev->mode_config.mutex);1038	changed = check_connector_changed(connector);1039	mutex_unlock(&dev->mode_config.mutex);1040 1041	if (changed) {1042		drm_kms_helper_connector_hotplug_event(connector);1043		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Sent hotplug event\n",1044			    connector->base.id,1045			    connector->name);1046	}1047 1048	return changed;1049}1050EXPORT_SYMBOL(drm_connector_helper_hpd_irq_event);1051 1052/**1053 * drm_helper_hpd_irq_event - hotplug processing1054 * @dev: drm_device1055 *1056 * Drivers can use this helper function to run a detect cycle on all connectors1057 * which have the DRM_CONNECTOR_POLL_HPD flag set in their &polled member. All1058 * other connectors are ignored, which is useful to avoid reprobing fixed1059 * panels.1060 *1061 * This helper function is useful for drivers which can't or don't track hotplug1062 * interrupts for each connector.1063 *1064 * Drivers which support hotplug interrupts for each connector individually and1065 * which have a more fine-grained detect logic can use1066 * drm_connector_helper_hpd_irq_event(). Alternatively, they should bypass this1067 * code and directly call drm_kms_helper_hotplug_event() in case the connector1068 * state changed.1069 *1070 * This function must be called from process context with no mode1071 * setting locks held.1072 *1073 * Note that a connector can be both polled and probed from the hotplug handler,1074 * in case the hotplug interrupt is known to be unreliable.1075 *1076 * Returns:1077 * A boolean indicating whether the connector status changed or not1078 */1079bool drm_helper_hpd_irq_event(struct drm_device *dev)1080{1081	struct drm_connector *connector, *first_changed_connector = NULL;1082	struct drm_connector_list_iter conn_iter;1083	int changed = 0;1084 1085	if (!dev->mode_config.poll_enabled)1086		return false;1087 1088	mutex_lock(&dev->mode_config.mutex);1089	drm_connector_list_iter_begin(dev, &conn_iter);1090	drm_for_each_connector_iter(connector, &conn_iter) {1091		/* Only handle HPD capable connectors. */1092		if (!(connector->polled & DRM_CONNECTOR_POLL_HPD))1093			continue;1094 1095		if (check_connector_changed(connector)) {1096			if (!first_changed_connector) {1097				drm_connector_get(connector);1098				first_changed_connector = connector;1099			}1100 1101			changed++;1102		}1103	}1104	drm_connector_list_iter_end(&conn_iter);1105	mutex_unlock(&dev->mode_config.mutex);1106 1107	if (changed == 1)1108		drm_kms_helper_connector_hotplug_event(first_changed_connector);1109	else if (changed > 0)1110		drm_kms_helper_hotplug_event(dev);1111 1112	if (first_changed_connector)1113		drm_connector_put(first_changed_connector);1114 1115	return changed;1116}1117EXPORT_SYMBOL(drm_helper_hpd_irq_event);1118 1119/**1120 * drm_crtc_helper_mode_valid_fixed - Validates a display mode1121 * @crtc: the crtc1122 * @mode: the mode to validate1123 * @fixed_mode: the display hardware's mode1124 *1125 * Returns:1126 * MODE_OK on success, or another mode-status code otherwise.1127 */1128enum drm_mode_status drm_crtc_helper_mode_valid_fixed(struct drm_crtc *crtc,1129						      const struct drm_display_mode *mode,1130						      const struct drm_display_mode *fixed_mode)1131{1132	if (mode->hdisplay != fixed_mode->hdisplay && mode->vdisplay != fixed_mode->vdisplay)1133		return MODE_ONE_SIZE;1134	else if (mode->hdisplay != fixed_mode->hdisplay)1135		return MODE_ONE_WIDTH;1136	else if (mode->vdisplay != fixed_mode->vdisplay)1137		return MODE_ONE_HEIGHT;1138 1139	return MODE_OK;1140}1141EXPORT_SYMBOL(drm_crtc_helper_mode_valid_fixed);1142 1143/**1144 * drm_connector_helper_get_modes_fixed - Duplicates a display mode for a connector1145 * @connector: the connector1146 * @fixed_mode: the display hardware's mode1147 *1148 * This function duplicates a display modes for a connector. Drivers for hardware1149 * that only supports a single fixed mode can use this function in their connector's1150 * get_modes helper.1151 *1152 * Returns:1153 * The number of created modes.1154 */1155int drm_connector_helper_get_modes_fixed(struct drm_connector *connector,1156					 const struct drm_display_mode *fixed_mode)1157{1158	struct drm_device *dev = connector->dev;1159	struct drm_display_mode *mode;1160 1161	mode = drm_mode_duplicate(dev, fixed_mode);1162	if (!mode) {1163		drm_err(dev, "Failed to duplicate mode " DRM_MODE_FMT "\n",1164			DRM_MODE_ARG(fixed_mode));1165		return 0;1166	}1167 1168	if (mode->name[0] == '\0')1169		drm_mode_set_name(mode);1170 1171	mode->type |= DRM_MODE_TYPE_PREFERRED;1172	drm_mode_probed_add(connector, mode);1173 1174	if (mode->width_mm)1175		connector->display_info.width_mm = mode->width_mm;1176	if (mode->height_mm)1177		connector->display_info.height_mm = mode->height_mm;1178 1179	return 1;1180}1181EXPORT_SYMBOL(drm_connector_helper_get_modes_fixed);1182 1183/**1184 * drm_connector_helper_get_modes - Read EDID and update connector.1185 * @connector: The connector1186 *1187 * Read the EDID using drm_edid_read() (which requires that connector->ddc is1188 * set), and update the connector using the EDID.1189 *1190 * This can be used as the "default" connector helper .get_modes() hook if the1191 * driver does not need any special processing. This is sets the example what1192 * custom .get_modes() hooks should do regarding EDID read and connector update.1193 *1194 * Returns: Number of modes.1195 */1196int drm_connector_helper_get_modes(struct drm_connector *connector)1197{1198	const struct drm_edid *drm_edid;1199	int count;1200 1201	drm_edid = drm_edid_read(connector);1202 1203	/*1204	 * Unconditionally update the connector. If the EDID was read1205	 * successfully, fill in the connector information derived from the1206	 * EDID. Otherwise, if the EDID is NULL, clear the connector1207	 * information.1208	 */1209	drm_edid_connector_update(connector, drm_edid);1210 1211	count = drm_edid_connector_add_modes(connector);1212 1213	drm_edid_free(drm_edid);1214 1215	return count;1216}1217EXPORT_SYMBOL(drm_connector_helper_get_modes);1218 1219/**1220 * drm_connector_helper_tv_get_modes - Fills the modes availables to a TV connector1221 * @connector: The connector1222 *1223 * Fills the available modes for a TV connector based on the supported1224 * TV modes, and the default mode expressed by the kernel command line.1225 *1226 * This can be used as the default TV connector helper .get_modes() hook1227 * if the driver does not need any special processing.1228 *1229 * Returns:1230 * The number of modes added to the connector.1231 */1232int drm_connector_helper_tv_get_modes(struct drm_connector *connector)1233{1234	struct drm_device *dev = connector->dev;1235	struct drm_property *tv_mode_property =1236		dev->mode_config.tv_mode_property;1237	struct drm_cmdline_mode *cmdline = &connector->cmdline_mode;1238	unsigned int ntsc_modes = BIT(DRM_MODE_TV_MODE_NTSC) |1239		BIT(DRM_MODE_TV_MODE_NTSC_443) |1240		BIT(DRM_MODE_TV_MODE_NTSC_J) |1241		BIT(DRM_MODE_TV_MODE_PAL_M);1242	unsigned int pal_modes = BIT(DRM_MODE_TV_MODE_PAL) |1243		BIT(DRM_MODE_TV_MODE_PAL_N) |1244		BIT(DRM_MODE_TV_MODE_SECAM);1245	unsigned int tv_modes[2] = { UINT_MAX, UINT_MAX };1246	unsigned int i, supported_tv_modes = 0;1247 1248	if (!tv_mode_property)1249		return 0;1250 1251	for (i = 0; i < tv_mode_property->num_values; i++)1252		supported_tv_modes |= BIT(tv_mode_property->values[i]);1253 1254	if (((supported_tv_modes & ntsc_modes) &&1255	     (supported_tv_modes & pal_modes)) ||1256	    (supported_tv_modes & BIT(DRM_MODE_TV_MODE_MONOCHROME))) {1257		uint64_t default_mode;1258 1259		if (drm_object_property_get_default_value(&connector->base,1260							  tv_mode_property,1261							  &default_mode))1262			return 0;1263 1264		if (cmdline->tv_mode_specified)1265			default_mode = cmdline->tv_mode;1266 1267		if (BIT(default_mode) & ntsc_modes) {1268			tv_modes[0] = DRM_MODE_TV_MODE_NTSC;1269			tv_modes[1] = DRM_MODE_TV_MODE_PAL;1270		} else {1271			tv_modes[0] = DRM_MODE_TV_MODE_PAL;1272			tv_modes[1] = DRM_MODE_TV_MODE_NTSC;1273		}1274	} else if (supported_tv_modes & ntsc_modes) {1275		tv_modes[0] = DRM_MODE_TV_MODE_NTSC;1276	} else if (supported_tv_modes & pal_modes) {1277		tv_modes[0] = DRM_MODE_TV_MODE_PAL;1278	} else {1279		return 0;1280	}1281 1282	for (i = 0; i < ARRAY_SIZE(tv_modes); i++) {1283		struct drm_display_mode *mode;1284 1285		if (tv_modes[i] == DRM_MODE_TV_MODE_NTSC)1286			mode = drm_mode_analog_ntsc_480i(dev);1287		else if (tv_modes[i] == DRM_MODE_TV_MODE_PAL)1288			mode = drm_mode_analog_pal_576i(dev);1289		else1290			break;1291		if (!mode)1292			return i;1293		if (!i)1294			mode->type |= DRM_MODE_TYPE_PREFERRED;1295		drm_mode_probed_add(connector, mode);1296	}1297 1298	return i;1299}1300EXPORT_SYMBOL(drm_connector_helper_tv_get_modes);1301 1302/**1303 * drm_connector_helper_detect_from_ddc - Read EDID and detect connector status.1304 * @connector: The connector1305 * @ctx: Acquire context1306 * @force: Perform screen-destructive operations, if necessary1307 *1308 * Detects the connector status by reading the EDID using drm_probe_ddc(),1309 * which requires connector->ddc to be set. Returns connector_status_connected1310 * on success or connector_status_disconnected on failure.1311 *1312 * Returns:1313 * The connector status as defined by enum drm_connector_status.1314 */1315int drm_connector_helper_detect_from_ddc(struct drm_connector *connector,1316					 struct drm_modeset_acquire_ctx *ctx,1317					 bool force)1318{1319	struct i2c_adapter *ddc = connector->ddc;1320 1321	if (!ddc)1322		return connector_status_unknown;1323 1324	if (drm_probe_ddc(ddc))1325		return connector_status_connected;1326 1327	return connector_status_disconnected;1328}1329EXPORT_SYMBOL(drm_connector_helper_detect_from_ddc);1330