xref: /dpdk/drivers/crypto/cnxk/cn9k_cryptodev_ops.h (revision 26bb5c4de63effe12e8e52e12b1b1d292fcb2d72)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4 
5 #ifndef _CN9K_CRYPTODEV_OPS_H_
6 #define _CN9K_CRYPTODEV_OPS_H_
7 
8 #include <rte_compat.h>
9 #include <cryptodev_pmd.h>
10 
11 #include <hw/cpt.h>
12 
13 #if defined(__aarch64__)
14 #include "roc_io.h"
15 #else
16 #include "roc_io_generic.h"
17 #endif
18 
19 extern struct rte_cryptodev_ops cn9k_cpt_ops;
20 
21 static inline void
cn9k_cpt_inst_submit(struct cpt_inst_s * inst,uint64_t lmtline,uint64_t io_addr)22 cn9k_cpt_inst_submit(struct cpt_inst_s *inst, uint64_t lmtline, uint64_t io_addr)
23 {
24 	uint64_t lmt_status;
25 
26 	do {
27 		/* Copy CPT command to LMTLINE */
28 		roc_lmt_mov64((void *)lmtline, inst);
29 
30 		/*
31 		 * Make sure compiler does not reorder memcpy and ldeor.
32 		 * LMTST transactions are always flushed from the write
33 		 * buffer immediately, a DMB is not required to push out
34 		 * LMTSTs.
35 		 */
36 		rte_io_wmb();
37 		lmt_status = roc_lmt_submit_ldeor(io_addr);
38 	} while (lmt_status == 0);
39 }
40 
41 static __plt_always_inline void
cn9k_cpt_inst_submit_dual(struct cpt_inst_s * inst,uint64_t lmtline,uint64_t io_addr)42 cn9k_cpt_inst_submit_dual(struct cpt_inst_s *inst, uint64_t lmtline, uint64_t io_addr)
43 {
44 	uint64_t lmt_status;
45 
46 	do {
47 		/* Copy 2 CPT inst_s to LMTLINE */
48 #if defined(RTE_ARCH_ARM64)
49 		volatile const __uint128_t *src128 = (const __uint128_t *)inst;
50 		volatile __uint128_t *dst128 = (__uint128_t *)lmtline;
51 
52 		dst128[0] = src128[0];
53 		dst128[1] = src128[1];
54 		dst128[2] = src128[2];
55 		dst128[3] = src128[3];
56 		dst128[4] = src128[4];
57 		dst128[5] = src128[5];
58 		dst128[6] = src128[6];
59 		dst128[7] = src128[7];
60 #else
61 		roc_lmt_mov_seg((void *)lmtline, inst, 8);
62 #endif
63 
64 		/*
65 		 * Make sure compiler does not reorder memcpy and ldeor.
66 		 * LMTST transactions are always flushed from the write
67 		 * buffer immediately, a DMB is not required to push out
68 		 * LMTSTs.
69 		 */
70 		rte_io_wmb();
71 		lmt_status = roc_lmt_submit_ldeor(io_addr);
72 	} while (lmt_status == 0);
73 }
74 
75 void cn9k_cpt_set_enqdeq_fns(struct rte_cryptodev *dev);
76 
77 __rte_internal
78 uint16_t cn9k_cpt_crypto_adapter_enqueue(uintptr_t base,
79 					 struct rte_crypto_op *op);
80 __rte_internal
81 uintptr_t cn9k_cpt_crypto_adapter_dequeue(uintptr_t get_work1);
82 
83 #endif /* _CN9K_CRYPTODEV_OPS_H_ */
84