thunderbolt: Disable LTTPR on Intel Titan Ridge
authorMika Westerberg <mika.westerberg@linux.intel.com>
Wed, 27 Oct 2021 10:29:09 +0000 (13:29 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Wed, 2 Feb 2022 10:56:38 +0000 (13:56 +0300)
Intel Titan Ridge does not disable AUX timers when it gets SET_CONFIG
with SET_LTTPR_MODE set which makes DP tunneling to fail. For this
reason disable LTTPR on Titan Ridge device side.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/tb_regs.h
drivers/thunderbolt/tunnel.c

index a74f487..9693a6e 100644 (file)
@@ -389,6 +389,7 @@ struct tb_regs_port_header {
 #define DP_COMMON_CAP_1_LANE                   0x0
 #define DP_COMMON_CAP_2_LANES                  0x1
 #define DP_COMMON_CAP_4_LANES                  0x2
+#define DP_COMMON_CAP_LTTPR_NS                 BIT(27)
 #define DP_COMMON_CAP_DPRX_DONE                        BIT(31)
 
 /* PCIe adapter registers */
index a473cc7..118742e 100644 (file)
@@ -580,6 +580,16 @@ static int tb_dp_xchg_caps(struct tb_tunnel *tunnel)
                out_dp_cap = tb_dp_cap_set_lanes(out_dp_cap, new_lanes);
        }
 
+       /*
+        * Titan Ridge does not disable AUX timers when it gets
+        * SET_CONFIG with SET_LTTPR_MODE set. This causes problems with
+        * DP tunneling.
+        */
+       if (tb_route(out->sw) && tb_switch_is_titan_ridge(out->sw)) {
+               out_dp_cap |= DP_COMMON_CAP_LTTPR_NS;
+               tb_port_dbg(out, "disabling LTTPR\n");
+       }
+
        return tb_port_write(in, &out_dp_cap, TB_CFG_PORT,
                             in->cap_adap + DP_REMOTE_CAP, 1);
 }