aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c')
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c
index 182f27c73aeb..934a98819b43 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c
@@ -80,12 +80,22 @@ nvkm_timer_alarm(struct nvkm_timer *tmr, u32 nsec, struct nvkm_alarm *alarm)
80 if (list->timestamp > alarm->timestamp) 80 if (list->timestamp > alarm->timestamp)
81 break; 81 break;
82 } 82 }
83
83 list_add_tail(&alarm->head, &list->head); 84 list_add_tail(&alarm->head, &list->head);
85
86 /* Update HW if this is now the earliest alarm. */
87 list = list_first_entry(&tmr->alarms, typeof(*list), head);
88 if (list == alarm) {
89 tmr->func->alarm_init(tmr, alarm->timestamp);
90 /* This shouldn't happen if callers aren't stupid.
91 *
92 * Worst case scenario is that it'll take roughly
93 * 4 seconds for the next alarm to trigger.
94 */
95 WARN_ON(alarm->timestamp <= nvkm_timer_read(tmr));
96 }
84 } 97 }
85 spin_unlock_irqrestore(&tmr->lock, flags); 98 spin_unlock_irqrestore(&tmr->lock, flags);
86
87 /* process pending alarms */
88 nvkm_timer_alarm_trigger(tmr);
89} 99}
90 100
91void 101void