Acked-by: Kai Ji <[email protected]>

________________________________
From: Nicolau, Radu <[email protected]>
Sent: Tuesday, October 20, 2026 12:44
To: [email protected] <[email protected]>
Cc: Nicolau, Radu <[email protected]>; Ji, Kai <[email protected]>; 
Burakov, Anatoly <[email protected]>
Subject: [PATCH v2] crypto/qat: add Gen 6 support

Add support for Gen 6 QAT devices

Signed-off-by: Radu Nicolau <[email protected]>
---
v2: added handling of OOP Auth

 doc/guides/cryptodevs/qat.rst                |   5 +
 doc/guides/rel_notes/release_26_11.rst       |   4 +
 drivers/common/qat/dev/qat_dev_gen6.c        |  63 ++++
 drivers/common/qat/meson.build               |   2 +
 drivers/common/qat/qat_adf/icp_qat_fw_la.h   |   7 +-
 drivers/common/qat/qat_common.h              |   1 +
 drivers/common/qat/qat_device.c              |   5 +
 drivers/crypto/qat/dev/qat_crypto_pmd_gen6.c | 374 +++++++++++++++++++
 drivers/crypto/qat/qat_sym_session.c         |  53 ++-
 drivers/crypto/qat/qat_sym_session.h         |   8 +
 10 files changed, 502 insertions(+), 20 deletions(-)
 create mode 100644 drivers/common/qat/dev/qat_dev_gen6.c
 create mode 100644 drivers/crypto/qat/dev/qat_crypto_pmd_gen6.c

diff --git a/doc/guides/cryptodevs/qat.rst b/doc/guides/cryptodevs/qat.rst
index 6c96c5f88d..27713913ae 100644
--- a/doc/guides/cryptodevs/qat.rst
+++ b/doc/guides/cryptodevs/qat.rst
@@ -28,6 +28,7 @@ poll mode crypto driver support for the following hardware 
accelerator devices:
 * ``Intel QuickAssist Technology 4xxx``
 * ``Intel QuickAssist Technology 300xx``
 * ``Intel QuickAssist Technology 420xx``
+* ``Intel QuickAssist Technology 6xxx``
 * ``Intel QuickAssist Technology apfxx``


@@ -142,6 +143,7 @@ Limitations
   generations in the same process if planning to use for GCM.
 * The mixed algo feature on GEN2 is not supported by all kernel drivers. Check
   the notes under the Available Kernel Drivers table below for specific 
details.
+* Chained cipher and hash operations are not supported on GEN6 devices.
 * Out-of-place is not supported for combined Crypto-CRC DOCSIS security
   protocol.
 * ``RTE_CRYPTO_CIPHER_DES_DOCSISBPI`` is not supported for combined Crypto-CRC
@@ -182,6 +184,7 @@ poll mode crypto driver support for the following hardware 
accelerator devices:
 * ``Intel QuickAssist Technology 401xxx``
 * ``Intel QuickAssist Technology 300xx``
 * ``Intel QuickAssist Technology 420xx``
+* ``Intel QuickAssist Technology 6xxx``

 The QAT ASYM PMD has support for:

@@ -483,6 +486,8 @@ to see the full table)
    
+-----+-----+-----+-----+----------+---------------+---------------+------------+--------+------+--------+--------+
    | Yes | Yes | Yes | 5   | 420xx    | linux/6.8+    | qat_420xx     | 420xx  
    | 4946   | 2    | 4947   | 16     |
    
+-----+-----+-----+-----+----------+---------------+---------------+------------+--------+------+--------+--------+
+   | Yes | Yes | No  | 6   | 6xxx     | linux/6.16+   | qat_6xxx      | 6xxx   
    | 4948   | 1    | 4949   | 16     |
+   
+-----+-----+-----+-----+----------+---------------+---------------+------------+--------+------+--------+--------+

 * Note: Symmetric mixed crypto algorithms feature on Gen 2 works only with IDZ 
driver version 4.9.0+

diff --git a/doc/guides/rel_notes/release_26_11.rst 
b/doc/guides/rel_notes/release_26_11.rst
index c8cc86295d..fdcf155e07 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -55,6 +55,10 @@ New Features
      Also, make sure to start the actual text at the margin.
      =======================================================

+* **Updated Intel QuickAssist Technology (QAT) crypto driver.**
+
+  * Added support for Gen 6 QAT devices.
+

 Removed Items
 -------------
