blob: 5f1bde5efc7ff6ef016a02fd9f2c07f9f5259713 [file] [log] [blame]
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001/*
Tiago Vignattic0db9cb2010-05-24 18:24:31 +03002 * vgaarb.c: Implements the VGA arbitration. For details refer to
3 * Documentation/vgaarbiter.txt
4 *
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10005 *
6 * (C) Copyright 2005 Benjamin Herrenschmidt <benh@kernel.crashing.org>
7 * (C) Copyright 2007 Paulo R. Zanoni <przanoni@gmail.com>
8 * (C) Copyright 2007, 2009 Tiago Vignatti <vignatti@freedesktop.org>
9 *
Tiago Vignattic0db9cb2010-05-24 18:24:31 +030010 * Permission is hereby granted, free of charge, to any person obtaining a
11 * copy of this software and associated documentation files (the "Software"),
12 * to deal in the Software without restriction, including without limitation
13 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 * and/or sell copies of the Software, and to permit persons to whom the
15 * Software is furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice (including the next
18 * paragraph) shall be included in all copies or substantial portions of the
19 * Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 * DEALINGS
28 * IN THE SOFTWARE.
29 *
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +100030 */
31
Thierry Reding8b7e2e82015-08-12 16:32:06 +020032#define pr_fmt(fmt) "vgaarb: " fmt
33
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +100034#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>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090045#include <linux/slab.h>
Bruno Prémont86fd8872014-08-24 23:09:53 +020046#include <linux/screen_info.h>
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +100047
48#include <linux/uaccess.h>
49
50#include <linux/vgaarb.h>
51
52static void vga_arbiter_notify_clients(void);
53/*
54 * We keep a list of all vga devices in the system to speed
55 * up the various operations of the arbiter
56 */
57struct vga_device {
58 struct list_head list;
59 struct pci_dev *pdev;
60 unsigned int decodes; /* what does it decodes */
61 unsigned int owns; /* what does it owns */
62 unsigned int locks; /* what does it locks */
63 unsigned int io_lock_cnt; /* legacy IO lock count */
64 unsigned int mem_lock_cnt; /* legacy MEM lock count */
65 unsigned int io_norm_cnt; /* normal IO count */
66 unsigned int mem_norm_cnt; /* normal MEM count */
Dave Airlie3448a192010-06-01 15:32:24 +100067 bool bridge_has_one_vga;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +100068 /* allow IRQ enable/disable hook */
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 /* Ignore VGA_RSRC_IO and VGA_RSRC_MEM */
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 /* we could in theory hand out locks on IO and mem
99 * separately to userspace but it can cause deadlocks */
100 if (strncmp(buf, "none", 4) == 0) {
101 *io_state = VGA_RSRC_NONE;
102 return 1;
103 }
104
105 /* XXX We're not chekcing the str_size! */
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
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000118/* this is only used a cookie - it should not be dereferenced */
119static struct pci_dev *vga_default;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000120
121static void vga_arb_device_card_gone(struct pci_dev *pdev);
122
123/* Find somebody in our list */
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/* Returns the default VGA device (vgacon's babe) */
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000135struct pci_dev *vga_default_device(void)
136{
137 return vga_default;
138}
Matthew Garrett1a39b312012-04-16 16:26:02 -0400139
Matthew Garrett1b231702012-04-24 09:31:28 +0100140EXPORT_SYMBOL_GPL(vga_default_device);
141
Matthew Garrett1a39b312012-04-16 16:26:02 -0400142void vga_set_default_device(struct pci_dev *pdev)
143{
Yinghai Lu84544a12012-09-19 11:54:15 -0700144 if (vga_default == pdev)
145 return;
146
147 pci_dev_put(vga_default);
148 vga_default = pci_dev_get(pdev);
Matthew Garrett1a39b312012-04-16 16:26:02 -0400149}
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000150
151static inline void vga_irq_set_state(struct vga_device *vgadev, bool state)
152{
153 if (vgadev->irq_set_state)
154 vgadev->irq_set_state(vgadev->cookie, state);
155}
156
157
158/* If we don't ever use VGA arb we should avoid
159 turning off anything anywhere due to old X servers getting
160 confused about the boot device not being VGA */
161static void vga_check_first_use(void)
162{
163 /* we should inform all GPUs in the system that
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300164 * VGA arb has occurred and to try and disable resources
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000165 * if they can */
166 if (!vga_arbiter_used) {
167 vga_arbiter_used = true;
168 vga_arbiter_notify_clients();
169 }
170}
171
172static struct vga_device *__vga_tryget(struct vga_device *vgadev,
173 unsigned int rsrc)
174{
175 unsigned int wants, legacy_wants, match;
176 struct vga_device *conflict;
177 unsigned int pci_bits;
Dave Airlie3448a192010-06-01 15:32:24 +1000178 u32 flags = 0;
179
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000180 /* Account for "normal" resources to lock. If we decode the legacy,
181 * counterpart, we need to request it as well
182 */
183 if ((rsrc & VGA_RSRC_NORMAL_IO) &&
184 (vgadev->decodes & VGA_RSRC_LEGACY_IO))
185 rsrc |= VGA_RSRC_LEGACY_IO;
186 if ((rsrc & VGA_RSRC_NORMAL_MEM) &&
187 (vgadev->decodes & VGA_RSRC_LEGACY_MEM))
188 rsrc |= VGA_RSRC_LEGACY_MEM;
189
Tiago Vignatti2d6e9b92010-05-24 18:24:30 +0300190 pr_debug("%s: %d\n", __func__, rsrc);
191 pr_debug("%s: owns: %d\n", __func__, vgadev->owns);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000192
193 /* Check what resources we need to acquire */
194 wants = rsrc & ~vgadev->owns;
195
196 /* We already own everything, just mark locked & bye bye */
197 if (wants == 0)
198 goto lock_them;
199
200 /* We don't need to request a legacy resource, we just enable
201 * appropriate decoding and go
202 */
203 legacy_wants = wants & VGA_RSRC_LEGACY_MASK;
204 if (legacy_wants == 0)
205 goto enable_them;
206
207 /* Ok, we don't, let's find out how we need to kick off */
208 list_for_each_entry(conflict, &vga_list, list) {
209 unsigned int lwants = legacy_wants;
210 unsigned int change_bridge = 0;
211
212 /* Don't conflict with myself */
213 if (vgadev == conflict)
214 continue;
215
216 /* Check if the architecture allows a conflict between those
217 * 2 devices or if they are on separate domains
218 */
219 if (!vga_conflicts(vgadev->pdev, conflict->pdev))
220 continue;
221
222 /* We have a possible conflict. before we go further, we must
223 * check if we sit on the same bus as the conflicting device.
224 * if we don't, then we must tie both IO and MEM resources
225 * together since there is only a single bit controlling
226 * VGA forwarding on P2P bridges
227 */
228 if (vgadev->pdev->bus != conflict->pdev->bus) {
229 change_bridge = 1;
230 lwants = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
231 }
232
233 /* Check if the guy has a lock on the resource. If he does,
234 * return the conflicting entry
235 */
236 if (conflict->locks & lwants)
237 return conflict;
238
Alex Williamson4e4e7dc2014-07-03 09:59:51 -0600239 /* Ok, now check if it owns the resource we want. We can
240 * lock resources that are not decoded, therefore a device
241 * can own resources it doesn't decode.
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000242 */
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000243 match = lwants & conflict->owns;
244 if (!match)
245 continue;
246
247 /* looks like he doesn't have a lock, we can steal
248 * them from him
249 */
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000250
Dave Airlie3448a192010-06-01 15:32:24 +1000251 flags = 0;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000252 pci_bits = 0;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000253
Alex Williamson4e4e7dc2014-07-03 09:59:51 -0600254 /* If we can't control legacy resources via the bridge, we
255 * also need to disable normal decoding.
256 */
Dave Airlie3448a192010-06-01 15:32:24 +1000257 if (!conflict->bridge_has_one_vga) {
Alex Williamson4e4e7dc2014-07-03 09:59:51 -0600258 if ((match & conflict->decodes) & VGA_RSRC_LEGACY_MEM)
Dave Airlie3448a192010-06-01 15:32:24 +1000259 pci_bits |= PCI_COMMAND_MEMORY;
Alex Williamson4e4e7dc2014-07-03 09:59:51 -0600260 if ((match & conflict->decodes) & VGA_RSRC_LEGACY_IO)
Dave Airlie3448a192010-06-01 15:32:24 +1000261 pci_bits |= PCI_COMMAND_IO;
Alex Williamson4e4e7dc2014-07-03 09:59:51 -0600262
263 if (pci_bits) {
264 vga_irq_set_state(conflict, false);
265 flags |= PCI_VGA_STATE_CHANGE_DECODES;
266 }
Dave Airlie3448a192010-06-01 15:32:24 +1000267 }
268
269 if (change_bridge)
270 flags |= PCI_VGA_STATE_CHANGE_BRIDGE;
271
272 pci_set_vga_state(conflict->pdev, false, pci_bits, flags);
Alex Williamsonf22d7762013-08-15 16:37:53 -0600273 conflict->owns &= ~match;
Alex Williamson4e4e7dc2014-07-03 09:59:51 -0600274
275 /* If we disabled normal decoding, reflect it in owns */
276 if (pci_bits & PCI_COMMAND_MEMORY)
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000277 conflict->owns &= ~VGA_RSRC_NORMAL_MEM;
Alex Williamson4e4e7dc2014-07-03 09:59:51 -0600278 if (pci_bits & PCI_COMMAND_IO)
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000279 conflict->owns &= ~VGA_RSRC_NORMAL_IO;
280 }
281
282enable_them:
283 /* ok dude, we got it, everybody conflicting has been disabled, let's
Alex Williamson4e4e7dc2014-07-03 09:59:51 -0600284 * enable us. Mark any bits in "owns" regardless of whether we
285 * decoded them. We can lock resources we don't decode, therefore
286 * we must track them via "owns".
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000287 */
Dave Airlie3448a192010-06-01 15:32:24 +1000288 flags = 0;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000289 pci_bits = 0;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000290
Dave Airlie3448a192010-06-01 15:32:24 +1000291 if (!vgadev->bridge_has_one_vga) {
292 flags |= PCI_VGA_STATE_CHANGE_DECODES;
293 if (wants & (VGA_RSRC_LEGACY_MEM|VGA_RSRC_NORMAL_MEM))
294 pci_bits |= PCI_COMMAND_MEMORY;
295 if (wants & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
296 pci_bits |= PCI_COMMAND_IO;
297 }
Alex Williamson4e4e7dc2014-07-03 09:59:51 -0600298 if (wants & VGA_RSRC_LEGACY_MASK)
Dave Airlie3448a192010-06-01 15:32:24 +1000299 flags |= PCI_VGA_STATE_CHANGE_BRIDGE;
300
301 pci_set_vga_state(vgadev->pdev, true, pci_bits, flags);
302
303 if (!vgadev->bridge_has_one_vga) {
304 vga_irq_set_state(vgadev, true);
305 }
Alex Williamson4e4e7dc2014-07-03 09:59:51 -0600306 vgadev->owns |= wants;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000307lock_them:
308 vgadev->locks |= (rsrc & VGA_RSRC_LEGACY_MASK);
309 if (rsrc & VGA_RSRC_LEGACY_IO)
310 vgadev->io_lock_cnt++;
311 if (rsrc & VGA_RSRC_LEGACY_MEM)
312 vgadev->mem_lock_cnt++;
313 if (rsrc & VGA_RSRC_NORMAL_IO)
314 vgadev->io_norm_cnt++;
315 if (rsrc & VGA_RSRC_NORMAL_MEM)
316 vgadev->mem_norm_cnt++;
317
318 return NULL;
319}
320
321static void __vga_put(struct vga_device *vgadev, unsigned int rsrc)
322{
323 unsigned int old_locks = vgadev->locks;
324
Tiago Vignatti2d6e9b92010-05-24 18:24:30 +0300325 pr_debug("%s\n", __func__);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000326
327 /* Update our counters, and account for equivalent legacy resources
328 * if we decode them
329 */
330 if ((rsrc & VGA_RSRC_NORMAL_IO) && vgadev->io_norm_cnt > 0) {
331 vgadev->io_norm_cnt--;
332 if (vgadev->decodes & VGA_RSRC_LEGACY_IO)
333 rsrc |= VGA_RSRC_LEGACY_IO;
334 }
335 if ((rsrc & VGA_RSRC_NORMAL_MEM) && vgadev->mem_norm_cnt > 0) {
336 vgadev->mem_norm_cnt--;
337 if (vgadev->decodes & VGA_RSRC_LEGACY_MEM)
338 rsrc |= VGA_RSRC_LEGACY_MEM;
339 }
340 if ((rsrc & VGA_RSRC_LEGACY_IO) && vgadev->io_lock_cnt > 0)
341 vgadev->io_lock_cnt--;
342 if ((rsrc & VGA_RSRC_LEGACY_MEM) && vgadev->mem_lock_cnt > 0)
343 vgadev->mem_lock_cnt--;
344
345 /* Just clear lock bits, we do lazy operations so we don't really
346 * have to bother about anything else at this point
347 */
348 if (vgadev->io_lock_cnt == 0)
349 vgadev->locks &= ~VGA_RSRC_LEGACY_IO;
350 if (vgadev->mem_lock_cnt == 0)
351 vgadev->locks &= ~VGA_RSRC_LEGACY_MEM;
352
353 /* Kick the wait queue in case somebody was waiting if we actually
354 * released something
355 */
356 if (old_locks != vgadev->locks)
357 wake_up_all(&vga_wait_queue);
358}
359
360int vga_get(struct pci_dev *pdev, unsigned int rsrc, int interruptible)
361{
362 struct vga_device *vgadev, *conflict;
363 unsigned long flags;
364 wait_queue_t wait;
365 int rc = 0;
366
367 vga_check_first_use();
368 /* The one who calls us should check for this, but lets be sure... */
369 if (pdev == NULL)
370 pdev = vga_default_device();
371 if (pdev == NULL)
372 return 0;
373
374 for (;;) {
375 spin_lock_irqsave(&vga_lock, flags);
376 vgadev = vgadev_find(pdev);
377 if (vgadev == NULL) {
378 spin_unlock_irqrestore(&vga_lock, flags);
379 rc = -ENODEV;
380 break;
381 }
382 conflict = __vga_tryget(vgadev, rsrc);
383 spin_unlock_irqrestore(&vga_lock, flags);
384 if (conflict == NULL)
385 break;
386
387
388 /* We have a conflict, we wait until somebody kicks the
389 * work queue. Currently we have one work queue that we
390 * kick each time some resources are released, but it would
391 * be fairly easy to have a per device one so that we only
392 * need to attach to the conflicting device
393 */
394 init_waitqueue_entry(&wait, current);
395 add_wait_queue(&vga_wait_queue, &wait);
396 set_current_state(interruptible ?
397 TASK_INTERRUPTIBLE :
398 TASK_UNINTERRUPTIBLE);
399 if (signal_pending(current)) {
400 rc = -EINTR;
401 break;
402 }
403 schedule();
404 remove_wait_queue(&vga_wait_queue, &wait);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000405 }
406 return rc;
407}
408EXPORT_SYMBOL(vga_get);
409
410int vga_tryget(struct pci_dev *pdev, unsigned int rsrc)
411{
412 struct vga_device *vgadev;
413 unsigned long flags;
414 int rc = 0;
415
416 vga_check_first_use();
417
418 /* The one who calls us should check for this, but lets be sure... */
419 if (pdev == NULL)
420 pdev = vga_default_device();
421 if (pdev == NULL)
422 return 0;
423 spin_lock_irqsave(&vga_lock, flags);
424 vgadev = vgadev_find(pdev);
425 if (vgadev == NULL) {
426 rc = -ENODEV;
427 goto bail;
428 }
429 if (__vga_tryget(vgadev, rsrc))
430 rc = -EBUSY;
431bail:
432 spin_unlock_irqrestore(&vga_lock, flags);
433 return rc;
434}
435EXPORT_SYMBOL(vga_tryget);
436
437void vga_put(struct pci_dev *pdev, unsigned int rsrc)
438{
439 struct vga_device *vgadev;
440 unsigned long flags;
441
442 /* The one who calls us should check for this, but lets be sure... */
443 if (pdev == NULL)
444 pdev = vga_default_device();
445 if (pdev == NULL)
446 return;
447 spin_lock_irqsave(&vga_lock, flags);
448 vgadev = vgadev_find(pdev);
449 if (vgadev == NULL)
450 goto bail;
451 __vga_put(vgadev, rsrc);
452bail:
453 spin_unlock_irqrestore(&vga_lock, flags);
454}
455EXPORT_SYMBOL(vga_put);
456
Dave Airlie3448a192010-06-01 15:32:24 +1000457/* Rules for using a bridge to control a VGA descendant decoding:
458 if a bridge has only one VGA descendant then it can be used
459 to control the VGA routing for that device.
460 It should always use the bridge closest to the device to control it.
461 If a bridge has a direct VGA descendant, but also have a sub-bridge
462 VGA descendant then we cannot use that bridge to control the direct VGA descendant.
463 So for every device we register, we need to iterate all its parent bridges
464 so we can invalidate any devices using them properly.
465*/
466static void vga_arbiter_check_bridge_sharing(struct vga_device *vgadev)
467{
468 struct vga_device *same_bridge_vgadev;
469 struct pci_bus *new_bus, *bus;
470 struct pci_dev *new_bridge, *bridge;
471
472 vgadev->bridge_has_one_vga = true;
473
474 if (list_empty(&vga_list))
475 return;
476
477 /* okay iterate the new devices bridge hierarachy */
478 new_bus = vgadev->pdev->bus;
479 while (new_bus) {
480 new_bridge = new_bus->self;
481
Dave Airlief6252112011-10-10 09:29:18 +0100482 /* go through list of devices already registered */
483 list_for_each_entry(same_bridge_vgadev, &vga_list, list) {
484 bus = same_bridge_vgadev->pdev->bus;
485 bridge = bus->self;
486
487 /* see if the share a bridge with this device */
488 if (new_bridge == bridge) {
489 /* if their direct parent bridge is the same
490 as any bridge of this device then it can't be used
491 for that device */
492 same_bridge_vgadev->bridge_has_one_vga = false;
493 }
494
495 /* now iterate the previous devices bridge hierarchy */
496 /* if the new devices parent bridge is in the other devices
497 hierarchy then we can't use it to control this device */
498 while (bus) {
Dave Airlie3448a192010-06-01 15:32:24 +1000499 bridge = bus->self;
Dave Airlief6252112011-10-10 09:29:18 +0100500 if (bridge) {
501 if (bridge == vgadev->pdev->bus->self)
502 vgadev->bridge_has_one_vga = false;
Dave Airlie3448a192010-06-01 15:32:24 +1000503 }
Dave Airlief6252112011-10-10 09:29:18 +0100504 bus = bus->parent;
Dave Airlie3448a192010-06-01 15:32:24 +1000505 }
506 }
507 new_bus = new_bus->parent;
508 }
509}
510
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000511/*
512 * Currently, we assume that the "initial" setup of the system is
513 * not sane, that is we come up with conflicting devices and let
514 * the arbiter's client decides if devices decodes or not legacy
515 * things.
516 */
517static bool vga_arbiter_add_pci_device(struct pci_dev *pdev)
518{
519 struct vga_device *vgadev;
520 unsigned long flags;
521 struct pci_bus *bus;
522 struct pci_dev *bridge;
523 u16 cmd;
524
525 /* Only deal with VGA class devices */
526 if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
527 return false;
528
529 /* Allocate structure */
530 vgadev = kmalloc(sizeof(struct vga_device), GFP_KERNEL);
531 if (vgadev == NULL) {
Thierry Reding8b7e2e82015-08-12 16:32:06 +0200532 pr_err("failed to allocate pci device\n");
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000533 /* What to do on allocation failure ? For now, let's
534 * just do nothing, I'm not sure there is anything saner
535 * to be done
536 */
537 return false;
538 }
539
540 memset(vgadev, 0, sizeof(*vgadev));
541
542 /* Take lock & check for duplicates */
543 spin_lock_irqsave(&vga_lock, flags);
544 if (vgadev_find(pdev) != NULL) {
545 BUG_ON(1);
546 goto fail;
547 }
548 vgadev->pdev = pdev;
549
550 /* By default, assume we decode everything */
551 vgadev->decodes = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
552 VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
553
554 /* by default mark it as decoding */
555 vga_decode_count++;
556 /* Mark that we "own" resources based on our enables, we will
557 * clear that below if the bridge isn't forwarding
558 */
559 pci_read_config_word(pdev, PCI_COMMAND, &cmd);
560 if (cmd & PCI_COMMAND_IO)
561 vgadev->owns |= VGA_RSRC_LEGACY_IO;
562 if (cmd & PCI_COMMAND_MEMORY)
563 vgadev->owns |= VGA_RSRC_LEGACY_MEM;
564
565 /* Check if VGA cycles can get down to us */
566 bus = pdev->bus;
567 while (bus) {
568 bridge = bus->self;
569 if (bridge) {
570 u16 l;
571 pci_read_config_word(bridge, PCI_BRIDGE_CONTROL,
572 &l);
573 if (!(l & PCI_BRIDGE_CTL_VGA)) {
574 vgadev->owns = 0;
575 break;
576 }
577 }
578 bus = bus->parent;
579 }
580
581 /* Deal with VGA default device. Use first enabled one
582 * by default if arch doesn't have it's own hook
583 */
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000584 if (vga_default == NULL &&
Bruno Prémont86fd8872014-08-24 23:09:53 +0200585 ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) {
Thierry Reding8b7e2e82015-08-12 16:32:06 +0200586 pr_info("setting as boot device: PCI:%s\n", pci_name(pdev));
Yinghai Lu84544a12012-09-19 11:54:15 -0700587 vga_set_default_device(pdev);
Bruno Prémont86fd8872014-08-24 23:09:53 +0200588 }
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000589
Dave Airlie3448a192010-06-01 15:32:24 +1000590 vga_arbiter_check_bridge_sharing(vgadev);
591
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000592 /* Add to the list */
593 list_add(&vgadev->list, &vga_list);
594 vga_count++;
Thierry Reding8b7e2e82015-08-12 16:32:06 +0200595 pr_info("device added: PCI:%s,decodes=%s,owns=%s,locks=%s\n",
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000596 pci_name(pdev),
597 vga_iostate_to_str(vgadev->decodes),
598 vga_iostate_to_str(vgadev->owns),
599 vga_iostate_to_str(vgadev->locks));
600
601 spin_unlock_irqrestore(&vga_lock, flags);
602 return true;
603fail:
604 spin_unlock_irqrestore(&vga_lock, flags);
605 kfree(vgadev);
606 return false;
607}
608
609static bool vga_arbiter_del_pci_device(struct pci_dev *pdev)
610{
611 struct vga_device *vgadev;
612 unsigned long flags;
613 bool ret = true;
614
615 spin_lock_irqsave(&vga_lock, flags);
616 vgadev = vgadev_find(pdev);
617 if (vgadev == NULL) {
618 ret = false;
619 goto bail;
620 }
621
Yinghai Lu84544a12012-09-19 11:54:15 -0700622 if (vga_default == pdev)
623 vga_set_default_device(NULL);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000624
625 if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM))
626 vga_decode_count--;
627
628 /* Remove entry from list */
629 list_del(&vgadev->list);
630 vga_count--;
631 /* Notify userland driver that the device is gone so it discards
632 * it's copies of the pci_dev pointer
633 */
634 vga_arb_device_card_gone(pdev);
635
636 /* Wake up all possible waiters */
637 wake_up_all(&vga_wait_queue);
638bail:
639 spin_unlock_irqrestore(&vga_lock, flags);
640 kfree(vgadev);
641 return ret;
642}
643
644/* this is called with the lock */
645static inline void vga_update_device_decodes(struct vga_device *vgadev,
646 int new_decodes)
647{
Alex Williamson5c0f6ee2013-08-15 16:37:59 -0600648 int old_decodes, decodes_removed, decodes_unlocked;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000649
650 old_decodes = vgadev->decodes;
Alex Williamson5c0f6ee2013-08-15 16:37:59 -0600651 decodes_removed = ~new_decodes & old_decodes;
652 decodes_unlocked = vgadev->locks & decodes_removed;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000653 vgadev->decodes = new_decodes;
654
Thierry Reding8b7e2e82015-08-12 16:32:06 +0200655 pr_info("device changed decodes: PCI:%s,olddecodes=%s,decodes=%s:owns=%s\n",
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000656 pci_name(vgadev->pdev),
657 vga_iostate_to_str(old_decodes),
658 vga_iostate_to_str(vgadev->decodes),
659 vga_iostate_to_str(vgadev->owns));
660
Alex Williamson5c0f6ee2013-08-15 16:37:59 -0600661 /* if we removed locked decodes, lock count goes to zero, and release */
662 if (decodes_unlocked) {
663 if (decodes_unlocked & VGA_RSRC_LEGACY_IO)
664 vgadev->io_lock_cnt = 0;
665 if (decodes_unlocked & VGA_RSRC_LEGACY_MEM)
666 vgadev->mem_lock_cnt = 0;
667 __vga_put(vgadev, decodes_unlocked);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000668 }
669
670 /* change decodes counter */
Alex Williamson5c0f6ee2013-08-15 16:37:59 -0600671 if (old_decodes & VGA_RSRC_LEGACY_MASK &&
672 !(new_decodes & VGA_RSRC_LEGACY_MASK))
673 vga_decode_count--;
674 if (!(old_decodes & VGA_RSRC_LEGACY_MASK) &&
675 new_decodes & VGA_RSRC_LEGACY_MASK)
676 vga_decode_count++;
Thierry Reding8b7e2e82015-08-12 16:32:06 +0200677 pr_debug("decoding count now is: %d\n", vga_decode_count);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000678}
679
Daniel J Blueman201ba4c2010-09-22 18:05:35 +0100680static void __vga_set_legacy_decoding(struct pci_dev *pdev, unsigned int decodes, bool userspace)
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000681{
682 struct vga_device *vgadev;
683 unsigned long flags;
684
685 decodes &= VGA_RSRC_LEGACY_MASK;
686
687 spin_lock_irqsave(&vga_lock, flags);
688 vgadev = vgadev_find(pdev);
689 if (vgadev == NULL)
690 goto bail;
691
692 /* don't let userspace futz with kernel driver decodes */
693 if (userspace && vgadev->set_vga_decode)
694 goto bail;
695
696 /* update the device decodes + counter */
697 vga_update_device_decodes(vgadev, decodes);
698
699 /* XXX if somebody is going from "doesn't decode" to "decodes" state
700 * here, additional care must be taken as we may have pending owner
701 * ship of non-legacy region ...
702 */
703bail:
704 spin_unlock_irqrestore(&vga_lock, flags);
705}
706
707void vga_set_legacy_decoding(struct pci_dev *pdev, unsigned int decodes)
708{
709 __vga_set_legacy_decoding(pdev, decodes, false);
710}
711EXPORT_SYMBOL(vga_set_legacy_decoding);
712
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000713/* call with NULL to unregister */
714int vga_client_register(struct pci_dev *pdev, void *cookie,
715 void (*irq_set_state)(void *cookie, bool state),
716 unsigned int (*set_vga_decode)(void *cookie, bool decode))
717{
Chris Wilson934f9922011-01-20 13:09:12 +0000718 int ret = -ENODEV;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000719 struct vga_device *vgadev;
720 unsigned long flags;
721
722 spin_lock_irqsave(&vga_lock, flags);
723 vgadev = vgadev_find(pdev);
724 if (!vgadev)
725 goto bail;
726
727 vgadev->irq_set_state = irq_set_state;
728 vgadev->set_vga_decode = set_vga_decode;
729 vgadev->cookie = cookie;
730 ret = 0;
731
732bail:
733 spin_unlock_irqrestore(&vga_lock, flags);
734 return ret;
735
736}
737EXPORT_SYMBOL(vga_client_register);
738
739/*
740 * Char driver implementation
741 *
742 * Semantics is:
743 *
744 * open : open user instance of the arbitrer. by default, it's
745 * attached to the default VGA device of the system.
746 *
747 * close : close user instance, release locks
748 *
749 * read : return a string indicating the status of the target.
750 * an IO state string is of the form {io,mem,io+mem,none},
751 * mc and ic are respectively mem and io lock counts (for
752 * debugging/diagnostic only). "decodes" indicate what the
753 * card currently decodes, "owns" indicates what is currently
754 * enabled on it, and "locks" indicates what is locked by this
755 * card. If the card is unplugged, we get "invalid" then for
756 * card_ID and an -ENODEV error is returned for any command
757 * until a new card is targeted
758 *
759 * "<card_ID>,decodes=<io_state>,owns=<io_state>,locks=<io_state> (ic,mc)"
760 *
761 * write : write a command to the arbiter. List of commands is:
762 *
763 * target <card_ID> : switch target to card <card_ID> (see below)
764 * lock <io_state> : acquires locks on target ("none" is invalid io_state)
765 * trylock <io_state> : non-blocking acquire locks on target
766 * unlock <io_state> : release locks on target
767 * unlock all : release all locks on target held by this user
768 * decodes <io_state> : set the legacy decoding attributes for the card
769 *
770 * poll : event if something change on any card (not just the target)
771 *
772 * card_ID is of the form "PCI:domain:bus:dev.fn". It can be set to "default"
773 * to go back to the system default card (TODO: not implemented yet).
774 * Currently, only PCI is supported as a prefix, but the userland API may
775 * support other bus types in the future, even if the current kernel
776 * implementation doesn't.
777 *
778 * Note about locks:
779 *
780 * The driver keeps track of which user has what locks on which card. It
781 * supports stacking, like the kernel one. This complexifies the implementation
782 * a bit, but makes the arbiter more tolerant to userspace problems and able
783 * to properly cleanup in all cases when a process dies.
784 * Currently, a max of 16 cards simultaneously can have locks issued from
785 * userspace for a given user (file descriptor instance) of the arbiter.
786 *
787 * If the device is hot-unplugged, there is a hook inside the module to notify
788 * they being added/removed in the system and automatically added/removed in
789 * the arbiter.
790 */
791
Mike Travis36028f32010-02-02 17:45:01 -0800792#define MAX_USER_CARDS CONFIG_VGA_ARB_MAX_GPUS
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000793#define PCI_INVALID_CARD ((struct pci_dev *)-1UL)
794
795/*
796 * Each user has an array of these, tracking which cards have locks
797 */
798struct vga_arb_user_card {
799 struct pci_dev *pdev;
800 unsigned int mem_cnt;
801 unsigned int io_cnt;
802};
803
804struct vga_arb_private {
805 struct list_head list;
806 struct pci_dev *target;
807 struct vga_arb_user_card cards[MAX_USER_CARDS];
808 spinlock_t lock;
809};
810
811static LIST_HEAD(vga_user_list);
812static DEFINE_SPINLOCK(vga_user_lock);
813
814
815/*
816 * This function gets a string in the format: "PCI:domain:bus:dev.fn" and
817 * returns the respective values. If the string is not in this format,
818 * it returns 0.
819 */
820static int vga_pci_str_to_vars(char *buf, int count, unsigned int *domain,
821 unsigned int *bus, unsigned int *devfn)
822{
823 int n;
824 unsigned int slot, func;
825
826
827 n = sscanf(buf, "PCI:%x:%x:%x.%x", domain, bus, &slot, &func);
828 if (n != 4)
829 return 0;
830
831 *devfn = PCI_DEVFN(slot, func);
832
833 return 1;
834}
835
836static ssize_t vga_arb_read(struct file *file, char __user * buf,
837 size_t count, loff_t *ppos)
838{
839 struct vga_arb_private *priv = file->private_data;
840 struct vga_device *vgadev;
841 struct pci_dev *pdev;
842 unsigned long flags;
843 size_t len;
844 int rc;
845 char *lbuf;
846
847 lbuf = kmalloc(1024, GFP_KERNEL);
848 if (lbuf == NULL)
849 return -ENOMEM;
850
851 /* Shields against vga_arb_device_card_gone (pci_dev going
852 * away), and allows access to vga list
853 */
854 spin_lock_irqsave(&vga_lock, flags);
855
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300856 /* If we are targeting the default, use it */
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000857 pdev = priv->target;
858 if (pdev == NULL || pdev == PCI_INVALID_CARD) {
859 spin_unlock_irqrestore(&vga_lock, flags);
860 len = sprintf(lbuf, "invalid");
861 goto done;
862 }
863
864 /* Find card vgadev structure */
865 vgadev = vgadev_find(pdev);
866 if (vgadev == NULL) {
867 /* Wow, it's not in the list, that shouldn't happen,
868 * let's fix us up and return invalid card
869 */
870 if (pdev == priv->target)
871 vga_arb_device_card_gone(pdev);
872 spin_unlock_irqrestore(&vga_lock, flags);
873 len = sprintf(lbuf, "invalid");
874 goto done;
875 }
876
877 /* Fill the buffer with infos */
878 len = snprintf(lbuf, 1024,
879 "count:%d,PCI:%s,decodes=%s,owns=%s,locks=%s(%d:%d)\n",
880 vga_decode_count, pci_name(pdev),
881 vga_iostate_to_str(vgadev->decodes),
882 vga_iostate_to_str(vgadev->owns),
883 vga_iostate_to_str(vgadev->locks),
884 vgadev->io_lock_cnt, vgadev->mem_lock_cnt);
885
886 spin_unlock_irqrestore(&vga_lock, flags);
887done:
888
889 /* Copy that to user */
890 if (len > count)
891 len = count;
892 rc = copy_to_user(buf, lbuf, len);
893 kfree(lbuf);
894 if (rc)
895 return -EFAULT;
896 return len;
897}
898
899/*
900 * TODO: To avoid parsing inside kernel and to improve the speed we may
901 * consider use ioctl here
902 */
903static ssize_t vga_arb_write(struct file *file, const char __user * buf,
904 size_t count, loff_t *ppos)
905{
906 struct vga_arb_private *priv = file->private_data;
907 struct vga_arb_user_card *uc = NULL;
908 struct pci_dev *pdev;
909
910 unsigned int io_state;
911
912 char *kbuf, *curr_pos;
913 size_t remaining = count;
914
915 int ret_val;
916 int i;
917
918
919 kbuf = kmalloc(count + 1, GFP_KERNEL);
920 if (!kbuf)
921 return -ENOMEM;
922
923 if (copy_from_user(kbuf, buf, count)) {
924 kfree(kbuf);
925 return -EFAULT;
926 }
927 curr_pos = kbuf;
928 kbuf[count] = '\0'; /* Just to make sure... */
929
930 if (strncmp(curr_pos, "lock ", 5) == 0) {
931 curr_pos += 5;
932 remaining -= 5;
933
Tiago Vignatti2d6e9b92010-05-24 18:24:30 +0300934 pr_debug("client 0x%p called 'lock'\n", priv);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000935
936 if (!vga_str_to_iostate(curr_pos, remaining, &io_state)) {
937 ret_val = -EPROTO;
938 goto done;
939 }
940 if (io_state == VGA_RSRC_NONE) {
941 ret_val = -EPROTO;
942 goto done;
943 }
944
945 pdev = priv->target;
946 if (priv->target == NULL) {
947 ret_val = -ENODEV;
948 goto done;
949 }
950
951 vga_get_uninterruptible(pdev, io_state);
952
953 /* Update the client's locks lists... */
954 for (i = 0; i < MAX_USER_CARDS; i++) {
955 if (priv->cards[i].pdev == pdev) {
956 if (io_state & VGA_RSRC_LEGACY_IO)
957 priv->cards[i].io_cnt++;
958 if (io_state & VGA_RSRC_LEGACY_MEM)
959 priv->cards[i].mem_cnt++;
960 break;
961 }
962 }
963
964 ret_val = count;
965 goto done;
966 } else if (strncmp(curr_pos, "unlock ", 7) == 0) {
967 curr_pos += 7;
968 remaining -= 7;
969
Tiago Vignatti2d6e9b92010-05-24 18:24:30 +0300970 pr_debug("client 0x%p called 'unlock'\n", priv);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +1000971
972 if (strncmp(curr_pos, "all", 3) == 0)
973 io_state = VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
974 else {
975 if (!vga_str_to_iostate
976 (curr_pos, remaining, &io_state)) {
977 ret_val = -EPROTO;
978 goto done;
979 }
980 /* TODO: Add this?
981 if (io_state == VGA_RSRC_NONE) {
982 ret_val = -EPROTO;
983 goto done;
984 }
985 */
986 }
987
988 pdev = priv->target;
989 if (priv->target == NULL) {
990 ret_val = -ENODEV;
991 goto done;
992 }
993 for (i = 0; i < MAX_USER_CARDS; i++) {
994 if (priv->cards[i].pdev == pdev)
995 uc = &priv->cards[i];
996 }
997
Julia Lawallc9168742011-11-15 14:53:11 -0800998 if (!uc) {
999 ret_val = -EINVAL;
1000 goto done;
1001 }
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001002
Julia Lawallc9168742011-11-15 14:53:11 -08001003 if (io_state & VGA_RSRC_LEGACY_IO && uc->io_cnt == 0) {
1004 ret_val = -EINVAL;
1005 goto done;
1006 }
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001007
Julia Lawallc9168742011-11-15 14:53:11 -08001008 if (io_state & VGA_RSRC_LEGACY_MEM && uc->mem_cnt == 0) {
1009 ret_val = -EINVAL;
1010 goto done;
1011 }
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001012
1013 vga_put(pdev, io_state);
1014
1015 if (io_state & VGA_RSRC_LEGACY_IO)
1016 uc->io_cnt--;
1017 if (io_state & VGA_RSRC_LEGACY_MEM)
1018 uc->mem_cnt--;
1019
1020 ret_val = count;
1021 goto done;
1022 } else if (strncmp(curr_pos, "trylock ", 8) == 0) {
1023 curr_pos += 8;
1024 remaining -= 8;
1025
Tiago Vignatti2d6e9b92010-05-24 18:24:30 +03001026 pr_debug("client 0x%p called 'trylock'\n", priv);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001027
1028 if (!vga_str_to_iostate(curr_pos, remaining, &io_state)) {
1029 ret_val = -EPROTO;
1030 goto done;
1031 }
1032 /* TODO: Add this?
1033 if (io_state == VGA_RSRC_NONE) {
1034 ret_val = -EPROTO;
1035 goto done;
1036 }
1037 */
1038
1039 pdev = priv->target;
1040 if (priv->target == NULL) {
1041 ret_val = -ENODEV;
1042 goto done;
1043 }
1044
1045 if (vga_tryget(pdev, io_state)) {
1046 /* Update the client's locks lists... */
1047 for (i = 0; i < MAX_USER_CARDS; i++) {
1048 if (priv->cards[i].pdev == pdev) {
1049 if (io_state & VGA_RSRC_LEGACY_IO)
1050 priv->cards[i].io_cnt++;
1051 if (io_state & VGA_RSRC_LEGACY_MEM)
1052 priv->cards[i].mem_cnt++;
1053 break;
1054 }
1055 }
1056 ret_val = count;
1057 goto done;
1058 } else {
1059 ret_val = -EBUSY;
1060 goto done;
1061 }
1062
1063 } else if (strncmp(curr_pos, "target ", 7) == 0) {
1064 unsigned int domain, bus, devfn;
1065 struct vga_device *vgadev;
1066
1067 curr_pos += 7;
1068 remaining -= 7;
Tiago Vignatti2d6e9b92010-05-24 18:24:30 +03001069 pr_debug("client 0x%p called 'target'\n", priv);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001070 /* if target is default */
Kyle McMartin2cc91162010-02-16 16:18:37 -05001071 if (!strncmp(curr_pos, "default", 7))
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001072 pdev = pci_dev_get(vga_default_device());
1073 else {
1074 if (!vga_pci_str_to_vars(curr_pos, remaining,
1075 &domain, &bus, &devfn)) {
1076 ret_val = -EPROTO;
1077 goto done;
1078 }
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001079 pr_debug("%s ==> %x:%x:%x.%x\n", curr_pos,
Mike Travis773a38db2010-02-02 14:38:15 -08001080 domain, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001081
Jiang Liuf85567c2012-08-28 23:43:55 +08001082 pdev = pci_get_domain_bus_and_slot(domain, bus, devfn);
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001083 pr_debug("pdev %p\n", pdev);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001084 if (!pdev) {
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001085 pr_err("invalid PCI address %x:%x:%x\n",
Jiang Liuf85567c2012-08-28 23:43:55 +08001086 domain, bus, devfn);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001087 ret_val = -ENODEV;
1088 goto done;
1089 }
1090 }
1091
1092 vgadev = vgadev_find(pdev);
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001093 pr_debug("vgadev %p\n", vgadev);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001094 if (vgadev == NULL) {
Thierry Redingeb6944f2015-08-12 16:32:05 +02001095 if (pdev) {
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001096 pr_err("this pci device is not a vga device\n");
Thierry Redingeb6944f2015-08-12 16:32:05 +02001097 pci_dev_put(pdev);
1098 }
1099
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001100 ret_val = -ENODEV;
1101 goto done;
1102 }
1103
1104 priv->target = pdev;
1105 for (i = 0; i < MAX_USER_CARDS; i++) {
1106 if (priv->cards[i].pdev == pdev)
1107 break;
1108 if (priv->cards[i].pdev == NULL) {
1109 priv->cards[i].pdev = pdev;
1110 priv->cards[i].io_cnt = 0;
1111 priv->cards[i].mem_cnt = 0;
1112 break;
1113 }
1114 }
1115 if (i == MAX_USER_CARDS) {
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001116 pr_err("maximum user cards (%d) number reached!\n",
Mike Travis773a38db2010-02-02 14:38:15 -08001117 MAX_USER_CARDS);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001118 pci_dev_put(pdev);
1119 /* XXX: which value to return? */
1120 ret_val = -ENOMEM;
1121 goto done;
1122 }
1123
1124 ret_val = count;
1125 pci_dev_put(pdev);
1126 goto done;
1127
1128
1129 } else if (strncmp(curr_pos, "decodes ", 8) == 0) {
1130 curr_pos += 8;
1131 remaining -= 8;
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001132 pr_debug("client 0x%p called 'decodes'\n", priv);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001133
1134 if (!vga_str_to_iostate(curr_pos, remaining, &io_state)) {
1135 ret_val = -EPROTO;
1136 goto done;
1137 }
1138 pdev = priv->target;
1139 if (priv->target == NULL) {
1140 ret_val = -ENODEV;
1141 goto done;
1142 }
1143
1144 __vga_set_legacy_decoding(pdev, io_state, true);
1145 ret_val = count;
1146 goto done;
1147 }
1148 /* If we got here, the message written is not part of the protocol! */
1149 kfree(kbuf);
1150 return -EPROTO;
1151
1152done:
1153 kfree(kbuf);
1154 return ret_val;
1155}
1156
1157static unsigned int vga_arb_fpoll(struct file *file, poll_table * wait)
1158{
1159 struct vga_arb_private *priv = file->private_data;
1160
Tiago Vignatti2d6e9b92010-05-24 18:24:30 +03001161 pr_debug("%s\n", __func__);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001162
1163 if (priv == NULL)
1164 return -ENODEV;
1165 poll_wait(file, &vga_wait_queue, wait);
1166 return POLLIN;
1167}
1168
1169static int vga_arb_open(struct inode *inode, struct file *file)
1170{
1171 struct vga_arb_private *priv;
1172 unsigned long flags;
1173
Tiago Vignatti2d6e9b92010-05-24 18:24:30 +03001174 pr_debug("%s\n", __func__);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001175
Rakib Mullickf35119d2011-07-25 17:12:56 -07001176 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001177 if (priv == NULL)
1178 return -ENOMEM;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001179 spin_lock_init(&priv->lock);
1180 file->private_data = priv;
1181
1182 spin_lock_irqsave(&vga_user_lock, flags);
1183 list_add(&priv->list, &vga_user_list);
1184 spin_unlock_irqrestore(&vga_user_lock, flags);
1185
1186 /* Set the client' lists of locks */
1187 priv->target = vga_default_device(); /* Maybe this is still null! */
1188 priv->cards[0].pdev = priv->target;
1189 priv->cards[0].io_cnt = 0;
1190 priv->cards[0].mem_cnt = 0;
1191
1192
1193 return 0;
1194}
1195
1196static int vga_arb_release(struct inode *inode, struct file *file)
1197{
1198 struct vga_arb_private *priv = file->private_data;
1199 struct vga_arb_user_card *uc;
1200 unsigned long flags;
1201 int i;
1202
Tiago Vignatti2d6e9b92010-05-24 18:24:30 +03001203 pr_debug("%s\n", __func__);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001204
1205 if (priv == NULL)
1206 return -ENODEV;
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;
Tiago Vignatti2d6e9b92010-05-24 18:24:30 +03001214 pr_debug("uc->io_cnt == %d, uc->mem_cnt == %d\n",
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001215 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 * callback any registered clients to let them know we have a
1234 * change in VGA cards
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, new_state);
1254 vga_update_device_decodes(vgadev, new_decodes);
1255 }
1256 }
1257 spin_unlock_irqrestore(&vga_lock, flags);
1258}
1259
1260static int pci_notify(struct notifier_block *nb, unsigned long action,
1261 void *data)
1262{
1263 struct device *dev = data;
1264 struct pci_dev *pdev = to_pci_dev(dev);
1265 bool notify = false;
1266
Tiago Vignatti2d6e9b92010-05-24 18:24:30 +03001267 pr_debug("%s\n", __func__);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001268
1269 /* For now we're only intereted in devices added and removed. I didn't
1270 * test this thing here, so someone needs to double check for the
1271 * cases of hotplugable vga cards. */
1272 if (action == BUS_NOTIFY_ADD_DEVICE)
1273 notify = vga_arbiter_add_pci_device(pdev);
1274 else if (action == BUS_NOTIFY_DEL_DEVICE)
1275 notify = vga_arbiter_del_pci_device(pdev);
1276
1277 if (notify)
1278 vga_arbiter_notify_clients();
1279 return 0;
1280}
1281
1282static struct notifier_block pci_notifier = {
1283 .notifier_call = pci_notify,
1284};
1285
1286static const struct file_operations vga_arb_device_fops = {
1287 .read = vga_arb_read,
1288 .write = vga_arb_write,
1289 .poll = vga_arb_fpoll,
1290 .open = vga_arb_open,
1291 .release = vga_arb_release,
Arnd Bergmann6038f372010-08-15 18:52:59 +02001292 .llseek = noop_llseek,
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001293};
1294
1295static struct miscdevice vga_arb_device = {
1296 MISC_DYNAMIC_MINOR, "vga_arbiter", &vga_arb_device_fops
1297};
1298
1299static int __init vga_arb_device_init(void)
1300{
1301 int rc;
1302 struct pci_dev *pdev;
Dave Airlie3448a192010-06-01 15:32:24 +10001303 struct vga_device *vgadev;
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001304
1305 rc = misc_register(&vga_arb_device);
1306 if (rc < 0)
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001307 pr_err("error %d registering device\n", rc);
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001308
1309 bus_register_notifier(&pci_bus_type, &pci_notifier);
1310
1311 /* We add all pci devices satisfying vga class in the arbiter by
1312 * default */
1313 pdev = NULL;
1314 while ((pdev =
1315 pci_get_subsys(PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
1316 PCI_ANY_ID, pdev)) != NULL)
1317 vga_arbiter_add_pci_device(pdev);
1318
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001319 pr_info("loaded\n");
Dave Airlie3448a192010-06-01 15:32:24 +10001320
1321 list_for_each_entry(vgadev, &vga_list, list) {
Bruno Prémont86fd8872014-08-24 23:09:53 +02001322#if defined(CONFIG_X86) || defined(CONFIG_IA64)
1323 /* Override I/O based detection done by vga_arbiter_add_pci_device()
1324 * as it may take the wrong device (e.g. on Apple system under EFI).
1325 *
1326 * Select the device owning the boot framebuffer if there is one.
1327 */
1328 resource_size_t start, end;
1329 int i;
1330
1331 /* Does firmware framebuffer belong to us? */
1332 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
1333 if (!(pci_resource_flags(vgadev->pdev, i) & IORESOURCE_MEM))
1334 continue;
1335
1336 start = pci_resource_start(vgadev->pdev, i);
1337 end = pci_resource_end(vgadev->pdev, i);
1338
1339 if (!start || !end)
1340 continue;
1341
1342 if (screen_info.lfb_base < start ||
1343 (screen_info.lfb_base + screen_info.lfb_size) >= end)
1344 continue;
1345 if (!vga_default_device())
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001346 pr_info("setting as boot device: PCI:%s\n",
Bruno Prémont86fd8872014-08-24 23:09:53 +02001347 pci_name(vgadev->pdev));
1348 else if (vgadev->pdev != vga_default_device())
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001349 pr_info("overriding boot device: PCI:%s\n",
Bruno Prémont86fd8872014-08-24 23:09:53 +02001350 pci_name(vgadev->pdev));
1351 vga_set_default_device(vgadev->pdev);
1352 }
1353#endif
Dave Airlie3448a192010-06-01 15:32:24 +10001354 if (vgadev->bridge_has_one_vga)
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001355 pr_info("bridge control possible %s\n", pci_name(vgadev->pdev));
Dave Airlie3448a192010-06-01 15:32:24 +10001356 else
Thierry Reding8b7e2e82015-08-12 16:32:06 +02001357 pr_info("no bridge control possible %s\n", pci_name(vgadev->pdev));
Dave Airlie3448a192010-06-01 15:32:24 +10001358 }
Benjamin Herrenschmidtdeb2d2e2009-08-11 15:52:06 +10001359 return rc;
1360}
1361subsys_initcall(vga_arb_device_init);