diff options
author | Rob Clark <robdclark@chromium.org> | 2020-10-20 00:10:53 +0300 |
---|---|---|
committer | Rob Clark <robdclark@chromium.org> | 2020-11-01 21:13:32 +0300 |
commit | 363bcec913d82703be6ae0ad5fe5488532f5cdac (patch) | |
tree | 2ee36ec5a6a0ea536068ee140dcbba144f76f3b7 /drivers/gpu/drm/msm/msm_kms.h | |
parent | ffe71111f4ab5aa670502f190d0b7fe10edd1784 (diff) | |
download | linux-363bcec913d82703be6ae0ad5fe5488532f5cdac.tar.xz |
drm/msm/atomic: Convert to per-CRTC kthread_work
Use a SCHED_FIFO kthread_worker for async atomic commits. We have a
hard deadline if we don't want to miss a frame.
Signed-off-by: Rob Clark <robdclark@chromium.org>
Diffstat (limited to 'drivers/gpu/drm/msm/msm_kms.h')
-rw-r--r-- | drivers/gpu/drm/msm/msm_kms.h | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h index 602c0c7f300a..d8151a89e163 100644 --- a/drivers/gpu/drm/msm/msm_kms.h +++ b/drivers/gpu/drm/msm/msm_kms.h @@ -136,7 +136,8 @@ struct msm_kms; */ struct msm_pending_timer { struct hrtimer timer; - struct work_struct work; + struct kthread_work work; + struct kthread_worker *worker; struct msm_kms *kms; unsigned crtc_idx; }; @@ -163,21 +164,29 @@ struct msm_kms { static inline int msm_kms_init(struct msm_kms *kms, const struct msm_kms_funcs *funcs) { - unsigned i; + unsigned i, ret; for (i = 0; i < ARRAY_SIZE(kms->commit_lock); i++) mutex_init(&kms->commit_lock[i]); kms->funcs = funcs; - for (i = 0; i < ARRAY_SIZE(kms->pending_timers); i++) - msm_atomic_init_pending_timer(&kms->pending_timers[i], kms, i); + for (i = 0; i < ARRAY_SIZE(kms->pending_timers); i++) { + ret = msm_atomic_init_pending_timer(&kms->pending_timers[i], kms, i); + if (ret) { + return ret; + } + } return 0; } static inline void msm_kms_destroy(struct msm_kms *kms) { + unsigned i; + + for (i = 0; i < ARRAY_SIZE(kms->pending_timers); i++) + msm_atomic_destroy_pending_timer(&kms->pending_timers[i]); } struct msm_kms *mdp4_kms_init(struct drm_device *dev); |