159cda512SCiara Power /* SPDX-License-Identifier: BSD-3-Clause
259cda512SCiara Power * Copyright(c) 2024 Intel Corporation
359cda512SCiara Power */
459cda512SCiara Power
559cda512SCiara Power #include <rte_cryptodev.h>
659cda512SCiara Power #include <cryptodev_pmd.h>
759cda512SCiara Power #include "qat_sym_session.h"
859cda512SCiara Power #include "qat_sym.h"
959cda512SCiara Power #include "qat_asym.h"
1059cda512SCiara Power #include "qat_crypto.h"
1159cda512SCiara Power #include "qat_crypto_pmd_gens.h"
1259cda512SCiara Power
1359cda512SCiara Power
1459cda512SCiara Power static struct rte_cryptodev_capabilities qat_sym_crypto_legacy_caps_gen5[] = {
1559cda512SCiara Power QAT_SYM_PLAIN_AUTH_CAP(SHA1,
1659cda512SCiara Power CAP_SET(block_size, 64),
1759cda512SCiara Power CAP_RNG(digest_size, 1, 20, 1)),
1859cda512SCiara Power QAT_SYM_AUTH_CAP(SHA224,
1959cda512SCiara Power CAP_SET(block_size, 64),
2059cda512SCiara Power CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 28, 1),
2159cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
2259cda512SCiara Power QAT_SYM_AUTH_CAP(SHA224_HMAC,
2359cda512SCiara Power CAP_SET(block_size, 64),
2459cda512SCiara Power CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 28, 1),
2559cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
2659cda512SCiara Power QAT_SYM_AUTH_CAP(SHA1_HMAC,
2759cda512SCiara Power CAP_SET(block_size, 64),
2859cda512SCiara Power CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 20, 1),
2959cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
3059cda512SCiara Power QAT_SYM_CIPHER_CAP(SM4_ECB,
3159cda512SCiara Power CAP_SET(block_size, 16),
3259cda512SCiara Power CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 0, 0, 0)),
3359cda512SCiara Power };
3459cda512SCiara Power
3559cda512SCiara Power static struct rte_cryptodev_capabilities qat_sym_crypto_caps_gen5[] = {
3659cda512SCiara Power QAT_SYM_CIPHER_CAP(AES_CBC,
3759cda512SCiara Power CAP_SET(block_size, 16),
3859cda512SCiara Power CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)),
3959cda512SCiara Power QAT_SYM_AUTH_CAP(SHA256_HMAC,
4059cda512SCiara Power CAP_SET(block_size, 64),
4159cda512SCiara Power CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 32, 1),
4259cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
4359cda512SCiara Power QAT_SYM_AUTH_CAP(SHA384_HMAC,
4459cda512SCiara Power CAP_SET(block_size, 128),
4559cda512SCiara Power CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 48, 1),
4659cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
4759cda512SCiara Power QAT_SYM_AUTH_CAP(SHA512_HMAC,
4859cda512SCiara Power CAP_SET(block_size, 128),
4959cda512SCiara Power CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 64, 1),
5059cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
5159cda512SCiara Power QAT_SYM_AUTH_CAP(AES_XCBC_MAC,
5259cda512SCiara Power CAP_SET(block_size, 16),
5359cda512SCiara Power CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 12, 12, 0),
5459cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
5559cda512SCiara Power QAT_SYM_AUTH_CAP(AES_CMAC,
5659cda512SCiara Power CAP_SET(block_size, 16),
5759cda512SCiara Power CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 4),
5859cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
5959cda512SCiara Power QAT_SYM_CIPHER_CAP(AES_DOCSISBPI,
6059cda512SCiara Power CAP_SET(block_size, 16),
6159cda512SCiara Power CAP_RNG(key_size, 16, 32, 16), CAP_RNG(iv_size, 16, 16, 0)),
6259cda512SCiara Power QAT_SYM_AUTH_CAP(NULL,
6359cda512SCiara Power CAP_SET(block_size, 1),
6459cda512SCiara Power CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(digest_size),
6559cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
6659cda512SCiara Power QAT_SYM_CIPHER_CAP(NULL,
6759cda512SCiara Power CAP_SET(block_size, 1),
6859cda512SCiara Power CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(iv_size)),
6959cda512SCiara Power QAT_SYM_AUTH_CAP(SHA256,
7059cda512SCiara Power CAP_SET(block_size, 64),
7159cda512SCiara Power CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 32, 1),
7259cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
7359cda512SCiara Power QAT_SYM_AUTH_CAP(SHA384,
7459cda512SCiara Power CAP_SET(block_size, 128),
7559cda512SCiara Power CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 48, 1),
7659cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
7759cda512SCiara Power QAT_SYM_AUTH_CAP(SHA512,
7859cda512SCiara Power CAP_SET(block_size, 128),
7959cda512SCiara Power CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 64, 1),
8059cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
8159cda512SCiara Power QAT_SYM_CIPHER_CAP(AES_CTR,
8259cda512SCiara Power CAP_SET(block_size, 16),
8359cda512SCiara Power CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)),
8459cda512SCiara Power QAT_SYM_AEAD_CAP(AES_GCM,
8559cda512SCiara Power CAP_SET(block_size, 16),
8659cda512SCiara Power CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4),
8759cda512SCiara Power CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 0, 12, 12)),
8859cda512SCiara Power QAT_SYM_AEAD_CAP(AES_CCM,
8959cda512SCiara Power CAP_SET(block_size, 16),
9059cda512SCiara Power CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 2),
9159cda512SCiara Power CAP_RNG(aad_size, 0, 224, 1), CAP_RNG(iv_size, 7, 13, 1)),
9259cda512SCiara Power QAT_SYM_AUTH_CAP(AES_GMAC,
9359cda512SCiara Power CAP_SET(block_size, 16),
9459cda512SCiara Power CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4),
9559cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 0, 12, 12)),
9659cda512SCiara Power QAT_SYM_AEAD_CAP(CHACHA20_POLY1305,
9759cda512SCiara Power CAP_SET(block_size, 64),
9859cda512SCiara Power CAP_RNG(key_size, 32, 32, 0),
9959cda512SCiara Power CAP_RNG(digest_size, 16, 16, 0),
10059cda512SCiara Power CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 12, 12, 0)),
10159cda512SCiara Power QAT_SYM_CIPHER_CAP(SM4_CBC,
10259cda512SCiara Power CAP_SET(block_size, 16),
10359cda512SCiara Power CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)),
10459cda512SCiara Power QAT_SYM_CIPHER_CAP(SM4_CTR,
10559cda512SCiara Power CAP_SET(block_size, 16),
10659cda512SCiara Power CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)),
10759cda512SCiara Power QAT_SYM_PLAIN_AUTH_CAP(SM3,
10859cda512SCiara Power CAP_SET(block_size, 64),
10959cda512SCiara Power CAP_RNG(digest_size, 32, 32, 0)),
11059cda512SCiara Power QAT_SYM_AUTH_CAP(SM3_HMAC,
11159cda512SCiara Power CAP_SET(block_size, 64),
11259cda512SCiara Power CAP_RNG(key_size, 16, 64, 4), CAP_RNG(digest_size, 32, 32, 0),
11359cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
11459cda512SCiara Power QAT_SYM_CIPHER_CAP(ZUC_EEA3,
11559cda512SCiara Power CAP_SET(block_size, 16),
11659cda512SCiara Power CAP_RNG(key_size, 16, 32, 16), CAP_RNG(iv_size, 16, 25, 1)),
11759cda512SCiara Power QAT_SYM_AUTH_CAP(ZUC_EIA3,
11859cda512SCiara Power CAP_SET(block_size, 16),
11959cda512SCiara Power CAP_RNG(key_size, 16, 32, 16), CAP_RNG(digest_size, 4, 16, 4),
12059cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 16, 25, 1)),
12159cda512SCiara Power QAT_SYM_CIPHER_CAP(SNOW3G_UEA2,
12259cda512SCiara Power CAP_SET(block_size, 16),
12359cda512SCiara Power CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)),
12459cda512SCiara Power QAT_SYM_AUTH_CAP(SNOW3G_UIA2,
12559cda512SCiara Power CAP_SET(block_size, 16),
12659cda512SCiara Power CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0),
12759cda512SCiara Power CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 16, 16, 0)),
12859cda512SCiara Power RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
12959cda512SCiara Power };
13059cda512SCiara Power
13159cda512SCiara Power static int
check_cipher_capa(const struct rte_cryptodev_capabilities * cap,enum rte_crypto_cipher_algorithm algo)13259cda512SCiara Power check_cipher_capa(const struct rte_cryptodev_capabilities *cap,
13359cda512SCiara Power enum rte_crypto_cipher_algorithm algo)
13459cda512SCiara Power {
13559cda512SCiara Power if (cap->op != RTE_CRYPTO_OP_TYPE_SYMMETRIC)
13659cda512SCiara Power return 0;
13759cda512SCiara Power if (cap->sym.xform_type != RTE_CRYPTO_SYM_XFORM_CIPHER)
13859cda512SCiara Power return 0;
13959cda512SCiara Power if (cap->sym.cipher.algo != algo)
14059cda512SCiara Power return 0;
14159cda512SCiara Power return 1;
14259cda512SCiara Power }
14359cda512SCiara Power
14459cda512SCiara Power static int
check_auth_capa(const struct rte_cryptodev_capabilities * cap,enum rte_crypto_auth_algorithm algo)14559cda512SCiara Power check_auth_capa(const struct rte_cryptodev_capabilities *cap,
14659cda512SCiara Power enum rte_crypto_auth_algorithm algo)
14759cda512SCiara Power {
14859cda512SCiara Power if (cap->op != RTE_CRYPTO_OP_TYPE_SYMMETRIC)
14959cda512SCiara Power return 0;
15059cda512SCiara Power if (cap->sym.xform_type != RTE_CRYPTO_SYM_XFORM_AUTH)
15159cda512SCiara Power return 0;
15259cda512SCiara Power if (cap->sym.auth.algo != algo)
15359cda512SCiara Power return 0;
15459cda512SCiara Power return 1;
15559cda512SCiara Power }
15659cda512SCiara Power
15759cda512SCiara Power static int
qat_sym_crypto_cap_get_gen5(struct qat_cryptodev_private * internals,const char * capa_memz_name,const uint16_t __rte_unused slice_map)15859cda512SCiara Power qat_sym_crypto_cap_get_gen5(struct qat_cryptodev_private *internals,
15959cda512SCiara Power const char *capa_memz_name,
16059cda512SCiara Power const uint16_t __rte_unused slice_map)
16159cda512SCiara Power {
16259cda512SCiara Power uint32_t legacy_capa_num, capa_num;
16359cda512SCiara Power uint32_t size = sizeof(qat_sym_crypto_caps_gen5);
16459cda512SCiara Power uint32_t legacy_size = sizeof(qat_sym_crypto_legacy_caps_gen5);
16559cda512SCiara Power uint32_t i, iter = 0;
16659cda512SCiara Power uint32_t curr_capa = 0;
16759cda512SCiara Power legacy_capa_num = legacy_size/sizeof(struct rte_cryptodev_capabilities);
16859cda512SCiara Power capa_num = RTE_DIM(qat_sym_crypto_caps_gen5);
16959cda512SCiara Power
170*b7bd72d8SArkadiusz Kusztal if (unlikely(internals->qat_dev->options.legacy_alg))
17159cda512SCiara Power size = size + legacy_size;
17259cda512SCiara Power
17359cda512SCiara Power internals->capa_mz = rte_memzone_lookup(capa_memz_name);
17459cda512SCiara Power if (internals->capa_mz == NULL) {
17559cda512SCiara Power internals->capa_mz = rte_memzone_reserve(capa_memz_name,
17659cda512SCiara Power size, rte_socket_id(), 0);
17759cda512SCiara Power if (internals->capa_mz == NULL) {
17859cda512SCiara Power QAT_LOG(DEBUG,
17959cda512SCiara Power "Error allocating memzone for capabilities");
18059cda512SCiara Power return -1;
18159cda512SCiara Power }
18259cda512SCiara Power }
18359cda512SCiara Power
18459cda512SCiara Power struct rte_cryptodev_capabilities *addr =
18559cda512SCiara Power (struct rte_cryptodev_capabilities *)
18659cda512SCiara Power internals->capa_mz->addr;
18759cda512SCiara Power
18859cda512SCiara Power struct rte_cryptodev_capabilities *capabilities;
18959cda512SCiara Power
190*b7bd72d8SArkadiusz Kusztal if (unlikely(internals->qat_dev->options.legacy_alg)) {
19159cda512SCiara Power capabilities = qat_sym_crypto_legacy_caps_gen5;
19259cda512SCiara Power memcpy(addr, capabilities, legacy_size);
19359cda512SCiara Power addr += legacy_capa_num;
19459cda512SCiara Power }
19559cda512SCiara Power capabilities = qat_sym_crypto_caps_gen5;
19659cda512SCiara Power
19759cda512SCiara Power for (i = 0; i < capa_num; i++, iter++) {
19859cda512SCiara Power if (slice_map & ICP_ACCEL_MASK_ZUC_256_SLICE && (
19959cda512SCiara Power check_auth_capa(&capabilities[iter],
20059cda512SCiara Power RTE_CRYPTO_AUTH_ZUC_EIA3) ||
20159cda512SCiara Power check_cipher_capa(&capabilities[iter],
20259cda512SCiara Power RTE_CRYPTO_CIPHER_ZUC_EEA3))) {
20359cda512SCiara Power continue;
20459cda512SCiara Power }
20559cda512SCiara Power
20659cda512SCiara Power memcpy(addr + curr_capa, capabilities + iter,
20759cda512SCiara Power sizeof(struct rte_cryptodev_capabilities));
20859cda512SCiara Power curr_capa++;
20959cda512SCiara Power }
21059cda512SCiara Power internals->qat_dev_capabilities = internals->capa_mz->addr;
21159cda512SCiara Power
21259cda512SCiara Power return 0;
21359cda512SCiara Power }
21459cda512SCiara Power
21559cda512SCiara Power static int
qat_sym_crypto_set_session_gen5(void * cdev,void * session)21659cda512SCiara Power qat_sym_crypto_set_session_gen5(void *cdev, void *session)
21759cda512SCiara Power {
21859cda512SCiara Power struct qat_sym_session *ctx = session;
21959cda512SCiara Power enum rte_proc_type_t proc_type = rte_eal_process_type();
22059cda512SCiara Power int ret;
22159cda512SCiara Power
22259cda512SCiara Power if (proc_type == RTE_PROC_AUTO || proc_type == RTE_PROC_INVALID)
22359cda512SCiara Power return -EINVAL;
22459cda512SCiara Power
22559cda512SCiara Power ret = qat_sym_crypto_set_session_gen4(cdev, session);
22659cda512SCiara Power
22759cda512SCiara Power if (ret == -ENOTSUP) {
22859cda512SCiara Power /* GEN4 returning -ENOTSUP as it cannot handle some mixed algo,
22959cda512SCiara Power * this is addressed by GEN5
23059cda512SCiara Power */
23159cda512SCiara Power if ((ctx->aes_cmac ||
23259cda512SCiara Power ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_NULL) &&
23359cda512SCiara Power (ctx->qat_cipher_alg ==
23459cda512SCiara Power ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 ||
23559cda512SCiara Power ctx->qat_cipher_alg ==
23659cda512SCiara Power ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ||
23759cda512SCiara Power ctx->qat_cipher_alg == ICP_QAT_HW_CIPHER_ALGO_ZUC_256)) {
23859cda512SCiara Power qat_sym_session_set_ext_hash_flags_gen2(ctx, 0);
23959cda512SCiara Power } else if ((ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_ZUC_256_MAC_32 ||
24059cda512SCiara Power ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_ZUC_256_MAC_64 ||
24159cda512SCiara Power ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_ZUC_256_MAC_128) &&
24259cda512SCiara Power ctx->qat_cipher_alg != ICP_QAT_HW_CIPHER_ALGO_ZUC_256) {
24359cda512SCiara Power qat_sym_session_set_ext_hash_flags_gen2(ctx,
24459cda512SCiara Power 1 << ICP_QAT_FW_AUTH_HDR_FLAG_ZUC_EIA3_BITPOS);
24559cda512SCiara Power }
24659cda512SCiara Power
24759cda512SCiara Power ret = 0;
24859cda512SCiara Power }
24959cda512SCiara Power
25059cda512SCiara Power return ret;
25159cda512SCiara Power }
25259cda512SCiara Power
RTE_INIT(qat_sym_crypto_gen5_init)25359cda512SCiara Power RTE_INIT(qat_sym_crypto_gen5_init)
25459cda512SCiara Power {
25559cda512SCiara Power qat_sym_gen_dev_ops[QAT_GEN5].cryptodev_ops = &qat_sym_crypto_ops_gen1;
25659cda512SCiara Power qat_sym_gen_dev_ops[QAT_GEN5].get_capabilities =
25759cda512SCiara Power qat_sym_crypto_cap_get_gen5;
25859cda512SCiara Power qat_sym_gen_dev_ops[QAT_GEN5].set_session =
25959cda512SCiara Power qat_sym_crypto_set_session_gen5;
26059cda512SCiara Power qat_sym_gen_dev_ops[QAT_GEN5].set_raw_dp_ctx =
26159cda512SCiara Power qat_sym_configure_raw_dp_ctx_gen4;
26259cda512SCiara Power qat_sym_gen_dev_ops[QAT_GEN5].get_feature_flags =
26359cda512SCiara Power qat_sym_crypto_feature_flags_get_gen1;
26459cda512SCiara Power qat_sym_gen_dev_ops[QAT_GEN5].create_security_ctx =
26559cda512SCiara Power qat_sym_create_security_gen1;
26659cda512SCiara Power }
26759cda512SCiara Power
RTE_INIT(qat_asym_crypto_gen5_init)26859cda512SCiara Power RTE_INIT(qat_asym_crypto_gen5_init)
26959cda512SCiara Power {
27059cda512SCiara Power qat_asym_gen_dev_ops[QAT_GEN5].cryptodev_ops =
27159cda512SCiara Power &qat_asym_crypto_ops_gen1;
27259cda512SCiara Power qat_asym_gen_dev_ops[QAT_GEN5].get_capabilities =
27359cda512SCiara Power qat_asym_crypto_cap_get_gen1;
27459cda512SCiara Power qat_asym_gen_dev_ops[QAT_GEN5].get_feature_flags =
27559cda512SCiara Power qat_asym_crypto_feature_flags_get_gen1;
27659cda512SCiara Power qat_asym_gen_dev_ops[QAT_GEN5].set_session =
27759cda512SCiara Power qat_asym_crypto_set_session_gen1;
27859cda512SCiara Power }
279