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