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#include <linux/module.h>
33#include <linux/kernel.h>
34#include <linux/pci.h>
35#include <linux/errno.h>
36#include <linux/init.h>
37#include <linux/list.h>
38#include <linux/sched.h>
39#include <linux/wait.h>
40#include <linux/spinlock.h>
41#include <linux/poll.h>
42#include <linux/miscdevice.h>
43#include <linux/slab.h>
44
45#include <linux/uaccess.h>
46
47#include <linux/vgaarb.h>
48
49static void vga_arbiter_notify_clients(void);
50
51
52
53
54struct vga_device {
55 struct list_head list;
56 struct pci_dev *pdev;
57 unsigned int decodes;
58 unsigned int owns;
59 unsigned int locks;
60 unsigned int io_lock_cnt;
61 unsigned int mem_lock_cnt;
62 unsigned int io_norm_cnt;
63 unsigned int mem_norm_cnt;
64 bool bridge_has_one_vga;
65
66 void *cookie;
67 void (*irq_set_state)(void *cookie, bool enable);
68 unsigned int (*set_vga_decode)(void *cookie, bool decode);
69};
70
71static LIST_HEAD(vga_list);
72static int vga_count, vga_decode_count;
73static bool vga_arbiter_used;
74static DEFINE_SPINLOCK(vga_lock);
75static DECLARE_WAIT_QUEUE_HEAD(vga_wait_queue);
76
77
78static const char *vga_iostate_to_str(unsigned int iostate)
79{
80
81 iostate &= VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
82 switch (iostate) {
83 case VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM:
84 return "io+mem";
85 case VGA_RSRC_LEGACY_IO:
86 return "io";
87 case VGA_RSRC_LEGACY_MEM:
88 return "mem";
89 }
90 return "none";
91}
92
93static int vga_str_to_iostate(char *buf, int str_size, int *io_state)
94{
95
96
97 if (strncmp(buf, "none", 4) == 0) {
98 *io_state = VGA_RSRC_NONE;
99 return 1;
100 }
101
102
103 if (strncmp(buf, "io+mem", 6) == 0)
104 goto both;
105 else if (strncmp(buf, "io", 2) == 0)
106 goto both;
107 else if (strncmp(buf, "mem", 3) == 0)
108 goto both;
109 return 0;
110both:
111 *io_state = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
112 return 1;
113}
114
115#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
116
117static struct pci_dev *vga_default;
118#endif
119
120static void vga_arb_device_card_gone(struct pci_dev *pdev);
121
122
123static struct vga_device *vgadev_find(struct pci_dev *pdev)
124{
125 struct vga_device *vgadev;
126
127 list_for_each_entry(vgadev, &vga_list, list)
128 if (pdev == vgadev->pdev)
129 return vgadev;
130 return NULL;
131}
132
133
134#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
135struct pci_dev *vga_default_device(void)
136{
137 return vga_default;
138}
139
140EXPORT_SYMBOL_GPL(vga_default_device);
141
142void vga_set_default_device(struct pci_dev *pdev)
143{
144 if (vga_default == pdev)
145 return;
146
147 pci_dev_put(vga_default);
148 vga_default = pci_dev_get(pdev);
149}
150#endif
151
152static inline void vga_irq_set_state(struct vga_device *vgadev, bool state)
153{
154 if (vgadev->irq_set_state)
155 vgadev->irq_set_state(vgadev->cookie, state);
156}
157
158
159
160
161
162static void vga_check_first_use(void)
163{
164
165
166
167 if (!vga_arbiter_used) {
168 vga_arbiter_used = true;
169 vga_arbiter_notify_clients();
170 }
171}
172
173static struct vga_device *__vga_tryget(struct vga_device *vgadev,
174 unsigned int rsrc)
175{
176 unsigned int wants, legacy_wants, match;
177 struct vga_device *conflict;
178 unsigned int pci_bits;
179 u32 flags = 0;
180
181
182
183
184 if ((rsrc & VGA_RSRC_NORMAL_IO) &&
185 (vgadev->decodes & VGA_RSRC_LEGACY_IO))
186 rsrc |= VGA_RSRC_LEGACY_IO;
187 if ((rsrc & VGA_RSRC_NORMAL_MEM) &&
188 (vgadev->decodes & VGA_RSRC_LEGACY_MEM))
189 rsrc |= VGA_RSRC_LEGACY_MEM;
190
191 pr_debug("%s: %d\n", __func__, rsrc);
192 pr_debug("%s: owns: %d\n", __func__, vgadev->owns);
193
194
195 wants = rsrc & ~vgadev->owns;
196
197
198 if (wants == 0)
199 goto lock_them;
200
201
202
203
204 legacy_wants = wants & VGA_RSRC_LEGACY_MASK;
205 if (legacy_wants == 0)
206 goto enable_them;
207
208
209 list_for_each_entry(conflict, &vga_list, list) {
210 unsigned int lwants = legacy_wants;
211 unsigned int change_bridge = 0;
212
213
214 if (vgadev == conflict)
215 continue;
216
217
218
219
220 if (!vga_conflicts(vgadev->pdev, conflict->pdev))
221 continue;
222
223
224
225
226
227
228
229 if (vgadev->pdev->bus != conflict->pdev->bus) {
230 change_bridge = 1;
231 lwants = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
232 }
233
234
235
236
237 if (conflict->locks & lwants)
238 return conflict;
239
240
241
242
243
244
245 WARN_ON(conflict->owns & ~conflict->decodes);
246 match = lwants & conflict->owns;
247 if (!match)
248 continue;
249
250
251
252
253
254 flags = 0;
255 pci_bits = 0;
256
257 if (!conflict->bridge_has_one_vga) {
258 vga_irq_set_state(conflict, false);
259 flags |= PCI_VGA_STATE_CHANGE_DECODES;
260 if (lwants & (VGA_RSRC_LEGACY_MEM|VGA_RSRC_NORMAL_MEM))
261 pci_bits |= PCI_COMMAND_MEMORY;
262 if (lwants & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
263 pci_bits |= PCI_COMMAND_IO;
264 }
265
266 if (change_bridge)
267 flags |= PCI_VGA_STATE_CHANGE_BRIDGE;
268
269 pci_set_vga_state(conflict->pdev, false, pci_bits, flags);
270 conflict->owns &= ~lwants;
271
272 if (lwants & VGA_RSRC_LEGACY_MEM)
273 conflict->owns &= ~VGA_RSRC_NORMAL_MEM;
274 if (lwants & VGA_RSRC_LEGACY_IO)
275 conflict->owns &= ~VGA_RSRC_NORMAL_IO;
276 }
277
278enable_them:
279
280
281
282
283
284 flags = 0;
285 pci_bits = 0;
286
287 if (!vgadev->bridge_has_one_vga) {
288 flags |= PCI_VGA_STATE_CHANGE_DECODES;
289 if (wants & (VGA_RSRC_LEGACY_MEM|VGA_RSRC_NORMAL_MEM))
290 pci_bits |= PCI_COMMAND_MEMORY;
291 if (wants & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
292 pci_bits |= PCI_COMMAND_IO;
293 }
294 if (!!(wants & VGA_RSRC_LEGACY_MASK))
295 flags |= PCI_VGA_STATE_CHANGE_BRIDGE;
296
297 pci_set_vga_state(vgadev->pdev, true, pci_bits, flags);
298
299 if (!vgadev->bridge_has_one_vga) {
300 vga_irq_set_state(vgadev, true);
301 }
302 vgadev->owns |= (wants & vgadev->decodes);
303lock_them:
304 vgadev->locks |= (rsrc & VGA_RSRC_LEGACY_MASK);
305 if (rsrc & VGA_RSRC_LEGACY_IO)
306 vgadev->io_lock_cnt++;
307 if (rsrc & VGA_RSRC_LEGACY_MEM)
308 vgadev->mem_lock_cnt++;
309 if (rsrc & VGA_RSRC_NORMAL_IO)
310 vgadev->io_norm_cnt++;
311 if (rsrc & VGA_RSRC_NORMAL_MEM)
312 vgadev->mem_norm_cnt++;
313
314 return NULL;
315}
316
317static void __vga_put(struct vga_device *vgadev, unsigned int rsrc)
318{
319 unsigned int old_locks = vgadev->locks;
320
321 pr_debug("%s\n", __func__);
322
323
324
325
326 if ((rsrc & VGA_RSRC_NORMAL_IO) && vgadev->io_norm_cnt > 0) {
327 vgadev->io_norm_cnt--;
328 if (vgadev->decodes & VGA_RSRC_LEGACY_IO)
329 rsrc |= VGA_RSRC_LEGACY_IO;
330 }
331 if ((rsrc & VGA_RSRC_NORMAL_MEM) && vgadev->mem_norm_cnt > 0) {
332 vgadev->mem_norm_cnt--;
333 if (vgadev->decodes & VGA_RSRC_LEGACY_MEM)
334 rsrc |= VGA_RSRC_LEGACY_MEM;
335 }
336 if ((rsrc & VGA_RSRC_LEGACY_IO) && vgadev->io_lock_cnt > 0)
337 vgadev->io_lock_cnt--;
338 if ((rsrc & VGA_RSRC_LEGACY_MEM) && vgadev->mem_lock_cnt > 0)
339 vgadev->mem_lock_cnt--;
340
341
342
343
344 if (vgadev->io_lock_cnt == 0)
345 vgadev->locks &= ~VGA_RSRC_LEGACY_IO;
346 if (vgadev->mem_lock_cnt == 0)
347 vgadev->locks &= ~VGA_RSRC_LEGACY_MEM;
348
349
350
351
352 if (old_locks != vgadev->locks)
353 wake_up_all(&vga_wait_queue);
354}
355
356int vga_get(struct pci_dev *pdev, unsigned int rsrc, int interruptible)
357{
358 struct vga_device *vgadev, *conflict;
359 unsigned long flags;
360 wait_queue_t wait;
361 int rc = 0;
362
363 vga_check_first_use();
364
365 if (pdev == NULL)
366 pdev = vga_default_device();
367 if (pdev == NULL)
368 return 0;
369
370 for (;;) {
371 spin_lock_irqsave(&vga_lock, flags);
372 vgadev = vgadev_find(pdev);
373 if (vgadev == NULL) {
374 spin_unlock_irqrestore(&vga_lock, flags);
375 rc = -ENODEV;
376 break;
377 }
378 conflict = __vga_tryget(vgadev, rsrc);
379 spin_unlock_irqrestore(&vga_lock, flags);
380 if (conflict == NULL)
381 break;
382
383
384
385
386
387
388
389
390 init_waitqueue_entry(&wait, current);
391 add_wait_queue(&vga_wait_queue, &wait);
392 set_current_state(interruptible ?
393 TASK_INTERRUPTIBLE :
394 TASK_UNINTERRUPTIBLE);
395 if (signal_pending(current)) {
396 rc = -EINTR;
397 break;
398 }
399 schedule();
400 remove_wait_queue(&vga_wait_queue, &wait);
401 set_current_state(TASK_RUNNING);
402 }
403 return rc;
404}
405EXPORT_SYMBOL(vga_get);
406
407int vga_tryget(struct pci_dev *pdev, unsigned int rsrc)
408{
409 struct vga_device *vgadev;
410 unsigned long flags;
411 int rc = 0;
412
413 vga_check_first_use();
414
415
416 if (pdev == NULL)
417 pdev = vga_default_device();
418 if (pdev == NULL)
419 return 0;
420 spin_lock_irqsave(&vga_lock, flags);
421 vgadev = vgadev_find(pdev);
422 if (vgadev == NULL) {
423 rc = -ENODEV;
424 goto bail;
425 }
426 if (__vga_tryget(vgadev, rsrc))
427 rc = -EBUSY;
428bail:
429 spin_unlock_irqrestore(&vga_lock, flags);
430 return rc;
431}
432EXPORT_SYMBOL(vga_tryget);
433
434void vga_put(struct pci_dev *pdev, unsigned int rsrc)
435{
436 struct vga_device *vgadev;
437 unsigned long flags;
438
439
440 if (pdev == NULL)
441 pdev = vga_default_device();
442 if (pdev == NULL)
443 return;
444 spin_lock_irqsave(&vga_lock, flags);
445 vgadev = vgadev_find(pdev);
446 if (vgadev == NULL)
447 goto bail;
448 __vga_put(vgadev, rsrc);
449bail:
450 spin_unlock_irqrestore(&vga_lock, flags);
451}
452EXPORT_SYMBOL(vga_put);
453
454
455
456
457
458
459
460
461
462
463static void vga_arbiter_check_bridge_sharing(struct vga_device *vgadev)
464{
465 struct vga_device *same_bridge_vgadev;
466 struct pci_bus *new_bus, *bus;
467 struct pci_dev *new_bridge, *bridge;
468
469 vgadev->bridge_has_one_vga = true;
470
471 if (list_empty(&vga_list))
472 return;
473
474
475 new_bus = vgadev->pdev->bus;
476 while (new_bus) {
477 new_bridge = new_bus->self;
478
479
480 list_for_each_entry(same_bridge_vgadev, &vga_list, list) {
481 bus = same_bridge_vgadev->pdev->bus;
482 bridge = bus->self;
483
484
485 if (new_bridge == bridge) {
486
487
488
489 same_bridge_vgadev->bridge_has_one_vga = false;
490 }
491
492
493
494
495 while (bus) {
496 bridge = bus->self;
497 if (bridge) {
498 if (bridge == vgadev->pdev->bus->self)
499 vgadev->bridge_has_one_vga = false;
500 }
501 bus = bus->parent;
502 }
503 }
504 new_bus = new_bus->parent;
505 }
506}
507
508
509
510
511
512
513
514static bool vga_arbiter_add_pci_device(struct pci_dev *pdev)
515{
516 struct vga_device *vgadev;
517 unsigned long flags;
518 struct pci_bus *bus;
519 struct pci_dev *bridge;
520 u16 cmd;
521
522
523 if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
524 return false;
525
526
527 vgadev = kmalloc(sizeof(struct vga_device), GFP_KERNEL);
528 if (vgadev == NULL) {
529 pr_err("vgaarb: failed to allocate pci device\n");
530
531
532
533
534 return false;
535 }
536
537 memset(vgadev, 0, sizeof(*vgadev));
538
539
540 spin_lock_irqsave(&vga_lock, flags);
541 if (vgadev_find(pdev) != NULL) {
542 BUG_ON(1);
543 goto fail;
544 }
545 vgadev->pdev = pdev;
546
547
548 vgadev->decodes = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
549 VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
550
551
552 vga_decode_count++;
553
554
555
556 pci_read_config_word(pdev, PCI_COMMAND, &cmd);
557 if (cmd & PCI_COMMAND_IO)
558 vgadev->owns |= VGA_RSRC_LEGACY_IO;
559 if (cmd & PCI_COMMAND_MEMORY)
560 vgadev->owns |= VGA_RSRC_LEGACY_MEM;
561
562
563 bus = pdev->bus;
564 while (bus) {
565 bridge = bus->self;
566 if (bridge) {
567 u16 l;
568 pci_read_config_word(bridge, PCI_BRIDGE_CONTROL,
569 &l);
570 if (!(l & PCI_BRIDGE_CTL_VGA)) {
571 vgadev->owns = 0;
572 break;
573 }
574 }
575 bus = bus->parent;
576 }
577
578
579
580
581#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
582 if (vga_default == NULL &&
583 ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK))
584 vga_set_default_device(pdev);
585#endif
586
587 vga_arbiter_check_bridge_sharing(vgadev);
588
589
590 list_add(&vgadev->list, &vga_list);
591 vga_count++;
592 pr_info("vgaarb: device added: PCI:%s,decodes=%s,owns=%s,locks=%s\n",
593 pci_name(pdev),
594 vga_iostate_to_str(vgadev->decodes),
595 vga_iostate_to_str(vgadev->owns),
596 vga_iostate_to_str(vgadev->locks));
597
598 spin_unlock_irqrestore(&vga_lock, flags);
599 return true;
600fail:
601 spin_unlock_irqrestore(&vga_lock, flags);
602 kfree(vgadev);
603 return false;
604}
605
606static bool vga_arbiter_del_pci_device(struct pci_dev *pdev)
607{
608 struct vga_device *vgadev;
609 unsigned long flags;
610 bool ret = true;
611
612 spin_lock_irqsave(&vga_lock, flags);
613 vgadev = vgadev_find(pdev);
614 if (vgadev == NULL) {
615 ret = false;
616 goto bail;
617 }
618
619#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
620 if (vga_default == pdev)
621 vga_set_default_device(NULL);
622#endif
623
624 if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM))
625 vga_decode_count--;
626
627
628 list_del(&vgadev->list);
629 vga_count--;
630
631
632
633 vga_arb_device_card_gone(pdev);
634
635
636 wake_up_all(&vga_wait_queue);
637bail:
638 spin_unlock_irqrestore(&vga_lock, flags);
639 kfree(vgadev);
640 return ret;
641}
642
643
644static inline void vga_update_device_decodes(struct vga_device *vgadev,
645 int new_decodes)
646{
647 int old_decodes;
648 struct vga_device *new_vgadev, *conflict;
649
650 old_decodes = vgadev->decodes;
651 vgadev->decodes = new_decodes;
652
653 pr_info("vgaarb: device changed decodes: PCI:%s,olddecodes=%s,decodes=%s:owns=%s\n",
654 pci_name(vgadev->pdev),
655 vga_iostate_to_str(old_decodes),
656 vga_iostate_to_str(vgadev->decodes),
657 vga_iostate_to_str(vgadev->owns));
658
659
660
661
662 if ((vgadev->owns & old_decodes) && (vga_count > 1)) {
663
664 vgadev->owns &= ~old_decodes;
665 list_for_each_entry(new_vgadev, &vga_list, list) {
666 if ((new_vgadev != vgadev) &&
667 (new_vgadev->decodes & VGA_RSRC_LEGACY_MASK)) {
668 pr_info("vgaarb: transferring owner from PCI:%s to PCI:%s\n", pci_name(vgadev->pdev), pci_name(new_vgadev->pdev));
669 conflict = __vga_tryget(new_vgadev, VGA_RSRC_LEGACY_MASK);
670 if (!conflict)
671 __vga_put(new_vgadev, VGA_RSRC_LEGACY_MASK);
672 break;
673 }
674 }
675 }
676
677
678 if (old_decodes != new_decodes) {
679 if (new_decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM))
680 vga_decode_count++;
681 else
682 vga_decode_count--;
683 }
684 pr_debug("vgaarb: decoding count now is: %d\n", vga_decode_count);
685}
686
687static void __vga_set_legacy_decoding(struct pci_dev *pdev, unsigned int decodes, bool userspace)
688{
689 struct vga_device *vgadev;
690 unsigned long flags;
691
692 decodes &= VGA_RSRC_LEGACY_MASK;
693
694 spin_lock_irqsave(&vga_lock, flags);
695 vgadev = vgadev_find(pdev);
696 if (vgadev == NULL)
697 goto bail;
698
699
700 if (userspace && vgadev->set_vga_decode)
701 goto bail;
702
703
704 vga_update_device_decodes(vgadev, decodes);
705
706
707
708
709
710bail:
711 spin_unlock_irqrestore(&vga_lock, flags);
712}
713
714void vga_set_legacy_decoding(struct pci_dev *pdev, unsigned int decodes)
715{
716 __vga_set_legacy_decoding(pdev, decodes, false);
717}
718EXPORT_SYMBOL(vga_set_legacy_decoding);
719
720
721int vga_client_register(struct pci_dev *pdev, void *cookie,
722 void (*irq_set_state)(void *cookie, bool state),
723 unsigned int (*set_vga_decode)(void *cookie, 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("vgaarb: %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("vgaarb: pdev %p\n", pdev);
1091 if (!pdev) {
1092 pr_err("vgaarb: 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("vgaarb: vgadev %p\n", vgadev);
1101 if (vgadev == NULL) {
1102 pr_err("vgaarb: this pci device is not a vga device\n");
1103 pci_dev_put(pdev);
1104 ret_val = -ENODEV;
1105 goto done;
1106 }
1107
1108 priv->target = pdev;
1109 for (i = 0; i < MAX_USER_CARDS; i++) {
1110 if (priv->cards[i].pdev == pdev)
1111 break;
1112 if (priv->cards[i].pdev == NULL) {
1113 priv->cards[i].pdev = pdev;
1114 priv->cards[i].io_cnt = 0;
1115 priv->cards[i].mem_cnt = 0;
1116 break;
1117 }
1118 }
1119 if (i == MAX_USER_CARDS) {
1120 pr_err("vgaarb: maximum user cards (%d) number reached!\n",
1121 MAX_USER_CARDS);
1122 pci_dev_put(pdev);
1123
1124 ret_val = -ENOMEM;
1125 goto done;
1126 }
1127
1128 ret_val = count;
1129 pci_dev_put(pdev);
1130 goto done;
1131
1132
1133 } else if (strncmp(curr_pos, "decodes ", 8) == 0) {
1134 curr_pos += 8;
1135 remaining -= 8;
1136 pr_debug("vgaarb: client 0x%p called 'decodes'\n", priv);
1137
1138 if (!vga_str_to_iostate(curr_pos, remaining, &io_state)) {
1139 ret_val = -EPROTO;
1140 goto done;
1141 }
1142 pdev = priv->target;
1143 if (priv->target == NULL) {
1144 ret_val = -ENODEV;
1145 goto done;
1146 }
1147
1148 __vga_set_legacy_decoding(pdev, io_state, true);
1149 ret_val = count;
1150 goto done;
1151 }
1152
1153 kfree(kbuf);
1154 return -EPROTO;
1155
1156done:
1157 kfree(kbuf);
1158 return ret_val;
1159}
1160
1161static unsigned int vga_arb_fpoll(struct file *file, poll_table * wait)
1162{
1163 struct vga_arb_private *priv = file->private_data;
1164
1165 pr_debug("%s\n", __func__);
1166
1167 if (priv == NULL)
1168 return -ENODEV;
1169 poll_wait(file, &vga_wait_queue, wait);
1170 return POLLIN;
1171}
1172
1173static int vga_arb_open(struct inode *inode, struct file *file)
1174{
1175 struct vga_arb_private *priv;
1176 unsigned long flags;
1177
1178 pr_debug("%s\n", __func__);
1179
1180 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1181 if (priv == NULL)
1182 return -ENOMEM;
1183 spin_lock_init(&priv->lock);
1184 file->private_data = priv;
1185
1186 spin_lock_irqsave(&vga_user_lock, flags);
1187 list_add(&priv->list, &vga_user_list);
1188 spin_unlock_irqrestore(&vga_user_lock, flags);
1189
1190
1191 priv->target = vga_default_device();
1192 priv->cards[0].pdev = priv->target;
1193 priv->cards[0].io_cnt = 0;
1194 priv->cards[0].mem_cnt = 0;
1195
1196
1197 return 0;
1198}
1199
1200static int vga_arb_release(struct inode *inode, struct file *file)
1201{
1202 struct vga_arb_private *priv = file->private_data;
1203 struct vga_arb_user_card *uc;
1204 unsigned long flags;
1205 int i;
1206
1207 pr_debug("%s\n", __func__);
1208
1209 if (priv == NULL)
1210 return -ENODEV;
1211
1212 spin_lock_irqsave(&vga_user_lock, flags);
1213 list_del(&priv->list);
1214 for (i = 0; i < MAX_USER_CARDS; i++) {
1215 uc = &priv->cards[i];
1216 if (uc->pdev == NULL)
1217 continue;
1218 pr_debug("uc->io_cnt == %d, uc->mem_cnt == %d\n",
1219 uc->io_cnt, uc->mem_cnt);
1220 while (uc->io_cnt--)
1221 vga_put(uc->pdev, VGA_RSRC_LEGACY_IO);
1222 while (uc->mem_cnt--)
1223 vga_put(uc->pdev, VGA_RSRC_LEGACY_MEM);
1224 }
1225 spin_unlock_irqrestore(&vga_user_lock, flags);
1226
1227 kfree(priv);
1228
1229 return 0;
1230}
1231
1232static void vga_arb_device_card_gone(struct pci_dev *pdev)
1233{
1234}
1235
1236
1237
1238
1239
1240static void vga_arbiter_notify_clients(void)
1241{
1242 struct vga_device *vgadev;
1243 unsigned long flags;
1244 uint32_t new_decodes;
1245 bool new_state;
1246
1247 if (!vga_arbiter_used)
1248 return;
1249
1250 spin_lock_irqsave(&vga_lock, flags);
1251 list_for_each_entry(vgadev, &vga_list, list) {
1252 if (vga_count > 1)
1253 new_state = false;
1254 else
1255 new_state = true;
1256 if (vgadev->set_vga_decode) {
1257 new_decodes = vgadev->set_vga_decode(vgadev->cookie, new_state);
1258 vga_update_device_decodes(vgadev, new_decodes);
1259 }
1260 }
1261 spin_unlock_irqrestore(&vga_lock, flags);
1262}
1263
1264static int pci_notify(struct notifier_block *nb, unsigned long action,
1265 void *data)
1266{
1267 struct device *dev = data;
1268 struct pci_dev *pdev = to_pci_dev(dev);
1269 bool notify = false;
1270
1271 pr_debug("%s\n", __func__);
1272
1273
1274
1275
1276 if (action == BUS_NOTIFY_ADD_DEVICE)
1277 notify = vga_arbiter_add_pci_device(pdev);
1278 else if (action == BUS_NOTIFY_DEL_DEVICE)
1279 notify = vga_arbiter_del_pci_device(pdev);
1280
1281 if (notify)
1282 vga_arbiter_notify_clients();
1283 return 0;
1284}
1285
1286static struct notifier_block pci_notifier = {
1287 .notifier_call = pci_notify,
1288};
1289
1290static const struct file_operations vga_arb_device_fops = {
1291 .read = vga_arb_read,
1292 .write = vga_arb_write,
1293 .poll = vga_arb_fpoll,
1294 .open = vga_arb_open,
1295 .release = vga_arb_release,
1296 .llseek = noop_llseek,
1297};
1298
1299static struct miscdevice vga_arb_device = {
1300 MISC_DYNAMIC_MINOR, "vga_arbiter", &vga_arb_device_fops
1301};
1302
1303static int __init vga_arb_device_init(void)
1304{
1305 int rc;
1306 struct pci_dev *pdev;
1307 struct vga_device *vgadev;
1308
1309 rc = misc_register(&vga_arb_device);
1310 if (rc < 0)
1311 pr_err("vgaarb: error %d registering device\n", rc);
1312
1313 bus_register_notifier(&pci_bus_type, &pci_notifier);
1314
1315
1316
1317 pdev = NULL;
1318 while ((pdev =
1319 pci_get_subsys(PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
1320 PCI_ANY_ID, pdev)) != NULL)
1321 vga_arbiter_add_pci_device(pdev);
1322
1323 pr_info("vgaarb: loaded\n");
1324
1325 list_for_each_entry(vgadev, &vga_list, list) {
1326 if (vgadev->bridge_has_one_vga)
1327 pr_info("vgaarb: bridge control possible %s\n", pci_name(vgadev->pdev));
1328 else
1329 pr_info("vgaarb: no bridge control possible %s\n", pci_name(vgadev->pdev));
1330 }
1331 return rc;
1332}
1333subsys_initcall(vga_arb_device_init);
1334