From patchwork Fri Sep 17 15:27:51 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bernhard Kohl X-Patchwork-Id: 188492 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id o8HFSVfV010777 for ; Fri, 17 Sep 2010 15:28:31 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754877Ab0IQP22 (ORCPT ); Fri, 17 Sep 2010 11:28:28 -0400 Received: from demumfd001.nsn-inter.net ([93.183.12.32]:14919 "EHLO demumfd001.nsn-inter.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754303Ab0IQP22 (ORCPT ); Fri, 17 Sep 2010 11:28:28 -0400 Received: from demuprx017.emea.nsn-intra.net ([10.150.129.56]) by demumfd001.nsn-inter.net (8.12.11.20060308/8.12.11) with ESMTP id o8HFSBRR030680 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 17 Sep 2010 17:28:11 +0200 Received: from localhost6.localdomain6 ([10.148.23.89]) by demuprx017.emea.nsn-intra.net (8.12.11.20060308/8.12.11) with ESMTP id o8HFSAhf014870; Fri, 17 Sep 2010 17:28:10 +0200 From: Bernhard Kohl To: kvm@vger.kernel.org Cc: kwolf@redhat.com, alex.williamson@redhat.com, Bernhard Kohl , Thomas Ostler Subject: [PATCH] device-assignment: register a reset function Date: Fri, 17 Sep 2010 17:27:51 +0200 Message-Id: <1284737271-21457-1-git-send-email-bernhard.kohl@nsn.com> X-Mailer: git-send-email 1.7.2.2 In-Reply-To: <4C9377DA.9050904@nsn.com> References: <4C9377DA.9050904@nsn.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Fri, 17 Sep 2010 15:28:31 +0000 (UTC) diff --git a/hw/device-assignment.c b/hw/device-assignment.c index 87f7418..fb47813 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -1450,6 +1450,17 @@ static void assigned_dev_unregister_msix_mmio(AssignedDevice *dev) dev->msix_table_page = NULL; } +static void reset_assigned_device(void *opaque) +{ + PCIDevice *d = (PCIDevice *)opaque; + uint32_t conf; + + /* reset the bus master bit to avoid further DMA transfers */ + conf = assigned_dev_pci_read_config(d, PCI_COMMAND, 2); + conf &= ~PCI_COMMAND_MASTER; + assigned_dev_pci_write_config(d, PCI_COMMAND, conf, 2); +} + static int assigned_initfn(struct PCIDevice *pci_dev) { AssignedDevice *dev = DO_UPCAST(AssignedDevice, dev, pci_dev); @@ -1499,6 +1510,9 @@ static int assigned_initfn(struct PCIDevice *pci_dev) if (r < 0) goto assigned_out; + /* register reset function for the device */ + qemu_register_reset(reset_assigned_device, pci_dev); + /* intercept MSI-X entry page in the MMIO */ if (dev->cap.available & ASSIGNED_DEVICE_CAP_MSIX) if (assigned_dev_register_msix_mmio(dev))