<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div class="elementToProof" style="font-family: "IntelOne Text"; font-size: 10pt; color: rgb(0, 0, 0);">
Acked-by: Kai Ji <kai.ji@intel.com></div>
<div class="elementToProof" style="font-family: "IntelOne Text"; font-size: 10pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<hr style="display: inline-block; width: 98%;">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<b>From:</b> Nicolau, Radu <radu.nicolau@intel.com><br>
<b>Sent:</b> Tuesday, October 20, 2026 12:44<br>
<b>To:</b> dev@dpdk.org <dev@dpdk.org><br>
<b>Cc:</b> Nicolau, Radu <radu.nicolau@intel.com>; Ji, Kai <kai.ji@intel.com>; Burakov, Anatoly <anatoly.burakov@intel.com><br>
<b>Subject:</b> [PATCH v2] crypto/qat: add Gen 6 support </div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-size: 11pt;">Add support for Gen 6 QAT devices<br>
<br>
Signed-off-by: Radu Nicolau <radu.nicolau@intel.com><br>
---<br>
v2: added handling of OOP Auth<br>
<br>
 doc/guides/cryptodevs/qat.rst                |   5 +<br>
 doc/guides/rel_notes/release_26_11.rst       |   4 +<br>
 drivers/common/qat/dev/qat_dev_gen6.c        |  63 ++++<br>
 drivers/common/qat/meson.build               |   2 +<br>
 drivers/common/qat/qat_adf/icp_qat_fw_la.h   |   7 +-<br>
 drivers/common/qat/qat_common.h              |   1 +<br>
 drivers/common/qat/qat_device.c              |   5 +<br>
 drivers/crypto/qat/dev/qat_crypto_pmd_gen6.c | 374 +++++++++++++++++++<br>
 drivers/crypto/qat/qat_sym_session.c         |  53 ++-<br>
 drivers/crypto/qat/qat_sym_session.h         |   8 +<br>
 10 files changed, 502 insertions(+), 20 deletions(-)<br>
 create mode 100644 drivers/common/qat/dev/qat_dev_gen6.c<br>
 create mode 100644 drivers/crypto/qat/dev/qat_crypto_pmd_gen6.c<br>
<br>
diff --git a/doc/guides/cryptodevs/qat.rst b/doc/guides/cryptodevs/qat.rst<br>
index 6c96c5f88d..27713913ae 100644<br>
--- a/doc/guides/cryptodevs/qat.rst<br>
+++ b/doc/guides/cryptodevs/qat.rst<br>
@@ -28,6 +28,7 @@ poll mode crypto driver support for the following hardware accelerator devices:<br>
 * ``Intel QuickAssist Technology 4xxx``<br>
 * ``Intel QuickAssist Technology 300xx``<br>
 * ``Intel QuickAssist Technology 420xx``<br>
+* ``Intel QuickAssist Technology 6xxx``<br>
 * ``Intel QuickAssist Technology apfxx``<br>
 <br>
 <br>
@@ -142,6 +143,7 @@ Limitations<br>
   generations in the same process if planning to use for GCM.<br>
 * The mixed algo feature on GEN2 is not supported by all kernel drivers. Check<br>
   the notes under the Available Kernel Drivers table below for specific details.<br>
+* Chained cipher and hash operations are not supported on GEN6 devices.<br>
 * Out-of-place is not supported for combined Crypto-CRC DOCSIS security<br>
   protocol.<br>
 * ``RTE_CRYPTO_CIPHER_DES_DOCSISBPI`` is not supported for combined Crypto-CRC<br>
@@ -182,6 +184,7 @@ poll mode crypto driver support for the following hardware accelerator devices:<br>
 * ``Intel QuickAssist Technology 401xxx``<br>
 * ``Intel QuickAssist Technology 300xx``<br>
 * ``Intel QuickAssist Technology 420xx``<br>
+* ``Intel QuickAssist Technology 6xxx``<br>
 <br>
 The QAT ASYM PMD has support for:<br>
 <br>
@@ -483,6 +486,8 @@ to see the full table)<br>
    +-----+-----+-----+-----+----------+---------------+---------------+------------+--------+------+--------+--------+<br>
    | Yes | Yes | Yes | 5   | 420xx    | linux/6.8+    | qat_420xx     | 420xx      | 4946   | 2    | 4947   | 16     |<br>
    +-----+-----+-----+-----+----------+---------------+---------------+------------+--------+------+--------+--------+<br>
+   | Yes | Yes | No  | 6   | 6xxx     | linux/6.16+   | qat_6xxx      | 6xxx       | 4948   | 1    | 4949   | 16     |<br>
+   +-----+-----+-----+-----+----------+---------------+---------------+------------+--------+------+--------+--------+<br>
 <br>
 * Note: Symmetric mixed crypto algorithms feature on Gen 2 works only with IDZ driver version 4.9.0+<br>
 <br>
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst<br>
index c8cc86295d..fdcf155e07 100644<br>
--- a/doc/guides/rel_notes/release_26_11.rst<br>
+++ b/doc/guides/rel_notes/release_26_11.rst<br>
@@ -55,6 +55,10 @@ New Features<br>
      Also, make sure to start the actual text at the margin.<br>
      =======================================================<br>
 <br>
+* **Updated Intel QuickAssist Technology (QAT) crypto driver.**<br>
+<br>
+  * Added support for Gen 6 QAT devices.<br>
+<br>
 <br>
 Removed Items<br>
 -------------<br>
