Branch data Line data Source code
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 : 0 : rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++; 218 : 0 : } 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__ */