PCI: Decode PCIe 32 GT/s link speed
authorGustavo Pimentel <Gustavo.Pimentel@synopsys.com>
Tue, 4 Jun 2019 16:24:43 +0000 (18:24 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 13 Jun 2019 21:49:45 +0000 (16:49 -0500)
PCIe r5.0, sec 7.5.3.18, defines a new 32.0 GT/s bit in the Supported Link
Speeds Vector of Link Capabilities 2.  Decode this new speed.  This does
not affect the speed of the link, which should be negotiated automatically
by the hardware; it only adds decoding when showing the speed to the user.

Previously, reading the speed of a link operating at this speed showed
"Unknown speed" instead of "32.0 GT/s".

Link: https://lore.kernel.org/lkml/92365e3caf0fc559f9ab14bcd053bfc92d4f661c.1559664969.git.gustavo.pimentel@synopsys.com
Signed-off-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
[bhelgaas: changelog]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pci-sysfs.c
drivers/pci/pci.c
drivers/pci/probe.c
drivers/pci/slot.c
include/linux/pci.h
include/uapi/linux/pci_regs.h

index 6d27475e39b2b9ab77f95c7e7b6e3f67d2881991..d52d30448e41d35163325994fd8eb999cab6adb1 100644 (file)
@@ -182,6 +182,9 @@ static ssize_t current_link_speed_show(struct device *dev,
                return -EINVAL;
 
        switch (linkstat & PCI_EXP_LNKSTA_CLS) {
+       case PCI_EXP_LNKSTA_CLS_32_0GB:
+               speed = "32 GT/s";
+               break;
        case PCI_EXP_LNKSTA_CLS_16_0GB:
                speed = "16 GT/s";
                break;
index 8abc843b1615ecf94a24a1fc1db03dfd00d03dc5..4729a7c7a9d978f3e6a87a6a518d03a1fe1e3bca 100644 (file)
@@ -5621,7 +5621,9 @@ enum pci_bus_speed pcie_get_speed_cap(struct pci_dev *dev)
         */
        pcie_capability_read_dword(dev, PCI_EXP_LNKCAP2, &lnkcap2);
        if (lnkcap2) { /* PCIe r3.0-compliant */
-               if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_16_0GB)
+               if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_32_0GB)
+                       return PCIE_SPEED_32_0GT;
+               else if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_16_0GB)
                        return PCIE_SPEED_16_0GT;
                else if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_8_0GB)
                        return PCIE_SPEED_8_0GT;