diff --git a/drivers/common/qat/dev/qat_dev_gen6.c b/drivers/common/qat/dev/qat_dev_gen6.c<br>
new file mode 100644<br>
index 0000000000..e8b9201c04<br>
--- /dev/null<br>
+++ b/drivers/common/qat/dev/qat_dev_gen6.c<br>
@@ -0,0 +1,63 @@<br>
+/* SPDX-License-Identifier: BSD-3-Clause<br>
+ * Copyright(c) 2024 Intel Corporation<br>
+ */<br>
+<br>
+#include <dev_driver.h><br>
+#include <rte_pci.h><br>
+<br>
+#include "qat_device.h"<br>
+#include "qat_qp.h"<br>
+#include "adf_pf2vf_msg.h"<br>
+#include "qat_dev_gens.h"<br>
+<br>
+#include <stdint.h><br>
+<br>
+static struct qat_pf2vf_dev qat_pf2vf_gen6 = {<br>
+       .pf2vf_offset = ADF_4XXXIOV_PF2VM_OFFSET,<br>
+       .vf2pf_offset = ADF_4XXXIOV_VM2PF_OFFSET,<br>
+       .pf2vf_type_shift = ADF_PFVF_2X_MSGTYPE_SHIFT,<br>
+       .pf2vf_type_mask = ADF_PFVF_2X_MSGTYPE_MASK,<br>
+       .pf2vf_data_shift = ADF_PFVF_2X_MSGDATA_SHIFT,<br>
+       .pf2vf_data_mask = ADF_PFVF_2X_MSGDATA_MASK,<br>
+};<br>
+<br>
+static struct qat_qp_hw_spec_funcs qat_qp_hw_spec_gen6 = {<br>
+       .qat_qp_rings_per_service = qat_qp_rings_per_service_gen4,<br>
+       .qat_qp_build_ring_base = qat_qp_build_ring_base_gen4,<br>
+       .qat_qp_adf_arb_enable = qat_qp_adf_arb_enable_gen4,<br>
+       .qat_qp_adf_arb_disable = qat_qp_adf_arb_disable_gen4,<br>
+       .qat_qp_adf_configure_queues = qat_qp_adf_configure_queues_gen4,<br>
+       .qat_qp_csr_write_tail = qat_qp_csr_write_tail_gen4,<br>
+       .qat_qp_csr_write_head = qat_qp_csr_write_head_gen4,<br>
+       .qat_qp_csr_setup = qat_qp_csr_setup_gen4,<br>
+       .qat_qp_get_hw_data = qat_qp_get_hw_data_gen4,<br>
+};<br>
+<br>
+static int<br>
+qat_dev_get_slice_map_gen6(uint32_t *map,<br>
+       const struct rte_pci_device *pci_dev)<br>
+{<br>
+       if (rte_pci_read_config(pci_dev, map,<br>
+                       ADF1_C4XXXIOV_VFLEGFUSES_LEN,<br>
+                       ADF_C4XXXIOV_VFLEGFUSES_OFFSET) < 0) {<br>
+               return -1;<br>
+       }<br>
+       return 0;<br>
+}<br>
+<br>
+static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen6 = {<br>
+       .qat_dev_reset_ring_pairs = qat_reset_ring_pairs_gen4,<br>
+       .qat_dev_get_transport_bar = qat_dev_get_transport_bar_gen4,<br>
+       .qat_dev_get_misc_bar = qat_dev_get_misc_bar_gen4,<br>
+       .qat_dev_read_config = qat_dev_read_config_gen4,<br>
+       .qat_dev_get_extra_size = qat_dev_get_extra_size_gen4,<br>
+       .qat_dev_get_slice_map = qat_dev_get_slice_map_gen6,<br>
+};<br>
+<br>
+RTE_INIT(qat_dev_gen_6_init)<br>
+{<br>
+       qat_qp_hw_spec[QAT_GEN6] = &qat_qp_hw_spec_gen6;<br>
+       qat_dev_hw_spec[QAT_GEN6] = &qat_dev_hw_spec_gen6;<br>
+       qat_gen_config[QAT_GEN6].dev_gen = QAT_GEN6;<br>
+       qat_gen_config[QAT_GEN6].pf2vf_dev = &qat_pf2vf_gen6;<br>
+}<br>
diff --git a/drivers/common/qat/meson.build b/drivers/common/qat/meson.build<br>
index b946354a42..db792864a2 100644<br>
--- a/drivers/common/qat/meson.build<br>
+++ b/drivers/common/qat/meson.build<br>
@@ -106,6 +106,7 @@ sources += files(<br>
         'dev/qat_dev_gen3.c',<br>
         'dev/qat_dev_gen4.c',<br>
         'dev/qat_dev_gen5.c',<br>
+        'dev/qat_dev_gen6.c',<br>
         'dev/qat_dev_gen_lce.c',<br>
 )<br>
 includes += include_directories(<br>
@@ -138,6 +139,7 @@ if qat_crypto<br>
             'dev/qat_crypto_pmd_gen3.c',<br>
             'dev/qat_crypto_pmd_gen4.c',<br>
             'dev/qat_crypto_pmd_gen5.c',<br>
+            'dev/qat_crypto_pmd_gen6.c',<br>
             'dev/qat_crypto_pmd_gen_lce.c',<br>
         ]<br>
         sources += files(join_paths(qat_crypto_relpath, f))<br>
