1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#include <drm/drmP.h>
36#include "drm_trace.h"
37#include "drm_internal.h"
38
39#include <linux/interrupt.h>
40#include <linux/slab.h>
41
42#include <linux/vgaarb.h>
43#include <linux/export.h>
44
45
46
47
48#define DRM_TIMESTAMP_MAXRETRIES 3
49
50
51
52
53#define DRM_REDUNDANT_VBLIRQ_THRESH_NS 1000000
54
55static bool
56drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
57 struct timeval *tvblank, unsigned flags);
58
59static unsigned int drm_timestamp_precision = 20;
60
61
62
63
64
65unsigned int drm_timestamp_monotonic = 1;
66
67static int drm_vblank_offdelay = 5000;
68
69module_param_named(vblankoffdelay, drm_vblank_offdelay, int, 0600);
70module_param_named(timestamp_precision_usec, drm_timestamp_precision, int, 0600);
71module_param_named(timestamp_monotonic, drm_timestamp_monotonic, int, 0600);
72MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs] (0: never disable, <0: disable immediately)");
73MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [usecs]");
74MODULE_PARM_DESC(timestamp_monotonic, "Use monotonic timestamps");
75
76static void store_vblank(struct drm_device *dev, unsigned int pipe,
77 u32 vblank_count_inc,
78 struct timeval *t_vblank, u32 last)
79{
80 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
81
82 assert_spin_locked(&dev->vblank_time_lock);
83
84 vblank->last = last;
85
86 write_seqlock(&vblank->seqlock);
87 vblank->time = *t_vblank;
88 vblank->count += vblank_count_inc;
89 write_sequnlock(&vblank->seqlock);
90}
91
92
93
94
95
96
97
98
99
100
101static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipe)
102{
103 u32 cur_vblank;
104 bool rc;
105 struct timeval t_vblank;
106 int count = DRM_TIMESTAMP_MAXRETRIES;
107
108 spin_lock(&dev->vblank_time_lock);
109
110
111
112
113
114 do {
115 cur_vblank = dev->driver->get_vblank_counter(dev, pipe);
116 rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, 0);
117 } while (cur_vblank != dev->driver->get_vblank_counter(dev, pipe) && --count > 0);
118
119
120
121
122
123
124 if (!rc)
125 t_vblank = (struct timeval) {0, 0};
126
127
128
129
130
131 store_vblank(dev, pipe, 1, &t_vblank, cur_vblank);
132
133 spin_unlock(&dev->vblank_time_lock);
134}
135
136
137
138
139
140
141
142
143
144
145
146
147
148static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
149 unsigned long flags)
150{
151 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
152 u32 cur_vblank, diff;
153 bool rc;
154 struct timeval t_vblank;
155 int count = DRM_TIMESTAMP_MAXRETRIES;
156 int framedur_ns = vblank->framedur_ns;
157
158
159
160
161
162
163
164
165
166
167
168
169
170 do {
171 cur_vblank = dev->driver->get_vblank_counter(dev, pipe);
172 rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, flags);
173 } while (cur_vblank != dev->driver->get_vblank_counter(dev, pipe) && --count > 0);
174
175 if (dev->max_vblank_count != 0) {
176
177 diff = (cur_vblank - vblank->last) & dev->max_vblank_count;
178 } else if (rc && framedur_ns) {
179 const struct timeval *t_old;
180 u64 diff_ns;
181
182 t_old = &vblank->time;
183 diff_ns = timeval_to_ns(&t_vblank) - timeval_to_ns(t_old);
184
185
186
187
188
189
190 diff = DIV_ROUND_CLOSEST_ULL(diff_ns, framedur_ns);
191
192 if (diff == 0 && flags & DRM_CALLED_FROM_VBLIRQ)
193 DRM_DEBUG_VBL("crtc %u: Redundant vblirq ignored."
194 " diff_ns = %lld, framedur_ns = %d)\n",
195 pipe, (long long) diff_ns, framedur_ns);
196 } else {
197
198 diff = (flags & DRM_CALLED_FROM_VBLIRQ) != 0;
199 }
200
201
202
203
204
205
206
207
208
209
210 if (diff > 1 && (vblank->inmodeset & 0x2)) {
211 DRM_DEBUG_VBL("clamping vblank bump to 1 on crtc %u: diffr=%u"
212 " due to pre-modeset.\n", pipe, diff);
213 diff = 1;
214 }
215
216 DRM_DEBUG_VBL("updating vblank count on crtc %u:"
217 " current=%u, diff=%u, hw=%u hw_last=%u\n",
218 pipe, vblank->count, diff, cur_vblank, vblank->last);
219
220 if (diff == 0) {
221 WARN_ON_ONCE(cur_vblank != vblank->last);
222 return;
223 }
224
225
226
227
228
229
230
231 if (!rc && (flags & DRM_CALLED_FROM_VBLIRQ) == 0)
232 t_vblank = (struct timeval) {0, 0};
233
234 store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
235}
236
237static u32 drm_vblank_count(struct drm_device *dev, unsigned int pipe)
238{
239 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
240
241 if (WARN_ON(pipe >= dev->num_crtcs))
242 return 0;
243
244 return vblank->count;
245}
246
247
248
249
250
251
252
253
254
255
256
257u32 drm_accurate_vblank_count(struct drm_crtc *crtc)
258{
259 struct drm_device *dev = crtc->dev;
260 unsigned int pipe = drm_crtc_index(crtc);
261 u32 vblank;
262 unsigned long flags;
263
264 WARN(!dev->driver->get_vblank_timestamp,
265 "This function requires support for accurate vblank timestamps.");
266
267 spin_lock_irqsave(&dev->vblank_time_lock, flags);
268
269 drm_update_vblank_count(dev, pipe, 0);
270 vblank = drm_vblank_count(dev, pipe);
271
272 spin_unlock_irqrestore(&dev->vblank_time_lock, flags);
273
274 return vblank;
275}
276EXPORT_SYMBOL(drm_accurate_vblank_count);
277
278
279
280
281
282
283
284static void vblank_disable_and_save(struct drm_device *dev, unsigned int pipe)
285{
286 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
287 unsigned long irqflags;
288
289
290
291
292
293 spin_lock_irqsave(&dev->vblank_time_lock, irqflags);
294
295
296
297
298
299
300 if (vblank->enabled) {
301 dev->driver->disable_vblank(dev, pipe);
302 vblank->enabled = false;
303 }
304
305
306
307
308
309
310
311 drm_update_vblank_count(dev, pipe, 0);
312
313 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
314}
315
316static void vblank_disable_fn(unsigned long arg)
317{
318 struct drm_vblank_crtc *vblank = (void *)arg;
319 struct drm_device *dev = vblank->dev;
320 unsigned int pipe = vblank->pipe;
321 unsigned long irqflags;
322
323 spin_lock_irqsave(&dev->vbl_lock, irqflags);
324 if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) {
325 DRM_DEBUG("disabling vblank on crtc %u\n", pipe);
326 vblank_disable_and_save(dev, pipe);
327 }
328 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
329}
330
331
332
333
334
335
336
337void drm_vblank_cleanup(struct drm_device *dev)
338{
339 unsigned int pipe;
340
341
342 if (dev->num_crtcs == 0)
343 return;
344
345 for (pipe = 0; pipe < dev->num_crtcs; pipe++) {
346 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
347
348 WARN_ON(vblank->enabled &&
349 drm_core_check_feature(dev, DRIVER_MODESET));
350
351 del_timer_sync(&vblank->disable_timer);
352 }
353
354 kfree(dev->vblank);
355
356 dev->num_crtcs = 0;
357}
358EXPORT_SYMBOL(drm_vblank_cleanup);
359
360
361
362
363
364
365
366
367
368
369
370int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs)
371{
372 int ret = -ENOMEM;
373 unsigned int i;
374
375 spin_lock_init(&dev->vbl_lock);
376 spin_lock_init(&dev->vblank_time_lock);
377
378 dev->num_crtcs = num_crtcs;
379
380 dev->vblank = kcalloc(num_crtcs, sizeof(*dev->vblank), GFP_KERNEL);
381 if (!dev->vblank)
382 goto err;
383
384 for (i = 0; i < num_crtcs; i++) {
385 struct drm_vblank_crtc *vblank = &dev->vblank[i];
386
387 vblank->dev = dev;
388 vblank->pipe = i;
389 init_waitqueue_head(&vblank->queue);
390 setup_timer(&vblank->disable_timer, vblank_disable_fn,
391 (unsigned long)vblank);
392 seqlock_init(&vblank->seqlock);
393 }
394
395 DRM_INFO("Supports vblank timestamp caching Rev 2 (21.10.2013).\n");
396
397
398 if (dev->driver->get_vblank_timestamp)
399 DRM_INFO("Driver supports precise vblank timestamp query.\n");
400 else
401 DRM_INFO("No driver support for vblank timestamp query.\n");
402
403
404 if (dev->vblank_disable_immediate && !dev->driver->get_vblank_timestamp) {
405 dev->vblank_disable_immediate = false;
406 DRM_INFO("Setting vblank_disable_immediate to false because "
407 "get_vblank_timestamp == NULL\n");
408 }
409
410 return 0;
411
412err:
413 dev->num_crtcs = 0;
414 return ret;
415}
416EXPORT_SYMBOL(drm_vblank_init);
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435int drm_irq_install(struct drm_device *dev, int irq)
436{
437 int ret;
438 unsigned long sh_flags = 0;
439
440 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
441 return -EINVAL;
442
443 if (irq == 0)
444 return -EINVAL;
445
446
447 if (!dev->dev_private)
448 return -EINVAL;
449
450 if (dev->irq_enabled)
451 return -EBUSY;
452 dev->irq_enabled = true;
453
454 DRM_DEBUG("irq=%d\n", irq);
455
456
457 if (dev->driver->irq_preinstall)
458 dev->driver->irq_preinstall(dev);
459
460
461 if (drm_core_check_feature(dev, DRIVER_IRQ_SHARED))
462 sh_flags = IRQF_SHARED;
463
464 ret = request_irq(irq, dev->driver->irq_handler,
465 sh_flags, dev->driver->name, dev);
466
467 if (ret < 0) {
468 dev->irq_enabled = false;
469 return ret;
470 }
471
472
473 if (dev->driver->irq_postinstall)
474 ret = dev->driver->irq_postinstall(dev);
475
476 if (ret < 0) {
477 dev->irq_enabled = false;
478 if (drm_core_check_feature(dev, DRIVER_LEGACY))
479 vga_client_register(dev->pdev, NULL, NULL, NULL);
480 free_irq(irq, dev);
481 } else {
482 dev->irq = irq;
483 }
484
485 return ret;
486}
487EXPORT_SYMBOL(drm_irq_install);
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505int drm_irq_uninstall(struct drm_device *dev)
506{
507 unsigned long irqflags;
508 bool irq_enabled;
509 int i;
510
511 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
512 return -EINVAL;
513
514 irq_enabled = dev->irq_enabled;
515 dev->irq_enabled = false;
516
517
518
519
520
521
522
523 if (dev->num_crtcs) {
524 spin_lock_irqsave(&dev->vbl_lock, irqflags);
525 for (i = 0; i < dev->num_crtcs; i++) {
526 struct drm_vblank_crtc *vblank = &dev->vblank[i];
527
528 if (!vblank->enabled)
529 continue;
530
531 WARN_ON(drm_core_check_feature(dev, DRIVER_MODESET));
532
533 vblank_disable_and_save(dev, i);
534 wake_up(&vblank->queue);
535 }
536 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
537 }
538
539 if (!irq_enabled)
540 return -EINVAL;
541
542 DRM_DEBUG("irq=%d\n", dev->irq);
543
544 if (drm_core_check_feature(dev, DRIVER_LEGACY))
545 vga_client_register(dev->pdev, NULL, NULL, NULL);
546
547 if (dev->driver->irq_uninstall)
548 dev->driver->irq_uninstall(dev);
549
550 free_irq(dev->irq, dev);
551
552 return 0;
553}
554EXPORT_SYMBOL(drm_irq_uninstall);
555
556int drm_legacy_irq_control(struct drm_device *dev, void *data,
557 struct drm_file *file_priv)
558{
559 struct drm_control *ctl = data;
560 int ret = 0, irq;
561
562
563
564
565
566 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
567 return 0;
568 if (!drm_core_check_feature(dev, DRIVER_LEGACY))
569 return 0;
570
571 if (WARN_ON(!dev->pdev))
572 return -EINVAL;
573
574 switch (ctl->func) {
575 case DRM_INST_HANDLER:
576 irq = dev->pdev->irq;
577
578 if (dev->if_version < DRM_IF_VERSION(1, 2) &&
579 ctl->irq != irq)
580 return -EINVAL;
581 mutex_lock(&dev->struct_mutex);
582 ret = drm_irq_install(dev, irq);
583 mutex_unlock(&dev->struct_mutex);
584
585 return ret;
586 case DRM_UNINST_HANDLER:
587 mutex_lock(&dev->struct_mutex);
588 ret = drm_irq_uninstall(dev);
589 mutex_unlock(&dev->struct_mutex);
590
591 return ret;
592 default:
593 return -EINVAL;
594 }
595}
596
597
598
599
600
601
602
603
604
605
606
607
608void drm_calc_timestamping_constants(struct drm_crtc *crtc,
609 const struct drm_display_mode *mode)
610{
611 struct drm_device *dev = crtc->dev;
612 unsigned int pipe = drm_crtc_index(crtc);
613 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
614 int linedur_ns = 0, framedur_ns = 0;
615 int dotclock = mode->crtc_clock;
616
617 if (!dev->num_crtcs)
618 return;
619
620 if (WARN_ON(pipe >= dev->num_crtcs))
621 return;
622
623
624 if (dotclock > 0) {
625 int frame_size = mode->crtc_htotal * mode->crtc_vtotal;
626
627
628
629
630
631
632 linedur_ns = div_u64((u64) mode->crtc_htotal * 1000000, dotclock);
633 framedur_ns = div_u64((u64) frame_size * 1000000, dotclock);
634
635
636
637
638 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
639 framedur_ns /= 2;
640 } else
641 DRM_ERROR("crtc %u: Can't calculate constants, dotclock = 0!\n",
642 crtc->base.id);
643
644 vblank->linedur_ns = linedur_ns;
645 vblank->framedur_ns = framedur_ns;
646
647 DRM_DEBUG("crtc %u: hwmode: htotal %d, vtotal %d, vdisplay %d\n",
648 crtc->base.id, mode->crtc_htotal,
649 mode->crtc_vtotal, mode->crtc_vdisplay);
650 DRM_DEBUG("crtc %u: clock %d kHz framedur %d linedur %d\n",
651 crtc->base.id, dotclock, framedur_ns, linedur_ns);
652}
653EXPORT_SYMBOL(drm_calc_timestamping_constants);
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
701 unsigned int pipe,
702 int *max_error,
703 struct timeval *vblank_time,
704 unsigned flags,
705 const struct drm_display_mode *mode)
706{
707 struct timeval tv_etime;
708 ktime_t stime, etime;
709 unsigned int vbl_status;
710 int ret = DRM_VBLANKTIME_SCANOUTPOS_METHOD;
711 int vpos, hpos, i;
712 int delta_ns, duration_ns;
713
714 if (pipe >= dev->num_crtcs) {
715 DRM_ERROR("Invalid crtc %u\n", pipe);
716 return -EINVAL;
717 }
718
719
720 if (!dev->driver->get_scanout_position) {
721 DRM_ERROR("Called from driver w/o get_scanout_position()!?\n");
722 return -EIO;
723 }
724
725
726
727
728 if (mode->crtc_clock == 0) {
729 DRM_DEBUG("crtc %u: Noop due to uninitialized mode.\n", pipe);
730 return -EAGAIN;
731 }
732
733
734
735
736
737
738
739
740 for (i = 0; i < DRM_TIMESTAMP_MAXRETRIES; i++) {
741
742
743
744
745 vbl_status = dev->driver->get_scanout_position(dev, pipe, flags,
746 &vpos, &hpos,
747 &stime, &etime,
748 mode);
749
750
751 if (!(vbl_status & DRM_SCANOUTPOS_VALID)) {
752 DRM_DEBUG("crtc %u : scanoutpos query failed [0x%x].\n",
753 pipe, vbl_status);
754 return -EIO;
755 }
756
757
758 duration_ns = ktime_to_ns(etime) - ktime_to_ns(stime);
759
760
761 if (duration_ns <= *max_error)
762 break;
763 }
764
765
766 if (i == DRM_TIMESTAMP_MAXRETRIES) {
767 DRM_DEBUG("crtc %u: Noisy timestamp %d us > %d us [%d reps].\n",
768 pipe, duration_ns/1000, *max_error/1000, i);
769 }
770
771
772 *max_error = duration_ns;
773
774
775
776
777
778
779 if (vbl_status & DRM_SCANOUTPOS_IN_VBLANK)
780 ret |= DRM_VBLANKTIME_IN_VBLANK;
781
782
783
784
785
786 delta_ns = div_s64(1000000LL * (vpos * mode->crtc_htotal + hpos),
787 mode->crtc_clock);
788
789 if (!drm_timestamp_monotonic)
790 etime = ktime_mono_to_real(etime);
791
792
793 tv_etime = ktime_to_timeval(etime);
794
795
796
797 etime = ktime_sub_ns(etime, delta_ns);
798 *vblank_time = ktime_to_timeval(etime);
799
800 DRM_DEBUG_VBL("crtc %u : v 0x%x p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d rep]\n",
801 pipe, vbl_status, hpos, vpos,
802 (long)tv_etime.tv_sec, (long)tv_etime.tv_usec,
803 (long)vblank_time->tv_sec, (long)vblank_time->tv_usec,
804 duration_ns/1000, i);
805
806 return ret;
807}
808EXPORT_SYMBOL(drm_calc_vbltimestamp_from_scanoutpos);
809
810static struct timeval get_drm_timestamp(void)
811{
812 ktime_t now;
813
814 now = drm_timestamp_monotonic ? ktime_get() : ktime_get_real();
815 return ktime_to_timeval(now);
816}
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838static bool
839drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
840 struct timeval *tvblank, unsigned flags)
841{
842 int ret;
843
844
845 int max_error = (int) drm_timestamp_precision * 1000;
846
847
848 if (dev->driver->get_vblank_timestamp && (max_error > 0)) {
849 ret = dev->driver->get_vblank_timestamp(dev, pipe, &max_error,
850 tvblank, flags);
851 if (ret > 0)
852 return true;
853 }
854
855
856
857
858 *tvblank = get_drm_timestamp();
859
860 return false;
861}
862
863
864
865
866
867
868
869
870
871
872
873
874u32 drm_crtc_vblank_count(struct drm_crtc *crtc)
875{
876 return drm_vblank_count(crtc->dev, drm_crtc_index(crtc));
877}
878EXPORT_SYMBOL(drm_crtc_vblank_count);
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894static u32 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe,
895 struct timeval *vblanktime)
896{
897 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
898 u32 vblank_count;
899 unsigned int seq;
900
901 if (WARN_ON(pipe >= dev->num_crtcs)) {
902 *vblanktime = (struct timeval) { 0 };
903 return 0;
904 }
905
906 do {
907 seq = read_seqbegin(&vblank->seqlock);
908 vblank_count = vblank->count;
909 *vblanktime = vblank->time;
910 } while (read_seqretry(&vblank->seqlock, seq));
911
912 return vblank_count;
913}
914
915
916
917
918
919
920
921
922
923
924
925
926u32 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc,
927 struct timeval *vblanktime)
928{
929 return drm_vblank_count_and_time(crtc->dev, drm_crtc_index(crtc),
930 vblanktime);
931}
932EXPORT_SYMBOL(drm_crtc_vblank_count_and_time);
933
934static void send_vblank_event(struct drm_device *dev,
935 struct drm_pending_vblank_event *e,
936 unsigned long seq, struct timeval *now)
937{
938 e->event.sequence = seq;
939 e->event.tv_sec = now->tv_sec;
940 e->event.tv_usec = now->tv_usec;
941
942 trace_drm_vblank_event_delivered(e->base.pid, e->pipe,
943 e->event.sequence);
944
945 drm_send_event_locked(dev, &e->base);
946}
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986void drm_crtc_arm_vblank_event(struct drm_crtc *crtc,
987 struct drm_pending_vblank_event *e)
988{
989 struct drm_device *dev = crtc->dev;
990 unsigned int pipe = drm_crtc_index(crtc);
991
992 assert_spin_locked(&dev->event_lock);
993
994 e->pipe = pipe;
995 e->event.sequence = drm_vblank_count(dev, pipe);
996 list_add_tail(&e->base.link, &dev->vblank_event_list);
997}
998EXPORT_SYMBOL(drm_crtc_arm_vblank_event);
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011void drm_crtc_send_vblank_event(struct drm_crtc *crtc,
1012 struct drm_pending_vblank_event *e)
1013{
1014 struct drm_device *dev = crtc->dev;
1015 unsigned int seq, pipe = drm_crtc_index(crtc);
1016 struct timeval now;
1017
1018 if (dev->num_crtcs > 0) {
1019 seq = drm_vblank_count_and_time(dev, pipe, &now);
1020 } else {
1021 seq = 0;
1022
1023 now = get_drm_timestamp();
1024 }
1025 e->pipe = pipe;
1026 send_vblank_event(dev, e, seq, &now);
1027}
1028EXPORT_SYMBOL(drm_crtc_send_vblank_event);
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038static int drm_vblank_enable(struct drm_device *dev, unsigned int pipe)
1039{
1040 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
1041 int ret = 0;
1042
1043 assert_spin_locked(&dev->vbl_lock);
1044
1045 spin_lock(&dev->vblank_time_lock);
1046
1047 if (!vblank->enabled) {
1048
1049
1050
1051
1052
1053
1054
1055 ret = dev->driver->enable_vblank(dev, pipe);
1056 DRM_DEBUG("enabling vblank on crtc %u, ret: %d\n", pipe, ret);
1057 if (ret)
1058 atomic_dec(&vblank->refcount);
1059 else {
1060 vblank->enabled = true;
1061 drm_update_vblank_count(dev, pipe, 0);
1062 }
1063 }
1064
1065 spin_unlock(&dev->vblank_time_lock);
1066
1067 return ret;
1068}
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083static int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
1084{
1085 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
1086 unsigned long irqflags;
1087 int ret = 0;
1088
1089 if (!dev->num_crtcs)
1090 return -EINVAL;
1091
1092 if (WARN_ON(pipe >= dev->num_crtcs))
1093 return -EINVAL;
1094
1095 spin_lock_irqsave(&dev->vbl_lock, irqflags);
1096
1097 if (atomic_add_return(1, &vblank->refcount) == 1) {
1098 ret = drm_vblank_enable(dev, pipe);
1099 } else {
1100 if (!vblank->enabled) {
1101 atomic_dec(&vblank->refcount);
1102 ret = -EINVAL;
1103 }
1104 }
1105 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
1106
1107 return ret;
1108}
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120int drm_crtc_vblank_get(struct drm_crtc *crtc)
1121{
1122 return drm_vblank_get(crtc->dev, drm_crtc_index(crtc));
1123}
1124EXPORT_SYMBOL(drm_crtc_vblank_get);
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136static void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
1137{
1138 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
1139
1140 if (WARN_ON(pipe >= dev->num_crtcs))
1141 return;
1142
1143 if (WARN_ON(atomic_read(&vblank->refcount) == 0))
1144 return;
1145
1146
1147 if (atomic_dec_and_test(&vblank->refcount)) {
1148 if (drm_vblank_offdelay == 0)
1149 return;
1150 else if (dev->vblank_disable_immediate || drm_vblank_offdelay < 0)
1151 vblank_disable_fn((unsigned long)vblank);
1152 else
1153 mod_timer(&vblank->disable_timer,
1154 jiffies + ((drm_vblank_offdelay * HZ)/1000));
1155 }
1156}
1157
1158
1159
1160
1161
1162
1163
1164
1165void drm_crtc_vblank_put(struct drm_crtc *crtc)
1166{
1167 drm_vblank_put(crtc->dev, drm_crtc_index(crtc));
1168}
1169EXPORT_SYMBOL(drm_crtc_vblank_put);
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe)
1181{
1182 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
1183 int ret;
1184 u32 last;
1185
1186 if (WARN_ON(pipe >= dev->num_crtcs))
1187 return;
1188
1189 ret = drm_vblank_get(dev, pipe);
1190 if (WARN(ret, "vblank not available on crtc %i, ret=%i\n", pipe, ret))
1191 return;
1192
1193 last = drm_vblank_count(dev, pipe);
1194
1195 ret = wait_event_timeout(vblank->queue,
1196 last != drm_vblank_count(dev, pipe),
1197 msecs_to_jiffies(100));
1198
1199 WARN(ret == 0, "vblank wait timed out on crtc %i\n", pipe);
1200
1201 drm_vblank_put(dev, pipe);
1202}
1203EXPORT_SYMBOL(drm_wait_one_vblank);
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213void drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
1214{
1215 drm_wait_one_vblank(crtc->dev, drm_crtc_index(crtc));
1216}
1217EXPORT_SYMBOL(drm_crtc_wait_one_vblank);
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230void drm_crtc_vblank_off(struct drm_crtc *crtc)
1231{
1232 struct drm_device *dev = crtc->dev;
1233 unsigned int pipe = drm_crtc_index(crtc);
1234 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
1235 struct drm_pending_vblank_event *e, *t;
1236 struct timeval now;
1237 unsigned long irqflags;
1238 unsigned int seq;
1239
1240 if (WARN_ON(pipe >= dev->num_crtcs))
1241 return;
1242
1243 spin_lock_irqsave(&dev->event_lock, irqflags);
1244
1245 spin_lock(&dev->vbl_lock);
1246 DRM_DEBUG_VBL("crtc %d, vblank enabled %d, inmodeset %d\n",
1247 pipe, vblank->enabled, vblank->inmodeset);
1248
1249
1250
1251 if (drm_core_check_feature(dev, DRIVER_ATOMIC) || !vblank->inmodeset)
1252 vblank_disable_and_save(dev, pipe);
1253
1254 wake_up(&vblank->queue);
1255
1256
1257
1258
1259
1260 if (!vblank->inmodeset) {
1261 atomic_inc(&vblank->refcount);
1262 vblank->inmodeset = 1;
1263 }
1264 spin_unlock(&dev->vbl_lock);
1265
1266
1267 seq = drm_vblank_count_and_time(dev, pipe, &now);
1268
1269 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
1270 if (e->pipe != pipe)
1271 continue;
1272 DRM_DEBUG("Sending premature vblank event on disable: "
1273 "wanted %u, current %u\n",
1274 e->event.sequence, seq);
1275 list_del(&e->base.link);
1276 drm_vblank_put(dev, pipe);
1277 send_vblank_event(dev, e, seq, &now);
1278 }
1279 spin_unlock_irqrestore(&dev->event_lock, irqflags);
1280}
1281EXPORT_SYMBOL(drm_crtc_vblank_off);
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293void drm_crtc_vblank_reset(struct drm_crtc *crtc)
1294{
1295 struct drm_device *dev = crtc->dev;
1296 unsigned long irqflags;
1297 unsigned int pipe = drm_crtc_index(crtc);
1298 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
1299
1300 spin_lock_irqsave(&dev->vbl_lock, irqflags);
1301
1302
1303
1304
1305 if (!vblank->inmodeset) {
1306 atomic_inc(&vblank->refcount);
1307 vblank->inmodeset = 1;
1308 }
1309 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
1310
1311 WARN_ON(!list_empty(&dev->vblank_event_list));
1312}
1313EXPORT_SYMBOL(drm_crtc_vblank_reset);
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324void drm_crtc_vblank_on(struct drm_crtc *crtc)
1325{
1326 struct drm_device *dev = crtc->dev;
1327 unsigned int pipe = drm_crtc_index(crtc);
1328 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
1329 unsigned long irqflags;
1330
1331 if (WARN_ON(pipe >= dev->num_crtcs))
1332 return;
1333
1334 spin_lock_irqsave(&dev->vbl_lock, irqflags);
1335 DRM_DEBUG_VBL("crtc %d, vblank enabled %d, inmodeset %d\n",
1336 pipe, vblank->enabled, vblank->inmodeset);
1337
1338
1339 if (vblank->inmodeset) {
1340 atomic_dec(&vblank->refcount);
1341 vblank->inmodeset = 0;
1342 }
1343
1344 drm_reset_vblank_timestamp(dev, pipe);
1345
1346
1347
1348
1349
1350 if (atomic_read(&vblank->refcount) != 0 || drm_vblank_offdelay == 0)
1351 WARN_ON(drm_vblank_enable(dev, pipe));
1352 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
1353}
1354EXPORT_SYMBOL(drm_crtc_vblank_on);
1355
1356static void drm_legacy_vblank_pre_modeset(struct drm_device *dev,
1357 unsigned int pipe)
1358{
1359 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
1360
1361
1362 if (!dev->num_crtcs)
1363 return;
1364
1365 if (WARN_ON(pipe >= dev->num_crtcs))
1366 return;
1367
1368
1369
1370
1371
1372
1373
1374
1375 if (!vblank->inmodeset) {
1376 vblank->inmodeset = 0x1;
1377 if (drm_vblank_get(dev, pipe) == 0)
1378 vblank->inmodeset |= 0x2;
1379 }
1380}
1381
1382static void drm_legacy_vblank_post_modeset(struct drm_device *dev,
1383 unsigned int pipe)
1384{
1385 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
1386 unsigned long irqflags;
1387
1388
1389 if (!dev->num_crtcs)
1390 return;
1391
1392 if (WARN_ON(pipe >= dev->num_crtcs))
1393 return;
1394
1395 if (vblank->inmodeset) {
1396 spin_lock_irqsave(&dev->vbl_lock, irqflags);
1397 drm_reset_vblank_timestamp(dev, pipe);
1398 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
1399
1400 if (vblank->inmodeset & 0x2)
1401 drm_vblank_put(dev, pipe);
1402
1403 vblank->inmodeset = 0;
1404 }
1405}
1406
1407int drm_legacy_modeset_ctl(struct drm_device *dev, void *data,
1408 struct drm_file *file_priv)
1409{
1410 struct drm_modeset_ctl *modeset = data;
1411 unsigned int pipe;
1412
1413
1414 if (!dev->num_crtcs)
1415 return 0;
1416
1417
1418 if (!drm_core_check_feature(dev, DRIVER_LEGACY))
1419 return 0;
1420
1421 pipe = modeset->crtc;
1422 if (pipe >= dev->num_crtcs)
1423 return -EINVAL;
1424
1425 switch (modeset->cmd) {
1426 case _DRM_PRE_MODESET:
1427 drm_legacy_vblank_pre_modeset(dev, pipe);
1428 break;
1429 case _DRM_POST_MODESET:
1430 drm_legacy_vblank_post_modeset(dev, pipe);
1431 break;
1432 default:
1433 return -EINVAL;
1434 }
1435
1436 return 0;
1437}
1438
1439static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe,
1440 union drm_wait_vblank *vblwait,
1441 struct drm_file *file_priv)
1442{
1443 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
1444 struct drm_pending_vblank_event *e;
1445 struct timeval now;
1446 unsigned long flags;
1447 unsigned int seq;
1448 int ret;
1449
1450 e = kzalloc(sizeof(*e), GFP_KERNEL);
1451 if (e == NULL) {
1452 ret = -ENOMEM;
1453 goto err_put;
1454 }
1455
1456 e->pipe = pipe;
1457 e->base.pid = current->pid;
1458 e->event.base.type = DRM_EVENT_VBLANK;
1459 e->event.base.length = sizeof(e->event);
1460 e->event.user_data = vblwait->request.signal;
1461
1462 spin_lock_irqsave(&dev->event_lock, flags);
1463
1464
1465
1466
1467
1468
1469
1470 if (!vblank->enabled) {
1471 ret = -EINVAL;
1472 goto err_unlock;
1473 }
1474
1475 ret = drm_event_reserve_init_locked(dev, file_priv, &e->base,
1476 &e->event.base);
1477
1478 if (ret)
1479 goto err_unlock;
1480
1481 seq = drm_vblank_count_and_time(dev, pipe, &now);
1482
1483 DRM_DEBUG("event on vblank count %u, current %u, crtc %u\n",
1484 vblwait->request.sequence, seq, pipe);
1485
1486 trace_drm_vblank_event_queued(current->pid, pipe,
1487 vblwait->request.sequence);
1488
1489 e->event.sequence = vblwait->request.sequence;
1490 if ((seq - vblwait->request.sequence) <= (1 << 23)) {
1491 drm_vblank_put(dev, pipe);
1492 send_vblank_event(dev, e, seq, &now);
1493 vblwait->reply.sequence = seq;
1494 } else {
1495
1496 list_add_tail(&e->base.link, &dev->vblank_event_list);
1497 vblwait->reply.sequence = vblwait->request.sequence;
1498 }
1499
1500 spin_unlock_irqrestore(&dev->event_lock, flags);
1501
1502 return 0;
1503
1504err_unlock:
1505 spin_unlock_irqrestore(&dev->event_lock, flags);
1506 kfree(e);
1507err_put:
1508 drm_vblank_put(dev, pipe);
1509 return ret;
1510}
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526int drm_wait_vblank(struct drm_device *dev, void *data,
1527 struct drm_file *file_priv)
1528{
1529 struct drm_vblank_crtc *vblank;
1530 union drm_wait_vblank *vblwait = data;
1531 int ret;
1532 unsigned int flags, seq, pipe, high_pipe;
1533
1534 if (!dev->irq_enabled)
1535 return -EINVAL;
1536
1537 if (vblwait->request.type & _DRM_VBLANK_SIGNAL)
1538 return -EINVAL;
1539
1540 if (vblwait->request.type &
1541 ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
1542 _DRM_VBLANK_HIGH_CRTC_MASK)) {
1543 DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n",
1544 vblwait->request.type,
1545 (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
1546 _DRM_VBLANK_HIGH_CRTC_MASK));
1547 return -EINVAL;
1548 }
1549
1550 flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK;
1551 high_pipe = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK);
1552 if (high_pipe)
1553 pipe = high_pipe >> _DRM_VBLANK_HIGH_CRTC_SHIFT;
1554 else
1555 pipe = flags & _DRM_VBLANK_SECONDARY ? 1 : 0;
1556 if (pipe >= dev->num_crtcs)
1557 return -EINVAL;
1558
1559 vblank = &dev->vblank[pipe];
1560
1561 ret = drm_vblank_get(dev, pipe);
1562 if (ret) {
1563 DRM_DEBUG("failed to acquire vblank counter, %d\n", ret);
1564 return ret;
1565 }
1566 seq = drm_vblank_count(dev, pipe);
1567
1568 switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) {
1569 case _DRM_VBLANK_RELATIVE:
1570 vblwait->request.sequence += seq;
1571 vblwait->request.type &= ~_DRM_VBLANK_RELATIVE;
1572 case _DRM_VBLANK_ABSOLUTE:
1573 break;
1574 default:
1575 ret = -EINVAL;
1576 goto done;
1577 }
1578
1579 if ((flags & _DRM_VBLANK_NEXTONMISS) &&
1580 (seq - vblwait->request.sequence) <= (1 << 23)) {
1581 vblwait->request.sequence = seq + 1;
1582 }
1583
1584 if (flags & _DRM_VBLANK_EVENT) {
1585
1586
1587
1588 return drm_queue_vblank_event(dev, pipe, vblwait, file_priv);
1589 }
1590
1591 DRM_DEBUG("waiting on vblank count %u, crtc %u\n",
1592 vblwait->request.sequence, pipe);
1593 DRM_WAIT_ON(ret, vblank->queue, 3 * HZ,
1594 (((drm_vblank_count(dev, pipe) -
1595 vblwait->request.sequence) <= (1 << 23)) ||
1596 !vblank->enabled ||
1597 !dev->irq_enabled));
1598
1599 if (ret != -EINTR) {
1600 struct timeval now;
1601
1602 vblwait->reply.sequence = drm_vblank_count_and_time(dev, pipe, &now);
1603 vblwait->reply.tval_sec = now.tv_sec;
1604 vblwait->reply.tval_usec = now.tv_usec;
1605
1606 DRM_DEBUG("returning %u to client\n",
1607 vblwait->reply.sequence);
1608 } else {
1609 DRM_DEBUG("vblank wait interrupted by signal\n");
1610 }
1611
1612done:
1613 drm_vblank_put(dev, pipe);
1614 return ret;
1615}
1616
1617static void drm_handle_vblank_events(struct drm_device *dev, unsigned int pipe)
1618{
1619 struct drm_pending_vblank_event *e, *t;
1620 struct timeval now;
1621 unsigned int seq;
1622
1623 assert_spin_locked(&dev->event_lock);
1624
1625 seq = drm_vblank_count_and_time(dev, pipe, &now);
1626
1627 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
1628 if (e->pipe != pipe)
1629 continue;
1630 if ((seq - e->event.sequence) > (1<<23))
1631 continue;
1632
1633 DRM_DEBUG("vblank event on %u, current %u\n",
1634 e->event.sequence, seq);
1635
1636 list_del(&e->base.link);
1637 drm_vblank_put(dev, pipe);
1638 send_vblank_event(dev, e, seq, &now);
1639 }
1640
1641 trace_drm_vblank_event(pipe, seq);
1642}
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe)
1655{
1656 struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
1657 unsigned long irqflags;
1658
1659 if (WARN_ON_ONCE(!dev->num_crtcs))
1660 return false;
1661
1662 if (WARN_ON(pipe >= dev->num_crtcs))
1663 return false;
1664
1665 spin_lock_irqsave(&dev->event_lock, irqflags);
1666
1667
1668
1669
1670
1671 spin_lock(&dev->vblank_time_lock);
1672
1673
1674 if (!vblank->enabled) {
1675 spin_unlock(&dev->vblank_time_lock);
1676 spin_unlock_irqrestore(&dev->event_lock, irqflags);
1677 return false;
1678 }
1679
1680 drm_update_vblank_count(dev, pipe, DRM_CALLED_FROM_VBLIRQ);
1681
1682 spin_unlock(&dev->vblank_time_lock);
1683
1684 wake_up(&vblank->queue);
1685 drm_handle_vblank_events(dev, pipe);
1686
1687 spin_unlock_irqrestore(&dev->event_lock, irqflags);
1688
1689 return true;
1690}
1691EXPORT_SYMBOL(drm_handle_vblank);
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705bool drm_crtc_handle_vblank(struct drm_crtc *crtc)
1706{
1707 return drm_handle_vblank(crtc->dev, drm_crtc_index(crtc));
1708}
1709EXPORT_SYMBOL(drm_crtc_handle_vblank);
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe)
1723{
1724 WARN_ON_ONCE(dev->max_vblank_count != 0);
1725 return 0;
1726}
1727EXPORT_SYMBOL(drm_vblank_no_hw_counter);
1728