Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 773a38db authored by Mike Travis's avatar Mike Travis Committed by H. Peter Anvin
Browse files

vgaarb: Fix VGA arbiter to accept PCI domains other than 0



Update the VGA Arbiter to accept PCI Domains other than 0.

Signed-off-by: default avatarMike Travis <travis@sgi.com>
LKML-Reference: <201002022238.o12McFe8018730@imap1.linux-foundation.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Robin Holt <holt@sgi.com>
Cc: Jack Steiner <steiner@sgi.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
Cc: David Airlie <airlied@linux.ie>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent 841582ea
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -954,6 +954,7 @@ static ssize_t vga_arb_write(struct file *file, const char __user * buf,
		}

	} else if (strncmp(curr_pos, "target ", 7) == 0) {
		struct pci_bus *pbus;
		unsigned int domain, bus, devfn;
		struct vga_device *vgadev;

@@ -969,18 +970,31 @@ static ssize_t vga_arb_write(struct file *file, const char __user * buf,
				ret_val = -EPROTO;
				goto done;
			}
			pr_devel("vgaarb: %s ==> %x:%x:%x.%x\n", curr_pos,
				domain, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));

			pdev = pci_get_bus_and_slot(bus, devfn);
			pbus = pci_find_bus(domain, bus);
			pr_devel("vgaarb: pbus %p\n", pbus);
			if (pbus == NULL) {
				pr_err("vgaarb: invalid PCI domain and/or bus address %x:%x\n",
					domain, bus);
				ret_val = -ENODEV;
				goto done;
			}
			pdev = pci_get_slot(pbus, devfn);
			pr_devel("vgaarb: pdev %p\n", pdev);
			if (!pdev) {
				pr_info("vgaarb: invalid PCI address!\n");
				pr_err("vgaarb: invalid PCI address %x:%x\n",
					bus, devfn);
				ret_val = -ENODEV;
				goto done;
			}
		}

		vgadev = vgadev_find(pdev);
		pr_devel("vgaarb: vgadev %p\n", vgadev);
		if (vgadev == NULL) {
			pr_info("vgaarb: this pci device is not a vga device\n");
			pr_err("vgaarb: this pci device is not a vga device\n");
			pci_dev_put(pdev);
			ret_val = -ENODEV;
			goto done;
@@ -998,7 +1012,8 @@ static ssize_t vga_arb_write(struct file *file, const char __user * buf,
			}
		}
		if (i == MAX_USER_CARDS) {
			pr_err("vgaarb: maximum user cards number reached!\n");
			pr_err("vgaarb: maximum user cards (%d) number reached!\n",
				MAX_USER_CARDS);
			pci_dev_put(pdev);
			/* XXX: which value to return? */
			ret_val =  -ENOMEM;