aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_crtc_helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_crtc_helper.c')
-rw-r--r--drivers/gpu/drm/drm_crtc_helper.c58
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 */
213void drm_helper_disable_unused_functions(struct drm_device *dev) 217void 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}
986EXPORT_SYMBOL(drm_helper_resume_force_mode); 995EXPORT_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 */
1010int 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 }
1026out:
1027 drm_modeset_unlock_all(dev);
1028 return ret;
1029}
1030EXPORT_SYMBOL(drm_helper_force_disable_all);