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/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     |  14 +++-<br /> drivers/common/zsda/zsda_device.h     |  10 +++<br /> drivers/common/zsda/zsda_qp.c         |   9 ++<br /> drivers/common/zsda/zsda_qp_common.h  |   5 +-<br /> drivers/crypto/zsda/zsda_crypto_pmd.c | 115 ++++++++++++++++++++++++++<br /> drivers/crypto/zsda/zsda_crypto_pmd.h |  49 +++++++++++<br /> 10 files changed, 244 insertions(+), 3 deletions(-)<br /> create mode 100644 doc/guides/cryptodevs/zsda.rst<br /> create mode 100644 drivers/crypto/zsda/zsda_crypto_pmd.c<br /> create mode 100644 drivers/crypto/zsda/zsda_crypto_pmd.h<br /> <br />diff --git a/MAINTAINERS b/MAINTAINERS<br />index 167cc74a15..3e16789250 100644<br />--- a/MAINTAINERS<br />+++ b/MAINTAINERS<br />@@ -1270,6 +1270,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/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..0a7aeb2d50<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 />+<br />+Testing<br />+-------<br />diff --git a/drivers/common/zsda/meson.build b/drivers/common/zsda/meson.build<br />index be4fbaedb3..e897c3a931 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_crypto_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..0d1e772fe4 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_crypto_dev_destroy(zsda_pci_dev);<br />  <br />     return zsda_pci_device_release(pci_dev);<br /> }<br />@@ -177,9 +178,20 @@ 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_crypto_dev_create(zsda_pci_dev);<br />+    if (ret) {<br />+        ZSDA_LOG(ERR, "Failed! crypto_dev create.");<br />+        goto exit;<br />+    }<br />  <br />     return ret;<br />+<br />+exit:<br />+    zsda_comp_dev_destroy(zsda_pci_dev);<br />+<br />+    return ZSDA_FAILED;<br /> }<br />  <br /> static int<br />diff --git a/drivers/common/zsda/zsda_device.h b/drivers/common/zsda/zsda_device.h<br />index dd0fa35ba6..036e157b8d 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_crypto_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 crypto_rte_dev;<br />+    /**< This represents the crypto 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 crypto service */<br />+    struct zsda_crypto_dev_private *crypto_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..dab524e2d3 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_CRYPTO_ENCRY] = {128, 16},<br />+    [ZSDA_SERVICE_CRYPTO_DECRY] = {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_CRYPTO_ENCRY);<br />+    zsda_nb_qps.decrypt =<br />+        zsda_num_qps_get(zsda_pci_dev, ZSDA_SERVICE_CRYPTO_DECRY);<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..e291cb1d60 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_CRYPTO_ENCRY = 2,<br />+    ZSDA_SERVICE_CRYPTO_DECRY = 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 />diff --git a/drivers/crypto/zsda/zsda_crypto_pmd.c b/drivers/crypto/zsda/zsda_crypto_pmd.c<br />new file mode 100644<br />index 0000000000..99acfa3418<br />--- /dev/null<br />+++ b/drivers/crypto/zsda/zsda_crypto_pmd.c<br />@@ -0,0 +1,115 @@<br />+/* SPDX-License-Identifier: BSD-3-Clause<br />+ * Copyright(c) 2025 ZTE Corporation<br />+ */<br />+<br />+#include <rte_cryptodev.h> <br />+<br />+#include "zsda_crypto_pmd.h" <br />+<br />+uint8_t zsda_crypto_driver_id;<br />+<br />+static struct rte_cryptodev_ops crypto_zsda_ops = {<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 />+static const char zsda_crypto_drv_name[] = RTE_STR(CRYPTODEV_NAME_ZSDA_PMD);<br />+static const struct rte_driver cryptodev_zsda_crypto_driver = {<br />+    .name = zsda_crypto_drv_name,<br />+    .alias = zsda_crypto_drv_name<br />+};<br />+<br />+int<br />+zsda_crypto_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_crypto_dev_private)<br />+    };<br />+<br />+    char name[RTE_CRYPTODEV_NAME_MAX_LEN];<br />+    struct rte_cryptodev *cryptodev;<br />+    struct zsda_crypto_dev_private *crypto_dev_priv;<br />+<br />+    if (rte_eal_process_type() != RTE_PROC_PRIMARY)<br />+        return ZSDA_SUCCESS;<br />+<br />+    snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s_%s", zsda_pci_dev->name,<br />+         "crypto");<br />+    ZSDA_LOG(DEBUG, "Creating ZSDA crypto device %s", name);<br />+<br />+    dev_info->crypto_rte_dev.driver = &cryptodev_zsda_crypto_driver;<br />+    dev_info->crypto_rte_dev.numa_node = dev_info->pci_dev->device.numa_node;<br />+<br />+    cryptodev = rte_cryptodev_pmd_create(name, &(dev_info->crypto_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->crypto_rte_dev.name = cryptodev->data->name;<br />+    cryptodev->driver_id = zsda_crypto_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 />+    crypto_dev_priv = cryptodev->data->dev_private;<br />+    crypto_dev_priv->zsda_pci_dev = zsda_pci_dev;<br />+    crypto_dev_priv->cryptodev = cryptodev;<br />+<br />+    zsda_pci_dev->crypto_dev_priv = crypto_dev_priv;<br />+<br />+    return ZSDA_SUCCESS;<br />+<br />+error:<br />+<br />+    rte_cryptodev_pmd_destroy(cryptodev);<br />+    memset(&dev_info->crypto_rte_dev, 0, sizeof(dev_info->crypto_rte_dev));<br />+<br />+    return -EFAULT;<br />+}<br />+<br />+void<br />+zsda_crypto_dev_destroy(struct zsda_pci_device *zsda_pci_dev)<br />+{<br />+    struct zsda_crypto_dev_private *crypto_dev_priv;<br />+<br />+    if (zsda_pci_dev == NULL)<br />+        return;<br />+<br />+    crypto_dev_priv = zsda_pci_dev->crypto_dev_priv;<br />+    if (crypto_dev_priv == NULL)<br />+        return;<br />+<br />+    if (rte_eal_process_type() == RTE_PROC_PRIMARY)<br />+        rte_memzone_free(crypto_dev_priv->capa_mz);<br />+<br />+    rte_cryptodev_pmd_destroy(crypto_dev_priv->cryptodev);<br />+    zsda_devs[zsda_pci_dev->zsda_dev_id].crypto_rte_dev.name = NULL;<br />+    zsda_pci_dev->crypto_dev_priv = NULL;<br />+}<br />+<br />+static struct cryptodev_driver zsda_crypto_drv;<br />+RTE_PMD_REGISTER_CRYPTO_DRIVER(zsda_crypto_drv, cryptodev_zsda_crypto_driver,<br />+                   zsda_crypto_driver_id);<br />diff --git a/drivers/crypto/zsda/zsda_crypto_pmd.h b/drivers/crypto/zsda/zsda_crypto_pmd.h<br />new file mode 100644<br />index 0000000000..c56979e2d1<br />--- /dev/null<br />+++ b/drivers/crypto/zsda/zsda_crypto_pmd.h<br />@@ -0,0 +1,49 @@<br />+/* SPDX-License-Identifier: BSD-3-Clause<br />+ * Copyright(c) 2025 ZTE Corporation<br />+ */<br />+<br />+#ifndef _ZSDA_CRYPTO_PMD_H_<br />+#define _ZSDA_CRYPTO_PMD_H_<br />+<br />+#include "cryptodev_pmd.h" <br />+<br />+#include "zsda_qp.h" <br />+<br />+/* ZSDA Crypto PMD driver name */<br />+#define CRYPTODEV_NAME_ZSDA_PMD crypto_zsda<br />+#define ZSDA_CIPHER_KEY_MAX_LEN 64<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_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 />+<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_crypto_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 crypto device structure */<br />+    const struct rte_cryptodev_capabilities *zsda_crypto_capabilities;<br />+    /**< ZSDA device crypto capabilities */<br />+    const struct rte_memzone *capa_mz;<br />+    /**< Shared memzone for storing capabilities */<br />+};<br />+<br />+int zsda_crypto_dev_create(struct zsda_pci_device *zsda_pci_dev);<br />+<br />+void zsda_crypto_dev_destroy(struct zsda_pci_device *zsda_pci_dev);<br />+<br />+#endif /* _ZSDA_CRYPTO_PMD_H_ */<br />--  <br />2.27.0<br />