Merge branch 'pci/virtualization'
- To avoid bus errors, enable PASID only if entire path supports End-End TLP prefixes (Sinan Kaya) - Unify slot and bus reset functions and remove hotplug knowledge from callers (Sinan Kaya) - Add Function-Level Reset quirks for Intel and Samsung NVMe devices to fix guest reboot issues (Alex Williamson) - Add function 1 DMA alias quirk for Marvell 88SS9183 PCIe SSD Controller (Bjorn Helgaas) * pci/virtualization: PCI: Add function 1 DMA alias quirk for Marvell 88SS9183 PCI: Delay after FLR of Intel DC P3700 NVMe PCI: Disable Samsung SM961/PM961 NVMe before FLR PCI: Export pcie_has_flr() PCI: Rename pci_try_reset_bus() to pci_reset_bus() PCI: Deprecate pci_reset_bus() and pci_reset_slot() functions PCI: Unify try slot and bus reset API PCI: Hide pci_reset_bridge_secondary_bus() from drivers IB/hfi1: Use pci_try_reset_bus() for initiating PCI Secondary Bus Reset PCI: Handle error return from pci_reset_bridge_secondary_bus() PCI/IOV: Tidy pci_sriov_set_totalvfs() PCI: Enable PASID only if entire path supports End-End TLP prefixes # Conflicts: # drivers/pci/hotplug/pciehp_hpc.c
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/nvme.h>
|
||||
#include <linux/platform_data/x86/apple.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/switchtec.h>
|
||||
@@ -3667,6 +3668,108 @@ static int reset_chelsio_generic_dev(struct pci_dev *dev, int probe)
|
||||
#define PCI_DEVICE_ID_INTEL_IVB_M_VGA 0x0156
|
||||
#define PCI_DEVICE_ID_INTEL_IVB_M2_VGA 0x0166
|
||||
|
||||
/*
|
||||
* The Samsung SM961/PM961 controller can sometimes enter a fatal state after
|
||||
* FLR where config space reads from the device return -1. We seem to be
|
||||
* able to avoid this condition if we disable the NVMe controller prior to
|
||||
* FLR. This quirk is generic for any NVMe class device requiring similar
|
||||
* assistance to quiesce the device prior to FLR.
|
||||
*
|
||||
* NVMe specification: https://nvmexpress.org/resources/specifications/
|
||||
* Revision 1.0e:
|
||||
* Chapter 2: Required and optional PCI config registers
|
||||
* Chapter 3: NVMe control registers
|
||||
* Chapter 7.3: Reset behavior
|
||||
*/
|
||||
static int nvme_disable_and_flr(struct pci_dev *dev, int probe)
|
||||
{
|
||||
void __iomem *bar;
|
||||
u16 cmd;
|
||||
u32 cfg;
|
||||
|
||||
if (dev->class != PCI_CLASS_STORAGE_EXPRESS ||
|
||||
!pcie_has_flr(dev) || !pci_resource_start(dev, 0))
|
||||
return -ENOTTY;
|
||||
|
||||
if (probe)
|
||||
return 0;
|
||||
|
||||
bar = pci_iomap(dev, 0, NVME_REG_CC + sizeof(cfg));
|
||||
if (!bar)
|
||||
return -ENOTTY;
|
||||
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd | PCI_COMMAND_MEMORY);
|
||||
|
||||
cfg = readl(bar + NVME_REG_CC);
|
||||
|
||||
/* Disable controller if enabled */
|
||||
if (cfg & NVME_CC_ENABLE) {
|
||||
u32 cap = readl(bar + NVME_REG_CAP);
|
||||
unsigned long timeout;
|
||||
|
||||
/*
|
||||
* Per nvme_disable_ctrl() skip shutdown notification as it
|
||||
* could complete commands to the admin queue. We only intend
|
||||
* to quiesce the device before reset.
|
||||
*/
|
||||
cfg &= ~(NVME_CC_SHN_MASK | NVME_CC_ENABLE);
|
||||
|
||||
writel(cfg, bar + NVME_REG_CC);
|
||||
|
||||
/*
|
||||
* Some controllers require an additional delay here, see
|
||||
* NVME_QUIRK_DELAY_BEFORE_CHK_RDY. None of those are yet
|
||||
* supported by this quirk.
|
||||
*/
|
||||
|
||||
/* Cap register provides max timeout in 500ms increments */
|
||||
timeout = ((NVME_CAP_TIMEOUT(cap) + 1) * HZ / 2) + jiffies;
|
||||
|
||||
for (;;) {
|
||||
u32 status = readl(bar + NVME_REG_CSTS);
|
||||
|
||||
/* Ready status becomes zero on disable complete */
|
||||
if (!(status & NVME_CSTS_RDY))
|
||||
break;
|
||||
|
||||
msleep(100);
|
||||
|
||||
if (time_after(jiffies, timeout)) {
|
||||
pci_warn(dev, "Timeout waiting for NVMe ready status to clear after disable\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pci_iounmap(dev, bar);
|
||||
|
||||
pcie_flr(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Intel DC P3700 NVMe controller will timeout waiting for ready status
|
||||
* to change after NVMe enable if the driver starts interacting with the
|
||||
* device too soon after FLR. A 250ms delay after FLR has heuristically
|
||||
* proven to produce reliably working results for device assignment cases.
|
||||
*/
|
||||
static int delay_250ms_after_flr(struct pci_dev *dev, int probe)
|
||||
{
|
||||
if (!pcie_has_flr(dev))
|
||||
return -ENOTTY;
|
||||
|
||||
if (probe)
|
||||
return 0;
|
||||
|
||||
pcie_flr(dev);
|
||||
|
||||
msleep(250);
|
||||
|
||||
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 },
|
||||
@@ -3674,6 +3777,8 @@ static const struct pci_dev_reset_methods pci_dev_reset_methods[] = {
|
||||
reset_ivb_igd },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IVB_M2_VGA,
|
||||
reset_ivb_igd },
|
||||
{ PCI_VENDOR_ID_SAMSUNG, 0xa804, nvme_disable_and_flr },
|
||||
{ PCI_VENDOR_ID_INTEL, 0x0953, delay_250ms_after_flr },
|
||||
{ PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,
|
||||
reset_chelsio_generic_dev },
|
||||
{ 0 }
|
||||
@@ -3743,6 +3848,9 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x917a,
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c78 */
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9182,
|
||||
quirk_dma_func1_alias);
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c134 */
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9183,
|
||||
quirk_dma_func1_alias);
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=42679#c46 */
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x91a0,
|
||||
quirk_dma_func1_alias);
|
||||
|
Reference in New Issue
Block a user