diff options
| -rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_crtc_helper.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_edid.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_plane_helper.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 16 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_opregion.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_overlay.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_fb.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 1 | ||||
| -rw-r--r-- | include/drm/drm_crtc.h | 1 |
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 | } |
| 77 | EXPORT_SYMBOL(drm_modeset_unlock_all); | 81 | EXPORT_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 | } |
| 98 | EXPORT_SYMBOL(drm_warn_on_modeset_not_all_locked); | 103 | EXPORT_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 | ||
| 1893 | out: | 1899 | out: |
| 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); | |||
| 4640 | void drm_mode_config_init(struct drm_device *dev) | 4647 | void 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 | ||
