brintos

brintos / linux-shallow public Read only

0
0
Text · 6.4 KiB · 1a27ccd Raw
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