xref: /freebsd/sys/dev/enic/vnic_rq.h (revision 0acab8b3d1336d4db73a9946ef76b4bcd0b0aabe)
1*9c067b84SDoug Ambrisko /* SPDX-License-Identifier: BSD-3-Clause
2*9c067b84SDoug Ambrisko  * Copyright 2008-2017 Cisco Systems, Inc.  All rights reserved.
3*9c067b84SDoug Ambrisko  * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
4*9c067b84SDoug Ambrisko  */
5*9c067b84SDoug Ambrisko 
6*9c067b84SDoug Ambrisko #ifndef _VNIC_RQ_H_
7*9c067b84SDoug Ambrisko #define _VNIC_RQ_H_
8*9c067b84SDoug Ambrisko 
9*9c067b84SDoug Ambrisko #include "vnic_dev.h"
10*9c067b84SDoug Ambrisko #include "vnic_cq.h"
11*9c067b84SDoug Ambrisko 
12*9c067b84SDoug Ambrisko /* Receive queue control */
13*9c067b84SDoug Ambrisko struct vnic_rq_ctrl {
14*9c067b84SDoug Ambrisko 	u64 ring_base;			/* 0x00 */
15*9c067b84SDoug Ambrisko #define RX_RING_BASE			   0x00
16*9c067b84SDoug Ambrisko 	u32 ring_size;			/* 0x08 */
17*9c067b84SDoug Ambrisko #define RX_RING_SIZE			   0x08
18*9c067b84SDoug Ambrisko 	u32 pad0;
19*9c067b84SDoug Ambrisko 	u32 posted_index;		/* 0x10 */
20*9c067b84SDoug Ambrisko #define RX_POSTED_INDEX			   0x10
21*9c067b84SDoug Ambrisko 	u32 pad1;
22*9c067b84SDoug Ambrisko 	u32 cq_index;			/* 0x18 */
23*9c067b84SDoug Ambrisko #define RX_CQ_INDEX			   0x18
24*9c067b84SDoug Ambrisko 	u32 pad2;
25*9c067b84SDoug Ambrisko 	u32 enable;			/* 0x20 */
26*9c067b84SDoug Ambrisko #define RX_ENABLE			   0x20
27*9c067b84SDoug Ambrisko 	u32 pad3;
28*9c067b84SDoug Ambrisko 	u32 running;			/* 0x28 */
29*9c067b84SDoug Ambrisko #define RX_RUNNING			   0x28
30*9c067b84SDoug Ambrisko 	u32 pad4;
31*9c067b84SDoug Ambrisko 	u32 fetch_index;		/* 0x30 */
32*9c067b84SDoug Ambrisko #define RX_FETCH_INDEX			   0x30
33*9c067b84SDoug Ambrisko 	u32 pad5;
34*9c067b84SDoug Ambrisko 	u32 error_interrupt_enable;	/* 0x38 */
35*9c067b84SDoug Ambrisko #define RX_ERROR_INTR_ENABLE		   0x38
36*9c067b84SDoug Ambrisko 	u32 pad6;
37*9c067b84SDoug Ambrisko 	u32 error_interrupt_offset;	/* 0x40 */
38*9c067b84SDoug Ambrisko #define RX_ERROR_INTR_OFFSET		   0x40
39*9c067b84SDoug Ambrisko 	u32 pad7;
40*9c067b84SDoug Ambrisko 	u32 error_status;		/* 0x48 */
41*9c067b84SDoug Ambrisko #define RX_ERROR_STATUS			   0x48
42*9c067b84SDoug Ambrisko 	u32 pad8;
43*9c067b84SDoug Ambrisko 	u32 tcp_sn;			/* 0x50 */
44*9c067b84SDoug Ambrisko #define RX_TCP_SN			   0x50
45*9c067b84SDoug Ambrisko 	u32 pad9;
46*9c067b84SDoug Ambrisko 	u32 unused;			/* 0x58 */
47*9c067b84SDoug Ambrisko 	u32 pad10;
48*9c067b84SDoug Ambrisko 	u32 dca_select;			/* 0x60 */
49*9c067b84SDoug Ambrisko #define RX_DCA_SELECT			   0x60
50*9c067b84SDoug Ambrisko 	u32 pad11;
51*9c067b84SDoug Ambrisko 	u32 dca_value;			/* 0x68 */
52*9c067b84SDoug Ambrisko #define RX_DCA_VALUE			   0x68
53*9c067b84SDoug Ambrisko 	u32 pad12;
54*9c067b84SDoug Ambrisko 	u32 data_ring;			/* 0x70 */
55*9c067b84SDoug Ambrisko };
56*9c067b84SDoug Ambrisko 
57*9c067b84SDoug Ambrisko struct vnic_rq {
58*9c067b84SDoug Ambrisko 	unsigned int index;
59*9c067b84SDoug Ambrisko 	unsigned int posted_index;
60*9c067b84SDoug Ambrisko 	struct vnic_dev *vdev;
61*9c067b84SDoug Ambrisko 	struct vnic_res *ctrl;
62*9c067b84SDoug Ambrisko 	struct vnic_dev_ring ring;
63*9c067b84SDoug Ambrisko 	int num_free_mbufs;
64*9c067b84SDoug Ambrisko 	struct rte_mbuf **mbuf_ring;		/* array of allocated mbufs */
65*9c067b84SDoug Ambrisko 	unsigned int mbuf_next_idx;		/* next mb to consume */
66*9c067b84SDoug Ambrisko 	void *os_buf_head;
67*9c067b84SDoug Ambrisko 	unsigned int pkts_outstanding;
68*9c067b84SDoug Ambrisko 	uint16_t rx_nb_hold;
69*9c067b84SDoug Ambrisko 	uint16_t rx_free_thresh;
70*9c067b84SDoug Ambrisko 	unsigned int socket_id;
71*9c067b84SDoug Ambrisko 	struct rte_mempool *mp;
72*9c067b84SDoug Ambrisko 	uint16_t rxst_idx;
73*9c067b84SDoug Ambrisko 	uint32_t tot_pkts;
74*9c067b84SDoug Ambrisko 	uint8_t in_use;
75*9c067b84SDoug Ambrisko 	unsigned int max_mbufs_per_pkt;
76*9c067b84SDoug Ambrisko 	uint16_t tot_nb_desc;
77*9c067b84SDoug Ambrisko 	bool need_initial_post;
78*9c067b84SDoug Ambrisko 	struct iflib_dma_info data;
79*9c067b84SDoug Ambrisko };
80*9c067b84SDoug Ambrisko 
vnic_rq_desc_avail(struct vnic_rq * rq)81*9c067b84SDoug Ambrisko static inline unsigned int vnic_rq_desc_avail(struct vnic_rq *rq)
82*9c067b84SDoug Ambrisko {
83*9c067b84SDoug Ambrisko 	/* how many does SW own? */
84*9c067b84SDoug Ambrisko 	return rq->ring.desc_avail;
85*9c067b84SDoug Ambrisko }
86*9c067b84SDoug Ambrisko 
vnic_rq_desc_used(struct vnic_rq * rq)87*9c067b84SDoug Ambrisko static inline unsigned int vnic_rq_desc_used(struct vnic_rq *rq)
88*9c067b84SDoug Ambrisko {
89*9c067b84SDoug Ambrisko 	/* how many does HW own? */
90*9c067b84SDoug Ambrisko 	return rq->ring.desc_count - rq->ring.desc_avail - 1;
91*9c067b84SDoug Ambrisko }
92*9c067b84SDoug Ambrisko 
93*9c067b84SDoug Ambrisko enum desc_return_options {
94*9c067b84SDoug Ambrisko 	VNIC_RQ_RETURN_DESC,
95*9c067b84SDoug Ambrisko 	VNIC_RQ_DEFER_RETURN_DESC,
96*9c067b84SDoug Ambrisko };
97*9c067b84SDoug Ambrisko 
vnic_rq_fill(struct vnic_rq * rq,int (* buf_fill)(struct vnic_rq * rq))98*9c067b84SDoug Ambrisko static inline int vnic_rq_fill(struct vnic_rq *rq,
99*9c067b84SDoug Ambrisko 	int (*buf_fill)(struct vnic_rq *rq))
100*9c067b84SDoug Ambrisko {
101*9c067b84SDoug Ambrisko 	int err;
102*9c067b84SDoug Ambrisko 
103*9c067b84SDoug Ambrisko 	while (vnic_rq_desc_avail(rq) > 0) {
104*9c067b84SDoug Ambrisko 
105*9c067b84SDoug Ambrisko 		err = (*buf_fill)(rq);
106*9c067b84SDoug Ambrisko 		if (err)
107*9c067b84SDoug Ambrisko 			return err;
108*9c067b84SDoug Ambrisko 	}
109*9c067b84SDoug Ambrisko 
110*9c067b84SDoug Ambrisko 	return 0;
111*9c067b84SDoug Ambrisko }
112*9c067b84SDoug Ambrisko 
vnic_rq_fill_count(struct vnic_rq * rq,int (* buf_fill)(struct vnic_rq * rq),unsigned int count)113*9c067b84SDoug Ambrisko static inline int vnic_rq_fill_count(struct vnic_rq *rq,
114*9c067b84SDoug Ambrisko 	int (*buf_fill)(struct vnic_rq *rq), unsigned int count)
115*9c067b84SDoug Ambrisko {
116*9c067b84SDoug Ambrisko 	int err;
117*9c067b84SDoug Ambrisko 
118*9c067b84SDoug Ambrisko 	while ((vnic_rq_desc_avail(rq) > 0) && (count--)) {
119*9c067b84SDoug Ambrisko 
120*9c067b84SDoug Ambrisko 		err = (*buf_fill)(rq);
121*9c067b84SDoug Ambrisko 		if (err)
122*9c067b84SDoug Ambrisko 			return err;
123*9c067b84SDoug Ambrisko 	}
124*9c067b84SDoug Ambrisko 
125*9c067b84SDoug Ambrisko 	return 0;
126*9c067b84SDoug Ambrisko }
127*9c067b84SDoug Ambrisko 
128*9c067b84SDoug Ambrisko void vnic_rq_free(struct vnic_rq *rq);
129*9c067b84SDoug Ambrisko void vnic_rq_init_start(struct vnic_rq *rq, unsigned int cq_index,
130*9c067b84SDoug Ambrisko     unsigned int fetch_index, unsigned int posted_index,
131*9c067b84SDoug Ambrisko     unsigned int error_interrupt_enable,
132*9c067b84SDoug Ambrisko     unsigned int error_interrupt_offset);
133*9c067b84SDoug Ambrisko void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index,
134*9c067b84SDoug Ambrisko     unsigned int error_interrupt_enable,
135*9c067b84SDoug Ambrisko     unsigned int error_interrupt_offset);
136*9c067b84SDoug Ambrisko unsigned int vnic_rq_error_status(struct vnic_rq *rq);
137*9c067b84SDoug Ambrisko void vnic_rq_enable(struct vnic_rq *rq);
138*9c067b84SDoug Ambrisko int vnic_rq_disable(struct vnic_rq *rq);
139*9c067b84SDoug Ambrisko void vnic_rq_clean(struct vnic_rq *rq);
140*9c067b84SDoug Ambrisko 
141*9c067b84SDoug Ambrisko #endif /* _VNIC_RQ_H_ */
142