Commit c473d18d authored by David Gibson's avatar David Gibson Committed by Michael S. Tsirkin
Browse files

pci: Use helper to find device's root bus in pci_find_domain()



Currently pci_find_domain() performs two functions - it locates the PCI
root bus above the given bus, then looks up that root bus's domain number.
This patch adds a helper function to perform the first task, finding the
root bus for a given PCI device.  This is then used in pci_find_domain().
This changes pci_find_domain()'s signature slightly, taking a PCIDevice
instead of a PCIBus - since all callers passed something of the form
dev->bus, this simplifies things slightly.

Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 1ef7a2a2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -276,7 +276,7 @@ void pci_device_hot_add(Monitor *mon, const QDict *qdict)

    if (dev) {
        monitor_printf(mon, "OK domain %d, bus %d, slot %d, function %d\n",
                       pci_find_domain(dev->bus),
                       pci_find_domain(dev),
                       pci_bus_num(dev->bus), PCI_SLOT(dev->devfn),
                       PCI_FUNC(dev->devfn));
    } else
+13 −7
Original line number Diff line number Diff line
@@ -259,18 +259,24 @@ PCIBus *pci_find_primary_bus(void)
    return NULL;
}

int pci_find_domain(const PCIBus *bus)
PCIBus *pci_device_root_bus(const PCIDevice *d)
{
    PCIDevice *d;
    struct PCIHostBus *host;
    PCIBus *bus = d->bus;

    /* obtain root bus */
    while ((d = bus->parent_dev) != NULL) {
        bus = d->bus;
    }

    return bus;
}

int pci_find_domain(const PCIDevice *dev)
{
    const PCIBus *rootbus = pci_device_root_bus(dev);
    struct PCIHostBus *host;

    QLIST_FOREACH(host, &host_buses, next) {
        if (host->bus == bus) {
        if (host->bus == rootbus) {
            return host->domain;
        }
    }
@@ -1997,7 +2003,7 @@ int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
                fprintf(stderr, "ERROR: %04x:%02x:%02x.%x "
                        "Attempt to add PCI capability %x at offset "
                        "%x overlaps existing capability %x at offset %x\n",
                        pci_find_domain(pdev->bus), pci_bus_num(pdev->bus),
                        pci_find_domain(pdev), pci_bus_num(pdev->bus),
                        PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn),
                        cap_id, offset, overlapping_cap, i);
                return -EINVAL;
@@ -2152,7 +2158,7 @@ static char *pcibus_get_dev_path(DeviceState *dev)
    path[path_len] = '\0';

    /* First field is the domain. */
    s = snprintf(domain, sizeof domain, "%04x:00", pci_find_domain(d->bus));
    s = snprintf(domain, sizeof domain, "%04x:00", pci_find_domain(d));
    assert(s == domain_len);
    memcpy(path, domain, domain_len);

+1 −2
Original line number Diff line number Diff line
@@ -1022,8 +1022,7 @@ int do_pcie_aer_inject_error(Monitor *mon,
    *ret_data = qobject_from_jsonf("{'id': %s, "
                                   "'domain': %d, 'bus': %d, 'devfn': %d, "
                                   "'ret': %d}",
                                   id,
                                   pci_find_domain(dev->bus),
                                   id, pci_find_domain(dev),
                                   pci_bus_num(dev->bus), dev->devfn,
                                   ret);
    assert(*ret_data);
+2 −1
Original line number Diff line number Diff line
@@ -390,7 +390,8 @@ void pci_for_each_device(PCIBus *bus, int bus_num,
                         void (*fn)(PCIBus *bus, PCIDevice *d, void *opaque),
                         void *opaque);
PCIBus *pci_find_primary_bus(void);
int pci_find_domain(const PCIBus *bus);
PCIBus *pci_device_root_bus(const PCIDevice *d);
int pci_find_domain(const 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);