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