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 : : uint64_t vector_timeout_ns;
101 : : /*
102 : : * Maximum number of nanoseconds to wait for aggregating
103 : : * crypto operations.
104 : : */
105 : : };
106 : :
107 : : struct cnxk_cpt_qp {
108 : : struct roc_cpt_lf lf;
109 : : /**< Crypto LF */
110 : : struct pending_queue pend_q;
111 : : /**< Pending queue */
112 : : struct roc_cpt_lmtline lmtline;
113 : : /**< Lmtline information */
114 : : struct cpt_qp_meta_info meta_info;
115 : : /**< Metabuf info required to support operations on the queue pair */
116 : : struct crypto_adpter_info ca;
117 : : /**< Crypto adapter related info */
118 : : struct rte_mempool *sess_mp;
119 : : /**< Session mempool */
120 : : struct cnxk_sso_evdev *evdev;
121 : : };
122 : :
123 : : int cnxk_cpt_asym_get_mlen(void);
124 : :
125 : : int cnxk_cpt_dev_config(struct rte_cryptodev *dev,
126 : : struct rte_cryptodev_config *conf);
127 : :
128 : : int cnxk_cpt_dev_start(struct rte_cryptodev *dev);
129 : :
130 : : void cnxk_cpt_dev_stop(struct rte_cryptodev *dev);
131 : :
132 : : int cnxk_cpt_dev_close(struct rte_cryptodev *dev);
133 : :
134 : : void cnxk_cpt_dev_info_get(struct rte_cryptodev *dev,
135 : : struct rte_cryptodev_info *info);
136 : :
137 : : int cnxk_cpt_queue_pair_setup(struct rte_cryptodev *dev, uint16_t qp_id,
138 : : const struct rte_cryptodev_qp_conf *conf,
139 : : int socket_id __rte_unused);
140 : :
141 : : int cnxk_cpt_queue_pair_reset(struct rte_cryptodev *dev, uint16_t qp_id,
142 : : const struct rte_cryptodev_qp_conf *conf, int socket_id);
143 : :
144 : : int cnxk_cpt_queue_pair_release(struct rte_cryptodev *dev, uint16_t qp_id);
145 : :
146 : : unsigned int cnxk_cpt_sym_session_get_size(struct rte_cryptodev *dev);
147 : :
148 : : int cnxk_cpt_sym_session_configure(struct rte_cryptodev *dev, struct rte_crypto_sym_xform *xform,
149 : : struct rte_cryptodev_sym_session *sess);
150 : :
151 : : int sym_session_configure(struct roc_cpt *roc_cpt, struct rte_crypto_sym_xform *xform,
152 : : struct rte_cryptodev_sym_session *sess, bool is_session_less);
153 : :
154 : : void cnxk_cpt_sym_session_clear(struct rte_cryptodev *dev, struct rte_cryptodev_sym_session *sess);
155 : :
156 : : void sym_session_clear(struct rte_cryptodev_sym_session *sess, bool is_session_less);
157 : :
158 : : unsigned int cnxk_ae_session_size_get(struct rte_cryptodev *dev __rte_unused);
159 : :
160 : : void cnxk_ae_session_clear(struct rte_cryptodev *dev,
161 : : struct rte_cryptodev_asym_session *sess);
162 : : int cnxk_ae_session_cfg(struct rte_cryptodev *dev,
163 : : struct rte_crypto_asym_xform *xform,
164 : : struct rte_cryptodev_asym_session *sess);
165 : : void cnxk_cpt_dump_on_err(struct cnxk_cpt_qp *qp);
166 : : int cnxk_cpt_queue_pair_event_error_query(struct rte_cryptodev *dev, uint16_t qp_id);
167 : :
168 : : uint32_t cnxk_cpt_qp_depth_used(void *qptr);
169 : :
170 : : #ifdef CPT_INST_DEBUG_ENABLE
171 : : void cnxk_cpt_request_data_sg_mode_dump(uint8_t *in_buffer, bool glist);
172 : :
173 : : void cnxk_cpt_request_data_sgv2_mode_dump(uint8_t *in_buffer, bool glist, uint16_t components);
174 : : #endif
175 : :
176 : : static __rte_always_inline void
177 : : pending_queue_advance(uint64_t *index, const uint64_t mask)
178 : : {
179 : 0 : *index = (*index + 1) & mask;
180 : : }
181 : :
182 : : static __rte_always_inline void
183 : : pending_queue_retreat(uint64_t *index, const uint64_t mask, uint64_t nb_entry)
184 : : {
185 : 0 : *index = (*index - nb_entry) & mask;
186 : 0 : }
187 : :
188 : : static __rte_always_inline uint64_t
189 : : pending_queue_infl_cnt(uint64_t head, uint64_t tail, const uint64_t mask)
190 : : {
191 : : /*
192 : : * Mask is nb_desc - 1. Add nb_desc to head and mask to account for
193 : : * cases when tail > head, which happens during wrap around.
194 : : */
195 [ # # # # : 0 : return ((head + mask + 1) - tail) & mask;
# # # # ]
196 : : }
197 : :
198 : : static __rte_always_inline uint64_t
199 : : pending_queue_free_cnt(uint64_t head, uint64_t tail, const uint64_t mask)
200 : : {
201 : : /* mask is nb_desc - 1 */
202 : : return mask - pending_queue_infl_cnt(head, tail, mask);
203 : : }
204 : :
205 : : static __rte_always_inline void *
206 : : alloc_op_meta(struct roc_se_buf_ptr *buf, int32_t len, struct rte_mempool *cpt_meta_pool,
207 : : struct cpt_inflight_req *infl_req)
208 : : {
209 : : uint8_t *mdata;
210 : :
211 [ # # # # : 0 : if (unlikely(rte_mempool_get(cpt_meta_pool, (void **)&mdata) < 0))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
212 : : return NULL;
213 : :
214 : : if (likely(buf)) {
215 : 0 : buf->vaddr = mdata;
216 : 0 : buf->size = len;
217 : : }
218 : :
219 : 0 : infl_req->mdata = mdata;
220 [ # # # # : 0 : infl_req->op_flags |= CPT_OP_FLAGS_METABUF;
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
221 : :
222 : 0 : return mdata;
223 : : }
224 : :
225 : : static __rte_always_inline bool
226 : : hw_ctx_cache_enable(void)
227 : : {
228 [ # # # # : 0 : return roc_errata_cpt_hang_on_mixed_ctx_val() || roc_model_is_cn10ka_b0() ||
# # # # #
# # # # #
# # # # #
# # # #
# ]
229 : : roc_model_is_cn10kb_a0();
230 : : }
231 : :
232 : : static inline uint64_t
233 : : cnxk_cpt_sec_inst_w7_get(struct roc_cpt *roc_cpt, void *cptr)
234 : : {
235 : : union cpt_inst_w7 w7;
236 : :
237 [ # # # # ]: 0 : w7.u64 = 0;
238 [ # # # # ]: 0 : if (roc_model_is_cn20k())
239 : 0 : w7.s.egrp = roc_cpt->eng_grp[CPT_ENG_TYPE_SE];
240 : : else
241 : 0 : w7.s.egrp = roc_cpt->eng_grp[CPT_ENG_TYPE_IE];
242 : 0 : w7.s.ctx_val = 1;
243 : 0 : w7.s.cptr = (uint64_t)cptr;
244 : : rte_mb();
245 : :
246 [ # # # # ]: 0 : return w7.u64;
247 : : }
248 : :
249 : : static inline void
250 : : pktmbuf_trim_chain(struct rte_mbuf *m, uint16_t len)
251 : : {
252 : : uint16_t len_so_far = 0, left_over = 0, new_mlen;
253 : : struct rte_mbuf *cur = m;
254 : :
255 : 0 : new_mlen = m->pkt_len - len;
256 : :
257 [ # # # # ]: 0 : while (len_so_far < new_mlen) {
258 : 0 : left_over = new_mlen - len_so_far;
259 [ # # # # ]: 0 : if (left_over < cur->data_len)
260 : : break;
261 : 0 : len_so_far += cur->data_len;
262 : 0 : cur = cur->next;
263 : : }
264 : :
265 : 0 : cur->data_len = left_over;
266 : 0 : cur = cur->next;
267 [ # # # # ]: 0 : while (cur) {
268 : 0 : cur->data_len = 0;
269 : 0 : cur = cur->next;
270 : : }
271 : :
272 : 0 : m->pkt_len = new_mlen;
273 : 0 : }
274 : : #endif /* _CNXK_CRYPTODEV_OPS_H_ */
|