aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong, Jonathan <jonathan.yong@intel.com>2016-05-10 03:15:55 +0000
committerMartin Mares <mj@ucw.cz>2016-05-14 11:22:59 +0200
commit415a9c18d75a4706ca889af59e9e8ef17d77c4e1 (patch)
tree80364547b293975110bb84ec57ce0fb9e25d4e37
parent37c9315c504f266c23d51e62e59d32422dbbe9e7 (diff)
downloadpciutils-415a9c18d75a4706ca889af59e9e8ef17d77c4e1.tar.gz
lspci: Decode Precision Time Measurement capabiltity
Section 7.32 Precision Time Management (or Measurement) from the PCI Express Base 3.1 specification is an optional Extended Capability for discovering and controlling the distribution of a PTM Hierarchy. Signed-off-by: Yong, Jonathan <jonathan.yong@intel.com>
-rw-r--r--lib/header.h1
-rw-r--r--ls-ecaps.c62
2 files changed, 63 insertions, 0 deletions
diff --git a/lib/header.h b/lib/header.h
index b8f7dc1..8463641 100644
--- a/lib/header.h
+++ b/lib/header.h
@@ -230,6 +230,7 @@
#define PCI_EXT_CAP_ID_LTR 0x18 /* Latency Tolerance Reporting */
#define PCI_EXT_CAP_ID_PASID 0x1b /* Process Address Space ID */
#define PCI_EXT_CAP_ID_L1PM 0x1e /* L1 PM Substates */
+#define PCI_EXT_CAP_ID_PTM 0x1f /* Precision Time Measurement */
/*** Definitions of capabilities ***/
diff --git a/ls-ecaps.c b/ls-ecaps.c
index 8298435..0273240 100644
--- a/ls-ecaps.c
+++ b/ls-ecaps.c
@@ -548,6 +548,65 @@ cap_l1pm(struct device *d, int where)
}
}
+static void
+cap_ptm(struct device *d, int where)
+{
+ u32 buff;
+ u16 clock;
+
+ printf("Precision Time Measurement\n");
+
+ if (verbose < 2)
+ return;
+
+ if (!config_fetch(d, where + 4, 8))
+ {
+ printf("\t\t<unreadable>\n");
+ return;
+ }
+
+ buff = get_conf_long(d, where + 4);
+ printf("\t\tPTMCap: ");
+ printf("Requester:%c Responder:%c Root:%c\n",
+ FLAG(buff, 0x1),
+ FLAG(buff, 0x2),
+ FLAG(buff, 0x4));
+
+ clock = BITS(buff, 8, 8);
+ printf("\t\tPTMClockGranularity: ");
+ switch (clock)
+ {
+ case 0x00:
+ printf("Unimplemented\n");
+ break;
+ case 0xff:
+ printf("Greater than 254ns\n");
+ break;
+ default:
+ printf("%huns\n", clock);
+ }
+
+ buff = get_conf_long(d, where + 8);
+ printf("\t\tPTMControl: ");
+ printf("Enabled:%c RootSelected:%c\n",
+ FLAG(buff, 0x1),
+ FLAG(buff, 0x2));
+
+ clock = BITS(buff, 8, 8);
+ printf("\t\tPTMEffectiveGranularity: ");
+ switch (clock)
+ {
+ case 0x00:
+ printf("Unknown\n");
+ break;
+ case 0xff:
+ printf("Greater than 254ns\n");
+ break;
+ default:
+ printf("%huns\n", clock);
+ }
+}
+
void
show_ext_caps(struct device *d)
{
@@ -635,6 +694,9 @@ show_ext_caps(struct device *d)
case PCI_EXT_CAP_ID_L1PM:
cap_l1pm(d, where);
break;
+ case PCI_EXT_CAP_ID_PTM:
+ cap_ptm(d, where);
+ break;
default:
printf("#%02x\n", id);
break;