On Fri, May 28, 2010 at 06:30:46PM +0900, Isaku Yamahata wrote: > add helper function which converts root bus to pci domain. > make them aware of pci domain. > > Signed-off-by: Isaku Yamahata <yamah...@valinux.co.jp>
Doesn't seem to apply to master. > --- > Changes: V1 -> V2 > - removed pci_find_bus() > - renamed pci_find_bus_by_bus() to pci_find_bus() > - add abort() > --- > hw/pci-hotplug.c | 7 ++++--- > hw/pci.c | 22 +++++++++++++++++++++- > hw/pci.h | 1 + > 3 files changed, 26 insertions(+), 4 deletions(-) > > diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c > index 37ac015..a8f3df1 100644 > --- a/hw/pci-hotplug.c > +++ b/hw/pci-hotplug.c > @@ -124,7 +124,7 @@ void drive_hot_add(Monitor *mon, const QDict *qdict) > if (pci_read_devaddr(mon, pci_addr, &dom, &pci_bus, &slot)) { > goto err; > } > - dev = pci_find_device(pci_find_root_bus(0), pci_bus, slot, 0); > + dev = pci_find_device(pci_find_root_bus(dom), pci_bus, slot, 0); > if (!dev) { > monitor_printf(mon, "no pci device with address %s\n", pci_addr); > goto err; > @@ -252,7 +252,8 @@ 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", > - 0, pci_bus_num(dev->bus), PCI_SLOT(dev->devfn), > + pci_find_domain(dev->bus), > + pci_bus_num(dev->bus), PCI_SLOT(dev->devfn), > PCI_FUNC(dev->devfn)); > } else > monitor_printf(mon, "failed to add %s\n", opts); > @@ -269,7 +270,7 @@ int pci_device_hot_remove(Monitor *mon, const char > *pci_addr) > return -1; > } > > - d = pci_find_device(pci_find_root_bus(0), bus, slot, 0); > + d = pci_find_device(pci_find_root_bus(dom), bus, slot, 0); > if (!d) { > monitor_printf(mon, "slot %d empty\n", slot); > return -1; > diff --git a/hw/pci.c b/hw/pci.c > index 39a6206..f046029 100644 > --- a/hw/pci.c > +++ b/hw/pci.c > @@ -200,6 +200,26 @@ PCIBus *pci_find_root_bus(int domain) > return NULL; > } > > +int pci_find_domain(const PCIBus *bus) > +{ > + PCIDevice *d; > + struct PCIHostBus *host; > + > + /* obtain root bus */ > + while ((d = bus->parent_dev) != NULL) { > + bus = d->bus; > + } > + > + QLIST_FOREACH(host, &host_buses, next) { > + if (host->bus == bus) { > + return host->domain; > + } > + } > + > + abort(); /* should not be reached */ > + return -1; > +} > + > void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent, > const char *name, int devfn_min) > { > @@ -505,7 +525,7 @@ PCIBus *pci_get_bus_devfn(int *devfnp, const char > *devaddr) > } > > *devfnp = slot << 3; > - return pci_find_bus(pci_find_root_bus(0), bus); > + return pci_find_bus(pci_find_root_bus(dom), bus); > } > > static void pci_init_cmask(PCIDevice *dev) > diff --git a/hw/pci.h b/hw/pci.h > index b803593..3a15bd4 100644 > --- a/hw/pci.h > +++ b/hw/pci.h > @@ -218,6 +218,7 @@ PCIDevice *pci_nic_init_nofail(NICInfo *nd, const char > *default_model, > int pci_bus_num(PCIBus *s); > void pci_for_each_device(PCIBus *bus, int bus_num, void (*fn)(PCIBus *bus, > PCIDevice *d)); > 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); > PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr); > -- > 1.6.6.1 > > > > -- > yamahata