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>
This commit is contained in:
parent
568f0690fd
commit
85c6e4fabb
|
@ -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,
|
||||||
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,
|
||||||
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,
|
||||||
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);
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue