xref: /f-stack/dpdk/drivers/crypto/nitrox/nitrox_qp.h (revision 4418919f)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4 
5 #ifndef _NITROX_QP_H_
6 #define _NITROX_QP_H_
7 
8 #include <stdbool.h>
9 
10 #include <rte_io.h>
11 
12 struct nitrox_softreq;
13 
14 struct command_queue {
15 	const struct rte_memzone *mz;
16 	uint8_t *dbell_csr_addr;
17 	uint8_t *ring;
18 	uint8_t instr_size;
19 };
20 
21 struct rid {
22 	struct nitrox_softreq *sr;
23 };
24 
25 struct nitrox_qp {
26 	struct command_queue cmdq;
27 	struct rid *ridq;
28 	uint32_t count;
29 	uint32_t head;
30 	uint32_t tail;
31 	struct rte_mempool *sr_mp;
32 	struct rte_cryptodev_stats stats;
33 	uint16_t qno;
34 	rte_atomic16_t pending_count;
35 };
36 
37 static inline uint16_t
nitrox_qp_free_count(struct nitrox_qp * qp)38 nitrox_qp_free_count(struct nitrox_qp *qp)
39 {
40 	uint16_t pending_count = rte_atomic16_read(&qp->pending_count);
41 
42 	RTE_ASSERT(qp->count >= pending_count);
43 	return (qp->count - pending_count);
44 }
45 
46 static inline bool
nitrox_qp_is_empty(struct nitrox_qp * qp)47 nitrox_qp_is_empty(struct nitrox_qp *qp)
48 {
49 	return (rte_atomic16_read(&qp->pending_count) == 0);
50 }
51 
52 static inline uint16_t
nitrox_qp_used_count(struct nitrox_qp * qp)53 nitrox_qp_used_count(struct nitrox_qp *qp)
54 {
55 	return rte_atomic16_read(&qp->pending_count);
56 }
57 
58 static inline struct nitrox_softreq *
nitrox_qp_get_softreq(struct nitrox_qp * qp)59 nitrox_qp_get_softreq(struct nitrox_qp *qp)
60 {
61 	uint32_t tail = qp->tail % qp->count;
62 
63 	rte_smp_rmb();
64 	return qp->ridq[tail].sr;
65 }
66 
67 static inline void
nitrox_ring_dbell(struct nitrox_qp * qp,uint16_t cnt)68 nitrox_ring_dbell(struct nitrox_qp *qp, uint16_t cnt)
69 {
70 	struct command_queue *cmdq = &qp->cmdq;
71 
72 	if (!cnt)
73 		return;
74 
75 	rte_io_wmb();
76 	rte_write64(cnt, cmdq->dbell_csr_addr);
77 }
78 
79 static inline void
nitrox_qp_enqueue(struct nitrox_qp * qp,void * instr,struct nitrox_softreq * sr)80 nitrox_qp_enqueue(struct nitrox_qp *qp, void *instr, struct nitrox_softreq *sr)
81 {
82 	uint32_t head = qp->head % qp->count;
83 
84 	qp->head++;
85 	memcpy(&qp->cmdq.ring[head * qp->cmdq.instr_size],
86 	       instr, qp->cmdq.instr_size);
87 	qp->ridq[head].sr = sr;
88 	rte_smp_wmb();
89 	rte_atomic16_inc(&qp->pending_count);
90 }
91 
92 static inline void
nitrox_qp_dequeue(struct nitrox_qp * qp)93 nitrox_qp_dequeue(struct nitrox_qp *qp)
94 {
95 	qp->tail++;
96 	rte_atomic16_dec(&qp->pending_count);
97 }
98 
99 int nitrox_qp_setup(struct nitrox_qp *qp, uint8_t *bar_addr,
100 		    const char *dev_name, uint32_t nb_descriptors,
101 		    uint8_t inst_size, int socket_id);
102 int nitrox_qp_release(struct nitrox_qp *qp, uint8_t *bar_addr);
103 
104 #endif /* _NITROX_QP_H_ */
105