index 0e8e2c186f508df22739534e464a37b1f3a89225..c5f27c8cd140aaf4bf457bc43c5f34484217ec17 100644 (file)
@@ -668,7 +668,7 @@ const unsigned char pcie_link_speed[] = {
        PCIE_SPEED_5_0GT,               /* 2 */
        PCIE_SPEED_8_0GT,               /* 3 */
        PCIE_SPEED_16_0GT,              /* 4 */
-       PCI_SPEED_UNKNOWN,              /* 5 */
+       PCIE_SPEED_32_0GT,              /* 5 */
        PCI_SPEED_UNKNOWN,              /* 6 */
        PCI_SPEED_UNKNOWN,              /* 7 */
        PCI_SPEED_UNKNOWN,              /* 8 */
index f4d92b1afe7b02c7ebf783826331f950a0063e9d..ae4aa0e1f2f42580b6c05fb5979fe9bf1f04a69b 100644 (file)
@@ -75,6 +75,7 @@ static const char *pci_bus_speed_strings[] = {
        "5.0 GT/s PCIe",        /* 0x15 */
        "8.0 GT/s PCIe",        /* 0x16 */
        "16.0 GT/s PCIe",       /* 0x17 */
+       "32.0 GT/s PCIe",       /* 0x18 */
 };
 
 static ssize_t bus_speed_read(enum pci_bus_speed speed, char *buf)
index 4a5a84d7bdd43edad868dc8247b8995ca478dec9..2173e6b75579eba40566ac896b00dd3f1f791ec2 100644 (file)
@@ -258,6 +258,7 @@ enum pci_bus_speed {
        PCIE_SPEED_5_0GT                = 0x15,
        PCIE_SPEED_8_0GT                = 0x16,
        PCIE_SPEED_16_0GT               = 0x17,
+       PCIE_SPEED_32_0GT               = 0x18,
        PCI_SPEED_UNKNOWN               = 0xff,
 };
 
index 27164769d18495336fa5acae66b8de878dea3cc0..f28e562d7ca8681b9a91bfd5c48142f0904789f2 100644 (file)
 #define  PCI_EXP_LNKCAP_SLS_5_0GB 0x00000002 /* LNKCAP2 SLS Vector bit 1 */
 #define  PCI_EXP_LNKCAP_SLS_8_0GB 0x00000003 /* LNKCAP2 SLS Vector bit 2 */
 #define  PCI_EXP_LNKCAP_SLS_16_0GB 0x00000004 /* LNKCAP2 SLS Vector bit 3 */
+#define  PCI_EXP_LNKCAP_SLS_32_0GB 0x00000005 /* LNKCAP2 SLS Vector bit 4 */
 #define  PCI_EXP_LNKCAP_MLW    0x000003f0 /* Maximum Link Width */
 #define  PCI_EXP_LNKCAP_ASPMS  0x00000c00 /* ASPM Support */
 #define  PCI_EXP_LNKCAP_L0SEL  0x00007000 /* L0s Exit Latency */
 #define  PCI_EXP_LNKSTA_CLS_5_0GB 0x0002 /* Current Link Speed 5.0GT/s */
 #define  PCI_EXP_LNKSTA_CLS_8_0GB 0x0003 /* Current Link Speed 8.0GT/s */
 #define  PCI_EXP_LNKSTA_CLS_16_0GB 0x0004 /* Current Link Speed 16.0GT/s */
+#define  PCI_EXP_LNKSTA_CLS_32_0GB 0x0005 /* Current Link Speed 32.0GT/s */
 #define  PCI_EXP_LNKSTA_NLW    0x03f0  /* Negotiated Link Width */
 #define  PCI_EXP_LNKSTA_NLW_X1 0x0010  /* Current Link Width x1 */
 #define  PCI_EXP_LNKSTA_NLW_X2 0x0020  /* Current Link Width x2 */
 #define  PCI_EXP_LNKCAP2_SLS_5_0GB     0x00000004 /* Supported Speed 5GT/s */
 #define  PCI_EXP_LNKCAP2_SLS_8_0GB     0x00000008 /* Supported Speed 8GT/s */
 #define  PCI_EXP_LNKCAP2_SLS_16_0GB    0x00000010 /* Supported Speed 16GT/s */
+#define  PCI_EXP_LNKCAP2_SLS_32_0GB    0x00000020 /* Supported Speed 32GT/s */
 #define  PCI_EXP_LNKCAP2_CROSSLINK     0x00000100 /* Crosslink supported */
 #define PCI_EXP_LNKCTL2                48      /* Link Control 2 */
 #define  PCI_EXP_LNKCTL2_TLS           0x000f
 #define  PCI_EXP_LNKCTL2_TLS_5_0GT     0x0002 /* Supported Speed 5GT/s */
 #define  PCI_EXP_LNKCTL2_TLS_8_0GT     0x0003 /* Supported Speed 8GT/s */
 #define  PCI_EXP_LNKCTL2_TLS_16_0GT    0x0004 /* Supported Speed 16GT/s */
+#define  PCI_EXP_LNKCTL2_TLS_32_0GT    0x0005 /* Supported Speed 32GT/s */
 #define PCI_EXP_LNKSTA2                50      /* Link Status 2 */
 #define PCI_CAP_EXP_ENDPOINT_SIZEOF_V2 52      /* v2 endpoints with link end here */
 #define PCI_EXP_SLTCAP2                52      /* Slot Capabilities 2 */