All of lore.kernel.org
 help / color / mirror / Atom feed
From: "David E. Box" <david.e.box@linux.intel.com>
To: mj@ucw.cz
Cc: kristen.c.accardi@intel.com, linux-pci@vger.kernel.org,
	David Box <david.e.box@linux.intel.com>
Subject: [PATCH v3] lspci: Add L1 PM Substate capability reporting
Date: Mon, 10 Jun 2013 18:09:59 -0700	[thread overview]
Message-ID: <1370912999-11261-1-git-send-email-david.e.box@linux.intel.com> (raw)
In-Reply-To: <mj+md-20130610.130955.16386.albireo@ucw.cz>

From: David Box <david.e.box@linux.intel.com>

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>
---
v3: reformatted to match document coding style

Sample lspci -vvxxxx output showing first 8 bytes of extended config space for
the L1 Substate Capability. Cannot show more since hardware is unreleased:

00:1c.0 PCI bridge:
        Capabilities: [200 v1] L1 PM Substates
                L1SubCap: PCI-PM_L1.2+, PCI-PM_L1.1+, ASPM_L1.2+, ASPM_L1.1+, L1_PM_Substates+
                          PortCommonModeRestoreTime=40us, PortTPowerOnTime=10us
200: 1e 00 01 00 1f 28 28 00

 lib/header.h |    1 +
 ls-ecaps.c   |   55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)

diff --git a/lib/header.h b/lib/header.h
index 69518fd..6608003 100644
--- a/lib/header.h
+++ b/lib/header.h
@@ -226,6 +226,7 @@
 #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 ***/
 
diff --git a/ls-ecaps.c b/ls-ecaps.c
index 161c275..1a9b6c5 100644
--- a/ls-ecaps.c
+++ b/ls-ecaps.c
@@ -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;
-- 
1.7.10.4


  reply	other threads:[~2013-06-11  1:11 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-06 21:17 [PATCH v2] lspci: Add L1 PM Substate capability reporting David E. Box
2013-06-10 13:11 ` Martin Mares
2013-06-11  1:09   ` David E. Box [this message]
2013-06-11  7:50     ` [PATCH v3] " Martin Mares

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1370912999-11261-1-git-send-email-david.e.box@linux.intel.com \
    --to=david.e.box@linux.intel.com \
    --cc=kristen.c.accardi@intel.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=mj@ucw.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.