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 : : uint8_t rsvd[16];
58 : : uint8_t meta[META_LEN];
59 : : union {
60 : : void *opaque;
61 : : struct rte_crypto_op *cop;
62 : : struct rte_event_vector *vec;
63 : : };
64 : : void *qp;
65 : : void *mdata;
66 : : uint8_t op_flags;
67 : : #ifdef CPT_INST_DEBUG_ENABLE
68 : : uint8_t scatter_sz;
69 : : uint8_t opcode_major;
70 : : uint8_t is_sg_ver2;
71 : : uint8_t *dptr;
72 : : uint8_t *rptr;
73 : : #endif
74 : : };
75 : :
76 : : PLT_STATIC_ASSERT(sizeof(struct cpt_inflight_req) == ROC_CACHE_LINE_SZ);
77 : : PLT_STATIC_ASSERT(offsetof(struct cpt_inflight_req, meta) == 32);
78 : :
79 : : struct pending_queue {
80 : : /** Array of pending requests */
81 : : struct cpt_inflight_req *req_queue;
82 : : /** Head of the queue to be used for enqueue */
83 : : uint64_t head;
84 : : /** Tail of the queue to be used for dequeue */
85 : : uint64_t tail;
86 : : /** Pending queue mask */
87 : : uint64_t pq_mask;
88 : : /** Timeout to track h/w being unresponsive */
89 : : uint64_t time_out;
90 : : };
91 : :
92 : : struct crypto_adpter_info {
93 : : bool enabled;
94 : : /**< Set if queue pair is added to crypto adapter */
95 : : struct rte_mempool *req_mp;
96 : : /**< CPT inflight request mempool */
97 : : uint16_t vector_sz;
98 : : /** Maximum number of cops to combine into single vector */
99 : : struct rte_mempool *vector_mp;
100 : : /** Pool for allocating rte_event_vector */
101 : : uint64_t vector_timeout_ns;
102 : : /*
103 : : * Maximum number of nanoseconds to wait for aggregating
104 : : * crypto operations.
105 : : */
106 : : };
107 : :
108 : : struct cnxk_cpt_qp {
109 : : struct roc_cpt_lf lf;
110 : : /**< Crypto LF */
111 : : struct pending_queue pend_q;
112 : : /**< Pending queue */
113 : : struct roc_cpt_lmtline lmtline;
114 : : /**< Lmtline information */
115 : : struct cpt_qp_meta_info meta_info;
116 : : /**< Metabuf info required to support operations on the queue pair */
117 : : struct crypto_adpter_info ca;
118 : : /**< Crypto adapter related info */
119 : : struct rte_mempool *sess_mp;
120 : : /**< Session mempool */
121 : : struct cnxk_sso_evdev *evdev;
122 : : };
123 : :
124 : : int cnxk_cpt_asym_get_mlen(void);
125 : :
126 : : int cnxk_cpt_dev_config(struct rte_cryptodev *dev,
127 : : struct rte_cryptodev_config *conf);
128 : :
129 : : int cnxk_cpt_dev_start(struct rte_cryptodev *dev);
130 : :
131 : : void cnxk_cpt_dev_stop(struct rte_cryptodev *dev);
132 : :
133 : : int cnxk_cpt_dev_close(struct rte_cryptodev *dev);
134 : :
135 : : void cnxk_cpt_dev_info_get(struct rte_cryptodev *dev,
136 : : struct rte_cryptodev_info *info);
137 : :
138 : : int cnxk_cpt_queue_pair_setup(struct rte_cryptodev *dev, uint16_t qp_id,
139 : : const struct rte_cryptodev_qp_conf *conf,
140 : : int socket_id __rte_unused);
141 : :
142 : : int cnxk_cpt_queue_pair_reset(struct rte_cryptodev *dev, uint16_t qp_id,
143 : : const struct rte_cryptodev_qp_conf *conf, int socket_id);
144 : :
145 : : int cnxk_cpt_queue_pair_release(struct rte_cryptodev *dev, uint16_t qp_id);
146 : :
147 : : unsigned int cnxk_cpt_sym_session_get_size(struct rte_cryptodev *dev);
148 : :
149 : : int cnxk_cpt_sym_session_configure(struct rte_cryptodev *dev, struct rte_crypto_sym_xform *xform,
150 : : struct rte_cryptodev_sym_session *sess);
151 : :
152 : : int sym_session_configure(struct roc_cpt *roc_cpt, struct rte_crypto_sym_xform *xform,
153 : : struct rte_cryptodev_sym_session *sess, bool is_session_less);
154 : :
155 : : void cnxk_cpt_sym_session_clear(struct rte_cryptodev *dev, struct rte_cryptodev_sym_session *sess);
156 : :
157 : : void sym_session_clear(struct rte_cryptodev_sym_session *sess, bool is_session_less);
158 : :
159 : : unsigned int cnxk_ae_session_size_get(struct rte_cryptodev *dev __rte_unused);
160 : :
161 : : void cnxk_ae_session_clear(struct rte_cryptodev *dev,
162 : : struct rte_cryptodev_asym_session *sess);
163 : : int cnxk_ae_session_cfg(struct rte_cryptodev *dev,
164 : : struct rte_crypto_asym_xform *xform,
165 : : struct rte_cryptodev_asym_session *sess);
166 : : void cnxk_cpt_dump_on_err(struct cnxk_cpt_qp *qp);
167 : : int cnxk_cpt_queue_pair_event_error_query(struct rte_cryptodev *dev, uint16_t qp_id);
168 : :
169 : : uint32_t cnxk_cpt_qp_depth_used(void *qptr);
170 : :
171 : : #ifdef CPT_INST_DEBUG_ENABLE
172 : : void cnxk_cpt_request_data_sg_mode_dump(uint8_t *in_buffer, bool glist);
173 : :
174 : : void cnxk_cpt_request_data_sgv2_mode_dump(uint8_t *in_buffer, bool glist, uint16_t components);
175 : : #endif
176 : :
177 : : static __rte_always_inline void
178 : : pending_queue_advance(uint64_t *index, const uint64_t mask)
179 : : {
180 : 0 : *index = (*index + 1) & mask;
181 : : }
182 : :
183 : : static __rte_always_inline void
184 : : pending_queue_retreat(uint64_t *index, const uint64_t mask, uint64_t nb_entry)
185 : : {
186 : 0 : *index = (*index - nb_entry) & mask;
187 : 0 : }
188 : :
189 : : static __rte_always_inline uint64_t
190 : : pending_queue_infl_cnt(uint64_t head, uint64_t tail, const uint64_t mask)
191 : : {
192 : : /*
193 : : * Mask is nb_desc - 1. Add nb_desc to head and mask to account for
194 : : * cases when tail > head, which happens during wrap around.
195 : : */
196 [ # # # # : 0 : return ((head + mask + 1) - tail) & mask;
# # # # ]
197 : : }
198 : :
199 : : static __rte_always_inline uint64_t
200 : : pending_queue_free_cnt(uint64_t head, uint64_t tail, const uint64_t mask)
201 : : {
202 : : /* mask is nb_desc - 1 */
203 : : return mask - pending_queue_infl_cnt(head, tail, mask);
204 : : }
205 : :
206 : : static __rte_always_inline void *
207 : : alloc_op_meta(struct roc_se_buf_ptr *buf, int32_t len, struct rte_mempool *cpt_meta_pool,
208 : : struct cpt_inflight_req *infl_req)
209 : : {
210 : : uint8_t *mdata;
211 : :
212 [ # # # # : 0 : if (unlikely(rte_mempool_get(cpt_meta_pool, (void **)&mdata) < 0))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
213 : : return NULL;
214 : :
215 : : if (likely(buf)) {
216 : 0 : buf->vaddr = mdata;
217 : 0 : buf->size = len;
218 : : }
219 : :
220 : 0 : infl_req->mdata = mdata;
221 [ # # # # : 0 : infl_req->op_flags |= CPT_OP_FLAGS_METABUF;
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
222 : :
223 : 0 : return mdata;
224 : : }
225 : :
226 : : static __rte_always_inline bool
227 : : hw_ctx_cache_enable(void)
228 : : {
229 [ # # # # : 0 : return roc_errata_cpt_hang_on_mixed_ctx_val() || roc_model_is_cn10ka_b0() ||
# # # # #
# # # # #
# # # # #
# # # #
# ]
230 : : roc_model_is_cn10kb_a0();
231 : : }
232 : :
233 : : static inline uint64_t
234 : : cnxk_cpt_sec_inst_w7_get(struct roc_cpt *roc_cpt, void *cptr)
235 : : {
236 : : union cpt_inst_w7 w7;
237 : :
238 [ # # # # ]: 0 : w7.u64 = 0;
239 [ # # # # ]: 0 : if (roc_model_is_cn20k())
240 : 0 : w7.s.egrp = roc_cpt->eng_grp[CPT_ENG_TYPE_SE];
241 : : else
242 : 0 : w7.s.egrp = roc_cpt->eng_grp[CPT_ENG_TYPE_IE];
243 : 0 : w7.s.ctx_val = 1;
244 : 0 : w7.s.cptr = (uint64_t)cptr;
245 : : rte_mb();
246 : :
247 [ # # # # ]: 0 : return w7.u64;
248 : : }
249 : :
250 : : static inline void
251 : : pktmbuf_trim_chain(struct rte_mbuf *m, uint16_t len)
252 : : {
253 : : uint16_t len_so_far = 0, left_over = 0, new_mlen;
254 : : struct rte_mbuf *cur = m;
255 : :
256 : 0 : new_mlen = m->pkt_len - len;
257 : :
258 [ # # # # ]: 0 : while (len_so_far < new_mlen) {
259 : 0 : left_over = new_mlen - len_so_far;
260 [ # # # # ]: 0 : if (left_over < cur->data_len)
261 : : break;
262 : 0 : len_so_far += cur->data_len;
263 : 0 : cur = cur->next;
264 : : }
265 : :
266 : 0 : cur->data_len = left_over;
267 : 0 : cur = cur->next;
268 [ # # # # ]: 0 : while (cur) {
269 : 0 : cur->data_len = 0;
270 : 0 : cur = cur->next;
271 : : }
272 : :
273 : 0 : m->pkt_len = new_mlen;
274 : 0 : }
275 : : #endif /* _CNXK_CRYPTODEV_OPS_H_ */
|