aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/msm/msm_kms.h
diff options
context:
space:
mode:
authorRob Clark <robdclark@chromium.org>2020-10-19 14:10:53 -0700
committerRob Clark <robdclark@chromium.org>2020-11-01 10:13:32 -0800
commit363bcec913d82703be6ae0ad5fe5488532f5cdac (patch)
tree2ee36ec5a6a0ea536068ee140dcbba144f76f3b7 /drivers/gpu/drm/msm/msm_kms.h
parentdrm/msm/kms: Update msm_kms_init/destroy (diff)
downloadlinux-dev-363bcec913d82703be6ae0ad5fe5488532f5cdac.tar.xz
linux-dev-363bcec913d82703be6ae0ad5fe5488532f5cdac.zip
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.h17
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);