diff options
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/Makefile | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 85 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_crtc_helper.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_modeset_lock.c | 247 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_plane_helper.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_crt.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 56 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 6 | ||||
-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/i915/intel_sprite.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_tv.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_crtc.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 8 |
17 files changed, 390 insertions, 76 deletions
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index 863db8415c22..dd2ba4269740 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile | |||
@@ -13,7 +13,8 @@ drm-y := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \ | |||
13 | drm_crtc.o drm_modes.o drm_edid.o \ | 13 | drm_crtc.o drm_modes.o drm_edid.o \ |
14 | drm_info.o drm_debugfs.o drm_encoder_slave.o \ | 14 | drm_info.o drm_debugfs.o drm_encoder_slave.o \ |
15 | drm_trace_points.o drm_global.o drm_prime.o \ | 15 | drm_trace_points.o drm_global.o drm_prime.o \ |
16 | drm_rect.o drm_vma_manager.o drm_flip_work.o | 16 | drm_rect.o drm_vma_manager.o drm_flip_work.o \ |
17 | drm_modeset_lock.o | ||
17 | 18 | ||
18 | drm-$(CONFIG_COMPAT) += drm_ioc32.o | 19 | drm-$(CONFIG_COMPAT) += drm_ioc32.o |
19 | drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o | 20 | drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o |
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index f3b98d4b6f46..43735f38cd17 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <drm/drm_crtc.h> | 37 | #include <drm/drm_crtc.h> |
38 | #include <drm/drm_edid.h> | 38 | #include <drm/drm_edid.h> |
39 | #include <drm/drm_fourcc.h> | 39 | #include <drm/drm_fourcc.h> |
40 | #include <drm/drm_modeset_lock.h> | ||
40 | 41 | ||
41 | #include "drm_crtc_internal.h" | 42 | #include "drm_crtc_internal.h" |
42 | 43 | ||
@@ -50,14 +51,42 @@ | |||
50 | */ | 51 | */ |
51 | void drm_modeset_lock_all(struct drm_device *dev) | 52 | void drm_modeset_lock_all(struct drm_device *dev) |
52 | { | 53 | { |
53 | struct drm_crtc *crtc; | 54 | struct drm_mode_config *config = &dev->mode_config; |
55 | struct drm_modeset_acquire_ctx *ctx; | ||
56 | int ret; | ||
54 | 57 | ||
55 | mutex_lock(&dev->mode_config.mutex); | 58 | ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); |
59 | if (WARN_ON(!ctx)) | ||
60 | return; | ||
56 | 61 | ||
57 | mutex_lock(&dev->mode_config.connection_mutex); | 62 | mutex_lock(&config->mutex); |
58 | 63 | ||
59 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) | 64 | drm_modeset_acquire_init(ctx, 0); |
60 | mutex_lock_nest_lock(&crtc->mutex, &dev->mode_config.mutex); | 65 | |
66 | retry: | ||
67 | ret = drm_modeset_lock(&config->connection_mutex, ctx); | ||
68 | if (ret) | ||
69 | goto fail; | ||
70 | ret = drm_modeset_lock_all_crtcs(dev, ctx); | ||
71 | if (ret) | ||
72 | goto fail; | ||
73 | |||
74 | WARN_ON(config->acquire_ctx); | ||
75 | |||
76 | /* now we hold the locks, so now that it is safe, stash the | ||
77 | * ctx for drm_modeset_unlock_all(): | ||
78 | */ | ||
79 | config->acquire_ctx = ctx; | ||
80 | |||
81 | drm_warn_on_modeset_not_all_locked(dev); | ||
82 | |||
83 | return; | ||
84 | |||
85 | fail: | ||
86 | if (ret == -EDEADLK) { | ||
87 | drm_modeset_backoff(ctx); | ||
88 | goto retry; | ||
89 | } | ||
61 | } | 90 | } |
62 | EXPORT_SYMBOL(drm_modeset_lock_all); | 91 | EXPORT_SYMBOL(drm_modeset_lock_all); |
63 | 92 | ||
@@ -69,12 +98,17 @@ EXPORT_SYMBOL(drm_modeset_lock_all); | |||
69 | */ | 98 | */ |
70 | void drm_modeset_unlock_all(struct drm_device *dev) | 99 | void drm_modeset_unlock_all(struct drm_device *dev) |
71 | { | 100 | { |
72 | struct drm_crtc *crtc; | 101 | struct drm_mode_config *config = &dev->mode_config; |
102 | struct drm_modeset_acquire_ctx *ctx = config->acquire_ctx; | ||
73 | 103 | ||
74 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) | 104 | if (WARN_ON(!ctx)) |
75 | mutex_unlock(&crtc->mutex); | 105 | return; |
106 | |||
107 | config->acquire_ctx = NULL; | ||
108 | drm_modeset_drop_locks(ctx); | ||
109 | drm_modeset_acquire_fini(ctx); | ||
76 | 110 | ||
77 | mutex_unlock(&dev->mode_config.connection_mutex); | 111 | kfree(ctx); |
78 | 112 | ||
79 | mutex_unlock(&dev->mode_config.mutex); | 113 | mutex_unlock(&dev->mode_config.mutex); |
80 | } | 114 | } |
@@ -95,9 +129,9 @@ void drm_warn_on_modeset_not_all_locked(struct drm_device *dev) | |||
95 | return; | 129 | return; |
96 | 130 | ||
97 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) | 131 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) |
98 | WARN_ON(!mutex_is_locked(&crtc->mutex)); | 132 | WARN_ON(!drm_modeset_is_locked(&crtc->mutex)); |
99 | 133 | ||
100 | WARN_ON(!mutex_is_locked(&dev->mode_config.connection_mutex)); | 134 | WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); |
101 | WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); | 135 | WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); |
102 | } | 136 | } |
103 | EXPORT_SYMBOL(drm_warn_on_modeset_not_all_locked); | 137 | EXPORT_SYMBOL(drm_warn_on_modeset_not_all_locked); |
@@ -671,6 +705,8 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb) | |||
671 | } | 705 | } |
672 | EXPORT_SYMBOL(drm_framebuffer_remove); | 706 | EXPORT_SYMBOL(drm_framebuffer_remove); |
673 | 707 | ||
708 | DEFINE_WW_CLASS(crtc_ww_class); | ||
709 | |||
674 | /** | 710 | /** |
675 | * drm_crtc_init_with_planes - Initialise a new CRTC object with | 711 | * drm_crtc_init_with_planes - Initialise a new CRTC object with |
676 | * specified primary and cursor planes. | 712 | * specified primary and cursor planes. |
@@ -690,6 +726,7 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, | |||
690 | void *cursor, | 726 | void *cursor, |
691 | const struct drm_crtc_funcs *funcs) | 727 | const struct drm_crtc_funcs *funcs) |
692 | { | 728 | { |
729 | struct drm_mode_config *config = &dev->mode_config; | ||
693 | int ret; | 730 | int ret; |
694 | 731 | ||
695 | crtc->dev = dev; | 732 | crtc->dev = dev; |
@@ -697,8 +734,9 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, | |||
697 | crtc->invert_dimensions = false; | 734 | crtc->invert_dimensions = false; |
698 | 735 | ||
699 | drm_modeset_lock_all(dev); | 736 | drm_modeset_lock_all(dev); |
700 | mutex_init(&crtc->mutex); | 737 | drm_modeset_lock_init(&crtc->mutex); |
701 | mutex_lock_nest_lock(&crtc->mutex, &dev->mode_config.mutex); | 738 | /* dropped by _unlock_all(): */ |
739 | drm_modeset_lock(&crtc->mutex, config->acquire_ctx); | ||
702 | 740 | ||
703 | ret = drm_mode_object_get(dev, &crtc->base, DRM_MODE_OBJECT_CRTC); | 741 | ret = drm_mode_object_get(dev, &crtc->base, DRM_MODE_OBJECT_CRTC); |
704 | if (ret) | 742 | if (ret) |
@@ -706,8 +744,8 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, | |||
706 | 744 | ||
707 | crtc->base.properties = &crtc->properties; | 745 | crtc->base.properties = &crtc->properties; |
708 | 746 | ||
709 | list_add_tail(&crtc->head, &dev->mode_config.crtc_list); | 747 | list_add_tail(&crtc->head, &config->crtc_list); |
710 | dev->mode_config.num_crtc++; | 748 | config->num_crtc++; |
711 | 749 | ||
712 | crtc->primary = primary; | 750 | crtc->primary = primary; |
713 | if (primary) | 751 | if (primary) |
@@ -735,6 +773,8 @@ void drm_crtc_cleanup(struct drm_crtc *crtc) | |||
735 | kfree(crtc->gamma_store); | 773 | kfree(crtc->gamma_store); |
736 | crtc->gamma_store = NULL; | 774 | crtc->gamma_store = NULL; |
737 | 775 | ||
776 | drm_modeset_lock_fini(&crtc->mutex); | ||
777 | |||
738 | drm_mode_object_put(dev, &crtc->base); | 778 | drm_mode_object_put(dev, &crtc->base); |
739 | list_del(&crtc->head); | 779 | list_del(&crtc->head); |
740 | dev->mode_config.num_crtc--; | 780 | dev->mode_config.num_crtc--; |
@@ -1798,7 +1838,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, | |||
1798 | DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); | 1838 | DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); |
1799 | 1839 | ||
1800 | mutex_lock(&dev->mode_config.mutex); | 1840 | mutex_lock(&dev->mode_config.mutex); |
1801 | mutex_lock(&dev->mode_config.connection_mutex); | 1841 | drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); |
1802 | 1842 | ||
1803 | connector = drm_connector_find(dev, out_resp->connector_id); | 1843 | connector = drm_connector_find(dev, out_resp->connector_id); |
1804 | if (!connector) { | 1844 | if (!connector) { |
@@ -1897,7 +1937,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, | |||
1897 | out_resp->count_encoders = encoders_count; | 1937 | out_resp->count_encoders = encoders_count; |
1898 | 1938 | ||
1899 | out: | 1939 | out: |
1900 | mutex_unlock(&dev->mode_config.connection_mutex); | 1940 | drm_modeset_unlock(&dev->mode_config.connection_mutex); |
1901 | mutex_unlock(&dev->mode_config.mutex); | 1941 | mutex_unlock(&dev->mode_config.mutex); |
1902 | 1942 | ||
1903 | return ret; | 1943 | return ret; |
@@ -2481,7 +2521,7 @@ static int drm_mode_cursor_common(struct drm_device *dev, | |||
2481 | return -ENOENT; | 2521 | return -ENOENT; |
2482 | } | 2522 | } |
2483 | 2523 | ||
2484 | mutex_lock(&crtc->mutex); | 2524 | drm_modeset_lock(&crtc->mutex, NULL); |
2485 | if (req->flags & DRM_MODE_CURSOR_BO) { | 2525 | if (req->flags & DRM_MODE_CURSOR_BO) { |
2486 | if (!crtc->funcs->cursor_set && !crtc->funcs->cursor_set2) { | 2526 | if (!crtc->funcs->cursor_set && !crtc->funcs->cursor_set2) { |
2487 | ret = -ENXIO; | 2527 | ret = -ENXIO; |
@@ -2505,7 +2545,7 @@ static int drm_mode_cursor_common(struct drm_device *dev, | |||
2505 | } | 2545 | } |
2506 | } | 2546 | } |
2507 | out: | 2547 | out: |
2508 | mutex_unlock(&crtc->mutex); | 2548 | drm_modeset_unlock(&crtc->mutex); |
2509 | 2549 | ||
2510 | return ret; | 2550 | return ret; |
2511 | 2551 | ||
@@ -4198,7 +4238,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, | |||
4198 | if (!crtc) | 4238 | if (!crtc) |
4199 | return -ENOENT; | 4239 | return -ENOENT; |
4200 | 4240 | ||
4201 | mutex_lock(&crtc->mutex); | 4241 | drm_modeset_lock(&crtc->mutex, NULL); |
4202 | if (crtc->primary->fb == NULL) { | 4242 | if (crtc->primary->fb == NULL) { |
4203 | /* The framebuffer is currently unbound, presumably | 4243 | /* The framebuffer is currently unbound, presumably |
4204 | * due to a hotplug event, that userspace has not | 4244 | * due to a hotplug event, that userspace has not |
@@ -4282,7 +4322,7 @@ out: | |||
4282 | drm_framebuffer_unreference(fb); | 4322 | drm_framebuffer_unreference(fb); |
4283 | if (old_fb) | 4323 | if (old_fb) |
4284 | drm_framebuffer_unreference(old_fb); | 4324 | drm_framebuffer_unreference(old_fb); |
4285 | mutex_unlock(&crtc->mutex); | 4325 | drm_modeset_unlock(&crtc->mutex); |
4286 | 4326 | ||
4287 | return ret; | 4327 | return ret; |
4288 | } | 4328 | } |
@@ -4647,7 +4687,7 @@ EXPORT_SYMBOL(drm_format_vert_chroma_subsampling); | |||
4647 | void drm_mode_config_init(struct drm_device *dev) | 4687 | void drm_mode_config_init(struct drm_device *dev) |
4648 | { | 4688 | { |
4649 | mutex_init(&dev->mode_config.mutex); | 4689 | mutex_init(&dev->mode_config.mutex); |
4650 | mutex_init(&dev->mode_config.connection_mutex); | 4690 | drm_modeset_lock_init(&dev->mode_config.connection_mutex); |
4651 | mutex_init(&dev->mode_config.idr_mutex); | 4691 | mutex_init(&dev->mode_config.idr_mutex); |
4652 | mutex_init(&dev->mode_config.fb_lock); | 4692 | mutex_init(&dev->mode_config.fb_lock); |
4653 | INIT_LIST_HEAD(&dev->mode_config.fb_list); | 4693 | INIT_LIST_HEAD(&dev->mode_config.fb_list); |
@@ -4747,5 +4787,6 @@ void drm_mode_config_cleanup(struct drm_device *dev) | |||
4747 | } | 4787 | } |
4748 | 4788 | ||
4749 | idr_destroy(&dev->mode_config.crtc_idr); | 4789 | idr_destroy(&dev->mode_config.crtc_idr); |
4790 | drm_modeset_lock_fini(&dev->mode_config.connection_mutex); | ||
4750 | } | 4791 | } |
4751 | EXPORT_SYMBOL(drm_mode_config_cleanup); | 4792 | EXPORT_SYMBOL(drm_mode_config_cleanup); |
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index b55d27c872f6..eb1c062e04b2 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c | |||
@@ -89,8 +89,7 @@ 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)); | 92 | WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); |
93 | |||
94 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) | 93 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) |
95 | if (connector->encoder == encoder) | 94 | if (connector->encoder == encoder) |
96 | return true; | 95 | return true; |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 1ddc17464250..43329cee299f 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -331,6 +331,10 @@ static bool drm_fb_helper_force_kernel_mode(void) | |||
331 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) | 331 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) |
332 | continue; | 332 | continue; |
333 | 333 | ||
334 | /* NOTE: we use lockless flag below to avoid grabbing other | ||
335 | * modeset locks. So just trylock the underlying mutex | ||
336 | * directly: | ||
337 | */ | ||
334 | if (!mutex_trylock(&dev->mode_config.mutex)) { | 338 | if (!mutex_trylock(&dev->mode_config.mutex)) { |
335 | error = true; | 339 | error = true; |
336 | continue; | 340 | continue; |
diff --git a/drivers/gpu/drm/drm_modeset_lock.c b/drivers/gpu/drm/drm_modeset_lock.c new file mode 100644 index 000000000000..7c2497dea1e9 --- /dev/null +++ b/drivers/gpu/drm/drm_modeset_lock.c | |||
@@ -0,0 +1,247 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2014 Red Hat | ||
3 | * Author: Rob Clark <robdclark@gmail.com> | ||
4 | * | ||
5 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
6 | * copy of this software and associated documentation files (the "Software"), | ||
7 | * to deal in the Software without restriction, including without limitation | ||
8 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
9 | * and/or sell copies of the Software, and to permit persons to whom the | ||
10 | * Software is furnished to do so, subject to the following conditions: | ||
11 | * | ||
12 | * The above copyright notice and this permission notice shall be included in | ||
13 | * all copies or substantial portions of the Software. | ||
14 | * | ||
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
18 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
19 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
20 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
21 | * OTHER DEALINGS IN THE SOFTWARE. | ||
22 | */ | ||
23 | |||
24 | #include <drm/drmP.h> | ||
25 | #include <drm/drm_crtc.h> | ||
26 | #include <drm/drm_modeset_lock.h> | ||
27 | |||
28 | /** | ||
29 | * DOC: kms locking | ||
30 | * | ||
31 | * As KMS moves toward more fine grained locking, and atomic ioctl where | ||
32 | * userspace can indirectly control locking order, it becomes necessary | ||
33 | * to use ww_mutex and acquire-contexts to avoid deadlocks. But because | ||
34 | * the locking is more distributed around the driver code, we want a bit | ||
35 | * of extra utility/tracking out of our acquire-ctx. This is provided | ||
36 | * by drm_modeset_lock / drm_modeset_acquire_ctx. | ||
37 | * | ||
38 | * For basic principles of ww_mutex, see: Documentation/ww-mutex-design.txt | ||
39 | * | ||
40 | * The basic usage pattern is to: | ||
41 | * | ||
42 | * drm_modeset_acquire_init(&ctx) | ||
43 | * retry: | ||
44 | * foreach (lock in random_ordered_set_of_locks) { | ||
45 | * ret = drm_modeset_lock(lock, &ctx) | ||
46 | * if (ret == -EDEADLK) { | ||
47 | * drm_modeset_backoff(&ctx); | ||
48 | * goto retry; | ||
49 | * } | ||
50 | * } | ||
51 | * | ||
52 | * ... do stuff ... | ||
53 | * | ||
54 | * drm_modeset_drop_locks(&ctx); | ||
55 | * drm_modeset_acquire_fini(&ctx); | ||
56 | */ | ||
57 | |||
58 | |||
59 | /** | ||
60 | * drm_modeset_acquire_init - initialize acquire context | ||
61 | * @ctx: the acquire context | ||
62 | * @flags: for future | ||
63 | */ | ||
64 | void drm_modeset_acquire_init(struct drm_modeset_acquire_ctx *ctx, | ||
65 | uint32_t flags) | ||
66 | { | ||
67 | ww_acquire_init(&ctx->ww_ctx, &crtc_ww_class); | ||
68 | INIT_LIST_HEAD(&ctx->locked); | ||
69 | } | ||
70 | EXPORT_SYMBOL(drm_modeset_acquire_init); | ||
71 | |||
72 | /** | ||
73 | * drm_modeset_acquire_fini - cleanup acquire context | ||
74 | * @ctx: the acquire context | ||
75 | */ | ||
76 | void drm_modeset_acquire_fini(struct drm_modeset_acquire_ctx *ctx) | ||
77 | { | ||
78 | ww_acquire_fini(&ctx->ww_ctx); | ||
79 | } | ||
80 | EXPORT_SYMBOL(drm_modeset_acquire_fini); | ||
81 | |||
82 | /** | ||
83 | * drm_modeset_drop_locks - drop all locks | ||
84 | * @ctx: the acquire context | ||
85 | * | ||
86 | * Drop all locks currently held against this acquire context. | ||
87 | */ | ||
88 | void drm_modeset_drop_locks(struct drm_modeset_acquire_ctx *ctx) | ||
89 | { | ||
90 | WARN_ON(ctx->contended); | ||
91 | while (!list_empty(&ctx->locked)) { | ||
92 | struct drm_modeset_lock *lock; | ||
93 | |||
94 | lock = list_first_entry(&ctx->locked, | ||
95 | struct drm_modeset_lock, head); | ||
96 | |||
97 | drm_modeset_unlock(lock); | ||
98 | } | ||
99 | } | ||
100 | EXPORT_SYMBOL(drm_modeset_drop_locks); | ||
101 | |||
102 | static inline int modeset_lock(struct drm_modeset_lock *lock, | ||
103 | struct drm_modeset_acquire_ctx *ctx, | ||
104 | bool interruptible, bool slow) | ||
105 | { | ||
106 | int ret; | ||
107 | |||
108 | WARN_ON(ctx->contended); | ||
109 | |||
110 | if (interruptible && slow) { | ||
111 | ret = ww_mutex_lock_slow_interruptible(&lock->mutex, &ctx->ww_ctx); | ||
112 | } else if (interruptible) { | ||
113 | ret = ww_mutex_lock_interruptible(&lock->mutex, &ctx->ww_ctx); | ||
114 | } else if (slow) { | ||
115 | ww_mutex_lock_slow(&lock->mutex, &ctx->ww_ctx); | ||
116 | ret = 0; | ||
117 | } else { | ||
118 | ret = ww_mutex_lock(&lock->mutex, &ctx->ww_ctx); | ||
119 | } | ||
120 | if (!ret) { | ||
121 | WARN_ON(!list_empty(&lock->head)); | ||
122 | list_add(&lock->head, &ctx->locked); | ||
123 | } else if (ret == -EALREADY) { | ||
124 | /* we already hold the lock.. this is fine. For atomic | ||
125 | * we will need to be able to drm_modeset_lock() things | ||
126 | * without having to keep track of what is already locked | ||
127 | * or not. | ||
128 | */ | ||
129 | ret = 0; | ||
130 | } else if (ret == -EDEADLK) { | ||
131 | ctx->contended = lock; | ||
132 | } | ||
133 | |||
134 | return ret; | ||
135 | } | ||
136 | |||
137 | static int modeset_backoff(struct drm_modeset_acquire_ctx *ctx, | ||
138 | bool interruptible) | ||
139 | { | ||
140 | struct drm_modeset_lock *contended = ctx->contended; | ||
141 | |||
142 | ctx->contended = NULL; | ||
143 | |||
144 | if (WARN_ON(!contended)) | ||
145 | return 0; | ||
146 | |||
147 | drm_modeset_drop_locks(ctx); | ||
148 | |||
149 | return modeset_lock(contended, ctx, interruptible, true); | ||
150 | } | ||
151 | |||
152 | /** | ||
153 | * drm_modeset_backoff - deadlock avoidance backoff | ||
154 | * @ctx: the acquire context | ||
155 | * | ||
156 | * If deadlock is detected (ie. drm_modeset_lock() returns -EDEADLK), | ||
157 | * you must call this function to drop all currently held locks and | ||
158 | * block until the contended lock becomes available. | ||
159 | */ | ||
160 | void drm_modeset_backoff(struct drm_modeset_acquire_ctx *ctx) | ||
161 | { | ||
162 | modeset_backoff(ctx, false); | ||
163 | } | ||
164 | EXPORT_SYMBOL(drm_modeset_backoff); | ||
165 | |||
166 | /** | ||
167 | * drm_modeset_backoff_interruptible - deadlock avoidance backoff | ||
168 | * @ctx: the acquire context | ||
169 | * | ||
170 | * Interruptible version of drm_modeset_backoff() | ||
171 | */ | ||
172 | int drm_modeset_backoff_interruptible(struct drm_modeset_acquire_ctx *ctx) | ||
173 | { | ||
174 | return modeset_backoff(ctx, true); | ||
175 | } | ||
176 | EXPORT_SYMBOL(drm_modeset_backoff_interruptible); | ||
177 | |||
178 | /** | ||
179 | * drm_modeset_lock - take modeset lock | ||
180 | * @lock: lock to take | ||
181 | * @ctx: acquire ctx | ||
182 | * | ||
183 | * If ctx is not NULL, then its ww acquire context is used and the | ||
184 | * lock will be tracked by the context and can be released by calling | ||
185 | * drm_modeset_drop_locks(). If -EDEADLK is returned, this means a | ||
186 | * deadlock scenario has been detected and it is an error to attempt | ||
187 | * to take any more locks without first calling drm_modeset_backoff(). | ||
188 | */ | ||
189 | int drm_modeset_lock(struct drm_modeset_lock *lock, | ||
190 | struct drm_modeset_acquire_ctx *ctx) | ||
191 | { | ||
192 | if (ctx) | ||
193 | return modeset_lock(lock, ctx, false, false); | ||
194 | |||
195 | ww_mutex_lock(&lock->mutex, NULL); | ||
196 | return 0; | ||
197 | } | ||
198 | EXPORT_SYMBOL(drm_modeset_lock); | ||
199 | |||
200 | /** | ||
201 | * drm_modeset_lock_interruptible - take modeset lock | ||
202 | * @lock: lock to take | ||
203 | * @ctx: acquire ctx | ||
204 | * | ||
205 | * Interruptible version of drm_modeset_lock() | ||
206 | */ | ||
207 | int drm_modeset_lock_interruptible(struct drm_modeset_lock *lock, | ||
208 | struct drm_modeset_acquire_ctx *ctx) | ||
209 | { | ||
210 | if (ctx) | ||
211 | return modeset_lock(lock, ctx, true, false); | ||
212 | |||
213 | return ww_mutex_lock_interruptible(&lock->mutex, NULL); | ||
214 | } | ||
215 | EXPORT_SYMBOL(drm_modeset_lock_interruptible); | ||
216 | |||
217 | /** | ||
218 | * drm_modeset_unlock - drop modeset lock | ||
219 | * @lock: lock to release | ||
220 | */ | ||
221 | void drm_modeset_unlock(struct drm_modeset_lock *lock) | ||
222 | { | ||
223 | list_del_init(&lock->head); | ||
224 | ww_mutex_unlock(&lock->mutex); | ||
225 | } | ||
226 | EXPORT_SYMBOL(drm_modeset_unlock); | ||
227 | |||
228 | /* Temporary.. until we have sufficiently fine grained locking, there | ||
229 | * are a couple scenarios where it is convenient to grab all crtc locks. | ||
230 | * It is planned to remove this: | ||
231 | */ | ||
232 | int drm_modeset_lock_all_crtcs(struct drm_device *dev, | ||
233 | struct drm_modeset_acquire_ctx *ctx) | ||
234 | { | ||
235 | struct drm_mode_config *config = &dev->mode_config; | ||
236 | struct drm_crtc *crtc; | ||
237 | int ret = 0; | ||
238 | |||
239 | list_for_each_entry(crtc, &config->crtc_list, head) { | ||
240 | ret = drm_modeset_lock(&crtc->mutex, ctx); | ||
241 | if (ret) | ||
242 | return ret; | ||
243 | } | ||
244 | |||
245 | return 0; | ||
246 | } | ||
247 | EXPORT_SYMBOL(drm_modeset_lock_all_crtcs); | ||
diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c index f3e0a23abf4e..1b15643b4586 100644 --- a/drivers/gpu/drm/drm_plane_helper.c +++ b/drivers/gpu/drm/drm_plane_helper.c | |||
@@ -60,7 +60,7 @@ static int get_connectors_for_crtc(struct drm_crtc *crtc, | |||
60 | * need to grab the connection_mutex here to be able to make these | 60 | * need to grab the connection_mutex here to be able to make these |
61 | * checks. | 61 | * checks. |
62 | */ | 62 | */ |
63 | WARN_ON(!mutex_is_locked(&dev->mode_config.connection_mutex)); | 63 | WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); |
64 | 64 | ||
65 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) | 65 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) |
66 | if (connector->encoder && connector->encoder->crtc == crtc) { | 66 | if (connector->encoder && connector->encoder->crtc == crtc) { |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 1fc91df58296..5a045d3bd77e 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
@@ -630,6 +630,7 @@ intel_crt_detect(struct drm_connector *connector, bool force) | |||
630 | enum intel_display_power_domain power_domain; | 630 | enum intel_display_power_domain power_domain; |
631 | enum drm_connector_status status; | 631 | enum drm_connector_status status; |
632 | struct intel_load_detect_pipe tmp; | 632 | struct intel_load_detect_pipe tmp; |
633 | struct drm_modeset_acquire_ctx ctx; | ||
633 | 634 | ||
634 | intel_runtime_pm_get(dev_priv); | 635 | intel_runtime_pm_get(dev_priv); |
635 | 636 | ||
@@ -673,12 +674,12 @@ intel_crt_detect(struct drm_connector *connector, bool force) | |||
673 | } | 674 | } |
674 | 675 | ||
675 | /* for pre-945g platforms use load detect */ | 676 | /* for pre-945g platforms use load detect */ |
676 | if (intel_get_load_detect_pipe(connector, NULL, &tmp)) { | 677 | if (intel_get_load_detect_pipe(connector, NULL, &tmp, &ctx)) { |
677 | if (intel_crt_detect_ddc(connector)) | 678 | if (intel_crt_detect_ddc(connector)) |
678 | status = connector_status_connected; | 679 | status = connector_status_connected; |
679 | else | 680 | else |
680 | status = intel_crt_load_detect(crt); | 681 | status = intel_crt_load_detect(crt); |
681 | intel_release_load_detect_pipe(connector, &tmp); | 682 | intel_release_load_detect_pipe(connector, &tmp, &ctx); |
682 | } else | 683 | } else |
683 | status = connector_status_unknown; | 684 | status = connector_status_unknown; |
684 | 685 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index c2976ade823f..1ce4ad4626e4 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -2576,7 +2576,7 @@ void intel_display_handle_reset(struct drm_device *dev) | |||
2576 | for_each_crtc(dev, crtc) { | 2576 | for_each_crtc(dev, crtc) { |
2577 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 2577 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
2578 | 2578 | ||
2579 | mutex_lock(&crtc->mutex); | 2579 | drm_modeset_lock(&crtc->mutex, NULL); |
2580 | /* | 2580 | /* |
2581 | * FIXME: Once we have proper support for primary planes (and | 2581 | * FIXME: Once we have proper support for primary planes (and |
2582 | * disabling them without disabling the entire crtc) allow again | 2582 | * disabling them without disabling the entire crtc) allow again |
@@ -2587,7 +2587,7 @@ void intel_display_handle_reset(struct drm_device *dev) | |||
2587 | crtc->primary->fb, | 2587 | crtc->primary->fb, |
2588 | crtc->x, | 2588 | crtc->x, |
2589 | crtc->y); | 2589 | crtc->y); |
2590 | mutex_unlock(&crtc->mutex); | 2590 | drm_modeset_unlock(&crtc->mutex); |
2591 | } | 2591 | } |
2592 | } | 2592 | } |
2593 | 2593 | ||
@@ -8307,7 +8307,8 @@ mode_fits_in_fbdev(struct drm_device *dev, | |||
8307 | 8307 | ||
8308 | bool intel_get_load_detect_pipe(struct drm_connector *connector, | 8308 | bool intel_get_load_detect_pipe(struct drm_connector *connector, |
8309 | struct drm_display_mode *mode, | 8309 | struct drm_display_mode *mode, |
8310 | struct intel_load_detect_pipe *old) | 8310 | struct intel_load_detect_pipe *old, |
8311 | struct drm_modeset_acquire_ctx *ctx) | ||
8311 | { | 8312 | { |
8312 | struct intel_crtc *intel_crtc; | 8313 | struct intel_crtc *intel_crtc; |
8313 | struct intel_encoder *intel_encoder = | 8314 | struct intel_encoder *intel_encoder = |
@@ -8317,13 +8318,19 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector, | |||
8317 | struct drm_crtc *crtc = NULL; | 8318 | struct drm_crtc *crtc = NULL; |
8318 | struct drm_device *dev = encoder->dev; | 8319 | struct drm_device *dev = encoder->dev; |
8319 | struct drm_framebuffer *fb; | 8320 | struct drm_framebuffer *fb; |
8320 | int i = -1; | 8321 | struct drm_mode_config *config = &dev->mode_config; |
8322 | int ret, i = -1; | ||
8321 | 8323 | ||
8322 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n", | 8324 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n", |
8323 | connector->base.id, connector->name, | 8325 | connector->base.id, connector->name, |
8324 | encoder->base.id, encoder->name); | 8326 | encoder->base.id, encoder->name); |
8325 | 8327 | ||
8326 | mutex_lock(&dev->mode_config.connection_mutex); | 8328 | drm_modeset_acquire_init(ctx, 0); |
8329 | |||
8330 | retry: | ||
8331 | ret = drm_modeset_lock(&config->connection_mutex, ctx); | ||
8332 | if (ret) | ||
8333 | goto fail_unlock; | ||
8327 | 8334 | ||
8328 | /* | 8335 | /* |
8329 | * Algorithm gets a little messy: | 8336 | * Algorithm gets a little messy: |
@@ -8339,7 +8346,9 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector, | |||
8339 | if (encoder->crtc) { | 8346 | if (encoder->crtc) { |
8340 | crtc = encoder->crtc; | 8347 | crtc = encoder->crtc; |
8341 | 8348 | ||
8342 | mutex_lock(&crtc->mutex); | 8349 | ret = drm_modeset_lock(&crtc->mutex, ctx); |
8350 | if (ret) | ||
8351 | goto fail_unlock; | ||
8343 | 8352 | ||
8344 | old->dpms_mode = connector->dpms; | 8353 | old->dpms_mode = connector->dpms; |
8345 | old->load_detect_temp = false; | 8354 | old->load_detect_temp = false; |
@@ -8367,10 +8376,12 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector, | |||
8367 | */ | 8376 | */ |
8368 | if (!crtc) { | 8377 | if (!crtc) { |
8369 | DRM_DEBUG_KMS("no pipe available for load-detect\n"); | 8378 | DRM_DEBUG_KMS("no pipe available for load-detect\n"); |
8370 | goto fail_unlock_connector; | 8379 | goto fail_unlock; |
8371 | } | 8380 | } |
8372 | 8381 | ||
8373 | mutex_lock(&crtc->mutex); | 8382 | ret = drm_modeset_lock(&crtc->mutex, ctx); |
8383 | if (ret) | ||
8384 | goto fail_unlock; | ||
8374 | intel_encoder->new_crtc = to_intel_crtc(crtc); | 8385 | intel_encoder->new_crtc = to_intel_crtc(crtc); |
8375 | to_intel_connector(connector)->new_encoder = intel_encoder; | 8386 | to_intel_connector(connector)->new_encoder = intel_encoder; |
8376 | 8387 | ||
@@ -8420,15 +8431,21 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector, | |||
8420 | intel_crtc->new_config = &intel_crtc->config; | 8431 | intel_crtc->new_config = &intel_crtc->config; |
8421 | else | 8432 | else |
8422 | intel_crtc->new_config = NULL; | 8433 | intel_crtc->new_config = NULL; |
8423 | mutex_unlock(&crtc->mutex); | 8434 | fail_unlock: |
8424 | fail_unlock_connector: | 8435 | if (ret == -EDEADLK) { |
8425 | mutex_unlock(&dev->mode_config.connection_mutex); | 8436 | drm_modeset_backoff(ctx); |
8437 | goto retry; | ||
8438 | } | ||
8439 | |||
8440 | drm_modeset_drop_locks(ctx); | ||
8441 | drm_modeset_acquire_fini(ctx); | ||
8426 | 8442 | ||
8427 | return false; | 8443 | return false; |
8428 | } | 8444 | } |
8429 | 8445 | ||
8430 | void intel_release_load_detect_pipe(struct drm_connector *connector, | 8446 | void intel_release_load_detect_pipe(struct drm_connector *connector, |
8431 | struct intel_load_detect_pipe *old) | 8447 | struct intel_load_detect_pipe *old, |
8448 | struct drm_modeset_acquire_ctx *ctx) | ||
8432 | { | 8449 | { |
8433 | struct intel_encoder *intel_encoder = | 8450 | struct intel_encoder *intel_encoder = |
8434 | intel_attached_encoder(connector); | 8451 | intel_attached_encoder(connector); |
@@ -8452,8 +8469,7 @@ void intel_release_load_detect_pipe(struct drm_connector *connector, | |||
8452 | drm_framebuffer_unreference(old->release_fb); | 8469 | drm_framebuffer_unreference(old->release_fb); |
8453 | } | 8470 | } |
8454 | 8471 | ||
8455 | mutex_unlock(&crtc->mutex); | 8472 | goto unlock; |
8456 | mutex_unlock(&connector->dev->mode_config.connection_mutex); | ||
8457 | return; | 8473 | return; |
8458 | } | 8474 | } |
8459 | 8475 | ||
@@ -8461,8 +8477,9 @@ void intel_release_load_detect_pipe(struct drm_connector *connector, | |||
8461 | if (old->dpms_mode != DRM_MODE_DPMS_ON) | 8477 | if (old->dpms_mode != DRM_MODE_DPMS_ON) |
8462 | connector->funcs->dpms(connector, old->dpms_mode); | 8478 | connector->funcs->dpms(connector, old->dpms_mode); |
8463 | 8479 | ||
8464 | mutex_unlock(&crtc->mutex); | 8480 | unlock: |
8465 | mutex_unlock(&connector->dev->mode_config.connection_mutex); | 8481 | drm_modeset_drop_locks(ctx); |
8482 | drm_modeset_acquire_fini(ctx); | ||
8466 | } | 8483 | } |
8467 | 8484 | ||
8468 | static int i9xx_pll_refclk(struct drm_device *dev, | 8485 | static int i9xx_pll_refclk(struct drm_device *dev, |
@@ -10995,7 +11012,7 @@ enum pipe intel_get_pipe_from_connector(struct intel_connector *connector) | |||
10995 | struct drm_encoder *encoder = connector->base.encoder; | 11012 | struct drm_encoder *encoder = connector->base.encoder; |
10996 | struct drm_device *dev = connector->base.dev; | 11013 | struct drm_device *dev = connector->base.dev; |
10997 | 11014 | ||
10998 | WARN_ON(!mutex_is_locked(&dev->mode_config.connection_mutex)); | 11015 | WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); |
10999 | 11016 | ||
11000 | if (!encoder) | 11017 | if (!encoder) |
11001 | return INVALID_PIPE; | 11018 | return INVALID_PIPE; |
@@ -11805,6 +11822,7 @@ static void intel_enable_pipe_a(struct drm_device *dev) | |||
11805 | struct intel_connector *connector; | 11822 | struct intel_connector *connector; |
11806 | struct drm_connector *crt = NULL; | 11823 | struct drm_connector *crt = NULL; |
11807 | struct intel_load_detect_pipe load_detect_temp; | 11824 | struct intel_load_detect_pipe load_detect_temp; |
11825 | struct drm_modeset_acquire_ctx ctx; | ||
11808 | 11826 | ||
11809 | /* We can't just switch on the pipe A, we need to set things up with a | 11827 | /* We can't just switch on the pipe A, we need to set things up with a |
11810 | * proper mode and output configuration. As a gross hack, enable pipe A | 11828 | * proper mode and output configuration. As a gross hack, enable pipe A |
@@ -11821,8 +11839,8 @@ static void intel_enable_pipe_a(struct drm_device *dev) | |||
11821 | if (!crt) | 11839 | if (!crt) |
11822 | return; | 11840 | return; |
11823 | 11841 | ||
11824 | if (intel_get_load_detect_pipe(crt, NULL, &load_detect_temp)) | 11842 | if (intel_get_load_detect_pipe(crt, NULL, &load_detect_temp, &ctx)) |
11825 | intel_release_load_detect_pipe(crt, &load_detect_temp); | 11843 | intel_release_load_detect_pipe(crt, &load_detect_temp, &ctx); |
11826 | 11844 | ||
11827 | 11845 | ||
11828 | } | 11846 | } |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index d01bb430b5bc..2d5d9b010073 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -1154,7 +1154,7 @@ static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp) | |||
1154 | u32 pp; | 1154 | u32 pp; |
1155 | u32 pp_stat_reg, pp_ctrl_reg; | 1155 | u32 pp_stat_reg, pp_ctrl_reg; |
1156 | 1156 | ||
1157 | WARN_ON(!mutex_is_locked(&dev->mode_config.connection_mutex)); | 1157 | WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); |
1158 | 1158 | ||
1159 | if (!intel_dp->want_panel_vdd && edp_have_panel_vdd(intel_dp)) { | 1159 | if (!intel_dp->want_panel_vdd && edp_have_panel_vdd(intel_dp)) { |
1160 | struct intel_digital_port *intel_dig_port = | 1160 | struct intel_digital_port *intel_dig_port = |
@@ -1191,9 +1191,9 @@ static void edp_panel_vdd_work(struct work_struct *__work) | |||
1191 | struct intel_dp, panel_vdd_work); | 1191 | struct intel_dp, panel_vdd_work); |
1192 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 1192 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
1193 | 1193 | ||
1194 | mutex_lock(&dev->mode_config.connection_mutex); | 1194 | drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); |
1195 | edp_panel_vdd_off_sync(intel_dp); | 1195 | edp_panel_vdd_off_sync(intel_dp); |
1196 | mutex_unlock(&dev->mode_config.connection_mutex); | 1196 | drm_modeset_unlock(&dev->mode_config.connection_mutex); |
1197 | } | 1197 | } |
1198 | 1198 | ||
1199 | static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync) | 1199 | static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync) |
@@ -3666,9 +3666,9 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder) | |||
3666 | drm_encoder_cleanup(encoder); | 3666 | drm_encoder_cleanup(encoder); |
3667 | if (is_edp(intel_dp)) { | 3667 | if (is_edp(intel_dp)) { |
3668 | cancel_delayed_work_sync(&intel_dp->panel_vdd_work); | 3668 | cancel_delayed_work_sync(&intel_dp->panel_vdd_work); |
3669 | mutex_lock(&dev->mode_config.connection_mutex); | 3669 | drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); |
3670 | edp_panel_vdd_off_sync(intel_dp); | 3670 | edp_panel_vdd_off_sync(intel_dp); |
3671 | mutex_unlock(&dev->mode_config.connection_mutex); | 3671 | drm_modeset_unlock(&dev->mode_config.connection_mutex); |
3672 | } | 3672 | } |
3673 | kfree(intel_dig_port); | 3673 | kfree(intel_dig_port); |
3674 | } | 3674 | } |
@@ -4247,9 +4247,9 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port, | |||
4247 | drm_dp_aux_unregister(&intel_dp->aux); | 4247 | drm_dp_aux_unregister(&intel_dp->aux); |
4248 | if (is_edp(intel_dp)) { | 4248 | if (is_edp(intel_dp)) { |
4249 | cancel_delayed_work_sync(&intel_dp->panel_vdd_work); | 4249 | cancel_delayed_work_sync(&intel_dp->panel_vdd_work); |
4250 | mutex_lock(&dev->mode_config.connection_mutex); | 4250 | drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); |
4251 | edp_panel_vdd_off_sync(intel_dp); | 4251 | edp_panel_vdd_off_sync(intel_dp); |
4252 | mutex_unlock(&dev->mode_config.connection_mutex); | 4252 | drm_modeset_unlock(&dev->mode_config.connection_mutex); |
4253 | } | 4253 | } |
4254 | drm_sysfs_connector_remove(connector); | 4254 | drm_sysfs_connector_remove(connector); |
4255 | drm_connector_cleanup(connector); | 4255 | drm_connector_cleanup(connector); |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index f1d5897c96cd..0de04983501e 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -748,9 +748,11 @@ void vlv_wait_port_ready(struct drm_i915_private *dev_priv, | |||
748 | struct intel_digital_port *dport); | 748 | struct intel_digital_port *dport); |
749 | bool intel_get_load_detect_pipe(struct drm_connector *connector, | 749 | bool intel_get_load_detect_pipe(struct drm_connector *connector, |
750 | struct drm_display_mode *mode, | 750 | struct drm_display_mode *mode, |
751 | struct intel_load_detect_pipe *old); | 751 | struct intel_load_detect_pipe *old, |
752 | struct drm_modeset_acquire_ctx *ctx); | ||
752 | void intel_release_load_detect_pipe(struct drm_connector *connector, | 753 | void intel_release_load_detect_pipe(struct drm_connector *connector, |
753 | struct intel_load_detect_pipe *old); | 754 | struct intel_load_detect_pipe *old, |
755 | struct drm_modeset_acquire_ctx *ctx); | ||
754 | int intel_pin_and_fence_fb_obj(struct drm_device *dev, | 756 | int intel_pin_and_fence_fb_obj(struct drm_device *dev, |
755 | struct drm_i915_gem_object *obj, | 757 | struct drm_i915_gem_object *obj, |
756 | struct intel_engine_cs *pipelined); | 758 | struct intel_engine_cs *pipelined); |
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c index b812e9d39f38..2e2c71fcc9ed 100644 --- a/drivers/gpu/drm/i915/intel_opregion.c +++ b/drivers/gpu/drm/i915/intel_opregion.c | |||
@@ -410,7 +410,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) | |||
410 | if (bclp > 255) | 410 | if (bclp > 255) |
411 | return ASLC_BACKLIGHT_FAILED; | 411 | return ASLC_BACKLIGHT_FAILED; |
412 | 412 | ||
413 | mutex_lock(&dev->mode_config.connection_mutex); | 413 | drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); |
414 | 414 | ||
415 | /* | 415 | /* |
416 | * Update backlight on all connectors that support backlight (usually | 416 | * Update backlight on all connectors that support backlight (usually |
@@ -421,7 +421,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) | |||
421 | intel_panel_set_backlight(intel_connector, bclp, 255); | 421 | intel_panel_set_backlight(intel_connector, bclp, 255); |
422 | iowrite32(DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID, &asle->cblv); | 422 | iowrite32(DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID, &asle->cblv); |
423 | 423 | ||
424 | mutex_unlock(&dev->mode_config.connection_mutex); | 424 | drm_modeset_unlock(&dev->mode_config.connection_mutex); |
425 | 425 | ||
426 | 426 | ||
427 | return 0; | 427 | return 0; |
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c index e97ea33e0117..0396d1312b5c 100644 --- a/drivers/gpu/drm/i915/intel_overlay.c +++ b/drivers/gpu/drm/i915/intel_overlay.c | |||
@@ -688,7 +688,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay, | |||
688 | u32 swidth, swidthsw, sheight, ostride; | 688 | u32 swidth, swidthsw, sheight, ostride; |
689 | 689 | ||
690 | BUG_ON(!mutex_is_locked(&dev->struct_mutex)); | 690 | BUG_ON(!mutex_is_locked(&dev->struct_mutex)); |
691 | BUG_ON(!mutex_is_locked(&dev->mode_config.connection_mutex)); | 691 | BUG_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); |
692 | BUG_ON(!overlay); | 692 | BUG_ON(!overlay); |
693 | 693 | ||
694 | ret = intel_overlay_release_old_vid(overlay); | 694 | ret = intel_overlay_release_old_vid(overlay); |
@@ -793,7 +793,7 @@ int intel_overlay_switch_off(struct intel_overlay *overlay) | |||
793 | int ret; | 793 | int ret; |
794 | 794 | ||
795 | BUG_ON(!mutex_is_locked(&dev->struct_mutex)); | 795 | BUG_ON(!mutex_is_locked(&dev->struct_mutex)); |
796 | BUG_ON(!mutex_is_locked(&dev->mode_config.connection_mutex)); | 796 | BUG_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); |
797 | 797 | ||
798 | ret = intel_overlay_recover_from_interrupt(overlay); | 798 | ret = intel_overlay_recover_from_interrupt(overlay); |
799 | if (ret != 0) | 799 | if (ret != 0) |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index d4d415665475..2e1338a5d488 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
@@ -876,12 +876,12 @@ static int intel_backlight_device_update_status(struct backlight_device *bd) | |||
876 | struct intel_connector *connector = bl_get_data(bd); | 876 | struct intel_connector *connector = bl_get_data(bd); |
877 | struct drm_device *dev = connector->base.dev; | 877 | struct drm_device *dev = connector->base.dev; |
878 | 878 | ||
879 | mutex_lock(&dev->mode_config.connection_mutex); | 879 | drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); |
880 | DRM_DEBUG_KMS("updating intel_backlight, brightness=%d/%d\n", | 880 | DRM_DEBUG_KMS("updating intel_backlight, brightness=%d/%d\n", |
881 | bd->props.brightness, bd->props.max_brightness); | 881 | bd->props.brightness, bd->props.max_brightness); |
882 | intel_panel_set_backlight(connector, bd->props.brightness, | 882 | intel_panel_set_backlight(connector, bd->props.brightness, |
883 | bd->props.max_brightness); | 883 | bd->props.max_brightness); |
884 | mutex_unlock(&dev->mode_config.connection_mutex); | 884 | drm_modeset_unlock(&dev->mode_config.connection_mutex); |
885 | return 0; | 885 | return 0; |
886 | } | 886 | } |
887 | 887 | ||
@@ -893,9 +893,9 @@ static int intel_backlight_device_get_brightness(struct backlight_device *bd) | |||
893 | int ret; | 893 | int ret; |
894 | 894 | ||
895 | intel_runtime_pm_get(dev_priv); | 895 | intel_runtime_pm_get(dev_priv); |
896 | mutex_lock(&dev->mode_config.connection_mutex); | 896 | drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); |
897 | ret = intel_panel_get_backlight(connector); | 897 | ret = intel_panel_get_backlight(connector); |
898 | mutex_unlock(&dev->mode_config.connection_mutex); | 898 | drm_modeset_unlock(&dev->mode_config.connection_mutex); |
899 | intel_runtime_pm_put(dev_priv); | 899 | intel_runtime_pm_put(dev_priv); |
900 | 900 | ||
901 | return ret; | 901 | return ret; |
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index d6acd6bd0bf0..1b66ddcdfb33 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c | |||
@@ -55,7 +55,7 @@ static bool intel_pipe_update_start(struct intel_crtc *crtc, uint32_t *start_vbl | |||
55 | int scanline, min, max, vblank_start; | 55 | int scanline, min, max, vblank_start; |
56 | DEFINE_WAIT(wait); | 56 | DEFINE_WAIT(wait); |
57 | 57 | ||
58 | WARN_ON(!mutex_is_locked(&crtc->base.mutex)); | 58 | WARN_ON(!drm_modeset_is_locked(&crtc->base.mutex)); |
59 | 59 | ||
60 | vblank_start = mode->crtc_vblank_start; | 60 | vblank_start = mode->crtc_vblank_start; |
61 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | 61 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index 25850a86d70c..67c6c9a2eb1c 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
@@ -1321,10 +1321,11 @@ intel_tv_detect(struct drm_connector *connector, bool force) | |||
1321 | 1321 | ||
1322 | if (force) { | 1322 | if (force) { |
1323 | struct intel_load_detect_pipe tmp; | 1323 | struct intel_load_detect_pipe tmp; |
1324 | struct drm_modeset_acquire_ctx ctx; | ||
1324 | 1325 | ||
1325 | if (intel_get_load_detect_pipe(connector, &mode, &tmp)) { | 1326 | if (intel_get_load_detect_pipe(connector, &mode, &tmp, &ctx)) { |
1326 | type = intel_tv_detect_type(intel_tv, connector); | 1327 | type = intel_tv_detect_type(intel_tv, connector); |
1327 | intel_release_load_detect_pipe(connector, &tmp); | 1328 | intel_release_load_detect_pipe(connector, &tmp, &ctx); |
1328 | } else | 1329 | } else |
1329 | return connector_status_unknown; | 1330 | return connector_status_unknown; |
1330 | } else | 1331 | } else |
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index e3c47a8005ff..2d28dc337cfb 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c | |||
@@ -319,13 +319,13 @@ static void page_flip_worker(struct work_struct *work) | |||
319 | struct drm_display_mode *mode = &crtc->mode; | 319 | struct drm_display_mode *mode = &crtc->mode; |
320 | struct drm_gem_object *bo; | 320 | struct drm_gem_object *bo; |
321 | 321 | ||
322 | mutex_lock(&crtc->mutex); | 322 | drm_modeset_lock(&crtc->mutex, NULL); |
323 | omap_plane_mode_set(omap_crtc->plane, crtc, crtc->primary->fb, | 323 | omap_plane_mode_set(omap_crtc->plane, crtc, crtc->primary->fb, |
324 | 0, 0, mode->hdisplay, mode->vdisplay, | 324 | 0, 0, mode->hdisplay, mode->vdisplay, |
325 | crtc->x << 16, crtc->y << 16, | 325 | crtc->x << 16, crtc->y << 16, |
326 | mode->hdisplay << 16, mode->vdisplay << 16, | 326 | mode->hdisplay << 16, mode->vdisplay << 16, |
327 | vblank_cb, crtc); | 327 | vblank_cb, crtc); |
328 | mutex_unlock(&crtc->mutex); | 328 | drm_modeset_unlock(&crtc->mutex); |
329 | 329 | ||
330 | bo = omap_framebuffer_bo(crtc->primary->fb, 0); | 330 | bo = omap_framebuffer_bo(crtc->primary->fb, 0); |
331 | drm_gem_object_unreference_unlocked(bo); | 331 | drm_gem_object_unreference_unlocked(bo); |
@@ -465,7 +465,7 @@ static void apply_worker(struct work_struct *work) | |||
465 | * the callbacks and list modification all serialized | 465 | * the callbacks and list modification all serialized |
466 | * with respect to modesetting ioctls from userspace. | 466 | * with respect to modesetting ioctls from userspace. |
467 | */ | 467 | */ |
468 | mutex_lock(&crtc->mutex); | 468 | drm_modeset_lock(&crtc->mutex, NULL); |
469 | dispc_runtime_get(); | 469 | dispc_runtime_get(); |
470 | 470 | ||
471 | /* | 471 | /* |
@@ -510,7 +510,7 @@ static void apply_worker(struct work_struct *work) | |||
510 | 510 | ||
511 | out: | 511 | out: |
512 | dispc_runtime_put(); | 512 | dispc_runtime_put(); |
513 | mutex_unlock(&crtc->mutex); | 513 | drm_modeset_unlock(&crtc->mutex); |
514 | } | 514 | } |
515 | 515 | ||
516 | int omap_crtc_apply(struct drm_crtc *crtc, | 516 | int omap_crtc_apply(struct drm_crtc *crtc, |
@@ -518,7 +518,7 @@ int omap_crtc_apply(struct drm_crtc *crtc, | |||
518 | { | 518 | { |
519 | struct omap_crtc *omap_crtc = to_omap_crtc(crtc); | 519 | struct omap_crtc *omap_crtc = to_omap_crtc(crtc); |
520 | 520 | ||
521 | WARN_ON(!mutex_is_locked(&crtc->mutex)); | 521 | WARN_ON(!drm_modeset_is_locked(&crtc->mutex)); |
522 | 522 | ||
523 | /* no need to queue it again if it is already queued: */ | 523 | /* no need to queue it again if it is already queued: */ |
524 | if (apply->queued) | 524 | if (apply->queued) |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index e7199b454ca0..8f3edc4710f2 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | |||
@@ -187,7 +187,7 @@ int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv, | |||
187 | * can do this since the caller in the drm core doesn't check anything | 187 | * can do this since the caller in the drm core doesn't check anything |
188 | * which is protected by any looks. | 188 | * which is protected by any looks. |
189 | */ | 189 | */ |
190 | mutex_unlock(&crtc->mutex); | 190 | drm_modeset_unlock(&crtc->mutex); |
191 | drm_modeset_lock_all(dev_priv->dev); | 191 | drm_modeset_lock_all(dev_priv->dev); |
192 | 192 | ||
193 | /* A lot of the code assumes this */ | 193 | /* A lot of the code assumes this */ |
@@ -252,7 +252,7 @@ int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv, | |||
252 | ret = 0; | 252 | ret = 0; |
253 | out: | 253 | out: |
254 | drm_modeset_unlock_all(dev_priv->dev); | 254 | drm_modeset_unlock_all(dev_priv->dev); |
255 | mutex_lock(&crtc->mutex); | 255 | drm_modeset_lock(&crtc->mutex, NULL); |
256 | 256 | ||
257 | return ret; | 257 | return ret; |
258 | } | 258 | } |
@@ -273,7 +273,7 @@ int vmw_du_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) | |||
273 | * can do this since the caller in the drm core doesn't check anything | 273 | * can do this since the caller in the drm core doesn't check anything |
274 | * which is protected by any looks. | 274 | * which is protected by any looks. |
275 | */ | 275 | */ |
276 | mutex_unlock(&crtc->mutex); | 276 | drm_modeset_unlock(&crtc->mutex); |
277 | drm_modeset_lock_all(dev_priv->dev); | 277 | drm_modeset_lock_all(dev_priv->dev); |
278 | 278 | ||
279 | vmw_cursor_update_position(dev_priv, shown, | 279 | vmw_cursor_update_position(dev_priv, shown, |
@@ -281,7 +281,7 @@ int vmw_du_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) | |||
281 | du->cursor_y + du->hotspot_y); | 281 | du->cursor_y + du->hotspot_y); |
282 | 282 | ||
283 | drm_modeset_unlock_all(dev_priv->dev); | 283 | drm_modeset_unlock_all(dev_priv->dev); |
284 | mutex_lock(&crtc->mutex); | 284 | drm_modeset_lock(&crtc->mutex, NULL); |
285 | 285 | ||
286 | return 0; | 286 | return 0; |
287 | } | 287 | } |