xref: /dpdk/drivers/net/sfc/sfc_repr_proxy.h (revision 671f47e1876f2f69389ca471c4811bf00f9463e5)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright(c) 2019-2021 Xilinx, Inc.
4  * Copyright(c) 2019 Solarflare Communications Inc.
5  *
6  * This software was jointly developed between OKTET Labs (under contract
7  * for Solarflare) and Solarflare Communications, Inc.
8  */
9 
10 #ifndef _SFC_REPR_PROXY_H
11 #define _SFC_REPR_PROXY_H
12 
13 #include <stdint.h>
14 
15 #include <rte_ring.h>
16 #include <rte_mempool.h>
17 
18 #include "efx.h"
19 
20 #include "sfc_repr.h"
21 #include "sfc_dp.h"
22 #include "sfc_flow.h"
23 #include "sfc_mae.h"
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 /* Number of supported RxQs with different mbuf memory pools */
30 #define SFC_REPR_PROXY_NB_RXQ_MIN	(1)
31 #define SFC_REPR_PROXY_NB_RXQ_MAX	(1)
32 
33 /* One TxQ is required and sufficient for port representors support */
34 #define SFC_REPR_PROXY_NB_TXQ_MIN	(1)
35 #define SFC_REPR_PROXY_NB_TXQ_MAX	(1)
36 
37 #define SFC_REPR_PROXY_RX_DESC_COUNT	256
38 #define SFC_REPR_PROXY_RXQ_REFILL_LEVEL	(SFC_REPR_PROXY_RX_DESC_COUNT / 4)
39 #define SFC_REPR_PROXY_RX_BURST		32
40 
41 #define SFC_REPR_PROXY_TX_DESC_COUNT	256
42 #define SFC_REPR_PROXY_TXQ_FREE_THRESH	(SFC_REPR_PROXY_TX_DESC_COUNT / 4)
43 #define SFC_REPR_PROXY_TX_BURST		32
44 
45 struct sfc_repr_proxy_rxq {
46 	struct rte_ring			*ring;
47 	struct rte_mempool		*mb_pool;
48 };
49 
50 struct sfc_repr_proxy_txq {
51 	struct rte_ring			*ring;
52 };
53 
54 struct sfc_repr_proxy_filter {
55 	/*
56 	 * 2 filters are required to match all incoming traffic, unknown
57 	 * unicast and unknown multicast.
58 	 */
59 	efx_filter_spec_t specs[2];
60 };
61 
62 struct sfc_repr_proxy_port {
63 	TAILQ_ENTRY(sfc_repr_proxy_port)	entries;
64 	uint16_t				repr_id;
65 	uint16_t				rte_port_id;
66 	efx_mport_id_t				egress_mport;
67 	uint32_t				remote_vnic_mcdi_client_handle;
68 	struct sfc_repr_proxy_rxq		rxq[SFC_REPR_RXQ_MAX];
69 	struct sfc_repr_proxy_txq		txq[SFC_REPR_TXQ_MAX];
70 	struct rte_flow				*mae_rule;
71 	bool					enabled;
72 	bool					started;
73 };
74 
75 struct sfc_repr_proxy_dp_rxq {
76 	struct rte_mempool		*mp;
77 	unsigned int			ref_count;
78 
79 	eth_rx_burst_t			pkt_burst;
80 	struct sfc_dp_rxq		*dp;
81 
82 	uint16_t			route_port_id;
83 	bool				stop_route;
84 	unsigned int			available;
85 	unsigned int			forwarded;
86 	unsigned int			routed;
87 	struct rte_mbuf			*pkts[SFC_REPR_PROXY_TX_BURST];
88 
89 	sfc_sw_index_t			sw_index;
90 };
91 
92 struct sfc_repr_proxy_dp_txq {
93 	eth_tx_burst_t			pkt_burst;
94 	struct sfc_dp_txq		*dp;
95 
96 	unsigned int			available;
97 	unsigned int			transmitted;
98 	struct rte_mbuf			*tx_pkts[SFC_REPR_PROXY_TX_BURST];
99 
100 	sfc_sw_index_t			sw_index;
101 };
102 
103 enum sfc_repr_proxy_mbox_op {
104 	SFC_REPR_PROXY_MBOX_ADD_PORT,
105 	SFC_REPR_PROXY_MBOX_DEL_PORT,
106 	SFC_REPR_PROXY_MBOX_START_PORT,
107 	SFC_REPR_PROXY_MBOX_STOP_PORT,
108 };
109 
110 struct sfc_repr_proxy_mbox {
111 	struct sfc_repr_proxy_port	*port;
112 	enum sfc_repr_proxy_mbox_op	op;
113 
114 	bool				write_marker;
115 	bool				ack;
116 };
117 
118 TAILQ_HEAD(sfc_repr_proxy_ports, sfc_repr_proxy_port);
119 
120 struct sfc_repr_proxy {
121 	uint32_t			service_core_id;
122 	uint32_t			service_id;
123 	efx_mport_id_t			mport_alias;
124 	struct sfc_repr_proxy_ports	ports;
125 	bool				started;
126 	struct sfc_repr_proxy_dp_rxq	dp_rxq[SFC_REPR_PROXY_NB_RXQ_MAX];
127 	struct sfc_repr_proxy_dp_txq	dp_txq[SFC_REPR_PROXY_NB_TXQ_MAX];
128 	struct sfc_repr_proxy_filter	mport_filter;
129 
130 	struct sfc_repr_proxy_mbox	mbox;
131 	unsigned int			nb_txq;
132 	unsigned int			nb_rxq;
133 };
134 
135 struct sfc_adapter;
136 
137 int sfc_repr_proxy_attach(struct sfc_adapter *sa);
138 void sfc_repr_proxy_pre_detach(struct sfc_adapter *sa);
139 void sfc_repr_proxy_detach(struct sfc_adapter *sa);
140 int sfc_repr_proxy_txq_init(struct sfc_adapter *sa);
141 void sfc_repr_proxy_txq_fini(struct sfc_adapter *sa);
142 int sfc_repr_proxy_start(struct sfc_adapter *sa);
143 void sfc_repr_proxy_stop(struct sfc_adapter *sa);
144 
145 #ifdef __cplusplus
146 }
147 #endif
148 #endif  /* _SFC_REPR_PROXY_H */
149