aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-12-01 18:28:11 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-01-20 16:16:38 -0500
commit848499032504b1defdebdcf930aa70bd01a45ac1 (patch)
tree54e84b73e68ce68ece6ef9adfa888afbb6ec8ed9
parent2d13b6796e420ed00389b7399a5d5ac7b1fed436 (diff)
drm: add drm_modeset_lock|unlock_all
This is the first step towards introducing the new modeset locking scheme. The plan is to put helper functions into place at all the right places step-by-step, so that the final patch to switch on the new locking scheme doesn't need to touch every single driver. This helper here will serve as the shotgun solutions for all places where a more fine-grained locking isn't (yet) implemented. v2: Fixup kerneldoc for unlock_all. Reviewed-by: Rob Clark <rob@ti.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/drm_crtc.c147
-rw-r--r--drivers/gpu/drm/drm_crtc_helper.c8
-rw-r--r--drivers/gpu/drm/drm_fb_helper.c20
-rw-r--r--include/drm/drm_crtc.h3
4 files changed, 102 insertions, 76 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 7ca2f28348e6..a82ec05dee23 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -37,6 +37,29 @@
37#include <drm/drm_edid.h> 37#include <drm/drm_edid.h>
38#include <drm/drm_fourcc.h> 38#include <drm/drm_fourcc.h>
39 39
40/**
41 * drm_modeset_lock_all - take all modeset locks
42 * @dev: drm device
43 *
44 * This function takes all modeset locks, suitable where a more fine-grained
45 * scheme isn't (yet) implemented.
46 */
47void drm_modeset_lock_all(struct drm_device *dev)
48{
49 mutex_lock(&dev->mode_config.mutex);
50}
51EXPORT_SYMBOL(drm_modeset_lock_all);
52
53/**
54 * drm_modeset_unlock_all - drop all modeset locks
55 * @dev: device
56 */
57void drm_modeset_unlock_all(struct drm_device *dev)
58{
59 mutex_unlock(&dev->mode_config.mutex);
60}
61EXPORT_SYMBOL(drm_modeset_unlock_all);
62
40/* Avoid boilerplate. I'm tired of typing. */ 63/* Avoid boilerplate. I'm tired of typing. */
41#define DRM_ENUM_NAME_FN(fnname, list) \ 64#define DRM_ENUM_NAME_FN(fnname, list) \
42 char *fnname(int val) \ 65 char *fnname(int val) \
@@ -425,7 +448,7 @@ int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
425 crtc->funcs = funcs; 448 crtc->funcs = funcs;
426 crtc->invert_dimensions = false; 449 crtc->invert_dimensions = false;
427 450
428 mutex_lock(&dev->mode_config.mutex); 451 drm_modeset_lock_all(dev);
429 452
430 ret = drm_mode_object_get(dev, &crtc->base, DRM_MODE_OBJECT_CRTC); 453 ret = drm_mode_object_get(dev, &crtc->base, DRM_MODE_OBJECT_CRTC);
431 if (ret) 454 if (ret)
@@ -437,7 +460,7 @@ int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
437 dev->mode_config.num_crtc++; 460 dev->mode_config.num_crtc++;
438 461
439 out: 462 out:
440 mutex_unlock(&dev->mode_config.mutex); 463 drm_modeset_unlock_all(dev);
441 464
442 return ret; 465 return ret;
443} 466}
@@ -512,7 +535,7 @@ int drm_connector_init(struct drm_device *dev,
512{ 535{
513 int ret; 536 int ret;
514 537
515 mutex_lock(&dev->mode_config.mutex); 538 drm_modeset_lock_all(dev);
516 539
517 ret = drm_mode_object_get(dev, &connector->base, DRM_MODE_OBJECT_CONNECTOR); 540 ret = drm_mode_object_get(dev, &connector->base, DRM_MODE_OBJECT_CONNECTOR);
518 if (ret) 541 if (ret)
@@ -542,7 +565,7 @@ int drm_connector_init(struct drm_device *dev,
542 dev->mode_config.dpms_property, 0); 565 dev->mode_config.dpms_property, 0);
543 566
544 out: 567 out:
545 mutex_unlock(&dev->mode_config.mutex); 568 drm_modeset_unlock_all(dev);
546 569
547 return ret; 570 return ret;
548} 571}
@@ -592,7 +615,7 @@ int drm_encoder_init(struct drm_device *dev,
592{ 615{
593 int ret; 616 int ret;
594 617
595 mutex_lock(&dev->mode_config.mutex); 618 drm_modeset_lock_all(dev);
596 619
597 ret = drm_mode_object_get(dev, &encoder->base, DRM_MODE_OBJECT_ENCODER); 620 ret = drm_mode_object_get(dev, &encoder->base, DRM_MODE_OBJECT_ENCODER);
598 if (ret) 621 if (ret)
@@ -606,7 +629,7 @@ int drm_encoder_init(struct drm_device *dev,
606 dev->mode_config.num_encoder++; 629 dev->mode_config.num_encoder++;
607 630
608 out: 631 out:
609 mutex_unlock(&dev->mode_config.mutex); 632 drm_modeset_unlock_all(dev);
610 633
611 return ret; 634 return ret;
612} 635}
@@ -615,11 +638,11 @@ EXPORT_SYMBOL(drm_encoder_init);
615void drm_encoder_cleanup(struct drm_encoder *encoder) 638void drm_encoder_cleanup(struct drm_encoder *encoder)
616{ 639{
617 struct drm_device *dev = encoder->dev; 640 struct drm_device *dev = encoder->dev;
618 mutex_lock(&dev->mode_config.mutex); 641 drm_modeset_lock_all(dev);
619 drm_mode_object_put(dev, &encoder->base); 642 drm_mode_object_put(dev, &encoder->base);
620 list_del(&encoder->head); 643 list_del(&encoder->head);
621 dev->mode_config.num_encoder--; 644 dev->mode_config.num_encoder--;
622 mutex_unlock(&dev->mode_config.mutex); 645 drm_modeset_unlock_all(dev);
623} 646}
624EXPORT_SYMBOL(drm_encoder_cleanup); 647EXPORT_SYMBOL(drm_encoder_cleanup);
625 648
@@ -631,7 +654,7 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,
631{ 654{
632 int ret; 655 int ret;
633 656
634 mutex_lock(&dev->mode_config.mutex); 657 drm_modeset_lock_all(dev);
635 658
636 ret = drm_mode_object_get(dev, &plane->base, DRM_MODE_OBJECT_PLANE); 659 ret = drm_mode_object_get(dev, &plane->base, DRM_MODE_OBJECT_PLANE);
637 if (ret) 660 if (ret)
@@ -665,7 +688,7 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,
665 } 688 }
666 689
667 out: 690 out:
668 mutex_unlock(&dev->mode_config.mutex); 691 drm_modeset_unlock_all(dev);
669 692
670 return ret; 693 return ret;
671} 694}
@@ -675,7 +698,7 @@ void drm_plane_cleanup(struct drm_plane *plane)
675{ 698{
676 struct drm_device *dev = plane->dev; 699 struct drm_device *dev = plane->dev;
677 700
678 mutex_lock(&dev->mode_config.mutex); 701 drm_modeset_lock_all(dev);
679 kfree(plane->format_types); 702 kfree(plane->format_types);
680 drm_mode_object_put(dev, &plane->base); 703 drm_mode_object_put(dev, &plane->base);
681 /* if not added to a list, it must be a private plane */ 704 /* if not added to a list, it must be a private plane */
@@ -683,7 +706,7 @@ void drm_plane_cleanup(struct drm_plane *plane)
683 list_del(&plane->head); 706 list_del(&plane->head);
684 dev->mode_config.num_plane--; 707 dev->mode_config.num_plane--;
685 } 708 }
686 mutex_unlock(&dev->mode_config.mutex); 709 drm_modeset_unlock_all(dev);
687} 710}
688EXPORT_SYMBOL(drm_plane_cleanup); 711EXPORT_SYMBOL(drm_plane_cleanup);
689 712
@@ -963,9 +986,9 @@ void drm_mode_config_init(struct drm_device *dev)
963 INIT_LIST_HEAD(&dev->mode_config.plane_list); 986 INIT_LIST_HEAD(&dev->mode_config.plane_list);
964 idr_init(&dev->mode_config.crtc_idr); 987 idr_init(&dev->mode_config.crtc_idr);
965 988
966 mutex_lock(&dev->mode_config.mutex); 989 drm_modeset_lock_all(dev);
967 drm_mode_create_standard_connector_properties(dev); 990 drm_mode_create_standard_connector_properties(dev);
968 mutex_unlock(&dev->mode_config.mutex); 991 drm_modeset_unlock_all(dev);
969 992
970 /* Just to be sure */ 993 /* Just to be sure */
971 dev->mode_config.num_fb = 0; 994 dev->mode_config.num_fb = 0;
@@ -1185,7 +1208,7 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
1185 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 1208 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1186 return -EINVAL; 1209 return -EINVAL;
1187 1210
1188 mutex_lock(&dev->mode_config.mutex);