[v2,1/9] crypto/zsda: add skeleton

Message ID 20250303082751.1053432-2-li.hanxiao@zte.com.cn (mailing list archive)
State New
Delegated to: akhil goyal
Headers
Series crypto/zsda: add zsda cryptodev driver |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Hanxiao Li March 3, 2025, 8:27 a.m. UTC
Add crypto driver skeleton for zsda devices.

Signed-off-by: Hanxiao Li <li.hanxiao@zte.com.cn>
---
 MAINTAINERS                             |   6 ++
 doc/guides/compressdevs/zsda.rst        |   9 ++
 doc/guides/cryptodevs/features/zsda.ini |  38 ++++++++
 doc/guides/cryptodevs/index.rst         |   1 +
 doc/guides/cryptodevs/zsda.rst          |  26 ++++++
 drivers/common/zsda/meson.build         |  12 ++-
 drivers/common/zsda/zsda_device.c       |   9 +-
 drivers/common/zsda/zsda_device.h       |  10 ++
 drivers/common/zsda/zsda_qp.c           |   9 ++
 drivers/common/zsda/zsda_qp_common.h    |  17 +++-
 drivers/crypto/zsda/zsda_sym_pmd.c      | 116 ++++++++++++++++++++++++
 drivers/crypto/zsda/zsda_sym_pmd.h      |  37 ++++++++
 12 files changed, 287 insertions(+), 3 deletions(-)
 create mode 100644 doc/guides/cryptodevs/features/zsda.ini
 create mode 100644 doc/guides/cryptodevs/zsda.rst
 create mode 100644 drivers/crypto/zsda/zsda_sym_pmd.c
 create mode 100644 drivers/crypto/zsda/zsda_sym_pmd.h

-- 
2.27.0
  

Comments

Hanxiao Li April 7, 2025, 1:43 a.m. UTC | #1
Hi Akhil,

The new patches, which are related to crypto driver of zsda devices, have been submit for a month.

Although there are two errors here, they are not problem about the code.
What's more, in my opinion, the patches wouldn't have lots of errors which need to be modified.
Because, many suggestions made in previous submitting process of compression patches
have been adopted in the patches this time.

I will modify the release note and yourt suggestions in the next verson.

I am happy to hear from you.
  

Patch

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