xref: /freebsd/sys/dev/enic/vnic_wq.h (revision 0acab8b3d1336d4db73a9946ef76b4bcd0b0aabe)
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_WQ_H_
79c067b84SDoug Ambrisko #define _VNIC_WQ_H_
89c067b84SDoug Ambrisko 
99c067b84SDoug Ambrisko #include "vnic_dev.h"
109c067b84SDoug Ambrisko #include "vnic_cq.h"
119c067b84SDoug Ambrisko 
129c067b84SDoug Ambrisko /* Work queue control */
139c067b84SDoug Ambrisko struct vnic_wq_ctrl {
149c067b84SDoug Ambrisko 	u64 ring_base;			/* 0x00 */
159c067b84SDoug Ambrisko #define TX_RING_BASE			   0x00
169c067b84SDoug Ambrisko 	u32 ring_size;			/* 0x08 */
179c067b84SDoug Ambrisko #define TX_RING_SIZE			   0x08
189c067b84SDoug Ambrisko 	u32 pad0;
199c067b84SDoug Ambrisko 	u32 posted_index;		/* 0x10 */
209c067b84SDoug Ambrisko #define TX_POSTED_INDEX			   0x10
219c067b84SDoug Ambrisko 	u32 pad1;
229c067b84SDoug Ambrisko 	u32 cq_index;			/* 0x18 */
239c067b84SDoug Ambrisko #define TX_CQ_INDEX			   0x18
249c067b84SDoug Ambrisko 	u32 pad2;
259c067b84SDoug Ambrisko 	u32 enable;			/* 0x20 */
269c067b84SDoug Ambrisko #define TX_ENABLE			   0x20
279c067b84SDoug Ambrisko 	u32 pad3;
289c067b84SDoug Ambrisko 	u32 running;			/* 0x28 */
299c067b84SDoug Ambrisko #define TX_RUNNING			   0x28
309c067b84SDoug Ambrisko 	u32 pad4;
319c067b84SDoug Ambrisko 	u32 fetch_index;		/* 0x30 */
329c067b84SDoug Ambrisko #define TX_FETCH_INDEX			   0x30
339c067b84SDoug Ambrisko 	u32 pad5;
349c067b84SDoug Ambrisko 	u32 dca_value;			/* 0x38 */
359c067b84SDoug Ambrisko #define TX_DCA_VALUE			   0x38
369c067b84SDoug Ambrisko 	u32 pad6;
379c067b84SDoug Ambrisko 	u32 error_interrupt_enable;	/* 0x40 */
389c067b84SDoug Ambrisko #define TX_ERROR_INTR_ENABLE		   0x40
399c067b84SDoug Ambrisko 	u32 pad7;
409c067b84SDoug Ambrisko 	u32 error_interrupt_offset;	/* 0x48 */
419c067b84SDoug Ambrisko #define TX_ERROR_INTR_OFFSET		   0x48
429c067b84SDoug Ambrisko 	u32 pad8;
439c067b84SDoug Ambrisko 	u32 error_status;		/* 0x50 */
449c067b84SDoug Ambrisko #define TX_ERROR_STATUS			   0x50
459c067b84SDoug Ambrisko 	u32 pad9;
469c067b84SDoug Ambrisko };
479c067b84SDoug Ambrisko 
489c067b84SDoug Ambrisko struct vnic_wq {
499c067b84SDoug Ambrisko 	unsigned int index;
509c067b84SDoug Ambrisko 	uint64_t tx_offload_notsup_mask;
519c067b84SDoug Ambrisko 	struct vnic_dev *vdev;
529c067b84SDoug Ambrisko 	struct vnic_res *ctrl;
539c067b84SDoug Ambrisko 	struct vnic_dev_ring ring;
549c067b84SDoug Ambrisko 	unsigned int head_idx;
559c067b84SDoug Ambrisko 	unsigned int cq_pend;
569c067b84SDoug Ambrisko 	unsigned int tail_idx;
579c067b84SDoug Ambrisko 	unsigned int socket_id;
589c067b84SDoug Ambrisko 	unsigned int processed;
599c067b84SDoug Ambrisko 	const struct rte_memzone *cqmsg_rz;
609c067b84SDoug Ambrisko 	uint16_t last_completed_index;
619c067b84SDoug Ambrisko 	uint64_t offloads;
629c067b84SDoug Ambrisko };
639c067b84SDoug Ambrisko 
64*0acab8b3SDoug Ambrisko struct devcmd2_controller {
65*0acab8b3SDoug Ambrisko 	struct vnic_res *wq_ctrl;
66*0acab8b3SDoug Ambrisko 	struct vnic_devcmd2 *cmd_ring;
67*0acab8b3SDoug Ambrisko 	struct devcmd2_result *result;
68*0acab8b3SDoug Ambrisko 	u16 next_result;
69*0acab8b3SDoug Ambrisko 	u16 result_size;
70*0acab8b3SDoug Ambrisko 	int color;
71*0acab8b3SDoug Ambrisko 	struct vnic_dev_ring results_ring;
72*0acab8b3SDoug Ambrisko 	struct vnic_res *results_ctrl;
73*0acab8b3SDoug Ambrisko 	struct vnic_wq wq;
74*0acab8b3SDoug Ambrisko 	u32 posted;
75*0acab8b3SDoug Ambrisko };
76*0acab8b3SDoug Ambrisko 
77*0acab8b3SDoug Ambrisko 
vnic_wq_desc_avail(struct vnic_wq * wq)789c067b84SDoug Ambrisko static inline unsigned int vnic_wq_desc_avail(struct vnic_wq *wq)
799c067b84SDoug Ambrisko {
809c067b84SDoug Ambrisko 	/* how many does SW own? */
819c067b84SDoug Ambrisko 	return wq->ring.desc_avail;
829c067b84SDoug Ambrisko }
839c067b84SDoug Ambrisko 
vnic_wq_desc_used(struct vnic_wq * wq)849c067b84SDoug Ambrisko static inline unsigned int vnic_wq_desc_used(struct vnic_wq *wq)
859c067b84SDoug Ambrisko {
869c067b84SDoug Ambrisko 	/* how many does HW own? */
879c067b84SDoug Ambrisko 	return wq->ring.desc_count - wq->ring.desc_avail - 1;
889c067b84SDoug Ambrisko }
899c067b84SDoug Ambrisko 
909c067b84SDoug Ambrisko #define PI_LOG2_CACHE_LINE_SIZE        5
919c067b84SDoug Ambrisko #define PI_INDEX_BITS            12
929c067b84SDoug Ambrisko #define PI_INDEX_MASK ((1U << PI_INDEX_BITS) - 1)
939c067b84SDoug Ambrisko #define PI_PREFETCH_LEN_MASK ((1U << PI_LOG2_CACHE_LINE_SIZE) - 1)
949c067b84SDoug Ambrisko #define PI_PREFETCH_LEN_OFF 16
959c067b84SDoug Ambrisko #define PI_PREFETCH_ADDR_BITS 43
969c067b84SDoug Ambrisko #define PI_PREFETCH_ADDR_MASK ((1ULL << PI_PREFETCH_ADDR_BITS) - 1)
979c067b84SDoug Ambrisko #define PI_PREFETCH_ADDR_OFF 21
989c067b84SDoug Ambrisko 
999c067b84SDoug Ambrisko static inline uint32_t
buf_idx_incr(uint32_t n_descriptors,uint32_t idx)1009c067b84SDoug Ambrisko buf_idx_incr(uint32_t n_descriptors, uint32_t idx)
1019c067b84SDoug Ambrisko {
1029c067b84SDoug Ambrisko 	idx++;
1039c067b84SDoug Ambrisko 	if (unlikely(idx == n_descriptors))
1049c067b84SDoug Ambrisko 		idx = 0;
1059c067b84SDoug Ambrisko 	return idx;
1069c067b84SDoug Ambrisko }
1079c067b84SDoug Ambrisko 
1089c067b84SDoug Ambrisko void vnic_wq_free(struct vnic_wq *wq);
109*0acab8b3SDoug Ambrisko void enic_wq_init_start(struct vnic_wq *wq, unsigned int cq_index,
1109c067b84SDoug Ambrisko     unsigned int fetch_index, unsigned int posted_index,
1119c067b84SDoug Ambrisko     unsigned int error_interrupt_enable,
1129c067b84SDoug Ambrisko     unsigned int error_interrupt_offset);
1139c067b84SDoug Ambrisko void vnic_wq_init(struct vnic_wq *wq, unsigned int cq_index,
1149c067b84SDoug Ambrisko     unsigned int error_interrupt_enable,
1159c067b84SDoug Ambrisko     unsigned int error_interrupt_offset);
1169c067b84SDoug Ambrisko void vnic_wq_error_out(struct vnic_wq *wq, unsigned int error);
1179c067b84SDoug Ambrisko unsigned int vnic_wq_error_status(struct vnic_wq *wq);
1189c067b84SDoug Ambrisko void vnic_wq_enable(struct vnic_wq *wq);
1199c067b84SDoug Ambrisko int vnic_wq_disable(struct vnic_wq *wq);
1209c067b84SDoug Ambrisko void vnic_wq_clean(struct vnic_wq *wq);
121*0acab8b3SDoug Ambrisko int enic_wq_devcmd2_alloc(struct vnic_dev *vdev, struct vnic_wq *wq,
122*0acab8b3SDoug Ambrisko     unsigned int desc_count, unsigned int desc_size);
1239c067b84SDoug Ambrisko 
1249c067b84SDoug Ambrisko #endif /* _VNIC_WQ_H_ */
125