1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) 2009-2018 Microsoft Corp. 3 * Copyright (c) 2016 Brocade Communications Systems, Inc. 4 * Copyright (c) 2012 NetApp Inc. 5 * Copyright (c) 2012 Citrix Inc. 6 * All rights reserved. 7 */ 8 9 #include <rte_eal_paging.h> 10 11 /* 12 * Tunable ethdev params 13 */ 14 #define HN_MIN_RX_BUF_SIZE 1024 15 #define HN_MAX_XFER_LEN 2048 16 #define HN_MAX_MAC_ADDRS 1 17 #define HN_MAX_CHANNELS 64 18 19 /* Claimed to be 12232B */ 20 #define HN_MTU_MAX (9 * 1024) 21 22 /* Retry interval */ 23 #define HN_CHAN_INTERVAL_US 100 24 25 /* Host monitor interval */ 26 #define HN_CHAN_LATENCY_NS 50000 27 28 #define HN_TXCOPY_THRESHOLD 512 29 #define HN_RXCOPY_THRESHOLD 256 30 31 #define HN_RX_EXTMBUF_ENABLE 0 32 33 #ifndef PAGE_MASK 34 #define PAGE_MASK (rte_mem_page_size() - 1) 35 #endif 36 37 struct hn_data; 38 struct hn_txdesc; 39 40 struct hn_stats { 41 uint64_t packets; 42 uint64_t bytes; 43 uint64_t errors; 44 uint64_t ring_full; 45 uint64_t channel_full; 46 uint64_t multicast; 47 uint64_t broadcast; 48 /* Size bins in array as RFC 2819, undersized [0], 64 [1], etc */ 49 uint64_t size_bins[8]; 50 }; 51 52 struct hn_tx_queue { 53 struct hn_data *hv; 54 struct vmbus_channel *chan; 55 uint16_t port_id; 56 uint16_t queue_id; 57 uint32_t free_thresh; 58 struct rte_mempool *txdesc_pool; 59 const struct rte_memzone *tx_rndis_mz; 60 void *tx_rndis; 61 rte_iova_t tx_rndis_iova; 62 63 /* Applied packet transmission aggregation limits. */ 64 uint32_t agg_szmax; 65 uint32_t agg_pktmax; 66 uint32_t agg_align; 67 68 /* Packet transmission aggregation states */ 69 struct hn_txdesc *agg_txd; 70 uint32_t agg_pktleft; 71 uint32_t agg_szleft; 72 struct rndis_packet_msg *agg_prevpkt; 73 74 struct hn_stats stats; 75 }; 76 77 struct hn_rx_queue { 78 struct hn_data *hv; 79 struct vmbus_channel *chan; 80 struct rte_mempool *mb_pool; 81 struct rte_ring *rx_ring; 82 83 rte_spinlock_t ring_lock; 84 uint32_t event_sz; 85 uint16_t port_id; 86 uint16_t queue_id; 87 struct hn_stats stats; 88 89 void *event_buf; 90 struct hn_rx_bufinfo *rxbuf_info; 91 rte_atomic32_t rxbuf_outstanding; 92 }; 93 94 95 /* multi-packet data from host */ 96 struct hn_rx_bufinfo { 97 struct vmbus_channel *chan; 98 struct hn_rx_queue *rxq; 99 uint64_t xactid; 100 struct rte_mbuf_ext_shared_info shinfo; 101 } __rte_cache_aligned; 102 103 #define HN_INVALID_PORT UINT16_MAX 104 105 enum vf_device_state { 106 vf_unknown = 0, 107 vf_removed, 108 vf_configured, 109 vf_started, 110 vf_stopped, 111 }; 112 113 struct hn_vf_ctx { 114 uint16_t vf_port; 115 116 /* We have taken ownership of this VF port from DPDK */ 117 bool vf_attached; 118 119 /* VSC has requested to switch data path to VF */ 120 bool vf_vsc_switched; 121 122 /* VSP has reported the VF is present for this NIC */ 123 bool vf_vsp_reported; 124 125 enum vf_device_state vf_state; 126 }; 127 128 struct hn_data { 129 struct rte_vmbus_device *vmbus; 130 struct hn_rx_queue *primary; 131 rte_rwlock_t vf_lock; 132 uint16_t port_id; 133 134 struct hn_vf_ctx vf_ctx; 135 136 uint8_t closed; 137 uint8_t vlan_strip; 138 139 uint32_t link_status; 140 uint32_t link_speed; 141 142 struct rte_mem_resource *rxbuf_res; /* UIO resource for Rx */ 143 uint32_t rxbuf_section_cnt; /* # of Rx sections */ 144 uint32_t rx_copybreak; 145 uint32_t rx_extmbuf_enable; 146 uint16_t max_queues; /* Max available queues */ 147 uint16_t num_queues; 148 uint64_t rss_offloads; 149 150 rte_spinlock_t chim_lock; 151 struct rte_mem_resource *chim_res; /* UIO resource for Tx */ 152 struct rte_bitmap *chim_bmap; /* Send buffer map */ 153 void *chim_bmem; 154 uint32_t tx_copybreak; 155 uint32_t chim_szmax; /* Max size per buffer */ 156 uint32_t chim_cnt; /* Max packets per buffer */ 157 158 uint32_t latency; 159 uint32_t nvs_ver; 160 uint32_t ndis_ver; 161 uint32_t rndis_agg_size; 162 uint32_t rndis_agg_pkts; 163 uint32_t rndis_agg_align; 164 165 volatile uint32_t rndis_pending; 166 rte_atomic32_t rndis_req_id; 167 uint8_t rndis_resp[256]; 168 169 uint32_t rss_hash; 170 uint8_t rss_key[40]; 171 uint16_t rss_ind[128]; 172 173 struct rte_eth_dev_owner owner; 174 175 struct vmbus_channel *channels[HN_MAX_CHANNELS]; 176 177 struct rte_devargs devargs; 178 int eal_hot_plug_retry; 179 }; 180 181 static inline struct vmbus_channel * 182 hn_primary_chan(const struct hn_data *hv) 183 { 184 return hv->channels[0]; 185 } 186 187 uint32_t hn_process_events(struct hn_data *hv, uint16_t queue_id, 188 uint32_t tx_limit); 189 190 uint16_t hn_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, 191 uint16_t nb_pkts); 192 uint16_t hn_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, 193 uint16_t nb_pkts); 194 195 int hn_chim_init(struct rte_eth_dev *dev); 196 void hn_chim_uninit(struct rte_eth_dev *dev); 197 int hn_dev_link_update(struct rte_eth_dev *dev, int wait); 198 int hn_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, 199 uint16_t nb_desc, unsigned int socket_id, 200 const struct rte_eth_txconf *tx_conf); 201 void hn_dev_tx_queue_release(void *arg); 202 void hn_dev_tx_queue_info(struct rte_eth_dev *dev, uint16_t queue_idx, 203 struct rte_eth_txq_info *qinfo); 204 int hn_dev_tx_done_cleanup(void *arg, uint32_t free_cnt); 205 int hn_dev_tx_descriptor_status(void *arg, uint16_t offset); 206 207 struct hn_rx_queue *hn_rx_queue_alloc(struct hn_data *hv, 208 uint16_t queue_id, 209 unsigned int socket_id); 210 int hn_dev_rx_queue_setup(struct rte_eth_dev *dev, 211 uint16_t queue_idx, uint16_t nb_desc, 212 unsigned int socket_id, 213 const struct rte_eth_rxconf *rx_conf, 214 struct rte_mempool *mp); 215 void hn_dev_rx_queue_info(struct rte_eth_dev *dev, uint16_t queue_id, 216 struct rte_eth_rxq_info *qinfo); 217 void hn_dev_rx_queue_release(void *arg); 218 uint32_t hn_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t queue_id); 219 int hn_dev_rx_queue_status(void *rxq, uint16_t offset); 220 void hn_dev_free_queues(struct rte_eth_dev *dev); 221 222 /* 223 * Get VF device for existing netvsc device 224 * Assumes vf_lock is held. 225 */ 226 static inline struct rte_eth_dev * 227 hn_get_vf_dev(const struct hn_data *hv) 228 { 229 if (hv->vf_ctx.vf_attached) 230 return &rte_eth_devices[hv->vf_ctx.vf_port]; 231 else 232 return NULL; 233 } 234 235 int hn_vf_info_get(struct hn_data *hv, 236 struct rte_eth_dev_info *info); 237 int hn_vf_add(struct rte_eth_dev *dev, struct hn_data *hv); 238 int hn_vf_configure_locked(struct rte_eth_dev *dev, 239 const struct rte_eth_conf *dev_conf); 240 const uint32_t *hn_vf_supported_ptypes(struct rte_eth_dev *dev); 241 int hn_vf_start(struct rte_eth_dev *dev); 242 void hn_vf_reset(struct rte_eth_dev *dev); 243 int hn_vf_close(struct rte_eth_dev *dev); 244 int hn_vf_stop(struct rte_eth_dev *dev); 245 246 int hn_vf_allmulticast_enable(struct rte_eth_dev *dev); 247 int hn_vf_allmulticast_disable(struct rte_eth_dev *dev); 248 int hn_vf_promiscuous_enable(struct rte_eth_dev *dev); 249 int hn_vf_promiscuous_disable(struct rte_eth_dev *dev); 250 int hn_vf_mc_addr_list(struct rte_eth_dev *dev, 251 struct rte_ether_addr *mc_addr_set, 252 uint32_t nb_mc_addr); 253 254 int hn_vf_tx_queue_setup(struct rte_eth_dev *dev, 255 uint16_t queue_idx, uint16_t nb_desc, 256 unsigned int socket_id, 257 const struct rte_eth_txconf *tx_conf); 258 void hn_vf_tx_queue_release(struct hn_data *hv, uint16_t queue_id); 259 int hn_vf_tx_queue_status(struct hn_data *hv, uint16_t queue_id, uint16_t offset); 260 261 int hn_vf_rx_queue_setup(struct rte_eth_dev *dev, 262 uint16_t queue_idx, uint16_t nb_desc, 263 unsigned int socket_id, 264 const struct rte_eth_rxconf *rx_conf, 265 struct rte_mempool *mp); 266 void hn_vf_rx_queue_release(struct hn_data *hv, uint16_t queue_id); 267 268 int hn_vf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); 269 int hn_vf_stats_reset(struct rte_eth_dev *dev); 270 int hn_vf_xstats_get_names(struct rte_eth_dev *dev, 271 struct rte_eth_xstat_name *xstats_names, 272 unsigned int size); 273 int hn_vf_xstats_get(struct rte_eth_dev *dev, 274 struct rte_eth_xstat *xstats, 275 unsigned int offset, unsigned int n); 276 int hn_vf_xstats_reset(struct rte_eth_dev *dev); 277 int hn_vf_rss_hash_update(struct rte_eth_dev *dev, 278 struct rte_eth_rss_conf *rss_conf); 279 int hn_vf_reta_hash_update(struct rte_eth_dev *dev, 280 struct rte_eth_rss_reta_entry64 *reta_conf, 281 uint16_t reta_size); 282 int hn_eth_rmv_event_callback(uint16_t port_id, 283 enum rte_eth_event_type event __rte_unused, 284 void *cb_arg, void *out __rte_unused); 285