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) | |||
93 | struct drm_connector_list_iter conn_iter; | 93 | struct drm_connector_list_iter conn_iter; |
94 | struct drm_device *dev = encoder->dev; | 94 | struct drm_device *dev = encoder->dev; |
95 | 95 | ||
96 | WARN_ON(drm_drv_uses_atomic_modeset(dev)); | ||
97 | |||
96 | /* | 98 | /* |
97 | * We can expect this mutex to be locked if we are not panicking. | 99 | * We can expect this mutex to be locked if we are not panicking. |
98 | * Locking is currently fubar in the panic handler. | 100 | * Locking is currently fubar in the panic handler. |
@@ -131,6 +133,8 @@ bool drm_helper_crtc_in_use(struct drm_crtc *crtc) | |||
131 | struct drm_encoder *encoder; | 133 | struct drm_encoder *encoder; |
132 | struct drm_device *dev = crtc->dev; | 134 | struct drm_device *dev = crtc->dev; |
133 | 135 | ||
136 | WARN_ON(drm_drv_uses_atomic_modeset(dev)); | ||
137 | |||
134 | /* | 138 | /* |
135 | * We can expect this mutex to be locked if we are not panicking. | 139 | * We can expect this mutex to be locked if we are not panicking. |
136 | * Locking is currently fubar in the panic handler. | 140 | * Locking is currently fubar in the panic handler. |
@@ -212,8 +216,7 @@ static void __drm_helper_disable_unused_functions(struct drm_device *dev) | |||
212 | */ | 216 | */ |
213 | void drm_helper_disable_unused_functions(struct drm_device *dev) | 217 | void drm_helper_disable_unused_functions(struct drm_device *dev) |
214 | { | 218 | { |
215 | if (drm_core_check_feature(dev, DRIVER_ATOMIC)) | 219 | WARN_ON(drm_drv_uses_atomic_modeset(dev)); |
216 | DRM_ERROR("Called for atomic driver, this is not what you want.\n"); | ||
217 | 220 | ||
218 | drm_modeset_lock_all(dev); | 221 | drm_modeset_lock_all(dev); |
219 | __drm_helper_disable_unused_functions(dev); | 222 | __drm_helper_disable_unused_functions(dev); |
@@ -281,6 +284,8 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, | |||
281 | struct drm_encoder *encoder; | 284 | struct drm_encoder *encoder; |
282 | bool ret = true; | 285 | bool ret = true; |
283 | 286 | ||
287 | WARN_ON(drm_drv_uses_atomic_modeset(dev)); | ||
288 | |||
284 | drm_warn_on_modeset_not_all_locked(dev); | 289 | drm_warn_on_modeset_not_all_locked(dev); |
285 | 290 | ||
286 | saved_enabled = crtc->enabled; | 291 | saved_enabled = crtc->enabled; |
@@ -386,9 +391,8 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, | |||
386 | if (!encoder_funcs) | 391 | if (!encoder_funcs) |
387 | continue; | 392 | continue; |
388 | 393 | ||
389 | DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%d:%s]\n", | 394 | DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%s]\n", |
390 | encoder->base.id, encoder->name, | 395 | encoder->base.id, encoder->name, mode->name); |
391 | mode->base.id, mode->name); | ||
392 | if (encoder_funcs->mode_set) | 396 | if (encoder_funcs->mode_set) |
393 | encoder_funcs->mode_set(encoder, mode, adjusted_mode); | 397 | encoder_funcs->mode_set(encoder, mode, adjusted_mode); |
394 | 398 | ||
@@ -540,6 +544,9 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set, | |||
540 | 544 | ||
541 | crtc_funcs = set->crtc->helper_private; | 545 | crtc_funcs = set->crtc->helper_private; |
542 | 546 | ||
547 | dev = set->crtc->dev; | ||
548 | WARN_ON(drm_drv_uses_atomic_modeset(dev)); | ||
549 | |||
543 | if (!set->mode) | 550 | if (!set->mode) |
544 | set->fb = NULL; | 551 | set->fb = NULL; |
545 | 552 | ||
@@ -555,8 +562,6 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set, | |||
555 | return 0; | 562 | return 0; |
556 | } | 563 | } |
557 | 564 | ||
558 | dev = set->crtc->dev; | ||
559 | |||
560 | drm_warn_on_modeset_not_all_locked(dev); | 565 | drm_warn_on_modeset_not_all_locked(dev); |
561 | 566 | ||
562 | /* | 567 | /* |
@@ -875,6 +880,8 @@ int drm_helper_connector_dpms(struct drm_connector *connector, int mode) | |||
875 | struct drm_crtc *crtc = encoder ? encoder->crtc : NULL; | 880 | struct drm_crtc *crtc = encoder ? encoder->crtc : NULL; |
876 | int old_dpms, encoder_dpms = DRM_MODE_DPMS_OFF; | 881 | int old_dpms, encoder_dpms = DRM_MODE_DPMS_OFF; |
877 | 882 | ||
883 | WARN_ON(drm_drv_uses_atomic_modeset(connector->dev)); | ||
884 | |||
878 | if (mode == connector->dpms) | 885 | if (mode == connector->dpms) |
879 | return 0; | 886 | return 0; |
880 | 887 | ||
@@ -946,6 +953,8 @@ void drm_helper_resume_force_mode(struct drm_device *dev) | |||
946 | int encoder_dpms; | 953 | int encoder_dpms; |
947 | bool ret; | 954 | bool ret; |
948 | 955 | ||
956 | WARN_ON(drm_drv_uses_atomic_modeset(dev)); | ||
957 | |||
949 | drm_modeset_lock_all(dev); | 958 | drm_modeset_lock_all(dev); |
950 | drm_for_each_crtc(crtc, dev) { | 959 | drm_for_each_crtc(crtc, dev) { |
951 | 960 | ||
@@ -984,3 +993,38 @@ void drm_helper_resume_force_mode(struct drm_device *dev) | |||
984 | drm_modeset_unlock_all(dev); | 993 | drm_modeset_unlock_all(dev); |
985 | } | 994 | } |
986 | EXPORT_SYMBOL(drm_helper_resume_force_mode); | 995 | EXPORT_SYMBOL(drm_helper_resume_force_mode); |
996 | |||
997 | /** | ||
998 | * drm_helper_force_disable_all - Forcibly turn off all enabled CRTCs | ||
999 | * @dev: DRM device whose CRTCs to turn off | ||
1000 | * | ||
1001 | * Drivers may want to call this on unload to ensure that all displays are | ||
1002 | * unlit and the GPU is in a consistent, low power state. Takes modeset locks. | ||
1003 | * | ||
1004 | * Note: This should only be used by non-atomic legacy drivers. For an atomic | ||
1005 | * version look at drm_atomic_helper_shutdown(). | ||
1006 | * | ||
1007 | * Returns: | ||
1008 | * Zero on success, error code on failure. | ||
1009 | */ | ||
1010 | int drm_helper_force_disable_all(struct drm_device *dev) | ||
1011 | { | ||
1012 | struct drm_crtc *crtc; | ||
1013 | int ret = 0; | ||
1014 | |||
1015 | drm_modeset_lock_all(dev); | ||
1016 | drm_for_each_crtc(crtc, dev) | ||
1017 | if (crtc->enabled) { | ||
1018 | struct drm_mode_set set = { | ||
1019 | .crtc = crtc, | ||
1020 | }; | ||
1021 | |||
1022 | ret = drm_mode_set_config_internal(&set); | ||
1023 | if (ret) | ||
1024 | goto out; | ||
1025 | } | ||
1026 | out: | ||
1027 | drm_modeset_unlock_all(dev); | ||
1028 | return ret; | ||
1029 | } | ||
1030 | EXPORT_SYMBOL(drm_helper_force_disable_all); | ||