aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/vga/vgaarb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/vga/vgaarb.c')
-rw-r--r--drivers/gpu/vga/vgaarb.c29
1 files changed, 11 insertions, 18 deletions
diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 3df8fc0ec01a..e893f6e1937d 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -141,7 +141,11 @@ EXPORT_SYMBOL_GPL(vga_default_device);
141 141
142void vga_set_default_device(struct pci_dev *pdev) 142void vga_set_default_device(struct pci_dev *pdev)
143{ 143{
144 vga_default = pdev; 144 if (vga_default == pdev)
145 return;
146
147 pci_dev_put(vga_default);
148 vga_default = pci_dev_get(pdev);
145} 149}
146#endif 150#endif
147 151
@@ -577,7 +581,7 @@ static bool vga_arbiter_add_pci_device(struct pci_dev *pdev)
577#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE 581#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
578 if (vga_default == NULL && 582 if (vga_default == NULL &&
579 ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) 583 ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK))
580 vga_default = pci_dev_get(pdev); 584 vga_set_default_device(pdev);
581#endif 585#endif
582 586
583 vga_arbiter_check_bridge_sharing(vgadev); 587 vga_arbiter_check_bridge_sharing(vgadev);
@@ -613,10 +617,8 @@ static bool vga_arbiter_del_pci_device(struct pci_dev *pdev)
613 } 617 }
614 618
615#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE 619#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
616 if (vga_default == pdev) { 620 if (vga_default == pdev)
617 pci_dev_put(vga_default); 621 vga_set_default_device(NULL);
618 vga_default = NULL;
619 }
620#endif 622#endif
621 623
622 if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM)) 624 if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM))
@@ -1066,7 +1068,6 @@ static ssize_t vga_arb_write(struct file *file, const char __user * buf,
1066 } 1068 }
1067 1069
1068 } else if (strncmp(curr_pos, "target ", 7) == 0) { 1070 } else if (strncmp(curr_pos, "target ", 7) == 0) {
1069 struct pci_bus *pbus;
1070 unsigned int domain, bus, devfn; 1071 unsigned int domain, bus, devfn;
1071 struct vga_device *vgadev; 1072 struct vga_device *vgadev;
1072 1073
@@ -1085,19 +1086,11 @@ static ssize_t vga_arb_write(struct file *file, const char __user * buf,
1085 pr_debug("vgaarb: %s ==> %x:%x:%x.%x\n", curr_pos, 1086 pr_debug("vgaarb: %s ==> %x:%x:%x.%x\n", curr_pos,
1086 domain, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); 1087 domain, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
1087 1088
1088 pbus = pci_find_bus(domain, bus); 1089 pdev = pci_get_domain_bus_and_slot(domain, bus, devfn);
1089 pr_debug("vgaarb: pbus %p\n", pbus);
1090 if (pbus == NULL) {
1091 pr_err("vgaarb: invalid PCI domain and/or bus address %x:%x\n",
1092 domain, bus);
1093 ret_val = -ENODEV;
1094 goto done;
1095 }
1096 pdev = pci_get_slot(pbus, devfn);
1097 pr_debug("vgaarb: pdev %p\n", pdev); 1090 pr_debug("vgaarb: pdev %p\n", pdev);
1098 if (!pdev) { 1091 if (!pdev) {
1099 pr_err("vgaarb: invalid PCI address %x:%x\n", 1092 pr_err("vgaarb: invalid PCI address %x:%x:%x\n",
1100 bus, devfn); 1093 domain, bus, devfn);
1101 ret_val = -ENODEV; 1094 ret_val = -ENODEV;
1102 goto done; 1095 goto done;
1103 } 1096 }