From patchwork Mon Jun 4 08:52:17 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 162680 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 964C6B6F6E for ; Mon, 4 Jun 2012 18:53:06 +1000 (EST) Received: from localhost ([::1]:34288 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SbT28-0007C2-Dd for incoming@patchwork.ozlabs.org; Mon, 04 Jun 2012 04:53:04 -0400 Received: from eggs.gnu.org ([208.118.235.92]:45198) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SbT1i-0006st-3x for qemu-devel@nongnu.org; Mon, 04 Jun 2012 04:52:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SbT1Y-000430-HX for qemu-devel@nongnu.org; Mon, 04 Jun 2012 04:52:37 -0400 Received: from goliath.siemens.de ([192.35.17.28]:24258) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SbT1Y-00041p-76 for qemu-devel@nongnu.org; Mon, 04 Jun 2012 04:52:28 -0400 Received: from mail1.siemens.de (localhost [127.0.0.1]) by goliath.siemens.de (8.13.6/8.13.6) with ESMTP id q548qQQi029333; Mon, 4 Jun 2012 10:52:26 +0200 Received: from mchn199C.mchp.siemens.de (atpczjyc.ww300.siemens.net [139.22.45.247]) by mail1.siemens.de (8.13.6/8.13.6) with SMTP id q548qMpx019518; Mon, 4 Jun 2012 10:52:25 +0200 From: Jan Kiszka To: "Michael S. Tsirkin" , qemu-devel Date: Mon, 4 Jun 2012 10:52:17 +0200 Message-Id: X-Mailer: git-send-email 1.7.3.4 In-Reply-To: References: In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Received-From: 192.35.17.28 Cc: Alex Williamson Subject: [Qemu-devel] [PATCH 09/13] pci: Introduce and apply PCIDeviceAddress X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This type encapsulates everything from domain to function. Use it first to simplify the pci_parse_devaddr interface. Signed-off-by: Jan Kiszka --- hw/pci-hotplug.c | 29 ++++++++++++++--------------- hw/pci.c | 31 ++++++++++++++----------------- hw/pci.h | 6 ++++-- qemu-common.h | 7 +++++++ 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c index e1654dc..aff4d85 100644 --- a/hw/pci-hotplug.c +++ b/hw/pci-hotplug.c @@ -34,14 +34,14 @@ #include "blockdev.h" #include "error.h" -static int read_pci_devaddr(Monitor *mon, const char *addr, unsigned int *domp, - unsigned int *busp, unsigned *slotp) +static int read_pci_devaddr(Monitor *mon, const char *addrstr, + PCIDeviceAddress *addr) { /* strip legacy tag */ - if (!strncmp(addr, "pci_addr=", 9)) { - addr += 9; + if (!strncmp(addrstr, "pci_addr=", 9)) { + addrstr += 9; } - if (pci_parse_devaddr(addr, domp, busp, slotp, NULL)) { + if (pci_parse_devaddr(addrstr, addr, 0)) { monitor_printf(mon, "Invalid pci address\n"); return -1; } @@ -122,18 +122,17 @@ static int scsi_hot_add(Monitor *mon, DeviceState *adapter, int pci_drive_hot_add(Monitor *mon, const QDict *qdict, DriveInfo *dinfo, int type) { - unsigned int dom, pci_bus; - unsigned slot; + PCIDeviceAddress addr; PCIDevice *dev; const char *pci_addr = qdict_get_str(qdict, "pci_addr"); switch (type) { case IF_SCSI: - if (read_pci_devaddr(mon, pci_addr, &dom, &pci_bus, &slot)) { + if (read_pci_devaddr(mon, pci_addr, &addr)) { goto err; } - dev = pci_find_device(pci_find_root_bus(dom), pci_bus, - PCI_DEVFN(slot, 0)); + dev = pci_find_device(pci_find_root_bus(addr.domain), addr.bus, + PCI_DEVFN(addr.slot, 0)); if (!dev) { monitor_printf(mon, "no pci device with address %s\n", pci_addr); goto err; @@ -270,18 +269,18 @@ void pci_device_hot_add(Monitor *mon, const QDict *qdict) static int pci_device_hot_remove(Monitor *mon, const char *pci_addr) { + PCIDeviceAddress addr; PCIDevice *d; - unsigned int dom, bus; - unsigned slot; Error *local_err = NULL; - if (read_pci_devaddr(mon, pci_addr, &dom, &bus, &slot)) { + if (read_pci_devaddr(mon, pci_addr, &addr)) { return -1; } - d = pci_find_device(pci_find_root_bus(dom), bus, PCI_DEVFN(slot, 0)); + d = pci_find_device(pci_find_root_bus(addr.domain), addr.bus, + PCI_DEVFN(addr.slot, 0)); if (!d) { - monitor_printf(mon, "slot %d empty\n", slot); + monitor_printf(mon, "slot %d empty\n", addr.slot); return -1; } diff --git a/hw/pci.c b/hw/pci.c index 6471a68..4d700a9 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -509,20 +509,20 @@ static void pci_set_default_subsystem_id(PCIDevice *pci_dev) } /* - * Parse [[:]:], return -1 on error if funcp == NULL + * Parse [[:]:], return -1 on error if !PCI_DEVADDR_WITH_FUNC * [[:]:]., return -1 on error */ -int pci_parse_devaddr(const char *addr, unsigned int *domp, unsigned int *busp, - unsigned int *slotp, unsigned int *funcp) +int pci_parse_devaddr(const char *addrstr, PCIDeviceAddress *addr, + unsigned int flags) { const char *p; char *e; unsigned long val; unsigned long dom = 0, bus = 0; - unsigned int slot = 0; + unsigned int slot; unsigned int func = 0; - p = addr; + p = addrstr; val = strtoul(p, &e, 16); if (e == p) return -1; @@ -544,7 +544,7 @@ int pci_parse_devaddr(const char *addr, unsigned int *domp, unsigned int *busp, slot = val; - if (funcp != NULL) { + if (flags & PCI_DEVADDR_WITH_FUNC) { if (*e != '.') return -1; @@ -556,37 +556,34 @@ int pci_parse_devaddr(const char *addr, unsigned int *domp, unsigned int *busp, func = val; } - /* if funcp == NULL func is 0 */ if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7) return -1; if (*e) return -1; - *domp = dom; - *busp = bus; - *slotp = slot; - if (funcp != NULL) - *funcp = func; + addr->domain = dom; + addr->bus = bus; + addr->slot = slot; + addr->function = func; return 0; } PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr) { - unsigned int dom, bus; - unsigned slot; + PCIDeviceAddress addr; if (!devaddr) { *devfnp = -1; return pci_find_bus_nr(pci_find_root_bus(0), 0); } - if (pci_parse_devaddr(devaddr, &dom, &bus, &slot, NULL) < 0) { + if (pci_parse_devaddr(devaddr, &addr, 0) < 0) { return NULL; } - *devfnp = PCI_DEVFN(slot, 0); - return pci_find_bus_nr(pci_find_root_bus(dom), bus); + *devfnp = PCI_DEVFN(addr.slot, 0); + return pci_find_bus_nr(pci_find_root_bus(addr.domain), addr.bus); } static void pci_init_cmask(PCIDevice *dev) diff --git a/hw/pci.h b/hw/pci.h index 552a586..6c48ffa 100644 --- a/hw/pci.h +++ b/hw/pci.h @@ -340,8 +340,10 @@ PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn); 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, unsigned int *domp, unsigned int *busp, - unsigned int *slotp, unsigned int *funcp); +#define PCI_DEVADDR_WITH_FUNC 2 + +int pci_parse_devaddr(const char *addrstr, PCIDeviceAddress *addr, + unsigned int flags); void pci_device_deassert_intx(PCIDevice *dev); diff --git a/qemu-common.h b/qemu-common.h index 91e0562..32a35bc 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -274,6 +274,13 @@ typedef enum LostTickPolicy { LOST_TICK_MAX } LostTickPolicy; +typedef struct PCIDeviceAddress { + unsigned int domain; + unsigned int bus; + unsigned int slot; + unsigned int function; +} PCIDeviceAddress; + void tcg_exec_init(unsigned long tb_size); bool tcg_enabled(void);