diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-12-01 18:28:11 -0500 |
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-01-20 16:16:38 -0500 |
| commit | 848499032504b1defdebdcf930aa70bd01a45ac1 (patch) | |
| tree | 54e84b73e68ce68ece6ef9adfa888afbb6ec8ed9 | |
| parent | 2d13b6796e420ed00389b7399a5d5ac7b1fed436 (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.c | 147 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_crtc_helper.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 20 | ||||
| -rw-r--r-- | include/drm/drm_crtc.h | 3 |
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 | */ | ||
| 47 | void drm_modeset_lock_all(struct drm_device *dev) | ||
| 48 | { | ||
| 49 | mutex_lock(&dev->mode_config.mutex); | ||
| 50 | } | ||
| 51 | EXPORT_SYMBOL(drm_modeset_lock_all); | ||
| 52 | |||
| 53 | /** | ||
| 54 | * drm_modeset_unlock_all - drop all modeset locks | ||
| 55 | * @dev: device | ||
| 56 | */ | ||
| 57 | void drm_modeset_unlock_all(struct drm_device *dev) | ||
| 58 | { | ||
| 59 | mutex_unlock(&dev->mode_config.mutex); | ||
| 60 | } | ||
| 61 | EXPORT_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); | |||
| 615 | void drm_encoder_cleanup(struct drm_encoder *encoder) | 638 | void 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 | } |
| 624 | EXPORT_SYMBOL(drm_encoder_cleanup); | 647 | EXPORT_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 | } |
| 688 | EXPORT_SYMBOL(drm_plane_cleanup); | 711 | EXPORT_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); | ||
