From patchwork Fri May 28 09:30:46 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Isaku Yamahata X-Patchwork-Id: 53874 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 4E776B7D17 for ; Fri, 28 May 2010 19:35:31 +1000 (EST) Received: from localhost ([127.0.0.1]:35140 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OHvyS-00007S-II for incoming@patchwork.ozlabs.org; Fri, 28 May 2010 05:35:28 -0400 Received: from [140.186.70.92] (port=47887 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OHvxM-00006P-7t for qemu-devel@nongnu.org; Fri, 28 May 2010 05:34:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OHvxG-0001sM-Sp for qemu-devel@nongnu.org; Fri, 28 May 2010 05:34:20 -0400 Received: from mail.valinux.co.jp ([210.128.90.3]:40570) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OHvxG-0001r1-Cw for qemu-devel@nongnu.org; Fri, 28 May 2010 05:34:14 -0400 Received: from ps.local.valinux.co.jp (vagw.valinux.co.jp [210.128.90.14]) by mail.valinux.co.jp (Postfix) with SMTP id EECE91867B; Fri, 28 May 2010 18:34:08 +0900 (JST) Received: (nullmailer pid 28325 invoked by uid 1000); Fri, 28 May 2010 09:30:46 -0000 Date: Fri, 28 May 2010 18:30:46 +0900 From: Isaku Yamahata To: qemu-devel@nongnu.org Message-ID: <20100528093046.GB13840@valinux.co.jp> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) X-Virus-Scanned: clamav-milter 0.95.2 at va-mail.local.valinux.co.jp X-Virus-Status: Clean X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) Cc: mst@redhat.com Subject: [Qemu-devel] [PATCH v2] pci-hotplug: make them aware of pci domain. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org add helper function which converts root bus to pci domain. make them aware of pci domain. Signed-off-by: Isaku Yamahata --- 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);