crypto/dpaa_sec: fix IOVA table
[dpdk.git] / drivers / crypto / dpaa_sec / dpaa_sec.c
index 39533a9..39c9271 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
  *   Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
- *   Copyright 2017-2018 NXP
+ *   Copyright 2017-2019 NXP
  *
  */
 
@@ -38,6 +38,7 @@
 #include <rte_dpaa_bus.h>
 #include <dpaa_sec.h>
 #include <dpaa_sec_log.h>
+#include <dpaax_iova_table.h>
 
 enum rta_sec_era rta_sec_era;
 
@@ -61,7 +62,7 @@ dpaa_sec_op_ending(struct dpaa_sec_op_ctx *ctx)
                ctx->op->status = RTE_CRYPTO_OP_STATUS_ERROR;
        }
 
-       /* report op status to sym->op and then free the ctx memeory  */
+       /* report op status to sym->op and then free the ctx memory  */
        rte_mempool_put(ctx->ctx_pool, (void *)ctx);
 }
 
@@ -100,8 +101,10 @@ dpaa_mem_vtop(void *vaddr)
        const struct rte_memseg *ms;
 
        ms = rte_mem_virt2memseg(vaddr, NULL);
-       if (ms)
+       if (ms) {
+               dpaax_iova_table_update(ms->iova, ms->addr, ms->len);
                return ms->iova + RTE_PTR_DIFF(vaddr, ms->addr);
+       }
        return (size_t)NULL;
 }
 
@@ -643,7 +646,7 @@ dpaa_sec_prep_cdb(dpaa_sec_session *ses)
 
                shared_desc_len = cnstr_shdsc_blkcipher(
                                                cdb->sh_desc, true,
-                                               swap, &alginfo_c,
+                                               swap, SHR_NEVER, &alginfo_c,
                                                NULL,
                                                ses->iv.length,
                                                ses->dir);
@@ -660,7 +663,7 @@ dpaa_sec_prep_cdb(dpaa_sec_session *ses)
                alginfo_a.key_type = RTA_DATA_IMM;
 
                shared_desc_len = cnstr_shdsc_hmac(cdb->sh_desc, true,
-                                                  swap, &alginfo_a,
+                                                  swap, SHR_NEVER, &alginfo_a,
                                                   !ses->dir,
                                                   ses->digest_length);
        } else if (is_aead(ses)) {
@@ -676,13 +679,13 @@ dpaa_sec_prep_cdb(dpaa_sec_session *ses)
 
                if (ses->dir == DIR_ENC)
                        shared_desc_len = cnstr_shdsc_gcm_encap(
-                                       cdb->sh_desc, true, swap,
+                                       cdb->sh_desc, true, swap, SHR_NEVER,
                                        &alginfo,
                                        ses->iv.length,
                                        ses->digest_length);
                else
                        shared_desc_len = cnstr_shdsc_gcm_decap(
-                                       cdb->sh_desc, true, swap,
+                                       cdb->sh_desc, true, swap, SHR_NEVER,
                                        &alginfo,
                                        ses->iv.length,
                                        ses->digest_length);
@@ -741,7 +744,7 @@ dpaa_sec_prep_cdb(dpaa_sec_session *ses)
                 * overwritten in fd for each packet.
                 */
                shared_desc_len = cnstr_shdsc_authenc(cdb->sh_desc,
-                               true, swap, &alginfo_c, &alginfo_a,
+                               true, swap, SHR_SERIAL, &alginfo_c, &alginfo_a,
                                ses->iv.length, 0,
                                ses->digest_length, ses->dir);
        }
