From patchwork Tue Feb 24 08:33:31 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bjorn Helgaas X-Patchwork-Id: 5870491 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: patchwork-linux-pci@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id CB0CFBF440 for ; Tue, 24 Feb 2015 08:33:36 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E65AF2064F for ; Tue, 24 Feb 2015 08:33:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0E2262063C for ; Tue, 24 Feb 2015 08:33:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751603AbbBXIde (ORCPT ); Tue, 24 Feb 2015 03:33:34 -0500 Received: from mail-pd0-f169.google.com ([209.85.192.169]:43735 "EHLO mail-pd0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751498AbbBXIdd (ORCPT ); Tue, 24 Feb 2015 03:33:33 -0500 Received: by pdev10 with SMTP id v10so31771333pde.10 for ; Tue, 24 Feb 2015 00:33:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=subject:to:from:cc:date:message-id:in-reply-to:references :user-agent:mime-version:content-type:content-transfer-encoding; bh=0oIPDy6gapIvNQW2SBgGU66ZFkWWZCP2Xndyb6S0vQ8=; b=HPIraSqAm4t3n1rlrf448/kEqmcsYxefxg+TS6AHnw8x5nstpLS9XNqvIrfKMWpYpQ ByqW0TWz5lKba1BD+48Gaw8Gc6fgsM7zdBjFE6N+XubHr7bJdIuyCfFYz5+diIBZf3LE vuIX2Yza3bAqAMU+YeJk1aY1dOzd893ms7fNCefJFxzMciVDAvJqzXmlyxjrs7ADjbz8 5H2QSRAixoQgpPvENNV5uXrT9OFAE+D5nFARIaEoFdSvPMIKiAwqqcl2/H8wTUnjsEdA EJNZ0ArwV8SoLTRqb+yjFrhXS9tcDlmenSkwjdqXUmg987b4K08hiIgp5avKj9JR1qOe TF3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:from:cc:date:message-id:in-reply-to :references:user-agent:mime-version:content-type :content-transfer-encoding; bh=0oIPDy6gapIvNQW2SBgGU66ZFkWWZCP2Xndyb6S0vQ8=; b=NZ2Z1zqXV90lXZhhc3VtmODdFm17PNkRHPQEdVO/Jd8sy68YJJGeZQ7yU6M1AC0HZI ND6r9tBwnuY+0eidEs3iSA7MGu9yx6eP9JuB3i+oV1Q32LVVLjxe1JpO8FPzQ5AytWNA uEztNPy/VqFErkhXiIO8n2O2dAWHyyq+w//JpM7Hi73bWlin7uaN+WRNL6ki63kl7sMg o2km5uGolCcfdchqL4vavvhfChsu1VwR5PmRHhIX01R8iWpQ8lWsQn0vyXtuQcvalyGC G4dBh8ER1ESWmJzT8MkBtinmklgJJTbvDxXiGw1d3L2y8EqIgWrX6CKzgPk43Vc2cYJX oDWg== X-Gm-Message-State: ALoCoQlBlKsVE/dwSmcDHgpcRX6QxEHBer8wBS7x0qEW8DH0h/Q87PU8u0iXY/osco0cPdPv3IjJ X-Received: by 10.70.42.177 with SMTP id p17mr26648335pdl.91.1424766813170; Tue, 24 Feb 2015 00:33:33 -0800 (PST) Received: from localhost ([12.23.74.29]) by mx.google.com with ESMTPSA id ku12sm38517181pab.39.2015.02.24.00.33.32 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 24 Feb 2015 00:33:32 -0800 (PST) Subject: [PATCH v12 05/21] PCI: Refresh First VF Offset and VF Stride when updating NumVFs To: Wei Yang , benh@au1.ibm.com, gwshan@linux.vnet.ibm.com From: Bjorn Helgaas Cc: linux-pci@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Date: Tue, 24 Feb 2015 02:33:31 -0600 Message-ID: <20150224083331.32124.41731.stgit@bhelgaas-glaptop2.roam.corp.google.com> In-Reply-To: <20150224082939.32124.45744.stgit@bhelgaas-glaptop2.roam.corp.google.com> References: <20150224082939.32124.45744.stgit@bhelgaas-glaptop2.roam.corp.google.com> User-Agent: StGit/0.16 MIME-Version: 1.0 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Wei Yang The First VF Offset and VF Stride fields depend on the NumVFs setting, so refresh the cached fields in struct pci_sriov when updating NumVFs. See the SR-IOV spec r1.1, sec 3.3.9 and 3.3.10. [bhelgaas: changelog, remove kernel-doc comment marker] Signed-off-by: Wei Yang Signed-off-by: Bjorn Helgaas --- drivers/pci/iov.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index 27b98c361823..a8752c2c2b53 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -31,6 +31,21 @@ static inline u8 virtfn_devfn(struct pci_dev *dev, int id) dev->sriov->stride * id) & 0xff; } +/* + * Per SR-IOV spec sec 3.3.10 and 3.3.11, First VF Offset and VF Stride may + * change when NumVFs changes. + * + * Update iov->offset and iov->stride when NumVFs is written. + */ +static inline void pci_iov_set_numvfs(struct pci_dev *dev, int nr_virtfn) +{ + struct pci_sriov *iov = dev->sriov; + + pci_write_config_word(dev, iov->pos + PCI_SRIOV_NUM_VF, nr_virtfn); + pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_OFFSET, &iov->offset); + pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_STRIDE, &iov->stride); +} + static struct pci_bus *virtfn_add_bus(struct pci_bus *bus, int busnr) { struct pci_bus *child; @@ -253,7 +268,7 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) return rc; } - pci_write_config_word(dev, iov->pos + PCI_SRIOV_NUM_VF, nr_virtfn); + pci_iov_set_numvfs(dev, nr_virtfn); iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE; pci_cfg_access_lock(dev); pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); @@ -282,7 +297,7 @@ failed: iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE); pci_cfg_access_lock(dev); pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); - pci_write_config_word(dev, iov->pos + PCI_SRIOV_NUM_VF, 0); + pci_iov_set_numvfs(dev, 0); ssleep(1); pci_cfg_access_unlock(dev); @@ -313,7 +328,7 @@ static void sriov_disable(struct pci_dev *dev) sysfs_remove_link(&dev->dev.kobj, "dep_link"); iov->num_VFs = 0; - pci_write_config_word(dev, iov->pos + PCI_SRIOV_NUM_VF, 0); + pci_iov_set_numvfs(dev, 0); } static int sriov_init(struct pci_dev *dev, int pos) @@ -452,7 +467,7 @@ static void sriov_restore_state(struct pci_dev *dev) pci_update_resource(dev, i); pci_write_config_dword(dev, iov->pos + PCI_SRIOV_SYS_PGSIZE, iov->pgsz); - pci_write_config_word(dev, iov->pos + PCI_SRIOV_NUM_VF, iov->num_VFs); + pci_iov_set_numvfs(dev, iov->num_VFs); pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); if (iov->ctrl & PCI_SRIOV_CTRL_VFE) msleep(100);