diff options
author | Isaku Yamahata <yamahata@valinux.co.jp> | 2010-12-24 12:14:13 +0900 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2010-12-24 10:35:30 +0200 |
commit | f3006dd1e60af3765c501a082d621f947d6e5974 (patch) | |
tree | 3b42c8ec696f6d6763f7e139b0de502c9ac4f6f5 /hw | |
parent | a2ee6b4fcb3e2f2f5d60211ce0f734c61f8e0e30 (diff) | |
download | qemu-f3006dd1e60af3765c501a082d621f947d6e5974.tar.gz qemu-f3006dd1e60af3765c501a082d621f947d6e5974.tar.bz2 qemu-f3006dd1e60af3765c501a082d621f947d6e5974.zip |
pci: introduce a helper function to convert qdev id to PCIDevice
This patch introduce a helper function to get PCIDevice from qdev id.
This function will be used later.
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/pci.c | 35 | ||||
-rw-r--r-- | hw/pci.h | 1 |
2 files changed, 36 insertions, 0 deletions
@@ -2027,3 +2027,38 @@ static char *pcibus_get_dev_path(DeviceState *dev) return strdup(path); } +static int pci_qdev_find_recursive(PCIBus *bus, + const char *id, PCIDevice **pdev) +{ + DeviceState *qdev = qdev_find_recursive(&bus->qbus, id); + if (!qdev) { + return -ENODEV; + } + + /* roughly check if given qdev is pci device */ + if (qdev->info->init == &pci_qdev_init && + qdev->parent_bus->info == &pci_bus_info) { + *pdev = DO_UPCAST(PCIDevice, qdev, qdev); + return 0; + } + return -EINVAL; +} + +int pci_qdev_find_device(const char *id, PCIDevice **pdev) +{ + struct PCIHostBus *host; + int rc = -ENODEV; + + QLIST_FOREACH(host, &host_buses, next) { + int tmp = pci_qdev_find_recursive(host->bus, id, pdev); + if (!tmp) { + rc = 0; + break; + } + if (tmp != -ENODEV) { + rc = tmp; + } + } + + return rc; +} @@ -252,6 +252,7 @@ PCIBus *pci_find_root_bus(int domain); int pci_find_domain(const PCIBus *bus); PCIBus *pci_find_bus(PCIBus *bus, int bus_num); PCIDevice *pci_find_device(PCIBus *bus, int bus_num, int slot, int function); +int pci_qdev_find_device(const char *id, PCIDevice **pdev); PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr); int pci_parse_devaddr(const char *addr, int *domp, int *busp, |