@@ -1940,13 +1943,13 @@ dpaa_sec_attach_rxq(struct dpaa_sec_dev_private *qi)
 {
        unsigned int i;
 
-       for (i = 0; i < qi->max_nb_sessions; i++) {
+       for (i = 0; i < qi->max_nb_sessions * MAX_DPAA_CORES; i++) {
                if (qi->inq_attach[i] == 0) {
                        qi->inq_attach[i] = 1;
                        return &qi->inq[i];
                }
        }
-       DPAA_SEC_WARN("All ses session in use %x", qi->max_nb_sessions);
+       DPAA_SEC_WARN("All session in use %u", qi->max_nb_sessions);
 
        return NULL;
 }
@@ -2109,30 +2112,38 @@ dpaa_sec_sym_session_configure(struct rte_cryptodev *dev,
        return 0;
 }
 
+static inline void
+free_session_memory(struct rte_cryptodev *dev, dpaa_sec_session *s)
+{
+       struct dpaa_sec_dev_private *qi = dev->data->dev_private;
+       struct rte_mempool *sess_mp = rte_mempool_from_obj((void *)s);
+       uint8_t i;
+
+       for (i = 0; i < MAX_DPAA_CORES; i++) {
+               if (s->inq[i])
+                       dpaa_sec_detach_rxq(qi, s->inq[i]);
+               s->inq[i] = NULL;
+               s->qp[i] = NULL;
+       }
+       rte_free(s->cipher_key.data);
+       rte_free(s->auth_key.data);
+       memset(s, 0, sizeof(dpaa_sec_session));
+       rte_mempool_put(sess_mp, (void *)s);
+}
+
 /** Clear the memory of session so it doesn't leave key material behind */
 static void
 dpaa_sec_sym_session_clear(struct rte_cryptodev *dev,
                struct rte_cryptodev_sym_session *sess)
 {
-       struct dpaa_sec_dev_private *qi = dev->data->dev_private;
+       PMD_INIT_FUNC_TRACE();
        uint8_t index = dev->driver_id;
        void *sess_priv = get_sym_session_private_data(sess, index);
-
-       PMD_INIT_FUNC_TRACE();
-
        dpaa_sec_session *s = (dpaa_sec_session *)sess_priv;
 
        if (sess_priv) {
-               struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
-
-               if (s->inq[rte_lcore_id() % MAX_DPAA_CORES])
-                       dpaa_sec_detach_rxq(qi,
-                               s->inq[rte_lcore_id() % MAX_DPAA_CORES]);
-               rte_free(s->cipher_key.data);
-               rte_free(s->auth_key.data);
-               memset(s, 0, sizeof(dpaa_sec_session));
+               free_session_memory(dev, s);
                set_sym_session_private_data(sess, index, NULL);
-               rte_mempool_put(sess_mp, sess_priv);
        }
 }
 
@@ -2253,6 +2264,9 @@ dpaa_sec_set_ipsec_session(__rte_unused struct rte_cryptodev *dev,
                        PDBOPTS_ESP_IVSRC |
                        PDBHMO_ESP_ENCAP_DTTL |
                        PDBHMO_ESP_SNR;
+               if (ipsec_xform->options.esn)
+                       session->encap_pdb.options |= PDBOPTS_ESP_ESN;
+
                session->encap_pdb.spi = ipsec_xform->spi;
                session->encap_pdb.ip_hdr_len = sizeof(struct ip);
 
@@ -2261,6 +2275,8 @@ dpaa_sec_set_ipsec_session(__rte_unused struct rte_cryptodev *dev,
                        RTE_SECURITY_IPSEC_SA_DIR_INGRESS) {
                memset(&session->decap_pdb, 0, sizeof(struct ipsec_decap_pdb));
                session->decap_pdb.options = sizeof(struct ip) << 16;
+               if (ipsec_xform->options.esn)
+                       session->decap_pdb.options |= PDBOPTS_ESP_ESN;
                session->dir = DIR_DEC;
        } else
                goto out;
@@ -2442,22 +2458,15 @@ dpaa_sec_security_session_destroy(void *dev __rte_unused,
 {
        PMD_INIT_FUNC_TRACE();
        void *sess_priv = get_sec_session_private_data(sess);
-
        dpaa_sec_session *s = (dpaa_sec_session *)sess_priv;
 
        if (sess_priv) {
-               struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
-
-               rte_free(s->cipher_key.data);
-               rte_free(s->auth_key.data);
-               memset(sess, 0, sizeof(dpaa_sec_session));
+               free_session_memory((struct rte_cryptodev *)dev, s);
                set_sec_session_private_data(sess, NULL);
-               rte_mempool_put(sess_mp, sess_priv);
        }
        return 0;
 }
 
-
 static int
 dpaa_sec_dev_configure(struct rte_cryptodev *dev,
                       struct rte_cryptodev_config *config __rte_unused)