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
36#include <drm/drmP.h>
37#include "drm_trace.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, crtc, count) ( \
47 (dev)->_vblank_time[(crtc) * DRM_VBLANKTIME_RBSIZE + \
48 ((count) % DRM_VBLANKTIME_RBSIZE)])
49
50
51
52
53#define DRM_TIMESTAMP_MAXRETRIES 3
54
55
56
57
58#define DRM_REDUNDANT_VBLIRQ_THRESH_NS 1000000
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73int drm_irq_by_busid(struct drm_device *dev, void *data,
74 struct drm_file *file_priv)
75{
76 struct drm_irq_busid *p = data;
77
78 if (!dev->driver->bus->irq_by_busid)
79 return -EINVAL;
80
81 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
82 return -EINVAL;
83
84 return dev->driver->bus->irq_by_busid(dev, p);
85}
86
87
88
89
90static void clear_vblank_timestamps(struct drm_device *dev, int crtc)
91{
92 memset(&dev->_vblank_time[crtc * DRM_VBLANKTIME_RBSIZE], 0,
93 DRM_VBLANKTIME_RBSIZE * sizeof(struct timeval));
94}
95
96
97
98
99
100
101
102static void vblank_disable_and_save(struct drm_device *dev, int crtc)
103{
104 unsigned long irqflags;
105 u32 vblcount;
106 s64 diff_ns;
107 int vblrc;
108 struct timeval tvblank;
109 int count = DRM_TIMESTAMP_MAXRETRIES;
110
111
112
113
114
115 spin_lock_irqsave(&dev->vblank_time_lock, irqflags);
116
117 dev->driver->disable_vblank(dev, crtc);
118 dev->vblank_enabled[crtc] = 0;
119
120
121
122
123
124
125
126
127
128
129
130
131
132 do {
133 dev->last_vblank[crtc] = dev->driver->get_vblank_counter(dev, crtc);
134 vblrc = drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0);
135 } while (dev->last_vblank[crtc] != dev->driver->get_vblank_counter(dev, crtc) && (--count) && vblrc);
136
137 if (!count)
138 vblrc = 0;
139
140
141
142
143 vblcount = atomic_read(&dev->_vblank_count[crtc]);
144 diff_ns = timeval_to_ns(&tvblank) -
145 timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount));
146
147
148
149
150
151
152
153
154
155
156
157
158
159 if ((vblrc > 0) && (abs64(diff_ns) > 1000000)) {
160 atomic_inc(&dev->_vblank_count[crtc]);
161 smp_mb__after_atomic_inc();
162 }
163
164
165 clear_vblank_timestamps(dev, crtc);
166
167 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
168}
169
170static void vblank_disable_fn(unsigned long arg)
171{
172 struct drm_device *dev = (struct drm_device *)arg;
173 unsigned long irqflags;
174 int i;
175
176 if (!dev->vblank_disable_allowed)
177 return;
178
179 for (i = 0; i < dev->num_crtcs; i++) {
180 spin_lock_irqsave(&dev->vbl_lock, irqflags);
181 if (atomic_read(&dev->vblank_refcount[i]) == 0 &&
182 dev->vblank_enabled[i]) {
183 DRM_DEBUG("disabling vblank on crtc %d\n", i);
184 vblank_disable_and_save(dev, i);
185 }
186 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
187 }
188}
189
190void drm_vblank_cleanup(struct drm_device *dev)
191{
192
193 if (dev->num_crtcs == 0)
194 return;
195
196 del_timer_sync(&dev->vblank_disable_timer);
197
198 vblank_disable_fn((unsigned long)dev);
199
200 kfree(dev->vbl_queue);
201 kfree(dev->_vblank_count);
202 kfree(dev->vblank_refcount);
203 kfree(dev->vblank_enabled);
204 kfree(dev->last_vblank);
205 kfree(dev->last_vblank_wait);
206 kfree(dev->vblank_inmodeset);
207 kfree(dev->_vblank_time);
208
209 dev->num_crtcs = 0;
210}
211EXPORT_SYMBOL(drm_vblank_cleanup);
212
213int drm_vblank_init(struct drm_device *dev, int num_crtcs)
214{
215 int i, ret = -ENOMEM;
216
217 setup_timer(&dev->vblank_disable_timer, vblank_disable_fn,
218 (unsigned long)dev);
219 spin_lock_init(&dev->vbl_lock);
220 spin_lock_init(&dev->vblank_time_lock);
221
222 dev->num_crtcs = num_crtcs;
223
224 dev->vbl_queue = kmalloc(sizeof(wait_queue_head_t) * num_crtcs,
225 GFP_KERNEL);
226 if (!dev->vbl_queue)
227 goto err;
228
229 dev->_vblank_count = kmalloc(sizeof(atomic_t) * num_crtcs, GFP_KERNEL);
230 if (!dev->_vblank_count)
231 goto err;
232
233 dev->vblank_refcount = kmalloc(sizeof(atomic_t) * num_crtcs,
234 GFP_KERNEL);
235 if (!dev->vblank_refcount)
236 goto err;
237
238 dev->vblank_enabled = kcalloc(num_crtcs, sizeof(int), GFP_KERNEL);
239 if (!dev->vblank_enabled)
240 goto err;
241
242 dev->last_vblank = kcalloc(num_crtcs, sizeof(u32), GFP_KERNEL);
243 if (!dev->last_vblank)
244 goto err;
245
246 dev->last_vblank_wait = kcalloc(num_crtcs, sizeof(u32), GFP_KERNEL);
247 if (!dev->last_vblank_wait)
248 goto err;
249
250 dev->vblank_inmodeset = kcalloc(num_crtcs, sizeof(int), GFP_KERNEL);
251 if (!dev->vblank_inmodeset)
252 goto err;
253
254 dev->_vblank_time = kcalloc(num_crtcs * DRM_VBLANKTIME_RBSIZE,
255 sizeof(struct timeval), GFP_KERNEL);
256 if (!dev->_vblank_time)
257 goto err;
258
259 DRM_INFO("Supports vblank timestamp caching Rev 1 (10.10.2010).\n");
260
261
262 if (dev->driver->get_vblank_timestamp)
263 DRM_INFO("Driver supports precise vblank timestamp query.\n");
264 else
265 DRM_INFO("No driver support for vblank timestamp query.\n");
266
267
268 for (i = 0; i < num_crtcs; i++) {
269 init_waitqueue_head(&dev->vbl_queue[i]);
270 atomic_set(&dev->_vblank_count[i], 0);
271 atomic_set(&dev->vblank_refcount[i], 0);
272 }
273
274 dev->vblank_disable_allowed = 0;
275 return 0;
276
277err:
278 drm_vblank_cleanup(dev);
279 return ret;
280}
281EXPORT_SYMBOL(drm_vblank_init);
282
283static void drm_irq_vgaarb_nokms(void *cookie, bool state)
284{
285 struct drm_device *dev = cookie;
286
287 if (dev->driver->vgaarb_irq) {
288 dev->driver->vgaarb_irq(dev, state);
289 return;
290 }
291
292 if (!dev->irq_enabled)
293 return;
294
295 if (state) {
296 if (dev->driver->irq_uninstall)
297 dev->driver->irq_uninstall(dev);
298 } else {
299 if (dev->driver->irq_preinstall)
300 dev->driver->irq_preinstall(dev);
301 if (dev->driver->irq_postinstall)
302 dev->driver->irq_postinstall(dev);
303 }
304}
305
306
307
308
309
310
311
312
313
314
315int drm_irq_install(struct drm_device *dev)
316{
317 int ret;
318 unsigned long sh_flags = 0;
319 char *irqname;
320
321 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
322 return -EINVAL;
323
324 if (drm_dev_to_irq(dev) == 0)
325 return -EINVAL;
326
327 mutex_lock(&dev->struct_mutex);
328
329
330 if (!dev->dev_private) {
331 mutex_unlock(&dev->struct_mutex);
332 return -EINVAL;
333 }
334
335 if (dev->irq_enabled) {
336 mutex_unlock(&dev->struct_mutex);
337 return -EBUSY;
338 }
339 dev->irq_enabled = 1;
340 mutex_unlock(&dev->struct_mutex);
341
342 DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
343
344
345 if (dev->driver->irq_preinstall)
346 dev->driver->irq_preinstall(dev);
347
348
349 if (drm_core_check_feature(dev, DRIVER_IRQ_SHARED))
350 sh_flags = IRQF_SHARED;
351
352 if (dev->devname)
353 irqname = dev->devname;
354 else
355 irqname = dev->driver->name;
356
357 ret = request_irq(drm_dev_to_irq(dev), dev->driver->irq_handler,
358 sh_flags, irqname, dev);
359
360 if (ret < 0) {
361 mutex_lock(&dev->struct_mutex);
362 dev->irq_enabled = 0;
363 mutex_unlock(&dev->struct_mutex);
364 return ret;
365 }
366
367 if (!drm_core_check_feature(dev, DRIVER_MODESET))
368 vga_client_register(dev->pdev, (void *)dev, drm_irq_vgaarb_nokms, NULL);
369
370
371 if (dev->driver->irq_postinstall)
372 ret = dev->driver->irq_postinstall(dev);
373
374 if (ret < 0) {
375 mutex_lock(&dev->struct_mutex);
376 dev->irq_enabled = 0;
377 mutex_unlock(&dev->struct_mutex);
378 if (!drm_core_check_feature(dev, DRIVER_MODESET))
379 vga_client_register(dev->pdev, NULL, NULL, NULL);
380 free_irq(drm_dev_to_irq(dev), dev);
381 }
382
383 return ret;
384}
385EXPORT_SYMBOL(drm_irq_install);
386
387
388
389
390
391
392
393
394int drm_irq_uninstall(struct drm_device *dev)
395{
396 unsigned long irqflags;
397 int irq_enabled, i;
398
399 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
400 return -EINVAL;
401
402 mutex_lock(&dev->struct_mutex);
403 irq_enabled = dev->irq_enabled;
404 dev->irq_enabled = 0;
405 mutex_unlock(&dev->struct_mutex);
406
407
408
409
410 if (dev->num_crtcs) {
411 spin_lock_irqsave(&dev->vbl_lock, irqflags);
412 for (i = 0; i < dev->num_crtcs; i++) {
413 DRM_WAKEUP(&dev->vbl_queue[i]);
414 dev->vblank_enabled[i] = 0;
415 dev->last_vblank[i] =
416 dev->driver->get_vblank_counter(dev, i);
417 }
418 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
419 }
420
421 if (!irq_enabled)
422 return -EINVAL;
423
424 DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
425
426 if (!drm_core_check_feature(dev, DRIVER_MODESET))
427 vga_client_register(dev->pdev, NULL, NULL, NULL);
428
429 if (dev->driver->irq_uninstall)
430 dev->driver->irq_uninstall(dev);
431
432 free_irq(drm_dev_to_irq(dev), dev);
433
434 return 0;
435}
436EXPORT_SYMBOL(drm_irq_uninstall);
437
438
439
440
441
442
443
444
445
446
447
448
449int drm_control(struct drm_device *dev, void *data,
450 struct drm_file *file_priv)
451{
452 struct drm_control *ctl = data;
453
454
455
456
457
458
459 switch (ctl->func) {
460 case DRM_INST_HANDLER:
461 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
462 return 0;
463 if (drm_core_check_feature(dev, DRIVER_MODESET))
464 return 0;
465 if (dev->if_version < DRM_IF_VERSION(1, 2) &&
466 ctl->irq != drm_dev_to_irq(dev))
467 return -EINVAL;
468 return drm_irq_install(dev);
469 case DRM_UNINST_HANDLER:
470 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
471 return 0;
472 if (drm_core_check_feature(dev, DRIVER_MODESET))
473 return 0;
474 return drm_irq_uninstall(dev);
475 default:
476 return -EINVAL;
477 }
478}
479
480
481
482
483
484
485
486
487
488
489
490
491
492void drm_calc_timestamping_constants(struct drm_crtc *crtc)
493{
494 s64 linedur_ns = 0, pixeldur_ns = 0, framedur_ns = 0;
495 u64 dotclock;
496
497
498 dotclock = (u64) crtc->hwmode.clock * 1000;
499
500
501
502
503 if (crtc->hwmode.flags & DRM_MODE_FLAG_INTERLACE)
504 dotclock *= 2;
505
506
507 if (dotclock > 0) {
508 int frame_size;
509
510
511
512
513 pixeldur_ns = (s64) div64_u64(1000000000, dotclock);
514 linedur_ns = (s64) div64_u64(((u64) crtc->hwmode.crtc_htotal *
515 1000000000), dotclock);
516 frame_size = crtc->hwmode.crtc_htotal *
517 crtc->hwmode.crtc_vtotal;
518 framedur_ns = (s64) div64_u64((u64) frame_size * 1000000000,
519 dotclock);
520 } else
521 DRM_ERROR("crtc %d: Can't calculate constants, dotclock = 0!\n",
522 crtc->base.id);
523
524 crtc->pixeldur_ns = pixeldur_ns;
525 crtc->linedur_ns = linedur_ns;
526 crtc->framedur_ns = framedur_ns;
527
528 DRM_DEBUG("crtc %d: hwmode: htotal %d, vtotal %d, vdisplay %d\n",
529 crtc->base.id, crtc->hwmode.crtc_htotal,
530 crtc->hwmode.crtc_vtotal, crtc->hwmode.crtc_vdisplay);
531 DRM_DEBUG("crtc %d: clock %d kHz framedur %d linedur %d, pixeldur %d\n",
532 crtc->base.id, (int) dotclock/1000, (int) framedur_ns,
533 (int) linedur_ns, (int) pixeldur_ns);
534}
535EXPORT_SYMBOL(drm_calc_timestamping_constants);
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc,
582 int *max_error,
583 struct timeval *vblank_time,
584 unsigned flags,
585 struct drm_crtc *refcrtc)
586{
587 ktime_t stime, etime, mono_time_offset;
588 struct timeval tv_etime;
589 struct drm_display_mode *mode;
590 int vbl_status, vtotal, vdisplay;
591 int vpos, hpos, i;
592 s64 framedur_ns, linedur_ns, pixeldur_ns, delta_ns, duration_ns;
593 bool invbl;
594
595 if (crtc < 0 || crtc >= dev->num_crtcs) {
596 DRM_ERROR("Invalid crtc %d\n", crtc);
597 return -EINVAL;
598 }
599
600
601 if (!dev->driver->get_scanout_position) {
602 DRM_ERROR("Called from driver w/o get_scanout_position()!?\n");
603 return -EIO;
604 }
605
606 mode = &refcrtc->hwmode;
607 vtotal = mode->crtc_vtotal;
608 vdisplay = mode->crtc_vdisplay;
609
610
611 framedur_ns = refcrtc->framedur_ns;
612 linedur_ns = refcrtc->linedur_ns;
613 pixeldur_ns = refcrtc->pixeldur_ns;
614
615
616
617
618 if (vtotal <= 0 || vdisplay <= 0 || framedur_ns == 0) {
619 DRM_DEBUG("crtc %d: Noop due to uninitialized mode.\n", crtc);
620 return -EAGAIN;
621 }
622
623
624
625
626
627
628
629
630 for (i = 0; i < DRM_TIMESTAMP_MAXRETRIES; i++) {
631
632
633
634 preempt_disable();
635
636
637 stime = ktime_get();
638
639
640 vbl_status = dev->driver->get_scanout_position(dev, crtc, &vpos, &hpos);
641
642
643 etime = ktime_get();
644 if (!drm_timestamp_monotonic)
645 mono_time_offset = ktime_get_monotonic_offset();
646
647 preempt_enable();
648
649
650 if (!(vbl_status & DRM_SCANOUTPOS_VALID)) {
651 DRM_DEBUG("crtc %d : scanoutpos query failed [%d].\n",
652 crtc, vbl_status);
653 return -EIO;
654 }
655
656 duration_ns = ktime_to_ns(etime) - ktime_to_ns(stime);
657
658
659 if (duration_ns <= (s64) *max_error)
660 break;
661 }
662
663
664 if (i == DRM_TIMESTAMP_MAXRETRIES) {
665 DRM_DEBUG("crtc %d: Noisy timestamp %d us > %d us [%d reps].\n",
666 crtc, (int) duration_ns/1000, *max_error/1000, i);
667 }
668
669
670 *max_error = (int) duration_ns;
671
672
673
674
675
676
677 invbl = vbl_status & DRM_SCANOUTPOS_INVBL;
678
679
680
681
682
683 delta_ns = (s64) vpos * linedur_ns + (s64) hpos * pixeldur_ns;
684
685
686
687
688
689
690
691
692
693
694
695 if ((flags & DRM_CALLED_FROM_VBLIRQ) && !invbl &&
696 ((vdisplay - vpos) < vtotal / 100)) {
697 delta_ns = delta_ns - framedur_ns;
698
699
700 vbl_status |= 0x8;
701 }
702
703 if (!drm_timestamp_monotonic)
704 etime = ktime_sub(etime, mono_time_offset);
705
706
707 tv_etime = ktime_to_timeval(etime);
708
709
710
711 etime = ktime_sub_ns(etime, delta_ns);
712 *vblank_time = ktime_to_timeval(etime);
713
714 DRM_DEBUG("crtc %d : v %d p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d rep]\n",
715 crtc, (int)vbl_status, hpos, vpos,
716 (long)tv_etime.tv_sec, (long)tv_etime.tv_usec,
717 (long)vblank_time->tv_sec, (long)vblank_time->tv_usec,
718 (int)duration_ns/1000, i);
719
720 vbl_status = DRM_VBLANKTIME_SCANOUTPOS_METHOD;
721 if (invbl)
722 vbl_status |= DRM_VBLANKTIME_INVBL;
723
724 return vbl_status;
725}
726EXPORT_SYMBOL(drm_calc_vbltimestamp_from_scanoutpos);
727
728static struct timeval get_drm_timestamp(void)
729{
730 ktime_t now;
731
732 now = ktime_get();
733 if (!drm_timestamp_monotonic)
734 now = ktime_sub(now, ktime_get_monotonic_offset());
735
736 return ktime_to_timeval(now);
737}
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759u32 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc,
760 struct timeval *tvblank, unsigned flags)
761{
762 int ret;
763
764
765 int max_error = (int) drm_timestamp_precision * 1000;
766
767
768 if (dev->driver->get_vblank_timestamp && (max_error > 0)) {
769 ret = dev->driver->get_vblank_timestamp(dev, crtc, &max_error,
770 tvblank, flags);
771 if (ret > 0)
772 return (u32) ret;
773 }
774
775
776
777
778 *tvblank = get_drm_timestamp();
779
780 return 0;
781}
782EXPORT_SYMBOL(drm_get_last_vbltimestamp);
783
784
785
786
787
788
789
790
791
792
793u32 drm_vblank_count(struct drm_device *dev, int crtc)
794{
795 return atomic_read(&dev->_vblank_count[crtc]);
796}
797EXPORT_SYMBOL(drm_vblank_count);
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc,
814 struct timeval *vblanktime)
815{
816 u32 cur_vblank;
817
818
819
820
821
822
823 do {
824 cur_vblank = atomic_read(&dev->_vblank_count[crtc]);
825 *vblanktime = vblanktimestamp(dev, crtc, cur_vblank);
826 smp_rmb();
827 } while (cur_vblank != atomic_read(&dev->_vblank_count[crtc]));
828
829 return cur_vblank;
830}
831EXPORT_SYMBOL(drm_vblank_count_and_time);
832
833static void send_vblank_event(struct drm_device *dev,
834 struct drm_pending_vblank_event *e,
835 unsigned long seq, struct timeval *now)
836{
837 WARN_ON_SMP(!spin_is_locked(&dev->event_lock));
838 e->event.sequence = seq;
839 e->event.tv_sec = now->tv_sec;
840 e->event.tv_usec = now->tv_usec;
841
842 list_add_tail(&e->base.link,
843 &e->base.file_priv->event_list);
844 wake_up_interruptible(&e->base.file_priv->event_wait);
845 trace_drm_vblank_event_delivered(e->base.pid, e->pipe,
846 e->event.sequence);
847}
848
849
850
851
852
853
854
855
856
857
858void drm_send_vblank_event(struct drm_device *dev, int crtc,
859 struct drm_pending_vblank_event *e)
860{
861 struct timeval now;
862 unsigned int seq;
863 if (crtc >= 0) {
864 seq = drm_vblank_count_and_time(dev, crtc, &now);
865 } else {
866 seq = 0;
867
868 now = get_drm_timestamp();
869 }
870 e->pipe = crtc;
871 send_vblank_event(dev, e, seq, &now);
872}
873EXPORT_SYMBOL(drm_send_vblank_event);
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891static void drm_update_vblank_count(struct drm_device *dev, int crtc)
892{
893 u32 cur_vblank, diff, tslot, rc;
894 struct timeval t_vblank;
895
896
897
898
899
900
901
902
903
904
905
906
907
908 do {
909 cur_vblank = dev->driver->get_vblank_counter(dev, crtc);
910 rc = drm_get_last_vbltimestamp(dev, crtc, &t_vblank, 0);
911 } while (cur_vblank != dev->driver->get_vblank_counter(dev, crtc));
912
913
914 diff = cur_vblank - dev->last_vblank[crtc];
915 if (cur_vblank < dev->last_vblank[crtc]) {
916 diff += dev->max_vblank_count;
917
918 DRM_DEBUG("last_vblank[%d]=0x%x, cur_vblank=0x%x => diff=0x%x\n",
919 crtc, dev->last_vblank[crtc], cur_vblank, diff);
920 }
921
922 DRM_DEBUG("enabling vblank interrupts on crtc %d, missed %d\n",
923 crtc, diff);
924
925
926
927
928
929 if (rc) {
930 tslot = atomic_read(&dev->_vblank_count[crtc]) + diff;
931 vblanktimestamp(dev, crtc, tslot) = t_vblank;
932 }
933
934 smp_mb__before_atomic_inc();
935 atomic_add(diff, &dev->_vblank_count[crtc]);
936 smp_mb__after_atomic_inc();
937}
938
939
940
941
942
943
944
945
946
947
948
949
950int drm_vblank_get(struct drm_device *dev, int crtc)
951{
952 unsigned long irqflags, irqflags2;
953 int ret = 0;
954
955 spin_lock_irqsave(&dev->vbl_lock, irqflags);
956
957 if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1) {
958 spin_lock_irqsave(&dev->vblank_time_lock, irqflags2);
959 if (!dev->vblank_enabled[crtc]) {
960
961
962
963
964
965
966 ret = dev->driver->enable_vblank(dev, crtc);
967 DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n",
968 crtc, ret);
969 if (ret)
970 atomic_dec(&dev->vblank_refcount[crtc]);
971 else {
972 dev->vblank_enabled[crtc] = 1;
973 drm_update_vblank_count(dev, crtc);
974 }
975 }
976 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags2);
977 } else {
978 if (!dev->vblank_enabled[crtc]) {
979 atomic_dec(&dev->vblank_refcount[crtc]);
980 ret = -EINVAL;
981 }
982 }
983 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
984
985 return ret;
986}
987EXPORT_SYMBOL(drm_vblank_get);
988
989
990
991
992
993
994
995
996
997void drm_vblank_put(struct drm_device *dev, int crtc)
998{
999 BUG_ON(atomic_read(&dev->vblank_refcount[crtc]) == 0);
1000
1001
1002 if (atomic_dec_and_test(&dev->vblank_refcount[crtc]) &&
1003 (drm_vblank_offdelay > 0))
1004 mod_timer(&dev->vblank_disable_timer,
1005 jiffies + ((drm_vblank_offdelay * DRM_HZ)/1000));
1006}
1007EXPORT_SYMBOL(drm_vblank_put);
1008
1009
1010
1011
1012
1013
1014
1015
1016void drm_vblank_off(struct drm_device *dev, int crtc)
1017{
1018 struct drm_pending_vblank_event *e, *t;
1019 struct timeval now;
1020 unsigned long irqflags;
1021 unsigned int seq;
1022
1023 spin_lock_irqsave(&dev->vbl_lock, irqflags);
1024 vblank_disable_and_save(dev, crtc);
1025 DRM_WAKEUP(&dev->vbl_queue[crtc]);
1026
1027
1028 seq = drm_vblank_count_and_time(dev, crtc, &now);
1029
1030 spin_lock(&dev->event_lock);
1031 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
1032 if (e->pipe != crtc)
1033 continue;
1034 DRM_DEBUG("Sending premature vblank event on disable: \
1035 wanted %d, current %d\n",
1036 e->event.sequence, seq);
1037 list_del(&e->base.link);
1038 drm_vblank_put(dev, e->pipe);
1039 send_vblank_event(dev, e, seq, &now);
1040 }
1041 spin_unlock(&dev->event_lock);
1042
1043 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
1044}
1045EXPORT_SYMBOL(drm_vblank_off);
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055void drm_vblank_pre_modeset(struct drm_device *dev, int crtc)
1056{
1057
1058 if (!dev->num_crtcs)
1059 return;
1060
1061
1062
1063
1064
1065
1066
1067 if (!dev->vblank_inmodeset[crtc]) {
1068 dev->vblank_inmodeset[crtc] = 0x1;
1069 if (drm_vblank_get(dev, crtc) == 0)
1070 dev->vblank_inmodeset[crtc] |= 0x2;
1071 }
1072}
1073EXPORT_SYMBOL(drm_vblank_pre_modeset);
1074
1075void drm_vblank_post_modeset(struct drm_device *dev, int crtc)
1076{
1077 unsigned long irqflags;
1078
1079
1080 if (!dev->num_crtcs)
1081 return;
1082
1083 if (dev->vblank_inmodeset[crtc]) {
1084 spin_lock_irqsave(&dev->vbl_lock, irqflags);
1085 dev->vblank_disable_allowed = 1;
1086 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
1087
1088 if (dev->vblank_inmodeset[crtc] & 0x2)
1089 drm_vblank_put(dev, crtc);
1090
1091 dev->vblank_inmodeset[crtc] = 0;
1092 }
1093}
1094EXPORT_SYMBOL(drm_vblank_post_modeset);
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107int drm_modeset_ctl(struct drm_device *dev, void *data,
1108 struct drm_file *file_priv)
1109{
1110 struct drm_modeset_ctl *modeset = data;
1111 unsigned int crtc;
1112
1113
1114 if (!dev->num_crtcs)
1115 return 0;
1116
1117
1118 if (drm_core_check_feature(dev, DRIVER_MODESET))
1119 return 0;
1120
1121 crtc = modeset->crtc;
1122 if (crtc >= dev->num_crtcs)
1123 return -EINVAL;
1124
1125 switch (modeset->cmd) {
1126 case _DRM_PRE_MODESET:
1127 drm_vblank_pre_modeset(dev, crtc);
1128 break;
1129 case _DRM_POST_MODESET:
1130 drm_vblank_post_modeset(dev, crtc);
1131 break;
1132 default:
1133 return -EINVAL;
1134 }
1135
1136 return 0;
1137}
1138
1139static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
1140 union drm_wait_vblank *vblwait,
1141 struct drm_file *file_priv)
1142{
1143 struct drm_pending_vblank_event *e;
1144 struct timeval now;
1145 unsigned long flags;
1146 unsigned int seq;
1147 int ret;
1148
1149 e = kzalloc(sizeof *e, GFP_KERNEL);
1150 if (e == NULL) {
1151 ret = -ENOMEM;
1152 goto err_put;
1153 }
1154
1155 e->pipe = pipe;
1156 e->base.pid = current->pid;
1157 e->event.base.type = DRM_EVENT_VBLANK;
1158 e->event.base.length = sizeof e->event;
1159 e->event.user_data = vblwait->request.signal;
1160 e->base.event = &e->event.base;
1161 e->base.file_priv = file_priv;
1162 e->base.destroy = (void (*) (struct drm_pending_event *)) kfree;
1163
1164 spin_lock_irqsave(&dev->event_lock, flags);
1165
1166 if (file_priv->event_space < sizeof e->event) {
1167 ret = -EBUSY;
1168 goto err_unlock;
1169 }
1170
1171 file_priv->event_space -= sizeof e->event;
1172 seq = drm_vblank_count_and_time(dev, pipe, &now);
1173
1174 if ((vblwait->request.type & _DRM_VBLANK_NEXTONMISS) &&
1175 (seq - vblwait->request.sequence) <= (1 << 23)) {
1176 vblwait->request.sequence = seq + 1;
1177 vblwait->reply.sequence = vblwait->request.sequence;
1178 }
1179
1180 DRM_DEBUG("event on vblank count %d, current %d, crtc %d\n",
1181 vblwait->request.sequence, seq, pipe);
1182
1183 trace_drm_vblank_event_queued(current->pid, pipe,
1184 vblwait->request.sequence);
1185
1186 e->event.sequence = vblwait->request.sequence;
1187 if ((seq - vblwait->request.sequence) <= (1 << 23)) {
1188 drm_vblank_put(dev, pipe);
1189 send_vblank_event(dev, e, seq, &now);
1190 vblwait->reply.sequence = seq;
1191 } else {
1192
1193 list_add_tail(&e->base.link, &dev->vblank_event_list);
1194 vblwait->reply.sequence = vblwait->request.sequence;
1195 }
1196
1197 spin_unlock_irqrestore(&dev->event_lock, flags);
1198
1199 return 0;
1200
1201err_unlock:
1202 spin_unlock_irqrestore(&dev->event_lock, flags);
1203 kfree(e);
1204err_put:
1205 drm_vblank_put(dev, pipe);
1206 return ret;
1207}
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223int drm_wait_vblank(struct drm_device *dev, void *data,
1224 struct drm_file *file_priv)
1225{
1226 union drm_wait_vblank *vblwait = data;
1227 int ret;
1228 unsigned int flags, seq, crtc, high_crtc;
1229
1230 if (drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
1231 if ((!drm_dev_to_irq(dev)) || (!dev->irq_enabled))
1232 return -EINVAL;
1233
1234 if (vblwait->request.type & _DRM_VBLANK_SIGNAL)
1235 return -EINVAL;
1236
1237 if (vblwait->request.type &
1238 ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
1239 _DRM_VBLANK_HIGH_CRTC_MASK)) {
1240 DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n",
1241 vblwait->request.type,
1242 (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
1243 _DRM_VBLANK_HIGH_CRTC_MASK));
1244 return -EINVAL;
1245 }
1246
1247 flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK;
1248 high_crtc = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK);
1249 if (high_crtc)
1250 crtc = high_crtc >> _DRM_VBLANK_HIGH_CRTC_SHIFT;
1251 else
1252 crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0;
1253 if (crtc >= dev->num_crtcs)
1254 return -EINVAL;
1255
1256 ret = drm_vblank_get(dev, crtc);
1257 if (ret) {
1258 DRM_DEBUG("failed to acquire vblank counter, %d\n", ret);
1259 return ret;
1260 }
1261 seq = drm_vblank_count(dev, crtc);
1262
1263 switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) {
1264 case _DRM_VBLANK_RELATIVE:
1265 vblwait->request.sequence += seq;
1266 vblwait->request.type &= ~_DRM_VBLANK_RELATIVE;
1267 case _DRM_VBLANK_ABSOLUTE:
1268 break;
1269 default:
1270 ret = -EINVAL;
1271 goto done;
1272 }
1273
1274 if (flags & _DRM_VBLANK_EVENT) {
1275
1276
1277
1278 return drm_queue_vblank_event(dev, crtc, vblwait, file_priv);
1279 }
1280
1281 if ((flags & _DRM_VBLANK_NEXTONMISS) &&
1282 (seq - vblwait->request.sequence) <= (1<<23)) {
1283 vblwait->request.sequence = seq + 1;
1284 }
1285
1286 DRM_DEBUG("waiting on vblank count %d, crtc %d\n",
1287 vblwait->request.sequence, crtc);
1288 dev->last_vblank_wait[crtc] = vblwait->request.sequence;
1289 DRM_WAIT_ON(ret, dev->vbl_queue[crtc], 3 * DRM_HZ,
1290 (((drm_vblank_count(dev, crtc) -
1291 vblwait->request.sequence) <= (1 << 23)) ||
1292 !dev->irq_enabled));
1293
1294 if (ret != -EINTR) {
1295 struct timeval now;
1296
1297 vblwait->reply.sequence = drm_vblank_count_and_time(dev, crtc, &now);
1298 vblwait->reply.tval_sec = now.tv_sec;
1299 vblwait->reply.tval_usec = now.tv_usec;
1300
1301 DRM_DEBUG("returning %d to client\n",
1302 vblwait->reply.sequence);
1303 } else {
1304 DRM_DEBUG("vblank wait interrupted by signal\n");
1305 }
1306
1307done:
1308 drm_vblank_put(dev, crtc);
1309 return ret;
1310}
1311
1312static void drm_handle_vblank_events(struct drm_device *dev, int crtc)
1313{
1314 struct drm_pending_vblank_event *e, *t;
1315 struct timeval now;
1316 unsigned long flags;
1317 unsigned int seq;
1318
1319 seq = drm_vblank_count_and_time(dev, crtc, &now);
1320
1321 spin_lock_irqsave(&dev->event_lock, flags);
1322
1323 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
1324 if (e->pipe != crtc)
1325 continue;
1326 if ((seq - e->event.sequence) > (1<<23))
1327 continue;
1328
1329 DRM_DEBUG("vblank event on %d, current %d\n",
1330 e->event.sequence, seq);
1331
1332 list_del(&e->base.link);
1333 drm_vblank_put(dev, e->pipe);
1334 send_vblank_event(dev, e, seq, &now);
1335 }
1336
1337 spin_unlock_irqrestore(&dev->event_lock, flags);
1338
1339 trace_drm_vblank_event(crtc, seq);
1340}
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350bool drm_handle_vblank(struct drm_device *dev, int crtc)
1351{
1352 u32 vblcount;
1353 s64 diff_ns;
1354 struct timeval tvblank;
1355 unsigned long irqflags;
1356
1357 if (!dev->num_crtcs)
1358 return false;
1359
1360
1361
1362
1363
1364 spin_lock_irqsave(&dev->vblank_time_lock, irqflags);
1365
1366
1367 if (!dev->vblank_enabled[crtc]) {
1368 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
1369 return false;
1370 }
1371
1372
1373
1374
1375
1376
1377 vblcount = atomic_read(&dev->_vblank_count[crtc]);
1378 drm_get_last_vbltimestamp(dev, crtc, &tvblank, DRM_CALLED_FROM_VBLIRQ);
1379
1380
1381 diff_ns = timeval_to_ns(&tvblank) -
1382 timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount));
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393 if (abs64(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) {
1394
1395 vblanktimestamp(dev, crtc, vblcount + 1) = tvblank;
1396
1397
1398
1399
1400 smp_mb__before_atomic_inc();
1401 atomic_inc(&dev->_vblank_count[crtc]);
1402 smp_mb__after_atomic_inc();
1403 } else {
1404 DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n",
1405 crtc, (int) diff_ns);
1406 }
1407
1408 DRM_WAKEUP(&dev->vbl_queue[crtc]);
1409 drm_handle_vblank_events(dev, crtc);
1410
1411 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
1412 return true;
1413}
1414EXPORT_SYMBOL(drm_handle_vblank);
1415