Merge tag 'perf-tools-for-v6.0-2022-08-04' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-block.git] / drivers / thunderbolt / tunnel.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
3364f0c1 2/*
93f36ade 3 * Thunderbolt driver - Tunneling support
3364f0c1
AN
4 *
5 * Copyright (c) 2014 Andreas Noever <andreas.noever@gmail.com>
93f36ade 6 * Copyright (C) 2019, Intel Corporation
3364f0c1
AN
7 */
8
1752b9f7
MW
9#ifndef TB_TUNNEL_H_
10#define TB_TUNNEL_H_
3364f0c1
AN
11
12#include "tb.h"
13
4f807e47
MW
14enum tb_tunnel_type {
15 TB_TUNNEL_PCI,
16 TB_TUNNEL_DP,
44242d6c 17 TB_TUNNEL_DMA,
e6f81858 18 TB_TUNNEL_USB3,
4f807e47
MW
19};
20
93f36ade
MW
21/**
22 * struct tb_tunnel - Tunnel between two ports
23 * @tb: Pointer to the domain
24 * @src_port: Source port of the tunnel
0414bec5
MW
25 * @dst_port: Destination port of the tunnel. For discovered incomplete
26 * tunnels may be %NULL or null adapter port instead.
93f36ade
MW
27 * @paths: All paths required by the tunnel
28 * @npaths: Number of paths in @paths
4f807e47 29 * @init: Optional tunnel specific initialization
6ed541c5 30 * @deinit: Optional tunnel specific de-initialization
93f36ade 31 * @activate: Optional tunnel specific activation/deactivation
a11b88ad 32 * @consumed_bandwidth: Return how much bandwidth the tunnel consumes
0bd680cd
MW
33 * @release_unused_bandwidth: Release all unused bandwidth
34 * @reclaim_available_bandwidth: Reclaim back available bandwidth
93f36ade 35 * @list: Tunnels are linked using this field
4f807e47 36 * @type: Type of the tunnel
0bd680cd 37 * @max_up: Maximum upstream bandwidth (Mb/s) available for the tunnel.
a11b88ad 38 * Only set if the bandwidth needs to be limited.
0bd680cd
MW
39 * @max_down: Maximum downstream bandwidth (Mb/s) available for the tunnel.
40 * Only set if the bandwidth needs to be limited.
41 * @allocated_up: Allocated upstream bandwidth (only for USB3)
42 * @allocated_down: Allocated downstream bandwidth (only for USB3)
93f36ade
MW
43 */
44struct tb_tunnel {
3364f0c1 45 struct tb *tb;
93f36ade
MW
46 struct tb_port *src_port;
47 struct tb_port *dst_port;
48 struct tb_path **paths;
49 size_t npaths;
4f807e47 50 int (*init)(struct tb_tunnel *tunnel);
6ed541c5 51 void (*deinit)(struct tb_tunnel *tunnel);
93f36ade 52 int (*activate)(struct tb_tunnel *tunnel, bool activate);
7c0ee8fd
MW
53 int (*consumed_bandwidth)(struct tb_tunnel *tunnel, int *consumed_up,
54 int *consumed_down);
0bd680cd
MW
55 int (*release_unused_bandwidth)(struct tb_tunnel *tunnel);
56 void (*reclaim_available_bandwidth)(struct tb_tunnel *tunnel,
57 int *available_up,
58 int *available_down);
3364f0c1 59 struct list_head list;
4f807e47 60 enum tb_tunnel_type type;
0bd680cd
MW
61 int max_up;
62 int max_down;
63 int allocated_up;
64 int allocated_down;
3364f0c1
AN
65};
66
43bddb26
MW
67struct tb_tunnel *tb_tunnel_discover_pci(struct tb *tb, struct tb_port *down,
68 bool alloc_hopid);
93f36ade
MW
69struct tb_tunnel *tb_tunnel_alloc_pci(struct tb *tb, struct tb_port *up,
70 struct tb_port *down);
43bddb26
MW
71struct tb_tunnel *tb_tunnel_discover_dp(struct tb *tb, struct tb_port *in,
72 bool alloc_hopid);
4f807e47 73struct tb_tunnel *tb_tunnel_alloc_dp(struct tb *tb, struct tb_port *in,
9d2d0a5c
MW
74 struct tb_port *out, int link_nr,
75 int max_up, int max_down);
44242d6c 76struct tb_tunnel *tb_tunnel_alloc_dma(struct tb *tb, struct tb_port *nhi,
180b0689
MW
77 struct tb_port *dst, int transmit_path,
78 int transmit_ring, int receive_path,
79 int receive_ring);
80bool tb_tunnel_match_dma(const struct tb_tunnel *tunnel, int transmit_path,
81 int transmit_ring, int receive_path, int receive_ring);
43bddb26
MW
82struct tb_tunnel *tb_tunnel_discover_usb3(struct tb *tb, struct tb_port *down,
83 bool alloc_hopid);
e6f81858 84struct tb_tunnel *tb_tunnel_alloc_usb3(struct tb *tb, struct tb_port *up,
0bd680cd
MW
85 struct tb_port *down, int max_up,
86 int max_down);
4f807e47 87
93f36ade
MW
88void tb_tunnel_free(struct tb_tunnel *tunnel);
89int tb_tunnel_activate(struct tb_tunnel *tunnel);
90int tb_tunnel_restart(struct tb_tunnel *tunnel);
91void tb_tunnel_deactivate(struct tb_tunnel *tunnel);
92bool tb_tunnel_is_invalid(struct tb_tunnel *tunnel);
0bd680cd
MW
93bool tb_tunnel_port_on_path(const struct tb_tunnel *tunnel,
94 const struct tb_port *port);
7c0ee8fd
MW
95int tb_tunnel_consumed_bandwidth(struct tb_tunnel *tunnel, int *consumed_up,
96 int *consumed_down);
0bd680cd
MW
97int tb_tunnel_release_unused_bandwidth(struct tb_tunnel *tunnel);
98void tb_tunnel_reclaim_available_bandwidth(struct tb_tunnel *tunnel,
99 int *available_up,
100 int *available_down);
3364f0c1 101
4f807e47
MW
102static inline bool tb_tunnel_is_pci(const struct tb_tunnel *tunnel)
103{
104 return tunnel->type == TB_TUNNEL_PCI;
105}
106
107static inline bool tb_tunnel_is_dp(const struct tb_tunnel *tunnel)
108{
109 return tunnel->type == TB_TUNNEL_DP;
110}
111
44242d6c
MW
112static inline bool tb_tunnel_is_dma(const struct tb_tunnel *tunnel)
113{
114 return tunnel->type == TB_TUNNEL_DMA;
115}
116
e6f81858
RM
117static inline bool tb_tunnel_is_usb3(const struct tb_tunnel *tunnel)
118{
119 return tunnel->type == TB_TUNNEL_USB3;
120}
121
3364f0c1
AN
122#endif
123