diff options
author | Yong, Jonathan <jonathan.yong@intel.com> | 2016-05-10 03:15:55 +0000 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 2016-05-14 11:22:59 +0200 |
commit | 415a9c18d75a4706ca889af59e9e8ef17d77c4e1 (patch) | |
tree | 80364547b293975110bb84ec57ce0fb9e25d4e37 | |
parent | 37c9315c504f266c23d51e62e59d32422dbbe9e7 (diff) | |
download | pciutils-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.h | 1 | ||||
-rw-r--r-- | ls-ecaps.c | 62 |
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 ***/ @@ -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; |