xref: /freebsd/sys/dev/vnic/nicvf_queues.h (revision 2306b72a)
13c0086b8SZbigniew Bodek /*
23c0086b8SZbigniew Bodek  * Copyright (C) 2015 Cavium Inc.
33c0086b8SZbigniew Bodek  * All rights reserved.
43c0086b8SZbigniew Bodek  *
53c0086b8SZbigniew Bodek  * Redistribution and use in source and binary forms, with or without
63c0086b8SZbigniew Bodek  * modification, are permitted provided that the following conditions
73c0086b8SZbigniew Bodek  * are met:
83c0086b8SZbigniew Bodek  * 1. Redistributions of source code must retain the above copyright
93c0086b8SZbigniew Bodek  *    notice, this list of conditions and the following disclaimer.
103c0086b8SZbigniew Bodek  * 2. Redistributions in binary form must reproduce the above copyright
113c0086b8SZbigniew Bodek  *    notice, this list of conditions and the following disclaimer in the
123c0086b8SZbigniew Bodek  *    documentation and/or other materials provided with the distribution.
133c0086b8SZbigniew Bodek  *
143c0086b8SZbigniew Bodek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
153c0086b8SZbigniew Bodek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
163c0086b8SZbigniew Bodek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
173c0086b8SZbigniew Bodek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
183c0086b8SZbigniew Bodek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
193c0086b8SZbigniew Bodek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
203c0086b8SZbigniew Bodek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
213c0086b8SZbigniew Bodek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
223c0086b8SZbigniew Bodek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
233c0086b8SZbigniew Bodek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
243c0086b8SZbigniew Bodek  * SUCH DAMAGE.
253c0086b8SZbigniew Bodek  *
263c0086b8SZbigniew Bodek  * $FreeBSD$
273c0086b8SZbigniew Bodek  *
283c0086b8SZbigniew Bodek  */
293c0086b8SZbigniew Bodek 
303c0086b8SZbigniew Bodek #ifndef NICVF_QUEUES_H
313c0086b8SZbigniew Bodek #define	NICVF_QUEUES_H
323c0086b8SZbigniew Bodek 
333c0086b8SZbigniew Bodek #include "q_struct.h"
343c0086b8SZbigniew Bodek 
353c0086b8SZbigniew Bodek #define	MAX_QUEUE_SET			128
363c0086b8SZbigniew Bodek #define	MAX_RCV_QUEUES_PER_QS		8
373c0086b8SZbigniew Bodek #define	MAX_RCV_BUF_DESC_RINGS_PER_QS	2
383c0086b8SZbigniew Bodek #define	MAX_SND_QUEUES_PER_QS		8
393c0086b8SZbigniew Bodek #define	MAX_CMP_QUEUES_PER_QS		8
403c0086b8SZbigniew Bodek 
413c0086b8SZbigniew Bodek /* VF's queue interrupt ranges */
423c0086b8SZbigniew Bodek #define	NICVF_INTR_ID_CQ		0
433c0086b8SZbigniew Bodek #define	NICVF_INTR_ID_SQ		8
443c0086b8SZbigniew Bodek #define	NICVF_INTR_ID_RBDR		16
453c0086b8SZbigniew Bodek #define	NICVF_INTR_ID_MISC		18
463c0086b8SZbigniew Bodek #define	NICVF_INTR_ID_QS_ERR		19
473c0086b8SZbigniew Bodek 
483c0086b8SZbigniew Bodek #define	for_each_cq_irq(irq)	\
492306b72aSZbigniew Bodek 	for ((irq) = NICVF_INTR_ID_CQ; (irq) < NICVF_INTR_ID_SQ; (irq)++)
503c0086b8SZbigniew Bodek #define	for_each_sq_irq(irq)	\
512306b72aSZbigniew Bodek 	for ((irq) = NICVF_INTR_ID_SQ; (irq) < NICVF_INTR_ID_RBDR; (irq)++)
523c0086b8SZbigniew Bodek #define	for_each_rbdr_irq(irq)	\
532306b72aSZbigniew Bodek 	for ((irq) = NICVF_INTR_ID_RBDR; (irq) < NICVF_INTR_ID_MISC; (irq)++)
543c0086b8SZbigniew Bodek 
552306b72aSZbigniew Bodek #define	RBDR_SIZE0		0UL /* 8K entries */
562306b72aSZbigniew Bodek #define	RBDR_SIZE1		1UL /* 16K entries */
572306b72aSZbigniew Bodek #define	RBDR_SIZE2		2UL /* 32K entries */
582306b72aSZbigniew Bodek #define	RBDR_SIZE3		3UL /* 64K entries */
592306b72aSZbigniew Bodek #define	RBDR_SIZE4		4UL /* 126K entries */
602306b72aSZbigniew Bodek #define	RBDR_SIZE5		5UL /* 256K entries */
612306b72aSZbigniew Bodek #define	RBDR_SIZE6		6UL /* 512K entries */
623c0086b8SZbigniew Bodek 
632306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE0		0UL /* 1K entries */
642306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE1		1UL /* 2K entries */
652306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE2		2UL /* 4K entries */
662306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE3		3UL /* 8K entries */
672306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE4		4UL /* 16K entries */
682306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE5		5UL /* 32K entries */
692306b72aSZbigniew Bodek #define	SND_QUEUE_SIZE6		6UL /* 64K entries */
703c0086b8SZbigniew Bodek 
712306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE0		0UL /* 1K entries */
722306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE1		1UL /* 2K entries */
732306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE2		2UL /* 4K entries */
742306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE3		3UL /* 8K entries */
752306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE4		4UL /* 16K entries */
762306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE5		5UL /* 32K entries */
772306b72aSZbigniew Bodek #define	CMP_QUEUE_SIZE6		6UL /* 64K entries */
783c0086b8SZbigniew Bodek 
793c0086b8SZbigniew Bodek /* Default queue count per QS, its lengths and threshold values */
803c0086b8SZbigniew Bodek #define	RBDR_CNT		1
813c0086b8SZbigniew Bodek #define	RCV_QUEUE_CNT		8
823c0086b8SZbigniew Bodek #define	SND_QUEUE_CNT		8
833c0086b8SZbigniew Bodek #define	CMP_QUEUE_CNT		8 /* Max of RCV and SND qcount */
843c0086b8SZbigniew Bodek 
853c0086b8SZbigniew Bodek #define	SND_QSIZE		SND_QUEUE_SIZE2
862306b72aSZbigniew Bodek #define	SND_QUEUE_LEN		(1UL << (SND_QSIZE + 10))
872306b72aSZbigniew Bodek #define	MAX_SND_QUEUE_LEN	(1UL << (SND_QUEUE_SIZE6 + 10))
882306b72aSZbigniew Bodek #define	SND_QUEUE_THRESH	2UL
893c0086b8SZbigniew Bodek #define	MIN_SQ_DESC_PER_PKT_XMIT	2
903c0086b8SZbigniew Bodek /* Since timestamp not enabled, otherwise 2 */
913c0086b8SZbigniew Bodek #define	MAX_CQE_PER_PKT_XMIT		1
923c0086b8SZbigniew Bodek 
932306b72aSZbigniew Bodek /*
942306b72aSZbigniew Bodek  * Keep CQ and SQ sizes same, if timestamping
953c0086b8SZbigniew Bodek  * is enabled this equation will change.
963c0086b8SZbigniew Bodek  */
973c0086b8SZbigniew Bodek #define	CMP_QSIZE		CMP_QUEUE_SIZE2
982306b72aSZbigniew Bodek #define	CMP_QUEUE_LEN		(1UL << (CMP_QSIZE + 10))
993c0086b8SZbigniew Bodek #define	CMP_QUEUE_CQE_THRESH	0
1003c0086b8SZbigniew Bodek #define	CMP_QUEUE_TIMER_THRESH	220 /* 10usec */
1013c0086b8SZbigniew Bodek 
1023c0086b8SZbigniew Bodek #define	RBDR_SIZE		RBDR_SIZE0
1032306b72aSZbigniew Bodek #define	RCV_BUF_COUNT		(1UL << (RBDR_SIZE + 13))
1042306b72aSZbigniew Bodek #define	MAX_RCV_BUF_COUNT	(1UL << (RBDR_SIZE6 + 13))
1053c0086b8SZbigniew Bodek #define	RBDR_THRESH		(RCV_BUF_COUNT / 2)
1063c0086b8SZbigniew Bodek #define	DMA_BUFFER_LEN		2048 /* In multiples of 128bytes */
1073c0086b8SZbigniew Bodek 
1082306b72aSZbigniew Bodek #define	MAX_CQES_FOR_TX		\
1092306b72aSZbigniew Bodek     ((SND_QUEUE_LEN / MIN_SQ_DESC_PER_PKT_XMIT) * MAX_CQE_PER_PKT_XMIT)
1103c0086b8SZbigniew Bodek /* Calculate number of CQEs to reserve for all SQEs.
1113c0086b8SZbigniew Bodek  * Its 1/256th level of CQ size.
1123c0086b8SZbigniew Bodek  * '+ 1' to account for pipelining
1133c0086b8SZbigniew Bodek  */
1142306b72aSZbigniew Bodek #define	RQ_CQ_DROP		\
1152306b72aSZbigniew Bodek     ((256 / (CMP_QUEUE_LEN / (CMP_QUEUE_LEN - MAX_CQES_FOR_TX))) + 1)
1163c0086b8SZbigniew Bodek 
1173c0086b8SZbigniew Bodek /* Descriptor size in bytes */
1183c0086b8SZbigniew Bodek #define	SND_QUEUE_DESC_SIZE	16
1193c0086b8SZbigniew Bodek #define	CMP_QUEUE_DESC_SIZE	512
1203c0086b8SZbigniew Bodek 
1213c0086b8SZbigniew Bodek /* Buffer / descriptor alignments */
1223c0086b8SZbigniew Bodek #define	NICVF_RCV_BUF_ALIGN		7
1232306b72aSZbigniew Bodek #define	NICVF_RCV_BUF_ALIGN_BYTES	(1UL << NICVF_RCV_BUF_ALIGN)
1243c0086b8SZbigniew Bodek #define	NICVF_CQ_BASE_ALIGN_BYTES	512  /* 9 bits */
1253c0086b8SZbigniew Bodek #define	NICVF_SQ_BASE_ALIGN_BYTES	128  /* 7 bits */
1263c0086b8SZbigniew Bodek 
1272306b72aSZbigniew Bodek #define	NICVF_ALIGNED_ADDR(addr, align_bytes)	\
1282306b72aSZbigniew Bodek     roundup2((addr), (align_bytes))
1292306b72aSZbigniew Bodek #define	NICVF_ADDR_ALIGN_LEN(addr, bytes)	\
1302306b72aSZbigniew Bodek     (NICVF_ALIGNED_ADDR((addr), (bytes)) - (bytes))
1312306b72aSZbigniew Bodek #define	NICVF_RCV_BUF_ALIGN_LEN(addr)		\
1322306b72aSZbigniew Bodek     (NICVF_ALIGNED_ADDR((addr), NICVF_RCV_BUF_ALIGN_BYTES) - (addr))
1332306b72aSZbigniew Bodek 
1342306b72aSZbigniew Bodek #define	NICVF_TXBUF_MAXSIZE	9212	/* Total max payload without TSO */
1352306b72aSZbigniew Bodek #define	NICVF_TXBUF_NSEGS	256	/* Single command is at most 256 buffers
1362306b72aSZbigniew Bodek 					   (hdr + 255 subcmds) */
1372306b72aSZbigniew Bodek 
1383c0086b8SZbigniew Bodek 
1393c0086b8SZbigniew Bodek /* Queue enable/disable */
1402306b72aSZbigniew Bodek #define	NICVF_SQ_EN		(1UL << 19)
1413c0086b8SZbigniew Bodek 
1423c0086b8SZbigniew Bodek /* Queue reset */
1432306b72aSZbigniew Bodek #define	NICVF_CQ_RESET		(1UL << 41)
1442306b72aSZbigniew Bodek #define	NICVF_SQ_RESET		(1UL << 17)
1452306b72aSZbigniew Bodek #define	NICVF_RBDR_RESET	(1UL << 43)
1463c0086b8SZbigniew Bodek 
1473c0086b8SZbigniew Bodek enum CQ_RX_ERRLVL_E {
1483c0086b8SZbigniew Bodek 	CQ_ERRLVL_MAC,
1493c0086b8SZbigniew Bodek 	CQ_ERRLVL_L2,
1503c0086b8SZbigniew Bodek 	CQ_ERRLVL_L3,
1513c0086b8SZbigniew Bodek 	CQ_ERRLVL_L4,
1523c0086b8SZbigniew Bodek };
1533c0086b8SZbigniew Bodek 
1543c0086b8SZbigniew Bodek enum CQ_RX_ERROP_E {
1553c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_NONE = 0x0,
1563c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_PARTIAL = 0x1,
1573c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_JABBER = 0x2,
1583c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_FCS = 0x7,
1593c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_TERMINATE = 0x9,
1603c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RE_RX_CTL = 0xb,
1613c0086b8SZbigniew Bodek 	CQ_RX_ERROP_PREL2_ERR = 0x1f,
1623c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_FRAGMENT = 0x20,
1633c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_OVERRUN = 0x21,
1643c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_PFCS = 0x22,
1653c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_PUNY = 0x23,
1663c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_MAL = 0x24,
1673c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_OVERSIZE = 0x25,
1683c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_UNDERSIZE = 0x26,
1693c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_LENMISM = 0x27,
1703c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L2_PCLP = 0x28,
1713c0086b8SZbigniew Bodek 	CQ_RX_ERROP_IP_NOT = 0x41,
1723c0086b8SZbigniew Bodek 	CQ_RX_ERROP_IP_CSUM_ERR = 0x42,
1733c0086b8SZbigniew Bodek 	CQ_RX_ERROP_IP_MAL = 0x43,
1743c0086b8SZbigniew Bodek 	CQ_RX_ERROP_IP_MALD = 0x44,
1753c0086b8SZbigniew Bodek 	CQ_RX_ERROP_IP_HOP = 0x45,
1763c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L3_ICRC = 0x46,
1773c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L3_PCLP = 0x47,
1783c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L4_MAL = 0x61,
1793c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L4_CHK = 0x62,
1803c0086b8SZbigniew Bodek 	CQ_RX_ERROP_UDP_LEN = 0x63,
1813c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L4_PORT = 0x64,
1823c0086b8SZbigniew Bodek 	CQ_RX_ERROP_TCP_FLAG = 0x65,
1833c0086b8SZbigniew Bodek 	CQ_RX_ERROP_TCP_OFFSET = 0x66,
1843c0086b8SZbigniew Bodek 	CQ_RX_ERROP_L4_PCLP = 0x67,
1853c0086b8SZbigniew Bodek 	CQ_RX_ERROP_RBDR_TRUNC = 0x70,
1863c0086b8SZbigniew Bodek };
1873c0086b8SZbigniew Bodek 
1883c0086b8SZbigniew Bodek enum CQ_TX_ERROP_E {
1893c0086b8SZbigniew Bodek 	CQ_TX_ERROP_GOOD = 0x0,
1903c0086b8SZbigniew Bodek 	CQ_TX_ERROP_DESC_FAULT = 0x10,
1913c0086b8SZbigniew Bodek 	CQ_TX_ERROP_HDR_CONS_ERR = 0x11,
1923c0086b8SZbigniew Bodek 	CQ_TX_ERROP_SUBDC_ERR = 0x12,
1933c0086b8SZbigniew Bodek 	CQ_TX_ERROP_IMM_SIZE_OFLOW = 0x80,
1943c0086b8SZbigniew Bodek 	CQ_TX_ERROP_DATA_SEQUENCE_ERR = 0x81,
1953c0086b8SZbigniew Bodek 	CQ_TX_ERROP_MEM_SEQUENCE_ERR = 0x82,
1963c0086b8SZbigniew Bodek 	CQ_TX_ERROP_LOCK_VIOL = 0x83,
1973c0086b8SZbigniew Bodek 	CQ_TX_ERROP_DATA_FAULT = 0x84,
1983c0086b8SZbigniew Bodek 	CQ_TX_ERROP_TSTMP_CONFLICT = 0x85,
1993c0086b8SZbigniew Bodek 	CQ_TX_ERROP_TSTMP_TIMEOUT = 0x86,
2003c0086b8SZbigniew Bodek 	CQ_TX_ERROP_MEM_FAULT = 0x87,
2013c0086b8SZbigniew Bodek 	CQ_TX_ERROP_CK_OVERLAP = 0x88,
2023c0086b8SZbigniew Bodek 	CQ_TX_ERROP_CK_OFLOW = 0x89,
2033c0086b8SZbigniew Bodek 	CQ_TX_ERROP_ENUM_LAST = 0x8a,
2043c0086b8SZbigniew Bodek };
2053c0086b8SZbigniew Bodek 
2063c0086b8SZbigniew Bodek struct cmp_queue_stats {
2073c0086b8SZbigniew Bodek 	struct tx_stats {
2082306b72aSZbigniew Bodek 		uint64_t good;
2092306b72aSZbigniew Bodek 		uint64_t desc_fault;
2102306b72aSZbigniew Bodek 		uint64_t hdr_cons_err;
2112306b72aSZbigniew Bodek 		uint64_t subdesc_err;
2122306b72aSZbigniew Bodek 		uint64_t imm_size_oflow;
2132306b72aSZbigniew Bodek 		uint64_t data_seq_err;
2142306b72aSZbigniew Bodek 		uint64_t mem_seq_err;
2152306b72aSZbigniew Bodek 		uint64_t lock_viol;
2162306b72aSZbigniew Bodek 		uint64_t data_fault;
2172306b72aSZbigniew Bodek 		uint64_t tstmp_conflict;
2182306b72aSZbigniew Bodek 		uint64_t tstmp_timeout;
2192306b72aSZbigniew Bodek 		uint64_t mem_fault;
2202306b72aSZbigniew Bodek 		uint64_t csum_overlap;
2212306b72aSZbigniew Bodek 		uint64_t csum_overflow;
2223c0086b8SZbigniew Bodek 	} tx;
2232306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
2243c0086b8SZbigniew Bodek 
2253c0086b8SZbigniew Bodek enum RQ_SQ_STATS {
2263c0086b8SZbigniew Bodek 	RQ_SQ_STATS_OCTS,
2273c0086b8SZbigniew Bodek 	RQ_SQ_STATS_PKTS,
2283c0086b8SZbigniew Bodek };
2293c0086b8SZbigniew Bodek 
2303c0086b8SZbigniew Bodek struct rx_tx_queue_stats {
2312306b72aSZbigniew Bodek 	uint64_t	bytes;
2322306b72aSZbigniew Bodek 	uint64_t	pkts;
2332306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
2343c0086b8SZbigniew Bodek 
2353c0086b8SZbigniew Bodek struct q_desc_mem {
2362306b72aSZbigniew Bodek 	bus_dma_tag_t	dmat;
2372306b72aSZbigniew Bodek 	bus_dmamap_t	dmap;
2383c0086b8SZbigniew Bodek 	void		*base;
2392306b72aSZbigniew Bodek 	bus_addr_t	phys_base;
2402306b72aSZbigniew Bodek 	uint64_t	size;
2412306b72aSZbigniew Bodek 	uint16_t	q_len;
2423c0086b8SZbigniew Bodek };
2433c0086b8SZbigniew Bodek 
2443c0086b8SZbigniew Bodek struct rbdr {
2452306b72aSZbigniew Bodek 	boolean_t		enable;
2462306b72aSZbigniew Bodek 	uint32_t		dma_size;
2472306b72aSZbigniew Bodek 	uint32_t		frag_len;
2482306b72aSZbigniew Bodek 	uint32_t		thresh;		/* Threshold level for interrupt */
2493c0086b8SZbigniew Bodek 	void			*desc;
2502306b72aSZbigniew Bodek 	uint32_t		head;
2512306b72aSZbigniew Bodek 	uint32_t		tail;
2523c0086b8SZbigniew Bodek 	struct q_desc_mem	dmem;
2532306b72aSZbigniew Bodek 
2542306b72aSZbigniew Bodek 	struct nicvf		*nic;
2552306b72aSZbigniew Bodek 	int			idx;
2562306b72aSZbigniew Bodek 
2572306b72aSZbigniew Bodek 	struct task		rbdr_task;
2582306b72aSZbigniew Bodek 	struct task		rbdr_task_nowait;
2592306b72aSZbigniew Bodek 	struct taskqueue	*rbdr_taskq;
2602306b72aSZbigniew Bodek 
2612306b72aSZbigniew Bodek 	bus_dma_tag_t		rbdr_buff_dmat;
2622306b72aSZbigniew Bodek 	bus_dmamap_t		*rbdr_buff_dmaps;
2632306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
2643c0086b8SZbigniew Bodek 
2653c0086b8SZbigniew Bodek struct rcv_queue {
2662306b72aSZbigniew Bodek 	boolean_t	enable;
2673c0086b8SZbigniew Bodek 	struct	rbdr	*rbdr_start;
2683c0086b8SZbigniew Bodek 	struct	rbdr	*rbdr_cont;
2692306b72aSZbigniew Bodek 	boolean_t	en_tcp_reassembly;
2702306b72aSZbigniew Bodek 	uint8_t		cq_qs;  /* CQ's QS to which this RQ is assigned */
2712306b72aSZbigniew Bodek 	uint8_t		cq_idx; /* CQ index (0 to 7) in the QS */
2722306b72aSZbigniew Bodek 	uint8_t		cont_rbdr_qs;      /* Continue buffer ptrs - QS num */
2732306b72aSZbigniew Bodek 	uint8_t		cont_qs_rbdr_idx;  /* RBDR idx in the cont QS */
2742306b72aSZbigniew Bodek 	uint8_t		start_rbdr_qs;     /* First buffer ptrs - QS num */
2752306b72aSZbigniew Bodek 	uint8_t		start_qs_rbdr_idx; /* RBDR idx in the above QS */
2762306b72aSZbigniew Bodek 	uint8_t		caching;
2773c0086b8SZbigniew Bodek 	struct		rx_tx_queue_stats stats;
2782306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
2793c0086b8SZbigniew Bodek 
2803c0086b8SZbigniew Bodek struct cmp_queue {
2812306b72aSZbigniew Bodek 	boolean_t		enable;
2822306b72aSZbigniew Bodek 	uint16_t		thresh;
2832306b72aSZbigniew Bodek 
2842306b72aSZbigniew Bodek 	struct nicvf		*nic;
2852306b72aSZbigniew Bodek 	int			idx;	/* This queue index */
2862306b72aSZbigniew Bodek 
2872306b72aSZbigniew Bodek 	struct buf_ring		*rx_br;	/* Reception buf ring */
2882306b72aSZbigniew Bodek 	struct mtx		mtx;	/* lock to serialize processing CQEs */
2892306b72aSZbigniew Bodek 	char			mtx_name[32];
2902306b72aSZbigniew Bodek 
2912306b72aSZbigniew Bodek 	struct task		cmp_task;
2922306b72aSZbigniew Bodek 	struct taskqueue	*cmp_taskq;
2932306b72aSZbigniew Bodek 
2943c0086b8SZbigniew Bodek 	void			*desc;
2953c0086b8SZbigniew Bodek 	struct q_desc_mem	dmem;
2963c0086b8SZbigniew Bodek 	struct cmp_queue_stats	stats;
2973c0086b8SZbigniew Bodek 	int			irq;
2982306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
2992306b72aSZbigniew Bodek 
3002306b72aSZbigniew Bodek struct snd_buff {
3012306b72aSZbigniew Bodek 	bus_dmamap_t	dmap;
3022306b72aSZbigniew Bodek 	struct mbuf	*mbuf;
3032306b72aSZbigniew Bodek };
3043c0086b8SZbigniew Bodek 
3053c0086b8SZbigniew Bodek struct snd_queue {
3062306b72aSZbigniew Bodek 	boolean_t		enable;
3072306b72aSZbigniew Bodek 	uint8_t			cq_qs;  /* CQ's QS to which this SQ is pointing */
3082306b72aSZbigniew Bodek 	uint8_t			cq_idx; /* CQ index (0 to 7) in the above QS */
3092306b72aSZbigniew Bodek 	uint16_t		thresh;
3102306b72aSZbigniew Bodek 	volatile int		free_cnt;
3112306b72aSZbigniew Bodek 	uint32_t		head;
3122306b72aSZbigniew Bodek 	uint32_t		tail;
3132306b72aSZbigniew Bodek 	uint64_t		*skbuff;
3143c0086b8SZbigniew Bodek 	void			*desc;
3153c0086b8SZbigniew Bodek 
3162306b72aSZbigniew Bodek 	struct nicvf		*nic;
3172306b72aSZbigniew Bodek 	int			idx;	/* This queue index */
3182306b72aSZbigniew Bodek 
3192306b72aSZbigniew Bodek 	bus_dma_tag_t		snd_buff_dmat;
3202306b72aSZbigniew Bodek 	struct snd_buff		*snd_buff;
3212306b72aSZbigniew Bodek 
3222306b72aSZbigniew Bodek 	struct buf_ring		*br;	/* Transmission buf ring */
3232306b72aSZbigniew Bodek 	struct mtx		mtx;
3242306b72aSZbigniew Bodek 	char			mtx_name[32];
3252306b72aSZbigniew Bodek 
3262306b72aSZbigniew Bodek 	struct task		snd_task;
3272306b72aSZbigniew Bodek 	struct taskqueue	*snd_taskq;
3282306b72aSZbigniew Bodek 
3293c0086b8SZbigniew Bodek 	struct q_desc_mem	dmem;
3303c0086b8SZbigniew Bodek 	struct rx_tx_queue_stats stats;
3312306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
3323c0086b8SZbigniew Bodek 
3333c0086b8SZbigniew Bodek struct queue_set {
3342306b72aSZbigniew Bodek 	boolean_t	enable;
3352306b72aSZbigniew Bodek 	boolean_t	be_en;
3362306b72aSZbigniew Bodek 	uint8_t		vnic_id;
3372306b72aSZbigniew Bodek 	uint8_t		rq_cnt;
3382306b72aSZbigniew Bodek 	uint8_t		cq_cnt;
3392306b72aSZbigniew Bodek 	uint64_t	cq_len;
3402306b72aSZbigniew Bodek 	uint8_t		sq_cnt;
3412306b72aSZbigniew Bodek 	uint64_t	sq_len;
3422306b72aSZbigniew Bodek 	uint8_t		rbdr_cnt;
3432306b72aSZbigniew Bodek 	uint64_t	rbdr_len;
3443c0086b8SZbigniew Bodek 	struct	rcv_queue	rq[MAX_RCV_QUEUES_PER_QS];
3453c0086b8SZbigniew Bodek 	struct	cmp_queue	cq[MAX_CMP_QUEUES_PER_QS];
3463c0086b8SZbigniew Bodek 	struct	snd_queue	sq[MAX_SND_QUEUES_PER_QS];
3473c0086b8SZbigniew Bodek 	struct	rbdr		rbdr[MAX_RCV_BUF_DESC_RINGS_PER_QS];
3482306b72aSZbigniew Bodek 
3492306b72aSZbigniew Bodek 	struct task		qs_err_task;
3502306b72aSZbigniew Bodek 	struct taskqueue	*qs_err_taskq;
3512306b72aSZbigniew Bodek } __aligned(CACHE_LINE_SIZE);
3523c0086b8SZbigniew Bodek 
3533c0086b8SZbigniew Bodek #define	GET_RBDR_DESC(RING, idx)				\
3542306b72aSZbigniew Bodek     (&(((struct rbdr_entry_t *)((RING)->desc))[(idx)]))
3553c0086b8SZbigniew Bodek #define	GET_SQ_DESC(RING, idx)					\
3562306b72aSZbigniew Bodek     (&(((struct sq_hdr_subdesc *)((RING)->desc))[(idx)]))
3573c0086b8SZbigniew Bodek #define	GET_CQ_DESC(RING, idx)					\
3582306b72aSZbigniew Bodek     (&(((union cq_desc_t *)((RING)->desc))[(idx)]))
3593c0086b8SZbigniew Bodek 
3603c0086b8SZbigniew Bodek /* CQ status bits */
3612306b72aSZbigniew Bodek #define	CQ_WR_FUL	(1UL << 26)
3622306b72aSZbigniew Bodek #define	CQ_WR_DISABLE	(1UL << 25)
3632306b72aSZbigniew Bodek #define	CQ_WR_FAULT	(1UL << 24)
3643c0086b8SZbigniew Bodek #define	CQ_CQE_COUNT	(0xFFFF << 0)
3653c0086b8SZbigniew Bodek 
3662306b72aSZbigniew Bodek #define	CQ_ERR_MASK	(CQ_WR_FUL | CQ_WR_DISABLE | CQ_WR_FAULT)
3673c0086b8SZbigniew Bodek 
3682306b72aSZbigniew Bodek #define	NICVF_TX_LOCK(sq)		mtx_lock(&(sq)->mtx)
3692306b72aSZbigniew Bodek #define	NICVF_TX_TRYLOCK(sq)		mtx_trylock(&(sq)->mtx)
3702306b72aSZbigniew Bodek #define	NICVF_TX_UNLOCK(sq)		mtx_unlock(&(sq)->mtx)
3712306b72aSZbigniew Bodek #define	NICVF_TX_LOCK_ASSERT(sq)	mtx_assert(&(sq)->mtx, MA_OWNED)
3723c0086b8SZbigniew Bodek 
3732306b72aSZbigniew Bodek #define	NICVF_CMP_LOCK(cq)		mtx_lock(&(cq)->mtx)
3742306b72aSZbigniew Bodek #define	NICVF_CMP_UNLOCK(cq)		mtx_unlock(&(cq)->mtx)
3753c0086b8SZbigniew Bodek 
3762306b72aSZbigniew Bodek int nicvf_set_qset_resources(struct nicvf *);
3772306b72aSZbigniew Bodek int nicvf_config_data_transfer(struct nicvf *, boolean_t);
3782306b72aSZbigniew Bodek void nicvf_qset_config(struct nicvf *, boolean_t);
3793c0086b8SZbigniew Bodek 
3802306b72aSZbigniew Bodek void nicvf_enable_intr(struct nicvf *, int, int);
3812306b72aSZbigniew Bodek void nicvf_disable_intr(struct nicvf *, int, int);
3822306b72aSZbigniew Bodek void nicvf_clear_intr(struct nicvf *, int, int);
3832306b72aSZbigniew Bodek int nicvf_is_intr_enabled(struct nicvf *, int, int);
3843c0086b8SZbigniew Bodek 
3853c0086b8SZbigniew Bodek /* Register access APIs */
3862306b72aSZbigniew Bodek void nicvf_reg_write(struct nicvf *, uint64_t, uint64_t);
3872306b72aSZbigniew Bodek uint64_t nicvf_reg_read(struct nicvf *, uint64_t);
3882306b72aSZbigniew Bodek void nicvf_qset_reg_write(struct nicvf *, uint64_t, uint64_t);
3892306b72aSZbigniew Bodek uint64_t nicvf_qset_reg_read(struct nicvf *, uint64_t);
3902306b72aSZbigniew Bodek void nicvf_queue_reg_write(struct nicvf *, uint64_t, uint64_t, uint64_t);
3912306b72aSZbigniew Bodek uint64_t nicvf_queue_reg_read(struct nicvf *, uint64_t, uint64_t);
3923c0086b8SZbigniew Bodek 
3933c0086b8SZbigniew Bodek /* Stats */
3942306b72aSZbigniew Bodek void nicvf_update_rq_stats(struct nicvf *, int);
3952306b72aSZbigniew Bodek void nicvf_update_sq_stats(struct nicvf *, int);
3962306b72aSZbigniew Bodek int nicvf_check_cqe_rx_errs(struct nicvf *, struct cmp_queue *,
3972306b72aSZbigniew Bodek     struct cqe_rx_t *);
3982306b72aSZbigniew Bodek int nicvf_check_cqe_tx_errs(struct nicvf *,struct cmp_queue *,
3992306b72aSZbigniew Bodek     struct cqe_send_t *);
4003c0086b8SZbigniew Bodek #endif /* NICVF_QUEUES_H */
401