Commit 503fa236 authored by Maciej W. Rozycki's avatar Maciej W. Rozycki Committed by Bjorn Helgaas

PCI: Access Link 2 registers only for devices with Links

PCIe r2.0, sec 7.8 added Link Capabilities/Status/Control 2 registers to
the PCIe Capability with Capability Version 2.

Previously we assumed these registers were implemented for all PCIe
Capabilities of version 2 or greater, but in fact they are only
implemented for devices with Links.

Update pcie_capability_reg_implemented() to check whether the device has
a Link.

[bhelgaas: commit log, squash export]
Link: https://lore.kernel.org/r/alpine.DEB.2.21.2209100057070.2275@angie.orcam.me.uk
Link: https://lore.kernel.org/r/alpine.DEB.2.21.2209100057300.2275@angie.orcam.me.ukSigned-off-by: default avatarMaciej W. Rozycki <macro@orcam.me.uk>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 9abf2313
...@@ -350,6 +350,11 @@ bool pcie_cap_has_lnkctl(const struct pci_dev *dev) ...@@ -350,6 +350,11 @@ bool pcie_cap_has_lnkctl(const struct pci_dev *dev)
type == PCI_EXP_TYPE_PCIE_BRIDGE; type == PCI_EXP_TYPE_PCIE_BRIDGE;
} }
bool pcie_cap_has_lnkctl2(const struct pci_dev *dev)
{
return pcie_cap_has_lnkctl(dev) && pcie_cap_version(dev) > 1;
}
static inline bool pcie_cap_has_sltctl(const struct pci_dev *dev) static inline bool pcie_cap_has_sltctl(const struct pci_dev *dev)
{ {
return pcie_downstream_port(dev) && return pcie_downstream_port(dev) &&
...@@ -390,10 +395,11 @@ static bool pcie_capability_reg_implemented(struct pci_dev *dev, int pos) ...@@ -390,10 +395,11 @@ static bool pcie_capability_reg_implemented(struct pci_dev *dev, int pos)
return pcie_cap_has_rtctl(dev); return pcie_cap_has_rtctl(dev);
case PCI_EXP_DEVCAP2: case PCI_EXP_DEVCAP2:
case PCI_EXP_DEVCTL2: case PCI_EXP_DEVCTL2:
return pcie_cap_version(dev) > 1;
case PCI_EXP_LNKCAP2: case PCI_EXP_LNKCAP2:
case PCI_EXP_LNKCTL2: case PCI_EXP_LNKCTL2:
case PCI_EXP_LNKSTA2: case PCI_EXP_LNKSTA2:
return pcie_cap_version(dev) > 1; return pcie_cap_has_lnkctl2(dev);
default: default:
return false; return false;
} }
......
...@@ -15,6 +15,7 @@ extern const unsigned char pcie_link_speed[]; ...@@ -15,6 +15,7 @@ extern const unsigned char pcie_link_speed[];
extern bool pci_early_dump; extern bool pci_early_dump;
bool pcie_cap_has_lnkctl(const struct pci_dev *dev); bool pcie_cap_has_lnkctl(const struct pci_dev *dev);
bool pcie_cap_has_lnkctl2(const struct pci_dev *dev);
bool pcie_cap_has_rtctl(const struct pci_dev *dev); bool pcie_cap_has_rtctl(const struct pci_dev *dev);
/* Functions internal to the PCI core code */ /* Functions internal to the PCI core code */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment