xref: /openbmc/linux/drivers/thunderbolt/tmu.c (revision 17e5530a)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Thunderbolt Time Management Unit (TMU) support
4  *
5  * Copyright (C) 2019, Intel Corporation
6  * Authors: Mika Westerberg <mika.westerberg@linux.intel.com>
7  *	    Rajmohan Mani <rajmohan.mani@intel.com>
8  */
9 
10 #include <linux/delay.h>
11 
12 #include "tb.h"
13 
14 static const unsigned int tmu_rates[] = {
15 	[TB_SWITCH_TMU_MODE_OFF] = 0,
16 	[TB_SWITCH_TMU_MODE_LOWRES] = 1000,
17 	[TB_SWITCH_TMU_MODE_HIFI_UNI] = 16,
18 	[TB_SWITCH_TMU_MODE_HIFI_BI] = 16,
19 	[TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI] = 16,
20 };
21 
22 static const struct {
23 	unsigned int freq_meas_window;
24 	unsigned int avg_const;
25 	unsigned int delta_avg_const;
26 	unsigned int repl_timeout;
27 	unsigned int repl_threshold;
28 	unsigned int repl_n;
29 	unsigned int dirswitch_n;
30 } tmu_params[] = {
31 	[TB_SWITCH_TMU_MODE_OFF] = { },
32 	[TB_SWITCH_TMU_MODE_LOWRES] = { 30, 4, },
33 	[TB_SWITCH_TMU_MODE_HIFI_UNI] = { 800, 8, },
34 	[TB_SWITCH_TMU_MODE_HIFI_BI] = { 800, 8, },
35 	[TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI] = {
36 		800, 4, 0, 3125, 25, 128, 255,
37 	},
38 };
39 
40 static const char *tmu_mode_name(enum tb_switch_tmu_mode mode)
41 {
42 	switch (mode) {
43 	case TB_SWITCH_TMU_MODE_OFF:
44 		return "off";
45 	case TB_SWITCH_TMU_MODE_LOWRES:
46 		return "uni-directional, LowRes";
47 	case TB_SWITCH_TMU_MODE_HIFI_UNI:
48 		return "uni-directional, HiFi";
49 	case TB_SWITCH_TMU_MODE_HIFI_BI:
50 		return "bi-directional, HiFi";
51 	case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI:
52 		return "enhanced uni-directional, MedRes";
53 	default:
54 		return "unknown";
55 	}
56 }
57 
58 static bool tb_switch_tmu_enhanced_is_supported(const struct tb_switch *sw)
59 {
60 	return usb4_switch_version(sw) > 1;
61 }
62 
63 static int tb_switch_set_tmu_mode_params(struct tb_switch *sw,
64 					 enum tb_switch_tmu_mode mode)
65 {
66 	u32 freq, avg, val;
67 	int ret;
68 
69 	freq = tmu_params[mode].freq_meas_window;
70 	avg = tmu_params[mode].avg_const;
71 
72 	ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
73 			 sw->tmu.cap + TMU_RTR_CS_0, 1);
74 	if (ret)
75 		return ret;
76 
77 	val &= ~TMU_RTR_CS_0_FREQ_WIND_MASK;
78 	val |= FIELD_PREP(TMU_RTR_CS_0_FREQ_WIND_MASK, freq);
79 
80 	ret = tb_sw_write(sw, &val, TB_CFG_SWITCH,
81 			  sw->tmu.cap + TMU_RTR_CS_0, 1);
82 	if (ret)
83 		return ret;
84 
85 	ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
86 			 sw->tmu.cap + TMU_RTR_CS_15, 1);
87 	if (ret)
88 		return ret;
89 
90 	val &= ~TMU_RTR_CS_15_FREQ_AVG_MASK &
91 		~TMU_RTR_CS_15_DELAY_AVG_MASK &
92 		~TMU_RTR_CS_15_OFFSET_AVG_MASK &
93 		~TMU_RTR_CS_15_ERROR_AVG_MASK;
94 	val |=  FIELD_PREP(TMU_RTR_CS_15_FREQ_AVG_MASK, avg) |
95 		FIELD_PREP(TMU_RTR_CS_15_DELAY_AVG_MASK, avg) |
96 		FIELD_PREP(TMU_RTR_CS_15_OFFSET_AVG_MASK, avg) |
97 		FIELD_PREP(TMU_RTR_CS_15_ERROR_AVG_MASK, avg);
98 
99 	ret = tb_sw_write(sw, &val, TB_CFG_SWITCH,
100 			 sw->tmu.cap + TMU_RTR_CS_15, 1);
101 	if (ret)
102 		return ret;
103 
104 	if (tb_switch_tmu_enhanced_is_supported(sw)) {
105 		u32 delta_avg = tmu_params[mode].delta_avg_const;
106 
107 		ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
108 				 sw->tmu.cap + TMU_RTR_CS_18, 1);
109 		if (ret)
110 			return ret;
111 
112 		val &= ~TMU_RTR_CS_18_DELTA_AVG_CONST_MASK;
113 		val |= FIELD_PREP(TMU_RTR_CS_18_DELTA_AVG_CONST_MASK, delta_avg);
114 
115 		ret = tb_sw_write(sw, &val, TB_CFG_SWITCH,
116 				  sw->tmu.cap + TMU_RTR_CS_18, 1);
117 	}
118 
119 	return ret;
120 }
121 
122 static bool tb_switch_tmu_ucap_is_supported(struct tb_switch *sw)
123 {
124 	int ret;
125 	u32 val;
126 
127 	ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
128 			 sw->tmu.cap + TMU_RTR_CS_0, 1);
129 	if (ret)
130 		return false;
131 
132 	return !!(val & TMU_RTR_CS_0_UCAP);
133 }
134 
135 static int tb_switch_tmu_rate_read(struct tb_switch *sw)
136 {
137 	int ret;
138 	u32 val;
139 
140 	ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
141 			 sw->tmu.cap + TMU_RTR_CS_3, 1);
142 	if (ret)
143 		return ret;
144 
145 	val >>= TMU_RTR_CS_3_TS_PACKET_INTERVAL_SHIFT;
146 	return val;
147 }
148 
149 static int tb_switch_tmu_rate_write(struct tb_switch *sw, int rate)
150 {
151 	int ret;
152 	u32 val;
153 
154 	ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
155 			 sw->tmu.cap + TMU_RTR_CS_3, 1);
156 	if (ret)
157 		return ret;
158 
159 	val &= ~TMU_RTR_CS_3_TS_PACKET_INTERVAL_MASK;
160 	val |= rate << TMU_RTR_CS_3_TS_PACKET_INTERVAL_SHIFT;
161 
162 	return tb_sw_write(sw, &val, TB_CFG_SWITCH,
163 			   sw->tmu.cap + TMU_RTR_CS_3, 1);
164 }
165 
166 static int tb_port_tmu_write(struct tb_port *port, u8 offset, u32 mask,
167 			     u32 value)
168 {
169 	u32 data;
170 	int ret;
171 
172 	ret = tb_port_read(port, &data, TB_CFG_PORT, port->cap_tmu + offset, 1);
173 	if (ret)
174 		return ret;
175 
176 	data &= ~mask;
177 	data |= value;
178 
179 	return tb_port_write(port, &data, TB_CFG_PORT,
180 			     port->cap_tmu + offset, 1);
181 }
182 
183 static int tb_port_tmu_set_unidirectional(struct tb_port *port,
184 					  bool unidirectional)
185 {
186 	u32 val;
187 
188 	if (!port->sw->tmu.has_ucap)
189 		return 0;
190 
191 	val = unidirectional ? TMU_ADP_CS_3_UDM : 0;
192 	return tb_port_tmu_write(port, TMU_ADP_CS_3, TMU_ADP_CS_3_UDM, val);
193 }
194 
195 static inline int tb_port_tmu_unidirectional_disable(struct tb_port *port)
196 {
197 	return tb_port_tmu_set_unidirectional(port, false);
198 }
199 
200 static inline int tb_port_tmu_unidirectional_enable(struct tb_port *port)
201 {
202 	return tb_port_tmu_set_unidirectional(port, true);
203 }
204 
205 static bool tb_port_tmu_is_unidirectional(struct tb_port *port)
206 {
207 	int ret;
208 	u32 val;
209 
210 	ret = tb_port_read(port, &val, TB_CFG_PORT,
211 			   port->cap_tmu + TMU_ADP_CS_3, 1);
212 	if (ret)
213 		return false;
214 
215 	return val & TMU_ADP_CS_3_UDM;
216 }
217 
218 static bool tb_port_tmu_is_enhanced(struct tb_port *port)
219 {
220 	int ret;
221 	u32 val;
222 
223 	ret = tb_port_read(port, &val, TB_CFG_PORT,
224 			   port->cap_tmu + TMU_ADP_CS_8, 1);
225 	if (ret)
226 		return false;
227 
228 	return val & TMU_ADP_CS_8_EUDM;
229 }
230 
231 /* Can be called to non-v2 lane adapters too */
232 static int tb_port_tmu_enhanced_enable(struct tb_port *port, bool enable)
233 {
234 	int ret;
235 	u32 val;
236 
237 	if (!tb_switch_tmu_enhanced_is_supported(port->sw))
238 		return 0;
239 
240 	ret = tb_port_read(port, &val, TB_CFG_PORT,
241 			   port->cap_tmu + TMU_ADP_CS_8, 1);
242 	if (ret)
243 		return ret;
244 
245 	if (enable)
246 		val |= TMU_ADP_CS_8_EUDM;
247 	else
248 		val &= ~TMU_ADP_CS_8_EUDM;
249 
250 	return tb_port_write(port, &val, TB_CFG_PORT,
251 			     port->cap_tmu + TMU_ADP_CS_8, 1);
252 }
253 
254 static int tb_port_set_tmu_mode_params(struct tb_port *port,
255 				       enum tb_switch_tmu_mode mode)
256 {
257 	u32 repl_timeout, repl_threshold, repl_n, dirswitch_n, val;
258 	int ret;
259 
260 	repl_timeout = tmu_params[mode].repl_timeout;
261 	repl_threshold = tmu_params[mode].repl_threshold;
262 	repl_n = tmu_params[mode].repl_n;
263 	dirswitch_n = tmu_params[mode].dirswitch_n;
264 
265 	ret = tb_port_read(port, &val, TB_CFG_PORT,
266 			   port->cap_tmu + TMU_ADP_CS_8, 1);
267 	if (ret)
268 		return ret;
269 
270 	val &= ~TMU_ADP_CS_8_REPL_TIMEOUT_MASK;
271 	val &= ~TMU_ADP_CS_8_REPL_THRESHOLD_MASK;
272 	val |= FIELD_PREP(TMU_ADP_CS_8_REPL_TIMEOUT_MASK, repl_timeout);
273 	val |= FIELD_PREP(TMU_ADP_CS_8_REPL_THRESHOLD_MASK, repl_threshold);
274 
275 	ret = tb_port_write(port, &val, TB_CFG_PORT,
276 			    port->cap_tmu + TMU_ADP_CS_8, 1);
277 	if (ret)
278 		return ret;
279 
280 	ret = tb_port_read(port, &val, TB_CFG_PORT,
281 			   port->cap_tmu + TMU_ADP_CS_9, 1);
282 	if (ret)
283 		return ret;
284 
285 	val &= ~TMU_ADP_CS_9_REPL_N_MASK;
286 	val &= ~TMU_ADP_CS_9_DIRSWITCH_N_MASK;
287 	val |= FIELD_PREP(TMU_ADP_CS_9_REPL_N_MASK, repl_n);
288 	val |= FIELD_PREP(TMU_ADP_CS_9_DIRSWITCH_N_MASK, dirswitch_n);
289 
290 	return tb_port_write(port, &val, TB_CFG_PORT,
291 			     port->cap_tmu + TMU_ADP_CS_9, 1);
292 }
293 
294 /* Can be called to non-v2 lane adapters too */
295 static int tb_port_tmu_rate_write(struct tb_port *port, int rate)
296 {
297 	int ret;
298 	u32 val;
299 
300 	if (!tb_switch_tmu_enhanced_is_supported(port->sw))
301 		return 0;
302 
303 	ret = tb_port_read(port, &val, TB_CFG_PORT,
304 			   port->cap_tmu + TMU_ADP_CS_9, 1);
305 	if (ret)
306 		return ret;
307 
308 	val &= ~TMU_ADP_CS_9_ADP_TS_INTERVAL_MASK;
309 	val |= FIELD_PREP(TMU_ADP_CS_9_ADP_TS_INTERVAL_MASK, rate);
310 
311 	return tb_port_write(port, &val, TB_CFG_PORT,
312 			     port->cap_tmu + TMU_ADP_CS_9, 1);
313 }
314 
315 static int tb_port_tmu_time_sync(struct tb_port *port, bool time_sync)
316 {
317 	u32 val = time_sync ? TMU_ADP_CS_6_DTS : 0;
318 
319 	return tb_port_tmu_write(port, TMU_ADP_CS_6, TMU_ADP_CS_6_DTS, val);
320 }
321 
322 static int tb_port_tmu_time_sync_disable(struct tb_port *port)
323 {
324 	return tb_port_tmu_time_sync(port, true);
325 }
326 
327 static int tb_port_tmu_time_sync_enable(struct tb_port *port)
328 {
329 	return tb_port_tmu_time_sync(port, false);
330 }
331 
332 static int tb_switch_tmu_set_time_disruption(struct tb_switch *sw, bool set)
333 {
334 	u32 val, offset, bit;
335 	int ret;
336 
337 	if (tb_switch_is_usb4(sw)) {
338 		offset = sw->tmu.cap + TMU_RTR_CS_0;
339 		bit = TMU_RTR_CS_0_TD;
340 	} else {
341 		offset = sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_26;
342 		bit = TB_TIME_VSEC_3_CS_26_TD;
343 	}
344 
345 	ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, offset, 1);
346 	if (ret)
347 		return ret;
348 
349 	if (set)
350 		val |= bit;
351 	else
352 		val &= ~bit;
353 
354 	return tb_sw_write(sw, &val, TB_CFG_SWITCH, offset, 1);
355 }
356 
357 static int tmu_mode_init(struct tb_switch *sw)
358 {
359 	bool enhanced, ucap;
360 	int ret, rate;
361 
362 	ucap = tb_switch_tmu_ucap_is_supported(sw);
363 	if (ucap)
364 		tb_sw_dbg(sw, "TMU: supports uni-directional mode\n");
365 	enhanced = tb_switch_tmu_enhanced_is_supported(sw);
366 	if (enhanced)
367 		tb_sw_dbg(sw, "TMU: supports enhanced uni-directional mode\n");
368 
369 	ret = tb_switch_tmu_rate_read(sw);
370 	if (ret < 0)
371 		return ret;
372 	rate = ret;
373 
374 	/* Off by default */
375 	sw->tmu.mode = TB_SWITCH_TMU_MODE_OFF;
376 
377 	if (tb_route(sw)) {
378 		struct tb_port *up = tb_upstream_port(sw);
379 
380 		if (enhanced && tb_port_tmu_is_enhanced(up)) {
381 			sw->tmu.mode = TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI;
382 		} else if (ucap && tb_port_tmu_is_unidirectional(up)) {
383 			if (tmu_rates[TB_SWITCH_TMU_MODE_LOWRES] == rate)
384 				sw->tmu.mode = TB_SWITCH_TMU_MODE_LOWRES;
385 			else if (tmu_rates[TB_SWITCH_TMU_MODE_HIFI_UNI] == rate)
386 				sw->tmu.mode = TB_SWITCH_TMU_MODE_HIFI_UNI;
387 		} else if (rate) {
388 			sw->tmu.mode = TB_SWITCH_TMU_MODE_HIFI_BI;
389 		}
390 	} else if (rate) {
391 		sw->tmu.mode = TB_SWITCH_TMU_MODE_HIFI_BI;
392 	}
393 
394 	/* Update the initial request to match the current mode */
395 	sw->tmu.mode_request = sw->tmu.mode;
396 	sw->tmu.has_ucap = ucap;
397 
398 	return 0;
399 }
400 
401 /**
402  * tb_switch_tmu_init() - Initialize switch TMU structures
403  * @sw: Switch to initialized
404  *
405  * This function must be called before other TMU related functions to
406  * makes the internal structures are filled in correctly. Does not
407  * change any hardware configuration.
408  */
409 int tb_switch_tmu_init(struct tb_switch *sw)
410 {
411 	struct tb_port *port;
412 	int ret;
413 
414 	if (tb_switch_is_icm(sw))
415 		return 0;
416 
417 	ret = tb_switch_find_cap(sw, TB_SWITCH_CAP_TMU);
418 	if (ret > 0)
419 		sw->tmu.cap = ret;
420 
421 	tb_switch_for_each_port(sw, port) {
422 		int cap;
423 
424 		cap = tb_port_find_cap(port, TB_PORT_CAP_TIME1);
425 		if (cap > 0)
426 			port->cap_tmu = cap;
427 	}
428 
429 	ret = tmu_mode_init(sw);
430 	if (ret)
431 		return ret;
432 
433 	tb_sw_dbg(sw, "TMU: current mode: %s\n", tmu_mode_name(sw->tmu.mode));
434 	return 0;
435 }
436 
437 /**
438  * tb_switch_tmu_post_time() - Update switch local time
439  * @sw: Switch whose time to update
440  *
441  * Updates switch local time using time posting procedure.
442  */
443 int tb_switch_tmu_post_time(struct tb_switch *sw)
444 {
445 	unsigned int post_time_high_offset, post_time_high = 0;
446 	unsigned int post_local_time_offset, post_time_offset;
447 	struct tb_switch *root_switch = sw->tb->root_switch;
448 	u64 hi, mid, lo, local_time, post_time;
449 	int i, ret, retries = 100;
450 	u32 gm_local_time[3];
451 
452 	if (!tb_route(sw))
453 		return 0;
454 
455 	if (!tb_switch_is_usb4(sw))
456 		return 0;
457 
458 	/* Need to be able to read the grand master time */
459 	if (!root_switch->tmu.cap)
460 		return 0;
461 
462 	ret = tb_sw_read(root_switch, gm_local_time, TB_CFG_SWITCH,
463 			 root_switch->tmu.cap + TMU_RTR_CS_1,
464 			 ARRAY_SIZE(gm_local_time));
465 	if (ret)
466 		return ret;
467 
468 	for (i = 0; i < ARRAY_SIZE(gm_local_time); i++)
469 		tb_sw_dbg(root_switch, "TMU: local_time[%d]=0x%08x\n", i,
470 			  gm_local_time[i]);
471 
472 	/* Convert to nanoseconds (drop fractional part) */
473 	hi = gm_local_time[2] & TMU_RTR_CS_3_LOCAL_TIME_NS_MASK;
474 	mid = gm_local_time[1];
475 	lo = (gm_local_time[0] & TMU_RTR_CS_1_LOCAL_TIME_NS_MASK) >>
476 		TMU_RTR_CS_1_LOCAL_TIME_NS_SHIFT;
477 	local_time = hi << 48 | mid << 16 | lo;
478 
479 	/* Tell the switch that time sync is disrupted for a while */
480 	ret = tb_switch_tmu_set_time_disruption(sw, true);
481 	if (ret)
482 		return ret;
483 
484 	post_local_time_offset = sw->tmu.cap + TMU_RTR_CS_22;
485 	post_time_offset = sw->tmu.cap + TMU_RTR_CS_24;
486 	post_time_high_offset = sw->tmu.cap + TMU_RTR_CS_25;
487 
488 	/*
489 	 * Write the Grandmaster time to the Post Local Time registers
490 	 * of the new switch.
491 	 */
492 	ret = tb_sw_write(sw, &local_time, TB_CFG_SWITCH,
493 			  post_local_time_offset, 2);
494 	if (ret)
495 		goto out;
496 
497 	/*
498 	 * Have the new switch update its local time by:
499 	 * 1) writing 0x1 to the Post Time Low register and 0xffffffff to
500 	 * Post Time High register.
501 	 * 2) write 0 to Post Time High register and then wait for
502 	 * the completion of the post_time register becomes 0.
503 	 * This means the time has been converged properly.
504 	 */
505 	post_time = 0xffffffff00000001ULL;
506 
507 	ret = tb_sw_write(sw, &post_time, TB_CFG_SWITCH, post_time_offset, 2);
508 	if (ret)
509 		goto out;
510 
511 	ret = tb_sw_write(sw, &post_time_high, TB_CFG_SWITCH,
512 			  post_time_high_offset, 1);
513 	if (ret)
514 		goto out;
515 
516 	do {
517 		usleep_range(5, 10);
518 		ret = tb_sw_read(sw, &post_time, TB_CFG_SWITCH,
519 				 post_time_offset, 2);
520 		if (ret)
521 			goto out;
522 	} while (--retries && post_time);
523 
524 	if (!retries) {
525 		ret = -ETIMEDOUT;
526 		goto out;
527 	}
528 
529 	tb_sw_dbg(sw, "TMU: updated local time to %#llx\n", local_time);
530 
531 out:
532 	tb_switch_tmu_set_time_disruption(sw, false);
533 	return ret;
534 }
535 
536 static int disable_enhanced(struct tb_port *up, struct tb_port *down)
537 {
538 	int ret;
539 
540 	/*
541 	 * Router may already been disconnected so ignore errors on the
542 	 * upstream port.
543 	 */
544 	tb_port_tmu_rate_write(up, 0);
545 	tb_port_tmu_enhanced_enable(up, false);
546 
547 	ret = tb_port_tmu_rate_write(down, 0);
548 	if (ret)
549 		return ret;
550 	return tb_port_tmu_enhanced_enable(down, false);
551 }
552 
553 /**
554  * tb_switch_tmu_disable() - Disable TMU of a switch
555  * @sw: Switch whose TMU to disable
556  *
557  * Turns off TMU of @sw if it is enabled. If not enabled does nothing.
558  */
559 int tb_switch_tmu_disable(struct tb_switch *sw)
560 {
561 	/* Already disabled? */
562 	if (sw->tmu.mode == TB_SWITCH_TMU_MODE_OFF)
563 		return 0;
564 
565 	if (tb_route(sw)) {
566 		struct tb_port *down, *up;
567 		int ret;
568 
569 		down = tb_switch_downstream_port(sw);
570 		up = tb_upstream_port(sw);
571 		/*
572 		 * In case of uni-directional time sync, TMU handshake is
573 		 * initiated by upstream router. In case of bi-directional
574 		 * time sync, TMU handshake is initiated by downstream router.
575 		 * We change downstream router's rate to off for both uni/bidir
576 		 * cases although it is needed only for the bi-directional mode.
577 		 * We avoid changing upstream router's mode since it might
578 		 * have another downstream router plugged, that is set to
579 		 * uni-directional mode and we don't want to change it's TMU
580 		 * mode.
581 		 */
582 		ret = tb_switch_tmu_rate_write(sw, tmu_rates[TB_SWITCH_TMU_MODE_OFF]);
583 		if (ret)
584 			return ret;
585 
586 		tb_port_tmu_time_sync_disable(up);
587 		ret = tb_port_tmu_time_sync_disable(down);
588 		if (ret)
589 			return ret;
590 
591 		switch (sw->tmu.mode) {
592 		case TB_SWITCH_TMU_MODE_LOWRES:
593 		case TB_SWITCH_TMU_MODE_HIFI_UNI:
594 			/* The switch may be unplugged so ignore any errors */
595 			tb_port_tmu_unidirectional_disable(up);
596 			ret = tb_port_tmu_unidirectional_disable(down);
597 			if (ret)
598 				return ret;
599 			break;
600 
601 		case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI:
602 			ret = disable_enhanced(up, down);
603 			if (ret)
604 				return ret;
605 			break;
606 
607 		default:
608 			break;
609 		}
610 	} else {
611 		tb_switch_tmu_rate_write(sw, tmu_rates[TB_SWITCH_TMU_MODE_OFF]);
612 	}
613 
614 	sw->tmu.mode = TB_SWITCH_TMU_MODE_OFF;
615 
616 	tb_sw_dbg(sw, "TMU: disabled\n");
617 	return 0;
618 }
619 
620 /* Called only when there is failure enabling requested mode */
621 static void tb_switch_tmu_off(struct tb_switch *sw)
622 {
623 	unsigned int rate = tmu_rates[TB_SWITCH_TMU_MODE_OFF];
624 	struct tb_port *down, *up;
625 
626 	down = tb_switch_downstream_port(sw);
627 	up = tb_upstream_port(sw);
628 	/*
629 	 * In case of any failure in one of the steps when setting
630 	 * bi-directional or uni-directional TMU mode, get back to the TMU
631 	 * configurations in off mode. In case of additional failures in
632 	 * the functions below, ignore them since the caller shall already
633 	 * report a failure.
634 	 */
635 	tb_port_tmu_time_sync_disable(down);
636 	tb_port_tmu_time_sync_disable(up);
637 
638 	switch (sw->tmu.mode_request) {
639 	case TB_SWITCH_TMU_MODE_LOWRES:
640 	case TB_SWITCH_TMU_MODE_HIFI_UNI:
641 		tb_switch_tmu_rate_write(tb_switch_parent(sw), rate);
642 		break;
643 	case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI:
644 		disable_enhanced(up, down);
645 		break;
646 	default:
647 		break;
648 	}
649 
650 	/* Always set the rate to 0 */
651 	tb_switch_tmu_rate_write(sw, rate);
652 
653 	tb_switch_set_tmu_mode_params(sw, sw->tmu.mode);
654 	tb_port_tmu_unidirectional_disable(down);
655 	tb_port_tmu_unidirectional_disable(up);
656 }
657 
658 /*
659  * This function is called when the previous TMU mode was
660  * TB_SWITCH_TMU_MODE_OFF.
661  */
662 static int tb_switch_tmu_enable_bidirectional(struct tb_switch *sw)
663 {
664 	struct tb_port *up, *down;
665 	int ret;
666 
667 	up = tb_upstream_port(sw);
668 	down = tb_switch_downstream_port(sw);
669 
670 	ret = tb_port_tmu_unidirectional_disable(up);
671 	if (ret)
672 		return ret;
673 
674 	ret = tb_port_tmu_unidirectional_disable(down);
675 	if (ret)
676 		goto out;
677 
678 	ret = tb_switch_tmu_rate_write(sw, tmu_rates[TB_SWITCH_TMU_MODE_HIFI_BI]);
679 	if (ret)
680 		goto out;
681 
682 	ret = tb_port_tmu_time_sync_enable(up);
683 	if (ret)
684 		goto out;
685 
686 	ret = tb_port_tmu_time_sync_enable(down);
687 	if (ret)
688 		goto out;
689 
690 	return 0;
691 
692 out:
693 	tb_switch_tmu_off(sw);
694 	return ret;
695 }
696 
697 /* Only needed for Titan Ridge */
698 static int tb_switch_tmu_disable_objections(struct tb_switch *sw)
699 {
700 	struct tb_port *up = tb_upstream_port(sw);
701 	u32 val;
702 	int ret;
703 
704 	ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
705 			 sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_9, 1);
706 	if (ret)
707 		return ret;
708 
709 	val &= ~TB_TIME_VSEC_3_CS_9_TMU_OBJ_MASK;
710 
711 	ret = tb_sw_write(sw, &val, TB_CFG_SWITCH,
712 			  sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_9, 1);
713 	if (ret)
714 		return ret;
715 
716 	return tb_port_tmu_write(up, TMU_ADP_CS_6,
717 				 TMU_ADP_CS_6_DISABLE_TMU_OBJ_MASK,
718 				 TMU_ADP_CS_6_DISABLE_TMU_OBJ_CL1 |
719 				 TMU_ADP_CS_6_DISABLE_TMU_OBJ_CL2);
720 }
721 
722 /*
723  * This function is called when the previous TMU mode was
724  * TB_SWITCH_TMU_MODE_OFF.
725  */
726 static int tb_switch_tmu_enable_unidirectional(struct tb_switch *sw)
727 {
728 	struct tb_port *up, *down;
729 	int ret;
730 
731 	up = tb_upstream_port(sw);
732 	down = tb_switch_downstream_port(sw);
733 	ret = tb_switch_tmu_rate_write(tb_switch_parent(sw),
734 				       tmu_rates[sw->tmu.mode_request]);
735 	if (ret)
736 		return ret;
737 
738 	ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request);
739 	if (ret)
740 		return ret;
741 
742 	ret = tb_port_tmu_unidirectional_enable(up);
743 	if (ret)
744 		goto out;
745 
746 	ret = tb_port_tmu_time_sync_enable(up);
747 	if (ret)
748 		goto out;
749 
750 	ret = tb_port_tmu_unidirectional_enable(down);
751 	if (ret)
752 		goto out;
753 
754 	ret = tb_port_tmu_time_sync_enable(down);
755 	if (ret)
756 		goto out;
757 
758 	return 0;
759 
760 out:
761 	tb_switch_tmu_off(sw);
762 	return ret;
763 }
764 
765 /*
766  * This function is called when the previous TMU mode was
767  * TB_SWITCH_TMU_RATE_OFF.
768  */
769 static int tb_switch_tmu_enable_enhanced(struct tb_switch *sw)
770 {
771 	unsigned int rate = tmu_rates[sw->tmu.mode_request];
772 	struct tb_port *up, *down;
773 	int ret;
774 
775 	/* Router specific parameters first */
776 	ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request);
777 	if (ret)
778 		return ret;
779 
780 	up = tb_upstream_port(sw);
781 	down = tb_switch_downstream_port(sw);
782 
783 	ret = tb_port_set_tmu_mode_params(up, sw->tmu.mode_request);
784 	if (ret)
785 		goto out;
786 
787 	ret = tb_port_tmu_rate_write(up, rate);
788 	if (ret)
789 		goto out;
790 
791 	ret = tb_port_tmu_enhanced_enable(up, true);
792 	if (ret)
793 		goto out;
794 
795 	ret = tb_port_set_tmu_mode_params(down, sw->tmu.mode_request);
796 	if (ret)
797 		goto out;
798 
799 	ret = tb_port_tmu_rate_write(down, rate);
800 	if (ret)
801 		goto out;
802 
803 	ret = tb_port_tmu_enhanced_enable(down, true);
804 	if (ret)
805 		goto out;
806 
807 	return 0;
808 
809 out:
810 	tb_switch_tmu_off(sw);
811 	return ret;
812 }
813 
814 static void tb_switch_tmu_change_mode_prev(struct tb_switch *sw)
815 {
816 	unsigned int rate = tmu_rates[sw->tmu.mode];
817 	struct tb_port *down, *up;
818 
819 	down = tb_switch_downstream_port(sw);
820 	up = tb_upstream_port(sw);
821 	/*
822 	 * In case of any failure in one of the steps when change mode,
823 	 * get back to the TMU configurations in previous mode.
824 	 * In case of additional failures in the functions below,
825 	 * ignore them since the caller shall already report a failure.
826 	 */
827 	switch (sw->tmu.mode) {
828 	case TB_SWITCH_TMU_MODE_LOWRES:
829 	case TB_SWITCH_TMU_MODE_HIFI_UNI:
830 		tb_port_tmu_set_unidirectional(down, true);
831 		tb_switch_tmu_rate_write(tb_switch_parent(sw), rate);
832 		break;
833 
834 	case TB_SWITCH_TMU_MODE_HIFI_BI:
835 		tb_port_tmu_set_unidirectional(down, false);
836 		tb_switch_tmu_rate_write(sw, rate);
837 		break;
838 
839 	default:
840 		break;
841 	}
842 
843 	tb_switch_set_tmu_mode_params(sw, sw->tmu.mode);
844 
845 	switch (sw->tmu.mode) {
846 	case TB_SWITCH_TMU_MODE_LOWRES:
847 	case TB_SWITCH_TMU_MODE_HIFI_UNI:
848 		tb_port_tmu_set_unidirectional(up, true);
849 		break;
850 
851 	case TB_SWITCH_TMU_MODE_HIFI_BI:
852 		tb_port_tmu_set_unidirectional(up, false);
853 		break;
854 
855 	default:
856 		break;
857 	}
858 }
859 
860 static int tb_switch_tmu_change_mode(struct tb_switch *sw)
861 {
862 	unsigned int rate = tmu_rates[sw->tmu.mode_request];
863 	struct tb_port *up, *down;
864 	int ret;
865 
866 	up = tb_upstream_port(sw);
867 	down = tb_switch_downstream_port(sw);
868 
869 	/* Program the upstream router downstream facing lane adapter */
870 	switch (sw->tmu.mode_request) {
871 	case TB_SWITCH_TMU_MODE_LOWRES:
872 	case TB_SWITCH_TMU_MODE_HIFI_UNI:
873 		ret = tb_port_tmu_set_unidirectional(down, true);
874 		if (ret)
875 			goto out;
876 		ret = tb_switch_tmu_rate_write(tb_switch_parent(sw), rate);
877 		if (ret)
878 			goto out;
879 		break;
880 
881 	case TB_SWITCH_TMU_MODE_HIFI_BI:
882 		ret = tb_port_tmu_set_unidirectional(down, false);
883 		if (ret)
884 			goto out;
885 		ret = tb_switch_tmu_rate_write(sw, rate);
886 		if (ret)
887 			goto out;
888 		break;
889 
890 	default:
891 		/* Not allowed to change modes from other than above */
892 		return -EINVAL;
893 	}
894 
895 	ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request);
896 	if (ret)
897 		return ret;
898 
899 	/* Program the new mode and the downstream router lane adapter */
900 	switch (sw->tmu.mode_request) {
901 	case TB_SWITCH_TMU_MODE_LOWRES:
902 	case TB_SWITCH_TMU_MODE_HIFI_UNI:
903 		ret = tb_port_tmu_set_unidirectional(up, true);
904 		if (ret)
905 			goto out;
906 		break;
907 
908 	case TB_SWITCH_TMU_MODE_HIFI_BI:
909 		ret = tb_port_tmu_set_unidirectional(up, false);
910 		if (ret)
911 			goto out;
912 		break;
913 
914 	default:
915 		/* Not allowed to change modes from other than above */
916 		return -EINVAL;
917 	}
918 
919 	ret = tb_port_tmu_time_sync_enable(down);
920 	if (ret)
921 		goto out;
922 
923 	ret = tb_port_tmu_time_sync_enable(up);
924 	if (ret)
925 		goto out;
926 
927 	return 0;
928 
929 out:
930 	tb_switch_tmu_change_mode_prev(sw);
931 	return ret;
932 }
933 
934 /**
935  * tb_switch_tmu_enable() - Enable TMU on a router
936  * @sw: Router whose TMU to enable
937  *
938  * Enables TMU of a router to be in uni-directional Normal/HiFi or
939  * bi-directional HiFi mode. Calling tb_switch_tmu_configure() is
940  * required before calling this function.
941  */
942 int tb_switch_tmu_enable(struct tb_switch *sw)
943 {
944 	int ret;
945 
946 	if (tb_switch_tmu_is_enabled(sw))
947 		return 0;
948 
949 	if (tb_switch_is_titan_ridge(sw) &&
950 	    (sw->tmu.mode_request == TB_SWITCH_TMU_MODE_LOWRES ||
951 	     sw->tmu.mode_request == TB_SWITCH_TMU_MODE_HIFI_UNI)) {
952 		ret = tb_switch_tmu_disable_objections(sw);
953 		if (ret)
954 			return ret;
955 	}
956 
957 	ret = tb_switch_tmu_set_time_disruption(sw, true);
958 	if (ret)
959 		return ret;
960 
961 	if (tb_route(sw)) {
962 		/*
963 		 * The used mode changes are from OFF to
964 		 * HiFi-Uni/HiFi-BiDir/Normal-Uni or from Normal-Uni to
965 		 * HiFi-Uni.
966 		 */
967 		if (sw->tmu.mode == TB_SWITCH_TMU_MODE_OFF) {
968 			switch (sw->tmu.mode_request) {
969 			case TB_SWITCH_TMU_MODE_LOWRES:
970 			case TB_SWITCH_TMU_MODE_HIFI_UNI:
971 				ret = tb_switch_tmu_enable_unidirectional(sw);
972 				break;
973 
974 			case TB_SWITCH_TMU_MODE_HIFI_BI:
975 				ret = tb_switch_tmu_enable_bidirectional(sw);
976 				break;
977 			case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI:
978 				ret = tb_switch_tmu_enable_enhanced(sw);
979 				break;
980 			default:
981 				ret = -EINVAL;
982 				break;
983 			}
984 		} else if (sw->tmu.mode == TB_SWITCH_TMU_MODE_LOWRES ||
985 			   sw->tmu.mode == TB_SWITCH_TMU_MODE_HIFI_UNI ||
986 			   sw->tmu.mode == TB_SWITCH_TMU_MODE_HIFI_BI) {
987 			ret = tb_switch_tmu_change_mode(sw);
988 		} else {
989 			ret = -EINVAL;
990 		}
991 	} else {
992 		/*
993 		 * Host router port configurations are written as
994 		 * part of configurations for downstream port of the parent
995 		 * of the child node - see above.
996 		 * Here only the host router' rate configuration is written.
997 		 */
998 		ret = tb_switch_tmu_rate_write(sw, tmu_rates[sw->tmu.mode_request]);
999 	}
1000 
1001 	if (ret) {
1002 		tb_sw_warn(sw, "TMU: failed to enable mode %s: %d\n",
1003 			   tmu_mode_name(sw->tmu.mode_request), ret);
1004 	} else {
1005 		sw->tmu.mode = sw->tmu.mode_request;
1006 		tb_sw_dbg(sw, "TMU: mode set to: %s\n", tmu_mode_name(sw->tmu.mode));
1007 	}
1008 
1009 	return tb_switch_tmu_set_time_disruption(sw, false);
1010 }
1011 
1012 /**
1013  * tb_switch_tmu_configure() - Configure the TMU mode
1014  * @sw: Router whose mode to change
1015  * @mode: Mode to configure
1016  *
1017  * Selects the TMU mode that is enabled when tb_switch_tmu_enable() is
1018  * next called.
1019  *
1020  * Returns %0 in success and negative errno otherwise. Specifically
1021  * returns %-EOPNOTSUPP if the requested mode is not possible (not
1022  * supported by the router and/or topology).
1023  */
1024 int tb_switch_tmu_configure(struct tb_switch *sw, enum tb_switch_tmu_mode mode)
1025 {
1026 	switch (mode) {
1027 	case TB_SWITCH_TMU_MODE_OFF:
1028 		break;
1029 
1030 	case TB_SWITCH_TMU_MODE_LOWRES:
1031 	case TB_SWITCH_TMU_MODE_HIFI_UNI:
1032 		if (!sw->tmu.has_ucap)
1033 			return -EOPNOTSUPP;
1034 		break;
1035 
1036 	case TB_SWITCH_TMU_MODE_HIFI_BI:
1037 		break;
1038 
1039 	case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI: {
1040 		const struct tb_switch *parent_sw = tb_switch_parent(sw);
1041 
1042 		if (!parent_sw || !tb_switch_tmu_enhanced_is_supported(parent_sw))
1043 			return -EOPNOTSUPP;
1044 		if (!tb_switch_tmu_enhanced_is_supported(sw))
1045 			return -EOPNOTSUPP;
1046 
1047 		break;
1048 	}
1049 
1050 	default:
1051 		tb_sw_warn(sw, "TMU: unsupported mode %u\n", mode);
1052 		return -EINVAL;
1053 	}
1054 
1055 	if (sw->tmu.mode_request != mode) {
1056 		tb_sw_dbg(sw, "TMU: mode change %s -> %s requested\n",
1057 			  tmu_mode_name(sw->tmu.mode), tmu_mode_name(mode));
1058 		sw->tmu.mode_request = mode;
1059 	}
1060 
1061 	return 0;
1062 }
1063