xref: /dpdk/drivers/net/netvsc/hn_var.h (revision 27595cd83053b2d39634a159d6709b3ce3cdf3b0)
14e9c73e9SStephen Hemminger /* SPDX-License-Identifier: BSD-3-Clause
24e9c73e9SStephen Hemminger  * Copyright (c) 2009-2018 Microsoft Corp.
34e9c73e9SStephen Hemminger  * Copyright (c) 2016 Brocade Communications Systems, Inc.
44e9c73e9SStephen Hemminger  * Copyright (c) 2012 NetApp Inc.
54e9c73e9SStephen Hemminger  * Copyright (c) 2012 Citrix Inc.
64e9c73e9SStephen Hemminger  * All rights reserved.
74e9c73e9SStephen Hemminger  */
84e9c73e9SStephen Hemminger 
9924e6b76SThomas Monjalon #include <rte_eal_paging.h>
10f9bdee26SKonstantin Ananyev #include <ethdev_driver.h>
11924e6b76SThomas Monjalon 
124e9c73e9SStephen Hemminger /*
134e9c73e9SStephen Hemminger  * Tunable ethdev params
144e9c73e9SStephen Hemminger  */
154e9c73e9SStephen Hemminger #define HN_MIN_RX_BUF_SIZE	1024
1645c83603SSam Andrew #define HN_MAX_XFER_LEN		RTE_ETHER_MAX_JUMBO_FRAME_LEN
174e9c73e9SStephen Hemminger #define	HN_MAX_MAC_ADDRS	1
184e9c73e9SStephen Hemminger #define HN_MAX_CHANNELS		64
194e9c73e9SStephen Hemminger 
204e9c73e9SStephen Hemminger /* Claimed to be 12232B */
214e9c73e9SStephen Hemminger #define HN_MTU_MAX		(9 * 1024)
224e9c73e9SStephen Hemminger 
234e9c73e9SStephen Hemminger /* Retry interval */
244e9c73e9SStephen Hemminger #define HN_CHAN_INTERVAL_US	100
254e9c73e9SStephen Hemminger 
260312753eSStephen Hemminger /* Host monitor interval */
270312753eSStephen Hemminger #define HN_CHAN_LATENCY_NS	50000
280312753eSStephen Hemminger 
2974a5a666SStephen Hemminger #define HN_TXCOPY_THRESHOLD	512
3074a5a666SStephen Hemminger #define HN_RXCOPY_THRESHOLD	256
3174a5a666SStephen Hemminger 
32096b31fcSLong Li #define HN_RX_EXTMBUF_ENABLE	0
33096b31fcSLong Li 
344e9c73e9SStephen Hemminger #ifndef PAGE_MASK
35924e6b76SThomas Monjalon #define PAGE_MASK (rte_mem_page_size() - 1)
364e9c73e9SStephen Hemminger #endif
374e9c73e9SStephen Hemminger 
384e9c73e9SStephen Hemminger struct hn_data;
394e9c73e9SStephen Hemminger struct hn_txdesc;
404e9c73e9SStephen Hemminger 
414e9c73e9SStephen Hemminger struct hn_stats {
424e9c73e9SStephen Hemminger 	uint64_t	packets;
434e9c73e9SStephen Hemminger 	uint64_t	bytes;
444e9c73e9SStephen Hemminger 	uint64_t	errors;
4585c42091SStephen Hemminger 	uint64_t	ring_full;
46b757deb8SStephen Hemminger 	uint64_t	channel_full;
474e9c73e9SStephen Hemminger 	uint64_t	multicast;
484e9c73e9SStephen Hemminger 	uint64_t	broadcast;
494e9c73e9SStephen Hemminger 	/* Size bins in array as RFC 2819, undersized [0], 64 [1], etc */
504e9c73e9SStephen Hemminger 	uint64_t	size_bins[8];
514e9c73e9SStephen Hemminger };
524e9c73e9SStephen Hemminger 
534e9c73e9SStephen Hemminger struct hn_tx_queue {
544e9c73e9SStephen Hemminger 	struct hn_data  *hv;
554e9c73e9SStephen Hemminger 	struct vmbus_channel *chan;
564e9c73e9SStephen Hemminger 	uint16_t	port_id;
574e9c73e9SStephen Hemminger 	uint16_t	queue_id;
584e9c73e9SStephen Hemminger 	uint32_t	free_thresh;
59cc025181SStephen Hemminger 	struct rte_mempool *txdesc_pool;
60b8c3c628SLong Li 	const struct rte_memzone *tx_rndis_mz;
61cc025181SStephen Hemminger 	void		*tx_rndis;
62b8c3c628SLong Li 	rte_iova_t	tx_rndis_iova;
634e9c73e9SStephen Hemminger 
644e9c73e9SStephen Hemminger 	/* Applied packet transmission aggregation limits. */
654e9c73e9SStephen Hemminger 	uint32_t	agg_szmax;
664e9c73e9SStephen Hemminger 	uint32_t	agg_pktmax;
674e9c73e9SStephen Hemminger 	uint32_t	agg_align;
684e9c73e9SStephen Hemminger 
694e9c73e9SStephen Hemminger 	/* Packet transmission aggregation states */
704e9c73e9SStephen Hemminger 	struct hn_txdesc *agg_txd;
714e9c73e9SStephen Hemminger 	uint32_t	agg_pktleft;
724e9c73e9SStephen Hemminger 	uint32_t	agg_szleft;
734e9c73e9SStephen Hemminger 	struct rndis_packet_msg *agg_prevpkt;
744e9c73e9SStephen Hemminger 
754e9c73e9SStephen Hemminger 	struct hn_stats stats;
764e9c73e9SStephen Hemminger };
774e9c73e9SStephen Hemminger 
784e9c73e9SStephen Hemminger struct hn_rx_queue {
794e9c73e9SStephen Hemminger 	struct hn_data  *hv;
804e9c73e9SStephen Hemminger 	struct vmbus_channel *chan;
814e9c73e9SStephen Hemminger 	struct rte_mempool *mb_pool;
824e9c73e9SStephen Hemminger 	struct rte_ring *rx_ring;
834e9c73e9SStephen Hemminger 
844e9c73e9SStephen Hemminger 	rte_spinlock_t ring_lock;
854e9c73e9SStephen Hemminger 	uint32_t event_sz;
864e9c73e9SStephen Hemminger 	uint16_t port_id;
874e9c73e9SStephen Hemminger 	uint16_t queue_id;
884e9c73e9SStephen Hemminger 	struct hn_stats stats;
89530af95aSStephen Hemminger 
901f2766b7SStephen Hemminger 	void *event_buf;
91ac837bddSLong Li 	struct hn_rx_bufinfo *rxbuf_info;
92ac837bddSLong Li 	rte_atomic32_t  rxbuf_outstanding;
934e9c73e9SStephen Hemminger };
944e9c73e9SStephen Hemminger 
954e9c73e9SStephen Hemminger 
964e9c73e9SStephen Hemminger /* multi-packet data from host */
97*27595cd8STyler Retzlaff struct __rte_cache_aligned hn_rx_bufinfo {
984e9c73e9SStephen Hemminger 	struct vmbus_channel *chan;
99ac837bddSLong Li 	struct hn_rx_queue *rxq;
1004e9c73e9SStephen Hemminger 	uint64_t	xactid;
1014e9c73e9SStephen Hemminger 	struct rte_mbuf_ext_shared_info shinfo;
102*27595cd8STyler Retzlaff };
1034e9c73e9SStephen Hemminger 
1044a9efcddSStephen Hemminger #define HN_INVALID_PORT	UINT16_MAX
1054a9efcddSStephen Hemminger 
106a2a23a79SLong Li enum vf_device_state {
107a2a23a79SLong Li 	vf_unknown = 0,
108a2a23a79SLong Li 	vf_removed,
109a2a23a79SLong Li 	vf_configured,
110a2a23a79SLong Li 	vf_started,
111a2a23a79SLong Li 	vf_stopped,
112a2a23a79SLong Li };
113a2a23a79SLong Li 
114a2a23a79SLong Li struct hn_vf_ctx {
115a2a23a79SLong Li 	uint16_t	vf_port;
116a2a23a79SLong Li 
117a2a23a79SLong Li 	/* We have taken ownership of this VF port from DPDK */
118a2a23a79SLong Li 	bool		vf_attached;
119a2a23a79SLong Li 
120a2a23a79SLong Li 	/* VSC has requested to switch data path to VF */
121a2a23a79SLong Li 	bool		vf_vsc_switched;
122a2a23a79SLong Li 
123a2a23a79SLong Li 	/* VSP has reported the VF is present for this NIC */
124a2a23a79SLong Li 	bool		vf_vsp_reported;
125a2a23a79SLong Li 
126a2a23a79SLong Li 	enum vf_device_state	vf_state;
127a2a23a79SLong Li };
128a2a23a79SLong Li 
1297fc4c099SLong Li struct hv_hotadd_context {
1307fc4c099SLong Li 	LIST_ENTRY(hv_hotadd_context) list;
1317fc4c099SLong Li 	struct hn_data *hv;
1327fc4c099SLong Li 	struct rte_devargs da;
1337fc4c099SLong Li 	int eal_hot_plug_retry;
1347fc4c099SLong Li };
1357fc4c099SLong Li 
1364e9c73e9SStephen Hemminger struct hn_data {
1374e9c73e9SStephen Hemminger 	struct rte_vmbus_device *vmbus;
1384e9c73e9SStephen Hemminger 	struct hn_rx_queue *primary;
13981938ebbSStephen Hemminger 	rte_rwlock_t    vf_lock;
1404e9c73e9SStephen Hemminger 	uint16_t	port_id;
1414a9efcddSStephen Hemminger 
142a2a23a79SLong Li 	struct hn_vf_ctx	vf_ctx;
143a2a23a79SLong Li 
1444a9efcddSStephen Hemminger 	uint8_t		closed;
1453c32fdf4SStephen Hemminger 	uint8_t		vlan_strip;
1464a9efcddSStephen Hemminger 
1474e9c73e9SStephen Hemminger 	uint32_t	link_status;
1484e9c73e9SStephen Hemminger 	uint32_t	link_speed;
1494e9c73e9SStephen Hemminger 
1507b1a614dSLong Li 	struct rte_mem_resource rxbuf_res;	/* UIO resource for Rx */
1514e9c73e9SStephen Hemminger 	uint32_t	rxbuf_section_cnt;	/* # of Rx sections */
15274a5a666SStephen Hemminger 	uint32_t	rx_copybreak;
153096b31fcSLong Li 	uint32_t	rx_extmbuf_enable;
1544e9c73e9SStephen Hemminger 	uint16_t	max_queues;		/* Max available queues */
1554e9c73e9SStephen Hemminger 	uint16_t	num_queues;
1564e9c73e9SStephen Hemminger 	uint64_t	rss_offloads;
1574e9c73e9SStephen Hemminger 
158cc025181SStephen Hemminger 	rte_spinlock_t	chim_lock;
1597b1a614dSLong Li 	struct rte_mem_resource chim_res;	/* UIO resource for Tx */
160cc025181SStephen Hemminger 	struct rte_bitmap *chim_bmap;		/* Send buffer map */
161cc025181SStephen Hemminger 	void		*chim_bmem;
16274a5a666SStephen Hemminger 	uint32_t	tx_copybreak;
1634e9c73e9SStephen Hemminger 	uint32_t	chim_szmax;		/* Max size per buffer */
1644e9c73e9SStephen Hemminger 	uint32_t	chim_cnt;		/* Max packets per buffer */
1654e9c73e9SStephen Hemminger 
166a25d39a3SStephen Hemminger 	uint32_t	latency;
1674e9c73e9SStephen Hemminger 	uint32_t	nvs_ver;
1684e9c73e9SStephen Hemminger 	uint32_t	ndis_ver;
1694e9c73e9SStephen Hemminger 	uint32_t	rndis_agg_size;
1704e9c73e9SStephen Hemminger 	uint32_t	rndis_agg_pkts;
1714e9c73e9SStephen Hemminger 	uint32_t	rndis_agg_align;
1724e9c73e9SStephen Hemminger 
1734e9c73e9SStephen Hemminger 	volatile uint32_t  rndis_pending;
1744e9c73e9SStephen Hemminger 	rte_atomic32_t	rndis_req_id;
1754e9c73e9SStephen Hemminger 	uint8_t		rndis_resp[256];
1764e9c73e9SStephen Hemminger 
17792d23a57SStephen Hemminger 	uint32_t	rss_hash;
17892d23a57SStephen Hemminger 	uint8_t		rss_key[40];
17992d23a57SStephen Hemminger 	uint16_t	rss_ind[128];
18092d23a57SStephen Hemminger 
181dc7680e8SStephen Hemminger 	struct rte_eth_dev_owner owner;
182dc7680e8SStephen Hemminger 
1834e9c73e9SStephen Hemminger 	struct vmbus_channel *channels[HN_MAX_CHANNELS];
184a2a23a79SLong Li 
1857fc4c099SLong Li 	rte_spinlock_t	hotadd_lock;
1867fc4c099SLong Li 	LIST_HEAD(hotadd_list, hv_hotadd_context) hotadd_list;
1877fc4c099SLong Li 	char		*vf_devargs;
1884e9c73e9SStephen Hemminger };
1894e9c73e9SStephen Hemminger 
1904e9c73e9SStephen Hemminger static inline struct vmbus_channel *
hn_primary_chan(const struct hn_data * hv)1914e9c73e9SStephen Hemminger hn_primary_chan(const struct hn_data *hv)
1924e9c73e9SStephen Hemminger {
1934e9c73e9SStephen Hemminger 	return hv->channels[0];
1944e9c73e9SStephen Hemminger }
1954e9c73e9SStephen Hemminger 
1967a866f0dSStephen Hemminger uint32_t hn_process_events(struct hn_data *hv, uint16_t queue_id,
1977a866f0dSStephen Hemminger 		       uint32_t tx_limit);
1984e9c73e9SStephen Hemminger 
1994e9c73e9SStephen Hemminger uint16_t hn_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
2004e9c73e9SStephen Hemminger 		      uint16_t nb_pkts);
2014e9c73e9SStephen Hemminger uint16_t hn_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
2024e9c73e9SStephen Hemminger 		      uint16_t nb_pkts);
2034e9c73e9SStephen Hemminger 
204cc025181SStephen Hemminger int	hn_chim_init(struct rte_eth_dev *dev);
205cc025181SStephen Hemminger void	hn_chim_uninit(struct rte_eth_dev *dev);
206f6ddcf80SStephen Hemminger int	hn_dev_link_update(struct rte_eth_dev *dev, int wait);
2074e9c73e9SStephen Hemminger int	hn_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
2084e9c73e9SStephen Hemminger 			      uint16_t nb_desc, unsigned int socket_id,
2094e9c73e9SStephen Hemminger 			      const struct rte_eth_txconf *tx_conf);
2107483341aSXueming Li void	hn_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid);
2112d2c4991SStephen Hemminger void	hn_dev_tx_queue_info(struct rte_eth_dev *dev, uint16_t queue_idx,
2122d2c4991SStephen Hemminger 			     struct rte_eth_txq_info *qinfo);
2137a866f0dSStephen Hemminger int	hn_dev_tx_done_cleanup(void *arg, uint32_t free_cnt);
214a41ef8eeSStephen Hemminger int	hn_dev_tx_descriptor_status(void *arg, uint16_t offset);
2154e9c73e9SStephen Hemminger 
2164e9c73e9SStephen Hemminger struct hn_rx_queue *hn_rx_queue_alloc(struct hn_data *hv,
2174e9c73e9SStephen Hemminger 				      uint16_t queue_id,
2184e9c73e9SStephen Hemminger 				      unsigned int socket_id);
2194e9c73e9SStephen Hemminger int	hn_dev_rx_queue_setup(struct rte_eth_dev *dev,
2204e9c73e9SStephen Hemminger 			      uint16_t queue_idx, uint16_t nb_desc,
2214e9c73e9SStephen Hemminger 			      unsigned int socket_id,
2224e9c73e9SStephen Hemminger 			      const struct rte_eth_rxconf *rx_conf,
2234e9c73e9SStephen Hemminger 			      struct rte_mempool *mp);
224c7b82b14SStephen Hemminger void	hn_dev_rx_queue_info(struct rte_eth_dev *dev, uint16_t queue_id,
225c7b82b14SStephen Hemminger 			     struct rte_eth_rxq_info *qinfo);
2267483341aSXueming Li void	hn_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid);
2278d7d4fcdSKonstantin Ananyev uint32_t hn_dev_rx_queue_count(void *rx_queue);
228a41ef8eeSStephen Hemminger int	hn_dev_rx_queue_status(void *rxq, uint16_t offset);
2298428da72SStephen Hemminger void	hn_dev_free_queues(struct rte_eth_dev *dev);
230dc7680e8SStephen Hemminger 
23181938ebbSStephen Hemminger /*
23281938ebbSStephen Hemminger  * Get VF device for existing netvsc device
23381938ebbSStephen Hemminger  * Assumes vf_lock is held.
23481938ebbSStephen Hemminger  */
2354a9efcddSStephen Hemminger static inline struct rte_eth_dev *
hn_get_vf_dev(const struct hn_data * hv)2364a9efcddSStephen Hemminger hn_get_vf_dev(const struct hn_data *hv)
2374a9efcddSStephen Hemminger {
238a2a23a79SLong Li 	if (hv->vf_ctx.vf_attached)
239a2a23a79SLong Li 		return &rte_eth_devices[hv->vf_ctx.vf_port];
2404a9efcddSStephen Hemminger 	else
241a2a23a79SLong Li 		return NULL;
2424a9efcddSStephen Hemminger }
2434a9efcddSStephen Hemminger 
2442db039a7SIvan Ilchenko int	hn_vf_info_get(struct hn_data *hv,
245dc7680e8SStephen Hemminger 		       struct rte_eth_dev_info *info);
246dc7680e8SStephen Hemminger int	hn_vf_add(struct rte_eth_dev *dev, struct hn_data *hv);
247a2a23a79SLong Li int	hn_vf_configure_locked(struct rte_eth_dev *dev,
248dc7680e8SStephen Hemminger 			       const struct rte_eth_conf *dev_conf);
249ba6a168aSSivaramakrishnan Venkat const uint32_t *hn_vf_supported_ptypes(struct rte_eth_dev *dev,
250ba6a168aSSivaramakrishnan Venkat 				       size_t *no_of_elements);
251dc7680e8SStephen Hemminger int	hn_vf_start(struct rte_eth_dev *dev);
2528a5a0aadSThomas Monjalon int	hn_vf_close(struct rte_eth_dev *dev);
25362024eb8SIvan Ilchenko int	hn_vf_stop(struct rte_eth_dev *dev);
2547d146e17SStephen Hemminger 
255ca041cd4SIvan Ilchenko int	hn_vf_allmulticast_enable(struct rte_eth_dev *dev);
256ca041cd4SIvan Ilchenko int	hn_vf_allmulticast_disable(struct rte_eth_dev *dev);
2579039c812SAndrew Rybchenko int	hn_vf_promiscuous_enable(struct rte_eth_dev *dev);
2589039c812SAndrew Rybchenko int	hn_vf_promiscuous_disable(struct rte_eth_dev *dev);
2597d146e17SStephen Hemminger int	hn_vf_mc_addr_list(struct rte_eth_dev *dev,
2606d13ea8eSOlivier Matz 			   struct rte_ether_addr *mc_addr_set,
2617d146e17SStephen Hemminger 			   uint32_t nb_mc_addr);
2627d146e17SStephen Hemminger 
263dc7680e8SStephen Hemminger int	hn_vf_tx_queue_setup(struct rte_eth_dev *dev,
264dc7680e8SStephen Hemminger 			     uint16_t queue_idx, uint16_t nb_desc,
265dc7680e8SStephen Hemminger 			     unsigned int socket_id,
266dc7680e8SStephen Hemminger 			     const struct rte_eth_txconf *tx_conf);
267dc7680e8SStephen Hemminger void	hn_vf_tx_queue_release(struct hn_data *hv, uint16_t queue_id);
268a41ef8eeSStephen Hemminger int	hn_vf_tx_queue_status(struct hn_data *hv, uint16_t queue_id, uint16_t offset);
269a41ef8eeSStephen Hemminger 
270dc7680e8SStephen Hemminger int	hn_vf_rx_queue_setup(struct rte_eth_dev *dev,
271dc7680e8SStephen Hemminger 			     uint16_t queue_idx, uint16_t nb_desc,
272dc7680e8SStephen Hemminger 			     unsigned int socket_id,
273dc7680e8SStephen Hemminger 			     const struct rte_eth_rxconf *rx_conf,
274dc7680e8SStephen Hemminger 			     struct rte_mempool *mp);
275dc7680e8SStephen Hemminger void	hn_vf_rx_queue_release(struct hn_data *hv, uint16_t queue_id);
276dc7680e8SStephen Hemminger 
277dc7680e8SStephen Hemminger int	hn_vf_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);
2789970a9adSIgor Romanov int	hn_vf_stats_reset(struct rte_eth_dev *dev);
279dc7680e8SStephen Hemminger int	hn_vf_xstats_get_names(struct rte_eth_dev *dev,
280dc7680e8SStephen Hemminger 			       struct rte_eth_xstat_name *xstats_names,
281dc7680e8SStephen Hemminger 			       unsigned int size);
282dc7680e8SStephen Hemminger int	hn_vf_xstats_get(struct rte_eth_dev *dev,
283dc7680e8SStephen Hemminger 			 struct rte_eth_xstat *xstats,
284cc9271f9SStephen Hemminger 			 unsigned int offset, unsigned int n);
2859970a9adSIgor Romanov int	hn_vf_xstats_reset(struct rte_eth_dev *dev);
28692d23a57SStephen Hemminger int	hn_vf_rss_hash_update(struct rte_eth_dev *dev,
28792d23a57SStephen Hemminger 			      struct rte_eth_rss_conf *rss_conf);
28892d23a57SStephen Hemminger int	hn_vf_reta_hash_update(struct rte_eth_dev *dev,
28992d23a57SStephen Hemminger 			       struct rte_eth_rss_reta_entry64 *reta_conf,
29092d23a57SStephen Hemminger 			       uint16_t reta_size);
29145c83603SSam Andrew int hn_vf_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
292a2a23a79SLong Li int	hn_eth_rmv_event_callback(uint16_t port_id,
293a2a23a79SLong Li 				  enum rte_eth_event_type event __rte_unused,
294a2a23a79SLong Li 				  void *cb_arg, void *out __rte_unused);
295