diff options
| -rw-r--r-- | usr/src/cmd/pcieadm/pcieadm_cfgspace.c | 12 | ||||
| -rw-r--r-- | usr/src/cmd/pcieb/pcieb.c | 11 | ||||
| -rw-r--r-- | usr/src/uts/common/io/pciex/pcie.c | 53 | ||||
| -rw-r--r-- | usr/src/uts/common/io/pciex/pcieb.c | 12 | ||||
| -rw-r--r-- | usr/src/uts/common/io/pciex/pcieb_ioctl.h | 3 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/pcie.h | 16 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/pcie_impl.h | 6 |
7 files changed, 103 insertions, 10 deletions
diff --git a/usr/src/cmd/pcieadm/pcieadm_cfgspace.c b/usr/src/cmd/pcieadm/pcieadm_cfgspace.c index 739c45cef5..7fc2103ce7 100644 --- a/usr/src/cmd/pcieadm/pcieadm_cfgspace.c +++ b/usr/src/cmd/pcieadm/pcieadm_cfgspace.c @@ -1412,7 +1412,7 @@ static pcieadm_regdef_t pcieadm_regdef_pcie_devsts[] = { static pcieadm_regdef_t pcieadm_regdef_pcie_linkcap[] = { { 0, 3, "maxspeed", "Maximum Link Speed", PRDV_STRVAL, .prd_val = { .prdv_strval = { NULL, "2.5 GT/s", "5.0 GT/s", - "8.0 GT/s", "16.0 GT/s", "32.0 GT/s" } } }, + "8.0 GT/s", "16.0 GT/s", "32.0 GT/s", "64.0 GT/s" } } }, { 4, 9, "maxwidth", "Maximum Link Width", PRDV_HEX }, { 10, 11, "aspm", "ASPM Support", PRDV_STRVAL, .prd_val = { .prdv_strval = { "None", "L0s", "L1", "L0s/L1" } } }, @@ -1469,7 +1469,7 @@ static pcieadm_regdef_t pcieadm_regdef_pcie_linkctl[] = { static pcieadm_regdef_t pcieadm_regdef_pcie_linksts[] = { { 0, 3, "speed", "Link Speed", PRDV_STRVAL, .prd_val = { .prdv_strval = { NULL, "2.5 GT/s", "5.0 GT/s", - "8.0 GT/s", "16.0 GT/s", "32.0 GT/s" } } }, + "8.0 GT/s", "16.0 GT/s", "32.0 GT/s", "64.0 GT/s" } } }, { 4, 9, "width", "Link Width", PRDV_HEX }, { 11, 11, "training", "Link Training", PRDV_STRVAL, .prd_val = { .prdv_strval = { "no", "yes" } } }, @@ -1678,17 +1678,17 @@ static pcieadm_regdef_t pcieadm_regdef_pcie_devsts2[] = { static pcieadm_regdef_t pcieadm_regdef_pcie_linkcap2[] = { { 1, 7, "supspeeds", "Supported Link Speeds", PRDV_BITFIELD, .prd_val = { .prdv_strval = { "2.5 GT/s", "5.0 GT/s", "8.0 GT/s", - "16.0 GT/s", "32.0 GT/s" } } }, + "16.0 GT/s", "32.0 GT/s", "64.0 GT/s" } } }, { 8, 8, "crosslink", "Crosslink", PRDV_STRVAL, .prd_val = { .prdv_strval = { "unsupported", "supported" } } }, { 9, 15, "skposgen", "Lower SKP OS Generation Supported Speeds Vector", PRDV_BITFIELD, .prd_val = { .prdv_strval = { "2.5 GT/s", "5.0 GT/s", "8.0 GT/s", - "16.0 GT/s", "32.0 GT/s" } } }, + "16.0 GT/s", "32.0 GT/s", "64.0 GT/s" } } }, { 16, 22, "skposrecv", "Lower SKP OS Reception Supported Speeds Vector", PRDV_BITFIELD, .prd_val = { .prdv_strval = { "2.5 GT/s", "5.0 GT/s", "8.0 GT/s", - "16.0 GT/s", "32.0 GT/s" } } }, + "16.0 GT/s", "32.0 GT/s", "64.0 GT/s" } } }, { 23, 23, "retimedet", "Retimer Presence Detect Supported", PRDV_STRVAL, .prd_val = { .prdv_strval = { "unsupported", "supported" } } }, { 24, 24, "retime2det", "Two Retimers Presence Detect Supported", @@ -1702,7 +1702,7 @@ static pcieadm_regdef_t pcieadm_regdef_pcie_linkcap2[] = { static pcieadm_regdef_t pcieadm_regdef_pcie_linkctl2[] = { { 0, 3, "targspeed", "Target Link Speed", PRDV_STRVAL, .prd_val = { .prdv_strval = { NULL, "2.5 GT/s", "5.0 GT/s", - "8.0 GT/s", "16.0 GT/s", "32.0 GT/s" } } }, + "8.0 GT/s", "16.0 GT/s", "32.0 GT/s", "64.0 GT/s" } } }, { 4, 4, "comp", "Enter Compliance", PRDV_STRVAL, .prd_val = { .prdv_strval = { "no", "yes" } } }, { 5, 5, "hwautosp", "Hardware Autonomous Speed Disable", PRDV_STRVAL, diff --git a/usr/src/cmd/pcieb/pcieb.c b/usr/src/cmd/pcieb/pcieb.c index 0c829e8a51..70b71704e0 100644 --- a/usr/src/cmd/pcieb/pcieb.c +++ b/usr/src/cmd/pcieb/pcieb.c @@ -11,6 +11,7 @@ /* * Copyright 2019 Joyent, Inc. + * Copyright 2022 Oxide Computer Company */ /* @@ -64,6 +65,10 @@ pcieb_parse_speed(const char *s) return (PCIEB_LINK_SPEED_GEN3); } else if (strcasecmp(s, "16") == 0 || strcasecmp(s, "gen4") == 0) { return (PCIEB_LINK_SPEED_GEN4); + } else if (strcasecmp(s, "32") == 0 || strcasecmp(s, "gen5") == 0) { + return (PCIEB_LINK_SPEED_GEN5); + } else if (strcasecmp(s, "64") == 0 || strcasecmp(s, "gen6") == 0) { + return (PCIEB_LINK_SPEED_GEN6); } else { errx(EXIT_FAILURE, "invalid speed: %s", s); } @@ -153,6 +158,12 @@ main(int argc, char *argv[]) case PCIEB_LINK_SPEED_GEN4: (void) printf("16.0 GT/s (gen4)\n"); break; + case PCIEB_LINK_SPEED_GEN5: + (void) printf("32.0 GT/s (gen5)\n"); + break; + case PCIEB_LINK_SPEED_GEN6: + (void) printf("64.0 GT/s (gen6)\n"); + break; default: (void) printf("Unknown Value: 0x%x\n", pits.pits_speed); } diff --git a/usr/src/uts/common/io/pciex/pcie.c b/usr/src/uts/common/io/pciex/pcie.c index c40055809a..acf2e3880c 100644 --- a/usr/src/uts/common/io/pciex/pcie.c +++ b/usr/src/uts/common/io/pciex/pcie.c @@ -1538,6 +1538,10 @@ pcie_speed_to_int(pcie_link_speed_t speed) return (8000000000LL); case PCIE_LINK_SPEED_16: return (16000000000LL); + case PCIE_LINK_SPEED_32: + return (32000000000LL); + case PCIE_LINK_SPEED_64: + return (64000000000LL); default: return (0); } @@ -1585,7 +1589,7 @@ pcie_speeds_to_devinfo(dev_info_t *dip, pcie_bus_t *bus_p) } if (bus_p->bus_sup_speed != PCIE_LINK_SPEED_UNKNOWN) { - int64_t speeds[4]; + int64_t speeds[PCIE_NSPEEDS]; uint_t nspeeds = 0; if (bus_p->bus_sup_speed & PCIE_LINK_SPEED_2_5) { @@ -1608,6 +1612,16 @@ pcie_speeds_to_devinfo(dev_info_t *dip, pcie_bus_t *bus_p) pcie_speed_to_int(PCIE_LINK_SPEED_16); } + if (bus_p->bus_sup_speed & PCIE_LINK_SPEED_32) { + speeds[nspeeds++] = + pcie_speed_to_int(PCIE_LINK_SPEED_32); + } + + if (bus_p->bus_sup_speed & PCIE_LINK_SPEED_64) { + speeds[nspeeds++] = + pcie_speed_to_int(PCIE_LINK_SPEED_64); + } + (void) ndi_prop_update_int64_array(DDI_DEV_T_NONE, dip, "pcie-link-supported-speeds", speeds, nspeeds); } @@ -1706,6 +1720,12 @@ pcie_capture_speeds(dev_info_t *dip) case PCIE_LINKSTS_SPEED_16: bus_p->bus_cur_speed = PCIE_LINK_SPEED_16; break; + case PCIE_LINKSTS_SPEED_32: + bus_p->bus_cur_speed = PCIE_LINK_SPEED_32; + break; + case PCIE_LINKSTS_SPEED_64: + bus_p->bus_cur_speed = PCIE_LINK_SPEED_64; + break; default: bus_p->bus_cur_speed = PCIE_LINK_SPEED_UNKNOWN; break; @@ -1782,6 +1802,10 @@ pcie_capture_speeds(dev_info_t *dip) bus_p->bus_sup_speed |= PCIE_LINK_SPEED_8; if (cap2 & PCIE_LINKCAP2_SPEED_16) bus_p->bus_sup_speed |= PCIE_LINK_SPEED_16; + if (cap2 & PCIE_LINKCAP2_SPEED_32) + bus_p->bus_sup_speed |= PCIE_LINK_SPEED_32; + if (cap2 & PCIE_LINKCAP2_SPEED_64) + bus_p->bus_sup_speed |= PCIE_LINK_SPEED_64; switch (cap & PCIE_LINKCAP_MAX_SPEED_MASK) { case PCIE_LINKCAP_MAX_SPEED_2_5: @@ -1796,6 +1820,12 @@ pcie_capture_speeds(dev_info_t *dip) case PCIE_LINKCAP_MAX_SPEED_16: bus_p->bus_max_speed = PCIE_LINK_SPEED_16; break; + case PCIE_LINKCAP_MAX_SPEED_32: + bus_p->bus_max_speed = PCIE_LINK_SPEED_32; + break; + case PCIE_LINKCAP_MAX_SPEED_64: + bus_p->bus_max_speed = PCIE_LINK_SPEED_64; + break; default: bus_p->bus_max_speed = PCIE_LINK_SPEED_UNKNOWN; break; @@ -1824,6 +1854,12 @@ pcie_capture_speeds(dev_info_t *dip) case PCIE_LINKCTL2_TARGET_SPEED_16: bus_p->bus_target_speed = PCIE_LINK_SPEED_16; break; + case PCIE_LINKCTL2_TARGET_SPEED_32: + bus_p->bus_target_speed = PCIE_LINK_SPEED_32; + break; + case PCIE_LINKCTL2_TARGET_SPEED_64: + bus_p->bus_target_speed = PCIE_LINK_SPEED_64; + break; default: bus_p->bus_target_speed = PCIE_LINK_SPEED_UNKNOWN; break; @@ -3399,6 +3435,10 @@ pcie_link_set_target(dev_info_t *dip, pcie_link_speed_t speed) return (ENOTSUP); } + if (bus_p->bus_pcie_vers < 2) { + return (ENOTSUP); + } + switch (speed) { case PCIE_LINK_SPEED_2_5: rval = PCIE_LINKCTL2_TARGET_SPEED_2_5; @@ -3412,11 +3452,22 @@ pcie_link_set_target(dev_info_t *dip, pcie_link_speed_t speed) case PCIE_LINK_SPEED_16: rval = PCIE_LINKCTL2_TARGET_SPEED_16; break; + case PCIE_LINK_SPEED_32: + rval = PCIE_LINKCTL2_TARGET_SPEED_32; + break; + case PCIE_LINK_SPEED_64: + rval = PCIE_LINKCTL2_TARGET_SPEED_64; + break; default: return (EINVAL); } mutex_enter(&bus_p->bus_speed_mutex); + if ((bus_p->bus_sup_speed & speed) == 0) { + mutex_exit(&bus_p->bus_speed_mutex); + return (ENOTSUP); + } + bus_p->bus_target_speed = speed; bus_p->bus_speed_flags |= PCIE_LINK_F_ADMIN_TARGET; diff --git a/usr/src/uts/common/io/pciex/pcieb.c b/usr/src/uts/common/io/pciex/pcieb.c index 8ca85e6543..513b6dae3b 100644 --- a/usr/src/uts/common/io/pciex/pcieb.c +++ b/usr/src/uts/common/io/pciex/pcieb.c @@ -1546,6 +1546,12 @@ pcieb_ioctl_get_speed(pcieb_devstate_t *pcieb, intptr_t arg, int mode, case PCIE_LINK_SPEED_16: pits.pits_speed = PCIEB_LINK_SPEED_GEN4; break; + case PCIE_LINK_SPEED_32: + pits.pits_speed = PCIEB_LINK_SPEED_GEN5; + break; + case PCIE_LINK_SPEED_64: + pits.pits_speed = PCIEB_LINK_SPEED_GEN6; + break; default: pits.pits_speed = PCIEB_LINK_SPEED_UNKNOWN; break; @@ -1602,6 +1608,12 @@ pcieb_ioctl_set_speed(pcieb_devstate_t *pcieb, intptr_t arg, int mode, case PCIEB_LINK_SPEED_GEN4: speed = PCIE_LINK_SPEED_16; break; + case PCIEB_LINK_SPEED_GEN5: + speed = PCIE_LINK_SPEED_32; + break; + case PCIEB_LINK_SPEED_GEN6: + speed = PCIE_LINK_SPEED_64; + break; default: return (EINVAL); } diff --git a/usr/src/uts/common/io/pciex/pcieb_ioctl.h b/usr/src/uts/common/io/pciex/pcieb_ioctl.h index 40134037a4..cb39a53a11 100644 --- a/usr/src/uts/common/io/pciex/pcieb_ioctl.h +++ b/usr/src/uts/common/io/pciex/pcieb_ioctl.h @@ -11,6 +11,7 @@ /* * Copyright 2019 Joyent, Inc. + * Copyright 2022 Oxide Computer Company */ #ifndef _IO_PCIE_PCIEB_IOCTL_H @@ -56,6 +57,8 @@ typedef struct pcieb_ioctl_target_speed { #define PCIEB_LINK_SPEED_GEN2 0x02 #define PCIEB_LINK_SPEED_GEN3 0x03 #define PCIEB_LINK_SPEED_GEN4 0x04 +#define PCIEB_LINK_SPEED_GEN5 0x05 +#define PCIEB_LINK_SPEED_GEN6 0x06 #ifdef __cplusplus } diff --git a/usr/src/uts/common/sys/pcie.h b/usr/src/uts/common/sys/pcie.h index 751fb449e0..1889b98e47 100644 --- a/usr/src/uts/common/sys/pcie.h +++ b/usr/src/uts/common/sys/pcie.h @@ -205,11 +205,13 @@ extern "C" { /* * In version 2 of PCI express, this indicated that both 5.0 GT/s and 2.5 GT/s * speeds were supported. The use of this as the maximum link speed was added - * with PCIex v3. + * with PCIe v3. */ #define PCIE_LINKCAP_MAX_SPEED_5 0x2 /* 5.0 GT/s Speed */ #define PCIE_LINKCAP_MAX_SPEED_8 0x3 /* 8.0 GT/s Speed */ #define PCIE_LINKCAP_MAX_SPEED_16 0x4 /* 16.0 GT/s Speed */ +#define PCIE_LINKCAP_MAX_SPEED_32 0x5 /* 32.0 GT/s Speed */ +#define PCIE_LINKCAP_MAX_SPEED_64 0x6 /* 64.0 GT/s Speed */ #define PCIE_LINKCAP_MAX_SPEED_MASK 0xF /* Maximum Link Speed */ #define PCIE_LINKCAP_MAX_WIDTH_X1 0x010 #define PCIE_LINKCAP_MAX_WIDTH_X2 0x020 @@ -290,6 +292,8 @@ extern "C" { #define PCIE_LINKSTS_SPEED_5 0x2 /* 5.0 GT/s Link Speed */ #define PCIE_LINKSTS_SPEED_8 0x3 /* 8.0 GT/s Link Speed */ #define PCIE_LINKSTS_SPEED_16 0x4 /* 16.0 GT/s Link Speed */ +#define PCIE_LINKSTS_SPEED_32 0x5 /* 32.0 GT/s Link Speed */ +#define PCIE_LINKSTS_SPEED_64 0x6 /* 64.0 GT/s Link Speed */ #define PCIE_LINKSTS_SPEED_MASK 0xF /* Link Speed */ #define PCIE_LINKSTS_NEG_WIDTH_X1 0x010 @@ -470,12 +474,14 @@ extern "C" { /* - * Link Capability 2 Register (4 bytes) + * Link Capabilities 2 Register (4 bytes) */ #define PCIE_LINKCAP2_SPEED_2_5 0x02 #define PCIE_LINKCAP2_SPEED_5 0x04 #define PCIE_LINKCAP2_SPEED_8 0x08 #define PCIE_LINKCAP2_SPEED_16 0x10 +#define PCIE_LINKCAP2_SPEED_32 0x20 +#define PCIE_LINKCAP2_SPEED_64 0x40 #define PCIE_LINKCAP2_SPEED_MASK 0xfe #define PCIE_LINKCAP2_CROSSLINK 0x100 #define PCIE_LINKCAP2_LSKP_OSGSS_MASK 0xfe00 @@ -483,11 +489,15 @@ extern "C" { #define PCIE_LINKCAP2_LKSP_OSGSS_5 0x0400 #define PCIE_LINKCAP2_LKSP_OSGSS_8 0x0800 #define PCIE_LINKCAP2_LKSP_OSGSS_16 0x1000 +#define PCIE_LINKCAP2_LKSP_OSGSS_32 0x2000 +#define PCIE_LINKCAP2_LKSP_OSGSS_64 0x4000 #define PCIE_LINKCAP2_LKSP_OSRSS_MASK 0x7f0000 #define PCIE_LINKCAP2_LKSP_OSRSS_2_5 0x010000 #define PCIE_LINKCAP2_LKSP_OSRSS_5 0x020000 #define PCIE_LINKCAP2_LKSP_OSRSS_8 0x040000 #define PCIE_LINKCAP2_LKSP_OSRSS_16 0x080000 +#define PCIE_LINKCAP2_LKSP_OSRSS_32 0x100000 +#define PCIE_LINKCAP2_LKSP_OSRSS_64 0x200000 #define PCIE_LINKCAP2_RTPD_SUP 0x800000 #define PCIE_LINKCAP2_TRTPD_SUP 0x01000000 #define PCIE_LINKCAP2_DRS 0x80000000 @@ -500,6 +510,8 @@ extern "C" { #define PCIE_LINKCTL2_TARGET_SPEED_5 0x2 /* 5.0 GT/s Speed */ #define PCIE_LINKCTL2_TARGET_SPEED_8 0x3 /* 8.0 GT/s Speed */ #define PCIE_LINKCTL2_TARGET_SPEED_16 0x4 /* 16.0 GT/s Speed */ +#define PCIE_LINKCTL2_TARGET_SPEED_32 0x5 /* 32.0 GT/s Speed */ +#define PCIE_LINKCTL2_TARGET_SPEED_64 0x6 /* 64.0 GT/s Speed */ #define PCIE_LINKCTL2_TARGET_SPEED_MASK 0x000f #define PICE_LINKCTL2_ENTER_COMPLIANCE 0x0010 #define PCIE_LINKCTL2_HW_AUTO_SPEED_DIS 0x0020 diff --git a/usr/src/uts/common/sys/pcie_impl.h b/usr/src/uts/common/sys/pcie_impl.h index 501d9839b0..5e18952cbf 100644 --- a/usr/src/uts/common/sys/pcie_impl.h +++ b/usr/src/uts/common/sys/pcie_impl.h @@ -317,9 +317,13 @@ typedef enum pcie_link_speed { PCIE_LINK_SPEED_2_5 = 1 << 0, PCIE_LINK_SPEED_5 = 1 << 1, PCIE_LINK_SPEED_8 = 1 << 2, - PCIE_LINK_SPEED_16 = 1 << 3 + PCIE_LINK_SPEED_16 = 1 << 3, + PCIE_LINK_SPEED_32 = 1 << 4, + PCIE_LINK_SPEED_64 = 1 << 5 } pcie_link_speed_t; +#define PCIE_NSPEEDS 6 + typedef enum pcie_link_flags { PCIE_LINK_F_ADMIN_TARGET = 1 << 1 } pcie_link_flags_t; |