diff --git a/drivers/common/qat/qat_adf/icp_qat_fw_la.h b/drivers/common/qat/qat_adf/icp_qat_fw_la.h<br>
index 735dfb5103..366e1f2252 100644<br>
--- a/drivers/common/qat/qat_adf/icp_qat_fw_la.h<br>
+++ b/drivers/common/qat/qat_adf/icp_qat_fw_la.h<br>
@@ -473,7 +473,12 @@ struct icp_qat_fw_la_cipher_20_req_params {<br>
         uint32_t   spc_aad_sz;<br>
         uint64_t   spc_aad_addr;<br>
         uint64_t   spc_auth_res_addr;<br>
-       uint8_t    reserved[3];<br>
+       union {<br>
+               uint8_t    reserved[3];<br>
+               struct {<br>
+                       uint8_t hmac_sz;<br>
+               };<br>
+       };<br>
         uint8_t    spc_auth_res_sz;<br>
 };<br>
 <br>
diff --git a/drivers/common/qat/qat_common.h b/drivers/common/qat/qat_common.h<br>
index 51d20267bd..133a81c856 100644<br>
--- a/drivers/common/qat/qat_common.h<br>
+++ b/drivers/common/qat/qat_common.h<br>
@@ -34,6 +34,7 @@ enum qat_device_gen {<br>
         QAT_GEN3,<br>
         QAT_GEN4,<br>
         QAT_GEN5,<br>
+       QAT_GEN6,<br>
         QAT_GEN_LCE,<br>
         QAT_VQAT,<br>
         QAT_N_GENS<br>
diff --git a/drivers/common/qat/qat_device.c b/drivers/common/qat/qat_device.c<br>
index 07a8b19583..f0ed115b30 100644<br>
--- a/drivers/common/qat/qat_device.c<br>
+++ b/drivers/common/qat/qat_device.c<br>
@@ -70,6 +70,9 @@ static const struct rte_pci_id pci_id_qat_map[] = {<br>
                 {<br>
                         RTE_PCI_DEVICE(0x8086, 0x4947),<br>
                 },<br>
+               {<br>
+                       RTE_PCI_DEVICE(0x8086, 0x4949),<br>
+               },<br>
                 {<br>
                         RTE_PCI_DEVICE(0x8086, 0x1454),<br>
                 },<br>
@@ -152,6 +155,8 @@ pick_gen(const struct rte_pci_device *pci_dev)<br>
                 return QAT_GEN4;<br>
         case 0x4947:<br>
                 return QAT_GEN5;<br>
+       case 0x4949:<br>
+               return QAT_GEN6;<br>
         case 0x1454:<br>
                 return QAT_GEN_LCE;<br>
         case 0x0da5:<br>
diff --git a/drivers/crypto/qat/dev/qat_crypto_pmd_gen6.c b/drivers/crypto/qat/dev/qat_crypto_pmd_gen6.c<br>
new file mode 100644<br>
index 0000000000..7f810cfcc1<br>
--- /dev/null<br>
+++ b/drivers/crypto/qat/dev/qat_crypto_pmd_gen6.c<br>
@@ -0,0 +1,374 @@<br>
+/* SPDX-License-Identifier: BSD-3-Clause<br>
+ * Copyright(c) 2024 Intel Corporation<br>
+ */<br>
+<br>
+#include <rte_cryptodev.h><br>
+#include <cryptodev_pmd.h><br>
+#include "qat_sym_session.h"<br>
+#include "qat_sym.h"<br>
+#include "qat_asym.h"<br>
+#include "qat_crypto.h"<br>
+#include "qat_crypto_pmd_gens.h"<br>
+<br>
+<br>
+static struct rte_cryptodev_capabilities qat_sym_crypto_legacy_caps_gen6[] = {<br>
+       QAT_SYM_PLAIN_AUTH_CAP(SHA1,<br>
+               CAP_SET(block_size, 64),<br>
+               CAP_RNG(digest_size, 1, 20, 1)),<br>
+       QAT_SYM_AUTH_CAP(SHA224,<br>
+               CAP_SET(block_size, 64),<br>
+               CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 28, 1),<br>
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),<br>
+};<br>
+<br>
+static struct rte_cryptodev_capabilities qat_sym_crypto_caps_gen6[] = {<br>
+       QAT_SYM_AUTH_CAP(SHA256_HMAC,<br>
+               CAP_SET(block_size, 64),<br>
+               CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 32, 1),<br>
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),<br>
+       QAT_SYM_AUTH_CAP(SHA384_HMAC,<br>
+               CAP_SET(block_size, 128),<br>
+               CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 48, 1),<br>
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),<br>
+       QAT_SYM_AUTH_CAP(SHA512_HMAC,<br>
+               CAP_SET(block_size, 128),<br>
+               CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 64, 1),<br>
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),<br>
+       QAT_SYM_AUTH_CAP(NULL,<br>
+               CAP_SET(block_size, 1),<br>
+               CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(digest_size),<br>
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),<br>
+       QAT_SYM_CIPHER_CAP(NULL,<br>
+               CAP_SET(block_size, 1),<br>
+               CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(iv_size)),<br>
+       QAT_SYM_AUTH_CAP(SHA256,<br>
+               CAP_SET(block_size, 64),<br>
+               CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 32, 1),<br>
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),<br>
+       QAT_SYM_AUTH_CAP(SHA384,<br>
+               CAP_SET(block_size, 128),<br>
+               CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 48, 1),<br>
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),<br>
+       QAT_SYM_AUTH_CAP(SHA512,<br>
+               CAP_SET(block_size, 128),<br>
+               CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 64, 1),<br>
+               CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)),<br>
+       QAT_SYM_CIPHER_CAP(AES_CTR,<br>
+               CAP_SET(block_size, 16),<br>
+               CAP_RNG(key_size, 16, 32, 16), CAP_RNG(iv_size, 16, 16, 0)),<br>
+       QAT_SYM_AEAD_CAP(AES_GCM,<br>
+               CAP_SET(block_size, 16),<br>
+               CAP_RNG(key_size, 16, 32, 16), CAP_RNG(digest_size, 8, 16, 4),<br>
+               CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 12, 12, 12)),<br>
+       QAT_SYM_AEAD_CAP(CHACHA20_POLY1305,<br>
+               CAP_SET(block_size, 64),<br>
+               CAP_RNG(key_size, 32, 32, 0),<br>
+               CAP_RNG(digest_size, 16, 16, 0),<br>
+               CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 12, 12, 0)),<br>
+       RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()<br>
+};<br>
+<br>
+static int<br>
+qat_sym_crypto_cap_get_gen6(struct qat_cryptodev_private *internals,<br>
+                       const char *capa_memz_name,<br>
+                       const uint16_t __rte_unused slice_map)<br>
+{<br>
+       uint32_t caps_size = sizeof(qat_sym_crypto_caps_gen6);<br>
+       uint32_t legacy_caps_size = sizeof(qat_sym_crypto_legacy_caps_gen6);<br>
+       uint32_t size = caps_size;<br>
+       uintptr_t cp_addr;<br>
+<br>
+       if (internals->qat_dev->options.legacy_alg)<br>
+               size = size + legacy_caps_size;<br>
+<br>
+       internals->capa_mz = rte_memzone_lookup(capa_memz_name);<br>
+       if (internals->capa_mz == NULL) {<br>
+               internals->capa_mz = rte_memzone_reserve(capa_memz_name,<br>
+                               size, rte_socket_id(), 0);<br>
+               if (internals->capa_mz == NULL) {<br>
+                       QAT_LOG(DEBUG,<br>
+                               "Error allocating memzone for capabilities");<br>
+                       return -1;<br>
+               }<br>
+       }<br>
+       cp_addr = (uintptr_t)(internals->capa_mz->addr);<br>
+<br>
+       if (internals->qat_dev->options.legacy_alg) {<br>
+               memcpy((void *)cp_addr, qat_sym_crypto_legacy_caps_gen6, legacy_caps_size);<br>
+               cp_addr += legacy_caps_size;<br>
+       }<br>
+<br>
+       memcpy((void *)cp_addr, qat_sym_crypto_caps_gen6, caps_size);<br>
+       internals->qat_dev_capabilities = internals->capa_mz->addr;<br>
+<br>
+       return 0;<br>
+}<br>
+<br>
+static int get_block_size(enum icp_qat_hw_auth_algo qat_hash_alg)<br>
+{<br>
+       switch (qat_hash_alg) {<br>
+       case ICP_QAT_HW_AUTH_ALGO_SHA1:<br>
+       case ICP_QAT_HW_AUTH_ALGO_SHA224:<br>
+       case ICP_QAT_HW_AUTH_ALGO_SHA256:<br>
+               return QAT_SHA_CBLOCK;<br>
+       case ICP_QAT_HW_AUTH_ALGO_SHA384:<br>
+       case ICP_QAT_HW_AUTH_ALGO_SHA512:<br>
+               return QAT_SHA512_CBLOCK;<br>
+       default:<br>
+               return -EFAULT;<br>
+       };<br>
+       return -EFAULT;<br>
+}<br>
+<br>
+int<br>
+qat_sym_cd_auth_set_gen6(struct qat_sym_session *cdesc,<br>
+               const uint8_t *authkey,<br>
+               uint32_t authkeylen,<br>
+               uint32_t aad_length __rte_unused,<br>
+               uint32_t digestsize,<br>
+               unsigned int operation)<br>
+{<br>
+       struct icp_qat_hw_auth_setup *hash = NULL;<br>
+       struct icp_qat_fw_la_bulk_req *req_tmpl = &cdesc->fw_req;<br>
+       struct icp_qat_fw_comn_req_hdr_cd_pars *cd_pars = &req_tmpl->cd_pars;<br>
+       void *ptr = &req_tmpl->cd_ctrl;<br>
+       struct icp_qat_fw_auth_cd_ctrl_hdr *hash_cd_ctrl = ptr;<br>
+       struct icp_qat_fw_la_auth_req_params *auth_param =<br>
+               (struct icp_qat_fw_la_auth_req_params *)<br>
+               ((char *)&req_tmpl->serv_specif_rqpars +<br>
+               ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET);<br>
+       enum icp_qat_hw_auth_mode auth_mode =<br>
+                       (cdesc->auth_mode == ICP_QAT_HW_AUTH_MODE0) ?<br>
+                       ICP_QAT_HW_AUTH_MODE0 : ICP_QAT_HW_AUTH_MODE2;<br>
+       uint16_t state1_size = 0, state2_size = 0, cd_extra_size = 0;<br>
+       uint16_t hash_offset;<br>
+<br>
+       if (cdesc->qat_cmd == ICP_QAT_FW_LA_CMD_AUTH) {<br>
+               ICP_QAT_FW_COMN_CURR_ID_SET(hash_cd_ctrl,<br>
+                                       ICP_QAT_FW_SLICE_AUTH);<br>
+               cdesc->cd_cur_ptr = (uint8_t *)&cdesc->cd;<br>
+       } else if (cdesc->qat_cmd != ICP_QAT_FW_LA_CMD_CIPHER_HASH) {<br>
+               QAT_LOG(ERR, "Invalid param, must be a hash command.");<br>
+               return -EFAULT;<br>
+       }<br>
+<br>
+       if (operation == RTE_CRYPTO_AUTH_OP_VERIFY)<br>
+               cdesc->auth_op = ICP_QAT_HW_AUTH_VERIFY;<br>
+       else<br>
+               cdesc->auth_op = ICP_QAT_HW_AUTH_GENERATE;<br>
+<br>
+       /*<br>
+        * Setup the inner hash config<br>
+        */<br>
+       hash_offset = cdesc->cd_cur_ptr-((uint8_t *)&cdesc->cd);<br>
+       hash = (struct icp_qat_hw_auth_setup *)cdesc->cd_cur_ptr;<br>
+       hash->auth_config.reserved = 0;<br>
+       if (cdesc->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_NULL)<br>
+               hash->auth_config.config =<br>
+                       ICP_QAT_HW_AUTH_CONFIG_BUILD(auth_mode,<br>
+                               cdesc->qat_hash_alg, 4);<br>
+       else<br>
+               hash->auth_config.config =<br>
+                       ICP_QAT_HW_AUTH_CONFIG_BUILD(auth_mode,<br>
+                               cdesc->qat_hash_alg, digestsize);<br>
+<br>
+       if (cdesc->auth_mode == ICP_QAT_HW_AUTH_MODE0) {<br>
+               hash->auth_counter.counter = 0;<br>
+       } else {<br>
+               int block_size = get_block_size(cdesc->qat_hash_alg);<br>
+               if (block_size < 0)<br>
+                       return block_size;<br>
+               hash->auth_counter.counter = rte_bswap32(block_size);<br>
+       }<br>
+<br>
+       hash_cd_ctrl->hash_cfg_offset = hash_offset >> 3;<br>
+       cdesc->cd_cur_ptr += sizeof(struct icp_qat_hw_auth_setup);<br>
+       switch (cdesc->qat_hash_alg) {<br>
+       case ICP_QAT_HW_AUTH_ALGO_SHA1:<br>
+       case ICP_QAT_HW_AUTH_ALGO_SHA224:<br>
+               break;<br>
+       case ICP_QAT_HW_AUTH_ALGO_SHA256:<br>
+               /* HMAC */<br>
+               if (cdesc->auth_mode != ICP_QAT_HW_AUTH_MODE0) {<br>
+                       struct icp_qat_fw_la_cipher_20_req_params *cipher_param_20 =<br>
+                               (void *)&req_tmpl->serv_specif_rqpars;<br>
+                       rte_memcpy(cdesc->cd_cur_ptr, authkey, authkeylen);<br>
+                       state2_size = 0;<br>
+                       state1_size = authkeylen;<br>
+                       ICP_QAT_FW_HASH_FLAG_MODE2_SET(<br>
+                               hash_cd_ctrl->hash_flags, QAT_FW_LA_MODE2);<br>
+                       cipher_param_20->spc_aad_addr = cdesc->cd_paddr +<br>
+                               (cdesc->cd_cur_ptr - (uint8_t *)&cdesc->cd);<br>
+                       cipher_param_20->hmac_sz = ICP_QAT_HW_SHA256_STATE2_SZ * 2;<br>
+               }<br>
+               break;<br>
+       case ICP_QAT_HW_AUTH_ALGO_SHA384:<br>
+               /* HMAC */<br>
+               if (cdesc->auth_mode != ICP_QAT_HW_AUTH_MODE0) {<br>
+                       struct icp_qat_fw_la_cipher_20_req_params *cipher_param_20 =<br>
+                               (void *)&req_tmpl->serv_specif_rqpars;<br>
+                       rte_memcpy(cdesc->cd_cur_ptr, authkey, authkeylen);<br>
+                       state2_size = 0;<br>
+                       state1_size = authkeylen;<br>
+                       ICP_QAT_FW_HASH_FLAG_MODE2_SET(<br>
+                               hash_cd_ctrl->hash_flags, QAT_FW_LA_MODE2);<br>
+                       cipher_param_20->spc_aad_addr = cdesc->cd_paddr +<br>
+                               (cdesc->cd_cur_ptr - (uint8_t *)&cdesc->cd);<br>
+                       cipher_param_20->hmac_sz = ICP_QAT_HW_SHA384_STATE2_SZ * 2;<br>
+               }<br>
+               break;<br>
+       case ICP_QAT_HW_AUTH_ALGO_SHA512:<br>
+               /* HMAC */<br>
+               if (cdesc->auth_mode != ICP_QAT_HW_AUTH_MODE0) {<br>
+                       struct icp_qat_fw_la_cipher_20_req_params *cipher_param_20 =<br>
+                               (void *)&req_tmpl->serv_specif_rqpars;<br>
+                       rte_memcpy(cdesc->cd_cur_ptr, authkey, authkeylen);<br>
+                       state2_size = 0;<br>
+                       state1_size = authkeylen;<br>
+                       ICP_QAT_FW_HASH_FLAG_MODE2_SET(<br>
+                               hash_cd_ctrl->hash_flags, QAT_FW_LA_MODE2);<br>
+                       cipher_param_20->spc_aad_addr = cdesc->cd_paddr +<br>
+                               (cdesc->cd_cur_ptr - (uint8_t *)&cdesc->cd);<br>
+                       cipher_param_20->hmac_sz = ICP_QAT_HW_SHA512_STATE2_SZ * 2;<br>
+               }<br>
+               break;<br>
+       case ICP_QAT_HW_AUTH_ALGO_NULL:<br>
+               break;<br>
+       default:<br>
+               QAT_LOG(ERR, "Invalid HASH alg %u", cdesc->qat_hash_alg);<br>
+               return -EFAULT;<br>
+       }<br>
+<br>
+       /* Auth CD config setup */<br>
+       hash_cd_ctrl->hash_flags |= ICP_QAT_FW_AUTH_HDR_FLAG_NO_NESTED;<br>
+       hash_cd_ctrl->inner_state1_sz = state1_size;<br>
+       if (cdesc->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_NULL) {<br>
+               hash_cd_ctrl->inner_res_sz = 4;<br>
+               hash_cd_ctrl->final_sz = 4;<br>
+               auth_param->auth_res_sz = 4;<br>
+       } else {<br>
+               hash_cd_ctrl->inner_res_sz = digestsize;<br>
+               hash_cd_ctrl->final_sz = digestsize;<br>
+               auth_param->auth_res_sz = digestsize;<br>
+       }<br>
+<br>
+       hash_cd_ctrl->inner_state2_sz  = state2_size;<br>
+       hash_cd_ctrl->inner_state2_offset = hash_cd_ctrl->hash_cfg_offset +<br>
+                       ((sizeof(struct icp_qat_hw_auth_setup) +<br>
+                        RTE_ALIGN_CEIL(hash_cd_ctrl->inner_state1_sz, 8))<br>
+                                       >> 3);<br>
+       cdesc->cd_cur_ptr += state1_size + state2_size + cd_extra_size;<br>
+       cd_pars->u.s.content_desc_addr = cdesc->cd_paddr;<br>
+       cd_pars->u.s.content_desc_params_sz = 1;<br>
+       return 0;<br>
+}<br>
+<br>
+static int<br>
+qat_sym_build_op_auth_gen6(void *in_op, struct qat_sym_session *ctx,<br>
+       uint8_t *out_msg, void *op_cookie)<br>
+{<br>
+       struct rte_crypto_op *op = in_op;<br>
+       if (unlikely(op->sym->m_dst != NULL &&<br>
+               op->sym->m_dst != op->sym->m_src)) {<br>
+               op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;<br>
+               return -EINVAL;<br>
+       }<br>
+       return qat_sym_build_op_auth_gen1(in_op, ctx, out_msg, op_cookie);<br>
+}<br>
+<br>
+static int<br>
+qat_sym_crypto_set_session_gen6(void *cdev, void *session)<br>
+{<br>
+       struct qat_sym_session *ctx = session;<br>
+       enum rte_proc_type_t proc_type = rte_eal_process_type();<br>
+       int ret;<br>
+<br>
+       if (proc_type == RTE_PROC_AUTO || proc_type == RTE_PROC_INVALID)<br>
+               return -EINVAL;<br>
+<br>
+       ret = qat_sym_crypto_set_session_gen4(cdev, session);<br>
+<br>
+       if (ret == 0) {<br>
+               if (ctx->build_request[proc_type] ==<br>
+                       qat_sym_build_op_chain_gen1) {<br>
+                       /* Gen 6 does not support chaining of symmetric crypto ops. */<br>
+                       QAT_LOG(ERR, "Chained ops not supported");<br>
+                       return -ENOTSUP;<br>
+               } else if (ctx->build_request[proc_type] ==<br>
+                       qat_sym_build_op_auth_gen1) {<br>
+                       /* Gen 6 does not support OOP auth ops. */<br>
+                       ctx->build_request[proc_type] = qat_sym_build_op_auth_gen6;<br>
+               }<br>
+       }<br>
+<br>
+       return ret;<br>
+}<br>
+<br>
+static uint32_t<br>
+qat_sym_dp_enqueue_auth_jobs_gen6(void *qp_data, uint8_t *drv_ctx,<br>
+               struct rte_crypto_sym_vec *vec, union rte_crypto_sym_ofs ofs,<br>
+               void *user_data[], int *status)<br>
+{<br>
+       if (vec->dest_sgl != NULL) {<br>
+               qat_sym_dp_fill_vec_status(vec->status, ENOTSUP, vec->num);<br>
+               *status = 0;<br>
+               return 0;<br>
+       }<br>
+<br>
+       return qat_sym_dp_enqueue_auth_jobs_gen1(qp_data, drv_ctx, vec, ofs,<br>
+                       user_data, status);<br>
+}<br>
+<br>
+static int<br>
+qat_sym_configure_raw_dp_ctx_gen6(void *raw_dp_ctx, void *ctx)<br>
+{<br>
+       struct qat_sym_session *session = ctx;<br>
+       struct rte_crypto_raw_dp_ctx *raw_ctx = raw_dp_ctx;<br>
+       int ret;<br>
+<br>
+       ret = qat_sym_configure_raw_dp_ctx_gen4(raw_dp_ctx, ctx);<br>
+       if (ret != 0)<br>
+               return ret;<br>
+<br>
+       if (session->qat_cmd == ICP_QAT_FW_LA_CMD_AUTH)<br>
+               raw_ctx->enqueue_burst = qat_sym_dp_enqueue_auth_jobs_gen6;<br>
+<br>
+       return 0;<br>
+}<br>
+<br>
+static uint64_t<br>
+qat_sym_crypto_feature_flags_get_gen6(struct qat_pci_device *qat_dev)<br>
+{<br>
+       /* Gen 6 does not support chaining of symmetric crypto ops. */<br>
+       return qat_sym_crypto_feature_flags_get_gen1(qat_dev) &<br>
+                               ~RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING;<br>
+}<br>
+<br>
+RTE_INIT(qat_sym_crypto_gen6_init)<br>
+{<br>
+       qat_sym_gen_dev_ops[QAT_GEN6].cryptodev_ops = &qat_sym_crypto_ops_gen1;<br>
+       qat_sym_gen_dev_ops[QAT_GEN6].get_capabilities =<br>
+                       qat_sym_crypto_cap_get_gen6;<br>
+       qat_sym_gen_dev_ops[QAT_GEN6].set_session =<br>
+                       qat_sym_crypto_set_session_gen6;<br>
+       qat_sym_gen_dev_ops[QAT_GEN6].set_raw_dp_ctx =<br>
+                       qat_sym_configure_raw_dp_ctx_gen6;<br>
+       qat_sym_gen_dev_ops[QAT_GEN6].get_feature_flags =<br>
+                       qat_sym_crypto_feature_flags_get_gen6;<br>
+       qat_sym_gen_dev_ops[QAT_GEN6].create_security_ctx =<br>
+                       qat_sym_create_security_gen1;<br>
+}<br>
+<br>
+#ifdef BUILD_QAT_ASYM<br>
+RTE_INIT(qat_asym_crypto_gen6_init)<br>
+{<br>
+       qat_asym_gen_dev_ops[QAT_GEN6].cryptodev_ops =<br>
+                       &qat_asym_crypto_ops_gen1;<br>
+       qat_asym_gen_dev_ops[QAT_GEN6].get_capabilities =<br>
+                       qat_asym_crypto_cap_get_gen1;<br>
+       qat_asym_gen_dev_ops[QAT_GEN6].get_feature_flags =<br>
+                       qat_asym_crypto_feature_flags_get_gen1;<br>
+       qat_asym_gen_dev_ops[QAT_GEN6].set_session =<br>
+                       qat_asym_crypto_set_session_gen1;<br>
+}<br>
+#endif<br>
diff --git a/drivers/crypto/qat/qat_sym_session.c b/drivers/crypto/qat/qat_sym_session.c<br>
index d89c20cad6..e6d158f777 100644<br>
--- a/drivers/crypto/qat/qat_sym_session.c<br>
+++ b/drivers/crypto/qat/qat_sym_session.c<br>
@@ -378,6 +378,15 @@ qat_get_cipher_xform(struct rte_crypto_sym_xform *xform)<br>
         return NULL;<br>
 }<br>
 <br>