diff --git a/drivers/common/qat/dev/qat_dev_gen6.c 
b/drivers/common/qat/dev/qat_dev_gen6.c
new file mode 100644
index 0000000000..e8b9201c04
--- /dev/null
+++ b/drivers/common/qat/dev/qat_dev_gen6.c
@@ -0,0 +1,63 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Intel Corporation
+ */
+
+#include <dev_driver.h>
+#include <rte_pci.h>
+
+#include "qat_device.h"
+#include "qat_qp.h"
+#include "adf_pf2vf_msg.h"
+#include "qat_dev_gens.h"
+
+#include <stdint.h>
+
+static struct qat_pf2vf_dev qat_pf2vf_gen6 = {
+       .pf2vf_offset = ADF_4XXXIOV_PF2VM_OFFSET,
+       .vf2pf_offset = ADF_4XXXIOV_VM2PF_OFFSET,
+       .pf2vf_type_shift = ADF_PFVF_2X_MSGTYPE_SHIFT,
+       .pf2vf_type_mask = ADF_PFVF_2X_MSGTYPE_MASK,
+       .pf2vf_data_shift = ADF_PFVF_2X_MSGDATA_SHIFT,
+       .pf2vf_data_mask = ADF_PFVF_2X_MSGDATA_MASK,
+};
+
+static struct qat_qp_hw_spec_funcs qat_qp_hw_spec_gen6 = {
+       .qat_qp_rings_per_service = qat_qp_rings_per_service_gen4,
+       .qat_qp_build_ring_base = qat_qp_build_ring_base_gen4,
+       .qat_qp_adf_arb_enable = qat_qp_adf_arb_enable_gen4,
+       .qat_qp_adf_arb_disable = qat_qp_adf_arb_disable_gen4,
+       .qat_qp_adf_configure_queues = qat_qp_adf_configure_queues_gen4,
+       .qat_qp_csr_write_tail = qat_qp_csr_write_tail_gen4,
+       .qat_qp_csr_write_head = qat_qp_csr_write_head_gen4,
+       .qat_qp_csr_setup = qat_qp_csr_setup_gen4,
+       .qat_qp_get_hw_data = qat_qp_get_hw_data_gen4,
+};
+
+static int
+qat_dev_get_slice_map_gen6(uint32_t *map,
+       const struct rte_pci_device *pci_dev)
+{
+       if (rte_pci_read_config(pci_dev, map,
+                       ADF1_C4XXXIOV_VFLEGFUSES_LEN,
+                       ADF_C4XXXIOV_VFLEGFUSES_OFFSET) < 0) {
+               return -1;
+       }
+       return 0;
+}
+
+static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen6 = {
+       .qat_dev_reset_ring_pairs = qat_reset_ring_pairs_gen4,
+       .qat_dev_get_transport_bar = qat_dev_get_transport_bar_gen4,
+       .qat_dev_get_misc_bar = qat_dev_get_misc_bar_gen4,
+       .qat_dev_read_config = qat_dev_read_config_gen4,
+       .qat_dev_get_extra_size = qat_dev_get_extra_size_gen4,
+       .qat_dev_get_slice_map = qat_dev_get_slice_map_gen6,
+};
+
+RTE_INIT(qat_dev_gen_6_init)
+{
+       qat_qp_hw_spec[QAT_GEN6] = &qat_qp_hw_spec_gen6;
+       qat_dev_hw_spec[QAT_GEN6] = &qat_dev_hw_spec_gen6;
+       qat_gen_config[QAT_GEN6].dev_gen = QAT_GEN6;
+       qat_gen_config[QAT_GEN6].pf2vf_dev = &qat_pf2vf_gen6;
+}
diff --git a/drivers/common/qat/meson.build b/drivers/common/qat/meson.build
index b946354a42..db792864a2 100644
--- a/drivers/common/qat/meson.build
+++ b/drivers/common/qat/meson.build
@@ -106,6 +106,7 @@ sources += files(
         'dev/qat_dev_gen3.c',
         'dev/qat_dev_gen4.c',
         'dev/qat_dev_gen5.c',
+        'dev/qat_dev_gen6.c',
         'dev/qat_dev_gen_lce.c',
 )
 includes += include_directories(
@@ -138,6 +139,7 @@ if qat_crypto
             'dev/qat_crypto_pmd_gen3.c',
             'dev/qat_crypto_pmd_gen4.c',
             'dev/qat_crypto_pmd_gen5.c',
+            'dev/qat_crypto_pmd_gen6.c',
             'dev/qat_crypto_pmd_gen_lce.c',
         ]
         sources += files(join_paths(qat_crypto_relpath, f))
diff --git a/drivers/common/qat/qat_adf/icp_qat_fw_la.h 
b/drivers/common/qat/qat_adf/icp_qat_fw_la.h
index 735dfb5103..366e1f2252 100644
--- a/drivers/common/qat/qat_adf/icp_qat_fw_la.h
+++ b/drivers/common/qat/qat_adf/icp_qat_fw_la.h
@@ -473,7 +473,12 @@ struct icp_qat_fw_la_cipher_20_req_params {
         uint32_t   spc_aad_sz;
         uint64_t   spc_aad_addr;
         uint64_t   spc_auth_res_addr;
-       uint8_t    reserved[3];
+       union {
+               uint8_t    reserved[3];
+               struct {
+                       uint8_t hmac_sz;
+               };
+       };
         uint8_t    spc_auth_res_sz;
 };

