pci: Implement BusInfo.get_dev_path()
This works great for PCI since a <segment>:<bus>:<dev>.<fn> uniquely describes a global address. No need to traverse up the qdev tree. PCI segment support is a placeholder for compatibility once we support multiple segments. Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
6772b9364a
commit
4f43c1ff3b
14
hw/pci.c
14
hw/pci.c
@ -58,11 +58,13 @@ struct PCIBus {
|
||||
};
|
||||
|
||||
static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
|
||||
static char *pcibus_get_dev_path(DeviceState *dev);
|
||||
|
||||
static struct BusInfo pci_bus_info = {
|
||||
.name = "PCI",
|
||||
.size = sizeof(PCIBus),
|
||||
.print_dev = pcibus_dev_print,
|
||||
.get_dev_path = pcibus_get_dev_path,
|
||||
.props = (Property[]) {
|
||||
DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
|
||||
DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
|
||||
@ -1853,6 +1855,18 @@ static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
|
||||
}
|
||||
}
|
||||
|
||||
static char *pcibus_get_dev_path(DeviceState *dev)
|
||||
{
|
||||
PCIDevice *d = (PCIDevice *)dev;
|
||||
char path[16];
|
||||
|
||||
snprintf(path, sizeof(path), "%04x:%02x:%02x.%x",
|
||||
pci_find_domain(d->bus), d->config[PCI_SECONDARY_BUS],
|
||||
PCI_SLOT(d->devfn), PCI_FUNC(d->devfn));
|
||||
|
||||
return strdup(path);
|
||||
}
|
||||
|
||||
static PCIDeviceInfo bridge_info = {
|
||||
.qdev.name = "pci-bridge",
|
||||
.qdev.size = sizeof(PCIBridge),
|
||||
|
Loading…
Reference in New Issue
Block a user