1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) 2014-2021 Netronome Systems, Inc. 3 * All rights reserved. 4 */ 5 6 #ifndef __NFP_RXTX_H__ 7 #define __NFP_RXTX_H__ 8 9 #include <ethdev_driver.h> 10 11 /* Descriptor alignment */ 12 #define NFP_ALIGN_RING_DESC 128 13 14 struct nfp_net_dp_buf { 15 struct rte_mbuf *mbuf; 16 }; 17 18 struct nfp_tx_ipsec_desc_msg { 19 uint32_t sa_idx; /**< SA index in driver table */ 20 uint32_t enc; /**< IPsec enable flag */ 21 union { 22 uint64_t value; 23 struct { 24 uint32_t low; 25 uint32_t hi; 26 }; 27 } esn; /**< Extended Sequence Number */ 28 }; 29 30 struct __rte_aligned(64) nfp_net_txq { 31 /** Backpointer to nfp_net structure */ 32 struct nfp_net_hw *hw; 33 struct nfp_net_hw_priv *hw_priv; 34 35 /** 36 * For each descriptor keep a reference to the mbuf and 37 * DMA address used until completion is signalled. 38 */ 39 struct nfp_net_dp_buf *txbufs; 40 41 /** 42 * Information about the host side queue location. 43 * It is the virtual address for the queue. 44 */ 45 union { 46 struct nfp_net_nfd3_tx_desc *txds; 47 struct nfp_net_nfdk_tx_desc *ktxds; 48 }; 49 50 /** 51 * Host side read and write pointer, they are free running and 52 * have little relation to the QCP pointers. 53 */ 54 uint32_t wr_p; 55 uint32_t rd_p; 56 57 /** The size of the queue in number of descriptors. */ 58 uint32_t tx_count; 59 60 uint32_t tx_free_thresh; 61 62 /** The index of the QCP queue relative to the TX queue BAR. */ 63 uint32_t tx_qcidx; 64 65 /** The queue index from Linux's perspective. */ 66 uint16_t qidx; 67 uint16_t port_id; 68 69 /** Used by NFDk only */ 70 uint16_t data_pending; 71 72 /** Used by NFDk vector xmit only */ 73 bool simple_always; 74 75 /** 76 * At this point 58 bytes have been used for all the fields in the 77 * TX critical path. We have room for 5 bytes and still all placed 78 * in a cache line. 79 */ 80 uint64_t dma; 81 82 /** TX pointer ring write back area (indexed by queue id) */ 83 uint64_t *txrwb; 84 85 /** TX pointer ring write back area DMA address */ 86 uint64_t txrwb_dma; 87 88 /** Point to the base of the queue structure on the NFP. */ 89 uint8_t *qcp_q; 90 }; 91 92 /* RX and freelist descriptor format */ 93 #define PCIE_DESC_RX_DD (1 << 7) 94 #define PCIE_DESC_RX_META_LEN_MASK (0x7f) 95 96 /* Flags in the RX descriptor */ 97 #define PCIE_DESC_RX_RSS (1 << 15) 98 #define PCIE_DESC_RX_I_IP4_CSUM (1 << 14) 99 #define PCIE_DESC_RX_I_IP4_CSUM_OK (1 << 13) 100 #define PCIE_DESC_RX_I_TCP_CSUM (1 << 12) 101 #define PCIE_DESC_RX_I_TCP_CSUM_OK (1 << 11) 102 #define PCIE_DESC_RX_I_UDP_CSUM (1 << 10) 103 #define PCIE_DESC_RX_I_UDP_CSUM_OK (1 << 9) 104 #define PCIE_DESC_RX_SPARE (1 << 8) 105 #define PCIE_DESC_RX_EOP (1 << 7) 106 #define PCIE_DESC_RX_IP4_CSUM (1 << 6) 107 #define PCIE_DESC_RX_IP4_CSUM_OK (1 << 5) 108 #define PCIE_DESC_RX_TCP_CSUM (1 << 4) 109 #define PCIE_DESC_RX_TCP_CSUM_OK (1 << 3) 110 #define PCIE_DESC_RX_UDP_CSUM (1 << 2) 111 #define PCIE_DESC_RX_UDP_CSUM_OK (1 << 1) 112 #define PCIE_DESC_RX_VLAN (1 << 0) 113 114 #define PCIE_DESC_RX_L4_CSUM_OK (PCIE_DESC_RX_TCP_CSUM_OK | \ 115 PCIE_DESC_RX_UDP_CSUM_OK) 116 117 struct nfp_net_rx_desc { 118 union { 119 /** Freelist descriptor. */ 120 struct __rte_packed_begin { 121 uint16_t dma_addr_hi; /**< High bits of buffer address. */ 122 uint8_t spare; /**< Reserved, must be zero. */ 123 uint8_t dd; /**< Whether descriptor available. */ 124 uint32_t dma_addr_lo; /**< Low bits of buffer address. */ 125 } __rte_packed_end fld; 126 127 /** RX descriptor. */ 128 struct __rte_packed_begin { 129 uint16_t data_len; /**< Length of frame + metadata. */ 130 uint8_t reserved; /**< Reserved, must be zero. */ 131 uint8_t meta_len_dd; /**< Length of metadata + done flag. */ 132 133 uint16_t flags; /**< RX flags. */ 134 uint16_t offload_info; /**< Offloading info. */ 135 } __rte_packed_end rxd; 136 137 /** Reserved. */ 138 uint32_t vals[2]; 139 }; 140 }; 141 142 struct __rte_aligned(64) nfp_net_rxq { 143 /** Backpointer to nfp_net structure */ 144 struct nfp_net_hw *hw; 145 struct nfp_net_hw_priv *hw_priv; 146 147 /** 148 * Point to the base addresses of the freelist queue 149 * controller peripheral queue structures on the NFP. 150 */ 151 uint8_t *qcp_fl; 152 153 /** 154 * For each buffer placed on the freelist, record the 155 * associated mbuf. 156 */ 157 struct nfp_net_dp_buf *rxbufs; 158 159 /** 160 * Information about the host side queue location. 161 * It is the virtual address for the queue. 162 */ 163 struct nfp_net_rx_desc *rxds; 164 165 /** 166 * The mempool is created by the user specifying a mbuf size. 167 * We save here the reference of the mempool needed in the RX 168 * path and the mbuf size for checking received packets can be 169 * safely copied to the mbuf using the NFP_NET_RX_OFFSET. 170 */ 171 struct rte_mempool *mem_pool; 172 173 /** 174 * Host side read pointer, free running and have little relation 175 * to the QCP pointers. It is where the driver start reading 176 * descriptors for newly arrive packets from. 177 */ 178 uint32_t rd_p; 179 180 uint16_t mbuf_size; 181 182 /** 183 * Next two fields are used for giving more free descriptors 184 * to the NFP. 185 */ 186 uint16_t rx_free_thresh; 187 uint16_t nb_rx_hold; 188 189 /** Referencing dev->data->port_id */ 190 uint16_t port_id; 191 192 /** The queue index from Linux's perspective */ 193 uint16_t qidx; 194 195 /** 196 * At this point 62 bytes have been used for all the fields in the 197 * RX critical path. We have room for 2 bytes and still all placed 198 * in a cache line. 199 */ 200 201 /** The size of the queue in number of descriptors */ 202 uint16_t rx_count; 203 204 /** 205 * The index of the QCP queue relative to the RX queue BAR 206 * used for the freelist. 207 */ 208 uint32_t fl_qcidx; 209 210 /** DMA address of the queue */ 211 uint64_t dma; 212 }; 213 214 static inline void 215 nfp_net_mbuf_alloc_failed(struct nfp_net_rxq *rxq) 216 { 217 rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++; 218 } 219 220 void nfp_net_rx_cksum(struct nfp_net_rxq *rxq, struct nfp_net_rx_desc *rxd, 221 struct rte_mbuf *mb); 222 int nfp_net_rx_freelist_setup(struct rte_eth_dev *dev); 223 uint32_t nfp_net_rx_queue_count(void *rx_queue); 224 uint16_t nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, 225 uint16_t nb_pkts); 226 void nfp_net_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx); 227 void nfp_net_reset_rx_queue(struct nfp_net_rxq *rxq); 228 int nfp_net_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, 229 uint16_t nb_desc, unsigned int socket_id, 230 const struct rte_eth_rxconf *rx_conf, 231 struct rte_mempool *mp); 232 void nfp_net_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx); 233 void nfp_net_reset_tx_queue(struct nfp_net_txq *txq); 234 235 int nfp_net_tx_queue_setup(struct rte_eth_dev *dev, 236 uint16_t queue_idx, 237 uint16_t nb_desc, 238 unsigned int socket_id, 239 const struct rte_eth_txconf *tx_conf); 240 uint32_t nfp_net_tx_free_bufs(struct nfp_net_txq *txq); 241 void nfp_net_rx_queue_info_get(struct rte_eth_dev *dev, 242 uint16_t queue_id, 243 struct rte_eth_rxq_info *qinfo); 244 void nfp_net_tx_queue_info_get(struct rte_eth_dev *dev, 245 uint16_t queue_id, 246 struct rte_eth_txq_info *qinfo); 247 void nfp_net_recv_pkts_set(struct rte_eth_dev *eth_dev); 248 int nfp_net_rx_burst_mode_get(struct rte_eth_dev *eth_dev, uint16_t queue_id, 249 struct rte_eth_burst_mode *mode); 250 int nfp_net_tx_burst_mode_get(struct rte_eth_dev *eth_dev, uint16_t queue_id, 251 struct rte_eth_burst_mode *mode); 252 void nfp_net_parse_ptype(struct nfp_net_rxq *rxq, 253 struct nfp_net_rx_desc *rxds, 254 struct rte_mbuf *mb); 255 256 #endif /* __NFP_RXTX_H__ */ 257