aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_crtc.c8
-rw-r--r--drivers/gpu/drm/drm_crtc_helper.c2
-rw-r--r--drivers/gpu/drm/drm_edid.c2
-rw-r--r--drivers/gpu/drm/drm_plane_helper.c7
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c4
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c6
-rw-r--r--drivers/gpu/drm/i915/intel_display.c16
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c15
-rw-r--r--drivers/gpu/drm/i915/intel_opregion.c4
-rw-r--r--drivers/gpu/drm/i915/intel_overlay.c4
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c8
-rw-r--r--drivers/gpu/drm/omapdrm/omap_fb.c1
-rw-r--r--drivers/gpu/drm/radeon/radeon_connectors.c1
-rw-r--r--include/drm/drm_crtc.h1
14 files changed, 54 insertions, 25 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 5b3e2920c376..f3b98d4b6f46 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -54,6 +54,8 @@ void drm_modeset_lock_all(struct drm_device *dev)
54 54
55 mutex_lock(&dev->mode_config.mutex); 55 mutex_lock(&dev->mode_config.mutex);
56 56
57 mutex_lock(&dev->mode_config.connection_mutex);
58
57 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) 59 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
58 mutex_lock_nest_lock(&crtc->mutex, &dev->mode_config.mutex); 60 mutex_lock_nest_lock(&crtc->mutex, &dev->mode_config.mutex);
59} 61}
@@ -72,6 +74,8 @@ void drm_modeset_unlock_all(struct drm_device *dev)
72 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) 74 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
73 mutex_unlock(&crtc->mutex); 75 mutex_unlock(&crtc->mutex);
74 76
77 mutex_unlock(&dev->mode_config.connection_mutex);
78
75 mutex_unlock(&dev->mode_config.mutex); 79 mutex_unlock(&dev->mode_config.mutex);
76} 80}
77EXPORT_SYMBOL(drm_modeset_unlock_all); 81EXPORT_SYMBOL(drm_modeset_unlock_all);
@@ -93,6 +97,7 @@ void drm_warn_on_modeset_not_all_locked(struct drm_device *dev)
93 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) 97 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
94 WARN_ON(!mutex_is_locked(&crtc->mutex)); 98 WARN_ON(!mutex_is_locked(&crtc->mutex));
95 99
100 WARN_ON(!mutex_is_locked(&dev->mode_config.connection_mutex));
96 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); 101 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
97} 102}
98EXPORT_SYMBOL(drm_warn_on_modeset_not_all_locked); 103EXPORT_SYMBOL(drm_warn_on_modeset_not_all_locked);
@@ -1793,6 +1798,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
1793 DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); 1798 DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id);
1794 1799
1795 mutex_lock(&dev->mode_config.mutex); 1800 mutex_lock(&dev->mode_config.mutex);
1801 mutex_lock(&dev->mode_config.connection_mutex);
1796 1802
1797 connector = drm_connector_find(dev, out_resp->connector_id); 1803 connector = drm_connector_find(dev, out_resp->connector_id);
1798 if (!connector) { 1804 if (!connector) {
@@ -1891,6 +1897,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
1891 out_resp->count_encoders = encoders_count; 1897 out_resp->count_encoders = encoders_count;
1892 1898
1893out: 1899out:
1900 mutex_unlock(&dev->mode_config.connection_mutex);
1894 mutex_unlock(&dev->mode_config.mutex); 1901 mutex_unlock(&dev->mode_config.mutex);
1895 1902
1896 return ret; 1903 return ret;
@@ -4640,6 +4647,7 @@ EXPORT_SYMBOL(drm_format_vert_chroma_subsampling);
4640void drm_mode_config_init(struct drm_device *dev) 4647void drm_mode_config_init(struct drm_device *dev)
4641{ 4648{
4642 mutex_init(&dev->mode_config.mutex); 4649 mutex_init(&dev->mode_config.mutex);
4650 mutex_init(&dev->mode_config.connection_mutex);
4643 mutex_init(&dev->mode_config.idr_mutex); 4651 mutex_init(&dev->mode_config.idr_mutex);
4644 mutex_init(&dev->mode_config.fb_lock); 4652 mutex_init(&dev->mode_config.fb_lock);
4645 INIT_LIST_HEAD(&dev->mode_config.fb_list); 4653 INIT_LIST_HEAD(&dev->mode_config.fb_list);
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index 231c9433341f..b55d27c872f6 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -89,6 +89,8 @@ bool drm_helper_encoder_in_use(struct drm_encoder *encoder)
89 struct drm_device *dev = encoder->dev; 89 struct drm_device *dev = encoder->dev;
90 90
91 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); 91 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
92 WARN_ON(!mutex_is_locked(&dev->mode_config.connection_mutex));
93
92 list_for_each_entry(connector, &dev->mode_config.connector_list, head) 94 list_for_each_entry(connector, &dev->mode_config.connector_list, head)
93 if (connector->encoder == encoder) 95 if (connector->encoder == encoder)
94 return true; 96 return true;
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 085e5550aac5..7be21781d3bd 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3304,6 +3304,8 @@ struct drm_connector *drm_select_eld(struct drm_encoder *encoder,
3304 struct drm_connector *connector; 3304 struct drm_connector *connector;
3305 struct drm_device *dev = encoder->dev; 3305 struct drm_device *dev = encoder->dev;
3306 3306
3307 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
3308
3307 list_for_each_entry(connector, &dev->mode_config.connector_list, head) 3309 list_for_each_entry(connector, &dev->mode_config.connector_list, head)
3308 if (connector->encoder == encoder && connector->eld[0]) 3310 if (connector->encoder == encoder && connector->eld[0])
3309 return connector; 3311 return connector;
diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
index d966afa7ecae..458d9bf09209 100644
--- a/drivers/gpu/drm/drm_plane_helper.c
+++ b/drivers/gpu/drm/drm_plane_helper.c
@@ -54,6 +54,13 @@ static int get_connectors_for_crtc(struct drm_crtc *crtc,
54 struct drm_connector *connector; 54 struct drm_connector *connector;
55 int count = 0; 55 int count = 0;
56 56
57 /*
58 * Note: Once we change the plane hooks to more fine-grained locking we
59 * need to grab the connection_mutex here to be able to make these
60 * checks.
61 */
62 WARN_ON(!mutex_is_locked(&dev->mode_config.connection_mutex));
63
57 list_for_each_entry(connector, &dev->mode_config.connector_list, head) 64 list_for_each_entry(connector, &dev->mode_config.connector_list, head)
58 if (connector->encoder && connector->encoder->crtc == crtc) { 65 if (connector->encoder && connector->encoder->crtc == crtc) {
59 if (connector_list != NULL && count < num_connectors) 66 if (connector_list != NULL && count < num_connectors)
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 36f4c15f538b..169fc2d8c554 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2609,7 +2609,7 @@ static int i9xx_pipe_crc_auto_source(struct drm_device *dev, enum pipe pipe,
2609 2609
2610 *source = INTEL_PIPE_CRC_SOURCE_PIPE; 2610 *source = INTEL_PIPE_CRC_SOURCE_PIPE;
2611 2611
2612 mutex_lock(&dev->mode_config.mutex); 2612 drm_modeset_lock_all(dev);
2613 list_for_each_entry(encoder, &dev->mode_config.encoder_list, 2613 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
2614 base.head) { 2614 base.head) {
2615 if (!encoder->base.crtc) 2615 if (!encoder->base.crtc)
@@ -2645,7 +2645,7 @@ static int i9xx_pipe_crc_auto_source(struct drm_device *dev, enum pipe pipe,
2645 break; 2645 break;
2646 } 2646 }
2647 } 2647 }
2648 mutex_unlock(&dev->mode_config.mutex); 2648 drm_modeset_unlock_all(dev);
2649 2649
2650 return ret; 2650 return ret;
2651} 2651}
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 4619c9e51907..5b5b82c3f570 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -533,13 +533,11 @@ static int i915_drm_freeze(struct drm_device *dev)
533 * Disable CRTCs directly since we want to preserve sw state 533 * Disable CRTCs directly since we want to preserve sw state
534 * for _thaw. 534 * for _thaw.
535 */ 535 */
536 mutex_lock(&dev->mode_config.mutex); 536 drm_modeset_lock_all(dev);
537 for_each_crtc(dev, crtc) { 537 for_each_crtc(dev, crtc) {
538 mutex_lock(&crtc->mutex);
539 dev_priv->display.crtc_disable(crtc); 538 dev_priv->display.crtc_disable(crtc);
540 mutex_unlock(&crtc->mutex);
541 } 539 }
542 mutex_unlock(&dev->mode_config.mutex); 540 drm_modeset_unlock_all(dev);
543 541
544 intel_modeset_suspend_hw(dev); 542 intel_modeset_suspend_hw(dev);
545 } 543 }
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index e80b2917e3cb..c2976ade823f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -8323,6 +8323,8 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector,
8323 connector->base.id, connector->name, 8323 connector->base.id, connector->name,
8324 encoder->base.id, encoder->name); 8324 encoder->base.id, encoder->name);
8325 8325