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