From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LXGuO-0004YB-HG for qemu-devel@nongnu.org; Wed, 11 Feb 2009 10:21:52 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LXGuN-0004Xh-PI for qemu-devel@nongnu.org; Wed, 11 Feb 2009 10:21:52 -0500 Received: from [199.232.76.173] (port=52375 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LXGuN-0004Xd-Lu for qemu-devel@nongnu.org; Wed, 11 Feb 2009 10:21:51 -0500 Received: from savannah.gnu.org ([199.232.41.3]:60579 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LXGuN-0002JF-Dj for qemu-devel@nongnu.org; Wed, 11 Feb 2009 10:21:51 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LXGuM-0004vF-DZ for qemu-devel@nongnu.org; Wed, 11 Feb 2009 15:21:50 +0000 Received: from aliguori by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LXGuL-0004v2-7h for qemu-devel@nongnu.org; Wed, 11 Feb 2009 15:21:49 +0000 MIME-Version: 1.0 Errors-To: aliguori Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Anthony Liguori Message-Id: Date: Wed, 11 Feb 2009 15:21:49 +0000 Subject: [Qemu-devel] [6609] Parse full PCI device addresses (Markus Armbruster) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6609 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6609 Author: aliguori Date: 2009-02-11 15:21:48 +0000 (Wed, 11 Feb 2009) Log Message: ----------- Parse full PCI device addresses (Markus Armbruster) This code parses full PCI device addresses. It then rejects domains other than zero, because these are not supported in QEMU. Signed-off-by: Marcelo Tosatti Signed-off-by: Anthony Liguori Modified Paths: -------------- trunk/hw/pci.c trunk/hw/pci.h Modified: trunk/hw/pci.c =================================================================== --- trunk/hw/pci.c 2009-02-11 15:21:41 UTC (rev 6608) +++ trunk/hw/pci.c 2009-02-11 15:21:48 UTC (rev 6609) @@ -26,6 +26,7 @@ #include "console.h" #include "net.h" #include "virtio-net.h" +#include "sysemu.h" //#define DEBUG_PCI @@ -158,6 +159,82 @@ return 0; } +/* + * Parse [[:]:], return -1 on error + */ +static int pci_parse_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp) +{ + const char *p; + char *e; + unsigned long val; + unsigned long dom = 0, bus = 0; + unsigned slot = 0; + + p = addr; + val = strtoul(p, &e, 16); + if (e == p) + return -1; + if (*e == ':') { + bus = val; + p = e + 1; + val = strtoul(p, &e, 16); + if (e == p) + return -1; + if (*e == ':') { + dom = bus; + bus = val; + p = e + 1; + val = strtoul(p, &e, 16); + if (e == p) + return -1; + } + } + + if (dom > 0xffff || bus > 0xff || val > 0x1f) + return -1; + + slot = val; + + if (*e) + return -1; + + /* Note: QEMU doesn't implement domains other than 0 */ + if (dom != 0 || pci_find_bus(bus) == NULL) + return -1; + + *domp = dom; + *busp = bus; + *slotp = slot; + return 0; +} + +int pci_read_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp) +{ + char devaddr[32]; + + if (!get_param_value(devaddr, sizeof(devaddr), "pci_addr", addr)) + return -1; + + return pci_parse_devaddr(devaddr, domp, busp, slotp); +} + +int pci_assign_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp) +{ + char devaddr[32]; + + if (!get_param_value(devaddr, sizeof(devaddr), "pci_addr", addr)) + return -1; + + if (!strcmp(devaddr, "auto")) { + *domp = *busp = 0; + *slotp = -1; + /* want to support dom/bus auto-assign at some point */ + return 0; + } + + return pci_parse_devaddr(devaddr, domp, busp, slotp); +} + /* -1 for devfn means auto assign */ PCIDevice *pci_register_device(PCIBus *bus, const char *name, int instance_size, int devfn, Modified: trunk/hw/pci.h =================================================================== --- trunk/hw/pci.h 2009-02-11 15:21:41 UTC (rev 6608) +++ trunk/hw/pci.h 2009-02-11 15:21:48 UTC (rev 6609) @@ -232,6 +232,9 @@ PCIBus *pci_find_bus(int bus_num); PCIDevice *pci_find_device(int bus_num, int slot, int function); +int pci_read_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp); +int pci_assign_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp); + void pci_info(void); PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, pci_map_irq_fn map_irq, const char *name);