diff --git a/drivers/common/qat/qat_common.h b/drivers/common/qat/qat_common.h
index 51d20267bd..133a81c856 100644
--- a/drivers/common/qat/qat_common.h
+++ b/drivers/common/qat/qat_common.h
@@ -34,6 +34,7 @@ enum qat_device_gen {
         QAT_GEN3,
         QAT_GEN4,
         QAT_GEN5,
+       QAT_GEN6,
         QAT_GEN_LCE,
         QAT_VQAT,
         QAT_N_GENS
diff --git a/drivers/common/qat/qat_device.c b/drivers/common/qat/qat_device.c
index 07a8b19583..f0ed115b30 100644
--- a/drivers/common/qat/qat_device.c
+++ b/drivers/common/qat/qat_device.c
@@ -70,6 +70,9 @@ static const struct rte_pci_id pci_id_qat_map[] = {
                 {
                         RTE_PCI_DEVICE(0x8086, 0x4947),
                 },
+               {
+                       RTE_PCI_DEVICE(0x8086, 0x4949),
+               },
                 {
                         RTE_PCI_DEVICE(0x8086, 0x1454),
                 },
@@ -152,6 +155,8 @@ pick_gen(const struct rte_pci_device *pci_dev)
                 return QAT_GEN4;
         case 0x4947:
                 return QAT_GEN5;
+       case 0x4949:
+               return QAT_GEN6;
         case 0x1454:
                 return QAT_GEN_LCE;
         case 0x0da5:
diff --git a/drivers/crypto/qat/dev/qat_crypto_pmd_gen6.c 
b/drivers/crypto/qat/dev/qat_crypto_pmd_gen6.c
new file mode 100644
index 0000000000..7f810cfcc1
--- /dev/null
+++ b/drivers/crypto/qat/dev/qat_crypto_pmd_gen6.c
@@ -0,0 +1,374 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Intel Corporation
+ */
+
+#include <rte_cryptodev.h>
+#include <cryptodev_pmd.h>
+#include "qat_sym_session.h"
+#include "qat_sym.h"
+#include "qat_asym.h"
+#include "qat_crypto.h"
+#include "qat_crypto_pmd_gens.h"
+
+
+static struct rte_cryptodev_capabilities qat_sym_crypto_legacy_caps_gen6[] = {
+       QAT_SYM_PLAIN_AUTH_CAP(SHA1,
+               CAP_SET(block_size, 64),
+               CAP_RNG(digest_size, 1, 20, 1)),
+       QAT_SYM_AUTH_CAP(SHA224,
+               CAP_SET(block_size, 64),
+               CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 28, 1),
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
+};
+
+static struct rte_cryptodev_capabilities qat_sym_crypto_caps_gen6[] = {
+       QAT_SYM_AUTH_CAP(SHA256_HMAC,
+               CAP_SET(block_size, 64),
+               CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 32, 1),
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
+       QAT_SYM_AUTH_CAP(SHA384_HMAC,
+               CAP_SET(block_size, 128),
+               CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 48, 1),
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
+       QAT_SYM_AUTH_CAP(SHA512_HMAC,
+               CAP_SET(block_size, 128),
+               CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 64, 1),
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
+       QAT_SYM_AUTH_CAP(NULL,
+               CAP_SET(block_size, 1),
+               CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(digest_size),
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
+       QAT_SYM_CIPHER_CAP(NULL,
+               CAP_SET(block_size, 1),
+               CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(iv_size)),
+       QAT_SYM_AUTH_CAP(SHA256,
+               CAP_SET(block_size, 64),
+               CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 32, 1),
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
+       QAT_SYM_AUTH_CAP(SHA384,
+               CAP_SET(block_size, 128),
+               CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 48, 1),
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
+       QAT_SYM_AUTH_CAP(SHA512,
+               CAP_SET(block_size, 128),
+               CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 64, 1),
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),
+       QAT_SYM_CIPHER_CAP(AES_CTR,
+               CAP_SET(block_size, 16),
+               CAP_RNG(key_size, 16, 32, 16), CAP_RNG(iv_size, 16, 16, 0)),
+       QAT_SYM_AEAD_CAP(AES_GCM,
+               CAP_SET(block_size, 16),
+               CAP_RNG(key_size, 16, 32, 16), CAP_RNG(digest_size, 8, 16, 4),
+               CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 12, 12, 12)),
+       QAT_SYM_AEAD_CAP(CHACHA20_POLY1305,
+               CAP_SET(block_size, 64),
+               CAP_RNG(key_size, 32, 32, 0),
+               CAP_RNG(digest_size, 16, 16, 0),
+               CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 12, 12, 0)),
+       RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
+};
+
+static int
+qat_sym_crypto_cap_get_gen6(struct qat_cryptodev_private *internals,
+                       const char *capa_memz_name,
+                       const uint16_t __rte_unused slice_map)
+{
+       uint32_t caps_size = sizeof(qat_sym_crypto_caps_gen6);
+       uint32_t legacy_caps_size = sizeof(qat_sym_crypto_legacy_caps_gen6);
+       uint32_t size = caps_size;
+       uintptr_t cp_addr;
+
+       if (internals->qat_dev->options.legacy_alg)
+               size = size + legacy_caps_size;
+
+       internals->capa_mz = rte_memzone_lookup(capa_memz_name);
+       if (internals->capa_mz == NULL) {
+               internals->capa_mz = rte_memzone_reserve(capa_memz_name,
+                               size, rte_socket_id(), 0);
+               if (internals->capa_mz == NULL) {
+                       QAT_LOG(DEBUG,
+                               "Error allocating memzone for capabilities");
+                       return -1;
+               }
+       }
+       cp_addr = (uintptr_t)(internals->capa_mz->addr);
+
+       if (internals->qat_dev->options.legacy_alg) {
+               memcpy((void *)cp_addr, qat_sym_crypto_legacy_caps_gen6, 
legacy_caps_size);
+               cp_addr += legacy_caps_size;
+       }
+
+       memcpy((void *)cp_addr, qat_sym_crypto_caps_gen6, caps_size);
+       internals->qat_dev_capabilities = internals->capa_mz->addr;
+
+       return 0;
+}
+
+static int get_block_size(enum icp_qat_hw_auth_algo qat_hash_alg)
+{
+       switch (qat_hash_alg) {
+       case ICP_QAT_HW_AUTH_ALGO_SHA1:
+       case ICP_QAT_HW_AUTH_ALGO_SHA224:
+       case ICP_QAT_HW_AUTH_ALGO_SHA256:
+               return QAT_SHA_CBLOCK;
+       case ICP_QAT_HW_AUTH_ALGO_SHA384:
+       case ICP_QAT_HW_AUTH_ALGO_SHA512:
+               return QAT_SHA512_CBLOCK;
+       default:
+               return -EFAULT;
+       };
+       return -EFAULT;
+}
+
+int
+qat_sym_cd_auth_set_gen6(struct qat_sym_session *cdesc,
+               const uint8_t *authkey,
+               uint32_t authkeylen,
+               uint32_t aad_length __rte_unused,
+               uint32_t digestsize,
+               unsigned int operation)
+{
+       struct icp_qat_hw_auth_setup *hash = NULL;
+       struct icp_qat_fw_la_bulk_req *req_tmpl = &cdesc->fw_req;
+       struct icp_qat_fw_comn_req_hdr_cd_pars *cd_pars = &req_tmpl->cd_pars;
+       void *ptr = &req_tmpl->cd_ctrl;
+       struct icp_qat_fw_auth_cd_ctrl_hdr *hash_cd_ctrl = ptr;
+       struct icp_qat_fw_la_auth_req_params *auth_param =
+               (struct icp_qat_fw_la_auth_req_params *)
+               ((char *)&req_tmpl->serv_specif_rqpars +
+               ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET);
+       enum icp_qat_hw_auth_mode auth_mode =
+                       (cdesc->auth_mode == ICP_QAT_HW_AUTH_MODE0) ?
+                       ICP_QAT_HW_AUTH_MODE0 : ICP_QAT_HW_AUTH_MODE2;
+       uint16_t state1_size = 0, state2_size = 0, cd_extra_size = 0;
+       uint16_t hash_offset;
+
+       if (cdesc->qat_cmd == ICP_QAT_FW_LA_CMD_AUTH) {
+               ICP_QAT_FW_COMN_CURR_ID_SET(hash_cd_ctrl,
+                                       ICP_QAT_FW_SLICE_AUTH);
+               cdesc->cd_cur_ptr = (uint8_t *)&cdesc->cd;
+       } else if (cdesc->qat_cmd != ICP_QAT_FW_LA_CMD_CIPHER_HASH) {
+               QAT_LOG(ERR, "Invalid param, must be a hash command.");
+               return -EFAULT;
+       }
+
+       if (operation == RTE_CRYPTO_AUTH_OP_VERIFY)
+               cdesc->auth_op = ICP_QAT_HW_AUTH_VERIFY;
+       else
+               cdesc->auth_op = ICP_QAT_HW_AUTH_GENERATE;
+
+       /*
+        * Setup the inner hash config
+        */
+       hash_offset = cdesc->cd_cur_ptr-((uint8_t *)&cdesc->cd);
+       hash = (struct icp_qat_hw_auth_setup *)cdesc->cd_cur_ptr;
+       hash->auth_config.reserved = 0;
+       if (cdesc->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_NULL)
+               hash->auth_config.config =
+                       ICP_QAT_HW_AUTH_CONFIG_BUILD(auth_mode,
+                               cdesc->qat_hash_alg, 4);
+       else
+               hash->auth_config.config =
+                       ICP_QAT_HW_AUTH_CONFIG_BUILD(auth_mode,
+                               cdesc->qat_hash_alg, digestsize);
+
+       if (cdesc->auth_mode == ICP_QAT_HW_AUTH_MODE0) {
+               hash->auth_counter.counter = 0;
+       } else {
+               int block_size = get_block_size(cdesc->qat_hash_alg);
+               if (block_size < 0)
+                       return block_size;
+               hash->auth_counter.counter = rte_bswap32(block_size);
+       }
+
+       hash_cd_ctrl->hash_cfg_offset = hash_offset >> 3;
+       cdesc->cd_cur_ptr += sizeof(struct icp_qat_hw_auth_setup);
+       switch (cdesc->qat_hash_alg) {
+       case ICP_QAT_HW_AUTH_ALGO_SHA1:
+       case ICP_QAT_HW_AUTH_ALGO_SHA224:
+               break;
+       case ICP_QAT_HW_AUTH_ALGO_SHA256:
+               /* HMAC */
+               if (cdesc->auth_mode != ICP_QAT_HW_AUTH_MODE0) {
+                       struct icp_qat_fw_la_cipher_20_req_params 
*cipher_param_20 =
+                               (void *)&req_tmpl->serv_specif_rqpars;
+                       rte_memcpy(cdesc->cd_cur_ptr, authkey, authkeylen);
+                       state2_size = 0;
+                       state1_size = authkeylen;
+                       ICP_QAT_FW_HASH_FLAG_MODE2_SET(
+                               hash_cd_ctrl->hash_flags, QAT_FW_LA_MODE2);
+                       cipher_param_20->spc_aad_addr = cdesc->cd_paddr +
+                               (cdesc->cd_cur_ptr - (uint8_t *)&cdesc->cd);
+                       cipher_param_20->hmac_sz = ICP_QAT_HW_SHA256_STATE2_SZ 
* 2;
+               }
+               break;
+       case ICP_QAT_HW_AUTH_ALGO_SHA384:
+               /* HMAC */
+               if (cdesc->auth_mode != ICP_QAT_HW_AUTH_MODE0) {
+                       struct icp_qat_fw_la_cipher_20_req_params 
*cipher_param_20 =
+                               (void *)&req_tmpl->serv_specif_rqpars;
+                       rte_memcpy(cdesc->cd_cur_ptr, authkey, authkeylen);
+                       state2_size = 0;
+                       state1_size = authkeylen;
+                       ICP_QAT_FW_HASH_FLAG_MODE2_SET(
+                               hash_cd_ctrl->hash_flags, QAT_FW_LA_MODE2);
+                       cipher_param_20->spc_aad_addr = cdesc->cd_paddr +
+                               (cdesc->cd_cur_ptr - (uint8_t *)&cdesc->cd);
+                       cipher_param_20->hmac_sz = ICP_QAT_HW_SHA384_STATE2_SZ 
* 2;
+               }
+               break;
+       case ICP_QAT_HW_AUTH_ALGO_SHA512:
+               /* HMAC */
+               if (cdesc->auth_mode != ICP_QAT_HW_AUTH_MODE0) {
+                       struct icp_qat_fw_la_cipher_20_req_params 
*cipher_param_20 =
+                               (void *)&req_tmpl->serv_specif_rqpars;
+                       rte_memcpy(cdesc->cd_cur_ptr, authkey, authkeylen);
+                       state2_size = 0;
+                       state1_size = authkeylen;
+                       ICP_QAT_FW_HASH_FLAG_MODE2_SET(
+                               hash_cd_ctrl->hash_flags, QAT_FW_LA_MODE2);
+                       cipher_param_20->spc_aad_addr = cdesc->cd_paddr +
+                               (cdesc->cd_cur_ptr - (uint8_t *)&cdesc->cd);
+                       cipher_param_20->hmac_sz = ICP_QAT_HW_SHA512_STATE2_SZ 
* 2;
+               }
+               break;
+       case ICP_QAT_HW_AUTH_ALGO_NULL:
+               break;
+       default:
+               QAT_LOG(ERR, "Invalid HASH alg %u", cdesc->qat_hash_alg);
+               return -EFAULT;
+       }
+
+       /* Auth CD config setup */
+       hash_cd_ctrl->hash_flags |= ICP_QAT_FW_AUTH_HDR_FLAG_NO_NESTED;
+       hash_cd_ctrl->inner_state1_sz = state1_size;
+       if (cdesc->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_NULL) {
+               hash_cd_ctrl->inner_res_sz = 4;
+               hash_cd_ctrl->final_sz = 4;
+               auth_param->auth_res_sz = 4;
+       } else {
+               hash_cd_ctrl->inner_res_sz = digestsize;
+               hash_cd_ctrl->final_sz = digestsize;
+               auth_param->auth_res_sz = digestsize;
+       }
+
+       hash_cd_ctrl->inner_state2_sz  = state2_size;
+       hash_cd_ctrl->inner_state2_offset = hash_cd_ctrl->hash_cfg_offset +
+                       ((sizeof(struct icp_qat_hw_auth_setup) +
+                        RTE_ALIGN_CEIL(hash_cd_ctrl->inner_state1_sz, 8))
+                                       >> 3);
+       cdesc->cd_cur_ptr += state1_size + state2_size + cd_extra_size;
+       cd_pars->u.s.content_desc_addr = cdesc->cd_paddr;
+       cd_pars->u.s.content_desc_params_sz = 1;
+       return 0;
+}
+
+static int
+qat_sym_build_op_auth_gen6(void *in_op, struct qat_sym_session *ctx,
+       uint8_t *out_msg, void *op_cookie)
+{
+       struct rte_crypto_op *op = in_op;
+       if (unlikely(op->sym->m_dst != NULL &&
+               op->sym->m_dst != op->sym->m_src)) {
+               op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
+               return -EINVAL;
+       }
+       return qat_sym_build_op_auth_gen1(in_op, ctx, out_msg, op_cookie);
+}
+
+static int
+qat_sym_crypto_set_session_gen6(void *cdev, void *session)
+{
+       struct qat_sym_session *ctx = session;
+       enum rte_proc_type_t proc_type = rte_eal_process_type();
+       int ret;
+
+       if (proc_type == RTE_PROC_AUTO || proc_type == RTE_PROC_INVALID)
+               return -EINVAL;
+
+       ret = qat_sym_crypto_set_session_gen4(cdev, session);
+
+       if (ret == 0) {
+               if (ctx->build_request[proc_type] ==
+                       qat_sym_build_op_chain_gen1) {
+                       /* Gen 6 does not support chaining of symmetric crypto 
ops. */
+                       QAT_LOG(ERR, "Chained ops not supported");
+                       return -ENOTSUP;
+               } else if (ctx->build_request[proc_type] ==
+                       qat_sym_build_op_auth_gen1) {
+                       /* Gen 6 does not support OOP auth ops. */
+                       ctx->build_request[proc_type] = 
qat_sym_build_op_auth_gen6;
+               }
+       }
+
+       return ret;
+}
+
+static uint32_t
+qat_sym_dp_enqueue_auth_jobs_gen6(void *qp_data, uint8_t *drv_ctx,
+               struct rte_crypto_sym_vec *vec, union rte_crypto_sym_ofs ofs,
+               void *user_data[], int *status)
+{
+       if (vec->dest_sgl != NULL) {
+               qat_sym_dp_fill_vec_status(vec->status, ENOTSUP, vec->num);
+               *status = 0;
+               return 0;
+       }
+
+       return qat_sym_dp_enqueue_auth_jobs_gen1(qp_data, drv_ctx, vec, ofs,
+                       user_data, status);
+}
+
+static int
+qat_sym_configure_raw_dp_ctx_gen6(void *raw_dp_ctx, void *ctx)
+{
+       struct qat_sym_session *session = ctx;
+       struct rte_crypto_raw_dp_ctx *raw_ctx = raw_dp_ctx;
+       int ret;
+
+       ret = qat_sym_configure_raw_dp_ctx_gen4(raw_dp_ctx, ctx);
+       if (ret != 0)
+               return ret;
+
+       if (session->qat_cmd == ICP_QAT_FW_LA_CMD_AUTH)
+               raw_ctx->enqueue_burst = qat_sym_dp_enqueue_auth_jobs_gen6;
+
+       return 0;
+}
+
+static uint64_t
+qat_sym_crypto_feature_flags_get_gen6(struct qat_pci_device *qat_dev)
+{
+       /* Gen 6 does not support chaining of symmetric crypto ops. */
+       return qat_sym_crypto_feature_flags_get_gen1(qat_dev) &
+                               ~RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING;
+}
+
+RTE_INIT(qat_sym_crypto_gen6_init)
+{
+       qat_sym_gen_dev_ops[QAT_GEN6].cryptodev_ops = &qat_sym_crypto_ops_gen1;
+       qat_sym_gen_dev_ops[QAT_GEN6].get_capabilities =
+                       qat_sym_crypto_cap_get_gen6;
+       qat_sym_gen_dev_ops[QAT_GEN6].set_session =
+                       qat_sym_crypto_set_session_gen6;
+       qat_sym_gen_dev_ops[QAT_GEN6].set_raw_dp_ctx =
+                       qat_sym_configure_raw_dp_ctx_gen6;
+       qat_sym_gen_dev_ops[QAT_GEN6].get_feature_flags =
+                       qat_sym_crypto_feature_flags_get_gen6;
+       qat_sym_gen_dev_ops[QAT_GEN6].create_security_ctx =
+                       qat_sym_create_security_gen1;
+}
+
+#ifdef BUILD_QAT_ASYM
+RTE_INIT(qat_asym_crypto_gen6_init)
+{
+       qat_asym_gen_dev_ops[QAT_GEN6].cryptodev_ops =
+                       &qat_asym_crypto_ops_gen1;
+       qat_asym_gen_dev_ops[QAT_GEN6].get_capabilities =
+                       qat_asym_crypto_cap_get_gen1;
+       qat_asym_gen_dev_ops[QAT_GEN6].get_feature_flags =
+                       qat_asym_crypto_feature_flags_get_gen1;
+       qat_asym_gen_dev_ops[QAT_GEN6].set_session =
+                       qat_asym_crypto_set_session_gen1;
+}
+#endif
diff --git a/drivers/crypto/qat/qat_sym_session.c 
b/drivers/crypto/qat/qat_sym_session.c
index d89c20cad6..e6d158f777 100644
--- a/drivers/crypto/qat/qat_sym_session.c
+++ b/drivers/crypto/qat/qat_sym_session.c
@@ -378,6 +378,15 @@ qat_get_cipher_xform(struct rte_crypto_sym_xform *xform)
         return NULL;
 }

