From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Williamson Subject: [PATCH v2 5/8] pci-assign: Proper initialization for MSI-X table Date: Tue, 31 Jan 2012 22:32:52 -0700 Message-ID: <20120201053252.9843.11575.stgit@bling.home> References: <20120201052203.9843.80792.stgit@bling.home> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Cc: alex.williamson@redhat.com, avi@redhat.com, mst@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]:49254 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751326Ab2BAFc4 (ORCPT ); Wed, 1 Feb 2012 00:32:56 -0500 In-Reply-To: <20120201052203.9843.80792.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 25dff2c..a33e5b9 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -1459,6 +1459,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 = cpu_to_le32(0x1); /* Masked */ + } +} + static int assigned_dev_register_msix_mmio(AssignedDevice *dev) { dev->msix_table = mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, @@ -1467,7 +1483,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;