Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
fork
Configure Feed
Select the types of activity you want to include in your feed.
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Thunderbolt driver - Tunneling support
4 *
5 * Copyright (c) 2014 Andreas Noever <andreas.noever@gmail.com>
6 * Copyright (C) 2019, Intel Corporation
7 */
8
9#include <linux/delay.h>
10#include <linux/slab.h>
11#include <linux/list.h>
12
13#include "tunnel.h"
14#include "tb.h"
15
16/* PCIe adapters use always HopID of 8 for both directions */
17#define TB_PCI_HOPID 8
18
19#define TB_PCI_PATH_DOWN 0
20#define TB_PCI_PATH_UP 1
21
22/* DP adapters use HopID 8 for AUX and 9 for Video */
23#define TB_DP_AUX_TX_HOPID 8
24#define TB_DP_AUX_RX_HOPID 8
25#define TB_DP_VIDEO_HOPID 9
26
27#define TB_DP_VIDEO_PATH_OUT 0
28#define TB_DP_AUX_PATH_OUT 1
29#define TB_DP_AUX_PATH_IN 2
30
31#define TB_DMA_PATH_OUT 0
32#define TB_DMA_PATH_IN 1
33
34static const char * const tb_tunnel_names[] = { "PCI", "DP", "DMA" };
35
36#define __TB_TUNNEL_PRINT(level, tunnel, fmt, arg...) \
37 do { \
38 struct tb_tunnel *__tunnel = (tunnel); \
39 level(__tunnel->tb, "%llx:%x <-> %llx:%x (%s): " fmt, \
40 tb_route(__tunnel->src_port->sw), \
41 __tunnel->src_port->port, \
42 tb_route(__tunnel->dst_port->sw), \
43 __tunnel->dst_port->port, \
44 tb_tunnel_names[__tunnel->type], \
45 ## arg); \
46 } while (0)
47
48#define tb_tunnel_WARN(tunnel, fmt, arg...) \
49 __TB_TUNNEL_PRINT(tb_WARN, tunnel, fmt, ##arg)
50#define tb_tunnel_warn(tunnel, fmt, arg...) \
51 __TB_TUNNEL_PRINT(tb_warn, tunnel, fmt, ##arg)
52#define tb_tunnel_info(tunnel, fmt, arg...) \
53 __TB_TUNNEL_PRINT(tb_info, tunnel, fmt, ##arg)
54#define tb_tunnel_dbg(tunnel, fmt, arg...) \
55 __TB_TUNNEL_PRINT(tb_dbg, tunnel, fmt, ##arg)
56
57static struct tb_tunnel *tb_tunnel_alloc(struct tb *tb, size_t npaths,
58 enum tb_tunnel_type type)
59{
60 struct tb_tunnel *tunnel;
61
62 tunnel = kzalloc(sizeof(*tunnel), GFP_KERNEL);
63 if (!tunnel)
64 return NULL;
65
66 tunnel->paths = kcalloc(npaths, sizeof(tunnel->paths[0]), GFP_KERNEL);
67 if (!tunnel->paths) {
68 tb_tunnel_free(tunnel);
69 return NULL;
70 }
71
72 INIT_LIST_HEAD(&tunnel->list);
73 tunnel->tb = tb;
74 tunnel->npaths = npaths;
75 tunnel->type = type;
76
77 return tunnel;
78}
79
80static int tb_pci_activate(struct tb_tunnel *tunnel, bool activate)
81{
82 int res;
83
84 res = tb_pci_port_enable(tunnel->src_port, activate);
85 if (res)
86 return res;
87
88 if (tb_port_is_pcie_up(tunnel->dst_port))
89 return tb_pci_port_enable(tunnel->dst_port, activate);
90
91 return 0;
92}
93
94static int tb_initial_credits(const struct tb_switch *sw)
95{
96 /* If the path is complete sw is not NULL */
97 if (sw) {
98 /* More credits for faster link */
99 switch (sw->link_speed * sw->link_width) {
100 case 40:
101 return 32;
102 case 20:
103 return 24;
104 }
105 }
106
107 return 16;
108}
109
110static void tb_pci_init_path(struct tb_path *path)
111{
112 path->egress_fc_enable = TB_PATH_SOURCE | TB_PATH_INTERNAL;
113 path->egress_shared_buffer = TB_PATH_NONE;
114 path->ingress_fc_enable = TB_PATH_ALL;
115 path->ingress_shared_buffer = TB_PATH_NONE;
116 path->priority = 3;
117 path->weight = 1;
118 path->drop_packages = 0;
119 path->nfc_credits = 0;
120 path->hops[0].initial_credits = 7;
121 path->hops[1].initial_credits =
122 tb_initial_credits(path->hops[1].in_port->sw);
123}
124
125/**
126 * tb_tunnel_discover_pci() - Discover existing PCIe tunnels
127 * @tb: Pointer to the domain structure
128 * @down: PCIe downstream adapter
129 *
130 * If @down adapter is active, follows the tunnel to the PCIe upstream
131 * adapter and back. Returns the discovered tunnel or %NULL if there was
132 * no tunnel.
133 */
134struct tb_tunnel *tb_tunnel_discover_pci(struct tb *tb, struct tb_port *down)
135{
136 struct tb_tunnel *tunnel;
137 struct tb_path *path;
138
139 if (!tb_pci_port_is_enabled(down))
140 return NULL;
141
142 tunnel = tb_tunnel_alloc(tb, 2, TB_TUNNEL_PCI);
143 if (!tunnel)
144 return NULL;
145
146 tunnel->activate = tb_pci_activate;
147 tunnel->src_port = down;
148
149 /*
150 * Discover both paths even if they are not complete. We will
151 * clean them up by calling tb_tunnel_deactivate() below in that
152 * case.
153 */
154 path = tb_path_discover(down, TB_PCI_HOPID, NULL, -1,
155 &tunnel->dst_port, "PCIe Up");
156 if (!path) {
157 /* Just disable the downstream port */
158 tb_pci_port_enable(down, false);
159 goto err_free;
160 }
161 tunnel->paths[TB_PCI_PATH_UP] = path;
162 tb_pci_init_path(tunnel->paths[TB_PCI_PATH_UP]);
163
164 path = tb_path_discover(tunnel->dst_port, -1, down, TB_PCI_HOPID, NULL,
165 "PCIe Down");
166 if (!path)
167 goto err_deactivate;
168 tunnel->paths[TB_PCI_PATH_DOWN] = path;
169 tb_pci_init_path(tunnel->paths[TB_PCI_PATH_DOWN]);
170
171 /* Validate that the tunnel is complete */
172 if (!tb_port_is_pcie_up(tunnel->dst_port)) {
173 tb_port_warn(tunnel->dst_port,
174 "path does not end on a PCIe adapter, cleaning up\n");
175 goto err_deactivate;
176 }
177
178 if (down != tunnel->src_port) {
179 tb_tunnel_warn(tunnel, "path is not complete, cleaning up\n");
180 goto err_deactivate;
181 }
182
183 if (!tb_pci_port_is_enabled(tunnel->dst_port)) {
184 tb_tunnel_warn(tunnel,
185 "tunnel is not fully activated, cleaning up\n");
186 goto err_deactivate;
187 }
188
189 tb_tunnel_dbg(tunnel, "discovered\n");
190 return tunnel;
191
192err_deactivate:
193 tb_tunnel_deactivate(tunnel);
194err_free:
195 tb_tunnel_free(tunnel);
196
197 return NULL;
198}
199
200/**
201 * tb_tunnel_alloc_pci() - allocate a pci tunnel
202 * @tb: Pointer to the domain structure
203 * @up: PCIe upstream adapter port
204 * @down: PCIe downstream adapter port
205 *
206 * Allocate a PCI tunnel. The ports must be of type TB_TYPE_PCIE_UP and
207 * TB_TYPE_PCIE_DOWN.
208 *
209 * Return: Returns a tb_tunnel on success or NULL on failure.
210 */
211struct tb_tunnel *tb_tunnel_alloc_pci(struct tb *tb, struct tb_port *up,
212 struct tb_port *down)
213{
214 struct tb_tunnel *tunnel;
215 struct tb_path *path;
216
217 tunnel = tb_tunnel_alloc(tb, 2, TB_TUNNEL_PCI);
218 if (!tunnel)
219 return NULL;
220
221 tunnel->activate = tb_pci_activate;
222 tunnel->src_port = down;
223 tunnel->dst_port = up;
224
225 path = tb_path_alloc(tb, down, TB_PCI_HOPID, up, TB_PCI_HOPID, 0,
226 "PCIe Down");
227 if (!path) {
228 tb_tunnel_free(tunnel);
229 return NULL;
230 }
231 tb_pci_init_path(path);
232 tunnel->paths[TB_PCI_PATH_DOWN] = path;
233
234 path = tb_path_alloc(tb, up, TB_PCI_HOPID, down, TB_PCI_HOPID, 0,
235 "PCIe Up");
236 if (!path) {
237 tb_tunnel_free(tunnel);
238 return NULL;
239 }
240 tb_pci_init_path(path);
241 tunnel->paths[TB_PCI_PATH_UP] = path;
242
243 return tunnel;
244}
245
246static int tb_dp_cm_handshake(struct tb_port *in, struct tb_port *out)
247{
248 int timeout = 10;
249 u32 val;
250 int ret;
251
252 /* Both ends need to support this */
253 if (!tb_switch_is_titan_ridge(in->sw) ||
254 !tb_switch_is_titan_ridge(out->sw))
255 return 0;
256
257 ret = tb_port_read(out, &val, TB_CFG_PORT,
258 out->cap_adap + DP_STATUS_CTRL, 1);
259 if (ret)
260 return ret;
261
262 val |= DP_STATUS_CTRL_UF | DP_STATUS_CTRL_CMHS;
263
264 ret = tb_port_write(out, &val, TB_CFG_PORT,
265 out->cap_adap + DP_STATUS_CTRL, 1);
266 if (ret)
267 return ret;
268
269 do {
270 ret = tb_port_read(out, &val, TB_CFG_PORT,
271 out->cap_adap + DP_STATUS_CTRL, 1);
272 if (ret)
273 return ret;
274 if (!(val & DP_STATUS_CTRL_CMHS))
275 return 0;
276 usleep_range(10, 100);
277 } while (timeout--);
278
279 return -ETIMEDOUT;
280}
281
282static inline u32 tb_dp_cap_get_rate(u32 val)
283{
284 u32 rate = (val & DP_COMMON_CAP_RATE_MASK) >> DP_COMMON_CAP_RATE_SHIFT;
285
286 switch (rate) {
287 case DP_COMMON_CAP_RATE_RBR:
288 return 1620;
289 case DP_COMMON_CAP_RATE_HBR:
290 return 2700;
291 case DP_COMMON_CAP_RATE_HBR2:
292 return 5400;
293 case DP_COMMON_CAP_RATE_HBR3:
294 return 8100;
295 default:
296 return 0;
297 }
298}
299
300static inline u32 tb_dp_cap_set_rate(u32 val, u32 rate)
301{
302 val &= ~DP_COMMON_CAP_RATE_MASK;
303 switch (rate) {
304 default:
305 WARN(1, "invalid rate %u passed, defaulting to 1620 MB/s\n", rate);
306 /* Fallthrough */
307 case 1620:
308 val |= DP_COMMON_CAP_RATE_RBR << DP_COMMON_CAP_RATE_SHIFT;
309 break;
310 case 2700:
311 val |= DP_COMMON_CAP_RATE_HBR << DP_COMMON_CAP_RATE_SHIFT;
312 break;
313 case 5400:
314 val |= DP_COMMON_CAP_RATE_HBR2 << DP_COMMON_CAP_RATE_SHIFT;
315 break;
316 case 8100:
317 val |= DP_COMMON_CAP_RATE_HBR3 << DP_COMMON_CAP_RATE_SHIFT;
318 break;
319 }
320 return val;
321}
322
323static inline u32 tb_dp_cap_get_lanes(u32 val)
324{
325 u32 lanes = (val & DP_COMMON_CAP_LANES_MASK) >> DP_COMMON_CAP_LANES_SHIFT;
326
327 switch (lanes) {
328 case DP_COMMON_CAP_1_LANE:
329 return 1;
330 case DP_COMMON_CAP_2_LANES:
331 return 2;
332 case DP_COMMON_CAP_4_LANES:
333 return 4;
334 default:
335 return 0;
336 }
337}
338
339static inline u32 tb_dp_cap_set_lanes(u32 val, u32 lanes)
340{
341 val &= ~DP_COMMON_CAP_LANES_MASK;
342 switch (lanes) {
343 default:
344 WARN(1, "invalid number of lanes %u passed, defaulting to 1\n",
345 lanes);
346 /* Fallthrough */
347 case 1:
348 val |= DP_COMMON_CAP_1_LANE << DP_COMMON_CAP_LANES_SHIFT;
349 break;
350 case 2:
351 val |= DP_COMMON_CAP_2_LANES << DP_COMMON_CAP_LANES_SHIFT;
352 break;
353 case 4:
354 val |= DP_COMMON_CAP_4_LANES << DP_COMMON_CAP_LANES_SHIFT;
355 break;
356 }
357 return val;
358}
359
360static unsigned int tb_dp_bandwidth(unsigned int rate, unsigned int lanes)
361{
362 /* Tunneling removes the DP 8b/10b encoding */
363 return rate * lanes * 8 / 10;
364}
365
366static int tb_dp_reduce_bandwidth(int max_bw, u32 in_rate, u32 in_lanes,
367 u32 out_rate, u32 out_lanes, u32 *new_rate,
368 u32 *new_lanes)
369{
370 static const u32 dp_bw[][2] = {
371 /* Mb/s, lanes */
372 { 8100, 4 }, /* 25920 Mb/s */
373 { 5400, 4 }, /* 17280 Mb/s */
374 { 8100, 2 }, /* 12960 Mb/s */
375 { 2700, 4 }, /* 8640 Mb/s */
376 { 5400, 2 }, /* 8640 Mb/s */
377 { 8100, 1 }, /* 6480 Mb/s */
378 { 1620, 4 }, /* 5184 Mb/s */
379 { 5400, 1 }, /* 4320 Mb/s */
380 { 2700, 2 }, /* 4320 Mb/s */
381 { 1620, 2 }, /* 2592 Mb/s */
382 { 2700, 1 }, /* 2160 Mb/s */
383 { 1620, 1 }, /* 1296 Mb/s */
384 };
385 unsigned int i;
386
387 /*
388 * Find a combination that can fit into max_bw and does not
389 * exceed the maximum rate and lanes supported by the DP OUT and
390 * DP IN adapters.
391 */
392 for (i = 0; i < ARRAY_SIZE(dp_bw); i++) {
393 if (dp_bw[i][0] > out_rate || dp_bw[i][1] > out_lanes)
394 continue;
395
396 if (dp_bw[i][0] > in_rate || dp_bw[i][1] > in_lanes)
397 continue;
398
399 if (tb_dp_bandwidth(dp_bw[i][0], dp_bw[i][1]) <= max_bw) {
400 *new_rate = dp_bw[i][0];
401 *new_lanes = dp_bw[i][1];
402 return 0;
403 }
404 }
405
406 return -ENOSR;
407}
408
409static int tb_dp_xchg_caps(struct tb_tunnel *tunnel)
410{
411 u32 out_dp_cap, out_rate, out_lanes, in_dp_cap, in_rate, in_lanes, bw;
412 struct tb_port *out = tunnel->dst_port;
413 struct tb_port *in = tunnel->src_port;
414 int ret;
415
416 /*
417 * Copy DP_LOCAL_CAP register to DP_REMOTE_CAP register for
418 * newer generation hardware.
419 */
420 if (in->sw->generation < 2 || out->sw->generation < 2)
421 return 0;
422
423 /*
424 * Perform connection manager handshake between IN and OUT ports
425 * before capabilities exchange can take place.
426 */
427 ret = tb_dp_cm_handshake(in, out);
428 if (ret)
429 return ret;
430
431 /* Read both DP_LOCAL_CAP registers */
432 ret = tb_port_read(in, &in_dp_cap, TB_CFG_PORT,
433 in->cap_adap + DP_LOCAL_CAP, 1);
434 if (ret)
435 return ret;
436
437 ret = tb_port_read(out, &out_dp_cap, TB_CFG_PORT,
438 out->cap_adap + DP_LOCAL_CAP, 1);
439 if (ret)
440 return ret;
441
442 /* Write IN local caps to OUT remote caps */
443 ret = tb_port_write(out, &in_dp_cap, TB_CFG_PORT,
444 out->cap_adap + DP_REMOTE_CAP, 1);
445 if (ret)
446 return ret;
447
448 in_rate = tb_dp_cap_get_rate(in_dp_cap);
449 in_lanes = tb_dp_cap_get_lanes(in_dp_cap);
450 tb_port_dbg(in, "maximum supported bandwidth %u Mb/s x%u = %u Mb/s\n",
451 in_rate, in_lanes, tb_dp_bandwidth(in_rate, in_lanes));
452
453 /*
454 * If the tunnel bandwidth is limited (max_bw is set) then see
455 * if we need to reduce bandwidth to fit there.
456 */
457 out_rate = tb_dp_cap_get_rate(out_dp_cap);
458 out_lanes = tb_dp_cap_get_lanes(out_dp_cap);
459 bw = tb_dp_bandwidth(out_rate, out_lanes);
460 tb_port_dbg(out, "maximum supported bandwidth %u Mb/s x%u = %u Mb/s\n",
461 out_rate, out_lanes, bw);
462
463 if (tunnel->max_bw && bw > tunnel->max_bw) {
464 u32 new_rate, new_lanes, new_bw;
465
466 ret = tb_dp_reduce_bandwidth(tunnel->max_bw, in_rate, in_lanes,
467 out_rate, out_lanes, &new_rate,
468 &new_lanes);
469 if (ret) {
470 tb_port_info(out, "not enough bandwidth for DP tunnel\n");
471 return ret;
472 }
473
474 new_bw = tb_dp_bandwidth(new_rate, new_lanes);
475 tb_port_dbg(out, "bandwidth reduced to %u Mb/s x%u = %u Mb/s\n",
476 new_rate, new_lanes, new_bw);
477
478 /*
479 * Set new rate and number of lanes before writing it to
480 * the IN port remote caps.
481 */
482 out_dp_cap = tb_dp_cap_set_rate(out_dp_cap, new_rate);
483 out_dp_cap = tb_dp_cap_set_lanes(out_dp_cap, new_lanes);
484 }
485
486 return tb_port_write(in, &out_dp_cap, TB_CFG_PORT,
487 in->cap_adap + DP_REMOTE_CAP, 1);
488}
489
490static int tb_dp_activate(struct tb_tunnel *tunnel, bool active)
491{
492 int ret;
493
494 if (active) {
495 struct tb_path **paths;
496 int last;
497
498 paths = tunnel->paths;
499 last = paths[TB_DP_VIDEO_PATH_OUT]->path_length - 1;
500
501 tb_dp_port_set_hops(tunnel->src_port,
502 paths[TB_DP_VIDEO_PATH_OUT]->hops[0].in_hop_index,
503 paths[TB_DP_AUX_PATH_OUT]->hops[0].in_hop_index,
504 paths[TB_DP_AUX_PATH_IN]->hops[last].next_hop_index);
505
506 tb_dp_port_set_hops(tunnel->dst_port,
507 paths[TB_DP_VIDEO_PATH_OUT]->hops[last].next_hop_index,
508 paths[TB_DP_AUX_PATH_IN]->hops[0].in_hop_index,
509 paths[TB_DP_AUX_PATH_OUT]->hops[last].next_hop_index);
510 } else {
511 tb_dp_port_hpd_clear(tunnel->src_port);
512 tb_dp_port_set_hops(tunnel->src_port, 0, 0, 0);
513 if (tb_port_is_dpout(tunnel->dst_port))
514 tb_dp_port_set_hops(tunnel->dst_port, 0, 0, 0);
515 }
516
517 ret = tb_dp_port_enable(tunnel->src_port, active);
518 if (ret)
519 return ret;
520
521 if (tb_port_is_dpout(tunnel->dst_port))
522 return tb_dp_port_enable(tunnel->dst_port, active);
523
524 return 0;
525}
526
527static int tb_dp_consumed_bandwidth(struct tb_tunnel *tunnel)
528{
529 struct tb_port *in = tunnel->src_port;
530 const struct tb_switch *sw = in->sw;
531 u32 val, rate = 0, lanes = 0;
532 int ret;
533
534 if (tb_switch_is_titan_ridge(sw)) {
535 int timeout = 10;
536
537 /*
538 * Wait for DPRX done. Normally it should be already set
539 * for active tunnel.
540 */
541 do {
542 ret = tb_port_read(in, &val, TB_CFG_PORT,
543 in->cap_adap + DP_COMMON_CAP, 1);
544 if (ret)
545 return ret;
546
547 if (val & DP_COMMON_CAP_DPRX_DONE) {
548 rate = tb_dp_cap_get_rate(val);
549 lanes = tb_dp_cap_get_lanes(val);
550 break;
551 }
552 msleep(250);
553 } while (timeout--);
554
555 if (!timeout)
556 return -ETIMEDOUT;
557 } else if (sw->generation >= 2) {
558 /*
559 * Read from the copied remote cap so that we take into
560 * account if capabilities were reduced during exchange.
561 */
562 ret = tb_port_read(in, &val, TB_CFG_PORT,
563 in->cap_adap + DP_REMOTE_CAP, 1);
564 if (ret)
565 return ret;
566
567 rate = tb_dp_cap_get_rate(val);
568 lanes = tb_dp_cap_get_lanes(val);
569 } else {
570 /* No bandwidth management for legacy devices */
571 return 0;
572 }
573
574 return tb_dp_bandwidth(rate, lanes);
575}
576
577static void tb_dp_init_aux_path(struct tb_path *path)
578{
579 int i;
580
581 path->egress_fc_enable = TB_PATH_SOURCE | TB_PATH_INTERNAL;
582 path->egress_shared_buffer = TB_PATH_NONE;
583 path->ingress_fc_enable = TB_PATH_ALL;
584 path->ingress_shared_buffer = TB_PATH_NONE;
585 path->priority = 2;
586 path->weight = 1;
587
588 for (i = 0; i < path->path_length; i++)
589 path->hops[i].initial_credits = 1;
590}
591
592static void tb_dp_init_video_path(struct tb_path *path, bool discover)
593{
594 u32 nfc_credits = path->hops[0].in_port->config.nfc_credits;
595
596 path->egress_fc_enable = TB_PATH_NONE;
597 path->egress_shared_buffer = TB_PATH_NONE;
598 path->ingress_fc_enable = TB_PATH_NONE;
599 path->ingress_shared_buffer = TB_PATH_NONE;
600 path->priority = 1;
601 path->weight = 1;
602
603 if (discover) {
604 path->nfc_credits = nfc_credits & ADP_CS_4_NFC_BUFFERS_MASK;
605 } else {
606 u32 max_credits;
607
608 max_credits = (nfc_credits & ADP_CS_4_TOTAL_BUFFERS_MASK) >>
609 ADP_CS_4_TOTAL_BUFFERS_SHIFT;
610 /* Leave some credits for AUX path */
611 path->nfc_credits = min(max_credits - 2, 12U);
612 }
613}
614
615/**
616 * tb_tunnel_discover_dp() - Discover existing Display Port tunnels
617 * @tb: Pointer to the domain structure
618 * @in: DP in adapter
619 *
620 * If @in adapter is active, follows the tunnel to the DP out adapter
621 * and back. Returns the discovered tunnel or %NULL if there was no
622 * tunnel.
623 *
624 * Return: DP tunnel or %NULL if no tunnel found.
625 */
626struct tb_tunnel *tb_tunnel_discover_dp(struct tb *tb, struct tb_port *in)
627{
628 struct tb_tunnel *tunnel;
629 struct tb_port *port;
630 struct tb_path *path;
631
632 if (!tb_dp_port_is_enabled(in))
633 return NULL;
634
635 tunnel = tb_tunnel_alloc(tb, 3, TB_TUNNEL_DP);
636 if (!tunnel)
637 return NULL;
638
639 tunnel->init = tb_dp_xchg_caps;
640 tunnel->activate = tb_dp_activate;
641 tunnel->consumed_bandwidth = tb_dp_consumed_bandwidth;
642 tunnel->src_port = in;
643
644 path = tb_path_discover(in, TB_DP_VIDEO_HOPID, NULL, -1,
645 &tunnel->dst_port, "Video");
646 if (!path) {
647 /* Just disable the DP IN port */
648 tb_dp_port_enable(in, false);
649 goto err_free;
650 }
651 tunnel->paths[TB_DP_VIDEO_PATH_OUT] = path;
652 tb_dp_init_video_path(tunnel->paths[TB_DP_VIDEO_PATH_OUT], true);
653
654 path = tb_path_discover(in, TB_DP_AUX_TX_HOPID, NULL, -1, NULL, "AUX TX");
655 if (!path)
656 goto err_deactivate;
657 tunnel->paths[TB_DP_AUX_PATH_OUT] = path;
658 tb_dp_init_aux_path(tunnel->paths[TB_DP_AUX_PATH_OUT]);
659
660 path = tb_path_discover(tunnel->dst_port, -1, in, TB_DP_AUX_RX_HOPID,
661 &port, "AUX RX");
662 if (!path)
663 goto err_deactivate;
664 tunnel->paths[TB_DP_AUX_PATH_IN] = path;
665 tb_dp_init_aux_path(tunnel->paths[TB_DP_AUX_PATH_IN]);
666
667 /* Validate that the tunnel is complete */
668 if (!tb_port_is_dpout(tunnel->dst_port)) {
669 tb_port_warn(in, "path does not end on a DP adapter, cleaning up\n");
670 goto err_deactivate;
671 }
672
673 if (!tb_dp_port_is_enabled(tunnel->dst_port))
674 goto err_deactivate;
675
676 if (!tb_dp_port_hpd_is_active(tunnel->dst_port))
677 goto err_deactivate;
678
679 if (port != tunnel->src_port) {
680 tb_tunnel_warn(tunnel, "path is not complete, cleaning up\n");
681 goto err_deactivate;
682 }
683
684 tb_tunnel_dbg(tunnel, "discovered\n");
685 return tunnel;
686
687err_deactivate:
688 tb_tunnel_deactivate(tunnel);
689err_free:
690 tb_tunnel_free(tunnel);
691
692 return NULL;
693}
694
695/**
696 * tb_tunnel_alloc_dp() - allocate a Display Port tunnel
697 * @tb: Pointer to the domain structure
698 * @in: DP in adapter port
699 * @out: DP out adapter port
700 * @max_bw: Maximum available bandwidth for the DP tunnel (%0 if not limited)
701 *
702 * Allocates a tunnel between @in and @out that is capable of tunneling
703 * Display Port traffic.
704 *
705 * Return: Returns a tb_tunnel on success or NULL on failure.
706 */
707struct tb_tunnel *tb_tunnel_alloc_dp(struct tb *tb, struct tb_port *in,
708 struct tb_port *out, int max_bw)
709{
710 struct tb_tunnel *tunnel;
711 struct tb_path **paths;
712 struct tb_path *path;
713
714 if (WARN_ON(!in->cap_adap || !out->cap_adap))
715 return NULL;
716
717 tunnel = tb_tunnel_alloc(tb, 3, TB_TUNNEL_DP);
718 if (!tunnel)
719 return NULL;
720
721 tunnel->init = tb_dp_xchg_caps;
722 tunnel->activate = tb_dp_activate;
723 tunnel->consumed_bandwidth = tb_dp_consumed_bandwidth;
724 tunnel->src_port = in;
725 tunnel->dst_port = out;
726 tunnel->max_bw = max_bw;
727
728 paths = tunnel->paths;
729
730 path = tb_path_alloc(tb, in, TB_DP_VIDEO_HOPID, out, TB_DP_VIDEO_HOPID,
731 1, "Video");
732 if (!path)
733 goto err_free;
734 tb_dp_init_video_path(path, false);
735 paths[TB_DP_VIDEO_PATH_OUT] = path;
736
737 path = tb_path_alloc(tb, in, TB_DP_AUX_TX_HOPID, out,
738 TB_DP_AUX_TX_HOPID, 1, "AUX TX");
739 if (!path)
740 goto err_free;
741 tb_dp_init_aux_path(path);
742 paths[TB_DP_AUX_PATH_OUT] = path;
743
744 path = tb_path_alloc(tb, out, TB_DP_AUX_RX_HOPID, in,
745 TB_DP_AUX_RX_HOPID, 1, "AUX RX");
746 if (!path)
747 goto err_free;
748 tb_dp_init_aux_path(path);
749 paths[TB_DP_AUX_PATH_IN] = path;
750
751 return tunnel;
752
753err_free:
754 tb_tunnel_free(tunnel);
755 return NULL;
756}
757
758static u32 tb_dma_credits(struct tb_port *nhi)
759{
760 u32 max_credits;
761
762 max_credits = (nhi->config.nfc_credits & ADP_CS_4_TOTAL_BUFFERS_MASK) >>
763 ADP_CS_4_TOTAL_BUFFERS_SHIFT;
764 return min(max_credits, 13U);
765}
766
767static int tb_dma_activate(struct tb_tunnel *tunnel, bool active)
768{
769 struct tb_port *nhi = tunnel->src_port;
770 u32 credits;
771
772 credits = active ? tb_dma_credits(nhi) : 0;
773 return tb_port_set_initial_credits(nhi, credits);
774}
775
776static void tb_dma_init_path(struct tb_path *path, unsigned int isb,
777 unsigned int efc, u32 credits)
778{
779 int i;
780
781 path->egress_fc_enable = efc;
782 path->ingress_fc_enable = TB_PATH_ALL;
783 path->egress_shared_buffer = TB_PATH_NONE;
784 path->ingress_shared_buffer = isb;
785 path->priority = 5;
786 path->weight = 1;
787 path->clear_fc = true;
788
789 for (i = 0; i < path->path_length; i++)
790 path->hops[i].initial_credits = credits;
791}
792
793/**
794 * tb_tunnel_alloc_dma() - allocate a DMA tunnel
795 * @tb: Pointer to the domain structure
796 * @nhi: Host controller port
797 * @dst: Destination null port which the other domain is connected to
798 * @transmit_ring: NHI ring number used to send packets towards the
799 * other domain
800 * @transmit_path: HopID used for transmitting packets
801 * @receive_ring: NHI ring number used to receive packets from the
802 * other domain
803 * @reveive_path: HopID used for receiving packets
804 *
805 * Return: Returns a tb_tunnel on success or NULL on failure.
806 */
807struct tb_tunnel *tb_tunnel_alloc_dma(struct tb *tb, struct tb_port *nhi,
808 struct tb_port *dst, int transmit_ring,
809 int transmit_path, int receive_ring,
810 int receive_path)
811{
812 struct tb_tunnel *tunnel;
813 struct tb_path *path;
814 u32 credits;
815
816 tunnel = tb_tunnel_alloc(tb, 2, TB_TUNNEL_DMA);
817 if (!tunnel)
818 return NULL;
819
820 tunnel->activate = tb_dma_activate;
821 tunnel->src_port = nhi;
822 tunnel->dst_port = dst;
823
824 credits = tb_dma_credits(nhi);
825
826 path = tb_path_alloc(tb, dst, receive_path, nhi, receive_ring, 0, "DMA RX");
827 if (!path) {
828 tb_tunnel_free(tunnel);
829 return NULL;
830 }
831 tb_dma_init_path(path, TB_PATH_NONE, TB_PATH_SOURCE | TB_PATH_INTERNAL,
832 credits);
833 tunnel->paths[TB_DMA_PATH_IN] = path;
834
835 path = tb_path_alloc(tb, nhi, transmit_ring, dst, transmit_path, 0, "DMA TX");
836 if (!path) {
837 tb_tunnel_free(tunnel);
838 return NULL;
839 }
840 tb_dma_init_path(path, TB_PATH_SOURCE, TB_PATH_ALL, credits);
841 tunnel->paths[TB_DMA_PATH_OUT] = path;
842
843 return tunnel;
844}
845
846/**
847 * tb_tunnel_free() - free a tunnel
848 * @tunnel: Tunnel to be freed
849 *
850 * Frees a tunnel. The tunnel does not need to be deactivated.
851 */
852void tb_tunnel_free(struct tb_tunnel *tunnel)
853{
854 int i;
855
856 if (!tunnel)
857 return;
858
859 for (i = 0; i < tunnel->npaths; i++) {
860 if (tunnel->paths[i])
861 tb_path_free(tunnel->paths[i]);
862 }
863
864 kfree(tunnel->paths);
865 kfree(tunnel);
866}
867
868/**
869 * tb_tunnel_is_invalid - check whether an activated path is still valid
870 * @tunnel: Tunnel to check
871 */
872bool tb_tunnel_is_invalid(struct tb_tunnel *tunnel)
873{
874 int i;
875
876 for (i = 0; i < tunnel->npaths; i++) {
877 WARN_ON(!tunnel->paths[i]->activated);
878 if (tb_path_is_invalid(tunnel->paths[i]))
879 return true;
880 }
881
882 return false;
883}
884
885/**
886 * tb_tunnel_restart() - activate a tunnel after a hardware reset
887 * @tunnel: Tunnel to restart
888 *
889 * Return: 0 on success and negative errno in case if failure
890 */
891int tb_tunnel_restart(struct tb_tunnel *tunnel)
892{
893 int res, i;
894
895 tb_tunnel_dbg(tunnel, "activating\n");
896
897 /*
898 * Make sure all paths are properly disabled before enabling
899 * them again.
900 */
901 for (i = 0; i < tunnel->npaths; i++) {
902 if (tunnel->paths[i]->activated) {
903 tb_path_deactivate(tunnel->paths[i]);
904 tunnel->paths[i]->activated = false;
905 }
906 }
907
908 if (tunnel->init) {
909 res = tunnel->init(tunnel);
910 if (res)
911 return res;
912 }
913
914 for (i = 0; i < tunnel->npaths; i++) {
915 res = tb_path_activate(tunnel->paths[i]);
916 if (res)
917 goto err;
918 }
919
920 if (tunnel->activate) {
921 res = tunnel->activate(tunnel, true);
922 if (res)
923 goto err;
924 }
925
926 return 0;
927
928err:
929 tb_tunnel_warn(tunnel, "activation failed\n");
930 tb_tunnel_deactivate(tunnel);
931 return res;
932}
933
934/**
935 * tb_tunnel_activate() - activate a tunnel
936 * @tunnel: Tunnel to activate
937 *
938 * Return: Returns 0 on success or an error code on failure.
939 */
940int tb_tunnel_activate(struct tb_tunnel *tunnel)
941{
942 int i;
943
944 for (i = 0; i < tunnel->npaths; i++) {
945 if (tunnel->paths[i]->activated) {
946 tb_tunnel_WARN(tunnel,
947 "trying to activate an already activated tunnel\n");
948 return -EINVAL;
949 }
950 }
951
952 return tb_tunnel_restart(tunnel);
953}
954
955/**
956 * tb_tunnel_deactivate() - deactivate a tunnel
957 * @tunnel: Tunnel to deactivate
958 */
959void tb_tunnel_deactivate(struct tb_tunnel *tunnel)
960{
961 int i;
962
963 tb_tunnel_dbg(tunnel, "deactivating\n");
964
965 if (tunnel->activate)
966 tunnel->activate(tunnel, false);
967
968 for (i = 0; i < tunnel->npaths; i++) {
969 if (tunnel->paths[i] && tunnel->paths[i]->activated)
970 tb_path_deactivate(tunnel->paths[i]);
971 }
972}
973
974/**
975 * tb_tunnel_switch_on_path() - Does the tunnel go through switch
976 * @tunnel: Tunnel to check
977 * @sw: Switch to check
978 *
979 * Returns true if @tunnel goes through @sw (direction does not matter),
980 * false otherwise.
981 */
982bool tb_tunnel_switch_on_path(const struct tb_tunnel *tunnel,
983 const struct tb_switch *sw)
984{
985 int i;
986
987 for (i = 0; i < tunnel->npaths; i++) {
988 if (!tunnel->paths[i])
989 continue;
990 if (tb_path_switch_on_path(tunnel->paths[i], sw))
991 return true;
992 }
993
994 return false;
995}
996
997static bool tb_tunnel_is_active(const struct tb_tunnel *tunnel)
998{
999 int i;
1000
1001 for (i = 0; i < tunnel->npaths; i++) {
1002 if (!tunnel->paths[i])
1003 return false;
1004 if (!tunnel->paths[i]->activated)
1005 return false;
1006 }
1007
1008 return true;
1009}
1010
1011/**
1012 * tb_tunnel_consumed_bandwidth() - Return bandwidth consumed by the tunnel
1013 * @tunnel: Tunnel to check
1014 *
1015 * Returns bandwidth currently consumed by @tunnel and %0 if the @tunnel
1016 * is not active or does consume bandwidth.
1017 */
1018int tb_tunnel_consumed_bandwidth(struct tb_tunnel *tunnel)
1019{
1020 if (!tb_tunnel_is_active(tunnel))
1021 return 0;
1022
1023 if (tunnel->consumed_bandwidth) {
1024 int ret = tunnel->consumed_bandwidth(tunnel);
1025
1026 tb_tunnel_dbg(tunnel, "consumed bandwidth %d Mb/s\n", ret);
1027 return ret;
1028 }
1029
1030 return 0;
1031}