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: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
1ef7a2a2af
commit
c473d18da1
@ -276,7 +276,7 @@ void pci_device_hot_add(Monitor *mon, const QDict *qdict)
|
|||||||
|
|
||||||
if (dev) {
|
if (dev) {
|
||||||
monitor_printf(mon, "OK domain %d, bus %d, slot %d, function %d\n",
|
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_bus_num(dev->bus), PCI_SLOT(dev->devfn),
|
||||||
PCI_FUNC(dev->devfn));
|
PCI_FUNC(dev->devfn));
|
||||||
} else
|
} else
|
||||||
|
20
hw/pci/pci.c
20
hw/pci/pci.c
@ -259,18 +259,24 @@ PCIBus *pci_find_primary_bus(void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pci_find_domain(const PCIBus *bus)
|
PCIBus *pci_device_root_bus(const PCIDevice *d)
|
||||||
{
|
{
|
||||||
PCIDevice *d;
|
PCIBus *bus = d->bus;
|
||||||
struct PCIHostBus *host;
|
|
||||||
|
|
||||||
/* obtain root bus */
|
|
||||||
while ((d = bus->parent_dev) != NULL) {
|
while ((d = bus->parent_dev) != NULL) {
|
||||||
bus = d->bus;
|
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) {
|
QLIST_FOREACH(host, &host_buses, next) {
|
||||||
if (host->bus == bus) {
|
if (host->bus == rootbus) {
|
||||||
return host->domain;
|
return host->domain;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1997,7 +2003,7 @@ int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
|
|||||||
fprintf(stderr, "ERROR: %04x:%02x:%02x.%x "
|
fprintf(stderr, "ERROR: %04x:%02x:%02x.%x "
|
||||||
"Attempt to add PCI capability %x at offset "
|
"Attempt to add PCI capability %x at offset "
|
||||||
"%x overlaps existing capability %x at offset %x\n",
|
"%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),
|
PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn),
|
||||||
cap_id, offset, overlapping_cap, i);
|
cap_id, offset, overlapping_cap, i);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -2152,7 +2158,7 @@ static char *pcibus_get_dev_path(DeviceState *dev)
|
|||||||
path[path_len] = '\0';
|
path[path_len] = '\0';
|
||||||
|
|
||||||
/* First field is the domain. */
|
/* 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);
|
assert(s == domain_len);
|
||||||
memcpy(path, domain, domain_len);
|
memcpy(path, domain, domain_len);
|
||||||
|
|
||||||
|
@ -1022,8 +1022,7 @@ int do_pcie_aer_inject_error(Monitor *mon,
|
|||||||
*ret_data = qobject_from_jsonf("{'id': %s, "
|
*ret_data = qobject_from_jsonf("{'id': %s, "
|
||||||
"'domain': %d, 'bus': %d, 'devfn': %d, "
|
"'domain': %d, 'bus': %d, 'devfn': %d, "
|
||||||
"'ret': %d}",
|
"'ret': %d}",
|
||||||
id,
|
id, pci_find_domain(dev),
|
||||||
pci_find_domain(dev->bus),
|
|
||||||
pci_bus_num(dev->bus), dev->devfn,
|
pci_bus_num(dev->bus), dev->devfn,
|
||||||
ret);
|
ret);
|
||||||
assert(*ret_data);
|
assert(*ret_data);
|
||||||
|
@ -390,7 +390,8 @@ void pci_for_each_device(PCIBus *bus, int bus_num,
|
|||||||
void (*fn)(PCIBus *bus, PCIDevice *d, void *opaque),
|
void (*fn)(PCIBus *bus, PCIDevice *d, void *opaque),
|
||||||
void *opaque);
|
void *opaque);
|
||||||
PCIBus *pci_find_primary_bus(void);
|
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);
|
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, const char *devaddr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user