From patchwork Thu Apr 28 08:59:53 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 738751 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 p3S90ODG016806 for ; Thu, 28 Apr 2011 09:00:24 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757812Ab1D1JAS (ORCPT ); Thu, 28 Apr 2011 05:00:18 -0400 Received: from thoth.sbs.de ([192.35.17.2]:29079 "EHLO thoth.sbs.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757416Ab1D1JAG (ORCPT ); Thu, 28 Apr 2011 05:00:06 -0400 Received: from mail1.siemens.de (localhost [127.0.0.1]) by thoth.sbs.de (8.13.6/8.13.6) with ESMTP id p3S8xtKF019597; Thu, 28 Apr 2011 10:59:55 +0200 Received: from mchn199C.mchp.siemens.de ([139.25.109.49]) by mail1.siemens.de (8.13.6/8.13.6) with ESMTP id p3S8xspa021662; Thu, 28 Apr 2011 10:59:55 +0200 From: Jan Kiszka To: Avi Kivity , Marcelo Tosatti Cc: kvm@vger.kernel.org, Alex Williamson Subject: [PATCH 5/5] pci-assign: Convert need_emulate_cmd into a bitmask Date: Thu, 28 Apr 2011 10:59:53 +0200 Message-Id: <304a3b5f654dd25bac2eba43daed5cdebc7f43da.1303981185.git.jan.kiszka@siemens.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: References: In-Reply-To: References: 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.6 (demeter1.kernel.org [140.211.167.41]); Thu, 28 Apr 2011 09:00:24 +0000 (UTC) Define a mask of PCI command register bits that need to be emulated, i.e. read back from their shadow state. We will need this for selectively emulating the INTx mask bit. Note: No initialization of emulate_cmd_mask to zero needed, the device state is already zero-initialized. Signed-off-by: Jan Kiszka --- hw/device-assignment.c | 11 +++++------ hw/device-assignment.h | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/hw/device-assignment.c b/hw/device-assignment.c index 7ff1320..56b4832 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -513,9 +513,9 @@ again: DEBUG("(%x.%x): address=%04x val=0x%08x len=%d\n", (d->devfn >> 3) & 0x1F, (d->devfn & 0x7), address, val, len); - if (pci_dev->need_emulate_cmd) { + if (pci_dev->emulate_cmd_mask) { val = merge_bits(val, pci_default_read_config(d, PCI_COMMAND, 2), - address, len, PCI_COMMAND, 0xffff); + address, len, PCI_COMMAND, pci_dev->emulate_cmd_mask); } if (!pci_dev->cap.available) { @@ -778,10 +778,9 @@ again: /* dealing with virtual function device */ snprintf(name, sizeof(name), "%sphysfn/", dir); - if (!stat(name, &statbuf)) - pci_dev->need_emulate_cmd = 1; - else - pci_dev->need_emulate_cmd = 0; + if (!stat(name, &statbuf)) { + pci_dev->emulate_cmd_mask = 0xffff; + } dev->region_number = r; return 0; diff --git a/hw/device-assignment.h b/hw/device-assignment.h index 86af0a9..ae1bc58 100644 --- a/hw/device-assignment.h +++ b/hw/device-assignment.h @@ -109,7 +109,7 @@ typedef struct AssignedDevice { void *msix_table_page; target_phys_addr_t msix_table_addr; int mmio_index; - int need_emulate_cmd; + uint32_t emulate_cmd_mask; char *configfd_name; int32_t bootindex; QLIST_ENTRY(AssignedDevice) next;