172 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Thunderbolt driver - Tunneling support4 *5 * Copyright (c) 2014 Andreas Noever <andreas.noever@gmail.com>6 * Copyright (C) 2019, Intel Corporation7 */8 9#ifndef TB_TUNNEL_H_10#define TB_TUNNEL_H_11 12#include "tb.h"13 14enum tb_tunnel_type {15 TB_TUNNEL_PCI,16 TB_TUNNEL_DP,17 TB_TUNNEL_DMA,18 TB_TUNNEL_USB3,19};20 21/**22 * struct tb_tunnel - Tunnel between two ports23 * @tb: Pointer to the domain24 * @src_port: Source port of the tunnel25 * @dst_port: Destination port of the tunnel. For discovered incomplete26 * tunnels may be %NULL or null adapter port instead.27 * @paths: All paths required by the tunnel28 * @npaths: Number of paths in @paths29 * @init: Optional tunnel specific initialization30 * @deinit: Optional tunnel specific de-initialization31 * @activate: Optional tunnel specific activation/deactivation32 * @maximum_bandwidth: Returns maximum possible bandwidth for this tunnel33 * @allocated_bandwidth: Return how much bandwidth is allocated for the tunnel34 * @alloc_bandwidth: Change tunnel bandwidth allocation35 * @consumed_bandwidth: Return how much bandwidth the tunnel consumes36 * @release_unused_bandwidth: Release all unused bandwidth37 * @reclaim_available_bandwidth: Reclaim back available bandwidth38 * @list: Tunnels are linked using this field39 * @type: Type of the tunnel40 * @max_up: Maximum upstream bandwidth (Mb/s) available for the tunnel.41 * Only set if the bandwidth needs to be limited.42 * @max_down: Maximum downstream bandwidth (Mb/s) available for the tunnel.43 * Only set if the bandwidth needs to be limited.44 * @allocated_up: Allocated upstream bandwidth (only for USB3)45 * @allocated_down: Allocated downstream bandwidth (only for USB3)46 * @bw_mode: DP bandwidth allocation mode registers can be used to47 * determine consumed and allocated bandwidth48 */49struct tb_tunnel {50 struct tb *tb;51 struct tb_port *src_port;52 struct tb_port *dst_port;53 struct tb_path **paths;54 size_t npaths;55 int (*init)(struct tb_tunnel *tunnel);56 void (*deinit)(struct tb_tunnel *tunnel);57 int (*activate)(struct tb_tunnel *tunnel, bool activate);58 int (*maximum_bandwidth)(struct tb_tunnel *tunnel, int *max_up,59 int *max_down);60 int (*allocated_bandwidth)(struct tb_tunnel *tunnel, int *allocated_up,61 int *allocated_down);62 int (*alloc_bandwidth)(struct tb_tunnel *tunnel, int *alloc_up,63 int *alloc_down);64 int (*consumed_bandwidth)(struct tb_tunnel *tunnel, int *consumed_up,65 int *consumed_down);66 int (*release_unused_bandwidth)(struct tb_tunnel *tunnel);67 void (*reclaim_available_bandwidth)(struct tb_tunnel *tunnel,68 int *available_up,69 int *available_down);70 struct list_head list;71 enum tb_tunnel_type type;72 int max_up;73 int max_down;74 int allocated_up;75 int allocated_down;76 bool bw_mode;77};78 79struct tb_tunnel *tb_tunnel_discover_pci(struct tb *tb, struct tb_port *down,80 bool alloc_hopid);81struct tb_tunnel *tb_tunnel_alloc_pci(struct tb *tb, struct tb_port *up,82 struct tb_port *down);83bool tb_tunnel_reserved_pci(struct tb_port *port, int *reserved_up,84 int *reserved_down);85struct tb_tunnel *tb_tunnel_discover_dp(struct tb *tb, struct tb_port *in,86 bool alloc_hopid);87struct tb_tunnel *tb_tunnel_alloc_dp(struct tb *tb, struct tb_port *in,88 struct tb_port *out, int link_nr,89 int max_up, int max_down);90struct tb_tunnel *tb_tunnel_alloc_dma(struct tb *tb, struct tb_port *nhi,91 struct tb_port *dst, int transmit_path,92 int transmit_ring, int receive_path,93 int receive_ring);94bool tb_tunnel_match_dma(const struct tb_tunnel *tunnel, int transmit_path,95 int transmit_ring, int receive_path, int receive_ring);96struct tb_tunnel *tb_tunnel_discover_usb3(struct tb *tb, struct tb_port *down,97 bool alloc_hopid);98struct tb_tunnel *tb_tunnel_alloc_usb3(struct tb *tb, struct tb_port *up,99 struct tb_port *down, int max_up,100 int max_down);101 102void tb_tunnel_free(struct tb_tunnel *tunnel);103int tb_tunnel_activate(struct tb_tunnel *tunnel);104int tb_tunnel_restart(struct tb_tunnel *tunnel);105void tb_tunnel_deactivate(struct tb_tunnel *tunnel);106bool tb_tunnel_is_invalid(struct tb_tunnel *tunnel);107bool tb_tunnel_port_on_path(const struct tb_tunnel *tunnel,108 const struct tb_port *port);109int tb_tunnel_maximum_bandwidth(struct tb_tunnel *tunnel, int *max_up,110 int *max_down);111int tb_tunnel_allocated_bandwidth(struct tb_tunnel *tunnel, int *allocated_up,112 int *allocated_down);113int tb_tunnel_alloc_bandwidth(struct tb_tunnel *tunnel, int *alloc_up,114 int *alloc_down);115int tb_tunnel_consumed_bandwidth(struct tb_tunnel *tunnel, int *consumed_up,116 int *consumed_down);117int tb_tunnel_release_unused_bandwidth(struct tb_tunnel *tunnel);118void tb_tunnel_reclaim_available_bandwidth(struct tb_tunnel *tunnel,119 int *available_up,120 int *available_down);121 122static inline bool tb_tunnel_is_pci(const struct tb_tunnel *tunnel)123{124 return tunnel->type == TB_TUNNEL_PCI;125}126 127static inline bool tb_tunnel_is_dp(const struct tb_tunnel *tunnel)128{129 return tunnel->type == TB_TUNNEL_DP;130}131 132static inline bool tb_tunnel_is_dma(const struct tb_tunnel *tunnel)133{134 return tunnel->type == TB_TUNNEL_DMA;135}136 137static inline bool tb_tunnel_is_usb3(const struct tb_tunnel *tunnel)138{139 return tunnel->type == TB_TUNNEL_USB3;140}141 142static inline bool tb_tunnel_direction_downstream(const struct tb_tunnel *tunnel)143{144 return tb_port_path_direction_downstream(tunnel->src_port,145 tunnel->dst_port);146}147 148const char *tb_tunnel_type_name(const struct tb_tunnel *tunnel);149 150#define __TB_TUNNEL_PRINT(level, tunnel, fmt, arg...) \151 do { \152 struct tb_tunnel *__tunnel = (tunnel); \153 level(__tunnel->tb, "%llx:%u <-> %llx:%u (%s): " fmt, \154 tb_route(__tunnel->src_port->sw), \155 __tunnel->src_port->port, \156 tb_route(__tunnel->dst_port->sw), \157 __tunnel->dst_port->port, \158 tb_tunnel_type_name(__tunnel), \159 ## arg); \160 } while (0)161 162#define tb_tunnel_WARN(tunnel, fmt, arg...) \163 __TB_TUNNEL_PRINT(tb_WARN, tunnel, fmt, ##arg)164#define tb_tunnel_warn(tunnel, fmt, arg...) \165 __TB_TUNNEL_PRINT(tb_warn, tunnel, fmt, ##arg)166#define tb_tunnel_info(tunnel, fmt, arg...) \167 __TB_TUNNEL_PRINT(tb_info, tunnel, fmt, ##arg)168#define tb_tunnel_dbg(tunnel, fmt, arg...) \169 __TB_TUNNEL_PRINT(tb_dbg, tunnel, fmt, ##arg)170 171#endif172