1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2022 Microsoft Corporation 3 */ 4 5 #ifndef __MANA_H__ 6 #define __MANA_H__ 7 8 #define PCI_VENDOR_ID_MICROSOFT 0x1414 9 #define PCI_DEVICE_ID_MICROSOFT_MANA 0x00ba 10 11 /* Shared data between primary/secondary processes */ 12 struct mana_shared_data { 13 rte_spinlock_t lock; 14 int init_done; 15 unsigned int primary_cnt; 16 unsigned int secondary_cnt; 17 }; 18 19 #define MIN_RX_BUF_SIZE 1024 20 #define MAX_FRAME_SIZE RTE_ETHER_MAX_LEN 21 #define MANA_MAX_MAC_ADDR 1 22 23 #define MANA_DEV_RX_OFFLOAD_SUPPORT ( \ 24 RTE_ETH_RX_OFFLOAD_CHECKSUM | \ 25 RTE_ETH_RX_OFFLOAD_RSS_HASH) 26 27 #define MANA_DEV_TX_OFFLOAD_SUPPORT ( \ 28 RTE_ETH_TX_OFFLOAD_MULTI_SEGS | \ 29 RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | \ 30 RTE_ETH_TX_OFFLOAD_TCP_CKSUM | \ 31 RTE_ETH_TX_OFFLOAD_UDP_CKSUM) 32 33 #define INDIRECTION_TABLE_NUM_ELEMENTS 64 34 #define TOEPLITZ_HASH_KEY_SIZE_IN_BYTES 40 35 #define MANA_ETH_RSS_SUPPORT ( \ 36 RTE_ETH_RSS_IPV4 | \ 37 RTE_ETH_RSS_NONFRAG_IPV4_TCP | \ 38 RTE_ETH_RSS_NONFRAG_IPV4_UDP | \ 39 RTE_ETH_RSS_IPV6 | \ 40 RTE_ETH_RSS_NONFRAG_IPV6_TCP | \ 41 RTE_ETH_RSS_NONFRAG_IPV6_UDP) 42 43 #define MIN_BUFFERS_PER_QUEUE 64 44 #define MAX_RECEIVE_BUFFERS_PER_QUEUE 256 45 #define MAX_SEND_BUFFERS_PER_QUEUE 256 46 47 struct mana_process_priv { 48 void *db_page; 49 }; 50 51 struct mana_priv { 52 struct rte_eth_dev_data *dev_data; 53 struct mana_process_priv *process_priv; 54 int num_queues; 55 56 /* DPDK port */ 57 uint16_t port_id; 58 59 /* IB device port */ 60 uint8_t dev_port; 61 62 struct ibv_context *ib_ctx; 63 struct ibv_pd *ib_pd; 64 struct ibv_pd *ib_parent_pd; 65 void *db_page; 66 struct rte_eth_rss_conf rss_conf; 67 struct rte_intr_handle *intr_handle; 68 int max_rx_queues; 69 int max_tx_queues; 70 int max_rx_desc; 71 int max_tx_desc; 72 int max_send_sge; 73 int max_recv_sge; 74 int max_mr; 75 uint64_t max_mr_size; 76 }; 77 78 struct mana_rxq_desc { 79 struct rte_mbuf *pkt; 80 uint32_t wqe_size_in_bu; 81 }; 82 83 struct mana_rxq { 84 struct mana_priv *priv; 85 uint32_t num_desc; 86 struct rte_mempool *mp; 87 88 /* For storing pending requests */ 89 struct mana_rxq_desc *desc_ring; 90 91 /* desc_ring_head is where we put pending requests to ring, 92 * completion pull off desc_ring_tail 93 */ 94 uint32_t desc_ring_head, desc_ring_tail; 95 96 unsigned int socket; 97 }; 98 99 extern int mana_logtype_driver; 100 extern int mana_logtype_init; 101 102 #define DRV_LOG(level, fmt, args...) \ 103 rte_log(RTE_LOG_ ## level, mana_logtype_driver, "%s(): " fmt "\n", \ 104 __func__, ## args) 105 106 #define PMD_INIT_LOG(level, fmt, args...) \ 107 rte_log(RTE_LOG_ ## level, mana_logtype_init, "%s(): " fmt "\n",\ 108 __func__, ## args) 109 110 #define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>") 111 112 uint16_t mana_rx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts, 113 uint16_t pkts_n); 114 115 uint16_t mana_tx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts, 116 uint16_t pkts_n); 117 118 /** Request timeout for IPC. */ 119 #define MANA_MP_REQ_TIMEOUT_SEC 5 120 121 /* Request types for IPC. */ 122 enum mana_mp_req_type { 123 MANA_MP_REQ_VERBS_CMD_FD = 1, 124 MANA_MP_REQ_CREATE_MR, 125 MANA_MP_REQ_START_RXTX, 126 MANA_MP_REQ_STOP_RXTX, 127 }; 128 129 /* Pameters for IPC. */ 130 struct mana_mp_param { 131 enum mana_mp_req_type type; 132 int port_id; 133 int result; 134 135 /* MANA_MP_REQ_CREATE_MR */ 136 uintptr_t addr; 137 uint32_t len; 138 }; 139 140 #define MANA_MP_NAME "net_mana_mp" 141 int mana_mp_init_primary(void); 142 int mana_mp_init_secondary(void); 143 void mana_mp_uninit_primary(void); 144 void mana_mp_uninit_secondary(void); 145 int mana_mp_req_verbs_cmd_fd(struct rte_eth_dev *dev); 146 147 void mana_mp_req_on_rxtx(struct rte_eth_dev *dev, enum mana_mp_req_type type); 148 149 void *mana_alloc_verbs_buf(size_t size, void *data); 150 void mana_free_verbs_buf(void *ptr, void *data __rte_unused); 151 152 #endif 153