aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYu Zhao <yu.zhao@intel.com>2009-03-19 23:25:13 -0400
committerJesse Barnes <jbarnes@virtuousgeek.org>2009-03-20 13:48:24 -0400
commita28724b0fb909d247229a70761c90bb37b13366a (patch)
tree7c5332004a8f52e676076b39aa03aeb45cb03f2a
parent8c5cdb6adc6688b9b8fd82ea4a5cf4674dabad79 (diff)
PCI: reserve bus range for SR-IOV device
Reserve the bus number range used by the Virtual Function when pcibios_assign_all_busses() returns true. Reviewed-by: Matthew Wilcox <willy@linux.intel.com> Signed-off-by: Yu Zhao <yu.zhao@intel.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
-rw-r--r--drivers/pci/iov.c36
-rw-r--r--drivers/pci/pci.h5
-rw-r--r--drivers/pci/probe.c3
3 files changed, 44 insertions, 0 deletions
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index b121e47402fa..5ddfc09a8d3f 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -14,6 +14,18 @@
14#include "pci.h" 14#include "pci.h"
15 15
16 16
17static inline u8 virtfn_bus(struct pci_dev *dev, int id)
18{
19 return dev->bus->number + ((dev->devfn + dev->sriov->offset +
20 dev->sriov->stride * id) >> 8);
21}
22
23static inline u8 virtfn_devfn(struct pci_dev *dev, int id)
24{
25 return (dev->devfn + dev->sriov->offset +
26 dev->sriov->stride * id) & 0xff;
27}
28
17static int sriov_init(struct pci_dev *dev, int pos) 29static int sriov_init(struct pci_dev *dev, int pos)
18{ 30{
19 int i; 31 int i;
@@ -209,3 +221,27 @@ void pci_restore_iov_state(struct pci_dev *dev)
209 if (dev->is_physfn) 221 if (dev->is_physfn)
210 sriov_restore_state(dev); 222 sriov_restore_state(dev);
211} 223}
224
225/**
226 * pci_iov_bus_range - find bus range used by Virtual Function
227 * @bus: the PCI bus
228 *
229 * Returns max number of buses (exclude current one) used by Virtual
230 * Functions.
231 */
232int pci_iov_bus_range(struct pci_bus *bus)
233{
234 int max = 0;
235 u8 busnr;
236 struct pci_dev *dev;
237
238 list_for_each_entry(dev, &bus->devices, bus_list) {
239 if (!dev->is_physfn)
240 continue;
241 busnr = virtfn_bus(dev, dev->sriov->total - 1);
242 if (busnr > max)
243 max = busnr;
244 }
245
246 return max ? max - bus->number : 0;
247}
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index fd5ea4d445e8..5c29cb2b8e63 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -223,6 +223,7 @@ extern void pci_iov_release(struct pci_dev *dev);
223extern int pci_iov_resource_bar(struct pci_dev *dev, int resno, 223extern int pci_iov_resource_bar(struct pci_dev *dev, int resno,
224 enum pci_bar_type *type); 224 enum pci_bar_type *type);
225extern void pci_restore_iov_state(struct pci_dev *dev); 225extern void pci_restore_iov_state(struct pci_dev *dev);
226extern int pci_iov_bus_range(struct pci_bus *bus);
226#else 227#else
227static inline int pci_iov_init(struct pci_dev *dev) 228static inline int pci_iov_init(struct pci_dev *dev)
228{ 229{
@@ -240,6 +241,10 @@ static inline int pci_iov_resource_bar(struct pci_dev *dev, int resno,
240static inline void pci_restore_iov_state(struct pci_dev *dev) 241static inline void pci_restore_iov_state(struct pci_dev *dev)
241{ 242{
242} 243}
244static inline int pci_iov_bus_range(struct pci_bus *bus)
245{
246 return 0;
247}
243#endif /* CONFIG_PCI_IOV */ 248#endif /* CONFIG_PCI_IOV */
244 249
245#endif /* DRIVERS_PCI_H */ 250#endif /* DRIVERS_PCI_H */
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 0471f6ea1466..0ecdaea3915f 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1085,6 +1085,9 @@ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
1085 for (devfn = 0; devfn < 0x100; devfn += 8) 1085 for (devfn = 0; devfn < 0x100; devfn += 8)
1086 pci_scan_slot(bus, devfn); 1086 pci_scan_slot(bus, devfn);
1087 1087
1088 /* Reserve buses for SR-IOV capability. */
1089 max += pci_iov_bus_range(bus);
1090
1088 /* 1091 /*
1089 * After performing arch-dependent fixup of the bus, look behind 1092 * After performing arch-dependent fixup of the bus, look behind
1090 * all PCI-to-PCI bridges on this bus. 1093 * all PCI-to-PCI bridges on this bus.