diff options
author | Lennert Buytenhek <buytenh@wantstofly.org> | 2021-12-24 10:48:01 +0200 |
---|---|---|
committer | Martin Mareš <mj@ucw.cz> | 2021-12-28 15:59:32 +0100 |
commit | ad1401686f184e044d03fb47d6c48edc519ed628 (patch) | |
tree | c336344c6c5424ad8a99f6c590701c1211fdb9d6 | |
parent | d1b22bb0da0b5862565a797bc3b3f641f53a002c (diff) | |
download | pciutils-ad1401686f184e044d03fb47d6c48edc519ed628.tar.gz |
Add PCIe 3.0+ decoding of the LnkCtl2 Compliance Preset/De-emphasis field
As of PCIe 3.0, the LnkCtl2 "Compliance De-emphasis" field has been
renamed to "Compliance Preset/De-emphasis", and there are several new
bit encodings for various de-emphasis and preshoot combinations.
The name of the PCI_EXP_LNKCTL2_COM_DEEMPHASIS() macro is not changed
by this commit, as it is part of the libpci API.
Reported-by: Tim CC Chen(陳志佳) <Tim.CC.Chen@wnc.com.tw>
Signed-off-by: Lennert Buytenhek <buytenh@arista.com>
-rw-r--r-- | lib/header.h | 2 | ||||
-rw-r--r-- | ls-caps.c | 33 |
2 files changed, 32 insertions, 3 deletions
diff --git a/lib/header.h b/lib/header.h index 170e5c1..d4b40aa 100644 --- a/lib/header.h +++ b/lib/header.h @@ -917,7 +917,7 @@ #define PCI_EXP_LNKCTL2_MARGIN(x) (((x) >> 7) & 7) /* Transmit Margin */ #define PCI_EXP_LNKCTL2_MOD_CMPLNC 0x0400 /* Enter Modified Compliance */ #define PCI_EXP_LNKCTL2_CMPLNC_SOS 0x0800 /* Compliance SOS */ -#define PCI_EXP_LNKCTL2_COM_DEEMPHASIS(x) (((x) >> 12) & 0xf) /* Compliance De-emphasis */ +#define PCI_EXP_LNKCTL2_COM_DEEMPHASIS(x) (((x) >> 12) & 0xf) /* Compliance Preset/De-emphasis */ #define PCI_EXP_LNKSTA2 0x32 /* Link Status */ #define PCI_EXP_LINKSTA2_DEEMPHASIS(x) ((x) & 1) /* Current De-emphasis Level */ #define PCI_EXP_LINKSTA2_EQU_COMP 0x02 /* Equalization Complete */ @@ -1233,6 +1233,35 @@ static const char *cap_express_link2_deemphasis(int type) } } +static const char *cap_express_link2_compliance_preset(int type) +{ + switch (type) + { + case 0: + return "-6dB de-emphasis, 0dB preshoot"; + case 1: + return "-3.5dB de-emphasis, 0dB preshoot"; + case 2: + return "-4.4dB de-emphasis, 0dB preshoot"; + case 3: + return "-2.5dB de-emphasis, 0dB preshoot"; + case 4: + return "0dB de-emphasis, 0dB preshoot"; + case 5: + return "0dB de-emphasis, 1.9dB preshoot"; + case 6: + return "0dB de-emphasis, 2.5dB preshoot"; + case 7: + return "-6.0dB de-emphasis, 3.5dB preshoot"; + case 8: + return "-3.5dB de-emphasis, 3.5dB preshoot"; + case 9: + return "0dB de-emphasis, 3.5dB preshoot"; + default: + return "Unknown"; + } +} + static const char *cap_express_link2_transmargin(int type) { switch (type) @@ -1314,11 +1343,11 @@ static void cap_express_link2(struct device *d, int where, int type) cap_express_link2_deemphasis(PCI_EXP_LNKCTL2_DEEMPHASIS(w))); printf("\n" "\t\t\t Transmit Margin: %s, EnterModifiedCompliance%c ComplianceSOS%c\n" - "\t\t\t Compliance De-emphasis: %s\n", + "\t\t\t Compliance Preset/De-emphasis: %s\n", cap_express_link2_transmargin(PCI_EXP_LNKCTL2_MARGIN(w)), FLAG(w, PCI_EXP_LNKCTL2_MOD_CMPLNC), FLAG(w, PCI_EXP_LNKCTL2_CMPLNC_SOS), - cap_express_link2_deemphasis(PCI_EXP_LNKCTL2_COM_DEEMPHASIS(w))); + cap_express_link2_compliance_preset(PCI_EXP_LNKCTL2_COM_DEEMPHASIS(w))); } w = get_conf_word(d, where + PCI_EXP_LNKSTA2); |