* [PATCH v1] crypto/qat: add fix for Gen4 WRITE
@ 2024-07-12 14:48 Brian Dooley
2024-07-16 8:47 ` Kusztal, ArkadiuszX
0 siblings, 1 reply; 3+ messages in thread
From: Brian Dooley @ 2024-07-12 14:48 UTC (permalink / raw)
To: Kai Ji; +Cc: dev, stable, gakhil, arkadiuszx.kusztal, Brian Dooley
All generations of QAT use the same Gen1 raw datapath. Gen4 needs a
different WRITE function than other generations. Added separation for
configuration of the raw ctx for Gen4 from the Gen1 codepath.
Fixes: 85fec6fd9674 ("crypto/qat: unify raw data path functions")
Cc: kai.ji@intel.com
Cc: stable@dpdk.org
Signed-off-by: Brian Dooley <brian.dooley@intel.com>
---
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 121 ++++++++++++++++++-
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 6 +
2 files changed, 123 insertions(+), 4 deletions(-)
diff --git a/drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c b/drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c
index 5e808a60bf..6a5d6e78b9 100644
--- a/drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c
+++ b/drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c
@@ -9,6 +9,7 @@
#include "qat_asym.h"
#include "qat_crypto.h"
#include "qat_crypto_pmd_gens.h"
+#include "adf_transport_access_macros_gen4vf.h"
static struct rte_cryptodev_capabilities qat_sym_crypto_legacy_caps_gen4[] = {
@@ -233,6 +234,78 @@ qat_sym_build_op_aead_gen4(void *in_op, struct qat_sym_session *ctx,
return 0;
}
+int
+qat_sym_dp_enqueue_done_gen4(void *qp_data, uint8_t *drv_ctx, uint32_t n)
+{
+ struct qat_qp *qp = qp_data;
+ struct qat_queue *tx_queue = &qp->tx_q;
+ struct qat_sym_dp_ctx *dp_ctx = (void *)drv_ctx;
+
+ if (unlikely(dp_ctx->cached_enqueue != n))
+ return -1;
+
+ qp->enqueued += n;
+ qp->stats.enqueued_count += n;
+
+ tx_queue->tail = dp_ctx->tail;
+
+ WRITE_CSR_RING_TAIL_GEN4VF(qp->mmap_bar_addr,
+ tx_queue->hw_bundle_number,
+ tx_queue->hw_queue_number, tx_queue->tail);
+
+ tx_queue->csr_tail = tx_queue->tail;
+ dp_ctx->cached_enqueue = 0;
+
+ return 0;
+}
+
+int
+qat_sym_dp_dequeue_done_gen4(void *qp_data, uint8_t *drv_ctx, uint32_t n)
+{
+ struct qat_qp *qp = qp_data;
+ struct qat_queue *rx_queue = &qp->rx_q;
+ struct qat_sym_dp_ctx *dp_ctx = (void *)drv_ctx;
+
+ if (unlikely(dp_ctx->cached_dequeue != n))
+ return -1;
+
+ rx_queue->head = dp_ctx->head;
+ rx_queue->nb_processed_responses += n;
+ qp->dequeued += n;
+ qp->stats.dequeued_count += n;
+ if (rx_queue->nb_processed_responses > QAT_CSR_HEAD_WRITE_THRESH) {
+ uint32_t old_head, new_head;
+ uint32_t max_head;
+
+ old_head = rx_queue->csr_head;
+ new_head = rx_queue->head;
+ max_head = qp->nb_descriptors * rx_queue->msg_size;
+
+ /* write out free descriptors */
+ void *cur_desc = (uint8_t *)rx_queue->base_addr + old_head;
+
+ if (new_head < old_head) {
+ memset(cur_desc, ADF_RING_EMPTY_SIG_BYTE,
+ max_head - old_head);
+ memset(rx_queue->base_addr, ADF_RING_EMPTY_SIG_BYTE,
+ new_head);
+ } else {
+ memset(cur_desc, ADF_RING_EMPTY_SIG_BYTE, new_head -
+ old_head);
+ }
+ rx_queue->nb_processed_responses = 0;
+ rx_queue->csr_head = new_head;
+
+ /* write current head to CSR */
+ WRITE_CSR_RING_HEAD_GEN4VF(qp->mmap_bar_addr,
+ rx_queue->hw_bundle_number, rx_queue->hw_queue_number,
+ new_head);
+ }
+
+ dp_ctx->cached_dequeue = 0;
+ return 0;
+}
+
int
qat_sym_crypto_set_session_gen4(void *cdev, void *session)
{
@@ -390,11 +463,51 @@ qat_sym_configure_raw_dp_ctx_gen4(void *_raw_dp_ctx, void *_ctx)
{
struct rte_crypto_raw_dp_ctx *raw_dp_ctx = _raw_dp_ctx;
struct qat_sym_session *ctx = _ctx;
- int ret;
- ret = qat_sym_configure_raw_dp_ctx_gen1(_raw_dp_ctx, _ctx);
- if (ret < 0)
- return ret;
+ raw_dp_ctx->enqueue_done = qat_sym_dp_enqueue_done_gen4;
+ raw_dp_ctx->dequeue_burst = qat_sym_dp_dequeue_burst_gen1;
+ raw_dp_ctx->dequeue = qat_sym_dp_dequeue_single_gen1;
+ raw_dp_ctx->dequeue_done = qat_sym_dp_dequeue_done_gen4;
+
+ if ((ctx->qat_cmd == ICP_QAT_FW_LA_CMD_HASH_CIPHER ||
+ ctx->qat_cmd == ICP_QAT_FW_LA_CMD_CIPHER_HASH) &&
+ !ctx->is_gmac) {
+ /* AES-GCM or AES-CCM */
+ if (ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_GALOIS_128 ||
+ ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_GALOIS_64 ||
+ (ctx->qat_cipher_alg == ICP_QAT_HW_CIPHER_ALGO_AES128
+ && ctx->qat_mode == ICP_QAT_HW_CIPHER_CTR_MODE
+ && ctx->qat_hash_alg ==
+ ICP_QAT_HW_AUTH_ALGO_AES_CBC_MAC)) {
+ raw_dp_ctx->enqueue_burst =
+ qat_sym_dp_enqueue_aead_jobs_gen1;
+ raw_dp_ctx->enqueue =
+ qat_sym_dp_enqueue_single_aead_gen1;
+ } else {
+ raw_dp_ctx->enqueue_burst =
+ qat_sym_dp_enqueue_chain_jobs_gen1;
+ raw_dp_ctx->enqueue =
+ qat_sym_dp_enqueue_single_chain_gen1;
+ }
+ } else if (ctx->qat_cmd == ICP_QAT_FW_LA_CMD_AUTH || ctx->is_gmac) {
+ raw_dp_ctx->enqueue_burst = qat_sym_dp_enqueue_auth_jobs_gen1;
+ raw_dp_ctx->enqueue = qat_sym_dp_enqueue_single_auth_gen1;
+ } else if (ctx->qat_cmd == ICP_QAT_FW_LA_CMD_CIPHER) {
+ if (ctx->qat_mode == ICP_QAT_HW_CIPHER_AEAD_MODE ||
+ ctx->qat_cipher_alg ==
+ ICP_QAT_HW_CIPHER_ALGO_CHACHA20_POLY1305) {
+ raw_dp_ctx->enqueue_burst =
+ qat_sym_dp_enqueue_aead_jobs_gen1;
+ raw_dp_ctx->enqueue =
+ qat_sym_dp_enqueue_single_aead_gen1;
+ } else {
+ raw_dp_ctx->enqueue_burst =
+ qat_sym_dp_enqueue_cipher_jobs_gen1;
+ raw_dp_ctx->enqueue =
+ qat_sym_dp_enqueue_single_cipher_gen1;
+ }
+ } else
+ return -1;
if (ctx->is_single_pass && ctx->is_ucs) {
raw_dp_ctx->enqueue_burst = qat_sym_dp_enqueue_aead_jobs_gen4;
diff --git a/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h b/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
index 1f5d2583c4..2c5816e696 100644
--- a/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
+++ b/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
@@ -1040,6 +1040,12 @@ qat_sym_dp_enqueue_done_gen1(void *qp_data, uint8_t *drv_ctx, uint32_t n);
int
qat_sym_dp_dequeue_done_gen1(void *qp_data, uint8_t *drv_ctx, uint32_t n);
+int
+qat_sym_dp_enqueue_done_gen4(void *qp_data, uint8_t *drv_ctx, uint32_t n);
+
+int
+qat_sym_dp_dequeue_done_gen4(void *qp_data, uint8_t *drv_ctx, uint32_t n);
+
int
qat_sym_configure_raw_dp_ctx_gen1(void *_raw_dp_ctx, void *_ctx);
--
2.25.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* RE: [PATCH v1] crypto/qat: add fix for Gen4 WRITE
2024-07-12 14:48 [PATCH v1] crypto/qat: add fix for Gen4 WRITE Brian Dooley
@ 2024-07-16 8:47 ` Kusztal, ArkadiuszX
2024-07-18 15:29 ` Akhil Goyal
0 siblings, 1 reply; 3+ messages in thread
From: Kusztal, ArkadiuszX @ 2024-07-16 8:47 UTC (permalink / raw)
To: Dooley, Brian, Ji, Kai; +Cc: dev, stable, gakhil
Acked-by: Arkadiusz Kusztal <arkadiuszx.kusztal@intel.com>
> -----Original Message-----
> From: Dooley, Brian <brian.dooley@intel.com>
> Sent: Friday, July 12, 2024 4:49 PM
> To: Ji, Kai <kai.ji@intel.com>
> Cc: dev@dpdk.org; stable@dpdk.org; gakhil@marvell.com; Kusztal, ArkadiuszX
> <arkadiuszx.kusztal@intel.com>; Dooley, Brian <brian.dooley@intel.com>
> Subject: [PATCH v1] crypto/qat: add fix for Gen4 WRITE
>
> All generations of QAT use the same Gen1 raw datapath. Gen4 needs a different
> WRITE function than other generations. Added separation for configuration of
> the raw ctx for Gen4 from the Gen1 codepath.
>
> Fixes: 85fec6fd9674 ("crypto/qat: unify raw data path functions")
> Cc: kai.ji@intel.com
> Cc: stable@dpdk.org
>
> Signed-off-by: Brian Dooley <brian.dooley@intel.com>
> ---
> drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 121 ++++++++++++++++++-
> drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 6 +
> 2 files changed, 123 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c
> b/drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c
> index 5e808a60bf..6a5d6e78b9 100644
> --- a/drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c
> +++ b/drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c
> @@ -9,6 +9,7 @@
> #include "qat_asym.h"
> #include "qat_crypto.h"
> #include "qat_crypto_pmd_gens.h"
> +#include "adf_transport_access_macros_gen4vf.h"
>
>
> static struct rte_cryptodev_capabilities qat_sym_crypto_legacy_caps_gen4[] = {
> @@ -233,6 +234,78 @@ qat_sym_build_op_aead_gen4(void *in_op, struct
> qat_sym_session *ctx,
> return 0;
> }
>
> +int
> +qat_sym_dp_enqueue_done_gen4(void *qp_data, uint8_t *drv_ctx, uint32_t
> +n) {
> + struct qat_qp *qp = qp_data;
> + struct qat_queue *tx_queue = &qp->tx_q;
> + struct qat_sym_dp_ctx *dp_ctx = (void *)drv_ctx;
> +
> + if (unlikely(dp_ctx->cached_enqueue != n))
> + return -1;
> +
> + qp->enqueued += n;
> + qp->stats.enqueued_count += n;
> +
> + tx_queue->tail = dp_ctx->tail;
> +
> + WRITE_CSR_RING_TAIL_GEN4VF(qp->mmap_bar_addr,
> + tx_queue->hw_bundle_number,
> + tx_queue->hw_queue_number, tx_queue->tail);
> +
> + tx_queue->csr_tail = tx_queue->tail;
> + dp_ctx->cached_enqueue = 0;
> +
> + return 0;
> +}
> +
> +int
> +qat_sym_dp_dequeue_done_gen4(void *qp_data, uint8_t *drv_ctx, uint32_t
> +n) {
> + struct qat_qp *qp = qp_data;
> + struct qat_queue *rx_queue = &qp->rx_q;
> + struct qat_sym_dp_ctx *dp_ctx = (void *)drv_ctx;
> +
> + if (unlikely(dp_ctx->cached_dequeue != n))
> + return -1;
> +
> + rx_queue->head = dp_ctx->head;
> + rx_queue->nb_processed_responses += n;
> + qp->dequeued += n;
> + qp->stats.dequeued_count += n;
> + if (rx_queue->nb_processed_responses >
> QAT_CSR_HEAD_WRITE_THRESH) {
> + uint32_t old_head, new_head;
> + uint32_t max_head;
> +
> + old_head = rx_queue->csr_head;
> + new_head = rx_queue->head;
> + max_head = qp->nb_descriptors * rx_queue->msg_size;
> +
> + /* write out free descriptors */
> + void *cur_desc = (uint8_t *)rx_queue->base_addr + old_head;
> +
> + if (new_head < old_head) {
> + memset(cur_desc, ADF_RING_EMPTY_SIG_BYTE,
> + max_head - old_head);
> + memset(rx_queue->base_addr,
> ADF_RING_EMPTY_SIG_BYTE,
> + new_head);
> + } else {
> + memset(cur_desc, ADF_RING_EMPTY_SIG_BYTE,
> new_head -
> + old_head);
> + }
> + rx_queue->nb_processed_responses = 0;
> + rx_queue->csr_head = new_head;
> +
> + /* write current head to CSR */
> + WRITE_CSR_RING_HEAD_GEN4VF(qp->mmap_bar_addr,
> + rx_queue->hw_bundle_number, rx_queue-
> >hw_queue_number,
> + new_head);
> + }
> +
> + dp_ctx->cached_dequeue = 0;
> + return 0;
> +}
> +
> int
> qat_sym_crypto_set_session_gen4(void *cdev, void *session) { @@ -390,11
> +463,51 @@ qat_sym_configure_raw_dp_ctx_gen4(void *_raw_dp_ctx, void
> *_ctx) {
> struct rte_crypto_raw_dp_ctx *raw_dp_ctx = _raw_dp_ctx;
> struct qat_sym_session *ctx = _ctx;
> - int ret;
>
> - ret = qat_sym_configure_raw_dp_ctx_gen1(_raw_dp_ctx, _ctx);
> - if (ret < 0)
> - return ret;
> + raw_dp_ctx->enqueue_done = qat_sym_dp_enqueue_done_gen4;
> + raw_dp_ctx->dequeue_burst = qat_sym_dp_dequeue_burst_gen1;
> + raw_dp_ctx->dequeue = qat_sym_dp_dequeue_single_gen1;
> + raw_dp_ctx->dequeue_done = qat_sym_dp_dequeue_done_gen4;
> +
> + if ((ctx->qat_cmd == ICP_QAT_FW_LA_CMD_HASH_CIPHER ||
> + ctx->qat_cmd ==
> ICP_QAT_FW_LA_CMD_CIPHER_HASH) &&
> + !ctx->is_gmac) {
> + /* AES-GCM or AES-CCM */
> + if (ctx->qat_hash_alg ==
> ICP_QAT_HW_AUTH_ALGO_GALOIS_128 ||
> + ctx->qat_hash_alg ==
> ICP_QAT_HW_AUTH_ALGO_GALOIS_64 ||
> + (ctx->qat_cipher_alg ==
> ICP_QAT_HW_CIPHER_ALGO_AES128
> + && ctx->qat_mode ==
> ICP_QAT_HW_CIPHER_CTR_MODE
> + && ctx->qat_hash_alg ==
> +
> ICP_QAT_HW_AUTH_ALGO_AES_CBC_MAC)) {
> + raw_dp_ctx->enqueue_burst =
> +
> qat_sym_dp_enqueue_aead_jobs_gen1;
> + raw_dp_ctx->enqueue =
> +
> qat_sym_dp_enqueue_single_aead_gen1;
> + } else {
> + raw_dp_ctx->enqueue_burst =
> +
> qat_sym_dp_enqueue_chain_jobs_gen1;
> + raw_dp_ctx->enqueue =
> +
> qat_sym_dp_enqueue_single_chain_gen1;
> + }
> + } else if (ctx->qat_cmd == ICP_QAT_FW_LA_CMD_AUTH || ctx-
> >is_gmac) {
> + raw_dp_ctx->enqueue_burst =
> qat_sym_dp_enqueue_auth_jobs_gen1;
> + raw_dp_ctx->enqueue =
> qat_sym_dp_enqueue_single_auth_gen1;
> + } else if (ctx->qat_cmd == ICP_QAT_FW_LA_CMD_CIPHER) {
> + if (ctx->qat_mode == ICP_QAT_HW_CIPHER_AEAD_MODE ||
> + ctx->qat_cipher_alg ==
> +
> ICP_QAT_HW_CIPHER_ALGO_CHACHA20_POLY1305) {
> + raw_dp_ctx->enqueue_burst =
> +
> qat_sym_dp_enqueue_aead_jobs_gen1;
> + raw_dp_ctx->enqueue =
> +
> qat_sym_dp_enqueue_single_aead_gen1;
> + } else {
> + raw_dp_ctx->enqueue_burst =
> +
> qat_sym_dp_enqueue_cipher_jobs_gen1;
> + raw_dp_ctx->enqueue =
> +
> qat_sym_dp_enqueue_single_cipher_gen1;
> + }
> + } else
> + return -1;
>
> if (ctx->is_single_pass && ctx->is_ucs) {
> raw_dp_ctx->enqueue_burst =
> qat_sym_dp_enqueue_aead_jobs_gen4;
> diff --git a/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
> b/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
> index 1f5d2583c4..2c5816e696 100644
> --- a/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
> +++ b/drivers/crypto/qat/dev/qat_crypto_pmd_gens.h
> @@ -1040,6 +1040,12 @@ qat_sym_dp_enqueue_done_gen1(void *qp_data,
> uint8_t *drv_ctx, uint32_t n); int qat_sym_dp_dequeue_done_gen1(void
> *qp_data, uint8_t *drv_ctx, uint32_t n);
>
> +int
> +qat_sym_dp_enqueue_done_gen4(void *qp_data, uint8_t *drv_ctx, uint32_t
> +n);
> +
> +int
> +qat_sym_dp_dequeue_done_gen4(void *qp_data, uint8_t *drv_ctx, uint32_t
> +n);
> +
> int
> qat_sym_configure_raw_dp_ctx_gen1(void *_raw_dp_ctx, void *_ctx);
>
> --
> 2.25.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* RE: [PATCH v1] crypto/qat: add fix for Gen4 WRITE
2024-07-16 8:47 ` Kusztal, ArkadiuszX
@ 2024-07-18 15:29 ` Akhil Goyal
0 siblings, 0 replies; 3+ messages in thread
From: Akhil Goyal @ 2024-07-18 15:29 UTC (permalink / raw)
To: Kusztal, ArkadiuszX, Dooley, Brian, Ji, Kai; +Cc: dev, stable
> Acked-by: Arkadiusz Kusztal <arkadiuszx.kusztal@intel.com>
> > All generations of QAT use the same Gen1 raw datapath. Gen4 needs a different
> > WRITE function than other generations. Added separation for configuration of
> > the raw ctx for Gen4 from the Gen1 codepath.
> >
> > Fixes: 85fec6fd9674 ("crypto/qat: unify raw data path functions")
> > Cc: kai.ji@intel.com
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Brian Dooley <brian.dooley@intel.com>
Applied to dpdk-next-crypto
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-07-18 15:30 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-07-12 14:48 [PATCH v1] crypto/qat: add fix for Gen4 WRITE Brian Dooley
2024-07-16 8:47 ` Kusztal, ArkadiuszX
2024-07-18 15:29 ` Akhil Goyal
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).