diff options
author | Gil Fine <gil.fine@intel.com> | 2021-12-17 02:16:39 +0100 |
---|---|---|
committer | Mika Westerberg <mika.westerberg@linux.intel.com> | 2021-12-22 15:13:14 +0100 |
commit | 8a90e4fa3b4d6a10c96b0a04abf57bb5a16a8f4e (patch) | |
tree | 6c827d6d67aa7d5250f9d06dc59457493a5a1ca4 /drivers/thunderbolt/usb4.c | |
parent | thunderbolt: Add TMU uni-directional mode (diff) | |
download | linux-8a90e4fa3b4d6a10c96b0a04abf57bb5a16a8f4e.tar.xz linux-8a90e4fa3b4d6a10c96b0a04abf57bb5a16a8f4e.zip |
thunderbolt: Add CL0s support for USB4 routers
In this patch we add enabling of CL0s - a low power state of the link.
Low power states (called collectively CLx) are used to reduce
transmitter and receiver power when a high-speed lane is idle. For now,
we add support only for first low power state: CL0s. We enable it, if
both sides of the link support it, and only for the first hop router.
(i.e. the first device that connected to the host router). This is
needed for better thermal management.
Signed-off-by: Gil Fine <gil.fine@intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Diffstat (limited to 'drivers/thunderbolt/usb4.c')
-rw-r--r-- | drivers/thunderbolt/usb4.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/thunderbolt/usb4.c b/drivers/thunderbolt/usb4.c index ceddbe7e9f93..a95c3e9b88cd 100644 --- a/drivers/thunderbolt/usb4.c +++ b/drivers/thunderbolt/usb4.c @@ -1386,6 +1386,26 @@ int usb4_port_enumerate_retimers(struct tb_port *port) USB4_SB_OPCODE, &val, sizeof(val)); } +/** + * usb4_port_clx_supported() - Check if CLx is supported by the link + * @port: Port to check for CLx support for + * + * PORT_CS_18_CPS bit reflects if the link supports CLx including + * active cables (if connected on the link). + */ +bool usb4_port_clx_supported(struct tb_port *port) +{ + int ret; + u32 val; + + ret = tb_port_read(port, &val, TB_CFG_PORT, + port->cap_usb4 + PORT_CS_18, 1); + if (ret) + return false; + + return !!(val & PORT_CS_18_CPS); +} + static inline int usb4_port_retimer_op(struct tb_port *port, u8 index, enum usb4_sb_opcode opcode, int timeout_msec) |