提交 85c6e4fa 编写于 作者: D David Gibson 提交者: Michael S. Tsirkin

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: NDavid Gibson <david@gibson.dropbear.id.au>
Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
上级 568f0690
...@@ -65,7 +65,7 @@ static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon, ...@@ -65,7 +65,7 @@ static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon,
PCIBus *bus; PCIBus *bus;
int ret, devfn; int ret, devfn;
bus = pci_get_bus_devfn(&devfn, devaddr); bus = pci_get_bus_devfn(&devfn, pci_find_primary_bus(), devaddr);
if (!bus) { if (!bus) {
monitor_printf(mon, "Invalid PCI device address %s\n", devaddr); monitor_printf(mon, "Invalid PCI device address %s\n", devaddr);
return NULL; return NULL;
...@@ -205,7 +205,7 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, ...@@ -205,7 +205,7 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
dinfo = NULL; dinfo = NULL;
} }
bus = pci_get_bus_devfn(&devfn, devaddr); bus = pci_get_bus_devfn(&devfn, pci_find_primary_bus(), devaddr);
if (!bus) { if (!bus) {
monitor_printf(mon, "Invalid PCI device address %s\n", devaddr); monitor_printf(mon, "Invalid PCI device address %s\n", devaddr);
return NULL; return NULL;
......
...@@ -589,12 +589,13 @@ int pci_parse_devaddr(const char *addr, int *domp, int *busp, ...@@ -589,12 +589,13 @@ int pci_parse_devaddr(const char *addr, int *domp, int *busp,
return 0; 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; int dom, bus;
unsigned slot; unsigned slot;
assert(!root->parent_dev);
if (!root) { if (!root) {
fprintf(stderr, "No primary PCI bus\n"); fprintf(stderr, "No primary PCI bus\n");
return NULL; return NULL;
...@@ -1588,7 +1589,7 @@ PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model, ...@@ -1588,7 +1589,7 @@ PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
if (i < 0) if (i < 0)
return NULL; return NULL;
bus = pci_get_bus_devfn(&devfn, devaddr); bus = pci_get_bus_devfn(&devfn, pci_find_primary_bus(), devaddr);
if (!bus) { if (!bus) {
error_report("Invalid PCI device address %s for device %s", error_report("Invalid PCI device address %s for device %s",
devaddr, pci_nic_names[i]); devaddr, pci_nic_names[i]);
......
...@@ -394,7 +394,7 @@ PCIBus *pci_device_root_bus(const PCIDevice *d); ...@@ -394,7 +394,7 @@ PCIBus *pci_device_root_bus(const PCIDevice *d);
const char *pci_root_bus_path(PCIDevice *dev); const char *pci_root_bus_path(PCIDevice *dev);
PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn); PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn);
int pci_qdev_find_device(const char *id, PCIDevice **pdev); 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, int pci_parse_devaddr(const char *addr, int *domp, int *busp,
unsigned int *slotp, unsigned int *funcp); unsigned int *slotp, unsigned int *funcp);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册