mirror of https://gitee.com/openkylin/qemu.git
pci: add pci_for_each_bus_depth_first
Useful for ACPI hotplug. Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
4d25299cb2
commit
eb0acfdde6
28
hw/pci/pci.c
28
hw/pci/pci.c
|
@ -1704,6 +1704,34 @@ static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pci_for_each_bus_depth_first(PCIBus *bus,
|
||||||
|
void *(*begin)(PCIBus *bus, void *parent_state),
|
||||||
|
void (*end)(PCIBus *bus, void *state),
|
||||||
|
void *parent_state)
|
||||||
|
{
|
||||||
|
PCIBus *sec;
|
||||||
|
void *state;
|
||||||
|
|
||||||
|
if (!bus) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (begin) {
|
||||||
|
state = begin(bus, parent_state);
|
||||||
|
} else {
|
||||||
|
state = parent_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
QLIST_FOREACH(sec, &bus->child, sibling) {
|
||||||
|
pci_for_each_bus_depth_first(sec, begin, end, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end) {
|
||||||
|
end(bus, state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn)
|
PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn)
|
||||||
{
|
{
|
||||||
bus = pci_find_bus_nr(bus, bus_num);
|
bus = pci_find_bus_nr(bus, bus_num);
|
||||||
|
|
|
@ -387,6 +387,20 @@ int pci_bus_num(PCIBus *s);
|
||||||
void pci_for_each_device(PCIBus *bus, int bus_num,
|
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);
|
||||||
|
void pci_for_each_bus_depth_first(PCIBus *bus,
|
||||||
|
void *(*begin)(PCIBus *bus, void *parent_state),
|
||||||
|
void (*end)(PCIBus *bus, void *state),
|
||||||
|
void *parent_state);
|
||||||
|
|
||||||
|
/* Use this wrapper when specific scan order is not required. */
|
||||||
|
static inline
|
||||||
|
void pci_for_each_bus(PCIBus *bus,
|
||||||
|
void (*fn)(PCIBus *bus, void *opaque),
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
pci_for_each_bus_depth_first(bus, NULL, fn, opaque);
|
||||||
|
}
|
||||||
|
|
||||||
PCIBus *pci_find_primary_bus(void);
|
PCIBus *pci_find_primary_bus(void);
|
||||||
PCIBus *pci_device_root_bus(const PCIDevice *d);
|
PCIBus *pci_device_root_bus(const PCIDevice *d);
|
||||||
const char *pci_root_bus_path(PCIDevice *dev);
|
const char *pci_root_bus_path(PCIDevice *dev);
|
||||||
|
|
Loading…
Reference in New Issue