Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3919838pxj; Mon, 21 Jun 2021 09:22:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJygcIW8EG/QSTyfGMNqa5ZwM6ha04Pi8Ltc4rC0D51vmtsLEB5GnxtHjPGSbQz6vO/w15GI X-Received: by 2002:aa7:c04d:: with SMTP id k13mr22560244edo.122.1624292571447; Mon, 21 Jun 2021 09:22:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624292571; cv=none; d=google.com; s=arc-20160816; b=SjKtf5+ne4climlmR8eFp8wuM3uDi09ISSVzSSZ+TfliOJDWcG/+XVzYR7ZUTvYKU4 +cDnwa+uU+yxhAUkds7K8XHwAeWbt2SA6YkMoaYkBmLkUTYrN5knVuRwZmv8rJ3FWWH2 ZEPVhzCDdbG3ZWODdJxfKCZG4VRutLvmvDXPV9apH7gFOPS1r52DfD9a7f/DnsamkkdY KNkRGc9wz8ZXU4ag3bqbuViTAKoiAeSxqYrMAFscpMsQ0t2zOwJH73QTXaWUnKmL5eM0 pqVdnNs5O0RaiZJbdTBdicA+75IlqAtiHsS12xaU1ZyvH9RLdpcfkEdz9Bka1wX0OBWb GHhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=lLNlaGHN+i8Xe9WgMW+rwdFJi81fsWYcJmNyqPxngFI=; b=xBKuCZn001jUtWoMnNC9z14k/O+UvFl7jd9a9jllDKIrUNUB4o5SRU3COj0eMNehIn 2fBQaBDgUMBorY2UmszSDq7nJjXx1d5Sv32Xz1NZUGmpwAc7HLiO1h68tDuGYlgLU5V6 RMr7ZZHp0x1zULMVLl7lZVRuSEq44jsvonAU6xB7RWHjEix/z1es+d6k6VYf+3due+3Q tFJzHMwiAtNxC1u+GmtFpW7HvJlrEzTFuPjgpLkq7egqNOS6Se+4egzlWRLV1RRFMKaY XTqgWZKOn08I49jaFHXyqUjXWh6xNwbpKZhoDfTf3X3VFdBa2MCmd+X+0gni07VMFcKD Zrsw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=EKwNGhZM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e25si13534614eds.427.2021.06.21.09.22.28; Mon, 21 Jun 2021 09:22:51 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=EKwNGhZM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231785AbhFUQW6 (ORCPT + 99 others); Mon, 21 Jun 2021 12:22:58 -0400 Received: from mail.kernel.org ([198.145.29.99]:42736 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231788AbhFUQVi (ORCPT ); Mon, 21 Jun 2021 12:21:38 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 0565561363; Mon, 21 Jun 2021 16:19:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1624292363; bh=/iJYTF6bIHrKFJoPyo5rhho9VuYBhi03BdV1CbiyiLo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EKwNGhZMGINLE+WH8IjJIwij3YRfj4n7Jl/yA6We9Ozfhiw/WZXiXVbzOc30t1tn1 lIZqGCP1ljoTPSZCO3Q7+YqeZp8sIA3goLDMMDQkg+T8jQm6MwqmAsafoJzX5RJqDe b0k/4AJE/SuPVSzg6ocqUITDf9TWv9/nKp2Ne1wE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Chiqijun , Bjorn Helgaas , Alex Williamson Subject: [PATCH 5.4 63/90] PCI: Work around Huawei Intelligent NIC VF FLR erratum Date: Mon, 21 Jun 2021 18:15:38 +0200 Message-Id: <20210621154906.286261737@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210621154904.159672728@linuxfoundation.org> References: <20210621154904.159672728@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Chiqijun commit ce00322c2365e1f7b0312f2f493539c833465d97 upstream. pcie_flr() starts a Function Level Reset (FLR), waits 100ms (the maximum time allowed for FLR completion by PCIe r5.0, sec 6.6.2), and waits for the FLR to complete. It assumes the FLR is complete when a config read returns valid data. When we do an FLR on several Huawei Intelligent NIC VFs at the same time, firmware on the NIC processes them serially. The VF may respond to config reads before the firmware has completed its reset processing. If we bind a driver to the VF (e.g., by assigning the VF to a virtual machine) in the interval between the successful config read and completion of the firmware reset processing, the NIC VF driver may fail to load. Prevent this driver failure by waiting for the NIC firmware to complete its reset processing. Not all NIC firmware supports this feature. [bhelgaas: commit log] Link: https://support.huawei.com/enterprise/en/doc/EDOC1100063073/87950645/vm-oss-occasionally-fail-to-load-the-in200-driver-when-the-vf-performs-flr Link: https://lore.kernel.org/r/20210414132301.1793-1-chiqijun@huawei.com Signed-off-by: Chiqijun Signed-off-by: Bjorn Helgaas Reviewed-by: Alex Williamson Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/pci/quirks.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -3991,6 +3991,69 @@ static int delay_250ms_after_flr(struct return 0; } +#define PCI_DEVICE_ID_HINIC_VF 0x375E +#define HINIC_VF_FLR_TYPE 0x1000 +#define HINIC_VF_FLR_CAP_BIT (1UL << 30) +#define HINIC_VF_OP 0xE80 +#define HINIC_VF_FLR_PROC_BIT (1UL << 18) +#define HINIC_OPERATION_TIMEOUT 15000 /* 15 seconds */ + +/* Device-specific reset method for Huawei Intelligent NIC virtual functions */ +static int reset_hinic_vf_dev(struct pci_dev *pdev, int probe) +{ + unsigned long timeout; + void __iomem *bar; + u32 val; + + if (probe) + return 0; + + bar = pci_iomap(pdev, 0, 0); + if (!bar) + return -ENOTTY; + + /* Get and check firmware capabilities */ + val = ioread32be(bar + HINIC_VF_FLR_TYPE); + if (!(val & HINIC_VF_FLR_CAP_BIT)) { + pci_iounmap(pdev, bar); + return -ENOTTY; + } + + /* Set HINIC_VF_FLR_PROC_BIT for the start of FLR */ + val = ioread32be(bar + HINIC_VF_OP); + val = val | HINIC_VF_FLR_PROC_BIT; + iowrite32be(val, bar + HINIC_VF_OP); + + pcie_flr(pdev); + + /* + * The device must recapture its Bus and Device Numbers after FLR + * in order generate Completions. Issue a config write to let the + * device capture this information. + */ + pci_write_config_word(pdev, PCI_VENDOR_ID, 0); + + /* Firmware clears HINIC_VF_FLR_PROC_BIT when reset is complete */ + timeout = jiffies + msecs_to_jiffies(HINIC_OPERATION_TIMEOUT); + do { + val = ioread32be(bar + HINIC_VF_OP); + if (!(val & HINIC_VF_FLR_PROC_BIT)) + goto reset_complete; + msleep(20); + } while (time_before(jiffies, timeout)); + + val = ioread32be(bar + HINIC_VF_OP); + if (!(val & HINIC_VF_FLR_PROC_BIT)) + goto reset_complete; + + pci_warn(pdev, "Reset dev timeout, FLR ack reg: %#010x\n", val); + +reset_complete: + pci_iounmap(pdev, bar); + + return 0; +} + static const struct pci_dev_reset_methods pci_dev_reset_methods[] = { { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82599_SFP_VF, reset_intel_82599_sfp_virtfn }, @@ -4002,6 +4065,8 @@ static const struct pci_dev_reset_method { PCI_VENDOR_ID_INTEL, 0x0953, delay_250ms_after_flr }, { PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID, reset_chelsio_generic_dev }, + { PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HINIC_VF, + reset_hinic_vf_dev }, { 0 } };