diff options
Diffstat (limited to 'drivers/gpu/drm/drm_crtc_helper.c')
| -rw-r--r-- | drivers/gpu/drm/drm_crtc_helper.c | 58 | 
1 files changed, 51 insertions, 7 deletions
| diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index a3c81850e755..747661f63fbb 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c @@ -93,6 +93,8 @@ bool drm_helper_encoder_in_use(struct drm_encoder *encoder)  	struct drm_connector_list_iter conn_iter;  	struct drm_device *dev = encoder->dev; +	WARN_ON(drm_drv_uses_atomic_modeset(dev)); +  	/*  	 * We can expect this mutex to be locked if we are not panicking.  	 * Locking is currently fubar in the panic handler. @@ -131,6 +133,8 @@ bool drm_helper_crtc_in_use(struct drm_crtc *crtc)  	struct drm_encoder *encoder;  	struct drm_device *dev = crtc->dev; +	WARN_ON(drm_drv_uses_atomic_modeset(dev)); +  	/*  	 * We can expect this mutex to be locked if we are not panicking.  	 * Locking is currently fubar in the panic handler. @@ -212,8 +216,7 @@ static void __drm_helper_disable_unused_functions(struct drm_device *dev)   */  void drm_helper_disable_unused_functions(struct drm_device *dev)  { -	if (drm_core_check_feature(dev, DRIVER_ATOMIC)) -		DRM_ERROR("Called for atomic driver, this is not what you want.\n"); +	WARN_ON(drm_drv_uses_atomic_modeset(dev));  	drm_modeset_lock_all(dev);  	__drm_helper_disable_unused_functions(dev); @@ -281,6 +284,8 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,  	struct drm_encoder *encoder;  	bool ret = true; +	WARN_ON(drm_drv_uses_atomic_modeset(dev)); +  	drm_warn_on_modeset_not_all_locked(dev);  	saved_enabled = crtc->enabled; @@ -386,9 +391,8 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,  		if (!encoder_funcs)  			continue; -		DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%d:%s]\n", -			encoder->base.id, encoder->name, -			mode->base.id, mode->name); +		DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%s]\n", +			encoder->base.id, encoder->name, mode->name);  		if (encoder_funcs->mode_set)  			encoder_funcs->mode_set(encoder, mode, adjusted_mode); @@ -540,6 +544,9 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set,  	crtc_funcs = set->crtc->helper_private; +	dev = set->crtc->dev; +	WARN_ON(drm_drv_uses_atomic_modeset(dev)); +  	if (!set->mode)  		set->fb = NULL; @@ -555,8 +562,6 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set,  		return 0;  	} -	dev = set->crtc->dev; -  	drm_warn_on_modeset_not_all_locked(dev);  	/* @@ -875,6 +880,8 @@ int drm_helper_connector_dpms(struct drm_connector *connector, int mode)  	struct drm_crtc *crtc = encoder ? encoder->crtc : NULL;  	int old_dpms, encoder_dpms = DRM_MODE_DPMS_OFF; +	WARN_ON(drm_drv_uses_atomic_modeset(connector->dev)); +  	if (mode == connector->dpms)  		return 0; @@ -946,6 +953,8 @@ void drm_helper_resume_force_mode(struct drm_device *dev)  	int encoder_dpms;  	bool ret; +	WARN_ON(drm_drv_uses_atomic_modeset(dev)); +  	drm_modeset_lock_all(dev);  	drm_for_each_crtc(crtc, dev) { @@ -984,3 +993,38 @@ void drm_helper_resume_force_mode(struct drm_device *dev)  	drm_modeset_unlock_all(dev);  }  EXPORT_SYMBOL(drm_helper_resume_force_mode); + +/** + * drm_helper_force_disable_all - Forcibly turn off all enabled CRTCs + * @dev: DRM device whose CRTCs to turn off + * + * Drivers may want to call this on unload to ensure that all displays are + * unlit and the GPU is in a consistent, low power state. Takes modeset locks. + * + * Note: This should only be used by non-atomic legacy drivers. For an atomic + * version look at drm_atomic_helper_shutdown(). + * + * Returns: + * Zero on success, error code on failure. + */ +int drm_helper_force_disable_all(struct drm_device *dev) +{ +	struct drm_crtc *crtc; +	int ret = 0; + +	drm_modeset_lock_all(dev); +	drm_for_each_crtc(crtc, dev) +		if (crtc->enabled) { +			struct drm_mode_set set = { +				.crtc = crtc, +			}; + +			ret = drm_mode_set_config_internal(&set); +			if (ret) +				goto out; +		} +out: +	drm_modeset_unlock_all(dev); +	return ret; +} +EXPORT_SYMBOL(drm_helper_force_disable_all); | 