+static inline uint8_t qat_check_ucs(enum qat_device_gen qat_dev_gen)
+{
+       return (qat_dev_gen == QAT_GEN4 ||
+                       qat_dev_gen == QAT_GEN5 ||
+                       qat_dev_gen == QAT_GEN6 ||
+                       qat_dev_gen == QAT_VQAT);
+}
+
+
 int
 qat_sym_session_configure_cipher(struct rte_cryptodev *dev,
                 struct rte_crypto_sym_xform *xform,
@@ -416,9 +425,7 @@ qat_sym_session_configure_cipher(struct rte_cryptodev *dev,
                         goto error_out;
                 }
                 session->qat_mode = ICP_QAT_HW_CIPHER_CTR_MODE;
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||
-                               qat_dev_gen == QAT_VQAT)
-                       session->is_ucs = 1;
+               session->is_ucs = qat_check_ucs(qat_dev_gen);
                 break;
         case RTE_CRYPTO_CIPHER_SNOW3G_UEA2:
                 if (qat_sym_validate_snow3g_key(cipher_xform->key.length,
@@ -968,8 +975,7 @@ qat_sym_session_configure_auth(struct rte_cryptodev *dev,
                         session->auth_iv.length = AES_GCM_J0_LEN;
                 else
                         session->is_iv12B = 1;
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||
-                               qat_dev_gen == QAT_VQAT) {
+               if (qat_check_ucs(qat_dev_gen)) {
                         session->is_cnt_zero = 1;
                         session->is_ucs = 1;
                 }
@@ -1133,10 +1139,7 @@ qat_sym_session_configure_aead(struct rte_cryptodev *dev,
                 }
                 session->qat_mode = ICP_QAT_HW_CIPHER_CTR_MODE;
                 session->qat_hash_alg = ICP_QAT_HW_AUTH_ALGO_GALOIS_128;
-
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||
-                               qat_dev_gen == QAT_VQAT)
-                       session->is_ucs = 1;
+               session->is_ucs = qat_check_ucs(qat_dev_gen);
                 if (session->cipher_iv.length == 0) {
                         session->cipher_iv.length = AES_GCM_J0_LEN;
                         break;
@@ -1155,16 +1158,12 @@ qat_sym_session_configure_aead(struct rte_cryptodev 
*dev,
                 }
                 session->qat_mode = ICP_QAT_HW_CIPHER_CTR_MODE;
                 session->qat_hash_alg = ICP_QAT_HW_AUTH_ALGO_AES_CBC_MAC;
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||
-                               qat_dev_gen == QAT_VQAT)
-                       session->is_ucs = 1;
+               session->is_ucs = qat_check_ucs(qat_dev_gen);
                 break;
         case RTE_CRYPTO_AEAD_CHACHA20_POLY1305:
                 if (aead_xform->key.length != ICP_QAT_HW_CHACHAPOLY_KEY_SZ)
                         return -EINVAL;
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||
-                               qat_dev_gen == QAT_VQAT)
-                       session->is_ucs = 1;
+               session->is_ucs = qat_check_ucs(qat_dev_gen);
                 session->qat_cipher_alg =
                                 ICP_QAT_HW_CIPHER_ALGO_CHACHA20_POLY1305;
                 qat_sym_session_handle_single_pass(session,
@@ -2006,7 +2005,7 @@ int qat_sym_cd_cipher_set(struct qat_sym_session *cdesc,
         return 0;
 }

-static int qat_sym_cd_auth_set(struct qat_sym_session *cdesc,
+static int qat_sym_cd_auth_set_gen1(struct qat_sym_session *cdesc,
                 const uint8_t *authkey,
                 uint32_t authkeylen,
                 uint32_t aad_length,
@@ -2037,7 +2036,7 @@ static int qat_sym_cd_auth_set(struct qat_sym_session 
*cdesc,
                 ICP_QAT_FW_COMN_CURR_ID_SET(hash_cd_ctrl,
                                         ICP_QAT_FW_SLICE_AUTH);
                 ICP_QAT_FW_COMN_NEXT_ID_SET(hash_cd_ctrl,
-                                       ICP_QAT_FW_SLICE_DRAM_WR);
+                               ICP_QAT_FW_SLICE_DRAM_WR);
                 cdesc->cd_cur_ptr = (uint8_t *)&cdesc->cd;
         } else if (cdesc->qat_cmd == ICP_QAT_FW_LA_CMD_HASH_CIPHER) {
                 ICP_QAT_FW_COMN_CURR_ID_SET(hash_cd_ctrl,
@@ -2135,8 +2134,7 @@ static int qat_sym_cd_auth_set(struct qat_sym_session 
*cdesc,
                         qat_hash_get_block_size(cdesc->qat_hash_alg);
                 auth_param->hash_state_sz = (hash_cd_ctrl->outer_prefix_sz +
                         auth_param->u2.inner_prefix_sz) >> 3;
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||
-                               qat_dev_gen == QAT_VQAT) {
+               if (qat_check_ucs(qat_dev_gen)) {
                         ICP_QAT_FW_HASH_FLAG_MODE2_SET(
                                 hash_cd_ctrl->hash_flags,
                                 QAT_FW_LA_MODE2);
@@ -2459,6 +2457,22 @@ static int qat_sym_cd_auth_set(struct qat_sym_session 
*cdesc,
         return 0;
 }

+static int qat_sym_cd_auth_set(struct qat_sym_session *cdesc,
+               const uint8_t *authkey,
+               uint32_t authkeylen,
+               uint32_t aad_length,
+               uint32_t digestsize,
+               unsigned int operation,
+               enum qat_device_gen qat_dev_gen)
+{
+       if (qat_dev_gen == QAT_GEN6)
+               return qat_sym_cd_auth_set_gen6(cdesc, authkey, authkeylen,
+                               aad_length, digestsize, operation);
+
+       return qat_sym_cd_auth_set_gen1(cdesc, authkey, authkeylen,
+                       aad_length, digestsize, operation, qat_dev_gen);
+}
+
 int qat_sym_validate_aes_key(int key_len, enum icp_qat_hw_cipher_algo *alg)
 {
         switch (key_len) {
@@ -2653,6 +2667,7 @@ qat_sym_cd_crc_set(struct qat_sym_session *cdesc,
                 break;
         case QAT_GEN4:
         case QAT_GEN5:
+       case QAT_GEN6:
                 crc_cfg.mode = ICP_QAT_HW_CIPHER_ECB_MODE;
                 crc_cfg.algo = ICP_QAT_HW_CIPHER_ALGO_NULL;
                 crc_cfg.hash_cmp_val = 0;
diff --git a/drivers/crypto/qat/qat_sym_session.h 
b/drivers/crypto/qat/qat_sym_session.h
index b18673a1f7..e4fb5cacc6 100644
--- a/drivers/crypto/qat/qat_sym_session.h
+++ b/drivers/crypto/qat/qat_sym_session.h
@@ -204,6 +204,14 @@ qat_sym_sesssion_init_common_hdr(struct qat_sym_session 
*session,
                                         struct icp_qat_fw_comn_req_hdr *header,
                                         enum qat_sym_proto_flag proto_flags);

+int
+qat_sym_cd_auth_set_gen6(struct qat_sym_session *cdesc,
+               const uint8_t *authkey,
+               uint32_t authkeylen,
+               uint32_t aad_length,
+               uint32_t digestsize,
+               unsigned int operation);
+
 int
 qat_sym_validate_aes_key(int key_len, enum icp_qat_hw_cipher_algo *alg);
 int
--
2.52.0

Reply via email to