1 /* SPDX-License-Identifier: BSD-3-Clause 2 * 3 * Copyright (c) 2016-2018 Solarflare Communications Inc. 4 * All rights reserved. 5 * 6 * This software was jointly developed between OKTET Labs (under contract 7 * for Solarflare) and Solarflare Communications, Inc. 8 */ 9 10 #ifndef _SFC_DP_TX_H 11 #define _SFC_DP_TX_H 12 13 #include <rte_ethdev_driver.h> 14 15 #include "sfc_dp.h" 16 17 #ifdef __cplusplus 18 extern "C" { 19 #endif 20 21 /** 22 * Generic transmit queue information used on data path. 23 * It must be kept as small as it is possible since it is built into 24 * the structure used on datapath. 25 */ 26 struct sfc_dp_txq { 27 struct sfc_dp_queue dpq; 28 }; 29 30 /** 31 * Datapath transmit queue creation information. 32 * 33 * The structure is used just to pass information from control path to 34 * datapath. It could be just function arguments, but it would be hardly 35 * readable. 36 */ 37 struct sfc_dp_tx_qcreate_info { 38 /** Maximum number of pushed Tx descriptors */ 39 unsigned int max_fill_level; 40 /** Minimum number of unused Tx descriptors to do reap */ 41 unsigned int free_thresh; 42 /** Offloads enabled on the transmit queue */ 43 uint64_t offloads; 44 /** Tx queue size */ 45 unsigned int txq_entries; 46 /** Maximum size of data in the DMA descriptor */ 47 uint16_t dma_desc_size_max; 48 /** DMA-mapped Tx descriptors ring */ 49 void *txq_hw_ring; 50 /** Associated event queue size */ 51 unsigned int evq_entries; 52 /** Hardware event ring */ 53 void *evq_hw_ring; 54 /** The queue index in hardware (required to push right doorbell) */ 55 unsigned int hw_index; 56 /** Virtual address of the memory-mapped BAR to push Tx doorbell */ 57 volatile void *mem_bar; 58 /** VI window size shift */ 59 unsigned int vi_window_shift; 60 /** 61 * Maximum number of bytes into the packet the TCP header can start for 62 * the hardware to apply TSO packet edits. 63 */ 64 uint16_t tso_tcp_header_offset_limit; 65 }; 66 67 /** 68 * Get Tx datapath specific device info. 69 * 70 * @param dev_info Device info to be adjusted 71 */ 72 typedef void (sfc_dp_tx_get_dev_info_t)(struct rte_eth_dev_info *dev_info); 73 74 /** 75 * Get size of transmit and event queue rings by the number of Tx 76 * descriptors. 77 * 78 * @param nb_tx_desc Number of Tx descriptors 79 * @param txq_entries Location for number of Tx ring entries 80 * @param evq_entries Location for number of event ring entries 81 * @param txq_max_fill_level Location for maximum Tx ring fill level 82 * 83 * @return 0 or positive errno. 84 */ 85 typedef int (sfc_dp_tx_qsize_up_rings_t)(uint16_t nb_tx_desc, 86 unsigned int *txq_entries, 87 unsigned int *evq_entries, 88 unsigned int *txq_max_fill_level); 89 90 /** 91 * Allocate and initialize datapath transmit queue. 92 * 93 * @param port_id The port identifier 94 * @param queue_id The queue identifier 95 * @param pci_addr PCI function address 96 * @param socket_id Socket identifier to allocate memory 97 * @param info Tx queue details wrapped in structure 98 * @param dp_txqp Location for generic datapath transmit queue pointer 99 * 100 * @return 0 or positive errno. 101 */ 102 typedef int (sfc_dp_tx_qcreate_t)(uint16_t port_id, uint16_t queue_id, 103 const struct rte_pci_addr *pci_addr, 104 int socket_id, 105 const struct sfc_dp_tx_qcreate_info *info, 106 struct sfc_dp_txq **dp_txqp); 107 108 /** 109 * Free resources allocated for datapath transmit queue. 110 */ 111 typedef void (sfc_dp_tx_qdestroy_t)(struct sfc_dp_txq *dp_txq); 112 113 /** 114 * Transmit queue start callback. 115 * 116 * It handovers EvQ to the datapath. 117 */ 118 typedef int (sfc_dp_tx_qstart_t)(struct sfc_dp_txq *dp_txq, 119 unsigned int evq_read_ptr, 120 unsigned int txq_desc_index); 121 122 /** 123 * Transmit queue stop function called before the queue flush. 124 * 125 * It returns EvQ to the control path. 126 */ 127 typedef void (sfc_dp_tx_qstop_t)(struct sfc_dp_txq *dp_txq, 128 unsigned int *evq_read_ptr); 129 130 /** 131 * Transmit event handler used during queue flush only. 132 */ 133 typedef bool (sfc_dp_tx_qtx_ev_t)(struct sfc_dp_txq *dp_txq, unsigned int id); 134 135 /** 136 * Transmit queue function called after the queue flush. 137 */ 138 typedef void (sfc_dp_tx_qreap_t)(struct sfc_dp_txq *dp_txq); 139 140 /** 141 * Check Tx descriptor status 142 */ 143 typedef int (sfc_dp_tx_qdesc_status_t)(struct sfc_dp_txq *dp_txq, 144 uint16_t offset); 145 146 /** Transmit datapath definition */ 147 struct sfc_dp_tx { 148 struct sfc_dp dp; 149 150 unsigned int features; 151 #define SFC_DP_TX_FEAT_VLAN_INSERT 0x1 152 #define SFC_DP_TX_FEAT_TSO 0x2 153 #define SFC_DP_TX_FEAT_MULTI_SEG 0x4 154 #define SFC_DP_TX_FEAT_MULTI_PROCESS 0x8 155 #define SFC_DP_TX_FEAT_MULTI_POOL 0x10 156 #define SFC_DP_TX_FEAT_REFCNT 0x20 157 sfc_dp_tx_get_dev_info_t *get_dev_info; 158 sfc_dp_tx_qsize_up_rings_t *qsize_up_rings; 159 sfc_dp_tx_qcreate_t *qcreate; 160 sfc_dp_tx_qdestroy_t *qdestroy; 161 sfc_dp_tx_qstart_t *qstart; 162 sfc_dp_tx_qstop_t *qstop; 163 sfc_dp_tx_qtx_ev_t *qtx_ev; 164 sfc_dp_tx_qreap_t *qreap; 165 sfc_dp_tx_qdesc_status_t *qdesc_status; 166 eth_tx_burst_t pkt_burst; 167 }; 168 169 static inline struct sfc_dp_tx * 170 sfc_dp_find_tx_by_name(struct sfc_dp_list *head, const char *name) 171 { 172 struct sfc_dp *p = sfc_dp_find_by_name(head, SFC_DP_TX, name); 173 174 return (p == NULL) ? NULL : container_of(p, struct sfc_dp_tx, dp); 175 } 176 177 static inline struct sfc_dp_tx * 178 sfc_dp_find_tx_by_caps(struct sfc_dp_list *head, unsigned int avail_caps) 179 { 180 struct sfc_dp *p = sfc_dp_find_by_caps(head, SFC_DP_TX, avail_caps); 181 182 return (p == NULL) ? NULL : container_of(p, struct sfc_dp_tx, dp); 183 } 184 185 extern struct sfc_dp_tx sfc_efx_tx; 186 extern struct sfc_dp_tx sfc_ef10_tx; 187 extern struct sfc_dp_tx sfc_ef10_simple_tx; 188 189 #ifdef __cplusplus 190 } 191 #endif 192 #endif /* _SFC_DP_TX_H */ 193