]> git.ipfire.org Git - thirdparty/pciutils.git/commitdiff
lspci: Add L1 PM Substate capability reporting
authorDavid Box <david.e.box@linux.intel.com>
Tue, 11 Jun 2013 01:09:59 +0000 (18:09 -0700)
committerMartin Mares <mj@ucw.cz>
Tue, 11 Jun 2013 07:35:17 +0000 (09:35 +0200)
Expose available L1 substate capabilities that can enable lower power
consumption when a PCIe Link is idle.

Signed-off-by: David Box <david.e.box@linux.intel.com>
lib/header.h
ls-ecaps.c

index 69518fd838b6326f2ba3d137d040cf5123de659a..660800375fcbd539fc033161fd5ae29c9b792ef6 100644 (file)
 #define PCI_EXT_CAP_ID_SRIOV   0x10    /* Single Root I/O Virtualization */
 #define PCI_EXT_CAP_ID_TPH     0x17    /* Transaction processing hints */
 #define PCI_EXT_CAP_ID_LTR     0x18    /* Latency Tolerance Reporting */
+#define PCI_EXT_CAP_ID_L1PM    0x1e    /* L1 PM Substates */
 
 /*** Definitions of capabilities ***/
 
index 161c2753c3f20bfcef92dc6ab53ede83fd48eca1..1a9b6c5a2c2632f540a4333c5742718f2fdf63d5 100644 (file)
@@ -448,6 +448,58 @@ cap_evendor(struct device *d, int where)
     BITS(hdr, 20, 12));
 }
 
+static void
+cap_l1pm(struct device *d, int where)
+{
+  u32 l1_cap;
+  int power_on_scale;
+
+  printf("L1 PM Substates\n");
+
+  if (verbose < 2)
+    return;
+
+  if (!config_fetch(d, where + 4, 4))
+    {
+      printf("\t\t<unreadable>\n");
+      return;
+    }
+
+  l1_cap = get_conf_long(d, where + 4);
+  printf("\t\tL1SubCap: ");
+  printf("PCI-PM_L1.2%c, PCI-PM_L1.1%c, ASPM_L1.2%c, ASPM_L1.1%c, L1_PM_Substates%c\n",
+    FLAG(l1_cap, 1),
+    FLAG(l1_cap, 2),
+    FLAG(l1_cap, 4),
+    FLAG(l1_cap, 8),
+    FLAG(l1_cap, 16));
+
+  if (BITS(l1_cap, 0, 1) || BITS(l1_cap, 2, 1))
+    {
+      printf("\t\t\t  PortCommonModeRestoreTime=%dus, ",
+       BITS(l1_cap, 8,8));
+
+      power_on_scale = BITS(l1_cap, 16, 2);
+
+      printf("PortTPowerOnTime=");
+      switch (power_on_scale)
+       {
+         case 0:
+           printf("%dus\n", BITS(l1_cap, 19, 5) * 2);
+           break;
+         case 1:
+           printf("%dus\n", BITS(l1_cap, 19, 5) * 10);
+           break;
+         case 2:
+           printf("%dus\n", BITS(l1_cap, 19, 5) * 100);
+           break;
+         default:
+           printf("<error>\n");
+           break;
+       }
+    }
+}
+
 void
 show_ext_caps(struct device *d)
 {
@@ -526,6 +578,9 @@ show_ext_caps(struct device *d)
          case PCI_EXT_CAP_ID_LTR:
            cap_ltr(d, where);
            break;
+         case PCI_EXT_CAP_ID_L1PM:
+           cap_l1pm(d, where);
+           break;
          default:
            printf("#%02x\n", id);
            break;