xref: /dpdk/drivers/crypto/qat/qat_sym.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
141287a7fSFiona Trahe /* SPDX-License-Identifier: BSD-3-Clause
2e0a67610SKai Ji  * Copyright(c) 2015-2022 Intel Corporation
341287a7fSFiona Trahe  */
441287a7fSFiona Trahe 
5bba31cffSFiona Trahe #ifndef _QAT_SYM_H_
6bba31cffSFiona Trahe #define _QAT_SYM_H_
741287a7fSFiona Trahe 
8af668035SAkhil Goyal #include <cryptodev_pmd.h>
96f0ef237SDavid Coyle #include <rte_net_crc.h>
1098c4a35cSTomasz Jozwiak 
1198c4a35cSTomasz Jozwiak #ifdef BUILD_QAT_SYM
1262126a92SCiara Power #ifdef RTE_QAT_OPENSSL
1391614c73SFiona Trahe #include <openssl/evp.h>
1462126a92SCiara Power #endif
153f3fc330SAkhil Goyal #include <rte_security_driver.h>
1641287a7fSFiona Trahe 
1741287a7fSFiona Trahe #include "qat_common.h"
1891614c73SFiona Trahe #include "qat_sym_session.h"
19e0a67610SKai Ji #include "qat_crypto.h"
20ab8a58feSTomasz Jozwiak #include "qat_logs.h"
2191614c73SFiona Trahe 
2291614c73SFiona Trahe #define BYTE_LENGTH    8
2391614c73SFiona Trahe /* bpi is only used for partial blocks of DES and AES
2491614c73SFiona Trahe  * so AES block len can be assumed as max len for iv, src and dst
2591614c73SFiona Trahe  */
2691614c73SFiona Trahe #define BPI_MAX_ENCR_IV_LEN ICP_QAT_HW_AES_BLK_SZ
2741287a7fSFiona Trahe 
28e0a67610SKai Ji /** Intel(R) QAT Symmetric Crypto PMD name */
29e0a67610SKai Ji #define CRYPTODEV_NAME_QAT_SYM_PMD	crypto_qat
30e0a67610SKai Ji 
31e0a67610SKai Ji /* Internal capabilities */
32e0a67610SKai Ji #define QAT_SYM_CAP_MIXED_CRYPTO	(1 << 0)
33ce7a737cSKevin O'Sullivan #define QAT_SYM_CAP_CIPHER_CRC		(1 << 1)
34e0a67610SKai Ji #define QAT_SYM_CAP_VALID		(1 << 31)
35e0a67610SKai Ji 
36e0a67610SKai Ji /**
37e0a67610SKai Ji  * Macro to add a sym capability
38e0a67610SKai Ji  * helper function to add an sym capability
39e0a67610SKai Ji  * <n: name> <b: block size> <k: key size> <d: digest size>
40e0a67610SKai Ji  * <a: aad_size> <i: iv_size>
41e0a67610SKai Ji  **/
42e0a67610SKai Ji #define QAT_SYM_PLAIN_AUTH_CAP(n, b, d)					\
43e0a67610SKai Ji 	{								\
44e0a67610SKai Ji 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,			\
45e0a67610SKai Ji 		{.sym = {						\
46e0a67610SKai Ji 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,	\
47e0a67610SKai Ji 			{.auth = {					\
48e0a67610SKai Ji 				.algo = RTE_CRYPTO_AUTH_##n,		\
49e0a67610SKai Ji 				b, d					\
50e0a67610SKai Ji 			}, }						\
51e0a67610SKai Ji 		}, }							\
52e0a67610SKai Ji 	}
53e0a67610SKai Ji 
54e0a67610SKai Ji #define QAT_SYM_AUTH_CAP(n, b, k, d, a, i)				\
55e0a67610SKai Ji 	{								\
56e0a67610SKai Ji 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,			\
57e0a67610SKai Ji 		{.sym = {						\
58e0a67610SKai Ji 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,	\
59e0a67610SKai Ji 			{.auth = {					\
60e0a67610SKai Ji 				.algo = RTE_CRYPTO_AUTH_##n,		\
61e0a67610SKai Ji 				b, k, d, a, i				\
62e0a67610SKai Ji 			}, }						\
63e0a67610SKai Ji 		}, }							\
64e0a67610SKai Ji 	}
65e0a67610SKai Ji 
66e0a67610SKai Ji #define QAT_SYM_AEAD_CAP(n, b, k, d, a, i)				\
67e0a67610SKai Ji 	{								\
68e0a67610SKai Ji 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,			\
69e0a67610SKai Ji 		{.sym = {						\
70e0a67610SKai Ji 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,	\
71e0a67610SKai Ji 			{.aead = {					\
72e0a67610SKai Ji 				.algo = RTE_CRYPTO_AEAD_##n,		\
73e0a67610SKai Ji 				b, k, d, a, i				\
74e0a67610SKai Ji 			}, }						\
75e0a67610SKai Ji 		}, }							\
76e0a67610SKai Ji 	}
77e0a67610SKai Ji 
78e0a67610SKai Ji #define QAT_SYM_CIPHER_CAP(n, b, k, i)					\
79e0a67610SKai Ji 	{								\
80e0a67610SKai Ji 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,			\
81e0a67610SKai Ji 		{.sym = {						\
82e0a67610SKai Ji 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,	\
83e0a67610SKai Ji 			{.cipher = {					\
84e0a67610SKai Ji 				.algo = RTE_CRYPTO_CIPHER_##n,		\
85e0a67610SKai Ji 				b, k, i					\
86e0a67610SKai Ji 			}, }						\
87e0a67610SKai Ji 		}, }							\
88e0a67610SKai Ji 	}
89e0a67610SKai Ji 
90944027acSFiona Trahe /*
91944027acSFiona Trahe  * Maximum number of SGL entries
92944027acSFiona Trahe  */
93944027acSFiona Trahe #define QAT_SYM_SGL_MAX_NUMBER	16
94944027acSFiona Trahe 
9545fe9ea9SAdam Dybkowski /* Maximum data length for single pass GMAC: 2^14-1 */
9645fe9ea9SAdam Dybkowski #define QAT_AES_GMAC_SPC_MAX_SIZE 16383
9745fe9ea9SAdam Dybkowski 
98e9271821SNishikant Nayak /* Digest length for GCM Algo is 16 bytes */
99e9271821SNishikant Nayak #define GCM_256_DIGEST_LEN 16
100e9271821SNishikant Nayak 
101e9271821SNishikant Nayak /* IV length for GCM algo is 12 bytes */
102e9271821SNishikant Nayak #define GCM_IV_LENGTH_GEN_LCE 12
103e9271821SNishikant Nayak 
1046132b718SFiona Trahe struct qat_sym_session;
10541287a7fSFiona Trahe 
106*e7750639SAndre Muezerie struct __rte_cache_aligned __rte_packed_begin qat_sym_sgl {
107944027acSFiona Trahe 	qat_sgl_hdr;
108944027acSFiona Trahe 	struct qat_flat_buf buffers[QAT_SYM_SGL_MAX_NUMBER];
109*e7750639SAndre Muezerie } __rte_packed_end;
110944027acSFiona Trahe 
111571ffe23SFiona Trahe struct qat_sym_op_cookie {
112944027acSFiona Trahe 	struct qat_sym_sgl qat_sgl_src;
113944027acSFiona Trahe 	struct qat_sym_sgl qat_sgl_dst;
114571ffe23SFiona Trahe 	phys_addr_t qat_sgl_src_phys_addr;
115571ffe23SFiona Trahe 	phys_addr_t qat_sgl_dst_phys_addr;
11645fe9ea9SAdam Dybkowski 	union {
11745fe9ea9SAdam Dybkowski 		/* Used for Single-Pass AES-GMAC only */
11845fe9ea9SAdam Dybkowski 		struct {
119*e7750639SAndre Muezerie 			alignas(RTE_CACHE_LINE_SIZE) struct __rte_packed_begin
120*e7750639SAndre Muezerie 				icp_qat_hw_cipher_algo_blk cd_cipher __rte_packed_end;
12145fe9ea9SAdam Dybkowski 			phys_addr_t cd_phys_addr;
12245fe9ea9SAdam Dybkowski 		} spc_gmac;
12345fe9ea9SAdam Dybkowski 	} opt;
1248b4618a7SCiara Power 	uint8_t digest_null[4];
1258b4618a7SCiara Power 	phys_addr_t digest_null_phys_addr;
1260fda888bSSivaramakrishnan Venkat 	enum rte_crypto_op_status status;
127571ffe23SFiona Trahe };
128571ffe23SFiona Trahe 
129e0a67610SKai Ji struct qat_sym_dp_ctx {
130e0a67610SKai Ji 	struct qat_sym_session *session;
131e0a67610SKai Ji 	uint32_t tail;
132e0a67610SKai Ji 	uint32_t head;
133e0a67610SKai Ji 	uint16_t cached_enqueue;
134e0a67610SKai Ji 	uint16_t cached_dequeue;
135e0a67610SKai Ji };
136e0a67610SKai Ji 
137e0a67610SKai Ji uint16_t
138e0a67610SKai Ji qat_sym_enqueue_burst(void *qp, struct rte_crypto_op **ops,
139e0a67610SKai Ji 		uint16_t nb_ops);
140e0a67610SKai Ji 
141e0a67610SKai Ji uint16_t
142e0a67610SKai Ji qat_sym_dequeue_burst(void *qp, struct rte_crypto_op **ops,
143e0a67610SKai Ji 		uint16_t nb_ops);
144e0a67610SKai Ji 
145e2c11053SNishikant Nayak uint16_t
146e2c11053SNishikant Nayak qat_sym_dequeue_burst_gen_lce(void *qp, struct rte_crypto_op **ops, uint16_t nb_ops);
147e2c11053SNishikant Nayak 
14862126a92SCiara Power #ifdef RTE_QAT_OPENSSL
14991614c73SFiona Trahe /** Encrypt a single partial block
15091614c73SFiona Trahe  *  Depends on openssl libcrypto
15191614c73SFiona Trahe  *  Uses ECB+XOR to do CFB encryption, same result, more performant
15291614c73SFiona Trahe  */
15391614c73SFiona Trahe static inline int
15491614c73SFiona Trahe bpi_cipher_encrypt(uint8_t *src, uint8_t *dst,
15591614c73SFiona Trahe 		uint8_t *iv, int ivlen, int srclen,
15691614c73SFiona Trahe 		void *bpi_ctx)
15791614c73SFiona Trahe {
15891614c73SFiona Trahe 	EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX *)bpi_ctx;
15991614c73SFiona Trahe 	int encrypted_ivlen;
16091614c73SFiona Trahe 	uint8_t encrypted_iv[BPI_MAX_ENCR_IV_LEN];
16191614c73SFiona Trahe 	uint8_t *encr = encrypted_iv;
16291614c73SFiona Trahe 
16391614c73SFiona Trahe 	/* ECB method: encrypt the IV, then XOR this with plaintext */
16491614c73SFiona Trahe 	if (EVP_EncryptUpdate(ctx, encrypted_iv, &encrypted_ivlen, iv, ivlen)
16591614c73SFiona Trahe 								<= 0)
16691614c73SFiona Trahe 		goto cipher_encrypt_err;
16791614c73SFiona Trahe 
16891614c73SFiona Trahe 	for (; srclen != 0; --srclen, ++dst, ++src, ++encr)
16991614c73SFiona Trahe 		*dst = *src ^ *encr;
17091614c73SFiona Trahe 
17191614c73SFiona Trahe 	return 0;
17291614c73SFiona Trahe 
17391614c73SFiona Trahe cipher_encrypt_err:
174ab8a58feSTomasz Jozwiak 	QAT_DP_LOG(ERR, "libcrypto ECB cipher encrypt failed");
17591614c73SFiona Trahe 	return -EINVAL;
17691614c73SFiona Trahe }
17762126a92SCiara Power #else
178ca0ba0e4SBrian Dooley static __rte_always_inline void
179ca0ba0e4SBrian Dooley bpi_cipher_ipsec(uint8_t *src, uint8_t *dst, uint8_t *iv, int srclen,
180ca0ba0e4SBrian Dooley 		uint64_t *expkey, IMB_MGR *m, uint8_t docsis_key_len)
181ca0ba0e4SBrian Dooley {
182ca0ba0e4SBrian Dooley 	if (docsis_key_len == ICP_QAT_HW_AES_128_KEY_SZ)
183ca0ba0e4SBrian Dooley 		IMB_AES128_CFB_ONE(m, dst, src, (uint64_t *)iv, expkey, srclen);
184ca0ba0e4SBrian Dooley 	else if (docsis_key_len == ICP_QAT_HW_AES_256_KEY_SZ)
185ca0ba0e4SBrian Dooley 		IMB_AES256_CFB_ONE(m, dst, src, (uint64_t *)iv, expkey, srclen);
186ca0ba0e4SBrian Dooley 	else if (docsis_key_len == ICP_QAT_HW_DES_KEY_SZ)
187ca0ba0e4SBrian Dooley 		des_cfb_one(dst, src, (uint64_t *)iv, expkey, srclen);
188ca0ba0e4SBrian Dooley }
189ca0ba0e4SBrian Dooley #endif
190ca0ba0e4SBrian Dooley 
19191614c73SFiona Trahe static inline uint32_t
19291614c73SFiona Trahe qat_bpicipher_postprocess(struct qat_sym_session *ctx,
19391614c73SFiona Trahe 				struct rte_crypto_op *op)
19491614c73SFiona Trahe {
19591614c73SFiona Trahe 	int block_len = qat_cipher_get_block_size(ctx->qat_cipher_alg);
19691614c73SFiona Trahe 	struct rte_crypto_sym_op *sym_op = op->sym;
19791614c73SFiona Trahe 	uint8_t last_block_len = block_len > 0 ?
19891614c73SFiona Trahe 			sym_op->cipher.data.length % block_len : 0;
19991614c73SFiona Trahe 
20091614c73SFiona Trahe 	if (last_block_len > 0 &&
20191614c73SFiona Trahe 			ctx->qat_dir == ICP_QAT_HW_CIPHER_ENCRYPT) {
20291614c73SFiona Trahe 
20391614c73SFiona Trahe 		/* Encrypt last block */
20491614c73SFiona Trahe 		uint8_t *last_block, *dst, *iv;
20591614c73SFiona Trahe 		uint32_t last_block_offset;
20691614c73SFiona Trahe 
20791614c73SFiona Trahe 		last_block_offset = sym_op->cipher.data.offset +
20891614c73SFiona Trahe 				sym_op->cipher.data.length - last_block_len;
209e931ffa7SStephen Hemminger 		last_block = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *,
210e931ffa7SStephen Hemminger 						     last_block_offset);
21191614c73SFiona Trahe 
21291614c73SFiona Trahe 		if (unlikely(sym_op->m_dst != NULL))
21391614c73SFiona Trahe 			/* out-of-place operation (OOP) */
214e931ffa7SStephen Hemminger 			dst = rte_pktmbuf_mtod_offset(sym_op->m_dst,
215e931ffa7SStephen Hemminger 						      uint8_t *,
216e931ffa7SStephen Hemminger 						      last_block_offset);
21791614c73SFiona Trahe 		else
21891614c73SFiona Trahe 			dst = last_block;
21991614c73SFiona Trahe 
22091614c73SFiona Trahe 		if (last_block_len < sym_op->cipher.data.length)
22191614c73SFiona Trahe 			/* use previous block ciphertext as IV */
22291614c73SFiona Trahe 			iv = dst - block_len;
22391614c73SFiona Trahe 		else
22491614c73SFiona Trahe 			/* runt block, i.e. less than one full block */
22591614c73SFiona Trahe 			iv = rte_crypto_op_ctod_offset(op, uint8_t *,
22691614c73SFiona Trahe 					ctx->cipher_iv.offset);
22791614c73SFiona Trahe 
228ab8a58feSTomasz Jozwiak #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
229ab8a58feSTomasz Jozwiak 		QAT_DP_HEXDUMP_LOG(DEBUG, "BPI: src before post-process:",
230ab8a58feSTomasz Jozwiak 			last_block, last_block_len);
23191614c73SFiona Trahe 		if (sym_op->m_dst != NULL)
232ab8a58feSTomasz Jozwiak 			QAT_DP_HEXDUMP_LOG(DEBUG,
233ab8a58feSTomasz Jozwiak 				"BPI: dst before post-process:",
23491614c73SFiona Trahe 				dst, last_block_len);
23591614c73SFiona Trahe #endif
236ca0ba0e4SBrian Dooley #ifdef RTE_QAT_OPENSSL
23791614c73SFiona Trahe 		bpi_cipher_encrypt(last_block, dst, iv, block_len,
23891614c73SFiona Trahe 				last_block_len, ctx->bpi_ctx);
239ca0ba0e4SBrian Dooley #else
240ca0ba0e4SBrian Dooley 		bpi_cipher_ipsec(last_block, dst, iv, last_block_len, ctx->expkey,
241ca0ba0e4SBrian Dooley 			ctx->mb_mgr, ctx->docsis_key_len);
242ca0ba0e4SBrian Dooley #endif
243ab8a58feSTomasz Jozwiak #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
244ab8a58feSTomasz Jozwiak 		QAT_DP_HEXDUMP_LOG(DEBUG, "BPI: src after post-process:",
245ab8a58feSTomasz Jozwiak 				last_block, last_block_len);
24691614c73SFiona Trahe 		if (sym_op->m_dst != NULL)
247ab8a58feSTomasz Jozwiak 			QAT_DP_HEXDUMP_LOG(DEBUG,
248ab8a58feSTomasz Jozwiak 				"BPI: dst after post-process:",
249ab8a58feSTomasz Jozwiak 				dst, last_block_len);
25091614c73SFiona Trahe #endif
25191614c73SFiona Trahe 	}
25291614c73SFiona Trahe 	return sym_op->cipher.data.length - last_block_len;
25391614c73SFiona Trahe }
25491614c73SFiona Trahe 
2556f0ef237SDavid Coyle static inline void
2566f0ef237SDavid Coyle qat_crc_verify(struct qat_sym_session *ctx, struct rte_crypto_op *op)
2576f0ef237SDavid Coyle {
2586f0ef237SDavid Coyle 	struct rte_crypto_sym_op *sym_op = op->sym;
259979b07d8SDavid Coyle 	uint32_t crc_data_ofs, crc_data_len, crc;
2606f0ef237SDavid Coyle 	uint8_t *crc_data;
2616f0ef237SDavid Coyle 
2626f0ef237SDavid Coyle 	if (ctx->qat_dir == ICP_QAT_HW_CIPHER_DECRYPT &&
2636f0ef237SDavid Coyle 			sym_op->auth.data.length != 0) {
2646f0ef237SDavid Coyle 
265979b07d8SDavid Coyle 		crc_data_ofs = sym_op->auth.data.offset;
266979b07d8SDavid Coyle 		crc_data_len = sym_op->auth.data.length;
2676f0ef237SDavid Coyle 		crc_data = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *,
268979b07d8SDavid Coyle 				crc_data_ofs);
2696f0ef237SDavid Coyle 
270979b07d8SDavid Coyle 		crc = rte_net_crc_calc(crc_data, crc_data_len,
271979b07d8SDavid Coyle 				RTE_NET_CRC32_ETH);
2726f0ef237SDavid Coyle 
273979b07d8SDavid Coyle 		if (crc != *(uint32_t *)(crc_data + crc_data_len))
2746f0ef237SDavid Coyle 			op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
2756f0ef237SDavid Coyle 	}
2766f0ef237SDavid Coyle }
277012affe1SDavid Coyle 
278012affe1SDavid Coyle static inline void
279012affe1SDavid Coyle qat_crc_generate(struct qat_sym_session *ctx,
280012affe1SDavid Coyle 			struct rte_crypto_op *op)
281012affe1SDavid Coyle {
282012affe1SDavid Coyle 	struct rte_crypto_sym_op *sym_op = op->sym;
283012affe1SDavid Coyle 	uint32_t *crc, crc_data_len;
284012affe1SDavid Coyle 	uint8_t *crc_data;
285012affe1SDavid Coyle 
286012affe1SDavid Coyle 	if (ctx->qat_dir == ICP_QAT_HW_CIPHER_ENCRYPT &&
287012affe1SDavid Coyle 			sym_op->auth.data.length != 0 &&
288012affe1SDavid Coyle 			sym_op->m_src->nb_segs == 1) {
289012affe1SDavid Coyle 
290012affe1SDavid Coyle 		crc_data_len = sym_op->auth.data.length;
291012affe1SDavid Coyle 		crc_data = rte_pktmbuf_mtod_offset(sym_op->m_src, uint8_t *,
292012affe1SDavid Coyle 				sym_op->auth.data.offset);
293012affe1SDavid Coyle 		crc = (uint32_t *)(crc_data + crc_data_len);
294012affe1SDavid Coyle 		*crc = rte_net_crc_calc(crc_data, crc_data_len,
295012affe1SDavid Coyle 				RTE_NET_CRC32_ETH);
296012affe1SDavid Coyle 	}
297012affe1SDavid Coyle }
298012affe1SDavid Coyle 
299012affe1SDavid Coyle static inline void
300012affe1SDavid Coyle qat_sym_preprocess_requests(void **ops, uint16_t nb_ops)
301012affe1SDavid Coyle {
302012affe1SDavid Coyle 	struct rte_crypto_op *op;
303012affe1SDavid Coyle 	struct qat_sym_session *ctx;
304012affe1SDavid Coyle 	uint16_t i;
305012affe1SDavid Coyle 
306012affe1SDavid Coyle 	for (i = 0; i < nb_ops; i++) {
307012affe1SDavid Coyle 		op = (struct rte_crypto_op *)ops[i];
308012affe1SDavid Coyle 
309012affe1SDavid Coyle 		if (op->sess_type == RTE_CRYPTO_OP_SECURITY_SESSION) {
3102973dbf9SAkhil Goyal 			ctx = SECURITY_GET_SESS_PRIV(op->sym->session);
311012affe1SDavid Coyle 
312ca0ba0e4SBrian Dooley #ifdef RTE_QAT_OPENSSL
313012affe1SDavid Coyle 			if (ctx == NULL || ctx->bpi_ctx == NULL)
314ca0ba0e4SBrian Dooley #else
315ca0ba0e4SBrian Dooley 			if (ctx == NULL || ctx->mb_mgr == NULL)
316ca0ba0e4SBrian Dooley #endif
317012affe1SDavid Coyle 				continue;
318012affe1SDavid Coyle 
319ce7a737cSKevin O'Sullivan 			if (ctx->qat_cmd != ICP_QAT_FW_LA_CMD_CIPHER_CRC)
320012affe1SDavid Coyle 				qat_crc_generate(ctx, op);
321012affe1SDavid Coyle 		}
322012affe1SDavid Coyle 	}
323012affe1SDavid Coyle }
3246f0ef237SDavid Coyle 
325e0a67610SKai Ji static __rte_always_inline int
326e0a67610SKai Ji qat_sym_process_response(void **op, uint8_t *resp, void *op_cookie,
327e0a67610SKai Ji 		uint64_t *dequeue_err_count __rte_unused)
32891614c73SFiona Trahe {
32991614c73SFiona Trahe 	struct icp_qat_fw_comn_resp *resp_msg =
33091614c73SFiona Trahe 			(struct icp_qat_fw_comn_resp *)resp;
33191614c73SFiona Trahe 	struct rte_crypto_op *rx_op = (struct rte_crypto_op *)(uintptr_t)
33291614c73SFiona Trahe 			(resp_msg->opaque_data);
3336f0ef237SDavid Coyle 	struct qat_sym_session *sess;
33445fe9ea9SAdam Dybkowski 	uint8_t is_docsis_sec;
3350fda888bSSivaramakrishnan Venkat 	struct qat_sym_op_cookie *cookie = NULL;
33691614c73SFiona Trahe 
337ab8a58feSTomasz Jozwiak #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
338ab8a58feSTomasz Jozwiak 	QAT_DP_HEXDUMP_LOG(DEBUG, "qat_response:", (uint8_t *)resp_msg,
33991614c73SFiona Trahe 			sizeof(struct icp_qat_fw_comn_resp));
34091614c73SFiona Trahe #endif
34191614c73SFiona Trahe 
3426f0ef237SDavid Coyle 	if (rx_op->sess_type == RTE_CRYPTO_OP_SECURITY_SESSION) {
3436f0ef237SDavid Coyle 		/*
3446f0ef237SDavid Coyle 		 * Assuming at this point that if it's a security
3456f0ef237SDavid Coyle 		 * op, that this is for DOCSIS
3466f0ef237SDavid Coyle 		 */
3472973dbf9SAkhil Goyal 		sess = SECURITY_GET_SESS_PRIV(rx_op->sym->session);
3486f0ef237SDavid Coyle 		is_docsis_sec = 1;
34966a9d8d0SMaxime Coquelin 	} else {
3502a440d6aSAkhil Goyal 		sess = CRYPTODEV_GET_SYM_SESS_PRIV(rx_op->sym->session);
35145fe9ea9SAdam Dybkowski 		is_docsis_sec = 0;
3526f0ef237SDavid Coyle 	}
35391614c73SFiona Trahe 
35445fe9ea9SAdam Dybkowski 	if (ICP_QAT_FW_COMN_STATUS_FLAG_OK !=
35545fe9ea9SAdam Dybkowski 			ICP_QAT_FW_COMN_RESP_CRYPTO_STAT_GET(
35645fe9ea9SAdam Dybkowski 			resp_msg->comn_hdr.comn_status)) {
35745fe9ea9SAdam Dybkowski 
35845fe9ea9SAdam Dybkowski 		rx_op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
35945fe9ea9SAdam Dybkowski 	} else {
36091614c73SFiona Trahe 		rx_op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
3616f0ef237SDavid Coyle 
362ca0ba0e4SBrian Dooley #ifdef RTE_QAT_OPENSSL
3636f0ef237SDavid Coyle 		if (sess->bpi_ctx) {
364ca0ba0e4SBrian Dooley #else
365ca0ba0e4SBrian Dooley 		if (sess->mb_mgr) {
366ca0ba0e4SBrian Dooley #endif
3676f0ef237SDavid Coyle 			qat_bpicipher_postprocess(sess, rx_op);
368ce7a737cSKevin O'Sullivan 			if (is_docsis_sec && sess->qat_cmd !=
369ce7a737cSKevin O'Sullivan 						ICP_QAT_FW_LA_CMD_CIPHER_CRC)
3706f0ef237SDavid Coyle 				qat_crc_verify(sess, rx_op);
3716f0ef237SDavid Coyle 		}
37291614c73SFiona Trahe 	}
37345fe9ea9SAdam Dybkowski 
37445fe9ea9SAdam Dybkowski 	if (sess->is_single_pass_gmac) {
37545fe9ea9SAdam Dybkowski 		struct qat_sym_op_cookie *cookie =
37645fe9ea9SAdam Dybkowski 				(struct qat_sym_op_cookie *) op_cookie;
37745fe9ea9SAdam Dybkowski 		memset(cookie->opt.spc_gmac.cd_cipher.key, 0,
37845fe9ea9SAdam Dybkowski 				sess->auth_key_length);
37945fe9ea9SAdam Dybkowski 	}
38045fe9ea9SAdam Dybkowski 
3810fda888bSSivaramakrishnan Venkat 	cookie = (struct qat_sym_op_cookie *) op_cookie;
3820fda888bSSivaramakrishnan Venkat 	if (cookie->status == RTE_CRYPTO_OP_STATUS_INVALID_ARGS) {
3830fda888bSSivaramakrishnan Venkat 		rx_op->status = cookie->status;
3840fda888bSSivaramakrishnan Venkat 		cookie->status = 0;
3850fda888bSSivaramakrishnan Venkat 	}
3860fda888bSSivaramakrishnan Venkat 
38791614c73SFiona Trahe 	*op = (void *)rx_op;
388e0a67610SKai Ji 
389e0a67610SKai Ji 	/*
390e0a67610SKai Ji 	 * return 1 as dequeue op only move on to the next op
391e0a67610SKai Ji 	 * if one was ready to return to API
392e0a67610SKai Ji 	 */
393e0a67610SKai Ji 	return 1;
39491614c73SFiona Trahe }
395728c76b0SFan Zhang 
396e2c11053SNishikant Nayak static __rte_always_inline int
397e2c11053SNishikant Nayak qat_sym_process_response_gen_lce(void **op, uint8_t *resp, void *op_cookie __rte_unused,
398e2c11053SNishikant Nayak 		uint64_t *dequeue_err_count __rte_unused)
399e2c11053SNishikant Nayak {
400e2c11053SNishikant Nayak 	struct icp_qat_fw_comn_resp *resp_msg = (struct icp_qat_fw_comn_resp *)resp;
401e2c11053SNishikant Nayak 	struct rte_crypto_op *rx_op = (struct rte_crypto_op *)(uintptr_t) (resp_msg->opaque_data);
402e2c11053SNishikant Nayak 	struct qat_sym_session *sess;
403e2c11053SNishikant Nayak 
404e2c11053SNishikant Nayak #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
405e2c11053SNishikant Nayak 	QAT_DP_HEXDUMP_LOG(DEBUG, "qat_response:", (uint8_t *)resp_msg,
406e2c11053SNishikant Nayak 			sizeof(struct icp_qat_fw_comn_resp));
407e2c11053SNishikant Nayak #endif
408e2c11053SNishikant Nayak 
409e2c11053SNishikant Nayak 	sess = CRYPTODEV_GET_SYM_SESS_PRIV(rx_op->sym->session);
410e2c11053SNishikant Nayak 
411e2c11053SNishikant Nayak 	rx_op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
412e2c11053SNishikant Nayak 
413e2c11053SNishikant Nayak 	if (ICP_QAT_FW_COMN_STATUS_FLAG_OK != ICP_QAT_FW_COMN_RESP_UNSUPPORTED_REQUEST_STAT_GET(
414e2c11053SNishikant Nayak 			resp_msg->comn_hdr.comn_status))
415e2c11053SNishikant Nayak 		rx_op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
416e2c11053SNishikant Nayak 
417e2c11053SNishikant Nayak 	else if (ICP_QAT_FW_COMN_STATUS_FLAG_OK != ICP_QAT_FW_COMN_RESP_INVALID_PARAM_STAT_GET(
418e2c11053SNishikant Nayak 			resp_msg->comn_hdr.comn_status))
419e2c11053SNishikant Nayak 		rx_op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
420e2c11053SNishikant Nayak 
421e2c11053SNishikant Nayak 	if (sess->qat_dir == ICP_QAT_HW_CIPHER_DECRYPT) {
422e2c11053SNishikant Nayak 		if (ICP_QAT_FW_LA_VER_STATUS_FAIL == ICP_QAT_FW_COMN_RESP_CRYPTO_STAT_GET(
423e2c11053SNishikant Nayak 				resp_msg->comn_hdr.comn_status))
424e2c11053SNishikant Nayak 			rx_op->status =	RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
425e2c11053SNishikant Nayak 	}
426e2c11053SNishikant Nayak 
427e2c11053SNishikant Nayak 	*op = (void *)rx_op;
428e2c11053SNishikant Nayak 
429e2c11053SNishikant Nayak 	/*
430e2c11053SNishikant Nayak 	 * return 1 as dequeue op only move on to the next op
431e2c11053SNishikant Nayak 	 * if one was ready to return to API
432e2c11053SNishikant Nayak 	 */
433e2c11053SNishikant Nayak 	return 1;
434e2c11053SNishikant Nayak }
435e2c11053SNishikant Nayak 
436728c76b0SFan Zhang int
437728c76b0SFan Zhang qat_sym_configure_dp_ctx(struct rte_cryptodev *dev, uint16_t qp_id,
438728c76b0SFan Zhang 	struct rte_crypto_raw_dp_ctx *raw_dp_ctx,
439728c76b0SFan Zhang 	enum rte_crypto_op_sess_type sess_type,
440728c76b0SFan Zhang 	union rte_cryptodev_session_ctx session_ctx, uint8_t is_update);
441728c76b0SFan Zhang 
442728c76b0SFan Zhang int
443728c76b0SFan Zhang qat_sym_get_dp_ctx_size(struct rte_cryptodev *dev);
444728c76b0SFan Zhang 
445e0a67610SKai Ji void
446e0a67610SKai Ji qat_sym_init_op_cookie(void *cookie);
447e0a67610SKai Ji 
448e0a67610SKai Ji #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
449e0a67610SKai Ji static __rte_always_inline void
450e0a67610SKai Ji qat_sym_debug_log_dump(struct icp_qat_fw_la_bulk_req *qat_req,
451e0a67610SKai Ji 		struct qat_sym_session *ctx,
452e0a67610SKai Ji 		struct rte_crypto_vec *vec, uint32_t vec_len,
453e0a67610SKai Ji 		struct rte_crypto_va_iova_ptr *cipher_iv,
454e0a67610SKai Ji 		struct rte_crypto_va_iova_ptr *auth_iv,
455e0a67610SKai Ji 		struct rte_crypto_va_iova_ptr *aad,
456e0a67610SKai Ji 		struct rte_crypto_va_iova_ptr *digest)
457e0a67610SKai Ji {
458e0a67610SKai Ji 	uint32_t i;
459e0a67610SKai Ji 
460e0a67610SKai Ji 	QAT_DP_HEXDUMP_LOG(DEBUG, "qat_req:", qat_req,
461e0a67610SKai Ji 			sizeof(struct icp_qat_fw_la_bulk_req));
462e0a67610SKai Ji 	for (i = 0; i < vec_len; i++)
463e0a67610SKai Ji 		QAT_DP_HEXDUMP_LOG(DEBUG, "src_data:", vec[i].base, vec[i].len);
464e0a67610SKai Ji 	if (cipher_iv && ctx->cipher_iv.length > 0)
465e0a67610SKai Ji 		QAT_DP_HEXDUMP_LOG(DEBUG, "cipher iv:", cipher_iv->va,
466e0a67610SKai Ji 				ctx->cipher_iv.length);
467e0a67610SKai Ji 	if (auth_iv && ctx->auth_iv.length > 0)
468e0a67610SKai Ji 		QAT_DP_HEXDUMP_LOG(DEBUG, "auth iv:", auth_iv->va,
469e0a67610SKai Ji 				ctx->auth_iv.length);
470e0a67610SKai Ji 	if (aad && ctx->aad_len > 0)
471e0a67610SKai Ji 		QAT_DP_HEXDUMP_LOG(DEBUG, "aad:", aad->va,
472e0a67610SKai Ji 				ctx->aad_len);
473e0a67610SKai Ji 	if (digest && ctx->digest_length > 0)
474e0a67610SKai Ji 		QAT_DP_HEXDUMP_LOG(DEBUG, "digest:", digest->va,
475e0a67610SKai Ji 				ctx->digest_length);
476e0a67610SKai Ji }
477e0a67610SKai Ji #else
478e0a67610SKai Ji static __rte_always_inline void
479e0a67610SKai Ji qat_sym_debug_log_dump(struct icp_qat_fw_la_bulk_req *qat_req __rte_unused,
480e0a67610SKai Ji 		struct qat_sym_session *ctx __rte_unused,
481e0a67610SKai Ji 		struct rte_crypto_vec *vec __rte_unused,
482e0a67610SKai Ji 		uint32_t vec_len __rte_unused,
483e0a67610SKai Ji 		struct rte_crypto_va_iova_ptr *cipher_iv __rte_unused,
484e0a67610SKai Ji 		struct rte_crypto_va_iova_ptr *auth_iv __rte_unused,
485e0a67610SKai Ji 		struct rte_crypto_va_iova_ptr *aad __rte_unused,
486e0a67610SKai Ji 		struct rte_crypto_va_iova_ptr *digest __rte_unused)
487e0a67610SKai Ji {
488e0a67610SKai Ji }
489e0a67610SKai Ji #endif
490e0a67610SKai Ji 
49198c4a35cSTomasz Jozwiak #else
4924a147730STomasz Jozwiak 
49398c4a35cSTomasz Jozwiak static inline void
494012affe1SDavid Coyle qat_sym_preprocess_requests(void **ops __rte_unused,
495012affe1SDavid Coyle 				uint16_t nb_ops __rte_unused)
496012affe1SDavid Coyle {
497012affe1SDavid Coyle }
498012affe1SDavid Coyle 
499012affe1SDavid Coyle static inline void
50045fe9ea9SAdam Dybkowski qat_sym_process_response(void **op __rte_unused, uint8_t *resp __rte_unused,
501e2c11053SNishikant Nayak 	void *op_cookie __rte_unused, uint64_t *dequeue_err_count __rte_unused)
502e2c11053SNishikant Nayak {
503e2c11053SNishikant Nayak }
504e2c11053SNishikant Nayak 
505e2c11053SNishikant Nayak static inline void
506e2c11053SNishikant Nayak qat_sym_process_response_gen_lce(void **op __rte_unused, uint8_t *resp __rte_unused,
507e2c11053SNishikant Nayak 	void *op_cookie __rte_unused, uint64_t *dequeue_err_count __rte_unused)
50898c4a35cSTomasz Jozwiak {
50998c4a35cSTomasz Jozwiak }
510728c76b0SFan Zhang 
511e0a67610SKai Ji #endif /* BUILD_QAT_SYM */
512bba31cffSFiona Trahe #endif /* _QAT_SYM_H_ */
513