Merge tag 'for-linus-6.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw...
[platform/kernel/linux-starfive.git] / drivers / thunderbolt / tmu.c
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 int tb_switch_set_tmu_mode_params(struct tb_switch *sw,
15                                          enum tb_switch_tmu_rate rate)
16 {
17         u32 freq_meas_wind[2] = { 30, 800 };
18         u32 avg_const[2] = { 4, 8 };
19         u32 freq, avg, val;
20         int ret;
21
22         if (rate == TB_SWITCH_TMU_RATE_NORMAL) {
23                 freq = freq_meas_wind[0];
24                 avg = avg_const[0];
25         } else if (rate == TB_SWITCH_TMU_RATE_HIFI) {
26                 freq = freq_meas_wind[1];
27                 avg = avg_const[1];
28         } else {
29                 return 0;
30         }
31
32         ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
33                          sw->tmu.cap + TMU_RTR_CS_0, 1);
34         if (ret)
35                 return ret;
36
37         val &= ~TMU_RTR_CS_0_FREQ_WIND_MASK;
38         val |= FIELD_PREP(TMU_RTR_CS_0_FREQ_WIND_MASK, freq);
39
40         ret = tb_sw_write(sw, &val, TB_CFG_SWITCH,
41                           sw->tmu.cap + TMU_RTR_CS_0, 1);
42         if (ret)
43                 return ret;
44
45         ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
46                          sw->tmu.cap + TMU_RTR_CS_15, 1);
47         if (ret)
48                 return ret;
49
50         val &= ~TMU_RTR_CS_15_FREQ_AVG_MASK &
51                 ~TMU_RTR_CS_15_DELAY_AVG_MASK &
52                 ~TMU_RTR_CS_15_OFFSET_AVG_MASK &
53                 ~TMU_RTR_CS_15_ERROR_AVG_MASK;
54         val |=  FIELD_PREP(TMU_RTR_CS_15_FREQ_AVG_MASK, avg) |
55                 FIELD_PREP(TMU_RTR_CS_15_DELAY_AVG_MASK, avg) |
56                 FIELD_PREP(TMU_RTR_CS_15_OFFSET_AVG_MASK, avg) |
57                 FIELD_PREP(TMU_RTR_CS_15_ERROR_AVG_MASK, avg);
58
59         return tb_sw_write(sw, &val, TB_CFG_SWITCH,
60                            sw->tmu.cap + TMU_RTR_CS_15, 1);
61 }
62
63 static const char *tb_switch_tmu_mode_name(const struct tb_switch *sw)
64 {
65         bool root_switch = !tb_route(sw);
66
67         switch (sw->tmu.rate) {
68         case TB_SWITCH_TMU_RATE_OFF:
69                 return "off";
70
71         case TB_SWITCH_TMU_RATE_HIFI:
72                 /* Root switch does not have upstream directionality */
73                 if (root_switch)
74                         return "HiFi";
75                 if (sw->tmu.unidirectional)
76                         return "uni-directional, HiFi";
77                 return "bi-directional, HiFi";
78
79         case TB_SWITCH_TMU_RATE_NORMAL:
80                 if (root_switch)
81                         return "normal";
82                 return "uni-directional, normal";
83
84         default:
85                 return "unknown";
86         }
87 }
88
89 static bool tb_switch_tmu_ucap_supported(struct tb_switch *sw)
90 {
91         int ret;
92         u32 val;
93
94         ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
95                          sw->tmu.cap + TMU_RTR_CS_0, 1);
96         if (ret)
97                 return false;
98
99         return !!(val & TMU_RTR_CS_0_UCAP);
100 }
101
102 static int tb_switch_tmu_rate_read(struct tb_switch *sw)
103 {
104         int ret;
105         u32 val;
106
107         ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
108                          sw->tmu.cap + TMU_RTR_CS_3, 1);
109         if (ret)
110                 return ret;
111
112         val >>= TMU_RTR_CS_3_TS_PACKET_INTERVAL_SHIFT;
113         return val;
114 }
115
116 static int tb_switch_tmu_rate_write(struct tb_switch *sw, int rate)
117 {
118         int ret;
119         u32 val;
120
121         ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
122                          sw->tmu.cap + TMU_RTR_CS_3, 1);
123         if (ret)
124                 return ret;
125
126         val &= ~TMU_RTR_CS_3_TS_PACKET_INTERVAL_MASK;
127         val |= rate << TMU_RTR_CS_3_TS_PACKET_INTERVAL_SHIFT;
128
129         return tb_sw_write(sw, &val, TB_CFG_SWITCH,
130                            sw->tmu.cap + TMU_RTR_CS_3, 1);
131 }
132
133 static int tb_port_tmu_write(struct tb_port *port, u8 offset, u32 mask,
134                              u32 value)
135 {
136         u32 data;
137         int ret;
138
139         ret = tb_port_read(port, &data, TB_CFG_PORT, port->cap_tmu + offset, 1);
140         if (ret)
141                 return ret;
142
143         data &= ~mask;
144         data |= value;
145
146         return tb_port_write(port, &data, TB_CFG_PORT,
147                              port->cap_tmu + offset, 1);
148 }
149
150 static int tb_port_tmu_set_unidirectional(struct tb_port *port,
151                                           bool unidirectional)
152 {
153         u32 val;
154
155         if (!port->sw->tmu.has_ucap)
156                 return 0;
157
158         val = unidirectional ? TMU_ADP_CS_3_UDM : 0;
159         return tb_port_tmu_write(port, TMU_ADP_CS_3, TMU_ADP_CS_3_UDM, val);
160 }
161
162 static inline int tb_port_tmu_unidirectional_disable(struct tb_port *port)
163 {
164         return tb_port_tmu_set_unidirectional(port, false);
165 }
166
167 static inline int tb_port_tmu_unidirectional_enable(struct tb_port *port)
168 {
169         return tb_port_tmu_set_unidirectional(port, true);
170 }
171
172 static bool tb_port_tmu_is_unidirectional(struct tb_port *port)
173 {
174         int ret;
175         u32 val;
176
177         ret = tb_port_read(port, &val, TB_CFG_PORT,
178                            port->cap_tmu + TMU_ADP_CS_3, 1);
179         if (ret)
180                 return false;
181
182         return val & TMU_ADP_CS_3_UDM;
183 }
184
185 static int tb_port_tmu_time_sync(struct tb_port *port, bool time_sync)
186 {
187         u32 val = time_sync ? TMU_ADP_CS_6_DTS : 0;
188
189         return tb_port_tmu_write(port, TMU_ADP_CS_6, TMU_ADP_CS_6_DTS, val);
190 }
191
192 static int tb_port_tmu_time_sync_disable(struct tb_port *port)
193 {
194         return tb_port_tmu_time_sync(port, true);
195 }
196
197 static int tb_port_tmu_time_sync_enable(struct tb_port *port)
198 {
199         return tb_port_tmu_time_sync(port, false);
200 }
201
202 static int tb_switch_tmu_set_time_disruption(struct tb_switch *sw, bool set)
203 {
204         u32 val, offset, bit;
205         int ret;
206
207         if (tb_switch_is_usb4(sw)) {
208                 offset = sw->tmu.cap + TMU_RTR_CS_0;
209                 bit = TMU_RTR_CS_0_TD;
210         } else {
211                 offset = sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_26;
212                 bit = TB_TIME_VSEC_3_CS_26_TD;
213         }
214
215         ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, offset, 1);
216         if (ret)
217                 return ret;
218
219         if (set)
220                 val |= bit;
221         else
222                 val &= ~bit;
223
224         return tb_sw_write(sw, &val, TB_CFG_SWITCH, offset, 1);
225 }
226
227 /**
228  * tb_switch_tmu_init() - Initialize switch TMU structures
229  * @sw: Switch to initialized
230  *
231  * This function must be called before other TMU related functions to
232  * makes the internal structures are filled in correctly. Does not
233  * change any hardware configuration.
234  */
235 int tb_switch_tmu_init(struct tb_switch *sw)
236 {
237         struct tb_port *port;
238         int ret;
239
240         if (tb_switch_is_icm(sw))
241                 return 0;
242
243         ret = tb_switch_find_cap(sw, TB_SWITCH_CAP_TMU);
244         if (ret > 0)
245                 sw->tmu.cap = ret;
246
247         tb_switch_for_each_port(sw, port) {
248                 int cap;
249
250                 cap = tb_port_find_cap(port, TB_PORT_CAP_TIME1);
251                 if (cap > 0)
252                         port->cap_tmu = cap;
253         }
254
255         ret = tb_switch_tmu_rate_read(sw);
256         if (ret < 0)
257                 return ret;
258
259         sw->tmu.rate = ret;
260
261         sw->tmu.has_ucap = tb_switch_tmu_ucap_supported(sw);
262         if (sw->tmu.has_ucap) {
263                 tb_sw_dbg(sw, "TMU: supports uni-directional mode\n");
264
265                 if (tb_route(sw)) {
266                         struct tb_port *up = tb_upstream_port(sw);
267
268                         sw->tmu.unidirectional =
269                                 tb_port_tmu_is_unidirectional(up);
270                 }
271         } else {
272                 sw->tmu.unidirectional = false;
273         }
274
275         tb_sw_dbg(sw, "TMU: current mode: %s\n", tb_switch_tmu_mode_name(sw));
276         return 0;
277 }
278
279 /**
280  * tb_switch_tmu_post_time() - Update switch local time
281  * @sw: Switch whose time to update
282  *
283  * Updates switch local time using time posting procedure.
284  */
285 int tb_switch_tmu_post_time(struct tb_switch *sw)
286 {
287         unsigned int post_time_high_offset, post_time_high = 0;
288         unsigned int post_local_time_offset, post_time_offset;
289         struct tb_switch *root_switch = sw->tb->root_switch;
290         u64 hi, mid, lo, local_time, post_time;
291         int i, ret, retries = 100;
292         u32 gm_local_time[3];
293
294         if (!tb_route(sw))
295                 return 0;
296
297         if (!tb_switch_is_usb4(sw))
298                 return 0;
299
300         /* Need to be able to read the grand master time */
301         if (!root_switch->tmu.cap)
302                 return 0;
303
304         ret = tb_sw_read(root_switch, gm_local_time, TB_CFG_SWITCH,
305                          root_switch->tmu.cap + TMU_RTR_CS_1,
306                          ARRAY_SIZE(gm_local_time));
307         if (ret)
308                 return ret;
309
310         for (i = 0; i < ARRAY_SIZE(gm_local_time); i++)
311                 tb_sw_dbg(root_switch, "local_time[%d]=0x%08x\n", i,
312                           gm_local_time[i]);
313
314         /* Convert to nanoseconds (drop fractional part) */
315         hi = gm_local_time[2] & TMU_RTR_CS_3_LOCAL_TIME_NS_MASK;
316         mid = gm_local_time[1];
317         lo = (gm_local_time[0] & TMU_RTR_CS_1_LOCAL_TIME_NS_MASK) >>
318                 TMU_RTR_CS_1_LOCAL_TIME_NS_SHIFT;
319         local_time = hi << 48 | mid << 16 | lo;
320
321         /* Tell the switch that time sync is disrupted for a while */
322         ret = tb_switch_tmu_set_time_disruption(sw, true);
323         if (ret)
324                 return ret;
325
326         post_local_time_offset = sw->tmu.cap + TMU_RTR_CS_22;
327         post_time_offset = sw->tmu.cap + TMU_RTR_CS_24;
328         post_time_high_offset = sw->tmu.cap + TMU_RTR_CS_25;
329
330         /*
331          * Write the Grandmaster time to the Post Local Time registers
332          * of the new switch.
333          */
334         ret = tb_sw_write(sw, &local_time, TB_CFG_SWITCH,
335                           post_local_time_offset, 2);
336         if (ret)
337                 goto out;
338
339         /*
340          * Have the new switch update its local time by:
341          * 1) writing 0x1 to the Post Time Low register and 0xffffffff to
342          * Post Time High register.
343          * 2) write 0 to Post Time High register and then wait for
344          * the completion of the post_time register becomes 0.
345          * This means the time has been converged properly.
346          */
347         post_time = 0xffffffff00000001ULL;
348
349         ret = tb_sw_write(sw, &post_time, TB_CFG_SWITCH, post_time_offset, 2);
350         if (ret)
351                 goto out;
352
353         ret = tb_sw_write(sw, &post_time_high, TB_CFG_SWITCH,
354                           post_time_high_offset, 1);
355         if (ret)
356                 goto out;
357
358         do {
359                 usleep_range(5, 10);
360                 ret = tb_sw_read(sw, &post_time, TB_CFG_SWITCH,
361                                  post_time_offset, 2);
362                 if (ret)
363                         goto out;
364         } while (--retries && post_time);
365
366         if (!retries) {
367                 ret = -ETIMEDOUT;
368                 goto out;
369         }
370
371         tb_sw_dbg(sw, "TMU: updated local time to %#llx\n", local_time);
372
373 out:
374         tb_switch_tmu_set_time_disruption(sw, false);
375         return ret;
376 }
377
378 /**
379  * tb_switch_tmu_disable() - Disable TMU of a switch
380  * @sw: Switch whose TMU to disable
381  *
382  * Turns off TMU of @sw if it is enabled. If not enabled does nothing.
383  */
384 int tb_switch_tmu_disable(struct tb_switch *sw)
385 {
386         /*
387          * No need to disable TMU on devices that don't support CLx since
388          * on these devices e.g. Alpine Ridge and earlier, the TMU mode
389          * HiFi bi-directional is enabled by default and we don't change it.
390          */
391         if (!tb_switch_is_clx_supported(sw))
392                 return 0;
393
394         /* Already disabled? */
395         if (sw->tmu.rate == TB_SWITCH_TMU_RATE_OFF)
396                 return 0;
397
398
399         if (tb_route(sw)) {
400                 bool unidirectional = sw->tmu.unidirectional;
401                 struct tb_switch *parent = tb_switch_parent(sw);
402                 struct tb_port *down, *up;
403                 int ret;
404
405                 down = tb_port_at(tb_route(sw), parent);
406                 up = tb_upstream_port(sw);
407                 /*
408                  * In case of uni-directional time sync, TMU handshake is
409                  * initiated by upstream router. In case of bi-directional
410                  * time sync, TMU handshake is initiated by downstream router.
411                  * We change downstream router's rate to off for both uni/bidir
412                  * cases although it is needed only for the bi-directional mode.
413                  * We avoid changing upstream router's mode since it might
414                  * have another downstream router plugged, that is set to
415                  * uni-directional mode and we don't want to change it's TMU
416                  * mode.
417                  */
418                 tb_switch_tmu_rate_write(sw, TB_SWITCH_TMU_RATE_OFF);
419
420                 tb_port_tmu_time_sync_disable(up);
421                 ret = tb_port_tmu_time_sync_disable(down);
422                 if (ret)
423                         return ret;
424
425                 if (unidirectional) {
426                         /* The switch may be unplugged so ignore any errors */
427                         tb_port_tmu_unidirectional_disable(up);
428                         ret = tb_port_tmu_unidirectional_disable(down);
429                         if (ret)
430                                 return ret;
431                 }
432         } else {
433                 tb_switch_tmu_rate_write(sw, TB_SWITCH_TMU_RATE_OFF);
434         }
435
436         sw->tmu.unidirectional = false;
437         sw->tmu.rate = TB_SWITCH_TMU_RATE_OFF;
438
439         tb_sw_dbg(sw, "TMU: disabled\n");
440         return 0;
441 }
442
443 static void __tb_switch_tmu_off(struct tb_switch *sw, bool unidirectional)
444 {
445         struct tb_switch *parent = tb_switch_parent(sw);
446         struct tb_port *down, *up;
447
448         down = tb_port_at(tb_route(sw), parent);
449         up = tb_upstream_port(sw);
450         /*
451          * In case of any failure in one of the steps when setting
452          * bi-directional or uni-directional TMU mode, get back to the TMU
453          * configurations in off mode. In case of additional failures in
454          * the functions below, ignore them since the caller shall already
455          * report a failure.
456          */
457         tb_port_tmu_time_sync_disable(down);
458         tb_port_tmu_time_sync_disable(up);
459         if (unidirectional)
460                 tb_switch_tmu_rate_write(parent, TB_SWITCH_TMU_RATE_OFF);
461         else
462                 tb_switch_tmu_rate_write(sw, TB_SWITCH_TMU_RATE_OFF);
463
464         tb_switch_set_tmu_mode_params(sw, sw->tmu.rate);
465         tb_port_tmu_unidirectional_disable(down);
466         tb_port_tmu_unidirectional_disable(up);
467 }
468
469 /*
470  * This function is called when the previous TMU mode was
471  * TB_SWITCH_TMU_RATE_OFF.
472  */
473 static int __tb_switch_tmu_enable_bidirectional(struct tb_switch *sw)
474 {
475         struct tb_switch *parent = tb_switch_parent(sw);
476         struct tb_port *up, *down;
477         int ret;
478
479         up = tb_upstream_port(sw);
480         down = tb_port_at(tb_route(sw), parent);
481
482         ret = tb_port_tmu_unidirectional_disable(up);
483         if (ret)
484                 return ret;
485
486         ret = tb_port_tmu_unidirectional_disable(down);
487         if (ret)
488                 goto out;
489
490         ret = tb_switch_tmu_rate_write(sw, TB_SWITCH_TMU_RATE_HIFI);
491         if (ret)
492                 goto out;
493
494         ret = tb_port_tmu_time_sync_enable(up);
495         if (ret)
496                 goto out;
497
498         ret = tb_port_tmu_time_sync_enable(down);
499         if (ret)
500                 goto out;
501
502         return 0;
503
504 out:
505         __tb_switch_tmu_off(sw, false);
506         return ret;
507 }
508
509 static int tb_switch_tmu_objection_mask(struct tb_switch *sw)
510 {
511         u32 val;
512         int ret;
513
514         ret = tb_sw_read(sw, &val, TB_CFG_SWITCH,
515                          sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_9, 1);
516         if (ret)
517                 return ret;
518
519         val &= ~TB_TIME_VSEC_3_CS_9_TMU_OBJ_MASK;
520
521         return tb_sw_write(sw, &val, TB_CFG_SWITCH,
522                            sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_9, 1);
523 }
524
525 static int tb_switch_tmu_unidirectional_enable(struct tb_switch *sw)
526 {
527         struct tb_port *up = tb_upstream_port(sw);
528
529         return tb_port_tmu_write(up, TMU_ADP_CS_6,
530                                  TMU_ADP_CS_6_DISABLE_TMU_OBJ_MASK,
531                                  TMU_ADP_CS_6_DISABLE_TMU_OBJ_MASK);
532 }
533
534 /*
535  * This function is called when the previous TMU mode was
536  * TB_SWITCH_TMU_RATE_OFF.
537  */
538 static int __tb_switch_tmu_enable_unidirectional(struct tb_switch *sw)
539 {
540         struct tb_switch *parent = tb_switch_parent(sw);
541         struct tb_port *up, *down;
542         int ret;
543
544         up = tb_upstream_port(sw);
545         down = tb_port_at(tb_route(sw), parent);
546         ret = tb_switch_tmu_rate_write(parent, sw->tmu.rate_request);
547         if (ret)
548                 return ret;
549
550         ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.rate_request);
551         if (ret)
552                 return ret;
553
554         ret = tb_port_tmu_unidirectional_enable(up);
555         if (ret)
556                 goto out;
557
558         ret = tb_port_tmu_time_sync_enable(up);
559         if (ret)
560                 goto out;
561
562         ret = tb_port_tmu_unidirectional_enable(down);
563         if (ret)
564                 goto out;
565
566         ret = tb_port_tmu_time_sync_enable(down);
567         if (ret)
568                 goto out;
569
570         return 0;
571
572 out:
573         __tb_switch_tmu_off(sw, true);
574         return ret;
575 }
576
577 static void __tb_switch_tmu_change_mode_prev(struct tb_switch *sw)
578 {
579         struct tb_switch *parent = tb_switch_parent(sw);
580         struct tb_port *down, *up;
581
582         down = tb_port_at(tb_route(sw), parent);
583         up = tb_upstream_port(sw);
584         /*
585          * In case of any failure in one of the steps when change mode,
586          * get back to the TMU configurations in previous mode.
587          * In case of additional failures in the functions below,
588          * ignore them since the caller shall already report a failure.
589          */
590         tb_port_tmu_set_unidirectional(down, sw->tmu.unidirectional);
591         if (sw->tmu.unidirectional_request)
592                 tb_switch_tmu_rate_write(parent, sw->tmu.rate);
593         else
594                 tb_switch_tmu_rate_write(sw, sw->tmu.rate);
595
596         tb_switch_set_tmu_mode_params(sw, sw->tmu.rate);
597         tb_port_tmu_set_unidirectional(up, sw->tmu.unidirectional);
598 }
599
600 static int __tb_switch_tmu_change_mode(struct tb_switch *sw)
601 {
602         struct tb_switch *parent = tb_switch_parent(sw);
603         struct tb_port *up, *down;
604         int ret;
605
606         up = tb_upstream_port(sw);
607         down = tb_port_at(tb_route(sw), parent);
608         ret = tb_port_tmu_set_unidirectional(down, sw->tmu.unidirectional_request);
609         if (ret)
610                 goto out;
611
612         if (sw->tmu.unidirectional_request)
613                 ret = tb_switch_tmu_rate_write(parent, sw->tmu.rate_request);
614         else
615                 ret = tb_switch_tmu_rate_write(sw, sw->tmu.rate_request);
616         if (ret)
617                 return ret;
618
619         ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.rate_request);
620         if (ret)
621                 return ret;
622
623         ret = tb_port_tmu_set_unidirectional(up, sw->tmu.unidirectional_request);
624         if (ret)
625                 goto out;
626
627         ret = tb_port_tmu_time_sync_enable(down);
628         if (ret)
629                 goto out;
630
631         ret = tb_port_tmu_time_sync_enable(up);
632         if (ret)
633                 goto out;
634
635         return 0;
636
637 out:
638         __tb_switch_tmu_change_mode_prev(sw);
639         return ret;
640 }
641
642 /**
643  * tb_switch_tmu_enable() - Enable TMU on a router
644  * @sw: Router whose TMU to enable
645  *
646  * Enables TMU of a router to be in uni-directional Normal/HiFi
647  * or bi-directional HiFi mode. Calling tb_switch_tmu_configure() is required
648  * before calling this function, to select the mode Normal/HiFi and
649  * directionality (uni-directional/bi-directional).
650  * In HiFi mode all tunneling should work. In Normal mode, DP tunneling can't
651  * work. Uni-directional mode is required for CLx (Link Low-Power) to work.
652  */
653 int tb_switch_tmu_enable(struct tb_switch *sw)
654 {
655         bool unidirectional = sw->tmu.unidirectional_request;
656         int ret;
657
658         if (unidirectional && !sw->tmu.has_ucap)
659                 return -EOPNOTSUPP;
660
661         /*
662          * No need to enable TMU on devices that don't support CLx since on
663          * these devices e.g. Alpine Ridge and earlier, the TMU mode HiFi
664          * bi-directional is enabled by default.
665          */
666         if (!tb_switch_is_clx_supported(sw))
667                 return 0;
668
669         if (tb_switch_tmu_is_enabled(sw, sw->tmu.unidirectional_request))
670                 return 0;
671
672         if (tb_switch_is_titan_ridge(sw) && unidirectional) {
673                 /*
674                  * Titan Ridge supports CL0s and CL1 only. CL0s and CL1 are
675                  * enabled and supported together.
676                  */
677                 if (!tb_switch_is_clx_enabled(sw, TB_CL1))
678                         return -EOPNOTSUPP;
679
680                 ret = tb_switch_tmu_objection_mask(sw);
681                 if (ret)
682                         return ret;
683
684                 ret = tb_switch_tmu_unidirectional_enable(sw);
685                 if (ret)
686                         return ret;
687         }
688
689         ret = tb_switch_tmu_set_time_disruption(sw, true);
690         if (ret)
691                 return ret;
692
693         if (tb_route(sw)) {
694                 /*
695                  * The used mode changes are from OFF to
696                  * HiFi-Uni/HiFi-BiDir/Normal-Uni or from Normal-Uni to
697                  * HiFi-Uni.
698                  */
699                 if (sw->tmu.rate == TB_SWITCH_TMU_RATE_OFF) {
700                         if (unidirectional)
701                                 ret = __tb_switch_tmu_enable_unidirectional(sw);
702                         else
703                                 ret = __tb_switch_tmu_enable_bidirectional(sw);
704                         if (ret)
705                                 return ret;
706                 } else if (sw->tmu.rate == TB_SWITCH_TMU_RATE_NORMAL) {
707                         ret = __tb_switch_tmu_change_mode(sw);
708                         if (ret)
709                                 return ret;
710                 }
711                 sw->tmu.unidirectional = unidirectional;
712         } else {
713                 /*
714                  * Host router port configurations are written as
715                  * part of configurations for downstream port of the parent
716                  * of the child node - see above.
717                  * Here only the host router' rate configuration is written.
718                  */
719                 ret = tb_switch_tmu_rate_write(sw, sw->tmu.rate_request);
720                 if (ret)
721                         return ret;
722         }
723
724         sw->tmu.rate = sw->tmu.rate_request;
725
726         tb_sw_dbg(sw, "TMU: mode set to: %s\n", tb_switch_tmu_mode_name(sw));
727         return tb_switch_tmu_set_time_disruption(sw, false);
728 }
729
730 /**
731  * tb_switch_tmu_configure() - Configure the TMU rate and directionality
732  * @sw: Router whose mode to change
733  * @rate: Rate to configure Off/Normal/HiFi
734  * @unidirectional: If uni-directional (bi-directional otherwise)
735  *
736  * Selects the rate of the TMU and directionality (uni-directional or
737  * bi-directional). Must be called before tb_switch_tmu_enable().
738  */
739 void tb_switch_tmu_configure(struct tb_switch *sw,
740                              enum tb_switch_tmu_rate rate, bool unidirectional)
741 {
742         sw->tmu.unidirectional_request = unidirectional;
743         sw->tmu.rate_request = rate;
744 }
745
746 static int tb_switch_tmu_config_enable(struct device *dev, void *rate)
747 {
748         if (tb_is_switch(dev)) {
749                 struct tb_switch *sw = tb_to_switch(dev);
750
751                 tb_switch_tmu_configure(sw, *(enum tb_switch_tmu_rate *)rate,
752                                         tb_switch_is_clx_enabled(sw, TB_CL1));
753                 if (tb_switch_tmu_enable(sw))
754                         tb_sw_dbg(sw, "fail switching TMU mode for 1st depth router\n");
755         }
756
757         return 0;
758 }
759
760 /**
761  * tb_switch_enable_tmu_1st_child - Configure and enable TMU for 1st chidren
762  * @sw: The router to configure and enable it's children TMU
763  * @rate: Rate of the TMU to configure the router's chidren to
764  *
765  * Configures and enables the TMU mode of 1st depth children of the specified
766  * router to the specified rate.
767  */
768 void tb_switch_enable_tmu_1st_child(struct tb_switch *sw,
769                                     enum tb_switch_tmu_rate rate)
770 {
771         device_for_each_child(&sw->dev, &rate,
772                               tb_switch_tmu_config_enable);
773 }