xref: /freebsd/sys/dev/enic/vnic_rq.h (revision 9c067b84)
19c067b84SDoug Ambrisko /* SPDX-License-Identifier: BSD-3-Clause
29c067b84SDoug Ambrisko  * Copyright 2008-2017 Cisco Systems, Inc.  All rights reserved.
39c067b84SDoug Ambrisko  * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
49c067b84SDoug Ambrisko  */
59c067b84SDoug Ambrisko 
69c067b84SDoug Ambrisko #ifndef _VNIC_RQ_H_
79c067b84SDoug Ambrisko #define _VNIC_RQ_H_
89c067b84SDoug Ambrisko 
99c067b84SDoug Ambrisko #include "vnic_dev.h"
109c067b84SDoug Ambrisko #include "vnic_cq.h"
119c067b84SDoug Ambrisko 
129c067b84SDoug Ambrisko /* Receive queue control */
139c067b84SDoug Ambrisko struct vnic_rq_ctrl {
149c067b84SDoug Ambrisko 	u64 ring_base;			/* 0x00 */
159c067b84SDoug Ambrisko #define RX_RING_BASE			   0x00
169c067b84SDoug Ambrisko 	u32 ring_size;			/* 0x08 */
179c067b84SDoug Ambrisko #define RX_RING_SIZE			   0x08
189c067b84SDoug Ambrisko 	u32 pad0;
199c067b84SDoug Ambrisko 	u32 posted_index;		/* 0x10 */
209c067b84SDoug Ambrisko #define RX_POSTED_INDEX			   0x10
219c067b84SDoug Ambrisko 	u32 pad1;
229c067b84SDoug Ambrisko 	u32 cq_index;			/* 0x18 */
239c067b84SDoug Ambrisko #define RX_CQ_INDEX			   0x18
249c067b84SDoug Ambrisko 	u32 pad2;
259c067b84SDoug Ambrisko 	u32 enable;			/* 0x20 */
269c067b84SDoug Ambrisko #define RX_ENABLE			   0x20
279c067b84SDoug Ambrisko 	u32 pad3;
289c067b84SDoug Ambrisko 	u32 running;			/* 0x28 */
299c067b84SDoug Ambrisko #define RX_RUNNING			   0x28
309c067b84SDoug Ambrisko 	u32 pad4;
319c067b84SDoug Ambrisko 	u32 fetch_index;		/* 0x30 */
329c067b84SDoug Ambrisko #define RX_FETCH_INDEX			   0x30
339c067b84SDoug Ambrisko 	u32 pad5;
349c067b84SDoug Ambrisko 	u32 error_interrupt_enable;	/* 0x38 */
359c067b84SDoug Ambrisko #define RX_ERROR_INTR_ENABLE		   0x38
369c067b84SDoug Ambrisko 	u32 pad6;
379c067b84SDoug Ambrisko 	u32 error_interrupt_offset;	/* 0x40 */
389c067b84SDoug Ambrisko #define RX_ERROR_INTR_OFFSET		   0x40
399c067b84SDoug Ambrisko 	u32 pad7;
409c067b84SDoug Ambrisko 	u32 error_status;		/* 0x48 */
419c067b84SDoug Ambrisko #define RX_ERROR_STATUS			   0x48
429c067b84SDoug Ambrisko 	u32 pad8;
439c067b84SDoug Ambrisko 	u32 tcp_sn;			/* 0x50 */
449c067b84SDoug Ambrisko #define RX_TCP_SN			   0x50
459c067b84SDoug Ambrisko 	u32 pad9;
469c067b84SDoug Ambrisko 	u32 unused;			/* 0x58 */
479c067b84SDoug Ambrisko 	u32 pad10;
489c067b84SDoug Ambrisko 	u32 dca_select;			/* 0x60 */
499c067b84SDoug Ambrisko #define RX_DCA_SELECT			   0x60
509c067b84SDoug Ambrisko 	u32 pad11;
519c067b84SDoug Ambrisko 	u32 dca_value;			/* 0x68 */
529c067b84SDoug Ambrisko #define RX_DCA_VALUE			   0x68
539c067b84SDoug Ambrisko 	u32 pad12;
549c067b84SDoug Ambrisko 	u32 data_ring;			/* 0x70 */
559c067b84SDoug Ambrisko };
569c067b84SDoug Ambrisko 
579c067b84SDoug Ambrisko struct vnic_rq {
589c067b84SDoug Ambrisko 	unsigned int index;
599c067b84SDoug Ambrisko 	unsigned int posted_index;
609c067b84SDoug Ambrisko 	struct vnic_dev *vdev;
619c067b84SDoug Ambrisko 	struct vnic_res *ctrl;
629c067b84SDoug Ambrisko 	struct vnic_dev_ring ring;
639c067b84SDoug Ambrisko 	int num_free_mbufs;
649c067b84SDoug Ambrisko 	struct rte_mbuf **mbuf_ring;		/* array of allocated mbufs */
659c067b84SDoug Ambrisko 	unsigned int mbuf_next_idx;		/* next mb to consume */
669c067b84SDoug Ambrisko 	void *os_buf_head;
679c067b84SDoug Ambrisko 	unsigned int pkts_outstanding;
689c067b84SDoug Ambrisko 	uint16_t rx_nb_hold;
699c067b84SDoug Ambrisko 	uint16_t rx_free_thresh;
709c067b84SDoug Ambrisko 	unsigned int socket_id;
719c067b84SDoug Ambrisko 	struct rte_mempool *mp;
729c067b84SDoug Ambrisko 	uint16_t rxst_idx;
739c067b84SDoug Ambrisko 	uint32_t tot_pkts;
749c067b84SDoug Ambrisko 	uint8_t in_use;
759c067b84SDoug Ambrisko 	unsigned int max_mbufs_per_pkt;
769c067b84SDoug Ambrisko 	uint16_t tot_nb_desc;
779c067b84SDoug Ambrisko 	bool need_initial_post;
789c067b84SDoug Ambrisko 	struct iflib_dma_info data;
799c067b84SDoug Ambrisko };
809c067b84SDoug Ambrisko 
vnic_rq_desc_avail(struct vnic_rq * rq)819c067b84SDoug Ambrisko static inline unsigned int vnic_rq_desc_avail(struct vnic_rq *rq)
829c067b84SDoug Ambrisko {
839c067b84SDoug Ambrisko 	/* how many does SW own? */
849c067b84SDoug Ambrisko 	return rq->ring.desc_avail;
859c067b84SDoug Ambrisko }
869c067b84SDoug Ambrisko 
vnic_rq_desc_used(struct vnic_rq * rq)879c067b84SDoug Ambrisko static inline unsigned int vnic_rq_desc_used(struct vnic_rq *rq)
889c067b84SDoug Ambrisko {
899c067b84SDoug Ambrisko 	/* how many does HW own? */
909c067b84SDoug Ambrisko 	return rq->ring.desc_count - rq->ring.desc_avail - 1;
919c067b84SDoug Ambrisko }
929c067b84SDoug Ambrisko 
939c067b84SDoug Ambrisko enum desc_return_options {
949c067b84SDoug Ambrisko 	VNIC_RQ_RETURN_DESC,
959c067b84SDoug Ambrisko 	VNIC_RQ_DEFER_RETURN_DESC,
969c067b84SDoug Ambrisko };
979c067b84SDoug Ambrisko 
vnic_rq_fill(struct vnic_rq * rq,int (* buf_fill)(struct vnic_rq * rq))989c067b84SDoug Ambrisko static inline int vnic_rq_fill(struct vnic_rq *rq,
999c067b84SDoug Ambrisko 	int (*buf_fill)(struct vnic_rq *rq))
1009c067b84SDoug Ambrisko {
1019c067b84SDoug Ambrisko 	int err;
1029c067b84SDoug Ambrisko 
1039c067b84SDoug Ambrisko 	while (vnic_rq_desc_avail(rq) > 0) {
1049c067b84SDoug Ambrisko 
1059c067b84SDoug Ambrisko 		err = (*buf_fill)(rq);
1069c067b84SDoug Ambrisko 		if (err)
1079c067b84SDoug Ambrisko 			return err;
1089c067b84SDoug Ambrisko 	}
1099c067b84SDoug Ambrisko 
1109c067b84SDoug Ambrisko 	return 0;
1119c067b84SDoug Ambrisko }
1129c067b84SDoug Ambrisko 
vnic_rq_fill_count(struct vnic_rq * rq,int (* buf_fill)(struct vnic_rq * rq),unsigned int count)1139c067b84SDoug Ambrisko static inline int vnic_rq_fill_count(struct vnic_rq *rq,
1149c067b84SDoug Ambrisko 	int (*buf_fill)(struct vnic_rq *rq), unsigned int count)
1159c067b84SDoug Ambrisko {
1169c067b84SDoug Ambrisko 	int err;
1179c067b84SDoug Ambrisko 
1189c067b84SDoug Ambrisko 	while ((vnic_rq_desc_avail(rq) > 0) && (count--)) {
1199c067b84SDoug Ambrisko 
1209c067b84SDoug Ambrisko 		err = (*buf_fill)(rq);
1219c067b84SDoug Ambrisko 		if (err)
1229c067b84SDoug Ambrisko 			return err;
1239c067b84SDoug Ambrisko 	}
1249c067b84SDoug Ambrisko 
1259c067b84SDoug Ambrisko 	return 0;
1269c067b84SDoug Ambrisko }
1279c067b84SDoug Ambrisko 
1289c067b84SDoug Ambrisko void vnic_rq_free(struct vnic_rq *rq);
1299c067b84SDoug Ambrisko void vnic_rq_init_start(struct vnic_rq *rq, unsigned int cq_index,
1309c067b84SDoug Ambrisko     unsigned int fetch_index, unsigned int posted_index,
1319c067b84SDoug Ambrisko     unsigned int error_interrupt_enable,
1329c067b84SDoug Ambrisko     unsigned int error_interrupt_offset);
1339c067b84SDoug Ambrisko void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index,
1349c067b84SDoug Ambrisko     unsigned int error_interrupt_enable,
1359c067b84SDoug Ambrisko     unsigned int error_interrupt_offset);
1369c067b84SDoug Ambrisko void vnic_rq_error_out(struct vnic_rq *rq, unsigned int error);
1379c067b84SDoug Ambrisko unsigned int vnic_rq_error_status(struct vnic_rq *rq);
1389c067b84SDoug Ambrisko void vnic_rq_enable(struct vnic_rq *rq);
1399c067b84SDoug Ambrisko int vnic_rq_disable(struct vnic_rq *rq);
1409c067b84SDoug Ambrisko void vnic_rq_clean(struct vnic_rq *rq);
1419c067b84SDoug Ambrisko 
1429c067b84SDoug Ambrisko #endif /* _VNIC_RQ_H_ */
143