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#define pr_fmt(fmt) "vgaarb: " fmt
33
34#include <linux/module.h>
35#include <linux/kernel.h>
36#include <linux/pci.h>
37#include <linux/errno.h>
38#include <linux/init.h>
39#include <linux/list.h>
40#include <linux/sched.h>
41#include <linux/wait.h>
42#include <linux/spinlock.h>
43#include <linux/poll.h>
44#include <linux/miscdevice.h>
45#include <linux/slab.h>
46#include <linux/screen_info.h>
47
48#include <linux/uaccess.h>
49
50#include <linux/vgaarb.h>
51
52static void vga_arbiter_notify_clients(void);
53
54
55
56
57struct vga_device {
58 struct list_head list;
59 struct pci_dev *pdev;
60 unsigned int decodes;
61 unsigned int owns;
62 unsigned int locks;
63 unsigned int io_lock_cnt;
64 unsigned int mem_lock_cnt;
65 unsigned int io_norm_cnt;
66 unsigned int mem_norm_cnt;
67 bool bridge_has_one_vga;
68
69 void *cookie;
70 void (*irq_set_state)(void *cookie, bool enable);
71 unsigned int (*set_vga_decode)(void *cookie, bool decode);
72};
73
74static LIST_HEAD(vga_list);
75static int vga_count, vga_decode_count;
76static bool vga_arbiter_used;
77static DEFINE_SPINLOCK(vga_lock);
78static DECLARE_WAIT_QUEUE_HEAD(vga_wait_queue);
79
80
81static const char *vga_iostate_to_str(unsigned int iostate)
82{
83
84 iostate &= VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
85 switch (iostate) {
86 case VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM:
87 return "io+mem";
88 case VGA_RSRC_LEGACY_IO:
89 return "io";
90 case VGA_RSRC_LEGACY_MEM:
91 return "mem";
92 }
93 return "none";
94}
95
96static int vga_str_to_iostate(char *buf, int str_size, int *io_state)
97{
98
99
100 if (strncmp(buf, "none", 4) == 0) {
101 *io_state = VGA_RSRC_NONE;
102 return 1;
103 }
104
105
106 if (strncmp(buf, "io+mem", 6) == 0)
107 goto both;
108 else if (strncmp(buf, "io", 2) == 0)
109 goto both;
110 else if (strncmp(buf, "mem", 3) == 0)
111 goto both;
112 return 0;
113both:
114 *io_state = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
115 return 1;
116}
117
118
119static struct pci_dev *vga_default;
120
121static void vga_arb_device_card_gone(struct pci_dev *pdev);
122
123
124static struct vga_device *vgadev_find(struct pci_dev *pdev)
125{
126 struct vga_device *vgadev;
127
128 list_for_each_entry(vgadev, &vga_list, list)
129 if (pdev == vgadev->pdev)
130 return vgadev;
131 return NULL;
132}
133
134
135struct pci_dev *vga_default_device(void)
136{
137 return vga_default;
138}
139EXPORT_SYMBOL_GPL(vga_default_device);
140
141void vga_set_default_device(struct pci_dev *pdev)
142{
143 if (vga_default == pdev)
144 return;
145
146 pci_dev_put(vga_default);
147 vga_default = pci_dev_get(pdev);
148}
149
150static inline void vga_irq_set_state(struct vga_device *vgadev, bool state)
151{
152 if (vgadev->irq_set_state)
153 vgadev->irq_set_state(vgadev->cookie, state);
154}
155
156
157
158
159
160static void vga_check_first_use(void)
161{
162
163
164
165 if (!vga_arbiter_used) {
166 vga_arbiter_used = true;
167 vga_arbiter_notify_clients();
168 }
169}
170
171static struct vga_device *__vga_tryget(struct vga_device *vgadev,
172 unsigned int rsrc)
173{
174 unsigned int wants, legacy_wants, match;
175 struct vga_device *conflict;
176 unsigned int pci_bits;
177 u32 flags = 0;
178
179
180
181
182 if ((rsrc & VGA_RSRC_NORMAL_IO) &&
183 (vgadev->decodes & VGA_RSRC_LEGACY_IO))
184 rsrc |= VGA_RSRC_LEGACY_IO;
185 if ((rsrc & VGA_RSRC_NORMAL_MEM) &&
186 (vgadev->decodes & VGA_RSRC_LEGACY_MEM))
187 rsrc |= VGA_RSRC_LEGACY_MEM;
188
189 pr_debug("%s: %d\n", __func__, rsrc);
190 pr_debug("%s: owns: %d\n", __func__, vgadev->owns);
191
192
193 wants = rsrc & ~vgadev->owns;
194
195
196 if (wants == 0)
197 goto lock_them;
198
199
200
201
202 legacy_wants = wants & VGA_RSRC_LEGACY_MASK;
203 if (legacy_wants == 0)
204 goto enable_them;
205
206
207 list_for_each_entry(conflict, &vga_list, list) {
208 unsigned int lwants = legacy_wants;
209 unsigned int change_bridge = 0;
210
211
212 if (vgadev == conflict)
213 continue;
214
215
216
217
218 if (!vga_conflicts(vgadev->pdev, conflict->pdev))
219 continue;
220
221
222
223
224
225
226
227 if (vgadev->pdev->bus != conflict->pdev->bus) {
228 change_bridge = 1;
229 lwants = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
230 }
231
232
233
234
235 if (conflict->locks & lwants)
236 return conflict;
237
238
239
240
241
242 match = lwants & conflict->owns;
243 if (!match)
244 continue;
245
246
247
248
249
250 flags = 0;
251 pci_bits = 0;
252
253
254
255
256 if (!conflict->bridge_has_one_vga) {
257 if ((match & conflict->decodes) & VGA_RSRC_LEGACY_MEM)
258 pci_bits |= PCI_COMMAND_MEMORY;
259 if ((match & conflict->decodes) & VGA_RSRC_LEGACY_IO)
260 pci_bits |= PCI_COMMAND_IO;
261
262 if (pci_bits) {
263 vga_irq_set_state(conflict, false);
264 flags |= PCI_VGA_STATE_CHANGE_DECODES;
265 }
266 }
267
268 if (change_bridge)
269 flags |= PCI_VGA_STATE_CHANGE_BRIDGE;
270
271 pci_set_vga_state(conflict->pdev, false, pci_bits, flags);
272 conflict->owns &= ~match;
273
274
275 if (pci_bits & PCI_COMMAND_MEMORY)
276 conflict->owns &= ~VGA_RSRC_NORMAL_MEM;
277 if (pci_bits & PCI_COMMAND_IO)
278 conflict->owns &= ~VGA_RSRC_NORMAL_IO;
279 }
280
281enable_them:
282
283
284
285
286
287 flags = 0;
288 pci_bits = 0;
289
290 if (!vgadev->bridge_has_one_vga) {
291 flags |= PCI_VGA_STATE_CHANGE_DECODES;
292 if (wants & (VGA_RSRC_LEGACY_MEM|VGA_RSRC_NORMAL_MEM))
293 pci_bits |= PCI_COMMAND_MEMORY;
294 if (wants & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
295 pci_bits |= PCI_COMMAND_IO;
296 }
297 if (wants & VGA_RSRC_LEGACY_MASK)
298 flags |= PCI_VGA_STATE_CHANGE_BRIDGE;
299
300 pci_set_vga_state(vgadev->pdev, true, pci_bits, flags);
301
302 if (!vgadev->bridge_has_one_vga)
303 vga_irq_set_state(vgadev, true);
304
305 vgadev->owns |= wants;
306lock_them:
307 vgadev->locks |= (rsrc & VGA_RSRC_LEGACY_MASK);
308 if (rsrc & VGA_RSRC_LEGACY_IO)
309 vgadev->io_lock_cnt++;
310 if (rsrc & VGA_RSRC_LEGACY_MEM)
311 vgadev->mem_lock_cnt++;
312 if (rsrc & VGA_RSRC_NORMAL_IO)
313 vgadev->io_norm_cnt++;
314 if (rsrc & VGA_RSRC_NORMAL_MEM)
315 vgadev->mem_norm_cnt++;
316
317 return NULL;
318}
319
320static void __vga_put(struct vga_device *vgadev, unsigned int rsrc)
321{
322 unsigned int old_locks = vgadev->locks;
323
324 pr_debug("%s\n", __func__);
325
326
327
328
329 if ((rsrc & VGA_RSRC_NORMAL_IO) && vgadev->io_norm_cnt > 0) {
330 vgadev->io_norm_cnt--;
331 if (vgadev->decodes & VGA_RSRC_LEGACY_IO)
332 rsrc |= VGA_RSRC_LEGACY_IO;
333 }
334 if ((rsrc & VGA_RSRC_NORMAL_MEM) && vgadev->mem_norm_cnt > 0) {
335 vgadev->mem_norm_cnt--;
336 if (vgadev->decodes & VGA_RSRC_LEGACY_MEM)
337 rsrc |= VGA_RSRC_LEGACY_MEM;
338 }
339 if ((rsrc & VGA_RSRC_LEGACY_IO) && vgadev->io_lock_cnt > 0)
340 vgadev->io_lock_cnt--;
341 if ((rsrc & VGA_RSRC_LEGACY_MEM) && vgadev->mem_lock_cnt > 0)
342 vgadev->mem_lock_cnt--;
343
344
345
346
347 if (vgadev->io_lock_cnt == 0)
348 vgadev->locks &= ~VGA_RSRC_LEGACY_IO;
349 if (vgadev->mem_lock_cnt == 0)
350 vgadev->locks &= ~VGA_RSRC_LEGACY_MEM;
351
352
353
354
355 if (old_locks != vgadev->locks)
356 wake_up_all(&vga_wait_queue);
357}
358
359int vga_get(struct pci_dev *pdev, unsigned int rsrc, int interruptible)
360{
361 struct vga_device *vgadev, *conflict;
362 unsigned long flags;
363 wait_queue_t wait;
364 int rc = 0;
365
366 vga_check_first_use();
367
368 if (pdev == NULL)
369 pdev = vga_default_device();
370 if (pdev == NULL)
371 return 0;
372
373 for (;;) {
374 spin_lock_irqsave(&vga_lock, flags);
375 vgadev = vgadev_find(pdev);
376 if (vgadev == NULL) {
377 spin_unlock_irqrestore(&vga_lock, flags);
378 rc = -ENODEV;
379 break;
380 }
381 conflict = __vga_tryget(vgadev, rsrc);
382 spin_unlock_irqrestore(&vga_lock, flags);
383 if (conflict == NULL)
384 break;
385
386
387
388
389
390
391
392
393 init_waitqueue_entry(&wait, current);
394 add_wait_queue(&vga_wait_queue, &wait);
395 set_current_state(interruptible ?
396 TASK_INTERRUPTIBLE :
397 TASK_UNINTERRUPTIBLE);
398 if (interruptible && signal_pending(current)) {
399 __set_current_state(TASK_RUNNING);
400 remove_wait_queue(&vga_wait_queue, &wait);
401 rc = -ERESTARTSYS;
402 break;
403 }
404 schedule();
405 remove_wait_queue(&vga_wait_queue, &wait);
406 }
407 return rc;
408}
409EXPORT_SYMBOL(vga_get);
410
411int vga_tryget(struct pci_dev *pdev, unsigned int rsrc)
412{
413 struct vga_device *vgadev;
414 unsigned long flags;
415 int rc = 0;
416
417 vga_check_first_use();
418
419
420 if (pdev == NULL)
421 pdev = vga_default_device();
422 if (pdev == NULL)
423 return 0;
424 spin_lock_irqsave(&vga_lock, flags);
425 vgadev = vgadev_find(pdev);
426 if (vgadev == NULL) {
427 rc = -ENODEV;
428 goto bail;
429 }
430 if (__vga_tryget(vgadev, rsrc))
431 rc = -EBUSY;
432bail:
433 spin_unlock_irqrestore(&vga_lock, flags);
434 return rc;
435}
436EXPORT_SYMBOL(vga_tryget);
437
438void vga_put(struct pci_dev *pdev, unsigned int rsrc)
439{
440 struct vga_device *vgadev;
441 unsigned long flags;
442
443
444 if (pdev == NULL)
445 pdev = vga_default_device();
446 if (pdev == NULL)
447 return;
448 spin_lock_irqsave(&vga_lock, flags);
449 vgadev = vgadev_find(pdev);
450 if (vgadev == NULL)
451 goto bail;
452 __vga_put(vgadev, rsrc);
453bail:
454 spin_unlock_irqrestore(&vga_lock, flags);
455}
456EXPORT_SYMBOL(vga_put);
457
458
459
460
461
462
463
464
465
466
467static void vga_arbiter_check_bridge_sharing(struct vga_device *vgadev)
468{
469 struct vga_device *same_bridge_vgadev;
470 struct pci_bus *new_bus, *bus;
471 struct pci_dev *new_bridge, *bridge;
472
473 vgadev->bridge_has_one_vga = true;
474
475 if (list_empty(&vga_list))
476 return;
477
478
479 new_bus = vgadev->pdev->bus;
480 while (new_bus) {
481 new_bridge = new_bus->self;
482
483
484 list_for_each_entry(same_bridge_vgadev, &vga_list, list) {
485 bus = same_bridge_vgadev->pdev->bus;
486 bridge = bus->self;
487
488
489 if (new_bridge == bridge) {
490
491
492
493
494
495 same_bridge_vgadev->bridge_has_one_vga = false;
496 }
497
498
499
500
501
502
503
504 while (bus) {
505 bridge = bus->self;
506
507 if (bridge && bridge == vgadev->pdev->bus->self)
508 vgadev->bridge_has_one_vga = false;
509
510 bus = bus->parent;
511 }
512 }
513 new_bus = new_bus->parent;
514 }
515}
516
517
518
519
520
521
522
523static bool vga_arbiter_add_pci_device(struct pci_dev *pdev)
524{
525 struct vga_device *vgadev;
526 unsigned long flags;
527 struct pci_bus *bus;
528 struct pci_dev *bridge;
529 u16 cmd;
530
531
532 if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
533 return false;
534
535
536 vgadev = kzalloc(sizeof(struct vga_device), GFP_KERNEL);
537 if (vgadev == NULL) {
538 pr_err("failed to allocate pci device\n");
539
540
541
542
543 return false;
544 }
545
546
547 spin_lock_irqsave(&vga_lock, flags);
548 if (vgadev_find(pdev) != NULL) {
549 BUG_ON(1);
550 goto fail;
551 }
552 vgadev->pdev = pdev;
553
554
555 vgadev->decodes = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
556 VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
557
558
559 vga_decode_count++;
560
561
562
563 pci_read_config_word(pdev, PCI_COMMAND, &cmd);
564 if (cmd & PCI_COMMAND_IO)
565 vgadev->owns |= VGA_RSRC_LEGACY_IO;
566 if (cmd & PCI_COMMAND_MEMORY)
567 vgadev->owns |= VGA_RSRC_LEGACY_MEM;
568
569
570 bus = pdev->bus;
571 while (bus) {
572 bridge = bus->self;
573 if (bridge) {
574 u16 l;
575
576 pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, &l);
577 if (!(l & PCI_BRIDGE_CTL_VGA)) {
578 vgadev->owns = 0;
579 break;
580 }
581 }
582 bus = bus->parent;
583 }
584
585
586
587
588 if (vga_default == NULL &&
589 ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) {
590 pr_info("setting as boot device: PCI:%s\n", pci_name(pdev));
591 vga_set_default_device(pdev);
592 }
593
594 vga_arbiter_check_bridge_sharing(vgadev);
595
596
597 list_add(&vgadev->list, &vga_list);
598 vga_count++;
599 pr_info("device added: PCI:%s,decodes=%s,owns=%s,locks=%s\n",
600 pci_name(pdev),
601 vga_iostate_to_str(vgadev->decodes),
602 vga_iostate_to_str(vgadev->owns),
603 vga_iostate_to_str(vgadev->locks));
604
605 spin_unlock_irqrestore(&vga_lock, flags);
606 return true;
607fail:
608 spin_unlock_irqrestore(&vga_lock, flags);
609 kfree(vgadev);
610 return false;
611}
612
613static bool vga_arbiter_del_pci_device(struct pci_dev *pdev)
614{
615 struct vga_device *vgadev;
616 unsigned long flags;
617 bool ret = true;
618
619 spin_lock_irqsave(&vga_lock, flags);
620 vgadev = vgadev_find(pdev);
621 if (vgadev == NULL) {
622 ret = false;
623 goto bail;
624 }
625
626 if (vga_default == pdev)
627 vga_set_default_device(NULL);
628
629 if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM))
630 vga_decode_count--;
631
632
633 list_del(&vgadev->list);
634 vga_count--;
635
636
637
638 vga_arb_device_card_gone(pdev);
639
640
641 wake_up_all(&vga_wait_queue);
642bail:
643 spin_unlock_irqrestore(&vga_lock, flags);
644 kfree(vgadev);
645 return ret;
646}
647
648
649static inline void vga_update_device_decodes(struct vga_device *vgadev,
650 int new_decodes)
651{
652 int old_decodes, decodes_removed, decodes_unlocked;
653
654 old_decodes = vgadev->decodes;
655 decodes_removed = ~new_decodes & old_decodes;
656 decodes_unlocked = vgadev->locks & decodes_removed;
657 vgadev->decodes = new_decodes;
658
659 pr_info("device changed decodes: PCI:%s,olddecodes=%s,decodes=%s:owns=%s\n",
660 pci_name(vgadev->pdev),
661 vga_iostate_to_str(old_decodes),
662 vga_iostate_to_str(vgadev->decodes),
663 vga_iostate_to_str(vgadev->owns));
664
665
666 if (decodes_unlocked) {
667 if (decodes_unlocked & VGA_RSRC_LEGACY_IO)
668 vgadev->io_lock_cnt = 0;
669 if (decodes_unlocked & VGA_RSRC_LEGACY_MEM)
670 vgadev->mem_lock_cnt = 0;
671 __vga_put(vgadev, decodes_unlocked);
672 }
673
674
675 if (old_decodes & VGA_RSRC_LEGACY_MASK &&
676 !(new_decodes & VGA_RSRC_LEGACY_MASK))
677 vga_decode_count--;
678 if (!(old_decodes & VGA_RSRC_LEGACY_MASK) &&
679 new_decodes & VGA_RSRC_LEGACY_MASK)
680 vga_decode_count++;
681 pr_debug("decoding count now is: %d\n", vga_decode_count);
682}
683
684static void __vga_set_legacy_decoding(struct pci_dev *pdev,
685 unsigned int decodes,
686 bool userspace)
687{
688 struct vga_device *vgadev;
689 unsigned long flags;
690
691 decodes &= VGA_RSRC_LEGACY_MASK;
692
693 spin_lock_irqsave(&vga_lock, flags);
694 vgadev = vgadev_find(pdev);
695 if (vgadev == NULL)
696 goto bail;
697
698
699 if (userspace && vgadev->set_vga_decode)
700 goto bail;
701
702
703 vga_update_device_decodes(vgadev, decodes);
704
705
706
707
708
709bail:
710 spin_unlock_irqrestore(&vga_lock, flags);
711}
712
713void vga_set_legacy_decoding(struct pci_dev *pdev, unsigned int decodes)
714{
715 __vga_set_legacy_decoding(pdev, decodes, false);
716}
717EXPORT_SYMBOL(vga_set_legacy_decoding);
718
719
720int vga_client_register(struct pci_dev *pdev, void *cookie,
721 void (*irq_set_state)(void *cookie, bool state),
722 unsigned int (*set_vga_decode)(void *cookie,
723 bool decode))
724{
725 int ret = -ENODEV;
726 struct vga_device *vgadev;
727 unsigned long flags;
728
729 spin_lock_irqsave(&vga_lock, flags);
730 vgadev = vgadev_find(pdev);
731 if (!vgadev)
732 goto bail;
733
734 vgadev->irq_set_state = irq_set_state;
735 vgadev->set_vga_decode = set_vga_decode;
736 vgadev->cookie = cookie;
737 ret = 0;
738
739bail:
740 spin_unlock_irqrestore(&vga_lock, flags);
741 return ret;
742
743}
744EXPORT_SYMBOL(vga_client_register);
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799#define MAX_USER_CARDS CONFIG_VGA_ARB_MAX_GPUS
800#define PCI_INVALID_CARD ((struct pci_dev *)-1UL)
801
802
803
804
805struct vga_arb_user_card {
806 struct pci_dev *pdev;
807 unsigned int mem_cnt;
808 unsigned int io_cnt;
809};
810
811struct vga_arb_private {
812 struct list_head list;
813 struct pci_dev *target;
814 struct vga_arb_user_card cards[MAX_USER_CARDS];
815 spinlock_t lock;
816};
817
818static LIST_HEAD(vga_user_list);
819static DEFINE_SPINLOCK(vga_user_lock);
820
821
822
823
824
825
826
827static int vga_pci_str_to_vars(char *buf, int count, unsigned int *domain,
828 unsigned int *bus, unsigned int *devfn)
829{
830 int n;
831 unsigned int slot, func;
832
833
834 n = sscanf(buf, "PCI:%x:%x:%x.%x", domain, bus, &slot, &func);
835 if (n != 4)
836 return 0;
837
838 *devfn = PCI_DEVFN(slot, func);
839
840 return 1;
841}
842
843static ssize_t vga_arb_read(struct file *file, char __user *buf,
844 size_t count, loff_t *ppos)
845{
846 struct vga_arb_private *priv = file->private_data;
847 struct vga_device *vgadev;
848 struct pci_dev *pdev;
849 unsigned long flags;
850 size_t len;
851 int rc;
852 char *lbuf;
853
854 lbuf = kmalloc(1024, GFP_KERNEL);
855 if (lbuf == NULL)
856 return -ENOMEM;
857
858
859
860
861 spin_lock_irqsave(&vga_lock, flags);
862
863
864 pdev = priv->target;
865 if (pdev == NULL || pdev == PCI_INVALID_CARD) {
866 spin_unlock_irqrestore(&vga_lock, flags);
867 len = sprintf(lbuf, "invalid");
868 goto done;
869 }
870
871
872 vgadev = vgadev_find(pdev);
873 if (vgadev == NULL) {
874
875
876
877 if (pdev == priv->target)
878 vga_arb_device_card_gone(pdev);
879 spin_unlock_irqrestore(&vga_lock, flags);
880 len = sprintf(lbuf, "invalid");
881 goto done;
882 }
883
884
885 len = snprintf(lbuf, 1024,
886 "count:%d,PCI:%s,decodes=%s,owns=%s,locks=%s(%d:%d)\n",
887 vga_decode_count, pci_name(pdev),
888 vga_iostate_to_str(vgadev->decodes),
889 vga_iostate_to_str(vgadev->owns),
890 vga_iostate_to_str(vgadev->locks),
891 vgadev->io_lock_cnt, vgadev->mem_lock_cnt);
892
893 spin_unlock_irqrestore(&vga_lock, flags);
894done:
895
896
897 if (len > count)
898 len = count;
899 rc = copy_to_user(buf, lbuf, len);
900 kfree(lbuf);
901 if (rc)
902 return -EFAULT;
903 return len;
904}
905
906
907
908
909
910static ssize_t vga_arb_write(struct file *file, const char __user *buf,
911 size_t count, loff_t *ppos)
912{
913 struct vga_arb_private *priv = file->private_data;
914 struct vga_arb_user_card *uc = NULL;
915 struct pci_dev *pdev;
916
917 unsigned int io_state;
918
919 char *kbuf, *curr_pos;
920 size_t remaining = count;
921
922 int ret_val;
923 int i;
924
925
926 kbuf = kmalloc(count + 1, GFP_KERNEL);
927 if (!kbuf)
928 return -ENOMEM;
929
930 if (copy_from_user(kbuf, buf, count)) {
931 kfree(kbuf);
932 return -EFAULT;
933 }
934 curr_pos = kbuf;
935 kbuf[count] = '\0';
936
937 if (strncmp(curr_pos, "lock ", 5) == 0) {
938 curr_pos += 5;
939 remaining -= 5;
940
941 pr_debug("client 0x%p called 'lock'\n", priv);
942
943 if (!vga_str_to_iostate(curr_pos, remaining, &io_state)) {
944 ret_val = -EPROTO;
945 goto done;
946 }
947 if (io_state == VGA_RSRC_NONE) {
948 ret_val = -EPROTO;
949 goto done;
950 }
951
952 pdev = priv->target;
953 if (priv->target == NULL) {
954 ret_val = -ENODEV;
955 goto done;
956 }
957
958 vga_get_uninterruptible(pdev, io_state);
959
960
961 for (i = 0; i < MAX_USER_CARDS; i++) {
962 if (priv->cards[i].pdev == pdev) {
963 if (io_state & VGA_RSRC_LEGACY_IO)
964 priv->cards[i].io_cnt++;
965 if (io_state & VGA_RSRC_LEGACY_MEM)
966 priv->cards[i].mem_cnt++;
967 break;
968 }
969 }
970
971 ret_val = count;
972 goto done;
973 } else if (strncmp(curr_pos, "unlock ", 7) == 0) {
974 curr_pos += 7;
975 remaining -= 7;
976
977 pr_debug("client 0x%p called 'unlock'\n", priv);
978
979 if (strncmp(curr_pos, "all", 3) == 0)
980 io_state = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
981 else {
982 if (!vga_str_to_iostate
983 (curr_pos, remaining, &io_state)) {
984 ret_val = -EPROTO;
985 goto done;
986 }
987
988
989
990
991
992
993 }
994
995 pdev = priv->target;
996 if (priv->target == NULL) {
997 ret_val = -ENODEV;
998 goto done;
999 }
1000 for (i = 0; i < MAX_USER_CARDS; i++) {
1001 if (priv->cards[i].pdev == pdev)
1002 uc = &priv->cards[i];
1003 }
1004
1005 if (!uc) {
1006 ret_val = -EINVAL;
1007 goto done;
1008 }
1009
1010 if (io_state & VGA_RSRC_LEGACY_IO && uc->io_cnt == 0) {
1011 ret_val = -EINVAL;
1012 goto done;
1013 }
1014
1015 if (io_state & VGA_RSRC_LEGACY_MEM && uc->mem_cnt == 0) {
1016 ret_val = -EINVAL;
1017 goto done;
1018 }
1019
1020 vga_put(pdev, io_state);
1021
1022 if (io_state & VGA_RSRC_LEGACY_IO)
1023 uc->io_cnt--;
1024 if (io_state & VGA_RSRC_LEGACY_MEM)
1025 uc->mem_cnt--;
1026
1027 ret_val = count;
1028 goto done;
1029 } else if (strncmp(curr_pos, "trylock ", 8) == 0) {
1030 curr_pos += 8;
1031 remaining -= 8;
1032
1033 pr_debug("client 0x%p called 'trylock'\n", priv);
1034
1035 if (!vga_str_to_iostate(curr_pos, remaining, &io_state)) {
1036 ret_val = -EPROTO;
1037 goto done;
1038 }
1039
1040
1041
1042
1043
1044
1045
1046 pdev = priv->target;
1047 if (priv->target == NULL) {
1048 ret_val = -ENODEV;
1049 goto done;
1050 }
1051
1052 if (vga_tryget(pdev, io_state)) {
1053
1054 for (i = 0; i < MAX_USER_CARDS; i++) {
1055 if (priv->cards[i].pdev == pdev) {
1056 if (io_state & VGA_RSRC_LEGACY_IO)
1057 priv->cards[i].io_cnt++;
1058 if (io_state & VGA_RSRC_LEGACY_MEM)
1059 priv->cards[i].mem_cnt++;
1060 break;
1061 }
1062 }
1063 ret_val = count;
1064 goto done;
1065 } else {
1066 ret_val = -EBUSY;
1067 goto done;
1068 }
1069
1070 } else if (strncmp(curr_pos, "target ", 7) == 0) {
1071 unsigned int domain, bus, devfn;
1072 struct vga_device *vgadev;
1073
1074 curr_pos += 7;
1075 remaining -= 7;
1076 pr_debug("client 0x%p called 'target'\n", priv);
1077
1078 if (!strncmp(curr_pos, "default", 7))
1079 pdev = pci_dev_get(vga_default_device());
1080 else {
1081 if (!vga_pci_str_to_vars(curr_pos, remaining,
1082 &domain, &bus, &devfn)) {
1083 ret_val = -EPROTO;
1084 goto done;
1085 }
1086 pr_debug("%s ==> %x:%x:%x.%x\n", curr_pos,
1087 domain, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
1088
1089 pdev = pci_get_domain_bus_and_slot(domain, bus, devfn);
1090 pr_debug("pdev %p\n", pdev);
1091 if (!pdev) {
1092 pr_err("invalid PCI address %x:%x:%x\n",
1093 domain, bus, devfn);
1094 ret_val = -ENODEV;
1095 goto done;
1096 }
1097 }
1098
1099 vgadev = vgadev_find(pdev);
1100 pr_debug("vgadev %p\n", vgadev);
1101 if (vgadev == NULL) {
1102 if (pdev) {
1103 pr_err("this pci device is not a vga device\n");
1104 pci_dev_put(pdev);
1105 }
1106
1107 ret_val = -ENODEV;
1108 goto done;
1109 }
1110
1111 priv->target = pdev;
1112 for (i = 0; i < MAX_USER_CARDS; i++) {
1113 if (priv->cards[i].pdev == pdev)
1114 break;
1115 if (priv->cards[i].pdev == NULL) {
1116 priv->cards[i].pdev = pdev;
1117 priv->cards[i].io_cnt = 0;
1118 priv->cards[i].mem_cnt = 0;
1119 break;
1120 }
1121 }
1122 if (i == MAX_USER_CARDS) {
1123 pr_err("maximum user cards (%d) number reached!\n",
1124 MAX_USER_CARDS);
1125 pci_dev_put(pdev);
1126
1127 ret_val = -ENOMEM;
1128 goto done;
1129 }
1130
1131 ret_val = count;
1132 pci_dev_put(pdev);
1133 goto done;
1134
1135
1136 } else if (strncmp(curr_pos, "decodes ", 8) == 0) {
1137 curr_pos += 8;
1138 remaining -= 8;
1139 pr_debug("client 0x%p called 'decodes'\n", priv);
1140
1141 if (!vga_str_to_iostate(curr_pos, remaining, &io_state)) {
1142 ret_val = -EPROTO;
1143 goto done;
1144 }
1145 pdev = priv->target;
1146 if (priv->target == NULL) {
1147 ret_val = -ENODEV;
1148 goto done;
1149 }
1150
1151 __vga_set_legacy_decoding(pdev, io_state, true);
1152 ret_val = count;
1153 goto done;
1154 }
1155
1156 kfree(kbuf);
1157 return -EPROTO;
1158
1159done:
1160 kfree(kbuf);
1161 return ret_val;
1162}
1163
1164static unsigned int vga_arb_fpoll(struct file *file, poll_table *wait)
1165{
1166 pr_debug("%s\n", __func__);
1167
1168 poll_wait(file, &vga_wait_queue, wait);
1169 return POLLIN;
1170}
1171
1172static int vga_arb_open(struct inode *inode, struct file *file)
1173{
1174 struct vga_arb_private *priv;
1175 unsigned long flags;
1176
1177 pr_debug("%s\n", __func__);
1178
1179 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1180 if (priv == NULL)
1181 return -ENOMEM;
1182 spin_lock_init(&priv->lock);
1183 file->private_data = priv;
1184
1185 spin_lock_irqsave(&vga_user_lock, flags);
1186 list_add(&priv->list, &vga_user_list);
1187 spin_unlock_irqrestore(&vga_user_lock, flags);
1188
1189
1190 priv->target = vga_default_device();
1191 priv->cards[0].pdev = priv->target;
1192 priv->cards[0].io_cnt = 0;
1193 priv->cards[0].mem_cnt = 0;
1194
1195
1196 return 0;
1197}
1198
1199static int vga_arb_release(struct inode *inode, struct file *file)
1200{
1201 struct vga_arb_private *priv = file->private_data;
1202 struct vga_arb_user_card *uc;
1203 unsigned long flags;
1204 int i;
1205
1206 pr_debug("%s\n", __func__);
1207
1208 spin_lock_irqsave(&vga_user_lock, flags);
1209 list_del(&priv->list);
1210 for (i = 0; i < MAX_USER_CARDS; i++) {
1211 uc = &priv->cards[i];
1212 if (uc->pdev == NULL)
1213 continue;
1214 pr_debug("uc->io_cnt == %d, uc->mem_cnt == %d\n",
1215 uc->io_cnt, uc->mem_cnt);
1216 while (uc->io_cnt--)
1217 vga_put(uc->pdev, VGA_RSRC_LEGACY_IO);
1218 while (uc->mem_cnt--)
1219 vga_put(uc->pdev, VGA_RSRC_LEGACY_MEM);
1220 }
1221 spin_unlock_irqrestore(&vga_user_lock, flags);
1222
1223 kfree(priv);
1224
1225 return 0;
1226}
1227
1228static void vga_arb_device_card_gone(struct pci_dev *pdev)
1229{
1230}
1231
1232
1233
1234
1235
1236static void vga_arbiter_notify_clients(void)
1237{
1238 struct vga_device *vgadev;
1239 unsigned long flags;
1240 uint32_t new_decodes;
1241 bool new_state;
1242
1243 if (!vga_arbiter_used)
1244 return;
1245
1246 spin_lock_irqsave(&vga_lock, flags);
1247 list_for_each_entry(vgadev, &vga_list, list) {
1248 if (vga_count > 1)
1249 new_state = false;
1250 else
1251 new_state = true;
1252 if (vgadev->set_vga_decode) {
1253 new_decodes = vgadev->set_vga_decode(vgadev->cookie,
1254 new_state);
1255 vga_update_device_decodes(vgadev, new_decodes);
1256 }
1257 }
1258 spin_unlock_irqrestore(&vga_lock, flags);
1259}
1260
1261static int pci_notify(struct notifier_block *nb, unsigned long action,
1262 void *data)
1263{
1264 struct device *dev = data;
1265 struct pci_dev *pdev = to_pci_dev(dev);
1266 bool notify = false;
1267
1268 pr_debug("%s\n", __func__);
1269
1270
1271
1272
1273 if (action == BUS_NOTIFY_ADD_DEVICE)
1274 notify = vga_arbiter_add_pci_device(pdev);
1275 else if (action == BUS_NOTIFY_DEL_DEVICE)
1276 notify = vga_arbiter_del_pci_device(pdev);
1277
1278 if (notify)
1279 vga_arbiter_notify_clients();
1280 return 0;
1281}
1282
1283static struct notifier_block pci_notifier = {
1284 .notifier_call = pci_notify,
1285};
1286
1287static const struct file_operations vga_arb_device_fops = {
1288 .read = vga_arb_read,
1289 .write = vga_arb_write,
1290 .poll = vga_arb_fpoll,
1291 .open = vga_arb_open,
1292 .release = vga_arb_release,
1293 .llseek = noop_llseek,
1294};
1295
1296static struct miscdevice vga_arb_device = {
1297 MISC_DYNAMIC_MINOR, "vga_arbiter", &vga_arb_device_fops
1298};
1299
1300static int __init vga_arb_device_init(void)
1301{
1302 int rc;
1303 struct pci_dev *pdev;
1304 struct vga_device *vgadev;
1305
1306 rc = misc_register(&vga_arb_device);
1307 if (rc < 0)
1308 pr_err("error %d registering device\n", rc);
1309
1310 bus_register_notifier(&pci_bus_type, &pci_notifier);
1311
1312
1313
1314 pdev = NULL;
1315 while ((pdev =
1316 pci_get_subsys(PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
1317 PCI_ANY_ID, pdev)) != NULL)
1318 vga_arbiter_add_pci_device(pdev);
1319
1320 pr_info("loaded\n");
1321
1322 list_for_each_entry(vgadev, &vga_list, list) {
1323#if defined(CONFIG_X86) || defined(CONFIG_IA64)
1324
1325
1326
1327
1328
1329
1330
1331
1332 resource_size_t start, end, limit;
1333 unsigned long flags;
1334 int i;
1335
1336 limit = screen_info.lfb_base + screen_info.lfb_size;
1337
1338
1339 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
1340 flags = pci_resource_flags(vgadev->pdev, i);
1341
1342 if ((flags & IORESOURCE_MEM) == 0)
1343 continue;
1344
1345 start = pci_resource_start(vgadev->pdev, i);
1346 end = pci_resource_end(vgadev->pdev, i);
1347
1348 if (!start || !end)
1349 continue;
1350
1351 if (screen_info.lfb_base < start || limit >= end)
1352 continue;
1353
1354 if (!vga_default_device())
1355 pr_info("setting as boot device: PCI:%s\n",
1356 pci_name(vgadev->pdev));
1357 else if (vgadev->pdev != vga_default_device())
1358 pr_info("overriding boot device: PCI:%s\n",
1359 pci_name(vgadev->pdev));
1360 vga_set_default_device(vgadev->pdev);
1361 }
1362#endif
1363 if (vgadev->bridge_has_one_vga)
1364 pr_info("bridge control possible %s\n",
1365 pci_name(vgadev->pdev));
1366 else
1367 pr_info("no bridge control possible %s\n",
1368 pci_name(vgadev->pdev));
1369 }
1370 return rc;
1371}
1372subsys_initcall(vga_arb_device_init);
1373