Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/msm/dpu: Remove dpu_kms_pm_suspend/resume

PM resume was crashing during dpu_kms_pm_resume. This patch removes
dpu_kms_pm_suspend/resume so that msm_pm_suspend/resume uses the atomic
helpers instead (see next patch). This patch also removes
dpu_kms_is_suspend_blocked since it is never called.

v2: Reorganized patches in patchset

Signed-off-by: Bruce Wang <bzwang@chromium.org>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>

authored by

Bruce Wang and committed by
Rob Clark
b2b83523 812eeeb6

-138
-123
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
··· 709 709 _dpu_kms_hw_destroy(dpu_kms); 710 710 } 711 711 712 - static int dpu_kms_pm_suspend(struct device *dev) 713 - { 714 - struct drm_device *ddev; 715 - struct drm_modeset_acquire_ctx ctx; 716 - struct drm_atomic_state *state; 717 - struct dpu_kms *dpu_kms; 718 - int ret = 0, num_crtcs = 0; 719 - 720 - if (!dev) 721 - return -EINVAL; 722 - 723 - ddev = dev_get_drvdata(dev); 724 - if (!ddev || !ddev_to_msm_kms(ddev)) 725 - return -EINVAL; 726 - 727 - dpu_kms = to_dpu_kms(ddev_to_msm_kms(ddev)); 728 - 729 - /* disable hot-plug polling */ 730 - drm_kms_helper_poll_disable(ddev); 731 - 732 - /* acquire modeset lock(s) */ 733 - drm_modeset_acquire_init(&ctx, 0); 734 - 735 - retry: 736 - DPU_ATRACE_BEGIN("kms_pm_suspend"); 737 - 738 - ret = drm_modeset_lock_all_ctx(ddev, &ctx); 739 - if (ret) 740 - goto unlock; 741 - 742 - /* save current state for resume */ 743 - if (dpu_kms->suspend_state) 744 - drm_atomic_state_put(dpu_kms->suspend_state); 745 - dpu_kms->suspend_state = drm_atomic_helper_duplicate_state(ddev, &ctx); 746 - if (IS_ERR_OR_NULL(dpu_kms->suspend_state)) { 747 - DRM_ERROR("failed to back up suspend state\n"); 748 - dpu_kms->suspend_state = NULL; 749 - goto unlock; 750 - } 751 - 752 - /* create atomic state to disable all CRTCs */ 753 - state = drm_atomic_state_alloc(ddev); 754 - if (IS_ERR_OR_NULL(state)) { 755 - DRM_ERROR("failed to allocate crtc disable state\n"); 756 - goto unlock; 757 - } 758 - 759 - state->acquire_ctx = &ctx; 760 - 761 - /* check for nothing to do */ 762 - if (num_crtcs == 0) { 763 - DRM_DEBUG("all crtcs are already in the off state\n"); 764 - drm_atomic_state_put(state); 765 - goto suspended; 766 - } 767 - 768 - /* commit the "disable all" state */ 769 - ret = drm_atomic_commit(state); 770 - if (ret < 0) { 771 - DRM_ERROR("failed to disable crtcs, %d\n", ret); 772 - drm_atomic_state_put(state); 773 - goto unlock; 774 - } 775 - 776 - suspended: 777 - dpu_kms->suspend_block = true; 778 - 779 - unlock: 780 - if (ret == -EDEADLK) { 781 - drm_modeset_backoff(&ctx); 782 - goto retry; 783 - } 784 - drm_modeset_drop_locks(&ctx); 785 - drm_modeset_acquire_fini(&ctx); 786 - 787 - DPU_ATRACE_END("kms_pm_suspend"); 788 - return 0; 789 - } 790 - 791 - static int dpu_kms_pm_resume(struct device *dev) 792 - { 793 - struct drm_device *ddev; 794 - struct dpu_kms *dpu_kms; 795 - int ret; 796 - 797 - if (!dev) 798 - return -EINVAL; 799 - 800 - ddev = dev_get_drvdata(dev); 801 - if (!ddev || !ddev_to_msm_kms(ddev)) 802 - return -EINVAL; 803 - 804 - dpu_kms = to_dpu_kms(ddev_to_msm_kms(ddev)); 805 - 806 - DPU_ATRACE_BEGIN("kms_pm_resume"); 807 - 808 - drm_mode_config_reset(ddev); 809 - 810 - drm_modeset_lock_all(ddev); 811 - 812 - dpu_kms->suspend_block = false; 813 - 814 - if (dpu_kms->suspend_state) { 815 - dpu_kms->suspend_state->acquire_ctx = 816 - ddev->mode_config.acquire_ctx; 817 - ret = drm_atomic_commit(dpu_kms->suspend_state); 818 - if (ret < 0) { 819 - DRM_ERROR("failed to restore state, %d\n", ret); 820 - drm_atomic_state_put(dpu_kms->suspend_state); 821 - } 822 - dpu_kms->suspend_state = NULL; 823 - } 824 - drm_modeset_unlock_all(ddev); 825 - 826 - /* enable hot-plug polling */ 827 - drm_kms_helper_poll_enable(ddev); 828 - 829 - DPU_ATRACE_END("kms_pm_resume"); 830 - return 0; 831 - } 832 - 833 712 static void _dpu_kms_set_encoder_mode(struct msm_kms *kms, 834 713 struct drm_encoder *encoder, 835 714 bool cmd_mode) ··· 752 873 .check_modified_format = dpu_format_check_modified_format, 753 874 .get_format = dpu_get_msm_format, 754 875 .round_pixclk = dpu_kms_round_pixclk, 755 - .pm_suspend = dpu_kms_pm_suspend, 756 - .pm_resume = dpu_kms_pm_resume, 757 876 .destroy = dpu_kms_destroy, 758 877 .set_encoder_mode = _dpu_kms_set_encoder_mode, 759 878 #ifdef CONFIG_DEBUG_FS
-15
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
··· 137 137 138 138 /* saved atomic state during system suspend */ 139 139 struct drm_atomic_state *suspend_state; 140 - bool suspend_block; 141 140 142 141 struct dpu_rm rm; 143 142 bool rm_init; ··· 173 174 return false; 174 175 175 176 return to_dpu_kms(ddev_to_msm_kms(dev))->suspend_state != NULL; 176 - } 177 - 178 - /** 179 - * dpu_kms_is_suspend_blocked - whether or not commits are blocked due to pm 180 - * suspend status 181 - * @dev: Pointer to drm device 182 - * Return: True if commits should be rejected due to pm suspend 183 - */ 184 - static inline bool dpu_kms_is_suspend_blocked(struct drm_device *dev) 185 - { 186 - if (!dpu_kms_is_suspend_state(dev)) 187 - return false; 188 - 189 - return to_dpu_kms(ddev_to_msm_kms(dev))->suspend_block; 190 177 } 191 178 192 179 /**