Add crypto driver skeleton for zsda devices.<br /> <br />Signed-off-by: Hanxiao Li <li.hanxiao@zte.com.cn> <br />---<br /> MAINTAINERS                             |   6 ++<br /> doc/guides/compressdevs/zsda.rst        |   9 ++<br /> doc/guides/cryptodevs/features/zsda.ini |  38 ++++++++<br /> doc/guides/cryptodevs/index.rst         |   1 +<br /> doc/guides/cryptodevs/zsda.rst          |  26 ++++++<br /> drivers/common/zsda/meson.build         |  12 ++-<br /> drivers/common/zsda/zsda_device.c       |   9 +-<br /> drivers/common/zsda/zsda_device.h       |  10 ++<br /> drivers/common/zsda/zsda_qp.c           |   9 ++<br /> drivers/common/zsda/zsda_qp_common.h    |  17 +++-<br /> drivers/crypto/zsda/zsda_sym_pmd.c      | 116 ++++++++++++++++++++++++<br /> drivers/crypto/zsda/zsda_sym_pmd.h      |  37 ++++++++<br /> 12 files changed, 287 insertions(+), 3 deletions(-)<br /> create mode 100644 doc/guides/cryptodevs/features/zsda.ini<br /> create mode 100644 doc/guides/cryptodevs/zsda.rst<br /> create mode 100644 drivers/crypto/zsda/zsda_sym_pmd.c<br /> create mode 100644 drivers/crypto/zsda/zsda_sym_pmd.h<br /> <br />diff --git a/MAINTAINERS b/MAINTAINERS<br />index 312e6fcee5..18fdf3c5ba 100644<br />--- a/MAINTAINERS<br />+++ b/MAINTAINERS<br />@@ -1274,6 +1274,12 @@ F: drivers/crypto/virtio/<br /> F: doc/guides/cryptodevs/virtio.rst<br /> F: doc/guides/cryptodevs/features/virtio.ini<br />  <br />+ZTE Storage Data Accelerator (ZSDA)<br />+M: Hanxiao Li <li.hanxiao@zte.com.cn> <br />+F: drivers/crypto/zsda/<br />+F: doc/guides/cryptodevs/zsda.rst<br />+F: doc/guides/cryptodevs/features/zsda.ini<br />+<br />  <br /> Compression Drivers<br /> -------------------<br />diff --git a/doc/guides/compressdevs/zsda.rst b/doc/guides/compressdevs/zsda.rst<br />index 25b7884535..34cbf235af 100644<br />--- a/doc/guides/compressdevs/zsda.rst<br />+++ b/doc/guides/compressdevs/zsda.rst<br />@@ -174,6 +174,15 @@ e.g. for the 1cf2 device::<br /> Use ``modprobe vfio-pci disable_denylist=1`` from kernel 5.9 onwards.<br />  <br />  <br />+Building DPDK<br />+-------------<br />+<br />+The following commands can be used to build DPDK on a system::<br />+<br />+  meson setup build<br />+  ninja -C build<br />+<br />+<br /> Testing<br /> -------<br />  <br />diff --git a/doc/guides/cryptodevs/features/zsda.ini b/doc/guides/cryptodevs/features/zsda.ini<br />new file mode 100644<br />index 0000000000..55c573adb0<br />--- /dev/null<br />+++ b/doc/guides/cryptodevs/features/zsda.ini<br />@@ -0,0 +1,38 @@<br />+;<br />+; Supported features of the 'zsda' crypto driver.<br />+;<br />+; Refer to default.ini for the full list of available PMD features.<br />+;<br />+[Features]<br />+<br />+<br />+;<br />+; Supported crypto algorithms of the 'zsda' crypto driver.<br />+;<br />+[Cipher]<br />+<br />+<br />+;<br />+; Supported authentication algorithms of the 'zsda' crypto driver.<br />+;<br />+[Auth]<br />+<br />+<br />+<br />+;<br />+; Supported AEAD algorithms of the 'zsda' crypto driver.<br />+;<br />+[AEAD]<br />+<br />+<br />+;<br />+; Supported Asymmetric algorithms of the 'zsda' crypto driver.<br />+;<br />+[Asymmetric]<br />+<br />+<br />+;<br />+; Supported Operating systems of the 'zsda' crypto driver.<br />+;<br />+[OS]<br />+Linux = Y<br />diff --git a/doc/guides/cryptodevs/index.rst b/doc/guides/cryptodevs/index.rst<br />index 1e57a9fe86..be2620f185 100644<br />--- a/doc/guides/cryptodevs/index.rst<br />+++ b/doc/guides/cryptodevs/index.rst<br />@@ -34,3 +34,4 @@ Crypto Device Drivers<br />     uadk<br />     virtio<br />     zuc<br />+    zsda<br />diff --git a/doc/guides/cryptodevs/zsda.rst b/doc/guides/cryptodevs/zsda.rst<br />new file mode 100644<br />index 0000000000..5373b39a2a<br />--- /dev/null<br />+++ b/doc/guides/cryptodevs/zsda.rst<br />@@ -0,0 +1,26 @@<br />+..  SPDX-License-Identifier: BSD-3-Clause<br />+    Copyright(c) 2025 ZTE Corporation.<br />+<br />+ZTE Storage Data Accelerator (ZSDA) Poll Mode Driver<br />+======================================================<br />+<br />+The ZSDA crypto PMD provides poll mode Cipher and Hash driver<br />+support for the following hardware accelerator devices:<br />+<br />+* ``ZTE Processing accelerators 1cf2``<br />+<br />+<br />+Features<br />+--------<br />+<br />+<br />+Limitations<br />+------------<br />+<br />+<br />+Installation<br />+------------<br />+<br />+The ZSDA crypto PMD is built by default with a standard DPDK build.<br />+<br />+For more details, such as testing and debugging, please see :doc:`../compressdevs/zsda`.<br />diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build<br />index be4fbaedb3..fdfbab29cf 100644<br />--- a/drivers/common/zsda/meson.build<br />+++ b/drivers/common/zsda/meson.build<br />@@ -7,7 +7,7 @@ if is_windows<br />     subdir_done()<br /> endif<br />  <br />-deps += ['bus_pci', 'mbuf', 'compressdev']<br />+deps += ['bus_pci', 'compressdev', 'cryptodev']<br /> sources += files(<br />         'zsda_device.c',<br />         'zsda_logs.c',<br />@@ -24,3 +24,13 @@ if zsda_compress<br />         sources += files(join_paths(zsda_compress_relpath, f))<br />     endforeach<br /> endif<br />+<br />+zsda_crypto = true<br />+zsda_crypto_path = 'crypto/zsda' <br />+zsda_crypto_relpath = '../../' + zsda_crypto_path<br />+includes += include_directories(zsda_crypto_relpath)<br />+if zsda_crypto<br />+    foreach f: ['zsda_sym_pmd.c']<br />+        sources += files(join_paths(zsda_crypto_relpath, f))<br />+    endforeach<br />+endif<br />diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c<br />index 8a89dc7fc9..438932ef2f 100644<br />--- a/drivers/common/zsda/zsda_device.c<br />+++ b/drivers/common/zsda/zsda_device.c<br />@@ -152,6 +152,7 @@ zsda_pci_dev_destroy(struct zsda_pci_device *zsda_pci_dev,<br /> {<br />  <br />     zsda_comp_dev_destroy(zsda_pci_dev);<br />+    zsda_sym_dev_destroy(zsda_pci_dev);<br />  <br />     return zsda_pci_device_release(pci_dev);<br /> }<br />@@ -177,7 +178,13 @@ zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,<br />  <br />     ret = zsda_comp_dev_create(zsda_pci_dev);<br />     if (ret)<br />-        ZSDA_LOG(ERR, "Failed! dev create.");<br />+        ZSDA_LOG(ERR, "Failed! comp_dev create.");<br />+<br />+    ret = zsda_sym_dev_create(zsda_pci_dev);<br />+    if (ret) {<br />+        ZSDA_LOG(ERR, "Failed! sym_dev create.");<br />+        zsda_comp_dev_destroy(zsda_pci_dev);<br />+    }<br />  <br />     return ret;<br /> }<br />diff --git a/drivers/common/zsda/zsda_device.h b/drivers/common/zsda/zsda_device.h<br />index dd0fa35ba6..49f0e56431 100644<br />--- a/drivers/common/zsda/zsda_device.h<br />+++ b/drivers/common/zsda/zsda_device.h<br />@@ -7,6 +7,7 @@<br />  <br /> #include "zsda_qp_common.h" <br /> #include "zsda_comp_pmd.h" <br />+#include "zsda_sym_pmd.h" <br />  <br /> #define MAX_QPS_ON_FUNCTION            128<br /> #define ZSDA_DEV_NAME_MAX_LEN        64<br />@@ -21,6 +22,11 @@ struct zsda_device_info {<br />      * Register with this rather than with the one in<br />      * pci_dev so that its driver can have a compression-specific name<br />      */<br />+    struct rte_device sym_rte_dev;<br />+    /**< This represents the crypto sym subset of this pci device.<br />+     * Register with this rather than with the one in<br />+     * pci_dev so that its driver can have a crypto-specific name<br />+     */<br />     struct rte_pci_device *pci_dev;<br /> };<br />  <br />@@ -52,6 +58,10 @@ struct zsda_pci_device {<br />     struct zsda_comp_dev_private *comp_dev;<br />     /**< link back to compressdev private data */<br />  <br />+    /* Data relating to symmetric service */<br />+    struct zsda_sym_dev_private *sym_dev_priv;<br />+    /**< link back to cryptodev private data */<br />+<br />     struct zsda_qp_hw zsda_hw_qps[ZSDA_MAX_SERVICES];<br />     uint16_t zsda_qp_hw_num[ZSDA_MAX_SERVICES];<br /> };<br />diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c<br />index 0ef7cac585..9c83c6c882 100644<br />--- a/drivers/common/zsda/zsda_qp.c<br />+++ b/drivers/common/zsda/zsda_qp.c<br />@@ -15,6 +15,9 @@ static uint8_t zsda_num_used_qps;<br /> static struct ring_size zsda_qp_hw_ring_size[ZSDA_MAX_SERVICES] = {<br />     [ZSDA_SERVICE_COMPRESSION] = {32, 16},<br />     [ZSDA_SERVICE_DECOMPRESSION] = {32, 16},<br />+    [ZSDA_SERVICE_SYMMETRIC_ENCRYPT] = {128, 16},<br />+    [ZSDA_SERVICE_SYMMETRIC_DECRYPT] = {128, 16},<br />+    [ZSDA_SERVICE_HASH_ENCODE] = {32, 16},<br /> };<br />  <br /> static const uint8_t crc8_table[256] = {<br />@@ -480,6 +483,12 @@ zsda_nb_qps_get(const struct zsda_pci_device *zsda_pci_dev)<br />         zsda_num_qps_get(zsda_pci_dev, ZSDA_SERVICE_COMPRESSION);<br />     zsda_nb_qps.decomp =<br />         zsda_num_qps_get(zsda_pci_dev, ZSDA_SERVICE_DECOMPRESSION);<br />+    zsda_nb_qps.encrypt =<br />+        zsda_num_qps_get(zsda_pci_dev, ZSDA_SERVICE_SYMMETRIC_ENCRYPT);<br />+    zsda_nb_qps.decrypt =<br />+        zsda_num_qps_get(zsda_pci_dev, ZSDA_SERVICE_SYMMETRIC_DECRYPT);<br />+    zsda_nb_qps.hash =<br />+        zsda_num_qps_get(zsda_pci_dev, ZSDA_SERVICE_HASH_ENCODE);<br /> }<br />  <br /> int<br />diff --git a/drivers/common/zsda/zsda_qp_common.h b/drivers/common/zsda/zsda_qp_common.h<br />index 941278c6d2..62cb04b499 100644<br />--- a/drivers/common/zsda/zsda_qp_common.h<br />+++ b/drivers/common/zsda/zsda_qp_common.h<br />@@ -24,9 +24,12 @@<br /> enum zsda_service_type {<br />     ZSDA_SERVICE_COMPRESSION = 0,<br />     ZSDA_SERVICE_DECOMPRESSION = 1,<br />+    ZSDA_SERVICE_SYMMETRIC_ENCRYPT = 2,<br />+    ZSDA_SERVICE_SYMMETRIC_DECRYPT = 3,<br />+    ZSDA_SERVICE_HASH_ENCODE = 6,<br />     ZSDA_SERVICE_INVALID,<br /> };<br />-#define ZSDA_MAX_SERVICES (2)<br />+#define ZSDA_MAX_SERVICES (ZSDA_SERVICE_INVALID)<br />  <br /> #define ZSDA_CSR_READ32(addr)          rte_read32((addr))<br /> #define ZSDA_CSR_WRITE32(addr, value) rte_write32((value), (addr))<br />@@ -43,10 +46,22 @@ enum zsda_service_type {<br /> #define MAX_NUM_OPS            0x1FF<br /> #define ZSDA_SGL_FRAGMENT_SIZE    32<br />  <br />+#define ZSDA_OPC_EC_AES_XTS_256 0x0  /* Encry AES-XTS-256 */<br />+#define ZSDA_OPC_EC_AES_XTS_512 0x01 /* Encry AES-XTS-512 */<br />+#define ZSDA_OPC_EC_SM4_XTS_256 0x02 /* Encry SM4-XTS-256 */<br />+#define ZSDA_OPC_DC_AES_XTS_256 0x08 /* Decry AES-XTS-256 */<br />+#define ZSDA_OPC_DC_AES_XTS_512 0x09 /* Decry AES-XTS-512 */<br />+#define ZSDA_OPC_DC_SM4_XTS_256 0x0A /* Decry SM4-XTS-256 */<br /> #define ZSDA_OPC_COMP_GZIP        0x10 /* Encomp deflate-Gzip */<br /> #define ZSDA_OPC_COMP_ZLIB        0x11 /* Encomp deflate-Zlib */<br /> #define ZSDA_OPC_DECOMP_GZIP    0x18 /* Decomp inflate-Gzip */<br /> #define ZSDA_OPC_DECOMP_ZLIB    0x19 /* Decomp inflate-Zlib */<br />+#define ZSDA_OPC_HASH_SHA1        0x20 /* Hash-SHA1 */<br />+#define ZSDA_OPC_HASH_SHA2_224    0x21 /* Hash-SHA2-224 */<br />+#define ZSDA_OPC_HASH_SHA2_256    0x22 /* Hash-SHA2-256 */<br />+#define ZSDA_OPC_HASH_SHA2_384    0x23 /* Hash-SHA2-384 */<br />+#define ZSDA_OPC_HASH_SHA2_512    0x24 /* Hash-SHA2-512 */<br />+#define ZSDA_OPC_HASH_SM3        0x25 /* Hash-SM3 */<br /> #define ZSDA_OPC_INVALID        0xff<br />  <br /> #define CQE_VALID(value) (value & 0x8000)<br />diff --git a/drivers/crypto/zsda/zsda_sym_pmd.c b/drivers/crypto/zsda/zsda_sym_pmd.c<br />new file mode 100644<br />index 0000000000..0f4bf41958<br />--- /dev/null<br />+++ b/drivers/crypto/zsda/zsda_sym_pmd.c<br />@@ -0,0 +1,116 @@<br />+/* SPDX-License-Identifier: BSD-3-Clause<br />+ * Copyright(c) 2025 ZTE Corporation<br />+ */<br />+<br />+#include <rte_cryptodev.h> <br />+<br />+#include "zsda_sym_pmd.h" <br />+<br />+uint8_t zsda_sym_driver_id;<br />+<br />+static struct rte_cryptodev_ops crypto_zsda_ops = {<br />+<br />+    .dev_configure = NULL,<br />+    .dev_start = NULL,<br />+    .dev_stop = NULL,<br />+    .dev_close = NULL,<br />+    .dev_infos_get = NULL,<br />+<br />+    .stats_get = NULL,<br />+    .stats_reset = NULL,<br />+    .queue_pair_setup = NULL,<br />+    .queue_pair_release = NULL,<br />+<br />+    .sym_session_get_size = NULL,<br />+    .sym_session_configure = NULL,<br />+    .sym_session_clear = NULL,<br />+<br />+};<br />+<br />+static const char zsda_sym_drv_name[] = RTE_STR(CRYPTODEV_NAME_ZSDA_SYM_PMD);<br />+static const struct rte_driver cryptodev_zsda_sym_driver = {<br />+    .name = zsda_sym_drv_name, .alias = zsda_sym_drv_name};<br />+<br />+int<br />+zsda_sym_dev_create(struct zsda_pci_device *zsda_pci_dev)<br />+{<br />+    struct zsda_device_info *dev_info =<br />+        &zsda_devs[zsda_pci_dev->zsda_dev_id];<br />+<br />+    struct rte_cryptodev_pmd_init_params init_params = {<br />+        .name = "",<br />+        .socket_id = (int)rte_socket_id(),<br />+        .private_data_size = sizeof(struct zsda_sym_dev_private)};<br />+<br />+    char name[RTE_CRYPTODEV_NAME_MAX_LEN];<br />+    struct rte_cryptodev *cryptodev;<br />+    struct zsda_sym_dev_private *sym_dev_priv;<br />+<br />+    snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s_%s", zsda_pci_dev->name,<br />+         "sym_encrypt");<br />+    ZSDA_LOG(DEBUG, "Creating ZSDA SYM device %s", name);<br />+<br />+    if (rte_eal_process_type() != RTE_PROC_PRIMARY)<br />+        return ZSDA_SUCCESS;<br />+<br />+    dev_info->sym_rte_dev.driver = &cryptodev_zsda_sym_driver;<br />+    dev_info->sym_rte_dev.numa_node = dev_info->pci_dev->device.numa_node;<br />+<br />+    cryptodev = rte_cryptodev_pmd_create(name, &(dev_info->sym_rte_dev),<br />+                         &init_params);<br />+<br />+    if (cryptodev == NULL) {<br />+        ZSDA_LOG(ERR, "Failed! rte_cryptodev_pmd_create");<br />+        goto error;<br />+    }<br />+<br />+    dev_info->sym_rte_dev.name = cryptodev->data->name;<br />+    cryptodev->driver_id = zsda_sym_driver_id;<br />+<br />+    cryptodev->dev_ops = &crypto_zsda_ops;<br />+<br />+    cryptodev->enqueue_burst = NULL;<br />+    cryptodev->dequeue_burst = NULL;<br />+    cryptodev->feature_flags = 0;<br />+<br />+    sym_dev_priv = cryptodev->data->dev_private;<br />+    sym_dev_priv->zsda_pci_dev = zsda_pci_dev;<br />+    sym_dev_priv->cryptodev = cryptodev;<br />+<br />+    zsda_pci_dev->sym_dev_priv = sym_dev_priv;<br />+<br />+    return ZSDA_SUCCESS;<br />+<br />+error:<br />+<br />+    rte_cryptodev_pmd_destroy(cryptodev);<br />+    memset(&dev_info->sym_rte_dev, 0, sizeof(dev_info->sym_rte_dev));<br />+<br />+    return -EFAULT;<br />+}<br />+<br />+int<br />+zsda_sym_dev_destroy(struct zsda_pci_device *zsda_pci_dev)<br />+{<br />+    struct zsda_sym_dev_private *sym_dev_priv;<br />+<br />+    if (zsda_pci_dev == NULL)<br />+        return -ENODEV;<br />+<br />+    sym_dev_priv = zsda_pci_dev->sym_dev_priv;<br />+    if (sym_dev_priv == NULL)<br />+        return ZSDA_SUCCESS;<br />+<br />+    if (rte_eal_process_type() == RTE_PROC_PRIMARY)<br />+        rte_memzone_free(sym_dev_priv->capa_mz);<br />+<br />+    rte_cryptodev_pmd_destroy(sym_dev_priv->cryptodev);<br />+    zsda_devs[zsda_pci_dev->zsda_dev_id].sym_rte_dev.name = NULL;<br />+    zsda_pci_dev->sym_dev_priv = NULL;<br />+<br />+    return ZSDA_SUCCESS;<br />+}<br />+<br />+static struct cryptodev_driver zsda_crypto_drv;<br />+RTE_PMD_REGISTER_CRYPTO_DRIVER(zsda_crypto_drv, cryptodev_zsda_sym_driver,<br />+                   zsda_sym_driver_id);<br />diff --git a/drivers/crypto/zsda/zsda_sym_pmd.h b/drivers/crypto/zsda/zsda_sym_pmd.h<br />new file mode 100644<br />index 0000000000..3d08be68f3<br />--- /dev/null<br />+++ b/drivers/crypto/zsda/zsda_sym_pmd.h<br />@@ -0,0 +1,37 @@<br />+/* SPDX-License-Identifier: BSD-3-Clause<br />+ * Copyright(c) 2025 ZTE Corporation<br />+ */<br />+<br />+#ifndef _ZSDA_SYM_PMD_H_<br />+#define _ZSDA_SYM_PMD_H_<br />+<br />+#include "cryptodev_pmd.h" <br />+<br />+#include "zsda_qp.h" <br />+<br />+/** ZSDA Symmetric Crypto PMD driver name */<br />+#define CRYPTODEV_NAME_ZSDA_SYM_PMD crypto_zsda<br />+#define ZSDA_CIPHER_KEY_MAX_LEN 64<br />+<br />+/** private data structure for a ZSDA device.<br />+ * This ZSDA device is a device offering only symmetric crypto service,<br />+ * there can be one of these on each zsda_pci_device (VF).<br />+ */<br />+struct zsda_sym_dev_private {<br />+    struct zsda_pci_device *zsda_pci_dev;<br />+    /**< The zsda pci device hosting the service */<br />+    struct rte_cryptodev *cryptodev;<br />+    /**< The pointer to this compression device structure */<br />+    const struct rte_cryptodev_capabilities *zsda_dev_capabilities;<br />+    /* ZSDA device symmetric crypto capabilities */<br />+    const struct rte_memzone *capa_mz;<br />+    /* Shared memzone for storing capabilities */<br />+};<br />+<br />+extern uint8_t zsda_sym_driver_id;<br />+<br />+int zsda_sym_dev_create(struct zsda_pci_device *zsda_pci_dev);<br />+<br />+int zsda_sym_dev_destroy(struct zsda_pci_device *zsda_pci_dev);<br />+<br />+#endif /* _ZSDA_SYM_PMD_H_ */<br />--  <br />2.27.0<br />