From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:53834) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UFjps-0004kf-Qq for qemu-devel@nongnu.org; Wed, 13 Mar 2013 07:27:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UFjpm-00021o-KX for qemu-devel@nongnu.org; Wed, 13 Mar 2013 07:27:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:27489) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UFjpm-00021a-Bf for qemu-devel@nongnu.org; Wed, 13 Mar 2013 07:27:02 -0400 Date: Wed, 13 Mar 2013 12:26:59 +0100 From: Kevin Wolf Message-ID: <20130313112659.GE2309@dhcp-200-207.str.redhat.com> References: <1362491612-19226-1-git-send-email-aliguori@us.ibm.com> <1362491612-19226-2-git-send-email-aliguori@us.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1362491612-19226-2-git-send-email-aliguori@us.ibm.com> Subject: Re: [Qemu-devel] [RFC PATCH 1/8] qtest: add libqos List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: qemu-devel@nongnu.org, Stefan Hajnoczi Am 05.03.2013 um 14:53 hat Anthony Liguori geschrieben: > This includes basic PCI support. > > Signed-off-by: Anthony Liguori > +static void *qpci_pc_iomap(QPCIBus *bus, QPCIDevice *dev, int barno) > +{ > + QPCIBusPC *s = container_of(bus, QPCIBusPC, bus); > + static const int bar_reg_map[] = { > + PCI_BASE_ADDRESS_0, PCI_BASE_ADDRESS_1, PCI_BASE_ADDRESS_2, > + PCI_BASE_ADDRESS_3, PCI_BASE_ADDRESS_4, PCI_BASE_ADDRESS_5, > + }; > + int bar_reg; > + uint32_t addr; > + uint64_t size; > + > + g_assert(barno >= 0 && barno <= 5); > + bar_reg = bar_reg_map[barno]; > + > + qpci_config_writel(dev, bar_reg, 0xFFFFFFFF); > + addr = qpci_config_readl(dev, bar_reg); > + > + size = (1ULL << ctol(addr)); This doesn't look right. It should be something like: size = (1ULL << ctzl(addr & ~0x3)); In fact, what must be masked out differs for I/O (0x3) and memory (0xf). > --- /dev/null > +++ b/tests/libqos/pci.c > @@ -0,0 +1,108 @@ > +#include "libqos/pci.h" > + > +#include "hw/pci/pci_regs.h" > +#include > + > +#include > + > +QPCIDevice *qpci_device_find(QPCIBus *bus, int devfn) > +{ > + QPCIDevice *dev; > + > + dev = g_malloc0(sizeof(*dev)); Where is the matching free? I can't seem to destroy a device I once queried. > + dev->bus = bus; > + dev->devfn = devfn; > + > + if (qpci_config_readw(dev, PCI_VENDOR_ID) == 0xFFFF) { > + printf("vendor id is %x\n", qpci_config_readw(dev, PCI_VENDOR_ID)); > + g_free(dev); > + return NULL; > + } > + > + return dev; > +} > + > +void qpci_device_enable(QPCIDevice *dev) > +{ > + uint16_t cmd; > + > + /* FIXME -- does this need to be a bus callout? */ > + cmd = qpci_config_readw(dev, PCI_COMMAND); > + cmd |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY; > + qpci_config_writew(dev, PCI_COMMAND, cmd); > +} Wouldn't it make sense to enable bus mastering here as well? Forgetting to do this manually is a trap that's easy to fall in... Kevin