10c4546deSFan Zhang /* SPDX-License-Identifier: BSD-3-Clause
2254558c8SKai Ji * Copyright(c) 2017-2022 Intel Corporation
30c4546deSFan Zhang */
40c4546deSFan Zhang
50c4546deSFan Zhang #include <rte_cryptodev.h>
60c4546deSFan Zhang #include <cryptodev_pmd.h>
70c4546deSFan Zhang #include "qat_sym_session.h"
80c4546deSFan Zhang #include "qat_sym.h"
90c4546deSFan Zhang #include "qat_asym.h"
100c4546deSFan Zhang #include "qat_crypto.h"
110c4546deSFan Zhang #include "qat_crypto_pmd_gens.h"
120c4546deSFan Zhang
13cffb726bSVikash Poddar
14cffb726bSVikash Poddar static struct rte_cryptodev_capabilities qat_sym_crypto_legacy_caps_gen3[] = {
15cffb726bSVikash Poddar QAT_SYM_CIPHER_CAP(3DES_CBC,
16cffb726bSVikash Poddar CAP_SET(block_size, 8),
17cffb726bSVikash Poddar CAP_RNG(key_size, 8, 24, 8), CAP_RNG(iv_size, 8, 8, 0)),
18cffb726bSVikash Poddar QAT_SYM_CIPHER_CAP(DES_CBC,
19cffb726bSVikash Poddar CAP_SET(block_size, 8),
20cffb726bSVikash Poddar CAP_RNG(key_size, 8, 24, 8), CAP_RNG(iv_size, 8, 8, 0)),
21cffb726bSVikash Poddar QAT_SYM_CIPHER_CAP(3DES_CTR,
22cffb726bSVikash Poddar CAP_SET(block_size, 8),
23cffb726bSVikash Poddar CAP_RNG(key_size, 16, 24, 8), CAP_RNG(iv_size, 8, 8, 0)),
240c4546deSFan Zhang QAT_SYM_PLAIN_AUTH_CAP(SHA1,
250c4546deSFan Zhang CAP_SET(block_size, 64),
260c4546deSFan Zhang CAP_RNG(digest_size, 1, 20, 1)),
27cffb726bSVikash Poddar QAT_SYM_AUTH_CAP(SHA224,
28cffb726bSVikash Poddar CAP_SET(block_size, 64),
29cffb726bSVikash Poddar CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 28, 1),
30cffb726bSVikash Poddar CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
31cffb726bSVikash Poddar QAT_SYM_AUTH_CAP(SHA224_HMAC,
32cffb726bSVikash Poddar CAP_SET(block_size, 64),
33cffb726bSVikash Poddar CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 28, 1),
34cffb726bSVikash Poddar CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
35cffb726bSVikash Poddar QAT_SYM_AUTH_CAP(SHA1_HMAC,
36cffb726bSVikash Poddar CAP_SET(block_size, 64),
37cffb726bSVikash Poddar CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 20, 1),
38cffb726bSVikash Poddar CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
39cffb726bSVikash Poddar QAT_SYM_AUTH_CAP(MD5_HMAC,
40cffb726bSVikash Poddar CAP_SET(block_size, 64),
41cffb726bSVikash Poddar CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 16, 1),
42cffb726bSVikash Poddar CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
43cffb726bSVikash Poddar QAT_SYM_CIPHER_CAP(DES_DOCSISBPI,
44cffb726bSVikash Poddar CAP_SET(block_size, 8),
45cffb726bSVikash Poddar CAP_RNG(key_size, 8, 8, 0), CAP_RNG(iv_size, 8, 8, 0)),
46cffb726bSVikash Poddar QAT_SYM_PLAIN_AUTH_CAP(SHA3_224,
47cffb726bSVikash Poddar CAP_SET(block_size, 144),
48cffb726bSVikash Poddar CAP_RNG(digest_size, 28, 28, 0)),
49dd0132e9SCiara Power QAT_SYM_CIPHER_CAP(SM4_ECB,
50dd0132e9SCiara Power CAP_SET(block_size, 16),
51dd0132e9SCiara Power CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 0, 0, 0))
52cffb726bSVikash Poddar };
53cffb726bSVikash Poddar
54cffb726bSVikash Poddar static struct rte_cryptodev_capabilities qat_sym_crypto_caps_gen3[] = {
550c4546deSFan Zhang QAT_SYM_AEAD_CAP(AES_GCM,
560c4546deSFan Zhang CAP_SET(block_size, 16),
570c4546deSFan Zhang CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4),
580c4546deSFan Zhang CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 0, 12, 12)),
590c4546deSFan Zhang QAT_SYM_AEAD_CAP(AES_CCM,
600c4546deSFan Zhang CAP_SET(block_size, 16),
610c4546deSFan Zhang CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 2),
620c4546deSFan Zhang CAP_RNG(aad_size, 0, 224, 1), CAP_RNG(iv_size, 7, 13, 1)),
630c4546deSFan Zhang QAT_SYM_AUTH_CAP(AES_GMAC,
640c4546deSFan Zhang CAP_SET(block_size, 16),
650c4546deSFan Zhang CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4),
660c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 0, 12, 12)),
670c4546deSFan Zhang QAT_SYM_AUTH_CAP(AES_CMAC,
680c4546deSFan Zhang CAP_SET(block_size, 16),
690c4546deSFan Zhang CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 4),
700c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
710c4546deSFan Zhang QAT_SYM_AUTH_CAP(SHA256,
720c4546deSFan Zhang CAP_SET(block_size, 64),
730c4546deSFan Zhang CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 32, 1),
740c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
750c4546deSFan Zhang QAT_SYM_AUTH_CAP(SHA384,
760c4546deSFan Zhang CAP_SET(block_size, 128),
770c4546deSFan Zhang CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 48, 1),
780c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
790c4546deSFan Zhang QAT_SYM_AUTH_CAP(SHA512,
800c4546deSFan Zhang CAP_SET(block_size, 128),
810c4546deSFan Zhang CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 64, 1),
820c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
833a80d7fbSCiara Power QAT_SYM_PLAIN_AUTH_CAP(SHA3_256,
843a80d7fbSCiara Power CAP_SET(block_size, 136),
853a80d7fbSCiara Power CAP_RNG(digest_size, 32, 32, 0)),
863a80d7fbSCiara Power QAT_SYM_PLAIN_AUTH_CAP(SHA3_384,
873a80d7fbSCiara Power CAP_SET(block_size, 104),
883a80d7fbSCiara Power CAP_RNG(digest_size, 48, 48, 0)),
893a80d7fbSCiara Power QAT_SYM_PLAIN_AUTH_CAP(SHA3_512,
903a80d7fbSCiara Power CAP_SET(block_size, 72),
913a80d7fbSCiara Power CAP_RNG(digest_size, 64, 64, 0)),
920c4546deSFan Zhang QAT_SYM_AUTH_CAP(SHA256_HMAC,
930c4546deSFan Zhang CAP_SET(block_size, 64),
940c4546deSFan Zhang CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 32, 1),
950c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
960c4546deSFan Zhang QAT_SYM_AUTH_CAP(SHA384_HMAC,
970c4546deSFan Zhang CAP_SET(block_size, 128),
980c4546deSFan Zhang CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 48, 1),
990c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
1000c4546deSFan Zhang QAT_SYM_AUTH_CAP(SHA512_HMAC,
1010c4546deSFan Zhang CAP_SET(block_size, 128),
1020c4546deSFan Zhang CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 64, 1),
1030c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
1040c4546deSFan Zhang QAT_SYM_AUTH_CAP(AES_XCBC_MAC,
1050c4546deSFan Zhang CAP_SET(block_size, 16),
1060c4546deSFan Zhang CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 12, 12, 0),
1070c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
1080c4546deSFan Zhang QAT_SYM_AUTH_CAP(SNOW3G_UIA2,
1090c4546deSFan Zhang CAP_SET(block_size, 16),
1100c4546deSFan Zhang CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0),
1110c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 16, 16, 0)),
1120c4546deSFan Zhang QAT_SYM_AUTH_CAP(KASUMI_F9,
1130c4546deSFan Zhang CAP_SET(block_size, 8),
1140c4546deSFan Zhang CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0),
1150c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
1160c4546deSFan Zhang QAT_SYM_AUTH_CAP(NULL,
1170c4546deSFan Zhang CAP_SET(block_size, 1),
1180c4546deSFan Zhang CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(digest_size),
1190c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
1200c4546deSFan Zhang QAT_SYM_CIPHER_CAP(AES_CBC,
1210c4546deSFan Zhang CAP_SET(block_size, 16),
1220c4546deSFan Zhang CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)),
1230c4546deSFan Zhang QAT_SYM_CIPHER_CAP(AES_CTR,
1240c4546deSFan Zhang CAP_SET(block_size, 16),
1250c4546deSFan Zhang CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)),
1260c4546deSFan Zhang QAT_SYM_CIPHER_CAP(AES_XTS,
1270c4546deSFan Zhang CAP_SET(block_size, 16),
1280c4546deSFan Zhang CAP_RNG(key_size, 32, 64, 32), CAP_RNG(iv_size, 16, 16, 0)),
1290c4546deSFan Zhang QAT_SYM_CIPHER_CAP(AES_DOCSISBPI,
1300c4546deSFan Zhang CAP_SET(block_size, 16),
1310c4546deSFan Zhang CAP_RNG(key_size, 16, 32, 16), CAP_RNG(iv_size, 16, 16, 0)),
1320c4546deSFan Zhang QAT_SYM_CIPHER_CAP(SNOW3G_UEA2,
1330c4546deSFan Zhang CAP_SET(block_size, 16),
1340c4546deSFan Zhang CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)),
1350c4546deSFan Zhang QAT_SYM_CIPHER_CAP(KASUMI_F8,
1360c4546deSFan Zhang CAP_SET(block_size, 8),
1370c4546deSFan Zhang CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 8, 8, 0)),
1380c4546deSFan Zhang QAT_SYM_CIPHER_CAP(NULL,
1390c4546deSFan Zhang CAP_SET(block_size, 1),
1400c4546deSFan Zhang CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(iv_size)),
1410c4546deSFan Zhang QAT_SYM_CIPHER_CAP(ZUC_EEA3,
1420c4546deSFan Zhang CAP_SET(block_size, 16),
1430c4546deSFan Zhang CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)),
1440c4546deSFan Zhang QAT_SYM_AUTH_CAP(ZUC_EIA3,
1450c4546deSFan Zhang CAP_SET(block_size, 16),
1460c4546deSFan Zhang CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0),
1470c4546deSFan Zhang CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 16, 16, 0)),
1480c4546deSFan Zhang QAT_SYM_AEAD_CAP(CHACHA20_POLY1305,
1490c4546deSFan Zhang CAP_SET(block_size, 64),
1500c4546deSFan Zhang CAP_RNG(key_size, 32, 32, 0),
1510c4546deSFan Zhang CAP_RNG(digest_size, 16, 16, 0),
1520c4546deSFan Zhang CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 12, 12, 0)),
15392522c84SArek Kusztal QAT_SYM_CIPHER_CAP(SM4_CBC,
15492522c84SArek Kusztal CAP_SET(block_size, 16),
15592522c84SArek Kusztal CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)),
15692522c84SArek Kusztal QAT_SYM_CIPHER_CAP(SM4_CTR,
15792522c84SArek Kusztal CAP_SET(block_size, 16),
15892522c84SArek Kusztal CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)),
1596291de62SCiara Power QAT_SYM_PLAIN_AUTH_CAP(SM3,
1606291de62SCiara Power CAP_SET(block_size, 64),
1616291de62SCiara Power CAP_RNG(digest_size, 32, 32, 0)),
162171c655bSArkadiusz Kusztal QAT_SYM_AUTH_CAP(SM3_HMAC,
163171c655bSArkadiusz Kusztal CAP_SET(block_size, 64),
164171c655bSArkadiusz Kusztal CAP_RNG(key_size, 16, 64, 4), CAP_RNG(digest_size, 32, 32, 0),
165171c655bSArkadiusz Kusztal CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
1660c4546deSFan Zhang RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
1670c4546deSFan Zhang };
1680c4546deSFan Zhang
169b6ac58aeSArek Kusztal static int
check_cipher_capa(const struct rte_cryptodev_capabilities * cap,enum rte_crypto_cipher_algorithm algo)170b6ac58aeSArek Kusztal check_cipher_capa(const struct rte_cryptodev_capabilities *cap,
171b6ac58aeSArek Kusztal enum rte_crypto_cipher_algorithm algo)
1720c4546deSFan Zhang {
173b6ac58aeSArek Kusztal if (cap->op != RTE_CRYPTO_OP_TYPE_SYMMETRIC)
174b6ac58aeSArek Kusztal return 0;
175b6ac58aeSArek Kusztal if (cap->sym.xform_type != RTE_CRYPTO_SYM_XFORM_CIPHER)
176b6ac58aeSArek Kusztal return 0;
177b6ac58aeSArek Kusztal if (cap->sym.cipher.algo != algo)
178b6ac58aeSArek Kusztal return 0;
179b6ac58aeSArek Kusztal return 1;
180b6ac58aeSArek Kusztal }
181b6ac58aeSArek Kusztal
182b6ac58aeSArek Kusztal static int
check_auth_capa(const struct rte_cryptodev_capabilities * cap,enum rte_crypto_auth_algorithm algo)183b6ac58aeSArek Kusztal check_auth_capa(const struct rte_cryptodev_capabilities *cap,
184b6ac58aeSArek Kusztal enum rte_crypto_auth_algorithm algo)
185b6ac58aeSArek Kusztal {
186b6ac58aeSArek Kusztal if (cap->op != RTE_CRYPTO_OP_TYPE_SYMMETRIC)
187b6ac58aeSArek Kusztal return 0;
188b6ac58aeSArek Kusztal if (cap->sym.xform_type != RTE_CRYPTO_SYM_XFORM_AUTH)
189b6ac58aeSArek Kusztal return 0;
190b6ac58aeSArek Kusztal if (cap->sym.auth.algo != algo)
191b6ac58aeSArek Kusztal return 0;
192b6ac58aeSArek Kusztal return 1;
193b6ac58aeSArek Kusztal }
194b6ac58aeSArek Kusztal
195b6ac58aeSArek Kusztal static int
qat_sym_crypto_cap_get_gen3(struct qat_cryptodev_private * internals,const char * capa_memz_name,const uint16_t slice_map)196b6ac58aeSArek Kusztal qat_sym_crypto_cap_get_gen3(struct qat_cryptodev_private *internals,
197b6ac58aeSArek Kusztal const char *capa_memz_name, const uint16_t slice_map)
198b6ac58aeSArek Kusztal {
199cffb726bSVikash Poddar
200cffb726bSVikash Poddar uint32_t i, iter = 0;
201cffb726bSVikash Poddar uint32_t curr_capa = 0;
202cffb726bSVikash Poddar uint32_t capa_num, legacy_capa_num;
203cffb726bSVikash Poddar uint32_t size = sizeof(qat_sym_crypto_caps_gen3);
204cffb726bSVikash Poddar uint32_t legacy_size = sizeof(qat_sym_crypto_legacy_caps_gen3);
205cffb726bSVikash Poddar capa_num = size/sizeof(struct rte_cryptodev_capabilities);
206cffb726bSVikash Poddar legacy_capa_num = legacy_size/sizeof(struct rte_cryptodev_capabilities);
2076c868d6eSCiara Power struct rte_cryptodev_capabilities *cap;
208cffb726bSVikash Poddar
209*b7bd72d8SArkadiusz Kusztal if (unlikely(internals->qat_dev->options.legacy_alg))
210cffb726bSVikash Poddar size = size + legacy_size;
211b6ac58aeSArek Kusztal
212b6ac58aeSArek Kusztal internals->capa_mz = rte_memzone_lookup(capa_memz_name);
213b6ac58aeSArek Kusztal if (internals->capa_mz == NULL) {
214b6ac58aeSArek Kusztal internals->capa_mz = rte_memzone_reserve(capa_memz_name,
215b6ac58aeSArek Kusztal size, rte_socket_id(), 0);
216b6ac58aeSArek Kusztal if (internals->capa_mz == NULL) {
217b6ac58aeSArek Kusztal QAT_LOG(DEBUG,
218b6ac58aeSArek Kusztal "Error allocating memzone for capabilities");
219b6ac58aeSArek Kusztal return -1;
220b6ac58aeSArek Kusztal }
221b6ac58aeSArek Kusztal }
222b6ac58aeSArek Kusztal
223b6ac58aeSArek Kusztal struct rte_cryptodev_capabilities *addr =
224b6ac58aeSArek Kusztal (struct rte_cryptodev_capabilities *)
225b6ac58aeSArek Kusztal internals->capa_mz->addr;
226cffb726bSVikash Poddar struct rte_cryptodev_capabilities *capabilities;
227b6ac58aeSArek Kusztal
228*b7bd72d8SArkadiusz Kusztal if (unlikely(internals->qat_dev->options.legacy_alg)) {
229cffb726bSVikash Poddar capabilities = qat_sym_crypto_legacy_caps_gen3;
230cffb726bSVikash Poddar capa_num += legacy_capa_num;
231cffb726bSVikash Poddar } else {
232cffb726bSVikash Poddar capabilities = qat_sym_crypto_caps_gen3;
233cffb726bSVikash Poddar }
234cffb726bSVikash Poddar
235cffb726bSVikash Poddar for (i = 0; i < capa_num; i++, iter++) {
236*b7bd72d8SArkadiusz Kusztal if (unlikely(internals->qat_dev->options.legacy_alg) &&
237*b7bd72d8SArkadiusz Kusztal (i == legacy_capa_num)) {
238c191ed8eSCiara Power capabilities = qat_sym_crypto_caps_gen3;
239c191ed8eSCiara Power addr += curr_capa;
240c191ed8eSCiara Power curr_capa = 0;
241c191ed8eSCiara Power iter = 0;
242c191ed8eSCiara Power }
243c191ed8eSCiara Power
244b6ac58aeSArek Kusztal if (slice_map & ICP_ACCEL_MASK_SM4_SLICE && (
245cffb726bSVikash Poddar check_cipher_capa(&capabilities[iter],
246b6ac58aeSArek Kusztal RTE_CRYPTO_CIPHER_SM4_ECB) ||
247cffb726bSVikash Poddar check_cipher_capa(&capabilities[iter],
248b6ac58aeSArek Kusztal RTE_CRYPTO_CIPHER_SM4_CBC) ||
249cffb726bSVikash Poddar check_cipher_capa(&capabilities[iter],
250b6ac58aeSArek Kusztal RTE_CRYPTO_CIPHER_SM4_CTR))) {
251b6ac58aeSArek Kusztal continue;
252b6ac58aeSArek Kusztal }
253b6ac58aeSArek Kusztal if (slice_map & ICP_ACCEL_MASK_SM3_SLICE && (
254cffb726bSVikash Poddar check_auth_capa(&capabilities[iter],
255ef4458c8SSivaramakrishnan Venkat RTE_CRYPTO_AUTH_SM3) ||
256ef4458c8SSivaramakrishnan Venkat check_auth_capa(&capabilities[iter],
257ef4458c8SSivaramakrishnan Venkat RTE_CRYPTO_AUTH_SM3_HMAC))) {
258b6ac58aeSArek Kusztal continue;
259b6ac58aeSArek Kusztal }
2606c868d6eSCiara Power
2616c868d6eSCiara Power if (slice_map & ICP_ACCEL_MASK_ZUC_256_SLICE && (
2626c868d6eSCiara Power check_auth_capa(&capabilities[iter],
2636c868d6eSCiara Power RTE_CRYPTO_AUTH_ZUC_EIA3) ||
2646c868d6eSCiara Power check_cipher_capa(&capabilities[iter],
2656c868d6eSCiara Power RTE_CRYPTO_CIPHER_ZUC_EEA3))) {
2666c868d6eSCiara Power continue;
2676c868d6eSCiara Power }
2686c868d6eSCiara Power
269*b7bd72d8SArkadiusz Kusztal if (internals->qat_dev->options.has_wireless_slice && (
270f925068aSCiara Power check_auth_capa(&capabilities[iter],
271f925068aSCiara Power RTE_CRYPTO_AUTH_KASUMI_F9) ||
272f925068aSCiara Power check_cipher_capa(&capabilities[iter],
273f925068aSCiara Power RTE_CRYPTO_CIPHER_KASUMI_F8) ||
274f925068aSCiara Power check_cipher_capa(&capabilities[iter],
275f925068aSCiara Power RTE_CRYPTO_CIPHER_DES_CBC) ||
276f925068aSCiara Power check_cipher_capa(&capabilities[iter],
277f925068aSCiara Power RTE_CRYPTO_CIPHER_DES_DOCSISBPI)))
278f925068aSCiara Power continue;
279f925068aSCiara Power
280cffb726bSVikash Poddar memcpy(addr + curr_capa, capabilities + iter,
281b6ac58aeSArek Kusztal sizeof(struct rte_cryptodev_capabilities));
2826c868d6eSCiara Power
283*b7bd72d8SArkadiusz Kusztal if (internals->qat_dev->options.has_wireless_slice && (
2846c868d6eSCiara Power check_auth_capa(&capabilities[iter],
2856c868d6eSCiara Power RTE_CRYPTO_AUTH_ZUC_EIA3))) {
2866c868d6eSCiara Power cap = addr + curr_capa;
2876c868d6eSCiara Power cap->sym.auth.key_size.max = 32;
2886c868d6eSCiara Power cap->sym.auth.key_size.increment = 16;
2896c868d6eSCiara Power cap->sym.auth.iv_size.max = 25;
2906c868d6eSCiara Power cap->sym.auth.iv_size.increment = 1;
2916c868d6eSCiara Power cap->sym.auth.digest_size.max = 16;
2926c868d6eSCiara Power cap->sym.auth.digest_size.increment = 4;
2936c868d6eSCiara Power }
294*b7bd72d8SArkadiusz Kusztal if (internals->qat_dev->options.has_wireless_slice && (
2956c868d6eSCiara Power check_cipher_capa(&capabilities[iter],
2966c868d6eSCiara Power RTE_CRYPTO_CIPHER_ZUC_EEA3))) {
2976c868d6eSCiara Power cap = addr + curr_capa;
2986c868d6eSCiara Power cap->sym.cipher.key_size.max = 32;
2996c868d6eSCiara Power cap->sym.cipher.key_size.increment = 16;
3006c868d6eSCiara Power cap->sym.cipher.iv_size.max = 25;
3016c868d6eSCiara Power cap->sym.cipher.iv_size.increment = 1;
3026c868d6eSCiara Power }
303b6ac58aeSArek Kusztal curr_capa++;
304b6ac58aeSArek Kusztal }
305b6ac58aeSArek Kusztal internals->qat_dev_capabilities = internals->capa_mz->addr;
306b6ac58aeSArek Kusztal
307b6ac58aeSArek Kusztal return 0;
3080c4546deSFan Zhang }
3090c4546deSFan Zhang
310254558c8SKai Ji static __rte_always_inline void
enqueue_one_aead_job_gen3(struct qat_sym_session * ctx,struct icp_qat_fw_la_bulk_req * req,struct rte_crypto_va_iova_ptr * iv,struct rte_crypto_va_iova_ptr * digest,struct rte_crypto_va_iova_ptr * aad,union rte_crypto_sym_ofs ofs,uint32_t data_len)311254558c8SKai Ji enqueue_one_aead_job_gen3(struct qat_sym_session *ctx,
312254558c8SKai Ji struct icp_qat_fw_la_bulk_req *req,
313254558c8SKai Ji struct rte_crypto_va_iova_ptr *iv,
314254558c8SKai Ji struct rte_crypto_va_iova_ptr *digest,
315254558c8SKai Ji struct rte_crypto_va_iova_ptr *aad,
316254558c8SKai Ji union rte_crypto_sym_ofs ofs, uint32_t data_len)
317254558c8SKai Ji {
318254558c8SKai Ji if (ctx->is_single_pass) {
319254558c8SKai Ji struct icp_qat_fw_la_cipher_req_params *cipher_param =
320254558c8SKai Ji (void *)&req->serv_specif_rqpars;
321254558c8SKai Ji
322254558c8SKai Ji /* QAT GEN3 uses single pass to treat AEAD as
323254558c8SKai Ji * cipher operation
324254558c8SKai Ji */
325254558c8SKai Ji cipher_param = (void *)&req->serv_specif_rqpars;
326254558c8SKai Ji
327254558c8SKai Ji qat_set_cipher_iv(cipher_param, iv, ctx->cipher_iv.length, req);
328254558c8SKai Ji cipher_param->cipher_offset = ofs.ofs.cipher.head;
329254558c8SKai Ji cipher_param->cipher_length = data_len - ofs.ofs.cipher.head -
330254558c8SKai Ji ofs.ofs.cipher.tail;
331254558c8SKai Ji
332254558c8SKai Ji cipher_param->spc_aad_addr = aad->iova;
333254558c8SKai Ji cipher_param->spc_auth_res_addr = digest->iova;
334254558c8SKai Ji
335254558c8SKai Ji return;
336254558c8SKai Ji }
337254558c8SKai Ji
338254558c8SKai Ji enqueue_one_aead_job_gen1(ctx, req, iv, digest, aad, ofs, data_len);
339254558c8SKai Ji }
340254558c8SKai Ji
341254558c8SKai Ji static __rte_always_inline void
enqueue_one_auth_job_gen3(struct qat_sym_session * ctx,struct qat_sym_op_cookie * cookie,struct icp_qat_fw_la_bulk_req * req,struct rte_crypto_va_iova_ptr * digest,struct rte_crypto_va_iova_ptr * auth_iv,union rte_crypto_sym_ofs ofs,uint32_t data_len)342254558c8SKai Ji enqueue_one_auth_job_gen3(struct qat_sym_session *ctx,
343254558c8SKai Ji struct qat_sym_op_cookie *cookie,
344254558c8SKai Ji struct icp_qat_fw_la_bulk_req *req,
345254558c8SKai Ji struct rte_crypto_va_iova_ptr *digest,
346254558c8SKai Ji struct rte_crypto_va_iova_ptr *auth_iv,
347254558c8SKai Ji union rte_crypto_sym_ofs ofs, uint32_t data_len)
348254558c8SKai Ji {
349254558c8SKai Ji struct icp_qat_fw_cipher_cd_ctrl_hdr *cipher_cd_ctrl;
350254558c8SKai Ji struct icp_qat_fw_la_cipher_req_params *cipher_param;
351254558c8SKai Ji uint32_t ver_key_offset;
352254558c8SKai Ji uint32_t auth_data_len = data_len - ofs.ofs.auth.head -
353254558c8SKai Ji ofs.ofs.auth.tail;
354254558c8SKai Ji
355254558c8SKai Ji if (!ctx->is_single_pass_gmac ||
356254558c8SKai Ji (auth_data_len > QAT_AES_GMAC_SPC_MAX_SIZE)) {
357254558c8SKai Ji enqueue_one_auth_job_gen1(ctx, req, digest, auth_iv, ofs,
358254558c8SKai Ji data_len);
359254558c8SKai Ji return;
360254558c8SKai Ji }
361254558c8SKai Ji
362254558c8SKai Ji cipher_cd_ctrl = (void *) &req->cd_ctrl;
363254558c8SKai Ji cipher_param = (void *)&req->serv_specif_rqpars;
364254558c8SKai Ji ver_key_offset = sizeof(struct icp_qat_hw_auth_setup) +
365254558c8SKai Ji ICP_QAT_HW_GALOIS_128_STATE1_SZ +
366254558c8SKai Ji ICP_QAT_HW_GALOIS_H_SZ + ICP_QAT_HW_GALOIS_LEN_A_SZ +
367254558c8SKai Ji ICP_QAT_HW_GALOIS_E_CTR0_SZ +
368254558c8SKai Ji sizeof(struct icp_qat_hw_cipher_config);
369254558c8SKai Ji
370254558c8SKai Ji if (ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_GALOIS_128 ||
371254558c8SKai Ji ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_GALOIS_64) {
372254558c8SKai Ji /* AES-GMAC */
373254558c8SKai Ji qat_set_cipher_iv(cipher_param, auth_iv, ctx->auth_iv.length,
374254558c8SKai Ji req);
375254558c8SKai Ji }
376254558c8SKai Ji
377254558c8SKai Ji /* Fill separate Content Descriptor for this op */
378254558c8SKai Ji rte_memcpy(cookie->opt.spc_gmac.cd_cipher.key,
379254558c8SKai Ji ctx->auth_op == ICP_QAT_HW_AUTH_GENERATE ?
380254558c8SKai Ji ctx->cd.cipher.key :
381254558c8SKai Ji RTE_PTR_ADD(&ctx->cd, ver_key_offset),
382254558c8SKai Ji ctx->auth_key_length);
383254558c8SKai Ji cookie->opt.spc_gmac.cd_cipher.cipher_config.val =
384254558c8SKai Ji ICP_QAT_HW_CIPHER_CONFIG_BUILD(
385254558c8SKai Ji ICP_QAT_HW_CIPHER_AEAD_MODE,
386254558c8SKai Ji ctx->qat_cipher_alg,
387254558c8SKai Ji ICP_QAT_HW_CIPHER_NO_CONVERT,
388254558c8SKai Ji (ctx->auth_op == ICP_QAT_HW_AUTH_GENERATE ?
389254558c8SKai Ji ICP_QAT_HW_CIPHER_ENCRYPT :
390254558c8SKai Ji ICP_QAT_HW_CIPHER_DECRYPT));
391254558c8SKai Ji QAT_FIELD_SET(cookie->opt.spc_gmac.cd_cipher.cipher_config.val,
392254558c8SKai Ji ctx->digest_length,
393254558c8SKai Ji QAT_CIPHER_AEAD_HASH_CMP_LEN_BITPOS,
394254558c8SKai Ji QAT_CIPHER_AEAD_HASH_CMP_LEN_MASK);
395254558c8SKai Ji cookie->opt.spc_gmac.cd_cipher.cipher_config.reserved =
396254558c8SKai Ji ICP_QAT_HW_CIPHER_CONFIG_BUILD_UPPER(auth_data_len);
397254558c8SKai Ji
398254558c8SKai Ji /* Update the request */
399254558c8SKai Ji req->cd_pars.u.s.content_desc_addr =
400254558c8SKai Ji cookie->opt.spc_gmac.cd_phys_addr;
401254558c8SKai Ji req->cd_pars.u.s.content_desc_params_sz = RTE_ALIGN_CEIL(
402254558c8SKai Ji sizeof(struct icp_qat_hw_cipher_config) +
403254558c8SKai Ji ctx->auth_key_length, 8) >> 3;
404254558c8SKai Ji req->comn_mid.src_length = data_len;
405254558c8SKai Ji req->comn_mid.dst_length = 0;
406254558c8SKai Ji
407254558c8SKai Ji cipher_param->spc_aad_addr = 0;
408254558c8SKai Ji cipher_param->spc_auth_res_addr = digest->iova;
409254558c8SKai Ji cipher_param->spc_aad_sz = auth_data_len;
410254558c8SKai Ji cipher_param->reserved = 0;
411254558c8SKai Ji cipher_param->spc_auth_res_sz = ctx->digest_length;
412254558c8SKai Ji
413254558c8SKai Ji req->comn_hdr.service_cmd_id = ICP_QAT_FW_LA_CMD_CIPHER;
414254558c8SKai Ji cipher_cd_ctrl->cipher_cfg_offset = 0;
415254558c8SKai Ji ICP_QAT_FW_COMN_CURR_ID_SET(cipher_cd_ctrl, ICP_QAT_FW_SLICE_CIPHER);
416254558c8SKai Ji ICP_QAT_FW_COMN_NEXT_ID_SET(cipher_cd_ctrl, ICP_QAT_FW_SLICE_DRAM_WR);
417254558c8SKai Ji ICP_QAT_FW_LA_SINGLE_PASS_PROTO_FLAG_SET(
418254558c8SKai Ji req->comn_hdr.serv_specif_flags,
419254558c8SKai Ji ICP_QAT_FW_LA_SINGLE_PASS_PROTO);
420254558c8SKai Ji ICP_QAT_FW_LA_PROTO_SET(
421254558c8SKai Ji req->comn_hdr.serv_specif_flags,
422254558c8SKai Ji ICP_QAT_FW_LA_NO_PROTO);
423254558c8SKai Ji }
424254558c8SKai Ji
425254558c8SKai Ji static int
qat_sym_build_op_aead_gen3(void * in_op,struct qat_sym_session * ctx,uint8_t * out_msg,void * op_cookie)426254558c8SKai Ji qat_sym_build_op_aead_gen3(void *in_op, struct qat_sym_session *ctx,
427254558c8SKai Ji uint8_t *out_msg, void *op_cookie)
428254558c8SKai Ji {
429254558c8SKai Ji register struct icp_qat_fw_la_bulk_req *req;
430254558c8SKai Ji struct rte_crypto_op *op = in_op;
431254558c8SKai Ji struct qat_sym_op_cookie *cookie = op_cookie;
432254558c8SKai Ji struct rte_crypto_sgl in_sgl, out_sgl;
433254558c8SKai Ji struct rte_crypto_vec in_vec[QAT_SYM_SGL_MAX_NUMBER],
434254558c8SKai Ji out_vec[QAT_SYM_SGL_MAX_NUMBER];
435254558c8SKai Ji struct rte_crypto_va_iova_ptr cipher_iv;
436254558c8SKai Ji struct rte_crypto_va_iova_ptr aad;
437254558c8SKai Ji struct rte_crypto_va_iova_ptr digest;
438254558c8SKai Ji union rte_crypto_sym_ofs ofs;
439254558c8SKai Ji int32_t total_len;
440254558c8SKai Ji
441254558c8SKai Ji in_sgl.vec = in_vec;
442254558c8SKai Ji out_sgl.vec = out_vec;
443254558c8SKai Ji
444254558c8SKai Ji req = (struct icp_qat_fw_la_bulk_req *)out_msg;
445254558c8SKai Ji rte_mov128((uint8_t *)req, (const uint8_t *)&(ctx->fw_req));
446254558c8SKai Ji
447254558c8SKai Ji ofs.raw = qat_sym_convert_op_to_vec_aead(op, ctx, &in_sgl, &out_sgl,
448254558c8SKai Ji &cipher_iv, &aad, &digest);
449254558c8SKai Ji if (unlikely(ofs.raw == UINT64_MAX)) {
450254558c8SKai Ji op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
451254558c8SKai Ji return -EINVAL;
452254558c8SKai Ji }
453254558c8SKai Ji
454254558c8SKai Ji total_len = qat_sym_build_req_set_data(req, in_op, cookie,
455254558c8SKai Ji in_sgl.vec, in_sgl.num, out_sgl.vec, out_sgl.num);
456254558c8SKai Ji if (unlikely(total_len < 0)) {
457254558c8SKai Ji op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
458254558c8SKai Ji return -EINVAL;
459254558c8SKai Ji }
460254558c8SKai Ji
461254558c8SKai Ji enqueue_one_aead_job_gen3(ctx, req, &cipher_iv, &digest, &aad, ofs,
462254558c8SKai Ji total_len);
463254558c8SKai Ji
464254558c8SKai Ji qat_sym_debug_log_dump(req, ctx, in_sgl.vec, in_sgl.num, &cipher_iv,
465254558c8SKai Ji NULL, &aad, &digest);
466254558c8SKai Ji
467254558c8SKai Ji return 0;
468254558c8SKai Ji }
469254558c8SKai Ji
470254558c8SKai Ji static int
qat_sym_build_op_auth_gen3(void * in_op,struct qat_sym_session * ctx,uint8_t * out_msg,void * op_cookie)471254558c8SKai Ji qat_sym_build_op_auth_gen3(void *in_op, struct qat_sym_session *ctx,
472254558c8SKai Ji uint8_t *out_msg, void *op_cookie)
473254558c8SKai Ji {
474254558c8SKai Ji register struct icp_qat_fw_la_bulk_req *req;
475254558c8SKai Ji struct rte_crypto_op *op = in_op;
476254558c8SKai Ji struct qat_sym_op_cookie *cookie = op_cookie;
477254558c8SKai Ji struct rte_crypto_sgl in_sgl, out_sgl;
478254558c8SKai Ji struct rte_crypto_vec in_vec[QAT_SYM_SGL_MAX_NUMBER],
479254558c8SKai Ji out_vec[QAT_SYM_SGL_MAX_NUMBER];
480254558c8SKai Ji struct rte_crypto_va_iova_ptr auth_iv;
481254558c8SKai Ji struct rte_crypto_va_iova_ptr digest;
482254558c8SKai Ji union rte_crypto_sym_ofs ofs;
483254558c8SKai Ji int32_t total_len;
484254558c8SKai Ji
485254558c8SKai Ji in_sgl.vec = in_vec;
486254558c8SKai Ji out_sgl.vec = out_vec;
487254558c8SKai Ji
488254558c8SKai Ji req = (struct icp_qat_fw_la_bulk_req *)out_msg;
489254558c8SKai Ji rte_mov128((uint8_t *)req, (const uint8_t *)&(ctx->fw_req));
490254558c8SKai Ji
491254558c8SKai Ji ofs.raw = qat_sym_convert_op_to_vec_auth(op, ctx, &in_sgl, &out_sgl,
4928b4618a7SCiara Power NULL, &auth_iv, &digest, op_cookie);
493254558c8SKai Ji if (unlikely(ofs.raw == UINT64_MAX)) {
494254558c8SKai Ji op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
495254558c8SKai Ji return -EINVAL;
496254558c8SKai Ji }
497254558c8SKai Ji
498254558c8SKai Ji total_len = qat_sym_build_req_set_data(req, in_op, cookie,
499254558c8SKai Ji in_sgl.vec, in_sgl.num, out_sgl.vec, out_sgl.num);
500254558c8SKai Ji if (unlikely(total_len < 0)) {
501254558c8SKai Ji op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
502254558c8SKai Ji return -EINVAL;
503254558c8SKai Ji }
504254558c8SKai Ji
505254558c8SKai Ji enqueue_one_auth_job_gen3(ctx, cookie, req, &digest, &auth_iv,
506254558c8SKai Ji ofs, total_len);
507254558c8SKai Ji
508254558c8SKai Ji qat_sym_debug_log_dump(req, ctx, in_sgl.vec, in_sgl.num, NULL,
509254558c8SKai Ji &auth_iv, NULL, &digest);
510254558c8SKai Ji
511254558c8SKai Ji return 0;
512254558c8SKai Ji }
513254558c8SKai Ji
514254558c8SKai Ji static int
qat_sym_crypto_set_session_gen3(void * cdev,void * session)5156c868d6eSCiara Power qat_sym_crypto_set_session_gen3(void *cdev, void *session)
516254558c8SKai Ji {
517254558c8SKai Ji struct qat_sym_session *ctx = session;
518254558c8SKai Ji enum rte_proc_type_t proc_type = rte_eal_process_type();
519254558c8SKai Ji int ret;
5206c868d6eSCiara Power struct qat_cryptodev_private *internals;
5216c868d6eSCiara Power
5226c868d6eSCiara Power internals = ((struct rte_cryptodev *)cdev)->data->dev_private;
523254558c8SKai Ji
5241df04571SKai Ji if (proc_type == RTE_PROC_AUTO || proc_type == RTE_PROC_INVALID)
5251df04571SKai Ji return -EINVAL;
5261df04571SKai Ji
527254558c8SKai Ji ret = qat_sym_crypto_set_session_gen1(cdev, session);
528254558c8SKai Ji /* special single pass build request for GEN3 */
529254558c8SKai Ji if (ctx->is_single_pass)
530254558c8SKai Ji ctx->build_request[proc_type] = qat_sym_build_op_aead_gen3;
531254558c8SKai Ji else if (ctx->is_single_pass_gmac)
532254558c8SKai Ji ctx->build_request[proc_type] = qat_sym_build_op_auth_gen3;
533254558c8SKai Ji
534254558c8SKai Ji if (ret == -ENOTSUP) {
535254558c8SKai Ji /* GEN1 returning -ENOTSUP as it cannot handle some mixed algo,
536254558c8SKai Ji * this is addressed by GEN3
537254558c8SKai Ji */
538254558c8SKai Ji if (ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 &&
539254558c8SKai Ji ctx->qat_cipher_alg !=
540254558c8SKai Ji ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3) {
541254558c8SKai Ji qat_sym_session_set_ext_hash_flags_gen2(ctx,
542254558c8SKai Ji 1 << ICP_QAT_FW_AUTH_HDR_FLAG_ZUC_EIA3_BITPOS);
543254558c8SKai Ji } else if (ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 &&
544254558c8SKai Ji ctx->qat_cipher_alg !=
545254558c8SKai Ji ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2) {
546254558c8SKai Ji qat_sym_session_set_ext_hash_flags_gen2(ctx,
547254558c8SKai Ji 1 << ICP_QAT_FW_AUTH_HDR_FLAG_SNOW3G_UIA2_BITPOS);
548254558c8SKai Ji } else if ((ctx->aes_cmac ||
549254558c8SKai Ji ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_NULL) &&
550254558c8SKai Ji (ctx->qat_cipher_alg ==
551254558c8SKai Ji ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 ||
552254558c8SKai Ji ctx->qat_cipher_alg ==
553254558c8SKai Ji ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3)) {
554254558c8SKai Ji qat_sym_session_set_ext_hash_flags_gen2(ctx, 0);
555*b7bd72d8SArkadiusz Kusztal } else if ((internals->qat_dev->options.has_wireless_slice) &&
5566c868d6eSCiara Power ((ctx->aes_cmac ||
5576c868d6eSCiara Power ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_NULL) &&
5586c868d6eSCiara Power (ctx->qat_cipher_alg ==
5596c868d6eSCiara Power ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 ||
5606c868d6eSCiara Power ctx->qat_cipher_alg ==
5616c868d6eSCiara Power ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ||
5626c868d6eSCiara Power ctx->qat_cipher_alg == ICP_QAT_HW_CIPHER_ALGO_ZUC_256))) {
5636c868d6eSCiara Power qat_sym_session_set_ext_hash_flags_gen2(ctx, 0);
564*b7bd72d8SArkadiusz Kusztal } else if ((internals->qat_dev->options.has_wireless_slice) &&
5656c868d6eSCiara Power (ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_ZUC_256_MAC_32 ||
5666c868d6eSCiara Power ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_ZUC_256_MAC_64 ||
5676c868d6eSCiara Power ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_ZUC_256_MAC_128) &&
5686c868d6eSCiara Power ctx->qat_cipher_alg != ICP_QAT_HW_CIPHER_ALGO_ZUC_256) {
5696c868d6eSCiara Power qat_sym_session_set_ext_hash_flags_gen2(ctx,
5706c868d6eSCiara Power 1 << ICP_QAT_FW_AUTH_HDR_FLAG_ZUC_EIA3_BITPOS);
571254558c8SKai Ji }
572254558c8SKai Ji
573254558c8SKai Ji ret = 0;
574254558c8SKai Ji }
575254558c8SKai Ji
576254558c8SKai Ji return ret;
577254558c8SKai Ji }
578254558c8SKai Ji
57985fec6fdSKai Ji static int
qat_sym_dp_enqueue_single_aead_gen3(void * qp_data,uint8_t * drv_ctx,struct rte_crypto_vec * data,uint16_t n_data_vecs,union rte_crypto_sym_ofs ofs,struct rte_crypto_va_iova_ptr * iv,struct rte_crypto_va_iova_ptr * digest,struct rte_crypto_va_iova_ptr * aad,void * user_data)58085fec6fdSKai Ji qat_sym_dp_enqueue_single_aead_gen3(void *qp_data, uint8_t *drv_ctx,
58185fec6fdSKai Ji struct rte_crypto_vec *data, uint16_t n_data_vecs,
58285fec6fdSKai Ji union rte_crypto_sym_ofs ofs,
58385fec6fdSKai Ji struct rte_crypto_va_iova_ptr *iv,
58485fec6fdSKai Ji struct rte_crypto_va_iova_ptr *digest,
58585fec6fdSKai Ji struct rte_crypto_va_iova_ptr *aad,
58685fec6fdSKai Ji void *user_data)
58785fec6fdSKai Ji {
58885fec6fdSKai Ji struct qat_qp *qp = qp_data;
58985fec6fdSKai Ji struct qat_sym_dp_ctx *dp_ctx = (void *)drv_ctx;
59085fec6fdSKai Ji struct qat_queue *tx_queue = &qp->tx_q;
59185fec6fdSKai Ji struct qat_sym_op_cookie *cookie;
59285fec6fdSKai Ji struct qat_sym_session *ctx = dp_ctx->session;
59385fec6fdSKai Ji struct icp_qat_fw_la_bulk_req *req;
59485fec6fdSKai Ji
59585fec6fdSKai Ji int32_t data_len;
59685fec6fdSKai Ji uint32_t tail = dp_ctx->tail;
59785fec6fdSKai Ji
59885fec6fdSKai Ji req = (struct icp_qat_fw_la_bulk_req *)(
59985fec6fdSKai Ji (uint8_t *)tx_queue->base_addr + tail);
60085fec6fdSKai Ji cookie = qp->op_cookies[tail >> tx_queue->trailz];
60185fec6fdSKai Ji tail = (tail + tx_queue->msg_size) & tx_queue->modulo_mask;
60285fec6fdSKai Ji rte_mov128((uint8_t *)req, (const uint8_t *)&(ctx->fw_req));
60385fec6fdSKai Ji rte_prefetch0((uint8_t *)tx_queue->base_addr + tail);
60485fec6fdSKai Ji data_len = qat_sym_build_req_set_data(req, user_data, cookie,
60585fec6fdSKai Ji data, n_data_vecs, NULL, 0);
60685fec6fdSKai Ji if (unlikely(data_len < 0))
60785fec6fdSKai Ji return -1;
60885fec6fdSKai Ji
60985fec6fdSKai Ji enqueue_one_aead_job_gen3(ctx, req, iv, digest, aad, ofs,
61085fec6fdSKai Ji (uint32_t)data_len);
61185fec6fdSKai Ji
61285fec6fdSKai Ji dp_ctx->tail = tail;
61385fec6fdSKai Ji dp_ctx->cached_enqueue++;
61485fec6fdSKai Ji
61585fec6fdSKai Ji qat_sym_debug_log_dump(req, ctx, data, n_data_vecs, iv,
61685fec6fdSKai Ji NULL, aad, digest);
617ba02a9f6SMaxime Coquelin
61885fec6fdSKai Ji return 0;
61985fec6fdSKai Ji }
62085fec6fdSKai Ji
62185fec6fdSKai Ji static uint32_t
qat_sym_dp_enqueue_aead_jobs_gen3(void * qp_data,uint8_t * drv_ctx,struct rte_crypto_sym_vec * vec,union rte_crypto_sym_ofs ofs,void * user_data[],int * status)62285fec6fdSKai Ji qat_sym_dp_enqueue_aead_jobs_gen3(void *qp_data, uint8_t *drv_ctx,
62385fec6fdSKai Ji struct rte_crypto_sym_vec *vec, union rte_crypto_sym_ofs ofs,
62485fec6fdSKai Ji void *user_data[], int *status)
62585fec6fdSKai Ji {
62685fec6fdSKai Ji struct qat_qp *qp = qp_data;
62785fec6fdSKai Ji struct qat_sym_dp_ctx *dp_ctx = (void *)drv_ctx;
62885fec6fdSKai Ji struct qat_queue *tx_queue = &qp->tx_q;
62985fec6fdSKai Ji struct qat_sym_session *ctx = dp_ctx->session;
63085fec6fdSKai Ji uint32_t i, n;
63185fec6fdSKai Ji uint32_t tail;
63285fec6fdSKai Ji struct icp_qat_fw_la_bulk_req *req;
63385fec6fdSKai Ji int32_t data_len;
63485fec6fdSKai Ji
63585fec6fdSKai Ji n = QAT_SYM_DP_GET_MAX_ENQ(qp, dp_ctx->cached_enqueue, vec->num);
63685fec6fdSKai Ji if (unlikely(n == 0)) {
63785fec6fdSKai Ji qat_sym_dp_fill_vec_status(vec->status, -1, vec->num);
63885fec6fdSKai Ji *status = 0;
63985fec6fdSKai Ji return 0;
64085fec6fdSKai Ji }
64185fec6fdSKai Ji
64285fec6fdSKai Ji tail = dp_ctx->tail;
64385fec6fdSKai Ji
64485fec6fdSKai Ji for (i = 0; i < n; i++) {
64585fec6fdSKai Ji struct qat_sym_op_cookie *cookie =
64685fec6fdSKai Ji qp->op_cookies[tail >> tx_queue->trailz];
64785fec6fdSKai Ji
64885fec6fdSKai Ji req = (struct icp_qat_fw_la_bulk_req *)(
64985fec6fdSKai Ji (uint8_t *)tx_queue->base_addr + tail);
65085fec6fdSKai Ji rte_mov128((uint8_t *)req, (const uint8_t *)&(ctx->fw_req));
65185fec6fdSKai Ji
652ff01b26fSKai Ji if (vec->dest_sgl) {
653ff01b26fSKai Ji data_len = qat_sym_build_req_set_data(req,
654ff01b26fSKai Ji user_data[i], cookie,
655ff01b26fSKai Ji vec->src_sgl[i].vec, vec->src_sgl[i].num,
656ff01b26fSKai Ji vec->dest_sgl[i].vec, vec->dest_sgl[i].num);
657ff01b26fSKai Ji } else {
658ff01b26fSKai Ji data_len = qat_sym_build_req_set_data(req,
659ff01b26fSKai Ji user_data[i], cookie,
660ff01b26fSKai Ji vec->src_sgl[i].vec,
661ff01b26fSKai Ji vec->src_sgl[i].num, NULL, 0);
662ff01b26fSKai Ji }
663ff01b26fSKai Ji
66485fec6fdSKai Ji if (unlikely(data_len < 0))
66585fec6fdSKai Ji break;
66685fec6fdSKai Ji
66785fec6fdSKai Ji enqueue_one_aead_job_gen3(ctx, req, &vec->iv[i],
66885fec6fdSKai Ji &vec->digest[i], &vec->aad[i], ofs,
66985fec6fdSKai Ji (uint32_t)data_len);
67085fec6fdSKai Ji
67185fec6fdSKai Ji tail = (tail + tx_queue->msg_size) & tx_queue->modulo_mask;
67285fec6fdSKai Ji
67385fec6fdSKai Ji qat_sym_debug_log_dump(req, ctx, vec->src_sgl[i].vec,
67485fec6fdSKai Ji vec->src_sgl[i].num, &vec->iv[i], NULL,
67585fec6fdSKai Ji &vec->aad[i], &vec->digest[i]);
67685fec6fdSKai Ji }
67785fec6fdSKai Ji
67885fec6fdSKai Ji if (unlikely(i < n))
67985fec6fdSKai Ji qat_sym_dp_fill_vec_status(vec->status + i, -1, n - i);
68085fec6fdSKai Ji
68185fec6fdSKai Ji dp_ctx->tail = tail;
68285fec6fdSKai Ji dp_ctx->cached_enqueue += i;
68385fec6fdSKai Ji *status = 0;
68485fec6fdSKai Ji return i;
68585fec6fdSKai Ji }
68685fec6fdSKai Ji
68785fec6fdSKai Ji static int
qat_sym_dp_enqueue_single_auth_gen3(void * qp_data,uint8_t * drv_ctx,struct rte_crypto_vec * data,uint16_t n_data_vecs,union rte_crypto_sym_ofs ofs,struct rte_crypto_va_iova_ptr * iv __rte_unused,struct rte_crypto_va_iova_ptr * digest,struct rte_crypto_va_iova_ptr * auth_iv,void * user_data)68885fec6fdSKai Ji qat_sym_dp_enqueue_single_auth_gen3(void *qp_data, uint8_t *drv_ctx,
68985fec6fdSKai Ji struct rte_crypto_vec *data, uint16_t n_data_vecs,
69085fec6fdSKai Ji union rte_crypto_sym_ofs ofs,
69185fec6fdSKai Ji struct rte_crypto_va_iova_ptr *iv __rte_unused,
69285fec6fdSKai Ji struct rte_crypto_va_iova_ptr *digest,
69385fec6fdSKai Ji struct rte_crypto_va_iova_ptr *auth_iv,
69485fec6fdSKai Ji void *user_data)
69585fec6fdSKai Ji {
69685fec6fdSKai Ji struct qat_qp *qp = qp_data;
69785fec6fdSKai Ji struct qat_sym_dp_ctx *dp_ctx = (void *)drv_ctx;
69885fec6fdSKai Ji struct qat_queue *tx_queue = &qp->tx_q;
69985fec6fdSKai Ji struct qat_sym_op_cookie *cookie;
70085fec6fdSKai Ji struct qat_sym_session *ctx = dp_ctx->session;
70185fec6fdSKai Ji struct icp_qat_fw_la_bulk_req *req;
70285fec6fdSKai Ji int32_t data_len;
70385fec6fdSKai Ji uint32_t tail = dp_ctx->tail;
704d7d52b37SCiara Power struct rte_crypto_va_iova_ptr null_digest;
705d7d52b37SCiara Power struct rte_crypto_va_iova_ptr *job_digest = digest;
70685fec6fdSKai Ji
70785fec6fdSKai Ji req = (struct icp_qat_fw_la_bulk_req *)(
70885fec6fdSKai Ji (uint8_t *)tx_queue->base_addr + tail);
70985fec6fdSKai Ji cookie = qp->op_cookies[tail >> tx_queue->trailz];
71085fec6fdSKai Ji tail = (tail + tx_queue->msg_size) & tx_queue->modulo_mask;
71185fec6fdSKai Ji
71285fec6fdSKai Ji rte_mov128((uint8_t *)req, (const uint8_t *)&(ctx->fw_req));
71385fec6fdSKai Ji rte_prefetch0((uint8_t *)tx_queue->base_addr + tail);
71485fec6fdSKai Ji data_len = qat_sym_build_req_set_data(req, user_data, cookie,
71585fec6fdSKai Ji data, n_data_vecs, NULL, 0);
71685fec6fdSKai Ji if (unlikely(data_len < 0))
71785fec6fdSKai Ji return -1;
71885fec6fdSKai Ji
719d7d52b37SCiara Power if (ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_NULL) {
720d7d52b37SCiara Power null_digest.iova = cookie->digest_null_phys_addr;
721d7d52b37SCiara Power job_digest = &null_digest;
722d7d52b37SCiara Power }
723d7d52b37SCiara Power
724d7d52b37SCiara Power enqueue_one_auth_job_gen3(ctx, cookie, req, job_digest, auth_iv, ofs,
72585fec6fdSKai Ji (uint32_t)data_len);
72685fec6fdSKai Ji
72785fec6fdSKai Ji dp_ctx->tail = tail;
72885fec6fdSKai Ji dp_ctx->cached_enqueue++;
72985fec6fdSKai Ji
73085fec6fdSKai Ji return 0;
73185fec6fdSKai Ji }
73285fec6fdSKai Ji
73385fec6fdSKai Ji static uint32_t
qat_sym_dp_enqueue_auth_jobs_gen3(void * qp_data,uint8_t * drv_ctx,struct rte_crypto_sym_vec * vec,union rte_crypto_sym_ofs ofs,void * user_data[],int * status)73485fec6fdSKai Ji qat_sym_dp_enqueue_auth_jobs_gen3(void *qp_data, uint8_t *drv_ctx,
73585fec6fdSKai Ji struct rte_crypto_sym_vec *vec, union rte_crypto_sym_ofs ofs,
73685fec6fdSKai Ji void *user_data[], int *status)
73785fec6fdSKai Ji {
73885fec6fdSKai Ji struct qat_qp *qp = qp_data;
73985fec6fdSKai Ji struct qat_sym_dp_ctx *dp_ctx = (void *)drv_ctx;
74085fec6fdSKai Ji struct qat_queue *tx_queue = &qp->tx_q;
74185fec6fdSKai Ji struct qat_sym_session *ctx = dp_ctx->session;
74285fec6fdSKai Ji uint32_t i, n;
74385fec6fdSKai Ji uint32_t tail;
74485fec6fdSKai Ji struct icp_qat_fw_la_bulk_req *req;
74585fec6fdSKai Ji int32_t data_len;
746d7d52b37SCiara Power struct rte_crypto_va_iova_ptr null_digest;
747d7d52b37SCiara Power struct rte_crypto_va_iova_ptr *job_digest = NULL;
74885fec6fdSKai Ji
74985fec6fdSKai Ji n = QAT_SYM_DP_GET_MAX_ENQ(qp, dp_ctx->cached_enqueue, vec->num);
75085fec6fdSKai Ji if (unlikely(n == 0)) {
75185fec6fdSKai Ji qat_sym_dp_fill_vec_status(vec->status, -1, vec->num);
75285fec6fdSKai Ji *status = 0;
75385fec6fdSKai Ji return 0;
75485fec6fdSKai Ji }
75585fec6fdSKai Ji
75685fec6fdSKai Ji tail = dp_ctx->tail;
75785fec6fdSKai Ji
75885fec6fdSKai Ji for (i = 0; i < n; i++) {
75985fec6fdSKai Ji struct qat_sym_op_cookie *cookie =
76085fec6fdSKai Ji qp->op_cookies[tail >> tx_queue->trailz];
76185fec6fdSKai Ji
76285fec6fdSKai Ji req = (struct icp_qat_fw_la_bulk_req *)(
76385fec6fdSKai Ji (uint8_t *)tx_queue->base_addr + tail);
76485fec6fdSKai Ji rte_mov128((uint8_t *)req, (const uint8_t *)&(ctx->fw_req));
76585fec6fdSKai Ji
766ff01b26fSKai Ji if (vec->dest_sgl) {
767ff01b26fSKai Ji data_len = qat_sym_build_req_set_data(req,
768ff01b26fSKai Ji user_data[i], cookie,
769ff01b26fSKai Ji vec->src_sgl[i].vec, vec->src_sgl[i].num,
770ff01b26fSKai Ji vec->dest_sgl[i].vec, vec->dest_sgl[i].num);
771ff01b26fSKai Ji } else {
772ff01b26fSKai Ji data_len = qat_sym_build_req_set_data(req,
773ff01b26fSKai Ji user_data[i], cookie,
774ff01b26fSKai Ji vec->src_sgl[i].vec,
775ff01b26fSKai Ji vec->src_sgl[i].num, NULL, 0);
776ff01b26fSKai Ji }
777ff01b26fSKai Ji
77885fec6fdSKai Ji if (unlikely(data_len < 0))
77985fec6fdSKai Ji break;
780d7d52b37SCiara Power if (ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_NULL) {
781d7d52b37SCiara Power null_digest.iova = cookie->digest_null_phys_addr;
782d7d52b37SCiara Power job_digest = &null_digest;
783d7d52b37SCiara Power } else
784d7d52b37SCiara Power job_digest = &vec->digest[i];
785d7d52b37SCiara Power
786d7d52b37SCiara Power enqueue_one_auth_job_gen3(ctx, cookie, req, job_digest,
78785fec6fdSKai Ji &vec->auth_iv[i], ofs, (uint32_t)data_len);
78885fec6fdSKai Ji tail = (tail + tx_queue->msg_size) & tx_queue->modulo_mask;
78985fec6fdSKai Ji }
79085fec6fdSKai Ji
79185fec6fdSKai Ji if (unlikely(i < n))
79285fec6fdSKai Ji qat_sym_dp_fill_vec_status(vec->status + i, -1, n - i);
79385fec6fdSKai Ji
79485fec6fdSKai Ji dp_ctx->tail = tail;
79585fec6fdSKai Ji dp_ctx->cached_enqueue += i;
79685fec6fdSKai Ji *status = 0;
79785fec6fdSKai Ji return i;
79885fec6fdSKai Ji }
79985fec6fdSKai Ji
80085fec6fdSKai Ji static int
qat_sym_configure_raw_dp_ctx_gen3(void * _raw_dp_ctx,void * _ctx)80185fec6fdSKai Ji qat_sym_configure_raw_dp_ctx_gen3(void *_raw_dp_ctx, void *_ctx)
80285fec6fdSKai Ji {
80385fec6fdSKai Ji struct rte_crypto_raw_dp_ctx *raw_dp_ctx = _raw_dp_ctx;
80485fec6fdSKai Ji struct qat_sym_session *ctx = _ctx;
80585fec6fdSKai Ji int ret;
80685fec6fdSKai Ji
80785fec6fdSKai Ji ret = qat_sym_configure_raw_dp_ctx_gen1(_raw_dp_ctx, _ctx);
80885fec6fdSKai Ji if (ret < 0)
80985fec6fdSKai Ji return ret;
81085fec6fdSKai Ji
81185fec6fdSKai Ji if (ctx->is_single_pass) {
81285fec6fdSKai Ji raw_dp_ctx->enqueue_burst = qat_sym_dp_enqueue_aead_jobs_gen3;
81385fec6fdSKai Ji raw_dp_ctx->enqueue = qat_sym_dp_enqueue_single_aead_gen3;
81485fec6fdSKai Ji } else if (ctx->is_single_pass_gmac) {
81585fec6fdSKai Ji raw_dp_ctx->enqueue_burst = qat_sym_dp_enqueue_auth_jobs_gen3;
81685fec6fdSKai Ji raw_dp_ctx->enqueue = qat_sym_dp_enqueue_single_auth_gen3;
81785fec6fdSKai Ji }
81885fec6fdSKai Ji
81985fec6fdSKai Ji return 0;
82085fec6fdSKai Ji }
82185fec6fdSKai Ji
82285fec6fdSKai Ji
RTE_INIT(qat_sym_crypto_gen3_init)8230c4546deSFan Zhang RTE_INIT(qat_sym_crypto_gen3_init)
8240c4546deSFan Zhang {
8250c4546deSFan Zhang qat_sym_gen_dev_ops[QAT_GEN3].cryptodev_ops = &qat_sym_crypto_ops_gen1;
8260c4546deSFan Zhang qat_sym_gen_dev_ops[QAT_GEN3].get_capabilities =
8270c4546deSFan Zhang qat_sym_crypto_cap_get_gen3;
8280c4546deSFan Zhang qat_sym_gen_dev_ops[QAT_GEN3].get_feature_flags =
8290c4546deSFan Zhang qat_sym_crypto_feature_flags_get_gen1;
830254558c8SKai Ji qat_sym_gen_dev_ops[QAT_GEN3].set_session =
831254558c8SKai Ji qat_sym_crypto_set_session_gen3;
83285fec6fdSKai Ji qat_sym_gen_dev_ops[QAT_GEN3].set_raw_dp_ctx =
83385fec6fdSKai Ji qat_sym_configure_raw_dp_ctx_gen3;
8340c4546deSFan Zhang qat_sym_gen_dev_ops[QAT_GEN3].create_security_ctx =
8350c4546deSFan Zhang qat_sym_create_security_gen1;
8360c4546deSFan Zhang }
8370c4546deSFan Zhang
RTE_INIT(qat_asym_crypto_gen3_init)8380c4546deSFan Zhang RTE_INIT(qat_asym_crypto_gen3_init)
8390c4546deSFan Zhang {
840ccb247b1SCiara Power qat_asym_gen_dev_ops[QAT_GEN3].cryptodev_ops =
841ccb247b1SCiara Power &qat_asym_crypto_ops_gen1;
842ccb247b1SCiara Power qat_asym_gen_dev_ops[QAT_GEN3].get_capabilities =
843ccb247b1SCiara Power qat_asym_crypto_cap_get_gen1;
844ccb247b1SCiara Power qat_asym_gen_dev_ops[QAT_GEN3].get_feature_flags =
845ccb247b1SCiara Power qat_asym_crypto_feature_flags_get_gen1;
846ccb247b1SCiara Power qat_asym_gen_dev_ops[QAT_GEN3].set_session =
847ccb247b1SCiara Power qat_asym_crypto_set_session_gen1;
8480c4546deSFan Zhang }
849