Acked-by: Tejasree Kondoj <[email protected]>
> -----Original Message-----
> From: Daphne Priscilla <[email protected]>
> Sent: Friday, June 12, 2026 11:50 AM
> To: [email protected]
> Cc: [email protected]; Akhil Goyal <[email protected]>; Tejasree Kondoj
> <[email protected]>; Anoob Joseph <[email protected]>; Daphne
> Priscilla F <[email protected]>
> Subject: [PATCH] crypto/cnxk: fix out of place AES GCM
>
> For AES-GCM out of place, when AAD is present in inbuf before the data, it is
> treated as passthrough data. This results in AAD being present in outbuf
> header, but test expects outbuf header to remain zero. Passthrough data is
> now diverted to metabuf so outbuf header remains zero.
>
> Fixes: 7c19abdd0cf1 ("common/cnxk: support 103XX CPT")
> Cc: [email protected]
>
> Signed-off-by: Daphne Priscilla <[email protected]>
> ---
> .mailmap | 1 +
> drivers/common/cnxk/roc_se.h | 2 +-
> drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 3 +
> drivers/crypto/cnxk/cnxk_se.h | 96 ++++++++++++++++++++++--
> 4 files changed, 93 insertions(+), 9 deletions(-)
>
> diff --git a/.mailmap b/.mailmap
> index 118dfa0ff9..1191afbf0b 100644
> --- a/.mailmap
> +++ b/.mailmap
> @@ -334,6 +334,7 @@ Danny Patel <[email protected]> Danny Zhou
> <[email protected]> Danylo Vodopianov <[email protected]>
> Dapeng Yu <[email protected]>
> +Daphne Priscilla <[email protected]>
> Darek Stojaczyk <[email protected]> Daria Kolistratova
> <[email protected]> Dariusz Chaberski
> <[email protected]> diff --git a/drivers/common/cnxk/roc_se.h
> b/drivers/common/cnxk/roc_se.h index 499e71ce85..d3ad61ca04 100644
> --- a/drivers/common/cnxk/roc_se.h
> +++ b/drivers/common/cnxk/roc_se.h
> @@ -26,7 +26,7 @@
> #define ROC_SE_MISC_MINOR_OP_DUMMY 0x04ULL
> #define ROC_SE_MISC_MINOR_OP_HW_SUPPORT 0x08ULL
>
> -#define ROC_SE_MAX_AAD_SIZE 64
> +#define ROC_SE_MAX_AAD_SIZE 1024
> #define ROC_SE_MAX_MAC_LEN 64
>
> #define ROC_SE_OFF_CTRL_LEN 8
> diff --git a/drivers/crypto/cnxk/cnxk_cryptodev_ops.c
> b/drivers/crypto/cnxk/cnxk_cryptodev_ops.c
> index 2f9eb322dc..5e59f1d7bd 100644
> --- a/drivers/crypto/cnxk/cnxk_cryptodev_ops.c
> +++ b/drivers/crypto/cnxk/cnxk_cryptodev_ops.c
> @@ -82,6 +82,9 @@ cnxk_cpt_get_mlen(void)
> (RTE_ALIGN_CEIL(ROC_MAX_SG_IN_OUT_CNT, 4)
> >> 2) * ROC_SG_ENTRY_SIZE),
> 8);
>
> + /* Space for discarding AAD bytes from output stream in GCM OOP */
> + len += ROC_SE_MAX_AAD_SIZE;
> +
> return len;
> }
>
> diff --git a/drivers/crypto/cnxk/cnxk_se.h b/drivers/crypto/cnxk/cnxk_se.h
> index 8dbf3e73c7..09d9d1e0e3 100644
> --- a/drivers/crypto/cnxk/cnxk_se.h
> +++ b/drivers/crypto/cnxk/cnxk_se.h
> @@ -407,8 +407,28 @@ sg_inst_prep(struct roc_se_fc_params *params,
> struct cpt_inst_s *inst, uint64_t
> if (unlikely(req_flags &
> ROC_SE_SINGLE_BUF_INPLACE)) {
> i =
> fill_sg_comp_from_buf_min(scatter_comp, i, params->bufs, &size);
> } else {
> - i = fill_sg_comp_from_iov(scatter_comp, i,
> params->dst_iov, 0,
> - &size, aad_buf,
> aad_offset);
> + uint32_t dst_offset = 0;
> +
> + if (passthrough_len) {
> + if (unlikely(passthrough_len >
> ROC_SE_MAX_AAD_SIZE)) {
> + plt_dp_err(
> + "Passthrough length
> %u exceeds reserved space %u",
> + passthrough_len,
> ROC_SE_MAX_AAD_SIZE);
> + return -1;
> + }
> + uint64_t meta_passthrough =
> + (uint64_t)params-
> >meta_buf.vaddr +
> + params->meta_buf.size -
> ROC_SE_MAX_AAD_SIZE;
> + i = fill_sg_comp(scatter_comp, i,
> meta_passthrough,
> + passthrough_len);
> + size -= passthrough_len;
> + dst_offset = passthrough_len;
> + aad_offset = 0;
> + }
> + if (size)
> + i =
> fill_sg_comp_from_iov(scatter_comp, i, params->dst_iov,
> + dst_offset,
> &size, aad_buf,
> + aad_offset);
> }
> if (unlikely(size)) {
> plt_dp_err("Insufficient buffer space,"
> @@ -430,8 +450,28 @@ sg_inst_prep(struct roc_se_fc_params *params,
> struct cpt_inst_s *inst, uint64_t
> if (unlikely(req_flags &
> ROC_SE_SINGLE_BUF_INPLACE)) {
> i =
> fill_sg_comp_from_buf_min(scatter_comp, i, params->bufs, &size);
> } else {
> - i = fill_sg_comp_from_iov(scatter_comp, i,
> params->dst_iov, 0,
> - &size, aad_buf,
> aad_offset);
> + uint32_t dst_offset = 0;
> +
> + if (passthrough_len) {
> + if (unlikely(passthrough_len >
> ROC_SE_MAX_AAD_SIZE)) {
> + plt_dp_err(
> + "Passthrough length
> %u exceeds reserved space %u",
> + passthrough_len,
> ROC_SE_MAX_AAD_SIZE);
> + return -1;
> + }
> + uint64_t meta_passthrough =
> + (uint64_t)params-
> >meta_buf.vaddr +
> + params->meta_buf.size -
> ROC_SE_MAX_AAD_SIZE;
> + i = fill_sg_comp(scatter_comp, i,
> meta_passthrough,
> + passthrough_len);
> + size -= passthrough_len;
> + dst_offset = passthrough_len;
> + aad_offset = 0;
> + }
> + if (size)
> + i =
> fill_sg_comp_from_iov(scatter_comp, i, params->dst_iov,
> + dst_offset,
> &size, aad_buf,
> + aad_offset);
> }
>
> if (unlikely(size)) {
> @@ -606,8 +646,28 @@ sg2_inst_prep(struct roc_se_fc_params *params,
> struct cpt_inst_s *inst, uint64_t
> i =
> fill_sg2_comp_from_buf_min(scatter_comp, i, params->bufs,
> &size);
> } else {
> - i = fill_sg2_comp_from_iov(scatter_comp, i,
> params->dst_iov, 0,
> - &size, aad_buf,
> aad_offset);
> + uint32_t dst_offset = 0;
> +
> + if (passthrough_len) {
> + if (unlikely(passthrough_len >
> ROC_SE_MAX_AAD_SIZE)) {
> + plt_dp_err(
> + "Passthrough length
> %u exceeds reserved space %u",
> + passthrough_len,
> ROC_SE_MAX_AAD_SIZE);
> + return -1;
> + }
> + uint64_t meta_passthrough =
> + (uint64_t)params-
> >meta_buf.vaddr +
> + params->meta_buf.size -
> ROC_SE_MAX_AAD_SIZE;
> + i = fill_sg2_comp(scatter_comp, i,
> meta_passthrough,
> + passthrough_len);
> + size -= passthrough_len;
> + dst_offset = passthrough_len;
> + aad_offset = 0;
> + }
> + if (size)
> + i =
> fill_sg2_comp_from_iov(scatter_comp, i, params->dst_iov,
> + dst_offset,
> &size, aad_buf,
> + aad_offset);
> }
> if (unlikely(size)) {
> plt_dp_err("Insufficient buffer space,"
> @@ -632,8 +692,28 @@ sg2_inst_prep(struct roc_se_fc_params *params,
> struct cpt_inst_s *inst, uint64_t
> i =
> fill_sg2_comp_from_buf_min(scatter_comp, i, params->bufs,
> &size);
> } else {
> - i = fill_sg2_comp_from_iov(scatter_comp, i,
> params->dst_iov, 0,
> - &size, aad_buf,
> aad_offset);
> + uint32_t dst_offset = 0;
> +
> + if (passthrough_len) {
> + if (unlikely(passthrough_len >
> ROC_SE_MAX_AAD_SIZE)) {
> + plt_dp_err(
> + "Passthrough length
> %u exceeds reserved space %u",
> + passthrough_len,
> ROC_SE_MAX_AAD_SIZE);
> + return -1;
> + }
> + uint64_t meta_passthrough =
> + (uint64_t)params-
> >meta_buf.vaddr +
> + params->meta_buf.size -
> ROC_SE_MAX_AAD_SIZE;
> + i = fill_sg2_comp(scatter_comp, i,
> meta_passthrough,
> + passthrough_len);
> + size -= passthrough_len;
> + dst_offset = passthrough_len;
> + aad_offset = 0;
> + }
> + if (size)
> + i =
> fill_sg2_comp_from_iov(scatter_comp, i, params->dst_iov,
> + dst_offset,
> &size, aad_buf,
> + aad_offset);
> }
>
> if (unlikely(size)) {
> --
> 2.43.0