It is necessary to make necessary modifications to<br />existing files based on the newly introduced content<br /> <br />Signed-off-by: Hanxiao Li <li.hanxiao@zte.com.cn> <br />---<br /> MAINTAINERS                       |  3 ++<br /> drivers/common/zsda/zsda_common.h | 50 +++++++++++++++++++++++<br /> drivers/common/zsda/zsda_device.c | 42 +++-----------------<br /> drivers/common/zsda/zsda_device.h | 20 ++++++++--<br /> drivers/common/zsda/zsda_qp.c     | 66 ++++++++++++++++++++++++++++++-<br /> lib/cryptodev/rte_crypto_sym.h    |  4 +-<br /> 6 files changed, 142 insertions(+), 43 deletions(-)<br /> <br />diff --git a/MAINTAINERS b/MAINTAINERS<br />index ea245fc61b..9e66c72c45 100644<br />--- a/MAINTAINERS<br />+++ b/MAINTAINERS<br />@@ -1221,6 +1221,9 @@ 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<br />+M: Hanxiao Li <li.hanxiao@zte.com.cn> <br />+F: drivers/crypto/zsda/<br />  <br /> Compression Drivers<br /> -------------------<br />diff --git a/drivers/common/zsda/zsda_common.h b/drivers/common/zsda/zsda_common.h<br />index 0dbc9b7d3c..d50a152307 100644<br />--- a/drivers/common/zsda/zsda_common.h<br />+++ b/drivers/common/zsda/zsda_common.h<br />@@ -97,17 +97,39 @@<br /> enum zsda_service_type {<br />     ZSDA_SERVICE_COMPRESSION = 0,<br />     ZSDA_SERVICE_DECOMPRESSION,<br />+    ZSDA_SERVICE_SYMMETRIC_ENCRYPT,<br />+    ZSDA_SERVICE_SYMMETRIC_DECRYPT,<br />+    ZSDA_SERVICE_HASH_ENCODE = 6,<br />     ZSDA_SERVICE_INVALID,<br /> };<br />  <br /> #define ZSDA_MAX_SERVICES (ZSDA_SERVICE_INVALID)<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 /* Decompinfalte-Gzip */<br /> #define ZSDA_OPC_DECOMP_ZLIB    0x19 /* Decompinfalte-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 ZSDA_DIGEST_SIZE_SHA1      (20)<br />+#define ZSDA_DIGEST_SIZE_SHA2_224 (28)<br />+#define ZSDA_DIGEST_SIZE_SHA2_256 (32)<br />+#define ZSDA_DIGEST_SIZE_SHA2_384 (48)<br />+#define ZSDA_DIGEST_SIZE_SHA2_512 (64)<br />+#define ZSDA_DIGEST_SIZE_SM3      (32)<br />+<br /> #define SET_CYCLE      0xff<br /> #define SET_HEAD_INTI      0x0<br />  <br />@@ -237,9 +259,34 @@ struct zsda_op_cookie {<br />     uint8_t comp_head[COMP_REMOVE_SPACE_LEN];<br /> } __rte_packed;<br />  <br />+#define ZSDA_CIPHER_KEY_MAX_LEN 64<br />+struct crypto_cfg {<br />+    uint8_t slba_L[8];<br />+    uint8_t key[ZSDA_CIPHER_KEY_MAX_LEN];<br />+    uint8_t lbads : 4;<br />+    uint8_t resv1 : 4;<br />+    uint8_t resv2[7];<br />+    uint8_t slba_H[8];<br />+    uint8_t resv3[8];<br />+} __rte_packed;<br />+<br /> struct compress_cfg {<br /> } __rte_packed;<br />  <br />+struct zsda_wqe_crpt {<br />+    uint8_t valid;<br />+    uint8_t op_code;<br />+    uint16_t sid;<br />+    uint8_t resv[3];<br />+    uint8_t rx_sgl_type : 4;<br />+    uint8_t tx_sgl_type : 4;<br />+    uint64_t rx_addr;<br />+    uint32_t rx_length;<br />+    uint64_t tx_addr;<br />+    uint32_t tx_length;<br />+    struct crypto_cfg cfg;<br />+} __rte_packed;<br />+<br /> struct zsda_wqe_comp {<br />     uint8_t valid;<br />     uint8_t op_code;<br />@@ -281,6 +328,9 @@ struct zsda_common_stat {<br /> enum zsda_algo_core {<br />     ZSDA_CORE_COMP,<br />     ZSDA_CORE_DECOMP,<br />+    ZSDA_CORE_ENCRY,<br />+    ZSDA_CORE_DECRY,<br />+    ZSDA_CORE_HASH,<br />     ZSDA_CORE_INVALID,<br /> };<br />  <br />diff --git a/drivers/common/zsda/zsda_device.c b/drivers/common/zsda/zsda_device.c<br />index de8894f5a3..4ddc97e564 100644<br />--- a/drivers/common/zsda/zsda_device.c<br />+++ b/drivers/common/zsda/zsda_device.c<br />@@ -7,6 +7,7 @@<br /> #include <stdint.h> <br />  <br /> #include "zsda_device.h" <br />+#include "zsda_qp.h" <br />  <br /> /* per-process array of device data */<br /> struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES];<br />@@ -306,7 +307,8 @@ zsda_pci_device_release(const struct rte_pci_device *pci_dev)<br />         inst = &zsda_devs[zsda_pci_dev->zsda_dev_id];<br />  <br />         if (rte_eal_process_type() == RTE_PROC_PRIMARY) {<br />-            if (zsda_pci_dev->comp_dev != NULL) {<br />+            if ((zsda_pci_dev->sym_dev != NULL) ||<br />+                (zsda_pci_dev->comp_dev != NULL)) {<br />                 ZSDA_LOG(DEBUG, "ZSDA device %s is busy", name);<br />                 return -EBUSY;<br />             }<br />@@ -322,47 +324,12 @@ static int<br /> zsda_pci_dev_destroy(struct zsda_pci_device *zsda_pci_dev,<br />              const struct rte_pci_device *pci_dev)<br /> {<br />+    zsda_sym_dev_destroy(zsda_pci_dev);<br />     zsda_comp_dev_destroy(zsda_pci_dev);<br />  <br />     return zsda_pci_device_release(pci_dev);<br /> }<br />  <br />-int<br />-zsda_get_queue_cfg_by_id(const struct zsda_pci_device *zsda_pci_dev,<br />-             const uint8_t qid, struct qinfo *qcfg)<br />-{<br />-    struct zsda_admin_req_qcfg req = {0};<br />-    struct zsda_admin_resp_qcfg resp = {0};<br />-    int ret = 0;<br />-    struct rte_pci_device *pci_dev =<br />-        zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev;<br />-<br />-    if (qid >= MAX_QPS_ON_FUNCTION) {<br />-        ZSDA_LOG(ERR, "qid beyond limit!");<br />-        return ZSDA_FAILED;<br />-    }<br />-<br />-    zsda_admin_msg_init(pci_dev);<br />-    req.msg_type = ZSDA_ADMIN_QUEUE_CFG_REQ;<br />-    req.qid = qid;<br />-<br />-    ret = zsda_send_admin_msg(pci_dev, &req, sizeof(req));<br />-    if (ret) {<br />-        ZSDA_LOG(ERR, "Failed! Send msg");<br />-        return ret;<br />-    }<br />-<br />-    ret = zsda_recv_admin_msg(pci_dev, &resp, sizeof(resp));<br />-    if (ret) {<br />-        ZSDA_LOG(ERR, "Failed! Receive msg");<br />-        return ret;<br />-    }<br />-<br />-    memcpy(qcfg, &resp.qcfg, sizeof(*qcfg));<br />-<br />-    return ZSDA_SUCCESS;<br />-}<br />-<br /> static int<br /> zsda_unmask_flr(const struct zsda_pci_device *zsda_pci_dev)<br /> {<br />@@ -432,6 +399,7 @@ zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,<br />         return ret;<br />     }<br />  <br />+    ret |= zsda_sym_dev_create(zsda_pci_dev);<br />     ret |= zsda_comp_dev_create(zsda_pci_dev);<br />  <br />     if (ret) {<br />diff --git a/drivers/common/zsda/zsda_device.h b/drivers/common/zsda/zsda_device.h<br />index 1b2ad0ce85..07dca183ab 100644<br />--- a/drivers/common/zsda/zsda_device.h<br />+++ b/drivers/common/zsda/zsda_device.h<br />@@ -18,6 +18,13 @@ struct zsda_device_info {<br />  <br />     struct rte_pci_device *pci_dev;<br />  <br />+    // struct rte_device sym_rte_dev;<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 />+<br />     struct rte_device comp_rte_dev;<br />     /**< This represents the compression subset of this pci device.<br />      * Register with this rather than with the one in<br />@@ -27,6 +34,7 @@ struct zsda_device_info {<br />  <br /> extern struct zsda_device_info zsda_devs[];<br />  <br />+struct zsda_sym_dev_private;<br /> struct zsda_comp_dev_private;<br />  <br /> struct zsda_qp_hw_data {<br />@@ -64,6 +72,10 @@ struct zsda_pci_device {<br />  <br />     struct rte_pci_device *pci_dev;<br />  <br />+    /* Data relating to symmetric crypto service */<br />+    struct zsda_sym_dev_private *sym_dev;<br />+    /**< link back to cryptodev private data */<br />+<br />     /* Data relating to compression service */<br />     struct zsda_comp_dev_private *comp_dev;<br />     /**< link back to compressdev private data */<br />@@ -79,7 +91,10 @@ struct zsda_pci_device *<br /> zsda_get_zsda_dev_from_pci_dev(const struct rte_pci_device *pci_dev);<br />  <br /> __rte_weak int<br />-zsda_get_queue_cfg(struct zsda_pci_device *zsda_pci_dev);<br />+zsda_sym_dev_create(struct zsda_pci_device *zsda_pci_dev);<br />+<br />+__rte_weak int<br />+zsda_sym_dev_destroy(struct zsda_pci_device *zsda_pci_dev);<br />  <br /> __rte_weak int<br /> zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev);<br />@@ -87,9 +102,6 @@ zsda_comp_dev_create(struct zsda_pci_device *zsda_pci_dev);<br /> __rte_weak int<br /> zsda_comp_dev_destroy(struct zsda_pci_device *zsda_pci_dev);<br />  <br />-int zsda_get_queue_cfg_by_id(const struct zsda_pci_device *zsda_pci_dev,<br />-                 const uint8_t qid, struct qinfo *qcfg);<br />-<br /> int zsda_queue_start(const struct rte_pci_device *pci_dev);<br /> int zsda_queue_stop(const struct rte_pci_device *pci_dev);<br /> int zsda_queue_clear(const struct rte_pci_device *pci_dev);<br />diff --git a/drivers/common/zsda/zsda_qp.c b/drivers/common/zsda/zsda_qp.c<br />index f2dfe43b2e..5c5ac90771 100644<br />--- a/drivers/common/zsda/zsda_qp.c<br />+++ b/drivers/common/zsda/zsda_qp.c<br />@@ -20,8 +20,11 @@ struct ring_size {<br /> };<br />  <br /> struct ring_size zsda_qp_hw_ring_size[ZSDA_MAX_SERVICES] = {<br />+    [ZSDA_SERVICE_SYMMETRIC_ENCRYPT] = {128, 16},<br />+    [ZSDA_SERVICE_SYMMETRIC_DECRYPT] = {128, 16},<br />     [ZSDA_SERVICE_COMPRESSION] = {32, 16},<br />     [ZSDA_SERVICE_DECOMPRESSION] = {32, 16},<br />+    [ZSDA_SERVICE_HASH_ENCODE] = {32, 16},<br /> };<br />  <br /> static void<br />@@ -36,6 +39,43 @@ zsda_set_queue_head_tail(const struct zsda_pci_device *zsda_pci_dev,<br />              SET_HEAD_INTI);<br /> }<br />  <br />+static int<br />+zsda_get_queue_cfg_by_id(const struct zsda_pci_device *zsda_pci_dev,<br />+             const uint8_t qid, struct qinfo *qcfg)<br />+{<br />+    struct zsda_admin_req_qcfg req = {0};<br />+    struct zsda_admin_resp_qcfg resp = {0};<br />+    int ret = 0;<br />+    struct rte_pci_device *pci_dev =<br />+        zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev;<br />+<br />+    if (qid >= MAX_QPS_ON_FUNCTION) {<br />+        ZSDA_LOG(ERR, "qid beyond limit!");<br />+        return ZSDA_FAILED;<br />+    }<br />+<br />+    zsda_admin_msg_init(pci_dev);<br />+    req.msg_type = ZSDA_ADMIN_QUEUE_CFG_REQ;<br />+    req.qid = qid;<br />+<br />+    ret = zsda_send_admin_msg(pci_dev, &req, sizeof(req));<br />+    if (ret) {<br />+        ZSDA_LOG(ERR, "Failed! Send msg");<br />+        return ret;<br />+    }<br />+<br />+    ret = zsda_recv_admin_msg(pci_dev, &resp, sizeof(resp));<br />+    if (ret) {<br />+        ZSDA_LOG(ERR, "Failed! Receive msg");<br />+        return ret;<br />+    }<br />+<br />+    memcpy(qcfg, &resp.qcfg, sizeof(*qcfg));<br />+<br />+    return ZSDA_SUCCESS;<br />+}<br />+<br />+<br /> int<br /> zsda_get_queue_cfg(struct zsda_pci_device *zsda_pci_dev)<br /> {<br />@@ -43,7 +83,7 @@ zsda_get_queue_cfg(struct zsda_pci_device *zsda_pci_dev)<br />     uint32_t index;<br />     enum zsda_service_type type;<br />     struct zsda_qp_hw *zsda_hw_qps = zsda_pci_dev->zsda_hw_qps;<br />-    struct qinfo qcfg;<br />+    struct qinfo qcfg = {0};<br />     int ret = 0;<br />  <br />     for (i = 0; i < zsda_num_used_qps; i++) {<br />@@ -115,6 +155,30 @@ zsda_comp_max_nb_qps(const struct zsda_pci_device *zsda_pci_dev)<br />     return min;<br /> }<br />  <br />+uint16_t<br />+zsda_crypto_max_nb_qps(struct zsda_pci_device *zsda_pci_dev)<br />+{<br />+    uint16_t encrypt = zsda_qps_per_service(zsda_pci_dev,<br />+                        ZSDA_SERVICE_SYMMETRIC_ENCRYPT);<br />+    uint16_t decrypt = zsda_qps_per_service(zsda_pci_dev,<br />+                        ZSDA_SERVICE_SYMMETRIC_DECRYPT);<br />+    uint16_t hash =<br />+        zsda_qps_per_service(zsda_pci_dev, ZSDA_SERVICE_HASH_ENCODE);<br />+    uint16_t min = 0;<br />+<br />+    if ((encrypt == MAX_QPS_ON_FUNCTION) ||<br />+        (decrypt == MAX_QPS_ON_FUNCTION) ||<br />+        (hash == MAX_QPS_ON_FUNCTION))<br />+        min = MAX_QPS_ON_FUNCTION;<br />+    else {<br />+        min = (encrypt < decrypt) ? encrypt : decrypt;<br />+        min = (min < hash) ? min : hash;<br />+    }<br />+<br />+    if (min == 0)<br />+        return MAX_QPS_ON_FUNCTION;<br />+    return min;<br />+}<br />  <br /> void<br /> zsda_stats_get(void **queue_pairs, const uint32_t nb_queue_pairs,<br />diff --git a/lib/cryptodev/rte_crypto_sym.h b/lib/cryptodev/rte_crypto_sym.h<br />index 53b18b9412..b34d041fe0 100644<br />--- a/lib/cryptodev/rte_crypto_sym.h<br />+++ b/lib/cryptodev/rte_crypto_sym.h<br />@@ -176,8 +176,10 @@ enum rte_crypto_cipher_algorithm {<br />     /**< ShangMi 4 (SM4) algorithm in CTR mode */<br />     RTE_CRYPTO_CIPHER_SM4_OFB,<br />     /**< ShangMi 4 (SM4) algorithm in OFB mode */<br />-    RTE_CRYPTO_CIPHER_SM4_CFB<br />+    RTE_CRYPTO_CIPHER_SM4_CFB,<br />     /**< ShangMi 4 (SM4) algorithm in CFB mode */<br />+    RTE_CRYPTO_CIPHER_SM4_XTS<br />+    /**< ShangMi 4 (SM4) algorithm in XTS mode */<br /> };<br />  <br /> /** Symmetric Cipher Direction */<br />--  <br />2.27.0<br />