X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fcrypto%2Farmv8%2Frte_armv8_pmd.c;h=c95729db501c29caaeeb0bf56862eaea0af947d0;hb=4f86c0ba19ba065c8c32a5b0111efc7bb74c9b96;hp=a5c39c9b7ffd84370a25205e158dbe44ba19b068;hpb=473174a7da555ec26751c89b56255192586cb0aa;p=dpdk.git diff --git a/drivers/crypto/armv8/rte_armv8_pmd.c b/drivers/crypto/armv8/rte_armv8_pmd.c index a5c39c9b7f..c95729db50 100644 --- a/drivers/crypto/armv8/rte_armv8_pmd.c +++ b/drivers/crypto/armv8/rte_armv8_pmd.c @@ -1,33 +1,5 @@ -/* - * BSD LICENSE - * - * Copyright (C) Cavium, Inc. 2017. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Cavium, Inc nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2017 Cavium, Inc */ #include @@ -36,14 +8,13 @@ #include #include #include -#include -#include +#include #include #include -#include "armv8_crypto_defs.h" +#include "AArch64cryptolib.h" -#include "rte_armv8_pmd_private.h" +#include "armv8_pmd_private.h" static uint8_t cryptodev_driver_id; @@ -107,25 +78,29 @@ crypto_func_tbl_t[CRYPTO_CIPHER_MAX][CRYPTO_AUTH_MAX][CRYPTO_CIPHER_KEYLEN_MAX]; static const crypto_func_tbl_t crypto_op_ca_encrypt = { /* [cipher alg][auth alg][key length] = crypto_function, */ - [CIPH_AES_CBC][AUTH_SHA1_HMAC][KEYL(128)] = aes128cbc_sha1_hmac, - [CIPH_AES_CBC][AUTH_SHA256_HMAC][KEYL(128)] = aes128cbc_sha256_hmac, + [CIPH_AES_CBC][AUTH_SHA1_HMAC][KEYL(128)] = + armv8_enc_aes_cbc_sha1_128, + [CIPH_AES_CBC][AUTH_SHA256_HMAC][KEYL(128)] = + armv8_enc_aes_cbc_sha256_128, }; static const crypto_func_tbl_t crypto_op_ca_decrypt = { - NULL + { {NULL} } }; static const crypto_func_tbl_t crypto_op_ac_encrypt = { - NULL + { {NULL} } }; static const crypto_func_tbl_t crypto_op_ac_decrypt = { /* [cipher alg][auth alg][key length] = crypto_function, */ - [CIPH_AES_CBC][AUTH_SHA1_HMAC][KEYL(128)] = sha1_hmac_aes128cbc_dec, - [CIPH_AES_CBC][AUTH_SHA256_HMAC][KEYL(128)] = sha256_hmac_aes128cbc_dec, + [CIPH_AES_CBC][AUTH_SHA1_HMAC][KEYL(128)] = + armv8_dec_aes_cbc_sha1_128, + [CIPH_AES_CBC][AUTH_SHA256_HMAC][KEYL(128)] = + armv8_dec_aes_cbc_sha256_128, }; /** @@ -184,13 +159,13 @@ crypto_key_sched_tbl_t[CRYPTO_CIPHER_MAX][CRYPTO_CIPHER_KEYLEN_MAX]; static const crypto_key_sched_tbl_t crypto_key_sched_encrypt = { /* [cipher alg][key length] = key_expand_func, */ - [CIPH_AES_CBC][KEYL(128)] = aes128_key_sched_enc, + [CIPH_AES_CBC][KEYL(128)] = armv8_expandkeys_enc_aes_cbc_128, }; static const crypto_key_sched_tbl_t crypto_key_sched_decrypt = { /* [cipher alg][key length] = key_expand_func, */ - [CIPH_AES_CBC][KEYL(128)] = aes128_key_sched_dec, + [CIPH_AES_CBC][KEYL(128)] = armv8_expandkeys_dec_aes_cbc_128, }; /** @@ -306,14 +281,16 @@ auth_set_prerequisites(struct armv8_crypto_session *sess, * Calculate partial hash values for i_key_pad and o_key_pad. * Will be used as initialization state for final HMAC. */ - error = sha1_block_partial(NULL, sess->auth.hmac.i_key_pad, - partial, SHA1_BLOCK_SIZE); + error = armv8_sha1_block_partial(NULL, + sess->auth.hmac.i_key_pad, + partial, SHA1_BLOCK_SIZE); if (error != 0) return -1; memcpy(sess->auth.hmac.i_key_pad, partial, SHA1_BLOCK_SIZE); - error = sha1_block_partial(NULL, sess->auth.hmac.o_key_pad, - partial, SHA1_BLOCK_SIZE); + error = armv8_sha1_block_partial(NULL, + sess->auth.hmac.o_key_pad, + partial, SHA1_BLOCK_SIZE); if (error != 0) return -1; memcpy(sess->auth.hmac.o_key_pad, partial, SHA1_BLOCK_SIZE); @@ -339,14 +316,16 @@ auth_set_prerequisites(struct armv8_crypto_session *sess, * Calculate partial hash values for i_key_pad and o_key_pad. * Will be used as initialization state for final HMAC. */ - error = sha256_block_partial(NULL, sess->auth.hmac.i_key_pad, - partial, SHA256_BLOCK_SIZE); + error = armv8_sha256_block_partial(NULL, + sess->auth.hmac.i_key_pad, + partial, SHA256_BLOCK_SIZE); if (error != 0) return -1; memcpy(sess->auth.hmac.i_key_pad, partial, SHA256_BLOCK_SIZE); - error = sha256_block_partial(NULL, sess->auth.hmac.o_key_pad, - partial, SHA256_BLOCK_SIZE); + error = armv8_sha256_block_partial(NULL, + sess->auth.hmac.o_key_pad, + partial, SHA256_BLOCK_SIZE); if (error != 0) return -1; memcpy(sess->auth.hmac.o_key_pad, partial, SHA256_BLOCK_SIZE); @@ -398,7 +377,16 @@ armv8_crypto_set_session_chained_parameters(struct armv8_crypto_session *sess, /* Select cipher key */ sess->cipher.key.length = cipher_xform->cipher.key.length; /* Set cipher direction */ - cop = sess->cipher.direction; + switch (sess->cipher.direction) { + case RTE_CRYPTO_CIPHER_OP_ENCRYPT: + cop = ARMV8_CRYPTO_CIPHER_OP_ENCRYPT; + break; + case RTE_CRYPTO_CIPHER_OP_DECRYPT: + cop = ARMV8_CRYPTO_CIPHER_OP_DECRYPT; + break; + default: + return -ENOTSUP; + } /* Set cipher algorithm */ calg = cipher_xform->cipher.algo; @@ -531,7 +519,7 @@ get_session(struct armv8_crypto_qp *qp, struct rte_crypto_op *op) /* get existing session */ if (likely(op->sym->session != NULL)) { sess = (struct armv8_crypto_session *) - get_session_private_data( + get_sym_session_private_data( op->sym->session, cryptodev_driver_id); } @@ -543,7 +531,8 @@ get_session(struct armv8_crypto_qp *qp, struct rte_crypto_op *op) if (rte_mempool_get(qp->sess_mp, (void **)&_sess)) return NULL; - if (rte_mempool_get(qp->sess_mp, (void **)&_sess_private_data)) + if (rte_mempool_get(qp->sess_mp_priv, + (void **)&_sess_private_data)) return NULL; sess = (struct armv8_crypto_session *)_sess_private_data; @@ -551,12 +540,12 @@ get_session(struct armv8_crypto_qp *qp, struct rte_crypto_op *op) if (unlikely(armv8_crypto_set_session_parameters(sess, op->sym->xform) != 0)) { rte_mempool_put(qp->sess_mp, _sess); - rte_mempool_put(qp->sess_mp, _sess_private_data); + rte_mempool_put(qp->sess_mp_priv, _sess_private_data); sess = NULL; } op->sym->session = (struct rte_cryptodev_sym_session *)_sess; - set_session_private_data(op->sym->session, cryptodev_driver_id, - _sess_private_data); + set_sym_session_private_data(op->sym->session, + cryptodev_driver_id, _sess_private_data); } if (unlikely(sess == NULL)) @@ -575,12 +564,12 @@ get_session(struct armv8_crypto_qp *qp, struct rte_crypto_op *op) /** Process cipher operation */ static inline void -process_armv8_chained_op - (struct rte_crypto_op *op, struct armv8_crypto_session *sess, +process_armv8_chained_op(struct armv8_crypto_qp *qp, struct rte_crypto_op *op, + struct armv8_crypto_session *sess, struct rte_mbuf *mbuf_src, struct rte_mbuf *mbuf_dst) { crypto_func_t crypto_func; - crypto_arg_t arg; + armv8_cipher_digest_t arg; struct rte_mbuf *m_asrc, *m_adst; uint8_t *csrc, *cdst; uint8_t *adst, *asrc; @@ -633,8 +622,7 @@ process_armv8_chained_op op->sym->auth.data.length); } } else { - adst = (uint8_t *)rte_pktmbuf_append(m_asrc, - sess->auth.digest_length); + adst = qp->temp_digest; } arg.cipher.iv = rte_crypto_op_ctod_offset(op, uint8_t *, @@ -642,7 +630,7 @@ process_armv8_chained_op arg.cipher.key = sess->cipher.key.data; /* Acquire combined mode function */ crypto_func = sess->crypto_func; - ARMV8_CRYPTO_ASSERT(crypto_func != NULL); + RTE_VERIFY(crypto_func != NULL); error = crypto_func(csrc, cdst, clen, asrc, adst, alen, &arg); if (error != 0) { op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; @@ -655,15 +643,12 @@ process_armv8_chained_op sess->auth.digest_length) != 0) { op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; } - /* Trim area used for digest from mbuf. */ - rte_pktmbuf_trim(m_asrc, - sess->auth.digest_length); } } /** Process crypto operation for mbuf */ static inline int -process_op(const struct armv8_crypto_qp *qp, struct rte_crypto_op *op, +process_op(struct armv8_crypto_qp *qp, struct rte_crypto_op *op, struct armv8_crypto_session *sess) { struct rte_mbuf *msrc, *mdst; @@ -676,7 +661,7 @@ process_op(const struct armv8_crypto_qp *qp, struct rte_crypto_op *op, switch (sess->chain_order) { case ARMV8_CRYPTO_CHAIN_CIPHER_AUTH: case ARMV8_CRYPTO_CHAIN_AUTH_CIPHER: /* Fall through */ - process_armv8_chained_op(op, sess, msrc, mdst); + process_armv8_chained_op(qp, op, sess, msrc, mdst); break; default: op->status = RTE_CRYPTO_OP_STATUS_ERROR; @@ -687,9 +672,10 @@ process_op(const struct armv8_crypto_qp *qp, struct rte_crypto_op *op, if (op->sess_type == RTE_CRYPTO_OP_SESSIONLESS) { memset(sess, 0, sizeof(struct armv8_crypto_session)); memset(op->sym->session, 0, - rte_cryptodev_get_header_session_size()); + rte_cryptodev_sym_get_existing_header_session_size( + op->sym->session)); rte_mempool_put(qp->sess_mp, sess); - rte_mempool_put(qp->sess_mp, op->sym->session); + rte_mempool_put(qp->sess_mp_priv, op->sym->session); op->sym->session = NULL; } @@ -763,7 +749,7 @@ armv8_crypto_pmd_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops, static int cryptodev_armv8_crypto_create(const char *name, struct rte_vdev_device *vdev, - struct rte_crypto_vdev_init_params *init_params) + struct rte_cryptodev_pmd_init_params *init_params) { struct rte_cryptodev *dev; struct armv8_crypto_private *internals; @@ -790,14 +776,7 @@ cryptodev_armv8_crypto_create(const char *name, return -EFAULT; } - if (init_params->name[0] == '\0') - snprintf(init_params->name, sizeof(init_params->name), - "%s", name); - - dev = rte_cryptodev_vdev_pmd_init(init_params->name, - sizeof(struct armv8_crypto_private), - init_params->socket_id, - vdev); + dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params); if (dev == NULL) { ARMV8_CRYPTO_LOG_ERR("failed to create cryptodev vdev"); goto init_error; @@ -813,13 +792,12 @@ cryptodev_armv8_crypto_create(const char *name, dev->feature_flags = RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO | RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING | RTE_CRYPTODEV_FF_CPU_NEON | - RTE_CRYPTODEV_FF_CPU_ARM_CE; + RTE_CRYPTODEV_FF_CPU_ARM_CE | + RTE_CRYPTODEV_FF_SYM_SESSIONLESS; - /* Set vector instructions mode supported */ internals = dev->data->dev_private; internals->max_nb_qpairs = init_params->max_nb_queue_pairs; - internals->max_nb_sessions = init_params->max_nb_sessions; return 0; @@ -836,11 +814,11 @@ init_error: static int cryptodev_armv8_crypto_init(struct rte_vdev_device *vdev) { - struct rte_crypto_vdev_init_params init_params = { - RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS, - RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS, + struct rte_cryptodev_pmd_init_params init_params = { + "", + sizeof(struct armv8_crypto_private), rte_socket_id(), - {0} + RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS }; const char *name; const char *input_args; @@ -849,18 +827,7 @@ cryptodev_armv8_crypto_init(struct rte_vdev_device *vdev) if (name == NULL) return -EINVAL; input_args = rte_vdev_device_args(vdev); - rte_cryptodev_vdev_parse_init_params(&init_params, input_args); - - RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n", name, - init_params.socket_id); - if (init_params.name[0] != '\0') { - RTE_LOG(INFO, PMD, " User defined name = %s\n", - init_params.name); - } - RTE_LOG(INFO, PMD, " Max number of queue pairs = %d\n", - init_params.max_nb_queue_pairs); - RTE_LOG(INFO, PMD, " Max number of sessions = %d\n", - init_params.max_nb_sessions); + rte_cryptodev_pmd_parse_input_args(&init_params, input_args); return cryptodev_armv8_crypto_create(name, vdev, &init_params); } @@ -869,6 +836,7 @@ cryptodev_armv8_crypto_init(struct rte_vdev_device *vdev) static int cryptodev_armv8_crypto_uninit(struct rte_vdev_device *vdev) { + struct rte_cryptodev *cryptodev; const char *name; name = rte_vdev_device_name(vdev); @@ -879,18 +847,26 @@ cryptodev_armv8_crypto_uninit(struct rte_vdev_device *vdev) "Closing ARMv8 crypto device %s on numa socket %u\n", name, rte_socket_id()); - return 0; + cryptodev = rte_cryptodev_pmd_get_named_dev(name); + if (cryptodev == NULL) + return -ENODEV; + + return rte_cryptodev_pmd_destroy(cryptodev); } -static struct rte_vdev_driver armv8_crypto_drv = { +static struct rte_vdev_driver armv8_crypto_pmd_drv = { .probe = cryptodev_armv8_crypto_init, .remove = cryptodev_armv8_crypto_uninit }; -RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_ARMV8_PMD, armv8_crypto_drv); +static struct cryptodev_driver armv8_crypto_drv; + +RTE_LOG_REGISTER(crypto_armv8_log_type, pmd.crypto.armv8, ERR); + +RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_ARMV8_PMD, armv8_crypto_pmd_drv); RTE_PMD_REGISTER_ALIAS(CRYPTODEV_NAME_ARMV8_PMD, cryptodev_armv8_pmd); RTE_PMD_REGISTER_PARAM_STRING(CRYPTODEV_NAME_ARMV8_PMD, "max_nb_queue_pairs= " - "max_nb_sessions= " "socket_id="); -RTE_PMD_REGISTER_CRYPTO_DRIVER(armv8_crypto_drv, cryptodev_driver_id); +RTE_PMD_REGISTER_CRYPTO_DRIVER(armv8_crypto_drv, armv8_crypto_pmd_drv.driver, + cryptodev_driver_id);