Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2021 Marvell.
3 : : */
4 : :
5 : : #ifndef _CNXK_CRYPTODEV_OPS_H_
6 : : #define _CNXK_CRYPTODEV_OPS_H_
7 : :
8 : : #include <cryptodev_pmd.h>
9 : : #include <rte_event_crypto_adapter.h>
10 : :
11 : : #include "hw/cpt.h"
12 : :
13 : : #include "roc_constants.h"
14 : : #include "roc_cpt.h"
15 : : #include "roc_cpt_sg.h"
16 : : #include "roc_errata.h"
17 : : #include "roc_se.h"
18 : :
19 : : /* Space for ctrl_word(8B), IV(48B), passthrough alignment(8B) */
20 : : #define CNXK_CPT_MIN_HEADROOM_REQ 64
21 : : /* Tailroom required for RX-inject path.
22 : : * In RX-inject path, space is required for below entities:
23 : : * WQE header and NIX_RX_PARSE_S
24 : : * SG list format for 6 IOVA pointers
25 : : * Space for 128 byte alignment.
26 : : */
27 : : #define CNXK_CPT_MIN_TAILROOM_REQ 256
28 : : #define CNXK_CPT_MAX_SG_SEGS 6
29 : :
30 : : /* Default command timeout in seconds */
31 : : #define DEFAULT_COMMAND_TIMEOUT 4
32 : :
33 : : #define META_LEN 64
34 : :
35 : : #define MOD_INC(i, l) ((i) == (l - 1) ? (i) = 0 : (i)++)
36 : :
37 : : #define CN10K_CPT_PKTS_PER_LOOP 64
38 : : #define CN20K_CPT_PKTS_PER_LOOP 64
39 : :
40 : : /* Macros to form words in CPT instruction */
41 : : #define CNXK_CPT_INST_W2(tag, tt, grp, rvu_pf_func) \
42 : : ((tag) | ((uint64_t)(tt) << 32) | ((uint64_t)(grp) << 34) | ((uint64_t)(rvu_pf_func) << 48))
43 : : #define CNXK_CPT_INST_W3(qord, wqe_ptr) (qord | ((uintptr_t)(wqe_ptr) >> 3) << 3)
44 : :
45 : : struct cpt_qp_meta_info {
46 : : struct rte_mempool *pool;
47 : : int mlen;
48 : : };
49 : :
50 : : #define CPT_OP_FLAGS_METABUF (1 << 1)
51 : : #define CPT_OP_FLAGS_AUTH_VERIFY (1 << 0)
52 : : #define CPT_OP_FLAGS_IPSEC_DIR_INBOUND (1 << 2)
53 : : #define CPT_OP_FLAGS_IPSEC_INB_REPLAY (1 << 3)
54 : :
55 : : struct __rte_aligned(ROC_ALIGN) cpt_inflight_req {
56 : : union cpt_res_s res;
57 : : union {
58 : : void *opaque;
59 : : struct rte_crypto_op *cop;
60 : : struct rte_event_vector *vec;
61 : : };
62 : : void *mdata;
63 : : uint8_t meta[META_LEN];
64 : : uint8_t op_flags;
65 : : #ifdef CPT_INST_DEBUG_ENABLE
66 : : uint8_t scatter_sz;
67 : : uint8_t opcode_major;
68 : : uint8_t is_sg_ver2;
69 : : uint8_t *dptr;
70 : : uint8_t *rptr;
71 : : #endif
72 : : void *qp;
73 : : };
74 : :
75 : : PLT_STATIC_ASSERT(sizeof(struct cpt_inflight_req) == ROC_CACHE_LINE_SZ);
76 : : PLT_STATIC_ASSERT(offsetof(struct cpt_inflight_req, meta) == 32);
77 : :
78 : : struct pending_queue {
79 : : /** Array of pending requests */
80 : : struct cpt_inflight_req *req_queue;
81 : : /** Head of the queue to be used for enqueue */
82 : : uint64_t head;
83 : : /** Tail of the queue to be used for dequeue */
84 : : uint64_t tail;
85 : : /** Pending queue mask */
86 : : uint64_t pq_mask;
87 : : /** Timeout to track h/w being unresponsive */
88 : : uint64_t time_out;
89 : : };
90 : :
91 : : struct crypto_adpter_info {
92 : : bool enabled;
93 : : /**< Set if queue pair is added to crypto adapter */
94 : : struct rte_mempool *req_mp;
95 : : /**< CPT inflight request mempool */
96 : : uint16_t vector_sz;
97 : : /** Maximum number of cops to combine into single vector */
98 : : struct rte_mempool *vector_mp;
99 : : /** Pool for allocating rte_event_vector */
100 : : };
101 : :
102 : : struct cnxk_cpt_qp {
103 : : struct roc_cpt_lf lf;
104 : : /**< Crypto LF */
105 : : struct pending_queue pend_q;
106 : : /**< Pending queue */
107 : : struct roc_cpt_lmtline lmtline;
108 : : /**< Lmtline information */
109 : : struct cpt_qp_meta_info meta_info;
110 : : /**< Metabuf info required to support operations on the queue pair */
111 : : struct crypto_adpter_info ca;
112 : : /**< Crypto adapter related info */
113 : : struct rte_mempool *sess_mp;
114 : : /**< Session mempool */
115 : : };
116 : :
117 : : int cnxk_cpt_asym_get_mlen(void);
118 : :
119 : : int cnxk_cpt_dev_config(struct rte_cryptodev *dev,
120 : : struct rte_cryptodev_config *conf);
121 : :
122 : : int cnxk_cpt_dev_start(struct rte_cryptodev *dev);
123 : :
124 : : void cnxk_cpt_dev_stop(struct rte_cryptodev *dev);
125 : :
126 : : int cnxk_cpt_dev_close(struct rte_cryptodev *dev);
127 : :
128 : : void cnxk_cpt_dev_info_get(struct rte_cryptodev *dev,
129 : : struct rte_cryptodev_info *info);
130 : :
131 : : int cnxk_cpt_queue_pair_setup(struct rte_cryptodev *dev, uint16_t qp_id,
132 : : const struct rte_cryptodev_qp_conf *conf,
133 : : int socket_id __rte_unused);
134 : :
135 : : int cnxk_cpt_queue_pair_reset(struct rte_cryptodev *dev, uint16_t qp_id,
136 : : const struct rte_cryptodev_qp_conf *conf, int socket_id);
137 : :
138 : : int cnxk_cpt_queue_pair_release(struct rte_cryptodev *dev, uint16_t qp_id);
139 : :
140 : : unsigned int cnxk_cpt_sym_session_get_size(struct rte_cryptodev *dev);
141 : :
142 : : int cnxk_cpt_sym_session_configure(struct rte_cryptodev *dev, struct rte_crypto_sym_xform *xform,
143 : : struct rte_cryptodev_sym_session *sess);
144 : :
145 : : int sym_session_configure(struct roc_cpt *roc_cpt, struct rte_crypto_sym_xform *xform,
146 : : struct rte_cryptodev_sym_session *sess, bool is_session_less);
147 : :
148 : : void cnxk_cpt_sym_session_clear(struct rte_cryptodev *dev, struct rte_cryptodev_sym_session *sess);
149 : :
150 : : void sym_session_clear(struct rte_cryptodev_sym_session *sess, bool is_session_less);
151 : :
152 : : unsigned int cnxk_ae_session_size_get(struct rte_cryptodev *dev __rte_unused);
153 : :
154 : : void cnxk_ae_session_clear(struct rte_cryptodev *dev,
155 : : struct rte_cryptodev_asym_session *sess);
156 : : int cnxk_ae_session_cfg(struct rte_cryptodev *dev,
157 : : struct rte_crypto_asym_xform *xform,
158 : : struct rte_cryptodev_asym_session *sess);
159 : : void cnxk_cpt_dump_on_err(struct cnxk_cpt_qp *qp);
160 : : int cnxk_cpt_queue_pair_event_error_query(struct rte_cryptodev *dev, uint16_t qp_id);
161 : :
162 : : uint32_t cnxk_cpt_qp_depth_used(void *qptr);
163 : :
164 : : #ifdef CPT_INST_DEBUG_ENABLE
165 : : void cnxk_cpt_request_data_sg_mode_dump(uint8_t *in_buffer, bool glist);
166 : :
167 : : void cnxk_cpt_request_data_sgv2_mode_dump(uint8_t *in_buffer, bool glist, uint16_t components);
168 : : #endif
169 : :
170 : : static __rte_always_inline void
171 : : pending_queue_advance(uint64_t *index, const uint64_t mask)
172 : : {
173 : 0 : *index = (*index + 1) & mask;
174 : : }
175 : :
176 : : static __rte_always_inline void
177 : : pending_queue_retreat(uint64_t *index, const uint64_t mask, uint64_t nb_entry)
178 : : {
179 : 0 : *index = (*index - nb_entry) & mask;
180 : 0 : }
181 : :
182 : : static __rte_always_inline uint64_t
183 : : pending_queue_infl_cnt(uint64_t head, uint64_t tail, const uint64_t mask)
184 : : {
185 : : /*
186 : : * Mask is nb_desc - 1. Add nb_desc to head and mask to account for
187 : : * cases when tail > head, which happens during wrap around.
188 : : */
189 [ # # # # : 0 : return ((head + mask + 1) - tail) & mask;
# # # # ]
190 : : }
191 : :
192 : : static __rte_always_inline uint64_t
193 : : pending_queue_free_cnt(uint64_t head, uint64_t tail, const uint64_t mask)
194 : : {
195 : : /* mask is nb_desc - 1 */
196 : : return mask - pending_queue_infl_cnt(head, tail, mask);
197 : : }
198 : :
199 : : static __rte_always_inline void *
200 : : alloc_op_meta(struct roc_se_buf_ptr *buf, int32_t len, struct rte_mempool *cpt_meta_pool,
201 : : struct cpt_inflight_req *infl_req)
202 : : {
203 : : uint8_t *mdata;
204 : :
205 [ # # # # : 0 : if (unlikely(rte_mempool_get(cpt_meta_pool, (void **)&mdata) < 0))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
206 : : return NULL;
207 : :
208 : : if (likely(buf)) {
209 : 0 : buf->vaddr = mdata;
210 : 0 : buf->size = len;
211 : : }
212 : :
213 : 0 : infl_req->mdata = mdata;
214 [ # # # # : 0 : infl_req->op_flags |= CPT_OP_FLAGS_METABUF;
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
215 : :
216 : 0 : return mdata;
217 : : }
218 : :
219 : : static __rte_always_inline bool
220 : : hw_ctx_cache_enable(void)
221 : : {
222 [ # # # # : 0 : return roc_errata_cpt_hang_on_mixed_ctx_val() || roc_model_is_cn10ka_b0() ||
# # # # #
# # # # #
# # # # #
# # # #
# ]
223 : : roc_model_is_cn10kb_a0();
224 : : }
225 : :
226 : : static inline uint64_t
227 : : cnxk_cpt_sec_inst_w7_get(struct roc_cpt *roc_cpt, void *cptr)
228 : : {
229 : : union cpt_inst_w7 w7;
230 : :
231 [ # # # # ]: 0 : w7.u64 = 0;
232 [ # # # # ]: 0 : if (roc_model_is_cn20k())
233 : 0 : w7.s.egrp = roc_cpt->eng_grp[CPT_ENG_TYPE_SE];
234 : : else
235 : 0 : w7.s.egrp = roc_cpt->eng_grp[CPT_ENG_TYPE_IE];
236 : 0 : w7.s.ctx_val = 1;
237 : 0 : w7.s.cptr = (uint64_t)cptr;
238 : : rte_mb();
239 : :
240 [ # # # # ]: 0 : return w7.u64;
241 : : }
242 : : #endif /* _CNXK_CRYPTODEV_OPS_H_ */
|