1 | /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ |
2 | /* QLogic qed NIC Driver |
3 | * Copyright (c) 2015-2017 QLogic Corporation |
4 | * Copyright (c) 2019-2020 Marvell International Ltd. |
5 | */ |
6 | |
7 | #ifndef _QED_ETH_IF_H |
8 | #define _QED_ETH_IF_H |
9 | |
10 | #include <linux/list.h> |
11 | #include <linux/if_link.h> |
12 | #include <linux/qed/eth_common.h> |
13 | #include <linux/qed/qed_if.h> |
14 | #include <linux/qed/qed_iov_if.h> |
15 | |
16 | /* 64 max queues * (1 rx + 4 tx-cos + 1 xdp) */ |
17 | #define QED_MIN_L2_CONS (2 + NUM_PHYS_TCS_4PORT_K2) |
18 | #define QED_MAX_L2_CONS (64 * (QED_MIN_L2_CONS)) |
19 | |
20 | struct qed_queue_start_common_params { |
21 | /* Should always be relative to entity sending this. */ |
22 | u8 vport_id; |
23 | u16 queue_id; |
24 | |
25 | /* Relative, but relevant only for PFs */ |
26 | u8 stats_id; |
27 | |
28 | struct qed_sb_info *p_sb; |
29 | u8 sb_idx; |
30 | |
31 | u8 tc; |
32 | }; |
33 | |
34 | struct qed_rxq_start_ret_params { |
35 | void __iomem *p_prod; |
36 | void *p_handle; |
37 | }; |
38 | |
39 | struct qed_txq_start_ret_params { |
40 | void __iomem *p_doorbell; |
41 | void *p_handle; |
42 | }; |
43 | |
44 | enum qed_filter_config_mode { |
45 | QED_FILTER_CONFIG_MODE_DISABLE, |
46 | QED_FILTER_CONFIG_MODE_5_TUPLE, |
47 | QED_FILTER_CONFIG_MODE_L4_PORT, |
48 | QED_FILTER_CONFIG_MODE_IP_DEST, |
49 | QED_FILTER_CONFIG_MODE_IP_SRC, |
50 | }; |
51 | |
52 | struct qed_ntuple_filter_params { |
53 | /* Physically mapped address containing header of buffer to be used |
54 | * as filter. |
55 | */ |
56 | dma_addr_t addr; |
57 | |
58 | /* Length of header in bytes */ |
59 | u16 length; |
60 | |
61 | /* Relative queue-id to receive classified packet */ |
62 | #define ((u16)-1) |
63 | u16 qid; |
64 | |
65 | /* Identifier can either be according to vport-id or vfid */ |
66 | bool b_is_vf; |
67 | u8 vport_id; |
68 | u8 vf_id; |
69 | |
70 | /* true iff this filter is to be added. Else to be removed */ |
71 | bool b_is_add; |
72 | |
73 | /* If flow needs to be dropped */ |
74 | bool b_is_drop; |
75 | }; |
76 | |
77 | struct qed_dev_eth_info { |
78 | struct qed_dev_info common; |
79 | |
80 | u8 num_queues; |
81 | u8 num_tc; |
82 | |
83 | u8 port_mac[ETH_ALEN]; |
84 | u16 num_vlan_filters; |
85 | u16 num_mac_filters; |
86 | |
87 | /* Legacy VF - this affects the datapath, so qede has to know */ |
88 | bool is_legacy; |
89 | |
90 | /* Might depend on available resources [in case of VF] */ |
91 | bool xdp_supported; |
92 | }; |
93 | |
94 | struct { |
95 | void *[128]; |
96 | u32 [10]; |
97 | u8 ; |
98 | }; |
99 | |
100 | struct qed_update_vport_params { |
101 | u8 vport_id; |
102 | u8 update_vport_active_flg; |
103 | u8 vport_active_flg; |
104 | u8 update_tx_switching_flg; |
105 | u8 tx_switching_flg; |
106 | u8 update_accept_any_vlan_flg; |
107 | u8 accept_any_vlan; |
108 | u8 ; |
109 | struct qed_update_vport_rss_params ; |
110 | }; |
111 | |
112 | struct qed_start_vport_params { |
113 | bool remove_inner_vlan; |
114 | bool handle_ptp_pkts; |
115 | bool gro_enable; |
116 | bool drop_ttl0; |
117 | u8 vport_id; |
118 | u16 mtu; |
119 | bool clear_stats; |
120 | }; |
121 | |
122 | enum qed_filter_rx_mode_type { |
123 | QED_FILTER_RX_MODE_TYPE_REGULAR, |
124 | QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC, |
125 | QED_FILTER_RX_MODE_TYPE_PROMISC, |
126 | }; |
127 | |
128 | enum qed_filter_xcast_params_type { |
129 | QED_FILTER_XCAST_TYPE_ADD, |
130 | QED_FILTER_XCAST_TYPE_DEL, |
131 | QED_FILTER_XCAST_TYPE_REPLACE, |
132 | }; |
133 | |
134 | struct qed_filter_ucast_params { |
135 | enum qed_filter_xcast_params_type type; |
136 | u8 vlan_valid; |
137 | u16 vlan; |
138 | u8 mac_valid; |
139 | unsigned char mac[ETH_ALEN]; |
140 | }; |
141 | |
142 | struct qed_filter_mcast_params { |
143 | enum qed_filter_xcast_params_type type; |
144 | u8 num; |
145 | unsigned char mac[64][ETH_ALEN]; |
146 | }; |
147 | |
148 | enum qed_filter_type { |
149 | QED_FILTER_TYPE_UCAST, |
150 | QED_FILTER_TYPE_MCAST, |
151 | QED_FILTER_TYPE_RX_MODE, |
152 | QED_MAX_FILTER_TYPES, |
153 | }; |
154 | |
155 | struct qed_tunn_params { |
156 | u16 vxlan_port; |
157 | u8 update_vxlan_port; |
158 | u16 geneve_port; |
159 | u8 update_geneve_port; |
160 | }; |
161 | |
162 | struct qed_eth_cb_ops { |
163 | struct qed_common_cb_ops common; |
164 | void (*force_mac) (void *dev, u8 *mac, bool forced); |
165 | void (*ports_update)(void *dev, u16 vxlan_port, u16 geneve_port); |
166 | }; |
167 | |
168 | #define QED_MAX_PHC_DRIFT_PPB 291666666 |
169 | |
170 | enum qed_ptp_filter_type { |
171 | QED_PTP_FILTER_NONE, |
172 | QED_PTP_FILTER_ALL, |
173 | QED_PTP_FILTER_V1_L4_EVENT, |
174 | QED_PTP_FILTER_V1_L4_GEN, |
175 | QED_PTP_FILTER_V2_L4_EVENT, |
176 | QED_PTP_FILTER_V2_L4_GEN, |
177 | QED_PTP_FILTER_V2_L2_EVENT, |
178 | QED_PTP_FILTER_V2_L2_GEN, |
179 | QED_PTP_FILTER_V2_EVENT, |
180 | QED_PTP_FILTER_V2_GEN |
181 | }; |
182 | |
183 | enum qed_ptp_hwtstamp_tx_type { |
184 | QED_PTP_HWTSTAMP_TX_OFF, |
185 | QED_PTP_HWTSTAMP_TX_ON, |
186 | }; |
187 | |
188 | #ifdef CONFIG_DCB |
189 | /* Prototype declaration of qed_eth_dcbnl_ops should match with the declaration |
190 | * of dcbnl_rtnl_ops structure. |
191 | */ |
192 | struct qed_eth_dcbnl_ops { |
193 | /* IEEE 802.1Qaz std */ |
194 | int (*ieee_getpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc); |
195 | int (*ieee_setpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc); |
196 | int (*ieee_getets)(struct qed_dev *cdev, struct ieee_ets *ets); |
197 | int (*ieee_setets)(struct qed_dev *cdev, struct ieee_ets *ets); |
198 | int (*ieee_peer_getets)(struct qed_dev *cdev, struct ieee_ets *ets); |
199 | int (*ieee_peer_getpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc); |
200 | int (*ieee_getapp)(struct qed_dev *cdev, struct dcb_app *app); |
201 | int (*ieee_setapp)(struct qed_dev *cdev, struct dcb_app *app); |
202 | |
203 | /* CEE std */ |
204 | u8 (*getstate)(struct qed_dev *cdev); |
205 | u8 (*setstate)(struct qed_dev *cdev, u8 state); |
206 | void (*getpgtccfgtx)(struct qed_dev *cdev, int prio, u8 *prio_type, |
207 | u8 *pgid, u8 *bw_pct, u8 *up_map); |
208 | void (*getpgbwgcfgtx)(struct qed_dev *cdev, int pgid, u8 *bw_pct); |
209 | void (*getpgtccfgrx)(struct qed_dev *cdev, int prio, u8 *prio_type, |
210 | u8 *pgid, u8 *bw_pct, u8 *up_map); |
211 | void (*getpgbwgcfgrx)(struct qed_dev *cdev, int pgid, u8 *bw_pct); |
212 | void (*getpfccfg)(struct qed_dev *cdev, int prio, u8 *setting); |
213 | void (*setpfccfg)(struct qed_dev *cdev, int prio, u8 setting); |
214 | u8 (*getcap)(struct qed_dev *cdev, int capid, u8 *cap); |
215 | int (*getnumtcs)(struct qed_dev *cdev, int tcid, u8 *num); |
216 | u8 (*getpfcstate)(struct qed_dev *cdev); |
217 | int (*getapp)(struct qed_dev *cdev, u8 idtype, u16 id); |
218 | u8 (*getfeatcfg)(struct qed_dev *cdev, int featid, u8 *flags); |
219 | |
220 | /* DCBX configuration */ |
221 | u8 (*getdcbx)(struct qed_dev *cdev); |
222 | void (*setpgtccfgtx)(struct qed_dev *cdev, int prio, |
223 | u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map); |
224 | void (*setpgtccfgrx)(struct qed_dev *cdev, int prio, |
225 | u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map); |
226 | void (*setpgbwgcfgtx)(struct qed_dev *cdev, int pgid, u8 bw_pct); |
227 | void (*setpgbwgcfgrx)(struct qed_dev *cdev, int pgid, u8 bw_pct); |
228 | u8 (*setall)(struct qed_dev *cdev); |
229 | int (*setnumtcs)(struct qed_dev *cdev, int tcid, u8 num); |
230 | void (*setpfcstate)(struct qed_dev *cdev, u8 state); |
231 | int (*setapp)(struct qed_dev *cdev, u8 idtype, u16 idval, u8 up); |
232 | u8 (*setdcbx)(struct qed_dev *cdev, u8 state); |
233 | u8 (*setfeatcfg)(struct qed_dev *cdev, int featid, u8 flags); |
234 | |
235 | /* Peer apps */ |
236 | int (*peer_getappinfo)(struct qed_dev *cdev, |
237 | struct dcb_peer_app_info *info, |
238 | u16 *app_count); |
239 | int (*peer_getapptable)(struct qed_dev *cdev, struct dcb_app *table); |
240 | |
241 | /* CEE peer */ |
242 | int (*cee_peer_getpfc)(struct qed_dev *cdev, struct cee_pfc *pfc); |
243 | int (*cee_peer_getpg)(struct qed_dev *cdev, struct cee_pg *pg); |
244 | }; |
245 | #endif |
246 | |
247 | struct qed_eth_ptp_ops { |
248 | int (*cfg_filters)(struct qed_dev *, enum qed_ptp_filter_type, |
249 | enum qed_ptp_hwtstamp_tx_type); |
250 | int (*read_rx_ts)(struct qed_dev *, u64 *); |
251 | int (*read_tx_ts)(struct qed_dev *, u64 *); |
252 | int (*read_cc)(struct qed_dev *, u64 *); |
253 | int (*disable)(struct qed_dev *); |
254 | int (*adjfreq)(struct qed_dev *, s32); |
255 | int (*enable)(struct qed_dev *); |
256 | }; |
257 | |
258 | struct qed_eth_ops { |
259 | const struct qed_common_ops *common; |
260 | #ifdef CONFIG_QED_SRIOV |
261 | const struct qed_iov_hv_ops *iov; |
262 | #endif |
263 | #ifdef CONFIG_DCB |
264 | const struct qed_eth_dcbnl_ops *dcb; |
265 | #endif |
266 | const struct qed_eth_ptp_ops *ptp; |
267 | |
268 | int (*fill_dev_info)(struct qed_dev *cdev, |
269 | struct qed_dev_eth_info *info); |
270 | |
271 | void (*register_ops)(struct qed_dev *cdev, |
272 | struct qed_eth_cb_ops *ops, |
273 | void *cookie); |
274 | |
275 | bool(*check_mac) (struct qed_dev *cdev, u8 *mac); |
276 | |
277 | int (*vport_start)(struct qed_dev *cdev, |
278 | struct qed_start_vport_params *params); |
279 | |
280 | int (*vport_stop)(struct qed_dev *cdev, |
281 | u8 vport_id); |
282 | |
283 | int (*vport_update)(struct qed_dev *cdev, |
284 | struct qed_update_vport_params *params); |
285 | |
286 | int (*q_rx_start)(struct qed_dev *cdev, |
287 | u8 , |
288 | struct qed_queue_start_common_params *params, |
289 | u16 bd_max_bytes, |
290 | dma_addr_t bd_chain_phys_addr, |
291 | dma_addr_t cqe_pbl_addr, |
292 | u16 cqe_pbl_size, |
293 | struct qed_rxq_start_ret_params *ret_params); |
294 | |
295 | int (*q_rx_stop)(struct qed_dev *cdev, u8 , void *handle); |
296 | |
297 | int (*q_tx_start)(struct qed_dev *cdev, |
298 | u8 , |
299 | struct qed_queue_start_common_params *params, |
300 | dma_addr_t pbl_addr, |
301 | u16 pbl_size, |
302 | struct qed_txq_start_ret_params *ret_params); |
303 | |
304 | int (*q_tx_stop)(struct qed_dev *cdev, u8 , void *handle); |
305 | |
306 | int (*filter_config_rx_mode)(struct qed_dev *cdev, |
307 | enum qed_filter_rx_mode_type type); |
308 | |
309 | int (*filter_config_ucast)(struct qed_dev *cdev, |
310 | struct qed_filter_ucast_params *params); |
311 | |
312 | int (*filter_config_mcast)(struct qed_dev *cdev, |
313 | struct qed_filter_mcast_params *params); |
314 | |
315 | int (*fastpath_stop)(struct qed_dev *cdev); |
316 | |
317 | int (*eth_cqe_completion)(struct qed_dev *cdev, |
318 | u8 , |
319 | struct eth_slow_path_rx_cqe *cqe); |
320 | |
321 | void (*get_vport_stats)(struct qed_dev *cdev, |
322 | struct qed_eth_stats *stats); |
323 | |
324 | int (*tunn_config)(struct qed_dev *cdev, |
325 | struct qed_tunn_params *params); |
326 | |
327 | int (*ntuple_filter_config)(struct qed_dev *cdev, |
328 | void *cookie, |
329 | struct qed_ntuple_filter_params *params); |
330 | |
331 | int (*configure_arfs_searcher)(struct qed_dev *cdev, |
332 | enum qed_filter_config_mode mode); |
333 | int (*get_coalesce)(struct qed_dev *cdev, u16 *coal, void *handle); |
334 | int (*req_bulletin_update_mac)(struct qed_dev *cdev, const u8 *mac); |
335 | }; |
336 | |
337 | const struct qed_eth_ops *qed_get_eth_ops(void); |
338 | void qed_put_eth_ops(void); |
339 | |
340 | #endif |
341 | |