From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Williamson Subject: [PATCH 6/9] pci-assign: Proper initialization for MSI-X table Date: Sat, 28 Jan 2012 07:22:09 -0700 Message-ID: <20120128142209.25681.10074.stgit@bling.home> References: <20120128142104.25681.93072.stgit@bling.home> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Cc: alex.williamson@redhat.com, jan.kiszka@siemens.com, shashidhar.patil@gmail.com To: kvm@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:51901 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753638Ab2A1OWN (ORCPT ); Sat, 28 Jan 2012 09:22:13 -0500 In-Reply-To: <20120128142104.25681.93072.stgit@bling.home> Sender: kvm-owner@vger.kernel.org List-ID: Per the PCI spec, all vectors should be masked at handoff. Signed-off-by: Alex Williamson --- hw/device-assignment.c | 20 +++++++++++++++++++- 1 files changed, 19 insertions(+), 1 deletions(-) diff --git a/hw/device-assignment.c b/hw/device-assignment.c index af614d3..6efa219 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -1462,6 +1462,22 @@ static const MemoryRegionOps msix_mmio_ops = { }, }; +static void msix_reset(AssignedDevice *dev) +{ + MSIXTableEntry *entry; + int i; + + if (!dev->msix_table) { + return; + } + + memset(dev->msix_table, 0, 0x1000); + + for (i = 0, entry = dev->msix_table; i < dev->msix_max; i++, entry++) { + entry->ctrl = 0x1; /* Masked */ + } +} + static int assigned_dev_register_msix_mmio(AssignedDevice *dev) { dev->msix_table = mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, @@ -1470,7 +1486,9 @@ static int assigned_dev_register_msix_mmio(AssignedDevice *dev) fprintf(stderr, "fail allocate msix_table! %s\n", strerror(errno)); return -EFAULT; } - memset(dev->msix_table, 0, 0x1000); + + msix_reset(dev); + memory_region_init_io(&dev->mmio, &msix_mmio_ops, dev, "assigned-dev-msix", MSIX_PAGE_SIZE); return 0;