diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2013-06-06 18:48:50 +1000 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2013-07-07 23:10:57 +0300 |
commit | 85c6e4fabb4c26e5cd8a024415ed2f5bcdd578db (patch) | |
tree | 4c18f5ffb7b9e88eebb5e8f3fe611e587887d26c | |
parent | 568f0690fd9aa4d39d84b04c1a5dbb53a915c3fe (diff) | |
download | qemu-85c6e4fabb4c26e5cd8a024415ed2f5bcdd578db.zip |
pci: Add root bus argument to pci_get_bus_devfn()
pci_get_bus_devfn() interprets a full PCI address string to give a PCIBus *
and device/function number within that bus. Currently it assumes it is
working on an address under the primary PCI root bus. This patch extends
it to allow the caller to specify a root bus. This might seem a little odd
since the supplied address can (theoretically) include a PCI domain number.
However, attempting to use a non-zero domain number there is currently an
error, so that shouldn't really cause problems.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r-- | hw/pci/pci-hotplug-old.c | 4 | ||||
-rw-r--r-- | hw/pci/pci.c | 7 | ||||
-rw-r--r-- | include/hw/pci/pci.h | 2 |
3 files changed, 7 insertions, 6 deletions
diff --git a/hw/pci/pci-hotplug-old.c b/hw/pci/pci-hotplug-old.c index e2518108f4..e92d6467be 100644 --- a/hw/pci/pci-hotplug-old.c +++ b/hw/pci/pci-hotplug-old.c @@ -65,7 +65,7 @@ static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon, PCIBus *bus; int ret, devfn; - bus = pci_get_bus_devfn(&devfn, devaddr); + bus = pci_get_bus_devfn(&devfn, pci_find_primary_bus(), devaddr); if (!bus) { monitor_printf(mon, "Invalid PCI device address %s\n", devaddr); return NULL; @@ -205,7 +205,7 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, dinfo = NULL; } - bus = pci_get_bus_devfn(&devfn, devaddr); + bus = pci_get_bus_devfn(&devfn, pci_find_primary_bus(), devaddr); if (!bus) { monitor_printf(mon, "Invalid PCI device address %s\n", devaddr); return NULL; diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 350b872294..c4f63ad9f3 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -589,12 +589,13 @@ int pci_parse_devaddr(const char *addr, int *domp, int *busp, return 0; } -PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr) +PCIBus *pci_get_bus_devfn(int *devfnp, PCIBus *root, const char *devaddr) { - PCIBus *root = pci_find_primary_bus(); int dom, bus; unsigned slot; + assert(!root->parent_dev); + if (!root) { fprintf(stderr, "No primary PCI bus\n"); return NULL; @@ -1588,7 +1589,7 @@ PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model, if (i < 0) return NULL; - bus = pci_get_bus_devfn(&devfn, devaddr); + bus = pci_get_bus_devfn(&devfn, pci_find_primary_bus(), devaddr); if (!bus) { error_report("Invalid PCI device address %s for device %s", devaddr, pci_nic_names[i]); diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index e0597b7e9e..3a43fbaad2 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -394,7 +394,7 @@ PCIBus *pci_device_root_bus(const PCIDevice *d); const char *pci_root_bus_path(PCIDevice *dev); PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn); int pci_qdev_find_device(const char *id, PCIDevice **pdev); -PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr); +PCIBus *pci_get_bus_devfn(int *devfnp, PCIBus *root, const char *devaddr); int pci_parse_devaddr(const char *addr, int *domp, int *busp, unsigned int *slotp, unsigned int *funcp); |