+static inline uint8_t qat_check_ucs(enum qat_device_gen qat_dev_gen)<br>
+{<br>
+       return (qat_dev_gen == QAT_GEN4 ||<br>
+                       qat_dev_gen == QAT_GEN5 ||<br>
+                       qat_dev_gen == QAT_GEN6 ||<br>
+                       qat_dev_gen == QAT_VQAT);<br>
+}<br>
+<br>
+<br>
 int<br>
 qat_sym_session_configure_cipher(struct rte_cryptodev *dev,<br>
                 struct rte_crypto_sym_xform *xform,<br>
@@ -416,9 +425,7 @@ qat_sym_session_configure_cipher(struct rte_cryptodev *dev,<br>
                         goto error_out;<br>
                 }<br>
                 session->qat_mode = ICP_QAT_HW_CIPHER_CTR_MODE;<br>
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||<br>
-                               qat_dev_gen == QAT_VQAT)<br>
-                       session->is_ucs = 1;<br>
+               session->is_ucs = qat_check_ucs(qat_dev_gen);<br>
                 break;<br>
         case RTE_CRYPTO_CIPHER_SNOW3G_UEA2:<br>
                 if (qat_sym_validate_snow3g_key(cipher_xform->key.length,<br>
@@ -968,8 +975,7 @@ qat_sym_session_configure_auth(struct rte_cryptodev *dev,<br>
                         session->auth_iv.length = AES_GCM_J0_LEN;<br>
                 else<br>
                         session->is_iv12B = 1;<br>
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||<br>
-                               qat_dev_gen == QAT_VQAT) {<br>
+               if (qat_check_ucs(qat_dev_gen)) {<br>
                         session->is_cnt_zero = 1;<br>
                         session->is_ucs = 1;<br>
                 }<br>
@@ -1133,10 +1139,7 @@ qat_sym_session_configure_aead(struct rte_cryptodev *dev,<br>
                 }<br>
                 session->qat_mode = ICP_QAT_HW_CIPHER_CTR_MODE;<br>
                 session->qat_hash_alg = ICP_QAT_HW_AUTH_ALGO_GALOIS_128;<br>
-<br>
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||<br>
-                               qat_dev_gen == QAT_VQAT)<br>
-                       session->is_ucs = 1;<br>
+               session->is_ucs = qat_check_ucs(qat_dev_gen);<br>
                 if (session->cipher_iv.length == 0) {<br>
                         session->cipher_iv.length = AES_GCM_J0_LEN;<br>
                         break;<br>
@@ -1155,16 +1158,12 @@ qat_sym_session_configure_aead(struct rte_cryptodev *dev,<br>
                 }<br>
                 session->qat_mode = ICP_QAT_HW_CIPHER_CTR_MODE;<br>
                 session->qat_hash_alg = ICP_QAT_HW_AUTH_ALGO_AES_CBC_MAC;<br>
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||<br>
-                               qat_dev_gen == QAT_VQAT)<br>
-                       session->is_ucs = 1;<br>
+               session->is_ucs = qat_check_ucs(qat_dev_gen);<br>
                 break;<br>
         case RTE_CRYPTO_AEAD_CHACHA20_POLY1305:<br>
                 if (aead_xform->key.length != ICP_QAT_HW_CHACHAPOLY_KEY_SZ)<br>
                         return -EINVAL;<br>
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||<br>
-                               qat_dev_gen == QAT_VQAT)<br>
-                       session->is_ucs = 1;<br>
+               session->is_ucs = qat_check_ucs(qat_dev_gen);<br>
                 session->qat_cipher_alg =<br>
                                 ICP_QAT_HW_CIPHER_ALGO_CHACHA20_POLY1305;<br>
                 qat_sym_session_handle_single_pass(session,<br>
@@ -2006,7 +2005,7 @@ int qat_sym_cd_cipher_set(struct qat_sym_session *cdesc,<br>
         return 0;<br>
 }<br>
 <br>
-static int qat_sym_cd_auth_set(struct qat_sym_session *cdesc,<br>
+static int qat_sym_cd_auth_set_gen1(struct qat_sym_session *cdesc,<br>
                 const uint8_t *authkey,<br>
                 uint32_t authkeylen,<br>
                 uint32_t aad_length,<br>
@@ -2037,7 +2036,7 @@ static int qat_sym_cd_auth_set(struct qat_sym_session *cdesc,<br>
                 ICP_QAT_FW_COMN_CURR_ID_SET(hash_cd_ctrl,<br>
                                         ICP_QAT_FW_SLICE_AUTH);<br>
                 ICP_QAT_FW_COMN_NEXT_ID_SET(hash_cd_ctrl,<br>
-                                       ICP_QAT_FW_SLICE_DRAM_WR);<br>
+                               ICP_QAT_FW_SLICE_DRAM_WR);<br>
                 cdesc->cd_cur_ptr = (uint8_t *)&cdesc->cd;<br>
         } else if (cdesc->qat_cmd == ICP_QAT_FW_LA_CMD_HASH_CIPHER) {<br>
                 ICP_QAT_FW_COMN_CURR_ID_SET(hash_cd_ctrl,<br>
@@ -2135,8 +2134,7 @@ static int qat_sym_cd_auth_set(struct qat_sym_session *cdesc,<br>
                         qat_hash_get_block_size(cdesc->qat_hash_alg);<br>
                 auth_param->hash_state_sz = (hash_cd_ctrl->outer_prefix_sz +<br>
                         auth_param->u2.inner_prefix_sz) >> 3;<br>
-               if (qat_dev_gen == QAT_GEN4 || qat_dev_gen == QAT_GEN5 ||<br>
-                               qat_dev_gen == QAT_VQAT) {<br>
+               if (qat_check_ucs(qat_dev_gen)) {<br>
                         ICP_QAT_FW_HASH_FLAG_MODE2_SET(<br>
                                 hash_cd_ctrl->hash_flags,<br>
                                 QAT_FW_LA_MODE2);<br>
@@ -2459,6 +2457,22 @@ static int qat_sym_cd_auth_set(struct qat_sym_session *cdesc,<br>
         return 0;<br>
 }<br>
 <br>
+static int qat_sym_cd_auth_set(struct qat_sym_session *cdesc,<br>
+               const uint8_t *authkey,<br>
+               uint32_t authkeylen,<br>
+               uint32_t aad_length,<br>
+               uint32_t digestsize,<br>
+               unsigned int operation,<br>
+               enum qat_device_gen qat_dev_gen)<br>
+{<br>
+       if (qat_dev_gen == QAT_GEN6)<br>
+               return qat_sym_cd_auth_set_gen6(cdesc, authkey, authkeylen,<br>
+                               aad_length, digestsize, operation);<br>
+<br>
+       return qat_sym_cd_auth_set_gen1(cdesc, authkey, authkeylen,<br>
+                       aad_length, digestsize, operation, qat_dev_gen);<br>
+}<br>
+<br>
 int qat_sym_validate_aes_key(int key_len, enum icp_qat_hw_cipher_algo *alg)<br>
 {<br>
         switch (key_len) {<br>
@@ -2653,6 +2667,7 @@ qat_sym_cd_crc_set(struct qat_sym_session *cdesc,<br>
                 break;<br>
         case QAT_GEN4:<br>
         case QAT_GEN5:<br>
+       case QAT_GEN6:<br>
                 crc_cfg.mode = ICP_QAT_HW_CIPHER_ECB_MODE;<br>
                 crc_cfg.algo = ICP_QAT_HW_CIPHER_ALGO_NULL;<br>
                 crc_cfg.hash_cmp_val = 0;<br>
diff --git a/drivers/crypto/qat/qat_sym_session.h b/drivers/crypto/qat/qat_sym_session.h<br>
index b18673a1f7..e4fb5cacc6 100644<br>
--- a/drivers/crypto/qat/qat_sym_session.h<br>
+++ b/drivers/crypto/qat/qat_sym_session.h<br>
@@ -204,6 +204,14 @@ qat_sym_sesssion_init_common_hdr(struct qat_sym_session *session,<br>
                                         struct icp_qat_fw_comn_req_hdr *header,<br>
                                         enum qat_sym_proto_flag proto_flags);<br>
 <br>
+int<br>
+qat_sym_cd_auth_set_gen6(struct qat_sym_session *cdesc,<br>
+               const uint8_t *authkey,<br>
+               uint32_t authkeylen,<br>
+               uint32_t aad_length,<br>
+               uint32_t digestsize,<br>
+               unsigned int operation);<br>
+<br>
 int<br>
 qat_sym_validate_aes_key(int key_len, enum icp_qat_hw_cipher_algo *alg);<br>
 int<br>
--<br>
2.52.0<br>
<br>
</div>
</body>
</html>