xref: /dpdk/drivers/net/mlx5/mlx5.h (revision 1bdbe1af99b27acadb7993b429e6625b2f9fa6ff)
1771fa900SAdrien Mazarguil /*-
2771fa900SAdrien Mazarguil  *   BSD LICENSE
3771fa900SAdrien Mazarguil  *
4771fa900SAdrien Mazarguil  *   Copyright 2015 6WIND S.A.
5771fa900SAdrien Mazarguil  *   Copyright 2015 Mellanox.
6771fa900SAdrien Mazarguil  *
7771fa900SAdrien Mazarguil  *   Redistribution and use in source and binary forms, with or without
8771fa900SAdrien Mazarguil  *   modification, are permitted provided that the following conditions
9771fa900SAdrien Mazarguil  *   are met:
10771fa900SAdrien Mazarguil  *
11771fa900SAdrien Mazarguil  *     * Redistributions of source code must retain the above copyright
12771fa900SAdrien Mazarguil  *       notice, this list of conditions and the following disclaimer.
13771fa900SAdrien Mazarguil  *     * Redistributions in binary form must reproduce the above copyright
14771fa900SAdrien Mazarguil  *       notice, this list of conditions and the following disclaimer in
15771fa900SAdrien Mazarguil  *       the documentation and/or other materials provided with the
16771fa900SAdrien Mazarguil  *       distribution.
17771fa900SAdrien Mazarguil  *     * Neither the name of 6WIND S.A. nor the names of its
18771fa900SAdrien Mazarguil  *       contributors may be used to endorse or promote products derived
19771fa900SAdrien Mazarguil  *       from this software without specific prior written permission.
20771fa900SAdrien Mazarguil  *
21771fa900SAdrien Mazarguil  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22771fa900SAdrien Mazarguil  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23771fa900SAdrien Mazarguil  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24771fa900SAdrien Mazarguil  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25771fa900SAdrien Mazarguil  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26771fa900SAdrien Mazarguil  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27771fa900SAdrien Mazarguil  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28771fa900SAdrien Mazarguil  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29771fa900SAdrien Mazarguil  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30771fa900SAdrien Mazarguil  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31771fa900SAdrien Mazarguil  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32771fa900SAdrien Mazarguil  */
33771fa900SAdrien Mazarguil 
34771fa900SAdrien Mazarguil #ifndef RTE_PMD_MLX5_H_
35771fa900SAdrien Mazarguil #define RTE_PMD_MLX5_H_
36771fa900SAdrien Mazarguil 
37771fa900SAdrien Mazarguil #include <stddef.h>
38771fa900SAdrien Mazarguil #include <stdint.h>
39771fa900SAdrien Mazarguil #include <limits.h>
40771fa900SAdrien Mazarguil #include <net/if.h>
41771fa900SAdrien Mazarguil #include <netinet/in.h>
42771fa900SAdrien Mazarguil #include <linux/if.h>
43771fa900SAdrien Mazarguil 
44771fa900SAdrien Mazarguil /* Verbs header. */
45771fa900SAdrien Mazarguil /* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */
46771fa900SAdrien Mazarguil #ifdef PEDANTIC
47771fa900SAdrien Mazarguil #pragma GCC diagnostic ignored "-pedantic"
48771fa900SAdrien Mazarguil #endif
49771fa900SAdrien Mazarguil #include <infiniband/verbs.h>
50771fa900SAdrien Mazarguil #ifdef PEDANTIC
51771fa900SAdrien Mazarguil #pragma GCC diagnostic error "-pedantic"
52771fa900SAdrien Mazarguil #endif
53771fa900SAdrien Mazarguil 
54771fa900SAdrien Mazarguil /* DPDK headers don't like -pedantic. */
55771fa900SAdrien Mazarguil #ifdef PEDANTIC
56771fa900SAdrien Mazarguil #pragma GCC diagnostic ignored "-pedantic"
57771fa900SAdrien Mazarguil #endif
58771fa900SAdrien Mazarguil #include <rte_ether.h>
59771fa900SAdrien Mazarguil #include <rte_ethdev.h>
60771fa900SAdrien Mazarguil #include <rte_spinlock.h>
61771fa900SAdrien Mazarguil #ifdef PEDANTIC
62771fa900SAdrien Mazarguil #pragma GCC diagnostic error "-pedantic"
63771fa900SAdrien Mazarguil #endif
64771fa900SAdrien Mazarguil 
65771fa900SAdrien Mazarguil #include "mlx5_utils.h"
662e22920bSAdrien Mazarguil #include "mlx5_rxtx.h"
67771fa900SAdrien Mazarguil #include "mlx5_autoconf.h"
68771fa900SAdrien Mazarguil #include "mlx5_defs.h"
69771fa900SAdrien Mazarguil 
70771fa900SAdrien Mazarguil enum {
71771fa900SAdrien Mazarguil 	PCI_VENDOR_ID_MELLANOX = 0x15b3,
72771fa900SAdrien Mazarguil };
73771fa900SAdrien Mazarguil 
74771fa900SAdrien Mazarguil enum {
75771fa900SAdrien Mazarguil 	PCI_DEVICE_ID_MELLANOX_CONNECTX4 = 0x1013,
76771fa900SAdrien Mazarguil 	PCI_DEVICE_ID_MELLANOX_CONNECTX4VF = 0x1014,
77771fa900SAdrien Mazarguil 	PCI_DEVICE_ID_MELLANOX_CONNECTX4LX = 0x1015,
78771fa900SAdrien Mazarguil 	PCI_DEVICE_ID_MELLANOX_CONNECTX4LXVF = 0x1016,
79771fa900SAdrien Mazarguil };
80771fa900SAdrien Mazarguil 
81771fa900SAdrien Mazarguil struct priv {
82771fa900SAdrien Mazarguil 	struct rte_eth_dev *dev; /* Ethernet device. */
83771fa900SAdrien Mazarguil 	struct ibv_context *ctx; /* Verbs context. */
84771fa900SAdrien Mazarguil 	struct ibv_device_attr device_attr; /* Device properties. */
85771fa900SAdrien Mazarguil 	struct ibv_pd *pd; /* Protection Domain. */
86771fa900SAdrien Mazarguil 	/*
87771fa900SAdrien Mazarguil 	 * MAC addresses array and configuration bit-field.
88771fa900SAdrien Mazarguil 	 * An extra entry that cannot be modified by the DPDK is reserved
89771fa900SAdrien Mazarguil 	 * for broadcast frames (destination MAC address ff:ff:ff:ff:ff:ff).
90771fa900SAdrien Mazarguil 	 */
91771fa900SAdrien Mazarguil 	struct ether_addr mac[MLX5_MAX_MAC_ADDRESSES];
92771fa900SAdrien Mazarguil 	BITFIELD_DECLARE(mac_configured, uint32_t, MLX5_MAX_MAC_ADDRESSES);
93771fa900SAdrien Mazarguil 	/* Device properties. */
94771fa900SAdrien Mazarguil 	uint16_t mtu; /* Configured MTU. */
95771fa900SAdrien Mazarguil 	uint8_t port; /* Physical port number. */
96771fa900SAdrien Mazarguil 	unsigned int started:1; /* Device started, flows enabled. */
97*1bdbe1afSAdrien Mazarguil 	unsigned int promisc_req:1; /* Promiscuous mode requested. */
98*1bdbe1afSAdrien Mazarguil 	unsigned int allmulti_req:1; /* All multicast mode requested. */
99771fa900SAdrien Mazarguil 	unsigned int hw_qpg:1; /* QP groups are supported. */
100771fa900SAdrien Mazarguil 	unsigned int hw_tss:1; /* TSS is supported. */
101771fa900SAdrien Mazarguil 	unsigned int hw_rss:1; /* RSS is supported. */
102771fa900SAdrien Mazarguil 	unsigned int hw_csum:1; /* Checksum offload is supported. */
103771fa900SAdrien Mazarguil 	unsigned int hw_csum_l2tun:1; /* Same for L2 tunnels. */
104771fa900SAdrien Mazarguil 	unsigned int rss:1; /* RSS is enabled. */
105771fa900SAdrien Mazarguil 	unsigned int vf:1; /* This is a VF device. */
106771fa900SAdrien Mazarguil 	unsigned int max_rss_tbl_sz; /* Maximum number of RSS queues. */
1072e22920bSAdrien Mazarguil 	/* RX/TX queues. */
1082e22920bSAdrien Mazarguil 	struct rxq rxq_parent; /* Parent queue when RSS is enabled. */
1092e22920bSAdrien Mazarguil 	unsigned int rxqs_n; /* RX queues array size. */
1102e22920bSAdrien Mazarguil 	unsigned int txqs_n; /* TX queues array size. */
1112e22920bSAdrien Mazarguil 	struct rxq *(*rxqs)[]; /* RX queues. */
1122e22920bSAdrien Mazarguil 	struct txq *(*txqs)[]; /* TX queues. */
113771fa900SAdrien Mazarguil 	rte_spinlock_t lock; /* Lock for control functions. */
114771fa900SAdrien Mazarguil };
115771fa900SAdrien Mazarguil 
1162e22920bSAdrien Mazarguil /* Work Request ID data type (64 bit). */
1172e22920bSAdrien Mazarguil typedef union {
1182e22920bSAdrien Mazarguil 	struct {
1192e22920bSAdrien Mazarguil 		uint32_t id;
1202e22920bSAdrien Mazarguil 		uint16_t offset;
1212e22920bSAdrien Mazarguil 	} data;
1222e22920bSAdrien Mazarguil 	uint64_t raw;
1232e22920bSAdrien Mazarguil } wr_id_t;
1242e22920bSAdrien Mazarguil 
1252e22920bSAdrien Mazarguil /* Compile-time check. */
1262e22920bSAdrien Mazarguil static inline void wr_id_t_check(void)
1272e22920bSAdrien Mazarguil {
1282e22920bSAdrien Mazarguil 	wr_id_t check[1 + (2 * -!(sizeof(wr_id_t) == sizeof(uint64_t)))];
1292e22920bSAdrien Mazarguil 
1302e22920bSAdrien Mazarguil 	(void)check;
1312e22920bSAdrien Mazarguil 	(void)wr_id_t_check;
1322e22920bSAdrien Mazarguil }
1332e22920bSAdrien Mazarguil 
134771fa900SAdrien Mazarguil /**
135771fa900SAdrien Mazarguil  * Lock private structure to protect it from concurrent access in the
136771fa900SAdrien Mazarguil  * control path.
137771fa900SAdrien Mazarguil  *
138771fa900SAdrien Mazarguil  * @param priv
139771fa900SAdrien Mazarguil  *   Pointer to private structure.
140771fa900SAdrien Mazarguil  */
141771fa900SAdrien Mazarguil static inline void
142771fa900SAdrien Mazarguil priv_lock(struct priv *priv)
143771fa900SAdrien Mazarguil {
144771fa900SAdrien Mazarguil 	rte_spinlock_lock(&priv->lock);
145771fa900SAdrien Mazarguil }
146771fa900SAdrien Mazarguil 
147771fa900SAdrien Mazarguil /**
148771fa900SAdrien Mazarguil  * Unlock private structure.
149771fa900SAdrien Mazarguil  *
150771fa900SAdrien Mazarguil  * @param priv
151771fa900SAdrien Mazarguil  *   Pointer to private structure.
152771fa900SAdrien Mazarguil  */
153771fa900SAdrien Mazarguil static inline void
154771fa900SAdrien Mazarguil priv_unlock(struct priv *priv)
155771fa900SAdrien Mazarguil {
156771fa900SAdrien Mazarguil 	rte_spinlock_unlock(&priv->lock);
157771fa900SAdrien Mazarguil }
158771fa900SAdrien Mazarguil 
159771fa900SAdrien Mazarguil /* mlx5_ethdev.c */
160771fa900SAdrien Mazarguil 
161771fa900SAdrien Mazarguil int priv_get_ifname(const struct priv *, char (*)[IF_NAMESIZE]);
162771fa900SAdrien Mazarguil int priv_ifreq(const struct priv *, int req, struct ifreq *);
163771fa900SAdrien Mazarguil int priv_get_mtu(struct priv *, uint16_t *);
164771fa900SAdrien Mazarguil int priv_set_flags(struct priv *, unsigned int, unsigned int);
165e60fbd5bSAdrien Mazarguil int mlx5_dev_configure(struct rte_eth_dev *);
166e60fbd5bSAdrien Mazarguil void mlx5_dev_infos_get(struct rte_eth_dev *, struct rte_eth_dev_info *);
167cf37ca95SAdrien Mazarguil int mlx5_dev_set_mtu(struct rte_eth_dev *, uint16_t);
168771fa900SAdrien Mazarguil int mlx5_ibv_device_to_pci_addr(const struct ibv_device *,
169771fa900SAdrien Mazarguil 				struct rte_pci_addr *);
170771fa900SAdrien Mazarguil 
171771fa900SAdrien Mazarguil /* mlx5_mac.c */
172771fa900SAdrien Mazarguil 
173771fa900SAdrien Mazarguil int priv_get_mac(struct priv *, uint8_t (*)[ETHER_ADDR_LEN]);
1743318aef7SAdrien Mazarguil void rxq_mac_addrs_del(struct rxq *);
1753318aef7SAdrien Mazarguil void mlx5_mac_addr_remove(struct rte_eth_dev *, uint32_t);
1763318aef7SAdrien Mazarguil int rxq_mac_addrs_add(struct rxq *);
177771fa900SAdrien Mazarguil int priv_mac_addr_add(struct priv *, unsigned int,
178771fa900SAdrien Mazarguil 		      const uint8_t (*)[ETHER_ADDR_LEN]);
1793318aef7SAdrien Mazarguil void mlx5_mac_addr_add(struct rte_eth_dev *, struct ether_addr *, uint32_t,
1803318aef7SAdrien Mazarguil 		       uint32_t);
181771fa900SAdrien Mazarguil 
182*1bdbe1afSAdrien Mazarguil /* mlx5_rxmode.c */
183*1bdbe1afSAdrien Mazarguil 
184*1bdbe1afSAdrien Mazarguil int rxq_promiscuous_enable(struct rxq *);
185*1bdbe1afSAdrien Mazarguil void mlx5_promiscuous_enable(struct rte_eth_dev *);
186*1bdbe1afSAdrien Mazarguil void rxq_promiscuous_disable(struct rxq *);
187*1bdbe1afSAdrien Mazarguil void mlx5_promiscuous_disable(struct rte_eth_dev *);
188*1bdbe1afSAdrien Mazarguil int rxq_allmulticast_enable(struct rxq *);
189*1bdbe1afSAdrien Mazarguil void mlx5_allmulticast_enable(struct rte_eth_dev *);
190*1bdbe1afSAdrien Mazarguil void rxq_allmulticast_disable(struct rxq *);
191*1bdbe1afSAdrien Mazarguil void mlx5_allmulticast_disable(struct rte_eth_dev *);
192*1bdbe1afSAdrien Mazarguil 
19387011737SAdrien Mazarguil /* mlx5_stats.c */
19487011737SAdrien Mazarguil 
19587011737SAdrien Mazarguil void mlx5_stats_get(struct rte_eth_dev *, struct rte_eth_stats *);
19687011737SAdrien Mazarguil void mlx5_stats_reset(struct rte_eth_dev *);
19787011737SAdrien Mazarguil 
198e60fbd5bSAdrien Mazarguil /* mlx5_trigger.c */
199e60fbd5bSAdrien Mazarguil 
200e60fbd5bSAdrien Mazarguil int mlx5_dev_start(struct rte_eth_dev *);
201e60fbd5bSAdrien Mazarguil void mlx5_dev_stop(struct rte_eth_dev *);
202e60fbd5bSAdrien Mazarguil 
203771fa900SAdrien Mazarguil #endif /* RTE_PMD_MLX5_H_ */
204