drivers/qat: QAT symmetric crypto datapatch rework
Subsystems (2)
cover drivers/qat: QAT symmetric crypto datapatch rework
This patch reworks QAT symmetric crypto datapatch implmentation where each generation request building separated and the crypto operation under the raw datapath api implmentations are unified.
In addtion this patchset also enables QAT OOP support in raw datapath api implmentation.
This patch depends on http://patchwork.dpdk.org/project/dpdk/cover/[email protected]/
Kai Ji (7):
crypro/qat: qat driver refactor skeleton
crypto/qat: qat driver sym op refactor
crypto/qat: qat driver asym op refactor
crypto/qat: qat driver session method rework
crypto/qat: qat driver datapath rework
app/test: cryptodev test fix
crypto/qat: qat driver rework clean up
app/test/test_cryptodev.c | 52 +- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_device.c | 2 +- drivers/common/qat/qat_qp.c | 40 +- drivers/common/qat/qat_qp.h | 38 +- drivers/compress/qat/qat_comp_pmd.c | 12 +- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 7 + drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 90 ++ drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 487 +++++++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 253 +++++ drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 911 +++++++++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 941 +++++++++++++++++- drivers/crypto/qat/qat_asym.c | 786 +++++++++------ drivers/crypto/qat/qat_asym.h | 77 +- drivers/crypto/qat/qat_asym_pmd.c | 231 ----- drivers/crypto/qat/qat_asym_pmd.h | 54 - drivers/crypto/qat/qat_crypto.c | 1 + drivers/crypto/qat/qat_crypto.h | 14 +- drivers/crypto/qat/qat_sym.c | 978 ++++++------------ drivers/crypto/qat/qat_sym.h | 141 ++- drivers/crypto/qat/qat_sym_hw_dp.c | 983 ------------------- drivers/crypto/qat/qat_sym_pmd.c | 251 ----- drivers/crypto/qat/qat_sym_pmd.h | 95 -- drivers/crypto/qat/qat_sym_session.c | 114 +-- drivers/crypto/qat/qat_sym_session.h | 8 +- 25 files changed, 3825 insertions(+), 2745 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h
--
2.17.1
PATCH 1/7 crypro/qat: qat driver refactor skeleton
Add-in enqueue/dequeue op burst and build-request skeleton functions for qat crypto driver refactor.
--- drivers/common/qat/qat_qp.c | 16 +++++++++++++ drivers/common/qat/qat_qp.h | 22 +++++++++++++++++ drivers/crypto/qat/qat_asym.c | 35 ++++++++++++++++++++++++++++ drivers/crypto/qat/qat_asym.h | 15 ++++++++++++ drivers/crypto/qat/qat_sym.c | 25 ++++++++++++++++++++ drivers/crypto/qat/qat_sym.h | 16 +++++++++++++ drivers/crypto/qat/qat_sym_session.h | 6 +++++ 7 files changed, 135 insertions(+)
drivers/common/qat/qat_qp.c +16 -0
@@ -549,6 +549,22 @@ adf_modulo(uint32_t data, uint32_t modulo_mask)return data & modulo_mask; } +uint16_t +refactor_qat_enqueue_op_burst(__rte_unused void *qp, + __rte_unused qat_op_build_request_t op_build_request, + __rte_unused void **ops, __rte_unused uint16_t nb_ops) +{ +return 0 ; +} + +uint16_t +refactor_qat_dequeue_op_burst(__rte_unused void *qp, __rte_unused void **ops, + __rte_unused qat_op_dequeue_t qat_dequeue_process_response, + __rte_unused uint16_t nb_ops) +{ +return 0 ; +} +uint16_t qat_enqueue_op_burst (void *qp,void **ops,uint16_t nb_ops) {
drivers/common/qat/qat_qp.h +22 -0
@@ -36,6 +36,19 @@ struct qat_queue {/* number of responses processed since last CSR head write */ }; +/** +* @brief Function prototype to build a QAT request. +* @param opaque: an opaque data may be used to store context may be useful +* between 2 enqueue operations. +**/ +typedef int (*qat_op_build_request_t )(void *in_op,uint8_t *out_msg, +void *op_cookie,uint64_t *opaque,enum qat_device_gen dev_gen); + +typedef int (*qat_op_dequeue_t )(void **op,uint8_t *resp,void *op_cookie, + uint64_t *dequeue_err_count __rte_unused); + +#define QAT_BUILD_REQUEST_MAX_OPAQUE_SIZE 2 +struct qat_qp {void *mmap_bar_addr;struct qat_queue tx_q;
@@ -44,6 +57,7 @@ struct qat_qp {struct rte_mempool *op_cookie_pool;void **op_cookies;uint32_t nb_descriptors; +uint64_t opaque[QAT_BUILD_REQUEST_MAX_OPAQUE_SIZE ];enum qat_device_gen qat_dev_gen;enum qat_service_type service_type;struct qat_pci_device *qat_dev;
@@ -77,6 +91,14 @@ struct qat_qp_config {const char *service_str; }; +uint16_t +refactor_qat_enqueue_op_burst (void *qp,qat_op_build_request_t op_build_request, +void **ops,uint16_t nb_ops); + +uint16_t +refactor_qat_dequeue_op_burst (void *qp,void **ops, +qat_op_dequeue_t qat_dequeue_process_response,uint16_t nb_ops); +uint16_t qat_enqueue_op_burst (void *qp,void **ops,uint16_t nb_ops);
drivers/crypto/qat/qat_asym.c +35 -0
@@ -456,6 +456,41 @@ qat_asym_fill_arrays(struct rte_crypto_asym_op *asym_op,return 0 ; } +static __rte_always_inline int +refactor_qat_asym_build_request(__rte_unused void *in_op, + __rte_unused uint8_t *out_msg, __rte_unused void *op_cookie, + __rte_unused uint64_t *opaque, + __rte_unused enum qat_device_gen dev_gen) +{ +return 0 ; +} + +int +refactor_qat_asym_process_response(__rte_unused void **op, + __rte_unused uint8_t *resp, + __rte_unused void *op_cookie, + __rte_unused uint64_t *dequeue_err_count) +{ +return 0 ; +} + +uint16_t +qat_asym_crypto_enqueue_op_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops) +{ +return refactor_qat_enqueue_op_burst (qp, + refactor_qat_asym_build_request, + (void **)ops, nb_ops); +} + +uint16_t +qat_asym_crypto_dequeue_op_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops) +{ +return refactor_qat_dequeue_op_burst (qp, (void **)ops, + refactor_qat_asym_process_response, nb_ops); +} + int qat_asym_build_request(void *in_op, uint8_t *out_msg,
drivers/crypto/qat/qat_asym.h +15 -0
@@ -92,4 +92,19 @@ void qat_asym_process_response(void __rte_unused **op, uint8_t *resp, void *op_cookie); +int +refactor_qat_asym_process_response(__rte_unused void **op, + __rte_unused uint8_t *resp, + __rte_unused void *op_cookie, + __rte_unused uint64_t *dequeue_err_count); + +uint16_t +qat_asym_crypto_enqueue_op_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); + + +uint16_t +qat_asym_crypto_dequeue_op_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); +#endif /* _QAT_ASYM_H_ */
drivers/crypto/qat/qat_sym.c +25 -0
@@ -210,6 +210,31 @@ handle_spc_gmac(struct qat_sym_session *ctx, struct rte_crypto_op *op, ICP_QAT_FW_LA_NO_PROTO); } +static __rte_always_inline int +refactor_qat_sym_build_request(__rte_unused void *in_op, + __rte_unused uint8_t *out_msg, __rte_unused void *op_cookie, + __rte_unused uint64_t *opaque, + __rte_unused enum qat_device_gen dev_gen) +{ +return 0 ; +} + +uint16_t +refactor_qat_sym_enqueue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops) +{ +return refactor_qat_enqueue_op_burst (qp, refactor_qat_sym_build_request, + (void **)ops, nb_ops); +} + +uint16_t +refactor_qat_sym_dequeue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops) +{ +return refactor_qat_dequeue_op_burst (qp, (void **)ops, + refactor_qat_sym_process_response, nb_ops); +} +int qat_sym_build_request (void *in_op,uint8_t *out_msg,void *op_cookie,enum qat_device_gen qat_dev_gen)
drivers/crypto/qat/qat_sym.h +16 -0
@@ -54,6 +54,22 @@ struct qat_sym_op_cookie { } opt; }; +static __rte_always_inline int +refactor_qat_sym_process_response(__rte_unused void **op, + __rte_unused uint8_t *resp, __rte_unused void *op_cookie, + __rte_unused uint64_t *dequeue_err_count) +{ +return 0 ; +} + +uint16_t +refactor_qat_sym_enqueue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); + +uint16_t +refactor_qat_sym_dequeue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); +int qat_sym_build_request (void *in_op,uint8_t *out_msg,void *op_cookie,enum qat_device_gen qat_dev_gen);
drivers/crypto/qat/qat_sym_session.h +6 -0
@@ -55,6 +55,11 @@#define QAT_SESSION_IS_SLICE_SET (flags, flag) \ (!!((flags) & (flag))) +struct qat_sym_session ; + +typedef int (*qat_sym_build_request_t )(void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); +enum qat_sym_proto_flag {QAT_CRYPTO_PROTO_FLAG_NONE =0 ,QAT_CRYPTO_PROTO_FLAG_CCM =1 ,
@@ -107,6 +112,7 @@ struct qat_sym_session {/* Some generations need different setup of counter */ uint32_t slice_types;enum qat_sym_proto_flag qat_proto_flag; +qat_sym_build_request_t build_request[2 ]; };int
Signature · 1 line
2.17.1
Re: [dpdk-dev] [dpdk-dev v1 1/7] crypro/qat: qat driver refactor skeleton
Hi Kai,
Quoted 13 lines
-----Original Message-----
From: dev <[email protected]> On Behalf Of Kai Ji
Sent: Tuesday, October 26, 2021 6:25 PM
To: [email protected]
Cc: Ji, Kai <[email protected]>
Subject: [dpdk-dev] [dpdk-dev v1 1/7] crypro/qat: qat driver refactor skeletonAdd-in enqueue/dequeue op burst and build-request skeleton functions for qat crypto driver refactor.
Signed-off-by Kai Ji <[email protected]>---
...
Quoted 6 lines
+/**
+ * @brief Function prototype to build a QAT request.
+ * @param opaque: an opaque data may be used to store context may be useful
+ * between 2 enqueue operations.
+ **/
The comments for the function prototype can be polished to make it clearer. Also the formatting shall be inline with the rest of dpdk code. Such as
/**
* <brief introduction to the function prototype>
*
* @param x
* Description to the param x.
* @return
* - 0 if the crypto request is built successfully.
* - error code otherwise.
*/
drivers/common/qat/qat_qp.h struct qat_queue { · line 48
Quoted 7 lines
(quoted diff) +2
-0+typedef int (*qat_op_build_request_t)(void *in_op, uint8_t *out_msg, + void *op_cookie, uint64_t *opaque, enum qat_device_gen
dev_gen);(quoted diff) +2
-0+ +typedef int (*qat_op_dequeue_t)(void **op, uint8_t *resp, void
*op_cookie,drivers/common/qat/qat_qp.h +1
-0+ uint64_t *dequeue_err_count __rte_unused);
The above function prototype worth some description too?
Quoted 48 lines
drivers/common/qat/qat_qp.h +12
-0+ +#define QAT_BUILD_REQUEST_MAX_OPAQUE_SIZE 2 +struct qat_qp {void *mmap_bar_addr;struct qat_queue tx_q;@@ -44,6 +57,7 @@ struct qat_qp {struct rte_mempool *op_cookie_pool;void **op_cookies;uint32_t nb_descriptors; +uint64_t opaque[QAT_BUILD_REQUEST_MAX_OPAQUE_SIZE ];enum qat_device_gen qat_dev_gen;enum qat_service_type service_type;struct qat_pci_device *qat_dev;@@ -77,6 +91,14 @@ struct qat_qp_config {const char *service_str; }; +uint16_t +refactor_qat_enqueue_op_burst (void *qp,qat_op_build_request_t op_build_request, +void **ops,uint16_t nb_ops); + +uint16_t +refactor_qat_dequeue_op_burst (void *qp,void **ops, +qat_op_dequeue_t qat_dequeue_process_response,uint16_t nb_ops); +uint16_t
qat_enqueue_op_burst(void *qp, void **ops, uint16_t nb_ops);drivers/crypto/qat/qat_asym.c +7
-0@@ -456,6 +456,41 @@ qat_asym_fill_arrays(struct rte_crypto_asym_op *asym_op, return 0; } +static __rte_always_inline int +refactor_qat_asym_build_request(__rte_unused void *in_op, + __rte_unused uint8_t *out_msg, __rte_unused void *op_cookie, + __rte_unused uint64_t *opaque, + __rte_unused enum qat_device_gen dev_gen) +{ +return 0 ;
drivers/crypto/qat/qat_asym.c qat_asym_fill_arrays(struct rte_crypto_asym_op · line 477
Quoted 10 lines
drivers/crypto/qat/qat_asym.c +10
-0+} + +int +refactor_qat_asym_process_response(__rte_unused void **op, + __rte_unused uint8_t *resp, + __rte_unused void *op_cookie, + __rte_unused uint64_t *dequeue_err_count) +{ +return 0 ; +}
I assume the functions refactor_xxx() is removed in future patches right? Maybe adding some comments to help reviewing.
Quoted 68 lines
drivers/crypto/qat/qat_asym.c +12
-0+ +uint16_t +qat_asym_crypto_enqueue_op_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops) +{ +return refactor_qat_enqueue_op_burst (qp, + refactor_qat_asym_build_request, + (void **)ops, nb_ops); +} + +uint16_t +qat_asym_crypto_dequeue_op_burst(void *qp, struct rte_crypto_op**ops,
drivers/crypto/qat/qat_asym.c +4
-0+ uint16_t nb_ops) +{ + return refactor_qat_dequeue_op_burst(qp, (void **)ops, + refactor_qat_asym_process_response,
nb_ops);drivers/crypto/qat/qat_asym.c +2
-0+} + int qat_asym_build_request(void *in_op, uint8_t *out_msg,drivers/crypto/qat/qat_asym.h +13
-0@@ -92,4 +92,19 @@ void qat_asym_process_response(void __rte_unused **op, uint8_t *resp, void *op_cookie); +int +refactor_qat_asym_process_response(__rte_unused void **op, + __rte_unused uint8_t *resp, + __rte_unused void *op_cookie, + __rte_unused uint64_t *dequeue_err_count); + +uint16_t +qat_asym_crypto_enqueue_op_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); + + +uint16_t +qat_asym_crypto_dequeue_op_burst(void *qp, struct rte_crypto_op**ops,
drivers/crypto/qat/qat_asym.h +2
-0+ uint16_t nb_ops); +#endif /* _QAT_ASYM_H_ */ drivers/crypto/qat/qat_sym.c +8
-0@@ -210,6 +210,31 @@ handle_spc_gmac(struct qat_sym_session *ctx,struct rte_crypto_op *op, ICP_QAT_FW_LA_NO_PROTO); } +static __rte_always_inline int +refactor_qat_sym_build_request(__rte_unused void *in_op, + __rte_unused uint8_t *out_msg, __rte_unused void *op_cookie, + __rte_unused uint64_t *opaque, + __rte_unused enum qat_device_gen dev_gen) +{ +return 0 ; +}
drivers/crypto/qat/qat_sym.c handle_spc_gmac(struct qat_sym_session *ctx, · line 232
Quoted 10 lines
drivers/crypto/qat/qat_sym.c +9
-0+ +uint16_t +refactor_qat_sym_enqueue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops) +{ +return refactor_qat_enqueue_op_burst (qp, refactor_qat_sym_build_request, + (void **)ops, nb_ops); +} +
Same as above, some comments would be helpful and shall remove altogether in later patches.
Quoted 66 lines
drivers/crypto/qat/qat_sym.c +6
-0+uint16_t +refactor_qat_sym_dequeue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops) +{ + return refactor_qat_dequeue_op_burst(qp, (void **)ops, + refactor_qat_sym_process_response,
nb_ops);drivers/crypto/qat/qat_sym.c +2
-0+} +int qat_sym_build_request (void *in_op,uint8_t *out_msg,void *op_cookie,enum qat_device_gen qat_dev_gen)drivers/crypto/qat/qat_sym.h +16
-0@@ -54,6 +54,22 @@ struct qat_sym_op_cookie { } opt; }; +static __rte_always_inline int +refactor_qat_sym_process_response(__rte_unused void **op, + __rte_unused uint8_t *resp, __rte_unused void *op_cookie, + __rte_unused uint64_t *dequeue_err_count) +{ +return 0 ; +} + +uint16_t +refactor_qat_sym_enqueue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); + +uint16_t +refactor_qat_sym_dequeue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); +int qat_sym_build_request (void *in_op,uint8_t *out_msg,void *op_cookie,enum qat_device_gen qat_dev_gen);drivers/crypto/qat/qat_sym_session.h +5
-0@@ -55,6 +55,11 @@#define QAT_SESSION_IS_SLICE_SET (flags, flag) \ (!!((flags) & (flag))) +struct qat_sym_session ; + +typedef int (*qat_sym_build_request_t )(void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); +enum qat_sym_proto_flag {QAT_CRYPTO_PROTO_FLAG_NONE =0 ,drivers/crypto/qat/qat_sym_session.h +1
-1QAT_CRYPTO_PROTO_FLAG_CCM = 1,@@ -107,6 +112,7 @@ struct qat_sym_session {/* Some generations need different setup of counter */ uint32_t slice_types;enum qat_sym_proto_flag qat_proto_flag; +qat_sym_build_request_t build_request[2 ]; };int --
Quoted 1 line
2.17.1
All comments are towards the comments - as of the rest
PATCH 2/7 crypto/qat: qat driver sym op refactor
In reply to Kai JiThis patch add-in refactored qat symmetirc build request function implementation (qat_sym_refactor.c & qat_sym_refactor.h) Add-in QAT sym build ops in auth, cipher, chain and aead operation for QAT generation 1
--- drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 1071 ++++++++++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 895 +++++++++++++++ drivers/crypto/qat/qat_sym.h | 8 + drivers/crypto/qat/qat_sym_hw_dp.c | 8 - drivers/crypto/qat/qat_sym_refactor.c | 409 +++++++ drivers/crypto/qat/qat_sym_refactor.h | 402 +++++++ 6 files changed, 2785 insertions(+), 8 deletions(-) create mode 100644 drivers/crypto/qat/qat_sym_refactor.c create mode 100644 drivers/crypto/qat/qat_sym_refactor.h
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +1071 -0
@@ -8,14 +8,1082 @@#include <rte_cryptodev.h> #include "qat_crypto.h" #include "qat_sym_session.h" +#include "qat_sym.h" + +#define QAT_BASE_GEN1_SYM_CAPABILITIES \ + QAT_SYM_PLAIN_AUTH_CAP(SHA1, CAP_SET(block_size, 64), \ + CAP_RNG(digest_size, 1, 20, 1)), \ + QAT_SYM_AEAD_CAP(AES_GCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 0, 12, 12)), \ + QAT_SYM_AEAD_CAP(AES_CCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 2), \ + CAP_RNG(aad_size, 0, 224, 1), CAP_RNG(iv_size, 7, 13, 1)), \ + QAT_SYM_AUTH_CAP(AES_GMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 0, 12, 12)), \ + QAT_SYM_AUTH_CAP(AES_CMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA224, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA1_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 20, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA224_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(MD5_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 16, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(AES_XCBC_MAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 12, 12, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SNOW3G_UIA2, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(KASUMI_F9, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(digest_size), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(AES_CBC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(AES_CTR, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(AES_XTS, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 32, 64, 32), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(AES_DOCSISBPI, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 16), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(SNOW3G_UEA2, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(KASUMI_F8, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(3DES_CBC, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 8, 24, 8), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(3DES_CTR, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 16, 24, 8), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(DES_CBC, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 8, 24, 8), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(DES_DOCSISBPI, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 8, 8, 0), CAP_RNG(iv_size, 8, 8, 0)) + +#define QAT_BASE_GEN1_ASYM_CAPABILITIES \ + QAT_ASYM_CAP(MODEX, 0, 1, 512, 1), \ + QAT_ASYM_CAP(MODINV, 0, 1, 512, 1), \ + QAT_ASYM_CAP(RSA, \ + ((1 << RTE_CRYPTO_ASYM_OP_SIGN) | \ + (1 << RTE_CRYPTO_ASYM_OP_VERIFY) | \ + (1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) | \ + (1 << RTE_CRYPTO_ASYM_OP_DECRYPT)), \ + 64, 512, 64) + +#define QAT_EXTRA_GEN2_SYM_CAPABILITIES \ + QAT_SYM_CIPHER_CAP(ZUC_EEA3, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(ZUC_EIA3, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 16, 16, 0)) \ + +#define QAT_EXTRA_GEN3_SYM_CAPABILITIES \ + QAT_SYM_AEAD_CAP(CHACHA20_POLY1305, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 32, 32, 0), \ + CAP_RNG(digest_size, 16, 16, 0), \ + CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 12, 12, 0)) + +#define QAT_BASE_GEN4_SYM_CAPABILITIES \ + QAT_SYM_CIPHER_CAP(AES_CBC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(SHA1_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 20, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA224_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(AES_XCBC_MAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 12, 12, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(AES_CMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(AES_DOCSISBPI, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 16), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(digest_size), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_PLAIN_AUTH_CAP(SHA1, CAP_SET(block_size, 64), \ + CAP_RNG(digest_size, 1, 20, 1)), \ + QAT_SYM_AUTH_CAP(SHA224, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(AES_CTR, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AEAD_CAP(AES_GCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 0, 12, 12)), \ + QAT_SYM_AEAD_CAP(AES_CCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 2), \ + CAP_RNG(aad_size, 0, 224, 1), CAP_RNG(iv_size, 7, 13, 1)), \ + QAT_SYM_AUTH_CAP(AES_GMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 0, 12, 12)) \ + +#define QAT_SYM_DP_GET_MAX_ENQ (q, c, n) \ + RTE_MIN((q->max_inflights - q->enqueued + q->dequeued - c), n) + +#define QAT_SYM_DP_IS_RESP_SUCCESS (resp) \ + (ICP_QAT_FW_COMN_STATUS_FLAG_OK == \ + ICP_QAT_FW_COMN_RESP_CRYPTO_STAT_GET(resp->comn_hdr.comn_status)) + +static __rte_always_inline int +op_bpi_cipher_decrypt (uint8_t *src,uint8_t *dst, +uint8_t *iv,int ivlen,int srclen, +void *bpi_ctx) +{ +EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX *)bpi_ctx; +int encrypted_ivlen; +uint8_t encrypted_iv[BPI_MAX_ENCR_IV_LEN ]; +uint8_t *encr = encrypted_iv; + +/* ECB method: encrypt (not decrypt!) the IV, then XOR with plaintext */ +if (EVP_EncryptUpdate (ctx, encrypted_iv, &encrypted_ivlen, iv, ivlen) + <=0 ) + goto cipher_decrypt_err; + +for (; srclen !=0 ; --srclen, ++dst, ++src, ++encr) + *dst = *src ^ *encr; + +return 0 ; + +cipher_decrypt_err: +QAT_DP_LOG (ERR ,"libcrypto ECB cipher decrypt for BPI IV failed" ); +return -EINVAL ; +} + +static __rte_always_inline uint32_t +qat_bpicipher_preprocess (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +int block_len =qat_cipher_get_block_size (ctx->qat_cipher_alg); +struct rte_crypto_sym_op *sym_op = op->sym; +uint8_t last_block_len = block_len >0 ? + sym_op->cipher.data.length % block_len :0 ; + +if (last_block_len && ctx->qat_dir ==ICP_QAT_HW_CIPHER_DECRYPT ) { +/* Decrypt last block */ +uint8_t *last_block, *dst, *iv; +uint32_t last_block_offset = sym_op->cipher.data.offset + + sym_op->cipher.data.length - last_block_len; + last_block = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_src, + uint8_t *, last_block_offset); + +if (unlikely ((sym_op->m_dst !=NULL ) + && (sym_op->m_dst != sym_op->m_src))) +/* out-of-place operation (OOP) */ + dst = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_dst, + uint8_t *, last_block_offset); +else + dst = last_block; + +if (last_block_len < sym_op->cipher.data.length) +/* use previous block ciphertext as IV */ + iv = last_block - block_len; +else +/* runt block, i.e. less than one full block */ + iv = rte_crypto_op_ctod_offset(op, uint8_t *, + ctx->cipher_iv.offset); + +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src before pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst before pre-process:" , + dst, last_block_len); +#endif +op_bpi_cipher_decrypt (last_block, dst, iv, block_len, + last_block_len, ctx->bpi_ctx); +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src after pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst after pre-process:" , + dst, last_block_len); +#endif + } + +return sym_op->cipher.data.length - last_block_len; +} + +static __rte_always_inline int +qat_chk_len_in_bits_auth (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 ) { +if (unlikely ((op->sym->auth.data.offset %BYTE_LENGTH !=0 ) || + (op->sym->auth.data.length %BYTE_LENGTH !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int +qat_chk_len_in_bits_cipher (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_KASUMI || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ) { +if (unlikely ((op->sym->cipher.data.length %BYTE_LENGTH !=0 ) || + ((op->sym->cipher.data.offset % +BYTE_LENGTH ) !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int32_t +qat_sym_build_req_set_data (struct icp_qat_fw_la_bulk_req *req, +void *opaque,struct qat_sym_op_cookie *cookie, +struct rte_crypto_vec *src_vec,uint16_t n_src, +struct rte_crypto_vec *dst_vec,uint16_t n_dst) +{ +struct qat_sgl *list; +uint32_t i; +uint32_t tl_src =0 , total_len_src, total_len_dst; +uint64_t src_data_start =0 , dst_data_start =0 ; +int is_sgl = n_src >1 || n_dst >1 ; + +if (unlikely (n_src <1 || n_src >QAT_SYM_SGL_MAX_NUMBER || + n_dst >QAT_SYM_SGL_MAX_NUMBER )) +return -1 ; + +if (likely (!is_sgl)) { + src_data_start = src_vec[0 ].iova; + tl_src = total_len_src = + src_vec[0 ].len; +if (unlikely (n_dst)) {/* oop */ + total_len_dst = dst_vec[0 ].len; + + dst_data_start = dst_vec[0 ].iova; +if (unlikely (total_len_src != total_len_dst)) +return -EINVAL ; + }else { + dst_data_start = src_data_start; + total_len_dst = tl_src; + } + }else {/* sgl */ + total_len_dst = total_len_src =0 ; + +ICP_QAT_FW_COMN_PTR_TYPE_SET (req->comn_hdr.comn_req_flags, +QAT_COMN_PTR_TYPE_SGL ); + + list = (struct qat_sgl *)&cookie->qat_sgl_src; +for (i =0 ; i < n_src; i++) { + list->buffers[i].len = src_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = src_vec[i].iova; +if (tl_src + src_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -1 ; + } + tl_src += src_vec[i].len; + } + + list->num_bufs = i; + src_data_start = cookie->qat_sgl_src_phys_addr; + +if (unlikely (n_dst >0 )) {/* oop sgl */ +uint32_t tl_dst =0 ; + + list = (struct qat_sgl *)&cookie->qat_sgl_dst; + +for (i =0 ; i < n_dst; i++) { + list->buffers[i].len = dst_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = dst_vec[i].iova; +if (tl_dst + dst_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -ENOTSUP ; + } + + tl_dst += dst_vec[i].len; + } + +if (tl_src != tl_dst) +return -EINVAL ; + list->num_bufs = i; + dst_data_start = cookie->qat_sgl_dst_phys_addr; + }else + dst_data_start = src_data_start; + } + + req->comn_mid.src_data_addr = src_data_start; + req->comn_mid.dest_data_addr = dst_data_start; + req->comn_mid.src_length = total_len_src; + req->comn_mid.dst_length = total_len_dst; + req->comn_mid.opaque_data = (uintptr_t )opaque; + +return tl_src; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_cipher (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, + struct rte_crypto_va_iova_ptr *auth_iv_or_aad __rte_unused, + struct rte_crypto_va_iova_ptr *digest __rte_unused) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int n_src =0 ; +int ret; + + ret =qat_chk_len_in_bits_cipher (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->cipher.data.length >>3 ; + cipher_ofs = op->sym->cipher.data.offset >>3 ; +break ; +case 0 : +if (ctx->bpi_ctx) { +/* DOCSIS - only send complete blocks to device. +* Process any partial block using CFB mode. +* Even if 0 complete blocks, still send this to device +* to get into rx queue for post-process and dequeuing +*/ + cipher_len =qat_bpicipher_preprocess (ctx, op); + cipher_ofs = op->sym->cipher.data.offset; + }else { + cipher_len = op->sym->cipher.data.length; + cipher_ofs = op->sym->cipher.data.offset; + } +break ; +default : +QAT_DP_LOG (ERR , +"SNOW3G/KASUMI/ZUC in QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, + cipher_len, in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_auth (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, + struct rte_crypto_va_iova_ptr *cipher_iv __rte_unused, +struct rte_crypto_va_iova_ptr *auth_iv, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t auth_ofs =0 , auth_len =0 ; +int n_src, ret; + + ret =qat_chk_len_in_bits_auth (ctx, op); +switch (ret) { +case 1 : + auth_ofs = op->sym->auth.data.offset >>3 ; + auth_len = op->sym->auth.data.length >>3 ; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); +break ; +case 0 : +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_128 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_64 ) { +/* AES-GMAC */ + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + }else { + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va =NULL ; + auth_iv->iova =0 ; + } +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, auth_ofs, + auth_ofs + auth_len, in_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, auth_ofs, + auth_ofs + auth_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_chain (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +union rte_crypto_sym_ofs ofs; +uint32_t min_ofs =0 , max_len =0 ; +uint32_t cipher_len =0 , cipher_ofs =0 ; +uint32_t auth_len =0 , auth_ofs =0 ; +int is_oop = (op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src); +int is_sgl = op->sym->m_src->nb_segs >1 ; +int n_src; +int ret; + +if (unlikely (is_oop)) + is_sgl |= op->sym->m_dst->nb_segs >1 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv_or_aad->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + + ret =qat_chk_len_in_bits_cipher (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->aead.data.length >>3 ; + cipher_ofs = op->sym->aead.data.offset >>3 ; +break ; +case 0 : + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + ret =qat_chk_len_in_bits_auth (ctx, op); +switch (ret) { +case 1 : + auth_len = op->sym->auth.data.length >>3 ; + auth_ofs = op->sym->auth.data.offset >>3 ; +break ; +case 0 : + auth_len = op->sym->auth.data.length; + auth_ofs = op->sym->auth.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + min_ofs = cipher_ofs < auth_ofs ? cipher_ofs : auth_ofs; + max_len =RTE_MAX (cipher_ofs + cipher_len, auth_ofs + auth_len); + +/* digest in buffer check. Needed only for wireless algos */ +if (ret ==1 ) { +/* Handle digest-encrypted cases, i.e. +* auth-gen-then-cipher-encrypt and +* cipher-decrypt-then-auth-verify +*/ +uint64_t auth_end_iova; + +if (unlikely (is_sgl)) { +uint32_t remaining_off = auth_ofs + auth_len; +struct rte_mbuf *sgl_buf = (is_oop ? op->sym->m_dst : + op->sym->m_src); + +while (remaining_off >=rte_pktmbuf_data_len (sgl_buf) + && sgl_buf->next !=NULL ) { + remaining_off -=rte_pktmbuf_data_len (sgl_buf); + sgl_buf = sgl_buf->next; + } + + auth_end_iova = (uint64_t )rte_pktmbuf_iova_offset ( + sgl_buf, remaining_off); + }else + auth_end_iova = (is_oop ? +rte_pktmbuf_iova (op->sym->m_dst) : +rte_pktmbuf_iova (op->sym->m_src)) + auth_ofs + + auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_ofs + auth_len < cipher_ofs + cipher_len) && + (digest->iova == auth_end_iova)) + max_len =RTE_MAX (max_len, auth_ofs + auth_len + + ctx->digest_length); + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, min_ofs, max_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (unlikely (n_src <0 || n_src > op->sym->m_src->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + in_sgl->num = n_src; + +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, min_ofs, + max_len, out_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + ofs.ofs.cipher.head = cipher_ofs; + ofs.ofs.cipher.tail = max_len - cipher_ofs - cipher_len; + ofs.ofs.auth.head = auth_ofs; + ofs.ofs.auth.tail = max_len - auth_ofs - auth_len; + +return ofs.raw; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_aead (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int32_t n_src =0 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = (void *)op->sym->aead.aad.data; + auth_iv_or_aad->iova = op->sym->aead.aad.phys_addr; + digest->va = (void *)op->sym->aead.digest.data; + digest->iova = op->sym->aead.digest.phys_addr; + + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, cipher_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline void +qat_set_cipher_iv (struct icp_qat_fw_la_cipher_req_params *cipher_param, +struct rte_crypto_va_iova_ptr *iv_ptr,uint32_t iv_len, +struct icp_qat_fw_la_bulk_req *qat_req) +{ +/* copy IV into request if it fits */ +if (iv_len <=sizeof (cipher_param->u.cipher_IV_array)) +rte_memcpy (cipher_param->u.cipher_IV_array, iv_ptr->va, + iv_len); +else { +ICP_QAT_FW_LA_CIPH_IV_FLD_FLAG_SET ( + qat_req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_CIPH_IV_64BIT_PTR ); + cipher_param->u.s.cipher_IV_ptr = iv_ptr->iova; + } +} + +static __rte_always_inline void +qat_sym_dp_fill_vec_status (int32_t *sta,int status,uint32_t n) +{ +uint32_t i; + +for (i =0 ; i < n; i++) + sta[i] = status; +} + +static __rte_always_inline void +enqueue_one_cipher_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + +/* cipher IV */ +qat_set_cipher_iv (cipher_param, iv, ctx->cipher_iv.length, req); + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; +} + +static __rte_always_inline void +enqueue_one_auth_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = data_len - ofs.ofs.auth.head - + ofs.ofs.auth.tail; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, auth_iv->va, + ctx->auth_iv.length); +break ; +default : +break ; + } +} + +static __rte_always_inline int +enqueue_one_chain_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_vec *src_vec, +uint16_t n_src_vecs, +struct rte_crypto_vec *dst_vec, +uint16_t n_dst_vecs, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; +struct rte_crypto_vec *cvec = n_dst_vecs >0 ? + dst_vec : src_vec; +rte_iova_t auth_iova_end; +int cipher_len, auth_len; +int is_sgl = n_src_vecs >1 || n_dst_vecs >1 ; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + cipher_len = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_len = data_len - ofs.ofs.auth.head - ofs.ofs.auth.tail; + +if (unlikely (cipher_len <0 || auth_len <0 )) +return -1 ; + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = cipher_len; +qat_set_cipher_iv (cipher_param, cipher_iv, ctx->cipher_iv.length, req); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = auth_len; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +break ; +default : +break ; + } + +if (unlikely (is_sgl)) { +/* sgl */ +int i = n_dst_vecs ? n_dst_vecs : n_src_vecs; +uint32_t remaining_off = data_len - ofs.ofs.auth.tail; + +while (remaining_off >= cvec->len && i >=1 ) { + i--; + remaining_off -= cvec->len; + cvec++; + } + + auth_iova_end = cvec->iova + remaining_off; + }else + auth_iova_end = cvec[0 ].iova + auth_param->auth_off + + auth_param->auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_param->auth_off + auth_param->auth_len < + cipher_param->cipher_offset + cipher_param->cipher_length) && + (digest->iova == auth_iova_end)) { +/* Handle partial digest encryption */ +if (cipher_param->cipher_offset + cipher_param->cipher_length < + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length && !is_sgl) + req->comn_mid.dst_length = req->comn_mid.src_length = + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length; +struct icp_qat_fw_comn_req_hdr *header = &req->comn_hdr; +ICP_QAT_FW_LA_DIGEST_IN_BUFFER_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_DIGEST_IN_BUFFER ); + } + +return 0 ; +} + +static __rte_always_inline void +enqueue_one_aead_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param = + (void *)&req->serv_specif_rqpars; +struct icp_qat_fw_la_auth_req_params *auth_param = + (void *)((uint8_t *)&req->serv_specif_rqpars + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); +uint8_t *aad_data; +uint8_t aad_ccm_real_len; +uint8_t aad_len_field_sz; +uint32_t msg_len_be; +rte_iova_t aad_iova =0 ; +uint8_t q; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, iv->va, + ctx->cipher_iv.length); + aad_iova = aad->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_AES_CBC_MAC : + aad_data = aad->va; + aad_iova = aad->iova; + aad_ccm_real_len =0 ; + aad_len_field_sz =0 ; + msg_len_be =rte_bswap32 ((uint32_t )data_len - + ofs.ofs.cipher.head); + +if (ctx->aad_len >ICP_QAT_HW_CCM_AAD_DATA_OFFSET ) { + aad_len_field_sz =ICP_QAT_HW_CCM_AAD_LEN_INFO ; + aad_ccm_real_len = ctx->aad_len - +ICP_QAT_HW_CCM_AAD_B0_LEN - +ICP_QAT_HW_CCM_AAD_LEN_INFO ; + }else { + aad_data = iv->va; + aad_iova = iv->iova; + } + + q =ICP_QAT_HW_CCM_NQ_CONST - ctx->cipher_iv.length; + aad_data[0 ] =ICP_QAT_HW_CCM_BUILD_B0_FLAGS ( + aad_len_field_sz, ctx->digest_length, q); +if (q >ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ) { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET + (q - +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ), + (uint8_t *)&msg_len_be, +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ); + }else { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)&msg_len_be + + (ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE + - q), q); + } + +if (aad_len_field_sz >0 ) { + *(uint16_t *)&aad_data[ICP_QAT_HW_CCM_AAD_B0_LEN ] = +rte_bswap16 (aad_ccm_real_len); + +if ((aad_ccm_real_len + aad_len_field_sz) + %ICP_QAT_HW_CCM_AAD_B0_LEN ) { +uint8_t pad_len =0 ; +uint8_t pad_idx =0 ; + + pad_len =ICP_QAT_HW_CCM_AAD_B0_LEN - + ((aad_ccm_real_len + + aad_len_field_sz) % +ICP_QAT_HW_CCM_AAD_B0_LEN ); + pad_idx =ICP_QAT_HW_CCM_AAD_B0_LEN + + aad_ccm_real_len + + aad_len_field_sz; +memset (&aad_data[pad_idx],0 , pad_len); + } + } + +rte_memcpy (((uint8_t *)cipher_param->u.cipher_IV_array) + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , ctx->cipher_iv.length); + *(uint8_t *)&cipher_param->u.cipher_IV_array[0 ] = + q -ICP_QAT_HW_CCM_NONCE_OFFSET ; + +rte_memcpy ((uint8_t *)aad->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va +ICP_QAT_HW_CCM_NONCE_OFFSET , + ctx->cipher_iv.length); +break ; +default : +break ; + } + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_param->auth_off = ofs.ofs.cipher.head; + auth_param->auth_len = cipher_param->cipher_length; + auth_param->auth_res_addr = digest->iova; + auth_param->u1.aad_adr = aad_iova; +}extern struct rte_cryptodev_ops qat_sym_crypto_ops_gen1;extern struct rte_cryptodev_ops qat_asym_crypto_ops_gen1; +/* -----------------GEN 1 sym crypto op data path APIs ---------------- */ +int +qat_sym_build_op_cipher_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_auth_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_aead_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_chain_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +/* -----------------GEN 1 sym crypto raw data path APIs ---------------- */ +int +qat_sym_dp_enqueue_single_cipher_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, +struct rte_crypto_va_iova_ptr *iv, + struct rte_crypto_va_iova_ptr *digest __rte_unused, + struct rte_crypto_va_iova_ptr *aad __rte_unused, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_cipher_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +int +qat_sym_dp_enqueue_single_auth_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, + struct rte_crypto_va_iova_ptr *iv __rte_unused, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_auth_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +int +qat_sym_dp_enqueue_single_chain_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_chain_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +int +qat_sym_dp_enqueue_single_aead_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_aead_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +void * +qat_sym_dp_dequeue_single_gen1 (void *qp_data,uint8_t *drv_ctx, +int *dequeue_status,enum rte_crypto_op_status *op_status); + +uint32_t +qat_sym_dp_dequeue_burst_gen1 (void *qp_data,uint8_t *drv_ctx, +rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count, +uint32_t max_nb_to_dequeue, +rte_cryptodev_raw_post_dequeue_t post_dequeue, +void **out_user_data,uint8_t is_user_data_array, +uint32_t *n_success_jobs,int *return_status); + +int +qat_sym_dp_enqueue_done_gen1 (void *qp_data,uint8_t *drv_ctx,uint32_t n); + +int +qat_sym_dp_denqueue_done_gen1 (void *qp_data,uint8_t *drv_ctx,uint32_t n); + +int +qat_sym_configure_raw_dp_ctx_gen1 (void *_raw_dp_ctx,void *_ctx); +/* -----------------GENx control path APIs ---------------- */ uint64_t qat_sym_crypto_feature_flags_get_gen1 (struct qat_pci_device *qat_dev); +int +qat_sym_crypto_set_session_gen1 (void *cryptodev,void *session); +void qat_sym_session_set_ext_hash_flags_gen2 (struct qat_sym_session *session,uint8_t hash_flag);
@@ -23,6 +1091,9 @@ qat_sym_session_set_ext_hash_flags_gen2(struct qat_sym_session *session,struct qat_capabilities_info qat_asym_crypto_cap_get_gen1 (struct qat_pci_device *qat_dev); +int +qat_asym_crypto_set_session_gen1 (void *cryptodev,void *session); +uint64_t qat_asym_crypto_feature_flags_get_gen1 (struct qat_pci_device *qat_dev);
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +895 -0
901 lines not on this page · raw message
drivers/crypto/qat/qat_sym.h +8 -0
@@ -54,6 +54,14 @@ struct qat_sym_op_cookie { } opt; }; +struct qat_sym_dp_ctx { +struct qat_sym_session *session; +uint32_t tail; +uint32_t head; +uint16_t cached_enqueue; +uint16_t cached_dequeue; +}; + static __rte_always_inline int refactor_qat_sym_process_response(__rte_unused void **op, __rte_unused uint8_t *resp, __rte_unused void *op_cookie,
drivers/crypto/qat/qat_sym_hw_dp.c +0 -8
@@ -13,14 +13,6 @@#include "qat_sym_session.h" #include "qat_qp.h" -struct qat_sym_dp_ctx { -struct qat_sym_session *session; -uint32_t tail; -uint32_t head; -uint16_t cached_enqueue; -uint16_t cached_dequeue; -}; - static __rte_always_inline int32_tqat_sym_dp_parse_data_vec (struct qat_qp *qp,struct icp_qat_fw_la_bulk_req *req,struct rte_crypto_vec *data,uint16_t n_data_vecs)
drivers/crypto/qat/qat_sym_refactor.c new file +409 -0
409 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.h new file +402 -0
402 lines not on this page · raw message
Signature · 1 line
2.17.1
Re: [dpdk-dev] [dpdk-dev v1 2/7] crypto/qat: qat driver sym op refactor
Quoted 7 lines
-----Original Message-----
From: dev <[email protected]> On Behalf Of Kai Ji
Sent: Tuesday, October 26, 2021 6:25 PM
To: [email protected]
Cc: Ji, Kai <[email protected]>
Subject: [dpdk-dev] [dpdk-dev v1 2/7]crypto/qat: qat driver sym op refactor
Quoted 7 lines
This patch add-in refactored qat symmetirc build request function implementation (
qat_sym_refactor.c&qat_sym_refactor.h) Add-in QAT sym build ops in auth, cipher, chain and aead operation for QAT generation 1Signed-off-by Kai Ji <[email protected]>---
PATCH 3/7 crypto/qat: qat driver asym op refactor
In reply to Kai JiThis patch add-in refactored qat asymmetric build request function implementation (qat_asym_refactor.c & qat_asym_refactor.h)
--- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 7 + drivers/crypto/qat/qat_asym_refactor.c | 994 +++++++++++++++++++++ drivers/crypto/qat/qat_asym_refactor.h | 125 +++ 3 files changed, 1126 insertions(+) create mode 100644 drivers/crypto/qat/qat_asym_refactor.c create mode 100644 drivers/crypto/qat/qat_asym_refactor.h
drivers/crypto/qat/dev/qat_asym_pmd_gen1.c +7 -0
@@ -65,6 +65,13 @@ qat_asym_crypto_feature_flags_get_gen1(return feature_flags; } +int +qat_asym_crypto_set_session_gen1(void *cdev __rte_unused, + void *session __rte_unused) +{ +return 0 ; +} +RTE_INIT (qat_asym_crypto_gen1_init) { qat_asym_gen_dev_ops[QAT_GEN1].cryptodev_ops =
drivers/crypto/qat/qat_asym_refactor.c new file +994 -0
994 lines not on this page · raw message
drivers/crypto/qat/qat_asym_refactor.h new file +125 -0
125 lines not on this page · raw message
Signature · 1 line
2.17.1
Re: [dpdk-dev] [dpdk-dev v1 3/7] crypto/qat: qat driver asym op refactor
Quoted 8 lines
-----Original Message-----
From: dev <[email protected]> On Behalf Of Kai Ji
Sent: Tuesday, October 26, 2021 6:25 PM
To: [email protected]
Cc: Ji, Kai <[email protected]>
Subject: [dpdk-dev] [dpdk-dev v1 3/7]crypto/qat: qat driver asym op refactor
Quoted 5 lines
This patch add-in refactored qat asymmetric build request function implementation (
qat_asym_refactor.c&qat_asym_refactor.h)Signed-off-by Kai Ji <[email protected]>---
PATCH 4/7 crypto/qat: qat driver session method rework
In reply to Kai JiThe patch introduce set_session & set_raw_dp_ctx methods to qat gen dev ops Replace min_qat_dev_gen_id with dev_id, the session will be invalid if the device generation id is not matching during init and ops
--- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 90 ++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 467 +++++++++++++++++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 243 ++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 7 +- drivers/crypto/qat/qat_crypto.c | 1 + drivers/crypto/qat/qat_crypto.h | 9 + drivers/crypto/qat/qat_sym.c | 8 +- drivers/crypto/qat/qat_sym_session.c | 106 +---- drivers/crypto/qat/qat_sym_session.h | 2 +- 9 files changed, 832 insertions(+), 101 deletions(-)
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +90 -0
@@ -166,6 +166,90 @@ qat_sym_crypto_qp_setup_gen2(struct rte_cryptodev *dev, uint16_t qp_id,return 0 ; } +void +qat_sym_session_set_ext_hash_flags_gen2 (struct qat_sym_session *session, +uint8_t hash_flag) +{ +struct icp_qat_fw_comn_req_hdr *header = &session->fw_req.comn_hdr; +struct icp_qat_fw_cipher_auth_cd_ctrl_hdr *cd_ctrl = + (struct icp_qat_fw_cipher_auth_cd_ctrl_hdr *) + session->fw_req.cd_ctrl.content_desc_ctrl_lw; + +/* Set the Use Extended Protocol Flags bit in LW 1 */ +QAT_FIELD_SET (header->comn_req_flags, +QAT_COMN_EXT_FLAGS_USED , +QAT_COMN_EXT_FLAGS_BITPOS , +QAT_COMN_EXT_FLAGS_MASK ); + +/* Set Hash Flags in LW 28 */ + cd_ctrl->hash_flags |= hash_flag; + +/* Set proto flags in LW 1 */ +switch (session->qat_cipher_alg) { +case ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_SNOW_3G_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags,0 ); +break ; +case ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_NO_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags, +ICP_QAT_FW_LA_ZUC_3G_PROTO ); +break ; +default : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_NO_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags,0 ); +break ; + } +} + +static int +qat_sym_crypto_set_session_gen2 (void *cdev,void *session) +{ +struct rte_cryptodev *dev = cdev; +struct qat_sym_session *ctx = session; +const struct qat_cryptodev_private *qat_private = + dev->data->dev_private; +int ret; + + ret =qat_sym_crypto_set_session_gen1 (cdev, session); +if (ret ==0 || ret != -ENOTSUP ) +return ret; + +/* GEN1 returning -ENOTSUP as it cannot handle some mixed algo, +* but some are not supported by GEN2, so checking here +*/ +if ((qat_private->internal_capabilities & +QAT_SYM_CAP_MIXED_CRYPTO ) ==0 ) +return -ENOTSUP ; + +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 && + ctx->qat_cipher_alg != +ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx, +1 <<ICP_QAT_FW_AUTH_HDR_FLAG_ZUC_EIA3_BITPOS ); + }else if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 && + ctx->qat_cipher_alg != +ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 ) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx, +1 <<ICP_QAT_FW_AUTH_HDR_FLAG_SNOW3G_UIA2_BITPOS ); + }else if ((ctx->aes_cmac || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_NULL ) && + (ctx->qat_cipher_alg == +ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 || + ctx->qat_cipher_alg == +ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 )) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx,0 ); + } + +return 0 ; +} +struct rte_cryptodev_ops qat_sym_crypto_ops_gen2 = {/* Device related operations */
@@ -204,6 +288,10 @@ RTE_INIT(qat_sym_crypto_gen2_init) qat_sym_gen_dev_ops[QAT_GEN2 ].cryptodev_ops = &qat_sym_crypto_ops_gen2; qat_sym_gen_dev_ops[QAT_GEN2 ].get_capabilities = qat_sym_crypto_cap_get_gen2; + qat_sym_gen_dev_ops[QAT_GEN2 ].set_session = + qat_sym_crypto_set_session_gen2; + qat_sym_gen_dev_ops[QAT_GEN2 ].set_raw_dp_ctx = + qat_sym_configure_raw_dp_ctx_gen1; qat_sym_gen_dev_ops[QAT_GEN2 ].get_feature_flags = qat_sym_crypto_feature_flags_get_gen1;
@@ -221,4 +309,6 @@ RTE_INIT(qat_asym_crypto_gen2_init) qat_asym_crypto_cap_get_gen1; qat_asym_gen_dev_ops[QAT_GEN2 ].get_feature_flags = qat_asym_crypto_feature_flags_get_gen1; + qat_asym_gen_dev_ops[QAT_GEN2 ].set_session = + qat_asym_crypto_set_session_gen1; }
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +467 -0
483 lines not on this page · raw message
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +243 -0
258 lines not on this page · raw message
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +6 -1
@@ -6,6 +6,7 @@#ifdef RTE_LIB_SECURITY #include <rte_security_driver.h> #endif +#include <cryptodev_pmd.h> #include "adf_transport_access_macros.h" #include "icp_qat_fw.h"
@@ -154,7 +155,7 @@ struct rte_cryptodev_ops qat_sym_crypto_ops_gen1 = { };static struct qat_capabilities_info -qat_sym_crypto_cap_get_gen1(struct qat_pci_device *qat_dev __rte_unused) +qat_sym_crypto_cap_get_gen1(struct qat_pci_device * qat_dev __rte_unused) {struct qat_capabilities_info capa_info; capa_info.data = qat_sym_crypto_caps_gen1;
@@ -1169,6 +1170,10 @@ RTE_INIT(qat_sym_crypto_gen1_init) qat_sym_gen_dev_ops[QAT_GEN1 ].cryptodev_ops = &qat_sym_crypto_ops_gen1; qat_sym_gen_dev_ops[QAT_GEN1 ].get_capabilities = qat_sym_crypto_cap_get_gen1; + qat_sym_gen_dev_ops[QAT_GEN1 ].set_session = + qat_sym_crypto_set_session_gen1; + qat_sym_gen_dev_ops[QAT_GEN1 ].set_raw_dp_ctx = + qat_sym_configure_raw_dp_ctx_gen1; qat_sym_gen_dev_ops[QAT_GEN1 ].get_feature_flags = qat_sym_crypto_feature_flags_get_gen1;#ifdef RTE_LIB_SECURITY
drivers/crypto/qat/qat_crypto.c +1 -0
@@ -2,6 +2,7 @@* Copyright(c) 2021 Intel Corporation */ +#include <cryptodev_pmd.h> #include "qat_device.h" #include "qat_qp.h" #include "qat_crypto.h"
drivers/crypto/qat/qat_crypto.h +9 -0
@@ -48,15 +48,24 @@ typedef uint64_t (*get_feature_flags_t)(struct qat_pci_device *qat_dev);typedef void * (*create_security_ctx_t )(void *cryptodev); +typedef int (*set_session_t )(void *cryptodev,void *session); + +typedef int (*set_raw_dp_ctx_t )(void *raw_dp_ctx,void *ctx); +struct qat_crypto_gen_dev_ops {get_feature_flags_t get_feature_flags;get_capabilities_info_t get_capabilities;struct rte_cryptodev_ops *cryptodev_ops; +set_session_t set_session; +set_raw_dp_ctx_t set_raw_dp_ctx;#ifdef RTE_LIB_SECURITY create_security_ctx_t create_security_ctx;#endif }; +extern struct qat_crypto_gen_dev_ops qat_sym_gen_dev_ops[]; +extern struct qat_crypto_gen_dev_ops qat_asym_gen_dev_ops[]; +int qat_cryptodev_config (struct rte_cryptodev *dev,struct rte_cryptodev_config *config);
drivers/crypto/qat/qat_sym.c +1 -7
@@ -237,7 +237,7 @@ refactor_qat_sym_dequeue_burst(void *qp, struct rte_crypto_op **ops,int qat_sym_build_request (void *in_op,uint8_t *out_msg, -void *op_cookie,enum qat_device_gen qat_dev_gen) + void *op_cookie, __rte_unused enum qat_device_gen qat_dev_gen) {int ret =0 ;struct qat_sym_session *ctx =NULL ;
@@ -302,12 +302,6 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg,return -EINVAL ; } -if (unlikely (ctx->min_qat_dev_gen > qat_dev_gen)) { -QAT_DP_LOG (ERR ,"Session alg not supported on this device gen" ); - op->status =RTE_CRYPTO_OP_STATUS_INVALID_SESSION ; -return -EINVAL ; - } - qat_req = (struct icp_qat_fw_la_bulk_req *)out_msg;rte_mov128 ((uint8_t *)qat_req, (const uint8_t *)&(ctx->fw_req)); qat_req->comn_mid.opaque_data = (uint64_t )(uintptr_t )op;
drivers/crypto/qat/qat_sym_session.c +14 -92
186 lines not on this page · raw message
drivers/crypto/qat/qat_sym_session.h +1 -1
@@ -100,7 +100,7 @@ struct qat_sym_session {uint16_t auth_key_length;uint16_t digest_length;rte_spinlock_t lock;/* protects this struct */ -enum qat_device_gen min_qat_dev_gen; +uint16_t dev_id;uint8_t aes_cmac;uint8_t is_single_pass;uint8_t is_single_pass_gmac;
Signature · 1 line
2.17.1
Re: [dpdk-dev] [dpdk-dev v1 4/7] crypto/qat: qat driver session method rework
Quoted 8 lines
-----Original Message-----
From: dev <[email protected]> On Behalf Of Kai Ji
Sent: Tuesday, October 26, 2021 6:25 PM
To: [email protected]
Cc: Ji, Kai <[email protected]>
Subject: [dpdk-dev] [dpdk-dev v1 4/7]crypto/qat: qat driver session method rework
Quoted 7 lines
The patch introduce
set_session&set_raw_dp_ctxmethods to qat gen dev ops
Replacemin_qat_dev_gen_idwithdev_id, the session will be invalid if the device generation id is not matching during init and opsSigned-off-by Kai Ji <[email protected]>---
PATCH 5/7 crypto/qat: qat driver datapath rework
In reply to Kai JiThis patch introduce op_build_request func in qat enqueue op burst. Add-in qat_dequeue_process_response in qat dequeue op burst. Enable session build request op based on crypto operation
--- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_qp.c | 60 +++++--------------- drivers/common/qat/qat_qp.h | 32 +++++++---- drivers/compress/qat/qat_comp_pmd.c | 12 +++- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 4 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 4 +- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 2 +- drivers/crypto/qat/qat_asym_refactor.c | 4 +- drivers/crypto/qat/qat_asym_refactor.h | 2 +- drivers/crypto/qat/qat_sym_hw_dp.c | 2 +- drivers/crypto/qat/qat_sym_refactor.c | 51 +---------------- drivers/crypto/qat/qat_sym_refactor.h | 2 +- 12 files changed, 57 insertions(+), 122 deletions(-)
drivers/common/qat/meson.build +2 -2
@@ -70,8 +70,8 @@ if qat_compress endif if qat_crypto - foreach f: ['qat_sym_pmd.c', 'qat_sym.c', 'qat_sym_session.c', - 'qat_sym_hw_dp.c', 'qat_asym_pmd.c', 'qat_asym.c', 'qat_crypto.c', + foreach f: ['qat_sym_refactor.c', 'qat_sym_session.c', + 'qat_sym_hw_dp.c', 'qat_asym_refactor.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c', 'dev/qat_crypto_pmd_gen2.c',
drivers/common/qat/qat_qp.c +13 -47
99 lines not on this page · raw message
drivers/common/qat/qat_qp.h +22 -10
@@ -14,6 +14,24 @@struct qat_pci_device ; +/* Default qp configuration for GEN4 devices */ +#define QAT_GEN4_QP_DEFCON (QAT_SERVICE_SYMMETRIC | \ + QAT_SERVICE_SYMMETRIC << 8 | \ + QAT_SERVICE_SYMMETRIC << 16 | \ + QAT_SERVICE_SYMMETRIC << 24) + +/* QAT GEN 4 specific macros */ +#define QAT_GEN4_BUNDLE_NUM 4 +#define QAT_GEN4_QPS_PER_BUNDLE_NUM 1 + +/* Queue pair setup error codes */ +#define QAT_NOMEM 1 +#define QAT_QP_INVALID_DESC_NO 2 +#define QAT_QP_BUSY 3 +#define QAT_PCI_NO_RESOURCE 4 + +#define ADF_ARB_RINGSRVARBEN_OFFSET 0x19C +/** * Structure associated with each queue. */
@@ -92,21 +110,15 @@ struct qat_qp_config { };uint16_t -refactor_qat_enqueue_op_burst (void *qp,qat_op_build_request_t op_build_request, +qat_enqueue_op_burst (void *qp,qat_op_build_request_t op_build_request,void **ops,uint16_t nb_ops); -uint16_t -refactor_qat_dequeue_op_burst (void *qp,void **ops, -qat_op_dequeue_t qat_dequeue_process_response,uint16_t nb_ops); - -uint16_t -qat_enqueue_op_burst (void *qp,void **ops,uint16_t nb_ops); -uint16_t qat_enqueue_comp_op_burst (void *qp,void **ops,uint16_t nb_ops);uint16_t -qat_dequeue_op_burst (void *qp,void **ops,uint16_t nb_ops); +qat_dequeue_op_burst (void *qp,void **ops, +qat_op_dequeue_t qat_dequeue_process_response,uint16_t nb_ops);int qat_qp_release (enum qat_device_gen qat_dev_gen,struct qat_qp **qp_addr);
@@ -118,7 +130,7 @@ qat_qp_setup(struct qat_pci_device *qat_dev,int qat_qps_per_service (struct qat_pci_device *qat_dev, -enum qat_service_type service); +enum qat_service_type service);const struct qat_qp_hw_data * qat_qp_get_hw_data(struct qat_pci_device *qat_dev,
drivers/compress/qat/qat_comp_pmd.c +9 -3
@@ -616,11 +616,18 @@ static struct rte_compressdev_ops compress_qat_dummy_ops = { .private_xform_free = qat_comp_private_xform_free }; +static uint16_t +qat_comp_dequeue_burst (void *qp,struct rte_comp_op **ops,uint16_t nb_ops) +{ +return qat_dequeue_op_burst (qp, (void **)ops, qat_comp_process_response, + nb_ops); +} +static uint16_t qat_comp_pmd_dequeue_first_op_burst (void *qp,struct rte_comp_op **ops,uint16_t nb_ops) { -uint16_t ret =qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +uint16_t ret =qat_comp_dequeue_burst (qp, ops, nb_ops);struct qat_qp *tmp_qp = (struct qat_qp *)qp;if (ret) {
@@ -638,8 +645,7 @@ qat_comp_pmd_dequeue_first_op_burst(void *qp, struct rte_comp_op **ops, }else { tmp_qp->qat_dev->comp_dev->compressdev->dequeue_burst = - (compressdev_dequeue_pkt_burst_t ) - qat_dequeue_op_burst; + qat_comp_dequeue_burst; } }return ret;
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym.h" -#include "qat_asym.h" +#include "qat_sym_refactor.h" +#include "qat_asym_refactor.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym.h" -#include "qat_asym.h" +#include "qat_sym_refactor.h" +#include "qat_asym_refactor.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +1 -1
@@ -13,7 +13,7 @@#include "icp_qat_fw_la.h" #include "qat_sym_session.h" -#include "qat_sym.h" +#include "qat_sym_refactor.h" #include "qat_sym_session.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/qat_asym_refactor.c +2 -2
@@ -5,7 +5,7 @@#include <stdarg.h> -#include <rte_cryptodev_pmd.h> +#include <cryptodev_pmd.h> #include "icp_qat_fw_pke.h" #include "icp_qat_fw.h"
@@ -14,7 +14,7 @@#include "qat_device.h" #include "qat_logs.h" -#include "qat_asym.h" +#include "qat_asym_refactor.h" uint8_t qat_asym_driver_id;
drivers/crypto/qat/qat_asym_refactor.h +1 -1
@@ -5,7 +5,7 @@#ifndef _QAT_ASYM_H_#define _QAT_ASYM_H_ -#include <rte_cryptodev_pmd.h> +#include <cryptodev_pmd.h> #include <rte_crypto_asym.h> #include "icp_qat_fw_pke.h" #include "qat_device.h"
drivers/crypto/qat/qat_sym_hw_dp.c +1 -1
@@ -8,7 +8,7 @@#include "icp_qat_fw.h" #include "icp_qat_fw_la.h" -#include "qat_sym.h" +#include "qat_sym_refactor.h" #include "qat_sym_pmd.h" #include "qat_sym_session.h" #include "qat_qp.h"
drivers/crypto/qat/qat_sym_refactor.c +1 -50
63 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.h +1 -1
@@ -5,7 +5,7 @@#ifndef _QAT_SYM_H_#define _QAT_SYM_H_ -#include <rte_cryptodev_pmd.h> +#include <cryptodev_pmd.h> #ifdef RTE_LIB_SECURITY #include <rte_net_crc.h> #endif
Signature · 1 line
2.17.1
Re: [dpdk-dev] [dpdk-dev v1 5/7] crypto/qat: qat driver datapath rework
Quoted 8 lines
-----Original Message-----
From: dev <[email protected]> On Behalf Of Kai Ji
Sent: Tuesday, October 26, 2021 6:25 PM
To: [email protected]
Cc: Ji, Kai <[email protected]>
Subject: [dpdk-dev] [dpdk-dev v1 5/7]crypto/qat: qat driver datapath rework
Quoted 6 lines
This patch introduce
op_build_requestfunc in qat enqueue op burst. Add-inqat_dequeue_process_responsein qat dequeue op burst. Enable session build request op based on crypto operationSigned-off-by Kai Ji <[email protected]>---
PATCH 6/7 app/test: cryptodev test fix
In reply to Kai Jitest_mixed_auth_cipher: ensure enough space allocate in ibuf & obuf for mbuf to vec conversiontest_kasumi_decryption: cipher length update.
qat/dev: support sgl oop operation
--- app/test/test_cryptodev.c | 52 ++++++++++++++---- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 28 ++++++++-- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 14 ++++- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 55 +++++++++++++++++--- 4 files changed, 124 insertions(+), 25 deletions(-)
app/test/test_cryptodev.c +41 -11
@@ -179,6 +179,10 @@ post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,RTE_CRYPTO_OP_STATUS_ERROR ; } +static struct crypto_testsuite_params testsuite_params = {NULL }; +struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; +static struct crypto_unittest_params unittest_params; + void process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
@@ -193,6 +197,7 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,struct rte_crypto_sgl sgl, dest_sgl;uint32_t max_len;union rte_cryptodev_session_ctx sess; +uint64_t auth_end_iova;uint32_t count =0 ;struct rte_crypto_raw_dp_ctx *ctx; uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
@@ -202,6 +207,9 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,int ctx_service_size;int32_t status =0 ;int enqueue_status, dequeue_status; +struct crypto_unittest_params *ut_params = &unittest_params; +/* oop is not supported in raw hw dp api*/ +int is_sgl = sop->m_src->nb_segs >1 ; ctx_service_size =rte_cryptodev_get_raw_dp_ctx_size (dev_id);if (ctx_service_size <0 ) {
@@ -267,6 +275,30 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, digest.va = (void *)sop->auth.digest.data; digest.iova = sop->auth.digest.phys_addr; +if (is_sgl) { +uint32_t remaining_off = auth_offset + auth_len; +struct rte_mbuf *sgl_buf = sop->m_src; + +while (remaining_off >=rte_pktmbuf_data_len (sgl_buf) + && sgl_buf->next !=NULL ) { + remaining_off -=rte_pktmbuf_data_len (sgl_buf); + sgl_buf = sgl_buf->next; + } + + auth_end_iova = (uint64_t )rte_pktmbuf_iova_offset ( + sgl_buf, remaining_off); + }else { +/* oop is not supported in raw hw dp api */ + auth_end_iova =rte_pktmbuf_iova (op->sym->m_src) + + auth_offset + auth_len; + } +/* Then check if digest-encrypted conditions are met */ +if ((auth_offset + auth_len < cipher_offset + cipher_len) && + (digest.iova == auth_end_iova) && is_sgl) + max_len =RTE_MAX (max_len, + auth_offset + auth_len + + ut_params->auth_xform.auth.digest_length); + }else if (is_cipher) { cipher_offset = sop->cipher.data.offset; cipher_len = sop->cipher.data.length;
@@ -503,10 +535,6 @@ process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)return op; } -static struct crypto_testsuite_params testsuite_params = {NULL }; -struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; -static struct crypto_unittest_params unittest_params; -static int testsuite_setup (void ) {
@@ -4077,9 +4105,9 @@ test_kasumi_decryption(const struct kasumi_test_data *tdata)/* Create KASUMI operation */ retval =create_wireless_algo_cipher_operation (tdata->cipher_iv.data, - tdata->cipher_iv.len, - tdata->ciphertext.len, - tdata->validCipherOffsetInBits.len); + tdata->cipher_iv.len, +RTE_ALIGN_CEIL (tdata->validCipherLenInBits.len,8 ), + tdata->validCipherOffsetInBits.len);if (retval <0 )return retval;
@@ -7310,6 +7338,7 @@ test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,unsigned int plaintext_len;unsigned int ciphertext_pad_len;unsigned int ciphertext_len; +unsigned int data_len;struct rte_cryptodev_info dev_info;struct rte_crypto_op *op;
@@ -7370,21 +7399,22 @@ test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata, plaintext_len =ceil_byte_length (tdata->plaintext.len_bits); ciphertext_pad_len =RTE_ALIGN_CEIL (ciphertext_len,16 ); plaintext_pad_len =RTE_ALIGN_CEIL (plaintext_len,16 ); + data_len =RTE_MAX (ciphertext_pad_len, plaintext_pad_len);if (verify) { ciphertext = (uint8_t *)rte_pktmbuf_append (ut_params->ibuf, - ciphertext_pad_len); + data_len);memcpy (ciphertext, tdata->ciphertext.data, ciphertext_len);if (op_mode ==OUT_OF_PLACE ) -rte_pktmbuf_append (ut_params->obuf, ciphertext_pad_len); +rte_pktmbuf_append (ut_params->obuf, data_len);debug_hexdump (stdout,"ciphertext:" , ciphertext, ciphertext_len); }else { plaintext = (uint8_t *)rte_pktmbuf_append (ut_params->ibuf, - plaintext_pad_len); + data_len);memcpy (plaintext, tdata->plaintext.data, plaintext_len);if (op_mode ==OUT_OF_PLACE ) -rte_pktmbuf_append (ut_params->obuf, plaintext_pad_len); +rte_pktmbuf_append (ut_params->obuf, data_len);debug_hexdump (stdout,"plaintext:" , plaintext, plaintext_len); }
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +24 -4
@@ -467,8 +467,18 @@ qat_sym_dp_enqueue_aead_jobs_gen3(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ;
@@ -564,8 +574,18 @@ qat_sym_dp_enqueue_auth_jobs_gen3(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ; enqueue_one_auth_job_gen3(ctx, cookie, req, &vec->digest[i],
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +12 -2
@@ -295,8 +295,18 @@ qat_sym_dp_enqueue_aead_jobs_gen4(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ;
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +47 -8
80 lines not on this page · raw message
Signature · 1 line
2.17.1
Re: [dpdk-dev] [dpdk-dev v1 6/7] app/test: cryptodev test fix
Hi Kai,
Quoted 91 lines
-----Original Message-----
From: dev <[email protected]> On Behalf Of Kai Ji
Sent: Tuesday, October 26, 2021 6:25 PM
To: [email protected]
Cc: Ji, Kai <[email protected]>; De Lara Guarch, Pablo <[email protected]>; [email protected]
Subject: [dpdk-dev] [dpdk-dev v1 6/7] app/test: cryptodev test fix
test_mixed_auth_cipher: ensure enough space allocate in ibuf & obuf for mbuf to vec conversiontest_kasumi_decryption: cipher length update.
qat/dev: support sgl oop operationFixes 681f540da52b ("cryptodev: do not use AAD in wireless algorithms")Fixes e847fc512817 ("test/crypto: add encrypted digest case for AES-CTR-CMAC")
Cc: [email protected]Signed-off-by Kai Ji <[email protected]>--- app/test/test_cryptodev.c | 52 ++++++++++++++---- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 28 ++++++++-- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 14 ++++- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 55 +++++++++++++++++- -- 4 files changed, 124 insertions(+), 25 deletions(-)app/test/test_cryptodev.c +4
-0@@ -179,6 +179,10 @@ post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,RTE_CRYPTO_OP_STATUS_ERROR ; } +static struct crypto_testsuite_params testsuite_params = {NULL }; +struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; +static struct crypto_unittest_params unittest_params; + void process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,app/test/test_cryptodev.c +1
-0struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,@@ -193,6 +197,7 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, struct rte_crypto_sgl sgl, dest_sgl;uint32_t max_len;union rte_cryptodev_session_ctx sess; +uint64_t auth_end_iova;uint32_t count =0 ;struct rte_crypto_raw_dp_ctx *ctx;app/test/test_cryptodev.c +3
-0uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,@@ -202,6 +207,9 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, int ctx_service_size;int32_t status =0 ;int enqueue_status, dequeue_status; +struct crypto_unittest_params *ut_params = &unittest_params; +/* oop is not supported in raw hw dp api*/ +int is_sgl = sop->m_src->nb_segs >1 ; ctx_service_size =rte_cryptodev_get_raw_dp_ctx_size (dev_id);app/test/test_cryptodev.c +11
-0if (ctx_service_size <0 ) {@@ -267,6 +275,30 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, digest.va = (void *)sop->auth.digest.data; digest.iova = sop->auth.digest.phys_addr; +if (is_sgl) { +uint32_t remaining_off = auth_offset + auth_len; +struct rte_mbuf *sgl_buf = sop->m_src; + +while (remaining_off >=rte_pktmbuf_data_len (sgl_buf) + && sgl_buf->next !=NULL ) { + remaining_off -=rte_pktmbuf_data_len (sgl_buf); + sgl_buf = sgl_buf->next; + } + + auth_end_iova =(uint64_t)rte_pktmbuf_iova_offset(
app/test/test_cryptodev.c +4
-0+ sgl_buf, remaining_off); + }else { +/* oop is not supported in raw hw dp api */ + auth_end_iova = rte_pktmbuf_iova(op->sym-Quoted 1 line
m_src) +app/test/test_cryptodev.c +1
-0+ auth_offset +
auth_len;
app/test/test_cryptodev.c process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, · line 301
Quoted 8 lines
app/test/test_cryptodev.c +8
-0+ } +/* Then check if digest-encrypted conditions are met */ +if ((auth_offset + auth_len < cipher_offset + cipher_len) && + (digest.iova == auth_end_iova) && is_sgl) + max_len =RTE_MAX (max_len, + auth_offset + auth_len + + ut_params->auth_xform.auth.digest_length); +
This fix to me only address the in-place SGL problem but not the out-of-place SGL.
Regards,
Fan
PATCH 7/7 crypto/qat: qat driver rework clean up
In reply to Kai JiThis patch rename back refactor code to qat_sym.c and qat_asym.c, meson build file also updated accordingly.
Integrate qat hw dp apis and qat pmd function to qat_sym.c and qat_asym.c
--- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_device.c | 2 +- drivers/common/qat/qat_qp.c | 4 +- drivers/common/qat/qat_qp.h | 2 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 4 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 4 +- drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 164 +-- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 2 +- drivers/crypto/qat/qat_asym.c | 803 +++++++++------ drivers/crypto/qat/qat_asym.h | 90 +- drivers/crypto/qat/qat_asym_pmd.c | 231 ----- drivers/crypto/qat/qat_asym_pmd.h | 54 - drivers/crypto/qat/qat_asym_refactor.c | 994 ------------------ drivers/crypto/qat/qat_asym_refactor.h | 125 --- drivers/crypto/qat/qat_crypto.h | 5 +- drivers/crypto/qat/qat_sym.c | 997 ++++++------------- drivers/crypto/qat/qat_sym.h | 141 ++- drivers/crypto/qat/qat_sym_hw_dp.c | 975 ------------------ drivers/crypto/qat/qat_sym_pmd.c | 251 ----- drivers/crypto/qat/qat_sym_pmd.h | 95 -- drivers/crypto/qat/qat_sym_refactor.c | 360 ------- drivers/crypto/qat/qat_sym_refactor.h | 402 -------- drivers/crypto/qat/qat_sym_session.c | 8 +- 23 files changed, 997 insertions(+), 4720 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h delete mode 100644 drivers/crypto/qat/qat_asym_refactor.c delete mode 100644 drivers/crypto/qat/qat_asym_refactor.h delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h delete mode 100644 drivers/crypto/qat/qat_sym_refactor.c delete mode 100644 drivers/crypto/qat/qat_sym_refactor.h
drivers/common/qat/meson.build +2 -2
@@ -70,8 +70,8 @@ if qat_compress endif if qat_crypto - foreach f: ['qat_sym_refactor.c', 'qat_sym_session.c', - 'qat_sym_hw_dp.c', 'qat_asym_refactor.c', 'qat_crypto.c', + foreach f: ['qat_sym.c', 'qat_sym_session.c', + 'qat_asym.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c', 'dev/qat_crypto_pmd_gen2.c',
drivers/common/qat/qat_device.c +1 -1
@@ -8,7 +8,7 @@#include "qat_device.h" #include "adf_transport_access_macros.h" -#include "qat_sym_pmd.h" +#include "qat_sym.h" #include "qat_comp_pmd.h" #include "adf_pf2vf_msg.h" #include "qat_pf2vf.h"
drivers/common/qat/qat_qp.c +2 -2
@@ -15,8 +15,8 @@#include "qat_logs.h" #include "qat_device.h" #include "qat_qp.h" -#include "qat_sym_refactor.h" -#include "qat_asym_refactor.h" +#include "qat_sym.h" +#include "qat_asym.h" #include "qat_comp.h" #define QAT_CQ_MAX_DEQ_RETRIES 10
drivers/common/qat/qat_qp.h +1 -1
@@ -130,7 +130,7 @@ qat_qp_setup(struct qat_pci_device *qat_dev,int qat_qps_per_service (struct qat_pci_device *qat_dev, -enum qat_service_type service); +enum qat_service_type service);const struct qat_qp_hw_data * qat_qp_get_hw_data(struct qat_pci_device *qat_dev,
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym_refactor.h" -#include "qat_asym_refactor.h" +#include "qat_sym.h" +#include "qat_asym.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym_refactor.h" -#include "qat_asym_refactor.h" +#include "qat_sym.h" +#include "qat_asym.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +2 -162
182 lines not on this page · raw message
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +1 -1
@@ -13,7 +13,7 @@#include "icp_qat_fw_la.h" #include "qat_sym_session.h" -#include "qat_sym_refactor.h" +#include "qat_sym.h" #include "qat_sym_session.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/qat_asym.c +483 -320
879 lines not on this page · raw message
drivers/crypto/qat/qat_asym.h +52 -38
123 lines not on this page · raw message
drivers/crypto/qat/qat_asym_pmd.c deleted +0 -231
231 lines not on this page · raw message
drivers/crypto/qat/qat_asym_pmd.h deleted +0 -54
54 lines not on this page · raw message
drivers/crypto/qat/qat_asym_refactor.c deleted +0 -994
994 lines not on this page · raw message
drivers/crypto/qat/qat_asym_refactor.h deleted +0 -125
125 lines not on this page · raw message
drivers/crypto/qat/qat_crypto.h +4 -1
@@ -12,7 +12,10 @@extern uint8_t qat_sym_driver_id;extern uint8_t qat_asym_driver_id; -/** helper macro to set cryptodev capability range **/ +/** +* helper macro to set cryptodev capability range +* <n: name> <l: min > <r: max> <i: increment> <v: value> +**/ #define CAP_RNG (n, l, r, i) .n = {.min = l, .max = r, .increment = i}#define CAP_RNG_ZERO (n) .n = {.min = 0, .max = 0, .increment = 0}
drivers/crypto/qat/qat_sym.c +326 -671
337 lines not on this page · raw message
drivers/crypto/qat/qat_sym.h +115 -26
141 lines not on this page · raw message
drivers/crypto/qat/qat_sym_hw_dp.c deleted +0 -975
975 lines not on this page · raw message
drivers/crypto/qat/qat_sym_pmd.c deleted +0 -251
251 lines not on this page · raw message
drivers/crypto/qat/qat_sym_pmd.h deleted +0 -95
95 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.c deleted +0 -360
360 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.h deleted +0 -402
402 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.17.1
Part of the diff is not shown here. View the raw message.
Re: [dpdk-dev] [dpdk-dev v1 7/7] crypto/qat: qat driver rework clean up
Quoted 7 lines
-----Original Message-----
From: dev <[email protected]> On Behalf Of Kai Ji
Sent: Tuesday, October 26, 2021 6:25 PM
To: [email protected]
Cc: Ji, Kai <[email protected]>
Subject: [dpdk-dev] [dpdk-dev v1 7/7]crypto/qat: qat driver rework clean up
Quoted 6 lines
This patch rename back refactor code to
qat_sym.candqat_asym.c, meson build file also updated accordingly.
Integrate qat hw dp apis and qat pmd function toqat_sym.candqat_asym.cSigned-off-by Kai Ji <[email protected]>---
v2 cover drivers/qat: QAT symmetric crypto datapatch rework
In reply to Kai JiThis patch reworks QAT symmetric crypto datapatch implementation where each generation request building separated and the crypto operation under the raw datapath api implementation are unified.
In addtion this patchset also enables QAT OOP support in raw datapath api implementation.
This patch depends on http://patchwork.dpdk.org/project/dpdk/cover/[email protected]/
v2:
- review comments addressed
Kai Ji (7):
crypro/qat: qat driver refactor skeleton
crypto/qat: qat driver sym op refactor
crypto/qat: qat driver asym op refactor
crypto/qat: qat driver session method rework
crypto/qat: qat driver datapath rework
app/test: cryptodev test fix
crypto/qat: qat driver rework clean up
app/test/test_cryptodev.c | 58 +- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_device.c | 2 +- drivers/common/qat/qat_qp.c | 40 +- drivers/common/qat/qat_qp.h | 70 +- drivers/compress/qat/qat_comp_pmd.c | 12 +- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 7 + drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 90 ++ drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 487 +++++++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 253 +++++ drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 911 +++++++++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 939 ++++++++++++++++++ drivers/crypto/qat/qat_asym.c | 786 +++++++++------ drivers/crypto/qat/qat_asym.h | 77 +- drivers/crypto/qat/qat_asym_pmd.c | 231 ----- drivers/crypto/qat/qat_asym_pmd.h | 54 - drivers/crypto/qat/qat_crypto.c | 1 + drivers/crypto/qat/qat_crypto.h | 14 +- drivers/crypto/qat/qat_sym.c | 978 ++++++------------ drivers/crypto/qat/qat_sym.h | 141 ++- drivers/crypto/qat/qat_sym_hw_dp.c | 983 ------------------- drivers/crypto/qat/qat_sym_pmd.c | 251 ----- drivers/crypto/qat/qat_sym_pmd.h | 95 -- drivers/crypto/qat/qat_sym_session.c | 114 +-- drivers/crypto/qat/qat_sym_session.h | 8 +- 25 files changed, 3861 insertions(+), 2745 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h
Signature · 1 line
2.17.1
PATCH v2 1/7 crypro/qat: qat driver refactor skeleton
Add-in enqueue/dequeue op burst and build-request skeleton functions for qat crypto driver refactor.
--- drivers/common/qat/qat_qp.c | 16 +++++++++ drivers/common/qat/qat_qp.h | 54 ++++++++++++++++++++++++++++ drivers/crypto/qat/qat_asym.c | 43 ++++++++++++++++++++++ drivers/crypto/qat/qat_asym.h | 15 ++++++++ drivers/crypto/qat/qat_sym.c | 37 +++++++++++++++++++ drivers/crypto/qat/qat_sym.h | 16 +++++++++ drivers/crypto/qat/qat_sym_session.h | 6 ++++ 7 files changed, 187 insertions(+)
drivers/common/qat/qat_qp.c +16 -0
@@ -549,6 +549,22 @@ adf_modulo(uint32_t data, uint32_t modulo_mask)return data & modulo_mask; } +uint16_t +refactor_qat_enqueue_op_burst(__rte_unused void *qp, + __rte_unused qat_op_build_request_t op_build_request, + __rte_unused void **ops, __rte_unused uint16_t nb_ops) +{ +return 0 ; +} + +uint16_t +refactor_qat_dequeue_op_burst(__rte_unused void *qp, __rte_unused void **ops, + __rte_unused qat_op_dequeue_t qat_dequeue_process_response, + __rte_unused uint16_t nb_ops) +{ +return 0 ; +} +uint16_t qat_enqueue_op_burst (void *qp,void **ops,uint16_t nb_ops) {
drivers/common/qat/qat_qp.h +54 -0
72 lines not on this page · raw message
drivers/crypto/qat/qat_asym.c +43 -0
49 lines not on this page · raw message
drivers/crypto/qat/qat_asym.h +15 -0
@@ -92,4 +92,19 @@ void qat_asym_process_response(void __rte_unused **op, uint8_t *resp, void *op_cookie); +int +refactor_qat_asym_process_response(__rte_unused void **op, + __rte_unused uint8_t *resp, + __rte_unused void *op_cookie, + __rte_unused uint64_t *dequeue_err_count); + +uint16_t +qat_asym_crypto_enqueue_op_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); + + +uint16_t +qat_asym_crypto_dequeue_op_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); +#endif /* _QAT_ASYM_H_ */
drivers/crypto/qat/qat_sym.c +37 -0
@@ -210,6 +210,43 @@ handle_spc_gmac(struct qat_sym_session *ctx, struct rte_crypto_op *op, ICP_QAT_FW_LA_NO_PROTO); } +/* +* Sym build request refactor function template, +* will be removed in the later patchset. +*/ +static __rte_always_inline int +refactor_qat_sym_build_request(__rte_unused void *in_op, + __rte_unused uint8_t *out_msg, __rte_unused void *op_cookie, + __rte_unused uint64_t *opaque, + __rte_unused enum qat_device_gen dev_gen) +{ +return 0 ; +} + +/* +* Sym enqueue burst refactor function template, +* will be removed in the later patchset. +*/ +uint16_t +refactor_qat_sym_enqueue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops) +{ +return refactor_qat_enqueue_op_burst (qp, refactor_qat_sym_build_request, + (void **)ops, nb_ops); +} + +/* +* Sym dequeue burst refactor function template, +* will be removed in the later patchset. +*/ +uint16_t +refactor_qat_sym_dequeue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops) +{ +return refactor_qat_dequeue_op_burst (qp, (void **)ops, + refactor_qat_sym_process_response, nb_ops); +} +int qat_sym_build_request (void *in_op,uint8_t *out_msg,void *op_cookie,enum qat_device_gen qat_dev_gen)
drivers/crypto/qat/qat_sym.h +16 -0
@@ -54,6 +54,22 @@ struct qat_sym_op_cookie { } opt; }; +static __rte_always_inline int +refactor_qat_sym_process_response(__rte_unused void **op, + __rte_unused uint8_t *resp, __rte_unused void *op_cookie, + __rte_unused uint64_t *dequeue_err_count) +{ +return 0 ; +} + +uint16_t +refactor_qat_sym_enqueue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); + +uint16_t +refactor_qat_sym_dequeue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); +int qat_sym_build_request (void *in_op,uint8_t *out_msg,void *op_cookie,enum qat_device_gen qat_dev_gen);
drivers/crypto/qat/qat_sym_session.h +6 -0
@@ -55,6 +55,11 @@#define QAT_SESSION_IS_SLICE_SET (flags, flag) \ (!!((flags) & (flag))) +struct qat_sym_session ; + +typedef int (*qat_sym_build_request_t )(void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); +enum qat_sym_proto_flag {QAT_CRYPTO_PROTO_FLAG_NONE =0 ,QAT_CRYPTO_PROTO_FLAG_CCM =1 ,
@@ -107,6 +112,7 @@ struct qat_sym_session {/* Some generations need different setup of counter */ uint32_t slice_types;enum qat_sym_proto_flag qat_proto_flag; +qat_sym_build_request_t build_request[2 ]; };int
Signature · 1 line
2.17.1
PATCH v2 2/7 crypto/qat: qat driver sym op refactor
In reply to Kai JiThis patch add-in refactored qat symmetirc build request function implementation (qat_sym_refactor.c & qat_sym_refactor.h) Add-in QAT sym build ops in auth, cipher, chain and aead operation for QAT generation 1
--- drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 1071 ++++++++++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 895 +++++++++++++++ drivers/crypto/qat/qat_sym.h | 8 + drivers/crypto/qat/qat_sym_hw_dp.c | 8 - drivers/crypto/qat/qat_sym_refactor.c | 409 +++++++ drivers/crypto/qat/qat_sym_refactor.h | 402 +++++++ 6 files changed, 2785 insertions(+), 8 deletions(-) create mode 100644 drivers/crypto/qat/qat_sym_refactor.c create mode 100644 drivers/crypto/qat/qat_sym_refactor.h
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +1071 -0
@@ -8,14 +8,1082 @@#include <rte_cryptodev.h> #include "qat_crypto.h" #include "qat_sym_session.h" +#include "qat_sym.h" + +#define QAT_BASE_GEN1_SYM_CAPABILITIES \ + QAT_SYM_PLAIN_AUTH_CAP(SHA1, CAP_SET(block_size, 64), \ + CAP_RNG(digest_size, 1, 20, 1)), \ + QAT_SYM_AEAD_CAP(AES_GCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 0, 12, 12)), \ + QAT_SYM_AEAD_CAP(AES_CCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 2), \ + CAP_RNG(aad_size, 0, 224, 1), CAP_RNG(iv_size, 7, 13, 1)), \ + QAT_SYM_AUTH_CAP(AES_GMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 0, 12, 12)), \ + QAT_SYM_AUTH_CAP(AES_CMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA224, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA1_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 20, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA224_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(MD5_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 16, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(AES_XCBC_MAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 12, 12, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SNOW3G_UIA2, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(KASUMI_F9, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(digest_size), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(AES_CBC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(AES_CTR, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(AES_XTS, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 32, 64, 32), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(AES_DOCSISBPI, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 16), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(SNOW3G_UEA2, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(KASUMI_F8, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(3DES_CBC, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 8, 24, 8), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(3DES_CTR, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 16, 24, 8), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(DES_CBC, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 8, 24, 8), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(DES_DOCSISBPI, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 8, 8, 0), CAP_RNG(iv_size, 8, 8, 0)) + +#define QAT_BASE_GEN1_ASYM_CAPABILITIES \ + QAT_ASYM_CAP(MODEX, 0, 1, 512, 1), \ + QAT_ASYM_CAP(MODINV, 0, 1, 512, 1), \ + QAT_ASYM_CAP(RSA, \ + ((1 << RTE_CRYPTO_ASYM_OP_SIGN) | \ + (1 << RTE_CRYPTO_ASYM_OP_VERIFY) | \ + (1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) | \ + (1 << RTE_CRYPTO_ASYM_OP_DECRYPT)), \ + 64, 512, 64) + +#define QAT_EXTRA_GEN2_SYM_CAPABILITIES \ + QAT_SYM_CIPHER_CAP(ZUC_EEA3, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(ZUC_EIA3, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 16, 16, 0)) \ + +#define QAT_EXTRA_GEN3_SYM_CAPABILITIES \ + QAT_SYM_AEAD_CAP(CHACHA20_POLY1305, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 32, 32, 0), \ + CAP_RNG(digest_size, 16, 16, 0), \ + CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 12, 12, 0)) + +#define QAT_BASE_GEN4_SYM_CAPABILITIES \ + QAT_SYM_CIPHER_CAP(AES_CBC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(SHA1_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 20, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA224_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(AES_XCBC_MAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 12, 12, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(AES_CMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(AES_DOCSISBPI, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 16), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(digest_size), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_PLAIN_AUTH_CAP(SHA1, CAP_SET(block_size, 64), \ + CAP_RNG(digest_size, 1, 20, 1)), \ + QAT_SYM_AUTH_CAP(SHA224, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(AES_CTR, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AEAD_CAP(AES_GCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 0, 12, 12)), \ + QAT_SYM_AEAD_CAP(AES_CCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 2), \ + CAP_RNG(aad_size, 0, 224, 1), CAP_RNG(iv_size, 7, 13, 1)), \ + QAT_SYM_AUTH_CAP(AES_GMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 0, 12, 12)) \ + +#define QAT_SYM_DP_GET_MAX_ENQ (q, c, n) \ + RTE_MIN((q->max_inflights - q->enqueued + q->dequeued - c), n) + +#define QAT_SYM_DP_IS_RESP_SUCCESS (resp) \ + (ICP_QAT_FW_COMN_STATUS_FLAG_OK == \ + ICP_QAT_FW_COMN_RESP_CRYPTO_STAT_GET(resp->comn_hdr.comn_status)) + +static __rte_always_inline int +op_bpi_cipher_decrypt (uint8_t *src,uint8_t *dst, +uint8_t *iv,int ivlen,int srclen, +void *bpi_ctx) +{ +EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX *)bpi_ctx; +int encrypted_ivlen; +uint8_t encrypted_iv[BPI_MAX_ENCR_IV_LEN ]; +uint8_t *encr = encrypted_iv; + +/* ECB method: encrypt (not decrypt!) the IV, then XOR with plaintext */ +if (EVP_EncryptUpdate (ctx, encrypted_iv, &encrypted_ivlen, iv, ivlen) + <=0 ) + goto cipher_decrypt_err; + +for (; srclen !=0 ; --srclen, ++dst, ++src, ++encr) + *dst = *src ^ *encr; + +return 0 ; + +cipher_decrypt_err: +QAT_DP_LOG (ERR ,"libcrypto ECB cipher decrypt for BPI IV failed" ); +return -EINVAL ; +} + +static __rte_always_inline uint32_t +qat_bpicipher_preprocess (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +int block_len =qat_cipher_get_block_size (ctx->qat_cipher_alg); +struct rte_crypto_sym_op *sym_op = op->sym; +uint8_t last_block_len = block_len >0 ? + sym_op->cipher.data.length % block_len :0 ; + +if (last_block_len && ctx->qat_dir ==ICP_QAT_HW_CIPHER_DECRYPT ) { +/* Decrypt last block */ +uint8_t *last_block, *dst, *iv; +uint32_t last_block_offset = sym_op->cipher.data.offset + + sym_op->cipher.data.length - last_block_len; + last_block = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_src, + uint8_t *, last_block_offset); + +if (unlikely ((sym_op->m_dst !=NULL ) + && (sym_op->m_dst != sym_op->m_src))) +/* out-of-place operation (OOP) */ + dst = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_dst, + uint8_t *, last_block_offset); +else + dst = last_block; + +if (last_block_len < sym_op->cipher.data.length) +/* use previous block ciphertext as IV */ + iv = last_block - block_len; +else +/* runt block, i.e. less than one full block */ + iv = rte_crypto_op_ctod_offset(op, uint8_t *, + ctx->cipher_iv.offset); + +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src before pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst before pre-process:" , + dst, last_block_len); +#endif +op_bpi_cipher_decrypt (last_block, dst, iv, block_len, + last_block_len, ctx->bpi_ctx); +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src after pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst after pre-process:" , + dst, last_block_len); +#endif + } + +return sym_op->cipher.data.length - last_block_len; +} + +static __rte_always_inline int +qat_chk_len_in_bits_auth (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 ) { +if (unlikely ((op->sym->auth.data.offset %BYTE_LENGTH !=0 ) || + (op->sym->auth.data.length %BYTE_LENGTH !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int +qat_chk_len_in_bits_cipher (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_KASUMI || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ) { +if (unlikely ((op->sym->cipher.data.length %BYTE_LENGTH !=0 ) || + ((op->sym->cipher.data.offset % +BYTE_LENGTH ) !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int32_t +qat_sym_build_req_set_data (struct icp_qat_fw_la_bulk_req *req, +void *opaque,struct qat_sym_op_cookie *cookie, +struct rte_crypto_vec *src_vec,uint16_t n_src, +struct rte_crypto_vec *dst_vec,uint16_t n_dst) +{ +struct qat_sgl *list; +uint32_t i; +uint32_t tl_src =0 , total_len_src, total_len_dst; +uint64_t src_data_start =0 , dst_data_start =0 ; +int is_sgl = n_src >1 || n_dst >1 ; + +if (unlikely (n_src <1 || n_src >QAT_SYM_SGL_MAX_NUMBER || + n_dst >QAT_SYM_SGL_MAX_NUMBER )) +return -1 ; + +if (likely (!is_sgl)) { + src_data_start = src_vec[0 ].iova; + tl_src = total_len_src = + src_vec[0 ].len; +if (unlikely (n_dst)) {/* oop */ + total_len_dst = dst_vec[0 ].len; + + dst_data_start = dst_vec[0 ].iova; +if (unlikely (total_len_src != total_len_dst)) +return -EINVAL ; + }else { + dst_data_start = src_data_start; + total_len_dst = tl_src; + } + }else {/* sgl */ + total_len_dst = total_len_src =0 ; + +ICP_QAT_FW_COMN_PTR_TYPE_SET (req->comn_hdr.comn_req_flags, +QAT_COMN_PTR_TYPE_SGL ); + + list = (struct qat_sgl *)&cookie->qat_sgl_src; +for (i =0 ; i < n_src; i++) { + list->buffers[i].len = src_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = src_vec[i].iova; +if (tl_src + src_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -1 ; + } + tl_src += src_vec[i].len; + } + + list->num_bufs = i; + src_data_start = cookie->qat_sgl_src_phys_addr; + +if (unlikely (n_dst >0 )) {/* oop sgl */ +uint32_t tl_dst =0 ; + + list = (struct qat_sgl *)&cookie->qat_sgl_dst; + +for (i =0 ; i < n_dst; i++) { + list->buffers[i].len = dst_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = dst_vec[i].iova; +if (tl_dst + dst_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -ENOTSUP ; + } + + tl_dst += dst_vec[i].len; + } + +if (tl_src != tl_dst) +return -EINVAL ; + list->num_bufs = i; + dst_data_start = cookie->qat_sgl_dst_phys_addr; + }else + dst_data_start = src_data_start; + } + + req->comn_mid.src_data_addr = src_data_start; + req->comn_mid.dest_data_addr = dst_data_start; + req->comn_mid.src_length = total_len_src; + req->comn_mid.dst_length = total_len_dst; + req->comn_mid.opaque_data = (uintptr_t )opaque; + +return tl_src; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_cipher (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, + struct rte_crypto_va_iova_ptr *auth_iv_or_aad __rte_unused, + struct rte_crypto_va_iova_ptr *digest __rte_unused) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int n_src =0 ; +int ret; + + ret =qat_chk_len_in_bits_cipher (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->cipher.data.length >>3 ; + cipher_ofs = op->sym->cipher.data.offset >>3 ; +break ; +case 0 : +if (ctx->bpi_ctx) { +/* DOCSIS - only send complete blocks to device. +* Process any partial block using CFB mode. +* Even if 0 complete blocks, still send this to device +* to get into rx queue for post-process and dequeuing +*/ + cipher_len =qat_bpicipher_preprocess (ctx, op); + cipher_ofs = op->sym->cipher.data.offset; + }else { + cipher_len = op->sym->cipher.data.length; + cipher_ofs = op->sym->cipher.data.offset; + } +break ; +default : +QAT_DP_LOG (ERR , +"SNOW3G/KASUMI/ZUC in QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, + cipher_len, in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_auth (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, + struct rte_crypto_va_iova_ptr *cipher_iv __rte_unused, +struct rte_crypto_va_iova_ptr *auth_iv, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t auth_ofs =0 , auth_len =0 ; +int n_src, ret; + + ret =qat_chk_len_in_bits_auth (ctx, op); +switch (ret) { +case 1 : + auth_ofs = op->sym->auth.data.offset >>3 ; + auth_len = op->sym->auth.data.length >>3 ; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); +break ; +case 0 : +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_128 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_64 ) { +/* AES-GMAC */ + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + }else { + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va =NULL ; + auth_iv->iova =0 ; + } +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, auth_ofs, + auth_ofs + auth_len, in_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, auth_ofs, + auth_ofs + auth_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_chain (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +union rte_crypto_sym_ofs ofs; +uint32_t min_ofs =0 , max_len =0 ; +uint32_t cipher_len =0 , cipher_ofs =0 ; +uint32_t auth_len =0 , auth_ofs =0 ; +int is_oop = (op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src); +int is_sgl = op->sym->m_src->nb_segs >1 ; +int n_src; +int ret; + +if (unlikely (is_oop)) + is_sgl |= op->sym->m_dst->nb_segs >1 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv_or_aad->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + + ret =qat_chk_len_in_bits_cipher (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->aead.data.length >>3 ; + cipher_ofs = op->sym->aead.data.offset >>3 ; +break ; +case 0 : + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + ret =qat_chk_len_in_bits_auth (ctx, op); +switch (ret) { +case 1 : + auth_len = op->sym->auth.data.length >>3 ; + auth_ofs = op->sym->auth.data.offset >>3 ; +break ; +case 0 : + auth_len = op->sym->auth.data.length; + auth_ofs = op->sym->auth.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + min_ofs = cipher_ofs < auth_ofs ? cipher_ofs : auth_ofs; + max_len =RTE_MAX (cipher_ofs + cipher_len, auth_ofs + auth_len); + +/* digest in buffer check. Needed only for wireless algos */ +if (ret ==1 ) { +/* Handle digest-encrypted cases, i.e. +* auth-gen-then-cipher-encrypt and +* cipher-decrypt-then-auth-verify +*/ +uint64_t auth_end_iova; + +if (unlikely (is_sgl)) { +uint32_t remaining_off = auth_ofs + auth_len; +struct rte_mbuf *sgl_buf = (is_oop ? op->sym->m_dst : + op->sym->m_src); + +while (remaining_off >=rte_pktmbuf_data_len (sgl_buf) + && sgl_buf->next !=NULL ) { + remaining_off -=rte_pktmbuf_data_len (sgl_buf); + sgl_buf = sgl_buf->next; + } + + auth_end_iova = (uint64_t )rte_pktmbuf_iova_offset ( + sgl_buf, remaining_off); + }else + auth_end_iova = (is_oop ? +rte_pktmbuf_iova (op->sym->m_dst) : +rte_pktmbuf_iova (op->sym->m_src)) + auth_ofs + + auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_ofs + auth_len < cipher_ofs + cipher_len) && + (digest->iova == auth_end_iova)) + max_len =RTE_MAX (max_len, auth_ofs + auth_len + + ctx->digest_length); + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, min_ofs, max_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (unlikely (n_src <0 || n_src > op->sym->m_src->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + in_sgl->num = n_src; + +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, min_ofs, + max_len, out_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + ofs.ofs.cipher.head = cipher_ofs; + ofs.ofs.cipher.tail = max_len - cipher_ofs - cipher_len; + ofs.ofs.auth.head = auth_ofs; + ofs.ofs.auth.tail = max_len - auth_ofs - auth_len; + +return ofs.raw; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_aead (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int32_t n_src =0 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = (void *)op->sym->aead.aad.data; + auth_iv_or_aad->iova = op->sym->aead.aad.phys_addr; + digest->va = (void *)op->sym->aead.digest.data; + digest->iova = op->sym->aead.digest.phys_addr; + + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, cipher_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline void +qat_set_cipher_iv (struct icp_qat_fw_la_cipher_req_params *cipher_param, +struct rte_crypto_va_iova_ptr *iv_ptr,uint32_t iv_len, +struct icp_qat_fw_la_bulk_req *qat_req) +{ +/* copy IV into request if it fits */ +if (iv_len <=sizeof (cipher_param->u.cipher_IV_array)) +rte_memcpy (cipher_param->u.cipher_IV_array, iv_ptr->va, + iv_len); +else { +ICP_QAT_FW_LA_CIPH_IV_FLD_FLAG_SET ( + qat_req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_CIPH_IV_64BIT_PTR ); + cipher_param->u.s.cipher_IV_ptr = iv_ptr->iova; + } +} + +static __rte_always_inline void +qat_sym_dp_fill_vec_status (int32_t *sta,int status,uint32_t n) +{ +uint32_t i; + +for (i =0 ; i < n; i++) + sta[i] = status; +} + +static __rte_always_inline void +enqueue_one_cipher_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + +/* cipher IV */ +qat_set_cipher_iv (cipher_param, iv, ctx->cipher_iv.length, req); + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; +} + +static __rte_always_inline void +enqueue_one_auth_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = data_len - ofs.ofs.auth.head - + ofs.ofs.auth.tail; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, auth_iv->va, + ctx->auth_iv.length); +break ; +default : +break ; + } +} + +static __rte_always_inline int +enqueue_one_chain_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_vec *src_vec, +uint16_t n_src_vecs, +struct rte_crypto_vec *dst_vec, +uint16_t n_dst_vecs, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; +struct rte_crypto_vec *cvec = n_dst_vecs >0 ? + dst_vec : src_vec; +rte_iova_t auth_iova_end; +int cipher_len, auth_len; +int is_sgl = n_src_vecs >1 || n_dst_vecs >1 ; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + cipher_len = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_len = data_len - ofs.ofs.auth.head - ofs.ofs.auth.tail; + +if (unlikely (cipher_len <0 || auth_len <0 )) +return -1 ; + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = cipher_len; +qat_set_cipher_iv (cipher_param, cipher_iv, ctx->cipher_iv.length, req); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = auth_len; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +break ; +default : +break ; + } + +if (unlikely (is_sgl)) { +/* sgl */ +int i = n_dst_vecs ? n_dst_vecs : n_src_vecs; +uint32_t remaining_off = data_len - ofs.ofs.auth.tail; + +while (remaining_off >= cvec->len && i >=1 ) { + i--; + remaining_off -= cvec->len; + cvec++; + } + + auth_iova_end = cvec->iova + remaining_off; + }else + auth_iova_end = cvec[0 ].iova + auth_param->auth_off + + auth_param->auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_param->auth_off + auth_param->auth_len < + cipher_param->cipher_offset + cipher_param->cipher_length) && + (digest->iova == auth_iova_end)) { +/* Handle partial digest encryption */ +if (cipher_param->cipher_offset + cipher_param->cipher_length < + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length && !is_sgl) + req->comn_mid.dst_length = req->comn_mid.src_length = + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length; +struct icp_qat_fw_comn_req_hdr *header = &req->comn_hdr; +ICP_QAT_FW_LA_DIGEST_IN_BUFFER_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_DIGEST_IN_BUFFER ); + } + +return 0 ; +} + +static __rte_always_inline void +enqueue_one_aead_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param = + (void *)&req->serv_specif_rqpars; +struct icp_qat_fw_la_auth_req_params *auth_param = + (void *)((uint8_t *)&req->serv_specif_rqpars + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); +uint8_t *aad_data; +uint8_t aad_ccm_real_len; +uint8_t aad_len_field_sz; +uint32_t msg_len_be; +rte_iova_t aad_iova =0 ; +uint8_t q; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, iv->va, + ctx->cipher_iv.length); + aad_iova = aad->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_AES_CBC_MAC : + aad_data = aad->va; + aad_iova = aad->iova; + aad_ccm_real_len =0 ; + aad_len_field_sz =0 ; + msg_len_be =rte_bswap32 ((uint32_t )data_len - + ofs.ofs.cipher.head); + +if (ctx->aad_len >ICP_QAT_HW_CCM_AAD_DATA_OFFSET ) { + aad_len_field_sz =ICP_QAT_HW_CCM_AAD_LEN_INFO ; + aad_ccm_real_len = ctx->aad_len - +ICP_QAT_HW_CCM_AAD_B0_LEN - +ICP_QAT_HW_CCM_AAD_LEN_INFO ; + }else { + aad_data = iv->va; + aad_iova = iv->iova; + } + + q =ICP_QAT_HW_CCM_NQ_CONST - ctx->cipher_iv.length; + aad_data[0 ] =ICP_QAT_HW_CCM_BUILD_B0_FLAGS ( + aad_len_field_sz, ctx->digest_length, q); +if (q >ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ) { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET + (q - +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ), + (uint8_t *)&msg_len_be, +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ); + }else { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)&msg_len_be + + (ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE + - q), q); + } + +if (aad_len_field_sz >0 ) { + *(uint16_t *)&aad_data[ICP_QAT_HW_CCM_AAD_B0_LEN ] = +rte_bswap16 (aad_ccm_real_len); + +if ((aad_ccm_real_len + aad_len_field_sz) + %ICP_QAT_HW_CCM_AAD_B0_LEN ) { +uint8_t pad_len =0 ; +uint8_t pad_idx =0 ; + + pad_len =ICP_QAT_HW_CCM_AAD_B0_LEN - + ((aad_ccm_real_len + + aad_len_field_sz) % +ICP_QAT_HW_CCM_AAD_B0_LEN ); + pad_idx =ICP_QAT_HW_CCM_AAD_B0_LEN + + aad_ccm_real_len + + aad_len_field_sz; +memset (&aad_data[pad_idx],0 , pad_len); + } + } + +rte_memcpy (((uint8_t *)cipher_param->u.cipher_IV_array) + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , ctx->cipher_iv.length); + *(uint8_t *)&cipher_param->u.cipher_IV_array[0 ] = + q -ICP_QAT_HW_CCM_NONCE_OFFSET ; + +rte_memcpy ((uint8_t *)aad->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va +ICP_QAT_HW_CCM_NONCE_OFFSET , + ctx->cipher_iv.length); +break ; +default : +break ; + } + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_param->auth_off = ofs.ofs.cipher.head; + auth_param->auth_len = cipher_param->cipher_length; + auth_param->auth_res_addr = digest->iova; + auth_param->u1.aad_adr = aad_iova; +}extern struct rte_cryptodev_ops qat_sym_crypto_ops_gen1;extern struct rte_cryptodev_ops qat_asym_crypto_ops_gen1; +/* -----------------GEN 1 sym crypto op data path APIs ---------------- */ +int +qat_sym_build_op_cipher_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_auth_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_aead_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_chain_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +/* -----------------GEN 1 sym crypto raw data path APIs ---------------- */ +int +qat_sym_dp_enqueue_single_cipher_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, +struct rte_crypto_va_iova_ptr *iv, + struct rte_crypto_va_iova_ptr *digest __rte_unused, + struct rte_crypto_va_iova_ptr *aad __rte_unused, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_cipher_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +int +qat_sym_dp_enqueue_single_auth_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, + struct rte_crypto_va_iova_ptr *iv __rte_unused, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_auth_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +int +qat_sym_dp_enqueue_single_chain_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_chain_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +int +qat_sym_dp_enqueue_single_aead_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_aead_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +void * +qat_sym_dp_dequeue_single_gen1 (void *qp_data,uint8_t *drv_ctx, +int *dequeue_status,enum rte_crypto_op_status *op_status); + +uint32_t +qat_sym_dp_dequeue_burst_gen1 (void *qp_data,uint8_t *drv_ctx, +rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count, +uint32_t max_nb_to_dequeue, +rte_cryptodev_raw_post_dequeue_t post_dequeue, +void **out_user_data,uint8_t is_user_data_array, +uint32_t *n_success_jobs,int *return_status); + +int +qat_sym_dp_enqueue_done_gen1 (void *qp_data,uint8_t *drv_ctx,uint32_t n); + +int +qat_sym_dp_denqueue_done_gen1 (void *qp_data,uint8_t *drv_ctx,uint32_t n); + +int +qat_sym_configure_raw_dp_ctx_gen1 (void *_raw_dp_ctx,void *_ctx); +/* -----------------GENx control path APIs ---------------- */ uint64_t qat_sym_crypto_feature_flags_get_gen1 (struct qat_pci_device *qat_dev); +int +qat_sym_crypto_set_session_gen1 (void *cryptodev,void *session); +void qat_sym_session_set_ext_hash_flags_gen2 (struct qat_sym_session *session,uint8_t hash_flag);
@@ -23,6 +1091,9 @@ qat_sym_session_set_ext_hash_flags_gen2(struct qat_sym_session *session,struct qat_capabilities_info qat_asym_crypto_cap_get_gen1 (struct qat_pci_device *qat_dev); +int +qat_asym_crypto_set_session_gen1 (void *cryptodev,void *session); +uint64_t qat_asym_crypto_feature_flags_get_gen1 (struct qat_pci_device *qat_dev);
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +895 -0
901 lines not on this page · raw message
drivers/crypto/qat/qat_sym.h +8 -0
@@ -54,6 +54,14 @@ struct qat_sym_op_cookie { } opt; }; +struct qat_sym_dp_ctx { +struct qat_sym_session *session; +uint32_t tail; +uint32_t head; +uint16_t cached_enqueue; +uint16_t cached_dequeue; +}; + static __rte_always_inline int refactor_qat_sym_process_response(__rte_unused void **op, __rte_unused uint8_t *resp, __rte_unused void *op_cookie,
drivers/crypto/qat/qat_sym_hw_dp.c +0 -8
@@ -13,14 +13,6 @@#include "qat_sym_session.h" #include "qat_qp.h" -struct qat_sym_dp_ctx { -struct qat_sym_session *session; -uint32_t tail; -uint32_t head; -uint16_t cached_enqueue; -uint16_t cached_dequeue; -}; - static __rte_always_inline int32_tqat_sym_dp_parse_data_vec (struct qat_qp *qp,struct icp_qat_fw_la_bulk_req *req,struct rte_crypto_vec *data,uint16_t n_data_vecs)
drivers/crypto/qat/qat_sym_refactor.c new file +409 -0
409 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.h new file +402 -0
402 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v2 3/7 crypto/qat: qat driver asym op refactor
In reply to Kai JiThis patch add-in refactored qat asymmetric build request function implementation (qat_asym_refactor.c & qat_asym_refactor.h)
--- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 7 + drivers/crypto/qat/qat_asym_refactor.c | 994 +++++++++++++++++++++ drivers/crypto/qat/qat_asym_refactor.h | 125 +++ 3 files changed, 1126 insertions(+) create mode 100644 drivers/crypto/qat/qat_asym_refactor.c create mode 100644 drivers/crypto/qat/qat_asym_refactor.h
drivers/crypto/qat/dev/qat_asym_pmd_gen1.c +7 -0
@@ -65,6 +65,13 @@ qat_asym_crypto_feature_flags_get_gen1(return feature_flags; } +int +qat_asym_crypto_set_session_gen1(void *cdev __rte_unused, + void *session __rte_unused) +{ +return 0 ; +} +RTE_INIT (qat_asym_crypto_gen1_init) { qat_asym_gen_dev_ops[QAT_GEN1].cryptodev_ops =
drivers/crypto/qat/qat_asym_refactor.c new file +994 -0
994 lines not on this page · raw message
drivers/crypto/qat/qat_asym_refactor.h new file +125 -0
125 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v2 4/7 crypto/qat: qat driver session method rework
In reply to Kai JiThe patch introduce set_session & set_raw_dp_ctx methods to qat gen dev ops Replace min_qat_dev_gen_id with dev_id, the session will be invalid if the device generation id is not matching during init and ops
--- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 90 ++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 467 +++++++++++++++++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 243 ++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 5 + drivers/crypto/qat/qat_crypto.c | 1 + drivers/crypto/qat/qat_crypto.h | 9 + drivers/crypto/qat/qat_sym.c | 8 +- drivers/crypto/qat/qat_sym_session.c | 106 +---- drivers/crypto/qat/qat_sym_session.h | 2 +- 9 files changed, 831 insertions(+), 100 deletions(-)
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +90 -0
@@ -166,6 +166,90 @@ qat_sym_crypto_qp_setup_gen2(struct rte_cryptodev *dev, uint16_t qp_id,return 0 ; } +void +qat_sym_session_set_ext_hash_flags_gen2 (struct qat_sym_session *session, +uint8_t hash_flag) +{ +struct icp_qat_fw_comn_req_hdr *header = &session->fw_req.comn_hdr; +struct icp_qat_fw_cipher_auth_cd_ctrl_hdr *cd_ctrl = + (struct icp_qat_fw_cipher_auth_cd_ctrl_hdr *) + session->fw_req.cd_ctrl.content_desc_ctrl_lw; + +/* Set the Use Extended Protocol Flags bit in LW 1 */ +QAT_FIELD_SET (header->comn_req_flags, +QAT_COMN_EXT_FLAGS_USED , +QAT_COMN_EXT_FLAGS_BITPOS , +QAT_COMN_EXT_FLAGS_MASK ); + +/* Set Hash Flags in LW 28 */ + cd_ctrl->hash_flags |= hash_flag; + +/* Set proto flags in LW 1 */ +switch (session->qat_cipher_alg) { +case ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_SNOW_3G_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags,0 ); +break ; +case ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_NO_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags, +ICP_QAT_FW_LA_ZUC_3G_PROTO ); +break ; +default : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_NO_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags,0 ); +break ; + } +} + +static int +qat_sym_crypto_set_session_gen2 (void *cdev,void *session) +{ +struct rte_cryptodev *dev = cdev; +struct qat_sym_session *ctx = session; +const struct qat_cryptodev_private *qat_private = + dev->data->dev_private; +int ret; + + ret =qat_sym_crypto_set_session_gen1 (cdev, session); +if (ret ==0 || ret != -ENOTSUP ) +return ret; + +/* GEN1 returning -ENOTSUP as it cannot handle some mixed algo, +* but some are not supported by GEN2, so checking here +*/ +if ((qat_private->internal_capabilities & +QAT_SYM_CAP_MIXED_CRYPTO ) ==0 ) +return -ENOTSUP ; + +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 && + ctx->qat_cipher_alg != +ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx, +1 <<ICP_QAT_FW_AUTH_HDR_FLAG_ZUC_EIA3_BITPOS ); + }else if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 && + ctx->qat_cipher_alg != +ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 ) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx, +1 <<ICP_QAT_FW_AUTH_HDR_FLAG_SNOW3G_UIA2_BITPOS ); + }else if ((ctx->aes_cmac || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_NULL ) && + (ctx->qat_cipher_alg == +ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 || + ctx->qat_cipher_alg == +ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 )) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx,0 ); + } + +return 0 ; +} +struct rte_cryptodev_ops qat_sym_crypto_ops_gen2 = {/* Device related operations */
@@ -204,6 +288,10 @@ RTE_INIT(qat_sym_crypto_gen2_init) qat_sym_gen_dev_ops[QAT_GEN2 ].cryptodev_ops = &qat_sym_crypto_ops_gen2; qat_sym_gen_dev_ops[QAT_GEN2 ].get_capabilities = qat_sym_crypto_cap_get_gen2; + qat_sym_gen_dev_ops[QAT_GEN2 ].set_session = + qat_sym_crypto_set_session_gen2; + qat_sym_gen_dev_ops[QAT_GEN2 ].set_raw_dp_ctx = + qat_sym_configure_raw_dp_ctx_gen1; qat_sym_gen_dev_ops[QAT_GEN2 ].get_feature_flags = qat_sym_crypto_feature_flags_get_gen1;
@@ -221,4 +309,6 @@ RTE_INIT(qat_asym_crypto_gen2_init) qat_asym_crypto_cap_get_gen1; qat_asym_gen_dev_ops[QAT_GEN2 ].get_feature_flags = qat_asym_crypto_feature_flags_get_gen1; + qat_asym_gen_dev_ops[QAT_GEN2 ].set_session = + qat_asym_crypto_set_session_gen1; }
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +467 -0
483 lines not on this page · raw message
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +243 -0
258 lines not on this page · raw message
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +5 -0
@@ -6,6 +6,7 @@#ifdef RTE_LIB_SECURITY #include <rte_security_driver.h> #endif +#include <cryptodev_pmd.h> #include "adf_transport_access_macros.h" #include "icp_qat_fw.h"
@@ -1169,6 +1170,10 @@ RTE_INIT(qat_sym_crypto_gen1_init) qat_sym_gen_dev_ops[QAT_GEN1 ].cryptodev_ops = &qat_sym_crypto_ops_gen1; qat_sym_gen_dev_ops[QAT_GEN1 ].get_capabilities = qat_sym_crypto_cap_get_gen1; + qat_sym_gen_dev_ops[QAT_GEN1 ].set_session = + qat_sym_crypto_set_session_gen1; + qat_sym_gen_dev_ops[QAT_GEN1 ].set_raw_dp_ctx = + qat_sym_configure_raw_dp_ctx_gen1; qat_sym_gen_dev_ops[QAT_GEN1 ].get_feature_flags = qat_sym_crypto_feature_flags_get_gen1;#ifdef RTE_LIB_SECURITY
drivers/crypto/qat/qat_crypto.c +1 -0
@@ -2,6 +2,7 @@* Copyright(c) 2021 Intel Corporation */ +#include <cryptodev_pmd.h> #include "qat_device.h" #include "qat_qp.h" #include "qat_crypto.h"
drivers/crypto/qat/qat_crypto.h +9 -0
@@ -48,15 +48,24 @@ typedef uint64_t (*get_feature_flags_t)(struct qat_pci_device *qat_dev);typedef void * (*create_security_ctx_t )(void *cryptodev); +typedef int (*set_session_t )(void *cryptodev,void *session); + +typedef int (*set_raw_dp_ctx_t )(void *raw_dp_ctx,void *ctx); +struct qat_crypto_gen_dev_ops {get_feature_flags_t get_feature_flags;get_capabilities_info_t get_capabilities;struct rte_cryptodev_ops *cryptodev_ops; +set_session_t set_session; +set_raw_dp_ctx_t set_raw_dp_ctx;#ifdef RTE_LIB_SECURITY create_security_ctx_t create_security_ctx;#endif }; +extern struct qat_crypto_gen_dev_ops qat_sym_gen_dev_ops[]; +extern struct qat_crypto_gen_dev_ops qat_asym_gen_dev_ops[]; +int qat_cryptodev_config (struct rte_cryptodev *dev,struct rte_cryptodev_config *config);
drivers/crypto/qat/qat_sym.c +1 -7
@@ -249,7 +249,7 @@ refactor_qat_sym_dequeue_burst(void *qp, struct rte_crypto_op **ops,int qat_sym_build_request (void *in_op,uint8_t *out_msg, -void *op_cookie,enum qat_device_gen qat_dev_gen) + void *op_cookie, __rte_unused enum qat_device_gen qat_dev_gen) {int ret =0 ;struct qat_sym_session *ctx =NULL ;
@@ -314,12 +314,6 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg,return -EINVAL ; } -if (unlikely (ctx->min_qat_dev_gen > qat_dev_gen)) { -QAT_DP_LOG (ERR ,"Session alg not supported on this device gen" ); - op->status =RTE_CRYPTO_OP_STATUS_INVALID_SESSION ; -return -EINVAL ; - } - qat_req = (struct icp_qat_fw_la_bulk_req *)out_msg;rte_mov128 ((uint8_t *)qat_req, (const uint8_t *)&(ctx->fw_req)); qat_req->comn_mid.opaque_data = (uint64_t )(uintptr_t )op;
drivers/crypto/qat/qat_sym_session.c +14 -92
186 lines not on this page · raw message
drivers/crypto/qat/qat_sym_session.h +1 -1
@@ -100,7 +100,7 @@ struct qat_sym_session {uint16_t auth_key_length;uint16_t digest_length;rte_spinlock_t lock;/* protects this struct */ -enum qat_device_gen min_qat_dev_gen; +uint16_t dev_id;uint8_t aes_cmac;uint8_t is_single_pass;uint8_t is_single_pass_gmac;
Signature · 1 line
2.17.1
PATCH v2 5/7 crypto/qat: qat driver datapath rework
In reply to Kai JiThis patch introduce op_build_request func in qat enqueue op burst. Add-in qat_dequeue_process_response in qat dequeue op burst. Enable session build request op based on crypto operation
--- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_qp.c | 60 +++++--------------- drivers/common/qat/qat_qp.h | 32 +++++++---- drivers/compress/qat/qat_comp_pmd.c | 12 +++- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 4 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 4 +- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 2 +- drivers/crypto/qat/qat_asym_refactor.c | 4 +- drivers/crypto/qat/qat_asym_refactor.h | 2 +- drivers/crypto/qat/qat_sym_hw_dp.c | 2 +- drivers/crypto/qat/qat_sym_refactor.c | 51 +---------------- drivers/crypto/qat/qat_sym_refactor.h | 2 +- 12 files changed, 57 insertions(+), 122 deletions(-)
drivers/common/qat/meson.build +2 -2
@@ -70,8 +70,8 @@ if qat_compress endif if qat_crypto - foreach f: ['qat_sym_pmd.c', 'qat_sym.c', 'qat_sym_session.c', - 'qat_sym_hw_dp.c', 'qat_asym_pmd.c', 'qat_asym.c', 'qat_crypto.c', + foreach f: ['qat_sym_refactor.c', 'qat_sym_session.c', + 'qat_sym_hw_dp.c', 'qat_asym_refactor.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c', 'dev/qat_crypto_pmd_gen2.c',
drivers/common/qat/qat_qp.c +13 -47
99 lines not on this page · raw message
drivers/common/qat/qat_qp.h +22 -10
@@ -14,6 +14,24 @@struct qat_pci_device ; +/* Default qp configuration for GEN4 devices */ +#define QAT_GEN4_QP_DEFCON (QAT_SERVICE_SYMMETRIC | \ + QAT_SERVICE_SYMMETRIC << 8 | \ + QAT_SERVICE_SYMMETRIC << 16 | \ + QAT_SERVICE_SYMMETRIC << 24) + +/* QAT GEN 4 specific macros */ +#define QAT_GEN4_BUNDLE_NUM 4 +#define QAT_GEN4_QPS_PER_BUNDLE_NUM 1 + +/* Queue pair setup error codes */ +#define QAT_NOMEM 1 +#define QAT_QP_INVALID_DESC_NO 2 +#define QAT_QP_BUSY 3 +#define QAT_PCI_NO_RESOURCE 4 + +#define ADF_ARB_RINGSRVARBEN_OFFSET 0x19C +/** * Structure associated with each queue. */
@@ -124,21 +142,15 @@ struct qat_qp_config { };uint16_t -refactor_qat_enqueue_op_burst (void *qp,qat_op_build_request_t op_build_request, +qat_enqueue_op_burst (void *qp,qat_op_build_request_t op_build_request,void **ops,uint16_t nb_ops); -uint16_t -refactor_qat_dequeue_op_burst (void *qp,void **ops, -qat_op_dequeue_t qat_dequeue_process_response,uint16_t nb_ops); - -uint16_t -qat_enqueue_op_burst (void *qp,void **ops,uint16_t nb_ops); -uint16_t qat_enqueue_comp_op_burst (void *qp,void **ops,uint16_t nb_ops);uint16_t -qat_dequeue_op_burst (void *qp,void **ops,uint16_t nb_ops); +qat_dequeue_op_burst (void *qp,void **ops, +qat_op_dequeue_t qat_dequeue_process_response,uint16_t nb_ops);int qat_qp_release (enum qat_device_gen qat_dev_gen,struct qat_qp **qp_addr);
@@ -150,7 +162,7 @@ qat_qp_setup(struct qat_pci_device *qat_dev,int qat_qps_per_service (struct qat_pci_device *qat_dev, -enum qat_service_type service); +enum qat_service_type service);const struct qat_qp_hw_data * qat_qp_get_hw_data(struct qat_pci_device *qat_dev,
drivers/compress/qat/qat_comp_pmd.c +9 -3
@@ -616,11 +616,18 @@ static struct rte_compressdev_ops compress_qat_dummy_ops = { .private_xform_free = qat_comp_private_xform_free }; +static uint16_t +qat_comp_dequeue_burst (void *qp,struct rte_comp_op **ops,uint16_t nb_ops) +{ +return qat_dequeue_op_burst (qp, (void **)ops, qat_comp_process_response, + nb_ops); +} +static uint16_t qat_comp_pmd_dequeue_first_op_burst (void *qp,struct rte_comp_op **ops,uint16_t nb_ops) { -uint16_t ret =qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +uint16_t ret =qat_comp_dequeue_burst (qp, ops, nb_ops);struct qat_qp *tmp_qp = (struct qat_qp *)qp;if (ret) {
@@ -638,8 +645,7 @@ qat_comp_pmd_dequeue_first_op_burst(void *qp, struct rte_comp_op **ops, }else { tmp_qp->qat_dev->comp_dev->compressdev->dequeue_burst = - (compressdev_dequeue_pkt_burst_t ) - qat_dequeue_op_burst; + qat_comp_dequeue_burst; } }return ret;
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym.h" -#include "qat_asym.h" +#include "qat_sym_refactor.h" +#include "qat_asym_refactor.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym.h" -#include "qat_asym.h" +#include "qat_sym_refactor.h" +#include "qat_asym_refactor.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +1 -1
@@ -13,7 +13,7 @@#include "icp_qat_fw_la.h" #include "qat_sym_session.h" -#include "qat_sym.h" +#include "qat_sym_refactor.h" #include "qat_sym_session.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/qat_asym_refactor.c +2 -2
@@ -5,7 +5,7 @@#include <stdarg.h> -#include <rte_cryptodev_pmd.h> +#include <cryptodev_pmd.h> #include "icp_qat_fw_pke.h" #include "icp_qat_fw.h"
@@ -14,7 +14,7 @@#include "qat_device.h" #include "qat_logs.h" -#include "qat_asym.h" +#include "qat_asym_refactor.h" uint8_t qat_asym_driver_id;
drivers/crypto/qat/qat_asym_refactor.h +1 -1
@@ -5,7 +5,7 @@#ifndef _QAT_ASYM_H_#define _QAT_ASYM_H_ -#include <rte_cryptodev_pmd.h> +#include <cryptodev_pmd.h> #include <rte_crypto_asym.h> #include "icp_qat_fw_pke.h" #include "qat_device.h"
drivers/crypto/qat/qat_sym_hw_dp.c +1 -1
@@ -8,7 +8,7 @@#include "icp_qat_fw.h" #include "icp_qat_fw_la.h" -#include "qat_sym.h" +#include "qat_sym_refactor.h" #include "qat_sym_pmd.h" #include "qat_sym_session.h" #include "qat_qp.h"
drivers/crypto/qat/qat_sym_refactor.c +1 -50
63 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.h +1 -1
@@ -5,7 +5,7 @@#ifndef _QAT_SYM_H_#define _QAT_SYM_H_ -#include <rte_cryptodev_pmd.h> +#include <cryptodev_pmd.h> #ifdef RTE_LIB_SECURITY #include <rte_net_crc.h> #endif
Signature · 1 line
2.17.1
PATCH v2 6/7 app/test: cryptodev test fix
In reply to Kai Jitest_mixed_auth_cipher: ensure enough space allocate in ibuf & obuf for mbuf to vec conversiontest_kasumi_decryption: cipher length update.
qat/dev: support sgl oop operation
--- app/test/test_cryptodev.c | 58 ++++++++++++++++---- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 28 ++++++++-- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 14 ++++- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 55 ++++++++++++++++--- 4 files changed, 129 insertions(+), 26 deletions(-)
app/test/test_cryptodev.c +46 -12
@@ -179,6 +179,10 @@ post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,RTE_CRYPTO_OP_STATUS_ERROR ; } +static struct crypto_testsuite_params testsuite_params = {NULL }; +struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; +static struct crypto_unittest_params unittest_params; + void process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
@@ -193,6 +197,7 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,struct rte_crypto_sgl sgl, dest_sgl;uint32_t max_len;union rte_cryptodev_session_ctx sess; +uint64_t auth_end_iova;uint32_t count =0 ;struct rte_crypto_raw_dp_ctx *ctx; uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
@@ -202,6 +207,9 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,int ctx_service_size;int32_t status =0 ;int enqueue_status, dequeue_status; +struct crypto_unittest_params *ut_params = &unittest_params; +int is_sgl = sop->m_src->nb_segs >1 ; +int is_oop =0 ; ctx_service_size =rte_cryptodev_get_raw_dp_ctx_size (dev_id);if (ctx_service_size <0 ) {
@@ -240,6 +248,9 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, ofs.raw =0 ; +if ((sop->m_dst !=NULL ) && (sop->m_dst != sop->m_src)) + is_oop =1 ; +if (is_cipher && is_auth) { cipher_offset = sop->cipher.data.offset; cipher_len = sop->cipher.data.length;
@@ -267,6 +278,31 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, digest.va = (void *)sop->auth.digest.data; digest.iova = sop->auth.digest.phys_addr; +if (is_sgl) { +uint32_t remaining_off = auth_offset + auth_len; +struct rte_mbuf *sgl_buf = sop->m_src; +if (is_oop) + sgl_buf = sop->m_dst; + +while (remaining_off >=rte_pktmbuf_data_len (sgl_buf) + && sgl_buf->next !=NULL ) { + remaining_off -=rte_pktmbuf_data_len (sgl_buf); + sgl_buf = sgl_buf->next; + } + + auth_end_iova = (uint64_t )rte_pktmbuf_iova_offset ( + sgl_buf, remaining_off); + }else { + auth_end_iova =rte_pktmbuf_iova (op->sym->m_src) + + auth_offset + auth_len; + } +/* Then check if digest-encrypted conditions are met */ +if ((auth_offset + auth_len < cipher_offset + cipher_len) && + (digest.iova == auth_end_iova) && is_sgl) + max_len =RTE_MAX (max_len, + auth_offset + auth_len + + ut_params->auth_xform.auth.digest_length); + }else if (is_cipher) { cipher_offset = sop->cipher.data.offset; cipher_len = sop->cipher.data.length;
@@ -327,7 +363,7 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, sgl.num = n;/* Out of place */ -if (sop->m_dst !=NULL ) { +if (is_oop) { dest_sgl.vec = dest_data_vec; vec.dest_sgl = &dest_sgl; n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
@@ -503,10 +539,6 @@ process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)return op; } -static struct crypto_testsuite_params testsuite_params = {NULL }; -struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; -static struct crypto_unittest_params unittest_params; -static int testsuite_setup (void ) {
@@ -4077,9 +4109,9 @@ test_kasumi_decryption(const struct kasumi_test_data *tdata)/* Create KASUMI operation */ retval =create_wireless_algo_cipher_operation (tdata->cipher_iv.data, - tdata->cipher_iv.len, - tdata->ciphertext.len, - tdata->validCipherOffsetInBits.len); + tdata->cipher_iv.len, +RTE_ALIGN_CEIL (tdata->validCipherLenInBits.len,8 ), + tdata->validCipherOffsetInBits.len);if (retval <0 )return retval;
@@ -7310,6 +7342,7 @@ test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,unsigned int plaintext_len;unsigned int ciphertext_pad_len;unsigned int ciphertext_len; +unsigned int data_len;struct rte_cryptodev_info dev_info;struct rte_crypto_op *op;
@@ -7370,21 +7403,22 @@ test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata, plaintext_len =ceil_byte_length (tdata->plaintext.len_bits); ciphertext_pad_len =RTE_ALIGN_CEIL (ciphertext_len,16 ); plaintext_pad_len =RTE_ALIGN_CEIL (plaintext_len,16 ); + data_len =RTE_MAX (ciphertext_pad_len, plaintext_pad_len);if (verify) { ciphertext = (uint8_t *)rte_pktmbuf_append (ut_params->ibuf, - ciphertext_pad_len); + data_len);memcpy (ciphertext, tdata->ciphertext.data, ciphertext_len);if (op_mode ==OUT_OF_PLACE ) -rte_pktmbuf_append (ut_params->obuf, ciphertext_pad_len); +rte_pktmbuf_append (ut_params->obuf, data_len);debug_hexdump (stdout,"ciphertext:" , ciphertext, ciphertext_len); }else { plaintext = (uint8_t *)rte_pktmbuf_append (ut_params->ibuf, - plaintext_pad_len); + data_len);memcpy (plaintext, tdata->plaintext.data, plaintext_len);if (op_mode ==OUT_OF_PLACE ) -rte_pktmbuf_append (ut_params->obuf, plaintext_pad_len); +rte_pktmbuf_append (ut_params->obuf, data_len);debug_hexdump (stdout,"plaintext:" , plaintext, plaintext_len); }
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +24 -4
@@ -467,8 +467,18 @@ qat_sym_dp_enqueue_aead_jobs_gen3(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ;
@@ -564,8 +574,18 @@ qat_sym_dp_enqueue_auth_jobs_gen3(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ; enqueue_one_auth_job_gen3(ctx, cookie, req, &vec->digest[i],
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +12 -2
@@ -295,8 +295,18 @@ qat_sym_dp_enqueue_aead_jobs_gen4(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ;
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +47 -8
80 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v2 7/7 crypto/qat: qat driver rework clean up
In reply to Kai JiThis patch rename back refactor code to qat_sym.c and qat_asym.c, meson build file also updated accordingly.
Integrate qat hw dp apis and qat pmd function to qat_sym.c and qat_asym.c
--- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_device.c | 2 +- drivers/common/qat/qat_qp.c | 4 +- drivers/common/qat/qat_qp.h | 2 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 4 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 4 +- drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 164 +-- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 2 +- drivers/crypto/qat/qat_asym.c | 811 ++++++++------ drivers/crypto/qat/qat_asym.h | 90 +- drivers/crypto/qat/qat_asym_pmd.c | 231 ---- drivers/crypto/qat/qat_asym_pmd.h | 54 - drivers/crypto/qat/qat_asym_refactor.c | 994 ----------------- drivers/crypto/qat/qat_asym_refactor.h | 125 --- drivers/crypto/qat/qat_crypto.h | 5 +- drivers/crypto/qat/qat_sym.c | 1009 ++++++------------ drivers/crypto/qat/qat_sym.h | 141 ++- drivers/crypto/qat/qat_sym_hw_dp.c | 975 ----------------- drivers/crypto/qat/qat_sym_pmd.c | 251 ----- drivers/crypto/qat/qat_sym_pmd.h | 95 -- drivers/crypto/qat/qat_sym_refactor.c | 360 ------- drivers/crypto/qat/qat_sym_refactor.h | 402 ------- drivers/crypto/qat/qat_sym_session.c | 8 +- 23 files changed, 997 insertions(+), 4740 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h delete mode 100644 drivers/crypto/qat/qat_asym_refactor.c delete mode 100644 drivers/crypto/qat/qat_asym_refactor.h delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h delete mode 100644 drivers/crypto/qat/qat_sym_refactor.c delete mode 100644 drivers/crypto/qat/qat_sym_refactor.h
drivers/common/qat/meson.build +2 -2
@@ -70,8 +70,8 @@ if qat_compress endif if qat_crypto - foreach f: ['qat_sym_refactor.c', 'qat_sym_session.c', - 'qat_sym_hw_dp.c', 'qat_asym_refactor.c', 'qat_crypto.c', + foreach f: ['qat_sym.c', 'qat_sym_session.c', + 'qat_asym.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c', 'dev/qat_crypto_pmd_gen2.c',
drivers/common/qat/qat_device.c +1 -1
@@ -8,7 +8,7 @@#include "qat_device.h" #include "adf_transport_access_macros.h" -#include "qat_sym_pmd.h" +#include "qat_sym.h" #include "qat_comp_pmd.h" #include "adf_pf2vf_msg.h" #include "qat_pf2vf.h"
drivers/common/qat/qat_qp.c +2 -2
@@ -15,8 +15,8 @@#include "qat_logs.h" #include "qat_device.h" #include "qat_qp.h" -#include "qat_sym_refactor.h" -#include "qat_asym_refactor.h" +#include "qat_sym.h" +#include "qat_asym.h" #include "qat_comp.h" #define QAT_CQ_MAX_DEQ_RETRIES 10
drivers/common/qat/qat_qp.h +1 -1
@@ -162,7 +162,7 @@ qat_qp_setup(struct qat_pci_device *qat_dev,int qat_qps_per_service (struct qat_pci_device *qat_dev, -enum qat_service_type service); +enum qat_service_type service);const struct qat_qp_hw_data * qat_qp_get_hw_data(struct qat_pci_device *qat_dev,
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym_refactor.h" -#include "qat_asym_refactor.h" +#include "qat_sym.h" +#include "qat_asym.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym_refactor.h" -#include "qat_asym_refactor.h" +#include "qat_sym.h" +#include "qat_asym.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +2 -162
182 lines not on this page · raw message
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +1 -1
@@ -13,7 +13,7 @@#include "icp_qat_fw_la.h" #include "qat_sym_session.h" -#include "qat_sym_refactor.h" +#include "qat_sym.h" #include "qat_sym_session.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/qat_asym.c +483 -328
887 lines not on this page · raw message
drivers/crypto/qat/qat_asym.h +52 -38
123 lines not on this page · raw message
drivers/crypto/qat/qat_asym_pmd.c deleted +0 -231
231 lines not on this page · raw message
drivers/crypto/qat/qat_asym_pmd.h deleted +0 -54
54 lines not on this page · raw message
drivers/crypto/qat/qat_asym_refactor.c deleted +0 -994
994 lines not on this page · raw message
drivers/crypto/qat/qat_asym_refactor.h deleted +0 -125
125 lines not on this page · raw message
drivers/crypto/qat/qat_crypto.h +4 -1
@@ -12,7 +12,10 @@extern uint8_t qat_sym_driver_id;extern uint8_t qat_asym_driver_id; -/** helper macro to set cryptodev capability range **/ +/** +* helper macro to set cryptodev capability range +* <n: name> <l: min > <r: max> <i: increment> <v: value> +**/ #define CAP_RNG (n, l, r, i) .n = {.min = l, .max = r, .increment = i}#define CAP_RNG_ZERO (n) .n = {.min = 0, .max = 0, .increment = 0}
drivers/crypto/qat/qat_sym.c +326 -683
329 lines not on this page · raw message
drivers/crypto/qat/qat_sym.h +115 -26
141 lines not on this page · raw message
drivers/crypto/qat/qat_sym_hw_dp.c deleted +0 -975
975 lines not on this page · raw message
drivers/crypto/qat/qat_sym_pmd.c deleted +0 -251
251 lines not on this page · raw message
drivers/crypto/qat/qat_sym_pmd.h deleted +0 -95
95 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.c deleted +0 -360
360 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.h deleted +0 -402
402 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.17.1
Part of the diff is not shown here. View the raw message.
v3 cover drivers/qat: QAT symmetric crypto datapatch rework
In reply to Kai JiThis patch reworks QAT symmetric crypto datapatch implementation where each generation request building separated and the crypto operation under the raw datapath api implementation are unified.
In addtion this patchset also enables QAT OOP support in raw datapath api implementation.
This patch depends on http://patchwork.dpdk.org/project/dpdk/cover/[email protected]/
v3:
- sperate a single patch 6 to two different patches
v2:
- review comments addressed
Kai Ji (8):
crypro/qat: qat driver refactor skeleton
crypto/qat: qat driver sym op refactor
crypto/qat: qat driver asym op refactor
crypto/qat: qat driver session method rework
crypto/qat: qat driver datapath rework
crypto/qat: support sgl oop operation
app/test: cryptodev test fix
crypto/qat: qat driver rework clean up
app/test/test_cryptodev.c | 58 +- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_device.c | 2 +- drivers/common/qat/qat_qp.c | 40 +- drivers/common/qat/qat_qp.h | 70 +- drivers/compress/qat/qat_comp_pmd.c | 12 +- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 7 + drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 90 ++ drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 487 +++++++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 253 +++++ drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 911 +++++++++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 939 ++++++++++++++++++ drivers/crypto/qat/qat_asym.c | 786 +++++++++------ drivers/crypto/qat/qat_asym.h | 77 +- drivers/crypto/qat/qat_asym_pmd.c | 231 ----- drivers/crypto/qat/qat_asym_pmd.h | 54 - drivers/crypto/qat/qat_crypto.c | 1 + drivers/crypto/qat/qat_crypto.h | 14 +- drivers/crypto/qat/qat_sym.c | 978 ++++++------------ drivers/crypto/qat/qat_sym.h | 141 ++- drivers/crypto/qat/qat_sym_hw_dp.c | 983 ------------------- drivers/crypto/qat/qat_sym_pmd.c | 251 ----- drivers/crypto/qat/qat_sym_pmd.h | 95 -- drivers/crypto/qat/qat_sym_session.c | 114 +-- drivers/crypto/qat/qat_sym_session.h | 8 +- 25 files changed, 3861 insertions(+), 2745 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h
Signature · 1 line
2.17.1
PATCH v3 1/8 crypro/qat: qat driver refactor skeleton
Add-in enqueue/dequeue op burst and build-request skeleton functions for qat crypto driver refactor.
--- drivers/common/qat/qat_qp.c | 16 +++++++++ drivers/common/qat/qat_qp.h | 54 ++++++++++++++++++++++++++++ drivers/crypto/qat/qat_asym.c | 43 ++++++++++++++++++++++ drivers/crypto/qat/qat_asym.h | 15 ++++++++ drivers/crypto/qat/qat_sym.c | 37 +++++++++++++++++++ drivers/crypto/qat/qat_sym.h | 16 +++++++++ drivers/crypto/qat/qat_sym_session.h | 6 ++++ 7 files changed, 187 insertions(+)
drivers/common/qat/qat_qp.c +16 -0
@@ -549,6 +549,22 @@ adf_modulo(uint32_t data, uint32_t modulo_mask)return data & modulo_mask; } +uint16_t +refactor_qat_enqueue_op_burst(__rte_unused void *qp, + __rte_unused qat_op_build_request_t op_build_request, + __rte_unused void **ops, __rte_unused uint16_t nb_ops) +{ +return 0 ; +} + +uint16_t +refactor_qat_dequeue_op_burst(__rte_unused void *qp, __rte_unused void **ops, + __rte_unused qat_op_dequeue_t qat_dequeue_process_response, + __rte_unused uint16_t nb_ops) +{ +return 0 ; +} +uint16_t qat_enqueue_op_burst (void *qp,void **ops,uint16_t nb_ops) {
drivers/common/qat/qat_qp.h +54 -0
72 lines not on this page · raw message
drivers/crypto/qat/qat_asym.c +43 -0
49 lines not on this page · raw message
drivers/crypto/qat/qat_asym.h +15 -0
@@ -92,4 +92,19 @@ void qat_asym_process_response(void __rte_unused **op, uint8_t *resp, void *op_cookie); +int +refactor_qat_asym_process_response(__rte_unused void **op, + __rte_unused uint8_t *resp, + __rte_unused void *op_cookie, + __rte_unused uint64_t *dequeue_err_count); + +uint16_t +qat_asym_crypto_enqueue_op_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); + + +uint16_t +qat_asym_crypto_dequeue_op_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); +#endif /* _QAT_ASYM_H_ */
drivers/crypto/qat/qat_sym.c +37 -0
@@ -210,6 +210,43 @@ handle_spc_gmac(struct qat_sym_session *ctx, struct rte_crypto_op *op, ICP_QAT_FW_LA_NO_PROTO); } +/* +* Sym build request refactor function template, +* will be removed in the later patchset. +*/ +static __rte_always_inline int +refactor_qat_sym_build_request(__rte_unused void *in_op, + __rte_unused uint8_t *out_msg, __rte_unused void *op_cookie, + __rte_unused uint64_t *opaque, + __rte_unused enum qat_device_gen dev_gen) +{ +return 0 ; +} + +/* +* Sym enqueue burst refactor function template, +* will be removed in the later patchset. +*/ +uint16_t +refactor_qat_sym_enqueue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops) +{ +return refactor_qat_enqueue_op_burst (qp, refactor_qat_sym_build_request, + (void **)ops, nb_ops); +} + +/* +* Sym dequeue burst refactor function template, +* will be removed in the later patchset. +*/ +uint16_t +refactor_qat_sym_dequeue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops) +{ +return refactor_qat_dequeue_op_burst (qp, (void **)ops, + refactor_qat_sym_process_response, nb_ops); +} +int qat_sym_build_request (void *in_op,uint8_t *out_msg,void *op_cookie,enum qat_device_gen qat_dev_gen)
drivers/crypto/qat/qat_sym.h +16 -0
@@ -54,6 +54,22 @@ struct qat_sym_op_cookie { } opt; }; +static __rte_always_inline int +refactor_qat_sym_process_response(__rte_unused void **op, + __rte_unused uint8_t *resp, __rte_unused void *op_cookie, + __rte_unused uint64_t *dequeue_err_count) +{ +return 0 ; +} + +uint16_t +refactor_qat_sym_enqueue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); + +uint16_t +refactor_qat_sym_dequeue_burst (void *qp,struct rte_crypto_op **ops, +uint16_t nb_ops); +int qat_sym_build_request (void *in_op,uint8_t *out_msg,void *op_cookie,enum qat_device_gen qat_dev_gen);
drivers/crypto/qat/qat_sym_session.h +6 -0
@@ -55,6 +55,11 @@#define QAT_SESSION_IS_SLICE_SET (flags, flag) \ (!!((flags) & (flag))) +struct qat_sym_session ; + +typedef int (*qat_sym_build_request_t )(void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); +enum qat_sym_proto_flag {QAT_CRYPTO_PROTO_FLAG_NONE =0 ,QAT_CRYPTO_PROTO_FLAG_CCM =1 ,
@@ -107,6 +112,7 @@ struct qat_sym_session {/* Some generations need different setup of counter */ uint32_t slice_types;enum qat_sym_proto_flag qat_proto_flag; +qat_sym_build_request_t build_request[2 ]; };int
Signature · 1 line
2.17.1
PATCH v3 2/8 crypto/qat: qat driver sym op refactor
In reply to Kai JiThis patch add-in refactored qat symmetirc build request function implementation (qat_sym_refactor.c & qat_sym_refactor.h) Add-in QAT sym build ops in auth, cipher, chain and aead operation for QAT generation 1
--- drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 1071 ++++++++++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 895 +++++++++++++++ drivers/crypto/qat/qat_sym.h | 8 + drivers/crypto/qat/qat_sym_hw_dp.c | 8 - drivers/crypto/qat/qat_sym_refactor.c | 409 +++++++ drivers/crypto/qat/qat_sym_refactor.h | 402 +++++++ 6 files changed, 2785 insertions(+), 8 deletions(-) create mode 100644 drivers/crypto/qat/qat_sym_refactor.c create mode 100644 drivers/crypto/qat/qat_sym_refactor.h
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +1071 -0
@@ -8,14 +8,1082 @@#include <rte_cryptodev.h> #include "qat_crypto.h" #include "qat_sym_session.h" +#include "qat_sym.h" + +#define QAT_BASE_GEN1_SYM_CAPABILITIES \ + QAT_SYM_PLAIN_AUTH_CAP(SHA1, CAP_SET(block_size, 64), \ + CAP_RNG(digest_size, 1, 20, 1)), \ + QAT_SYM_AEAD_CAP(AES_GCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 0, 12, 12)), \ + QAT_SYM_AEAD_CAP(AES_CCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 2), \ + CAP_RNG(aad_size, 0, 224, 1), CAP_RNG(iv_size, 7, 13, 1)), \ + QAT_SYM_AUTH_CAP(AES_GMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 0, 12, 12)), \ + QAT_SYM_AUTH_CAP(AES_CMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA224, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA1_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 20, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA224_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(MD5_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 16, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(AES_XCBC_MAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 12, 12, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SNOW3G_UIA2, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(KASUMI_F9, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(digest_size), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(AES_CBC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(AES_CTR, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(AES_XTS, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 32, 64, 32), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(AES_DOCSISBPI, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 16), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(SNOW3G_UEA2, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_CIPHER_CAP(KASUMI_F8, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(3DES_CBC, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 8, 24, 8), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(3DES_CTR, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 16, 24, 8), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(DES_CBC, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 8, 24, 8), CAP_RNG(iv_size, 8, 8, 0)), \ + QAT_SYM_CIPHER_CAP(DES_DOCSISBPI, CAP_SET(block_size, 8), \ + CAP_RNG(key_size, 8, 8, 0), CAP_RNG(iv_size, 8, 8, 0)) + +#define QAT_BASE_GEN1_ASYM_CAPABILITIES \ + QAT_ASYM_CAP(MODEX, 0, 1, 512, 1), \ + QAT_ASYM_CAP(MODINV, 0, 1, 512, 1), \ + QAT_ASYM_CAP(RSA, \ + ((1 << RTE_CRYPTO_ASYM_OP_SIGN) | \ + (1 << RTE_CRYPTO_ASYM_OP_VERIFY) | \ + (1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) | \ + (1 << RTE_CRYPTO_ASYM_OP_DECRYPT)), \ + 64, 512, 64) + +#define QAT_EXTRA_GEN2_SYM_CAPABILITIES \ + QAT_SYM_CIPHER_CAP(ZUC_EEA3, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(ZUC_EIA3, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 4, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 16, 16, 0)) \ + +#define QAT_EXTRA_GEN3_SYM_CAPABILITIES \ + QAT_SYM_AEAD_CAP(CHACHA20_POLY1305, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 32, 32, 0), \ + CAP_RNG(digest_size, 16, 16, 0), \ + CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 12, 12, 0)) + +#define QAT_BASE_GEN4_SYM_CAPABILITIES \ + QAT_SYM_CIPHER_CAP(AES_CBC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(SHA1_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 20, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA224_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256_HMAC, CAP_SET(block_size, 64), \ + CAP_RNG(key_size, 1, 64, 1), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512_HMAC, CAP_SET(block_size, 128), \ + CAP_RNG(key_size, 1, 128, 1), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(AES_XCBC_MAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 12, 12, 0), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(AES_CMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(AES_DOCSISBPI, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 16), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AUTH_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(digest_size), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(NULL, CAP_SET(block_size, 1), \ + CAP_RNG_ZERO(key_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_PLAIN_AUTH_CAP(SHA1, CAP_SET(block_size, 64), \ + CAP_RNG(digest_size, 1, 20, 1)), \ + QAT_SYM_AUTH_CAP(SHA224, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 28, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA256, CAP_SET(block_size, 64), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 32, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA384, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 48, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_AUTH_CAP(SHA512, CAP_SET(block_size, 128), \ + CAP_RNG_ZERO(key_size), CAP_RNG(digest_size, 1, 64, 1), \ + CAP_RNG_ZERO(aad_size), CAP_RNG_ZERO(iv_size)), \ + QAT_SYM_CIPHER_CAP(AES_CTR, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(iv_size, 16, 16, 0)), \ + QAT_SYM_AEAD_CAP(AES_GCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG(aad_size, 0, 240, 1), CAP_RNG(iv_size, 0, 12, 12)), \ + QAT_SYM_AEAD_CAP(AES_CCM, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 16, 0), CAP_RNG(digest_size, 4, 16, 2), \ + CAP_RNG(aad_size, 0, 224, 1), CAP_RNG(iv_size, 7, 13, 1)), \ + QAT_SYM_AUTH_CAP(AES_GMAC, CAP_SET(block_size, 16), \ + CAP_RNG(key_size, 16, 32, 8), CAP_RNG(digest_size, 8, 16, 4), \ + CAP_RNG_ZERO(aad_size), CAP_RNG(iv_size, 0, 12, 12)) \ + +#define QAT_SYM_DP_GET_MAX_ENQ (q, c, n) \ + RTE_MIN((q->max_inflights - q->enqueued + q->dequeued - c), n) + +#define QAT_SYM_DP_IS_RESP_SUCCESS (resp) \ + (ICP_QAT_FW_COMN_STATUS_FLAG_OK == \ + ICP_QAT_FW_COMN_RESP_CRYPTO_STAT_GET(resp->comn_hdr.comn_status)) + +static __rte_always_inline int +op_bpi_cipher_decrypt (uint8_t *src,uint8_t *dst, +uint8_t *iv,int ivlen,int srclen, +void *bpi_ctx) +{ +EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX *)bpi_ctx; +int encrypted_ivlen; +uint8_t encrypted_iv[BPI_MAX_ENCR_IV_LEN ]; +uint8_t *encr = encrypted_iv; + +/* ECB method: encrypt (not decrypt!) the IV, then XOR with plaintext */ +if (EVP_EncryptUpdate (ctx, encrypted_iv, &encrypted_ivlen, iv, ivlen) + <=0 ) + goto cipher_decrypt_err; + +for (; srclen !=0 ; --srclen, ++dst, ++src, ++encr) + *dst = *src ^ *encr; + +return 0 ; + +cipher_decrypt_err: +QAT_DP_LOG (ERR ,"libcrypto ECB cipher decrypt for BPI IV failed" ); +return -EINVAL ; +} + +static __rte_always_inline uint32_t +qat_bpicipher_preprocess (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +int block_len =qat_cipher_get_block_size (ctx->qat_cipher_alg); +struct rte_crypto_sym_op *sym_op = op->sym; +uint8_t last_block_len = block_len >0 ? + sym_op->cipher.data.length % block_len :0 ; + +if (last_block_len && ctx->qat_dir ==ICP_QAT_HW_CIPHER_DECRYPT ) { +/* Decrypt last block */ +uint8_t *last_block, *dst, *iv; +uint32_t last_block_offset = sym_op->cipher.data.offset + + sym_op->cipher.data.length - last_block_len; + last_block = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_src, + uint8_t *, last_block_offset); + +if (unlikely ((sym_op->m_dst !=NULL ) + && (sym_op->m_dst != sym_op->m_src))) +/* out-of-place operation (OOP) */ + dst = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_dst, + uint8_t *, last_block_offset); +else + dst = last_block; + +if (last_block_len < sym_op->cipher.data.length) +/* use previous block ciphertext as IV */ + iv = last_block - block_len; +else +/* runt block, i.e. less than one full block */ + iv = rte_crypto_op_ctod_offset(op, uint8_t *, + ctx->cipher_iv.offset); + +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src before pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst before pre-process:" , + dst, last_block_len); +#endif +op_bpi_cipher_decrypt (last_block, dst, iv, block_len, + last_block_len, ctx->bpi_ctx); +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src after pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst after pre-process:" , + dst, last_block_len); +#endif + } + +return sym_op->cipher.data.length - last_block_len; +} + +static __rte_always_inline int +qat_chk_len_in_bits_auth (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 ) { +if (unlikely ((op->sym->auth.data.offset %BYTE_LENGTH !=0 ) || + (op->sym->auth.data.length %BYTE_LENGTH !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int +qat_chk_len_in_bits_cipher (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_KASUMI || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ) { +if (unlikely ((op->sym->cipher.data.length %BYTE_LENGTH !=0 ) || + ((op->sym->cipher.data.offset % +BYTE_LENGTH ) !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int32_t +qat_sym_build_req_set_data (struct icp_qat_fw_la_bulk_req *req, +void *opaque,struct qat_sym_op_cookie *cookie, +struct rte_crypto_vec *src_vec,uint16_t n_src, +struct rte_crypto_vec *dst_vec,uint16_t n_dst) +{ +struct qat_sgl *list; +uint32_t i; +uint32_t tl_src =0 , total_len_src, total_len_dst; +uint64_t src_data_start =0 , dst_data_start =0 ; +int is_sgl = n_src >1 || n_dst >1 ; + +if (unlikely (n_src <1 || n_src >QAT_SYM_SGL_MAX_NUMBER || + n_dst >QAT_SYM_SGL_MAX_NUMBER )) +return -1 ; + +if (likely (!is_sgl)) { + src_data_start = src_vec[0 ].iova; + tl_src = total_len_src = + src_vec[0 ].len; +if (unlikely (n_dst)) {/* oop */ + total_len_dst = dst_vec[0 ].len; + + dst_data_start = dst_vec[0 ].iova; +if (unlikely (total_len_src != total_len_dst)) +return -EINVAL ; + }else { + dst_data_start = src_data_start; + total_len_dst = tl_src; + } + }else {/* sgl */ + total_len_dst = total_len_src =0 ; + +ICP_QAT_FW_COMN_PTR_TYPE_SET (req->comn_hdr.comn_req_flags, +QAT_COMN_PTR_TYPE_SGL ); + + list = (struct qat_sgl *)&cookie->qat_sgl_src; +for (i =0 ; i < n_src; i++) { + list->buffers[i].len = src_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = src_vec[i].iova; +if (tl_src + src_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -1 ; + } + tl_src += src_vec[i].len; + } + + list->num_bufs = i; + src_data_start = cookie->qat_sgl_src_phys_addr; + +if (unlikely (n_dst >0 )) {/* oop sgl */ +uint32_t tl_dst =0 ; + + list = (struct qat_sgl *)&cookie->qat_sgl_dst; + +for (i =0 ; i < n_dst; i++) { + list->buffers[i].len = dst_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = dst_vec[i].iova; +if (tl_dst + dst_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -ENOTSUP ; + } + + tl_dst += dst_vec[i].len; + } + +if (tl_src != tl_dst) +return -EINVAL ; + list->num_bufs = i; + dst_data_start = cookie->qat_sgl_dst_phys_addr; + }else + dst_data_start = src_data_start; + } + + req->comn_mid.src_data_addr = src_data_start; + req->comn_mid.dest_data_addr = dst_data_start; + req->comn_mid.src_length = total_len_src; + req->comn_mid.dst_length = total_len_dst; + req->comn_mid.opaque_data = (uintptr_t )opaque; + +return tl_src; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_cipher (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, + struct rte_crypto_va_iova_ptr *auth_iv_or_aad __rte_unused, + struct rte_crypto_va_iova_ptr *digest __rte_unused) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int n_src =0 ; +int ret; + + ret =qat_chk_len_in_bits_cipher (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->cipher.data.length >>3 ; + cipher_ofs = op->sym->cipher.data.offset >>3 ; +break ; +case 0 : +if (ctx->bpi_ctx) { +/* DOCSIS - only send complete blocks to device. +* Process any partial block using CFB mode. +* Even if 0 complete blocks, still send this to device +* to get into rx queue for post-process and dequeuing +*/ + cipher_len =qat_bpicipher_preprocess (ctx, op); + cipher_ofs = op->sym->cipher.data.offset; + }else { + cipher_len = op->sym->cipher.data.length; + cipher_ofs = op->sym->cipher.data.offset; + } +break ; +default : +QAT_DP_LOG (ERR , +"SNOW3G/KASUMI/ZUC in QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, + cipher_len, in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_auth (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, + struct rte_crypto_va_iova_ptr *cipher_iv __rte_unused, +struct rte_crypto_va_iova_ptr *auth_iv, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t auth_ofs =0 , auth_len =0 ; +int n_src, ret; + + ret =qat_chk_len_in_bits_auth (ctx, op); +switch (ret) { +case 1 : + auth_ofs = op->sym->auth.data.offset >>3 ; + auth_len = op->sym->auth.data.length >>3 ; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); +break ; +case 0 : +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_128 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_64 ) { +/* AES-GMAC */ + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + }else { + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va =NULL ; + auth_iv->iova =0 ; + } +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, auth_ofs, + auth_ofs + auth_len, in_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, auth_ofs, + auth_ofs + auth_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_chain (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +union rte_crypto_sym_ofs ofs; +uint32_t min_ofs =0 , max_len =0 ; +uint32_t cipher_len =0 , cipher_ofs =0 ; +uint32_t auth_len =0 , auth_ofs =0 ; +int is_oop = (op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src); +int is_sgl = op->sym->m_src->nb_segs >1 ; +int n_src; +int ret; + +if (unlikely (is_oop)) + is_sgl |= op->sym->m_dst->nb_segs >1 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv_or_aad->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + + ret =qat_chk_len_in_bits_cipher (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->aead.data.length >>3 ; + cipher_ofs = op->sym->aead.data.offset >>3 ; +break ; +case 0 : + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + ret =qat_chk_len_in_bits_auth (ctx, op); +switch (ret) { +case 1 : + auth_len = op->sym->auth.data.length >>3 ; + auth_ofs = op->sym->auth.data.offset >>3 ; +break ; +case 0 : + auth_len = op->sym->auth.data.length; + auth_ofs = op->sym->auth.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + min_ofs = cipher_ofs < auth_ofs ? cipher_ofs : auth_ofs; + max_len =RTE_MAX (cipher_ofs + cipher_len, auth_ofs + auth_len); + +/* digest in buffer check. Needed only for wireless algos */ +if (ret ==1 ) { +/* Handle digest-encrypted cases, i.e. +* auth-gen-then-cipher-encrypt and +* cipher-decrypt-then-auth-verify +*/ +uint64_t auth_end_iova; + +if (unlikely (is_sgl)) { +uint32_t remaining_off = auth_ofs + auth_len; +struct rte_mbuf *sgl_buf = (is_oop ? op->sym->m_dst : + op->sym->m_src); + +while (remaining_off >=rte_pktmbuf_data_len (sgl_buf) + && sgl_buf->next !=NULL ) { + remaining_off -=rte_pktmbuf_data_len (sgl_buf); + sgl_buf = sgl_buf->next; + } + + auth_end_iova = (uint64_t )rte_pktmbuf_iova_offset ( + sgl_buf, remaining_off); + }else + auth_end_iova = (is_oop ? +rte_pktmbuf_iova (op->sym->m_dst) : +rte_pktmbuf_iova (op->sym->m_src)) + auth_ofs + + auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_ofs + auth_len < cipher_ofs + cipher_len) && + (digest->iova == auth_end_iova)) + max_len =RTE_MAX (max_len, auth_ofs + auth_len + + ctx->digest_length); + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, min_ofs, max_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (unlikely (n_src <0 || n_src > op->sym->m_src->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + in_sgl->num = n_src; + +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, min_ofs, + max_len, out_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + ofs.ofs.cipher.head = cipher_ofs; + ofs.ofs.cipher.tail = max_len - cipher_ofs - cipher_len; + ofs.ofs.auth.head = auth_ofs; + ofs.ofs.auth.tail = max_len - auth_ofs - auth_len; + +return ofs.raw; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_aead (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int32_t n_src =0 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = (void *)op->sym->aead.aad.data; + auth_iv_or_aad->iova = op->sym->aead.aad.phys_addr; + digest->va = (void *)op->sym->aead.digest.data; + digest->iova = op->sym->aead.digest.phys_addr; + + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, cipher_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline void +qat_set_cipher_iv (struct icp_qat_fw_la_cipher_req_params *cipher_param, +struct rte_crypto_va_iova_ptr *iv_ptr,uint32_t iv_len, +struct icp_qat_fw_la_bulk_req *qat_req) +{ +/* copy IV into request if it fits */ +if (iv_len <=sizeof (cipher_param->u.cipher_IV_array)) +rte_memcpy (cipher_param->u.cipher_IV_array, iv_ptr->va, + iv_len); +else { +ICP_QAT_FW_LA_CIPH_IV_FLD_FLAG_SET ( + qat_req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_CIPH_IV_64BIT_PTR ); + cipher_param->u.s.cipher_IV_ptr = iv_ptr->iova; + } +} + +static __rte_always_inline void +qat_sym_dp_fill_vec_status (int32_t *sta,int status,uint32_t n) +{ +uint32_t i; + +for (i =0 ; i < n; i++) + sta[i] = status; +} + +static __rte_always_inline void +enqueue_one_cipher_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + +/* cipher IV */ +qat_set_cipher_iv (cipher_param, iv, ctx->cipher_iv.length, req); + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; +} + +static __rte_always_inline void +enqueue_one_auth_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = data_len - ofs.ofs.auth.head - + ofs.ofs.auth.tail; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, auth_iv->va, + ctx->auth_iv.length); +break ; +default : +break ; + } +} + +static __rte_always_inline int +enqueue_one_chain_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_vec *src_vec, +uint16_t n_src_vecs, +struct rte_crypto_vec *dst_vec, +uint16_t n_dst_vecs, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; +struct rte_crypto_vec *cvec = n_dst_vecs >0 ? + dst_vec : src_vec; +rte_iova_t auth_iova_end; +int cipher_len, auth_len; +int is_sgl = n_src_vecs >1 || n_dst_vecs >1 ; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + cipher_len = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_len = data_len - ofs.ofs.auth.head - ofs.ofs.auth.tail; + +if (unlikely (cipher_len <0 || auth_len <0 )) +return -1 ; + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = cipher_len; +qat_set_cipher_iv (cipher_param, cipher_iv, ctx->cipher_iv.length, req); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = auth_len; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +break ; +default : +break ; + } + +if (unlikely (is_sgl)) { +/* sgl */ +int i = n_dst_vecs ? n_dst_vecs : n_src_vecs; +uint32_t remaining_off = data_len - ofs.ofs.auth.tail; + +while (remaining_off >= cvec->len && i >=1 ) { + i--; + remaining_off -= cvec->len; + cvec++; + } + + auth_iova_end = cvec->iova + remaining_off; + }else + auth_iova_end = cvec[0 ].iova + auth_param->auth_off + + auth_param->auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_param->auth_off + auth_param->auth_len < + cipher_param->cipher_offset + cipher_param->cipher_length) && + (digest->iova == auth_iova_end)) { +/* Handle partial digest encryption */ +if (cipher_param->cipher_offset + cipher_param->cipher_length < + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length && !is_sgl) + req->comn_mid.dst_length = req->comn_mid.src_length = + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length; +struct icp_qat_fw_comn_req_hdr *header = &req->comn_hdr; +ICP_QAT_FW_LA_DIGEST_IN_BUFFER_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_DIGEST_IN_BUFFER ); + } + +return 0 ; +} + +static __rte_always_inline void +enqueue_one_aead_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param = + (void *)&req->serv_specif_rqpars; +struct icp_qat_fw_la_auth_req_params *auth_param = + (void *)((uint8_t *)&req->serv_specif_rqpars + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); +uint8_t *aad_data; +uint8_t aad_ccm_real_len; +uint8_t aad_len_field_sz; +uint32_t msg_len_be; +rte_iova_t aad_iova =0 ; +uint8_t q; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, iv->va, + ctx->cipher_iv.length); + aad_iova = aad->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_AES_CBC_MAC : + aad_data = aad->va; + aad_iova = aad->iova; + aad_ccm_real_len =0 ; + aad_len_field_sz =0 ; + msg_len_be =rte_bswap32 ((uint32_t )data_len - + ofs.ofs.cipher.head); + +if (ctx->aad_len >ICP_QAT_HW_CCM_AAD_DATA_OFFSET ) { + aad_len_field_sz =ICP_QAT_HW_CCM_AAD_LEN_INFO ; + aad_ccm_real_len = ctx->aad_len - +ICP_QAT_HW_CCM_AAD_B0_LEN - +ICP_QAT_HW_CCM_AAD_LEN_INFO ; + }else { + aad_data = iv->va; + aad_iova = iv->iova; + } + + q =ICP_QAT_HW_CCM_NQ_CONST - ctx->cipher_iv.length; + aad_data[0 ] =ICP_QAT_HW_CCM_BUILD_B0_FLAGS ( + aad_len_field_sz, ctx->digest_length, q); +if (q >ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ) { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET + (q - +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ), + (uint8_t *)&msg_len_be, +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ); + }else { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)&msg_len_be + + (ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE + - q), q); + } + +if (aad_len_field_sz >0 ) { + *(uint16_t *)&aad_data[ICP_QAT_HW_CCM_AAD_B0_LEN ] = +rte_bswap16 (aad_ccm_real_len); + +if ((aad_ccm_real_len + aad_len_field_sz) + %ICP_QAT_HW_CCM_AAD_B0_LEN ) { +uint8_t pad_len =0 ; +uint8_t pad_idx =0 ; + + pad_len =ICP_QAT_HW_CCM_AAD_B0_LEN - + ((aad_ccm_real_len + + aad_len_field_sz) % +ICP_QAT_HW_CCM_AAD_B0_LEN ); + pad_idx =ICP_QAT_HW_CCM_AAD_B0_LEN + + aad_ccm_real_len + + aad_len_field_sz; +memset (&aad_data[pad_idx],0 , pad_len); + } + } + +rte_memcpy (((uint8_t *)cipher_param->u.cipher_IV_array) + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , ctx->cipher_iv.length); + *(uint8_t *)&cipher_param->u.cipher_IV_array[0 ] = + q -ICP_QAT_HW_CCM_NONCE_OFFSET ; + +rte_memcpy ((uint8_t *)aad->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va +ICP_QAT_HW_CCM_NONCE_OFFSET , + ctx->cipher_iv.length); +break ; +default : +break ; + } + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_param->auth_off = ofs.ofs.cipher.head; + auth_param->auth_len = cipher_param->cipher_length; + auth_param->auth_res_addr = digest->iova; + auth_param->u1.aad_adr = aad_iova; +}extern struct rte_cryptodev_ops qat_sym_crypto_ops_gen1;extern struct rte_cryptodev_ops qat_asym_crypto_ops_gen1; +/* -----------------GEN 1 sym crypto op data path APIs ---------------- */ +int +qat_sym_build_op_cipher_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_auth_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_aead_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_chain_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +/* -----------------GEN 1 sym crypto raw data path APIs ---------------- */ +int +qat_sym_dp_enqueue_single_cipher_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, +struct rte_crypto_va_iova_ptr *iv, + struct rte_crypto_va_iova_ptr *digest __rte_unused, + struct rte_crypto_va_iova_ptr *aad __rte_unused, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_cipher_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +int +qat_sym_dp_enqueue_single_auth_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, + struct rte_crypto_va_iova_ptr *iv __rte_unused, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_auth_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +int +qat_sym_dp_enqueue_single_chain_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_chain_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +int +qat_sym_dp_enqueue_single_aead_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_vec *data,uint16_t n_data_vecs, +union rte_crypto_sym_ofs ofs, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +void *user_data); + +uint32_t +qat_sym_dp_enqueue_aead_jobs_gen1 (void *qp_data,uint8_t *drv_ctx, +struct rte_crypto_sym_vec *vec,union rte_crypto_sym_ofs ofs, +void *user_data[],int *status); + +void * +qat_sym_dp_dequeue_single_gen1 (void *qp_data,uint8_t *drv_ctx, +int *dequeue_status,enum rte_crypto_op_status *op_status); + +uint32_t +qat_sym_dp_dequeue_burst_gen1 (void *qp_data,uint8_t *drv_ctx, +rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count, +uint32_t max_nb_to_dequeue, +rte_cryptodev_raw_post_dequeue_t post_dequeue, +void **out_user_data,uint8_t is_user_data_array, +uint32_t *n_success_jobs,int *return_status); + +int +qat_sym_dp_enqueue_done_gen1 (void *qp_data,uint8_t *drv_ctx,uint32_t n); + +int +qat_sym_dp_denqueue_done_gen1 (void *qp_data,uint8_t *drv_ctx,uint32_t n); + +int +qat_sym_configure_raw_dp_ctx_gen1 (void *_raw_dp_ctx,void *_ctx); +/* -----------------GENx control path APIs ---------------- */ uint64_t qat_sym_crypto_feature_flags_get_gen1 (struct qat_pci_device *qat_dev); +int +qat_sym_crypto_set_session_gen1 (void *cryptodev,void *session); +void qat_sym_session_set_ext_hash_flags_gen2 (struct qat_sym_session *session,uint8_t hash_flag);
@@ -23,6 +1091,9 @@ qat_sym_session_set_ext_hash_flags_gen2(struct qat_sym_session *session,struct qat_capabilities_info qat_asym_crypto_cap_get_gen1 (struct qat_pci_device *qat_dev); +int +qat_asym_crypto_set_session_gen1 (void *cryptodev,void *session); +uint64_t qat_asym_crypto_feature_flags_get_gen1 (struct qat_pci_device *qat_dev);
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +895 -0
901 lines not on this page · raw message
drivers/crypto/qat/qat_sym.h +8 -0
@@ -54,6 +54,14 @@ struct qat_sym_op_cookie { } opt; }; +struct qat_sym_dp_ctx { +struct qat_sym_session *session; +uint32_t tail; +uint32_t head; +uint16_t cached_enqueue; +uint16_t cached_dequeue; +}; + static __rte_always_inline int refactor_qat_sym_process_response(__rte_unused void **op, __rte_unused uint8_t *resp, __rte_unused void *op_cookie,
drivers/crypto/qat/qat_sym_hw_dp.c +0 -8
@@ -13,14 +13,6 @@#include "qat_sym_session.h" #include "qat_qp.h" -struct qat_sym_dp_ctx { -struct qat_sym_session *session; -uint32_t tail; -uint32_t head; -uint16_t cached_enqueue; -uint16_t cached_dequeue; -}; - static __rte_always_inline int32_tqat_sym_dp_parse_data_vec (struct qat_qp *qp,struct icp_qat_fw_la_bulk_req *req,struct rte_crypto_vec *data,uint16_t n_data_vecs)
drivers/crypto/qat/qat_sym_refactor.c new file +409 -0
409 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.h new file +402 -0
402 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v3 3/8 crypto/qat: qat driver asym op refactor
In reply to Kai JiThis patch add-in refactored qat asymmetric build request function implementation (qat_asym_refactor.c & qat_asym_refactor.h)
--- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 7 + drivers/crypto/qat/qat_asym_refactor.c | 994 +++++++++++++++++++++ drivers/crypto/qat/qat_asym_refactor.h | 125 +++ 3 files changed, 1126 insertions(+) create mode 100644 drivers/crypto/qat/qat_asym_refactor.c create mode 100644 drivers/crypto/qat/qat_asym_refactor.h
drivers/crypto/qat/dev/qat_asym_pmd_gen1.c +7 -0
@@ -65,6 +65,13 @@ qat_asym_crypto_feature_flags_get_gen1(return feature_flags; } +int +qat_asym_crypto_set_session_gen1(void *cdev __rte_unused, + void *session __rte_unused) +{ +return 0 ; +} +RTE_INIT (qat_asym_crypto_gen1_init) { qat_asym_gen_dev_ops[QAT_GEN1].cryptodev_ops =
drivers/crypto/qat/qat_asym_refactor.c new file +994 -0
994 lines not on this page · raw message
drivers/crypto/qat/qat_asym_refactor.h new file +125 -0
125 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v3 4/8 crypto/qat: qat driver session method rework
In reply to Kai JiThe patch introduce set_session & set_raw_dp_ctx methods to qat gen dev ops Replace min_qat_dev_gen_id with dev_id, the session will be invalid if the device generation id is not matching during init and ops
--- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 90 ++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 467 +++++++++++++++++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 243 ++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 5 + drivers/crypto/qat/qat_crypto.c | 1 + drivers/crypto/qat/qat_crypto.h | 9 + drivers/crypto/qat/qat_sym.c | 8 +- drivers/crypto/qat/qat_sym_session.c | 106 +---- drivers/crypto/qat/qat_sym_session.h | 2 +- 9 files changed, 831 insertions(+), 100 deletions(-)
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +90 -0
@@ -166,6 +166,90 @@ qat_sym_crypto_qp_setup_gen2(struct rte_cryptodev *dev, uint16_t qp_id,return 0 ; } +void +qat_sym_session_set_ext_hash_flags_gen2 (struct qat_sym_session *session, +uint8_t hash_flag) +{ +struct icp_qat_fw_comn_req_hdr *header = &session->fw_req.comn_hdr; +struct icp_qat_fw_cipher_auth_cd_ctrl_hdr *cd_ctrl = + (struct icp_qat_fw_cipher_auth_cd_ctrl_hdr *) + session->fw_req.cd_ctrl.content_desc_ctrl_lw; + +/* Set the Use Extended Protocol Flags bit in LW 1 */ +QAT_FIELD_SET (header->comn_req_flags, +QAT_COMN_EXT_FLAGS_USED , +QAT_COMN_EXT_FLAGS_BITPOS , +QAT_COMN_EXT_FLAGS_MASK ); + +/* Set Hash Flags in LW 28 */ + cd_ctrl->hash_flags |= hash_flag; + +/* Set proto flags in LW 1 */ +switch (session->qat_cipher_alg) { +case ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_SNOW_3G_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags,0 ); +break ; +case ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_NO_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags, +ICP_QAT_FW_LA_ZUC_3G_PROTO ); +break ; +default : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_NO_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags,0 ); +break ; + } +} + +static int +qat_sym_crypto_set_session_gen2 (void *cdev,void *session) +{ +struct rte_cryptodev *dev = cdev; +struct qat_sym_session *ctx = session; +const struct qat_cryptodev_private *qat_private = + dev->data->dev_private; +int ret; + + ret =qat_sym_crypto_set_session_gen1 (cdev, session); +if (ret ==0 || ret != -ENOTSUP ) +return ret; + +/* GEN1 returning -ENOTSUP as it cannot handle some mixed algo, +* but some are not supported by GEN2, so checking here +*/ +if ((qat_private->internal_capabilities & +QAT_SYM_CAP_MIXED_CRYPTO ) ==0 ) +return -ENOTSUP ; + +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 && + ctx->qat_cipher_alg != +ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx, +1 <<ICP_QAT_FW_AUTH_HDR_FLAG_ZUC_EIA3_BITPOS ); + }else if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 && + ctx->qat_cipher_alg != +ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 ) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx, +1 <<ICP_QAT_FW_AUTH_HDR_FLAG_SNOW3G_UIA2_BITPOS ); + }else if ((ctx->aes_cmac || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_NULL ) && + (ctx->qat_cipher_alg == +ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 || + ctx->qat_cipher_alg == +ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 )) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx,0 ); + } + +return 0 ; +} +struct rte_cryptodev_ops qat_sym_crypto_ops_gen2 = {/* Device related operations */
@@ -204,6 +288,10 @@ RTE_INIT(qat_sym_crypto_gen2_init) qat_sym_gen_dev_ops[QAT_GEN2 ].cryptodev_ops = &qat_sym_crypto_ops_gen2; qat_sym_gen_dev_ops[QAT_GEN2 ].get_capabilities = qat_sym_crypto_cap_get_gen2; + qat_sym_gen_dev_ops[QAT_GEN2 ].set_session = + qat_sym_crypto_set_session_gen2; + qat_sym_gen_dev_ops[QAT_GEN2 ].set_raw_dp_ctx = + qat_sym_configure_raw_dp_ctx_gen1; qat_sym_gen_dev_ops[QAT_GEN2 ].get_feature_flags = qat_sym_crypto_feature_flags_get_gen1;
@@ -221,4 +309,6 @@ RTE_INIT(qat_asym_crypto_gen2_init) qat_asym_crypto_cap_get_gen1; qat_asym_gen_dev_ops[QAT_GEN2 ].get_feature_flags = qat_asym_crypto_feature_flags_get_gen1; + qat_asym_gen_dev_ops[QAT_GEN2 ].set_session = + qat_asym_crypto_set_session_gen1; }
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +467 -0
483 lines not on this page · raw message
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +243 -0
258 lines not on this page · raw message
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +5 -0
@@ -6,6 +6,7 @@#ifdef RTE_LIB_SECURITY #include <rte_security_driver.h> #endif +#include <cryptodev_pmd.h> #include "adf_transport_access_macros.h" #include "icp_qat_fw.h"
@@ -1169,6 +1170,10 @@ RTE_INIT(qat_sym_crypto_gen1_init) qat_sym_gen_dev_ops[QAT_GEN1 ].cryptodev_ops = &qat_sym_crypto_ops_gen1; qat_sym_gen_dev_ops[QAT_GEN1 ].get_capabilities = qat_sym_crypto_cap_get_gen1; + qat_sym_gen_dev_ops[QAT_GEN1 ].set_session = + qat_sym_crypto_set_session_gen1; + qat_sym_gen_dev_ops[QAT_GEN1 ].set_raw_dp_ctx = + qat_sym_configure_raw_dp_ctx_gen1; qat_sym_gen_dev_ops[QAT_GEN1 ].get_feature_flags = qat_sym_crypto_feature_flags_get_gen1;#ifdef RTE_LIB_SECURITY
drivers/crypto/qat/qat_crypto.c +1 -0
@@ -2,6 +2,7 @@* Copyright(c) 2021 Intel Corporation */ +#include <cryptodev_pmd.h> #include "qat_device.h" #include "qat_qp.h" #include "qat_crypto.h"
drivers/crypto/qat/qat_crypto.h +9 -0
@@ -48,15 +48,24 @@ typedef uint64_t (*get_feature_flags_t)(struct qat_pci_device *qat_dev);typedef void * (*create_security_ctx_t )(void *cryptodev); +typedef int (*set_session_t )(void *cryptodev,void *session); + +typedef int (*set_raw_dp_ctx_t )(void *raw_dp_ctx,void *ctx); +struct qat_crypto_gen_dev_ops {get_feature_flags_t get_feature_flags;get_capabilities_info_t get_capabilities;struct rte_cryptodev_ops *cryptodev_ops; +set_session_t set_session; +set_raw_dp_ctx_t set_raw_dp_ctx;#ifdef RTE_LIB_SECURITY create_security_ctx_t create_security_ctx;#endif }; +extern struct qat_crypto_gen_dev_ops qat_sym_gen_dev_ops[]; +extern struct qat_crypto_gen_dev_ops qat_asym_gen_dev_ops[]; +int qat_cryptodev_config (struct rte_cryptodev *dev,struct rte_cryptodev_config *config);
drivers/crypto/qat/qat_sym.c +1 -7
@@ -249,7 +249,7 @@ refactor_qat_sym_dequeue_burst(void *qp, struct rte_crypto_op **ops,int qat_sym_build_request (void *in_op,uint8_t *out_msg, -void *op_cookie,enum qat_device_gen qat_dev_gen) + void *op_cookie, __rte_unused enum qat_device_gen qat_dev_gen) {int ret =0 ;struct qat_sym_session *ctx =NULL ;
@@ -314,12 +314,6 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg,return -EINVAL ; } -if (unlikely (ctx->min_qat_dev_gen > qat_dev_gen)) { -QAT_DP_LOG (ERR ,"Session alg not supported on this device gen" ); - op->status =RTE_CRYPTO_OP_STATUS_INVALID_SESSION ; -return -EINVAL ; - } - qat_req = (struct icp_qat_fw_la_bulk_req *)out_msg;rte_mov128 ((uint8_t *)qat_req, (const uint8_t *)&(ctx->fw_req)); qat_req->comn_mid.opaque_data = (uint64_t )(uintptr_t )op;
drivers/crypto/qat/qat_sym_session.c +14 -92
186 lines not on this page · raw message
drivers/crypto/qat/qat_sym_session.h +1 -1
@@ -100,7 +100,7 @@ struct qat_sym_session {uint16_t auth_key_length;uint16_t digest_length;rte_spinlock_t lock;/* protects this struct */ -enum qat_device_gen min_qat_dev_gen; +uint16_t dev_id;uint8_t aes_cmac;uint8_t is_single_pass;uint8_t is_single_pass_gmac;
Signature · 1 line
2.17.1
PATCH v3 5/8 crypto/qat: qat driver datapath rework
In reply to Kai JiThis patch introduce op_build_request func in qat enqueue op burst. Add-in qat_dequeue_process_response in qat dequeue op burst. Enable session build request op based on crypto operation
--- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_qp.c | 60 +++++--------------- drivers/common/qat/qat_qp.h | 32 +++++++---- drivers/compress/qat/qat_comp_pmd.c | 12 +++- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 4 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 4 +- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 2 +- drivers/crypto/qat/qat_asym_refactor.c | 4 +- drivers/crypto/qat/qat_asym_refactor.h | 2 +- drivers/crypto/qat/qat_sym_hw_dp.c | 2 +- drivers/crypto/qat/qat_sym_refactor.c | 51 +---------------- drivers/crypto/qat/qat_sym_refactor.h | 2 +- 12 files changed, 57 insertions(+), 122 deletions(-)
drivers/common/qat/meson.build +2 -2
@@ -70,8 +70,8 @@ if qat_compress endif if qat_crypto - foreach f: ['qat_sym_pmd.c', 'qat_sym.c', 'qat_sym_session.c', - 'qat_sym_hw_dp.c', 'qat_asym_pmd.c', 'qat_asym.c', 'qat_crypto.c', + foreach f: ['qat_sym_refactor.c', 'qat_sym_session.c', + 'qat_sym_hw_dp.c', 'qat_asym_refactor.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c', 'dev/qat_crypto_pmd_gen2.c',
drivers/common/qat/qat_qp.c +13 -47
99 lines not on this page · raw message
drivers/common/qat/qat_qp.h +22 -10
@@ -14,6 +14,24 @@struct qat_pci_device ; +/* Default qp configuration for GEN4 devices */ +#define QAT_GEN4_QP_DEFCON (QAT_SERVICE_SYMMETRIC | \ + QAT_SERVICE_SYMMETRIC << 8 | \ + QAT_SERVICE_SYMMETRIC << 16 | \ + QAT_SERVICE_SYMMETRIC << 24) + +/* QAT GEN 4 specific macros */ +#define QAT_GEN4_BUNDLE_NUM 4 +#define QAT_GEN4_QPS_PER_BUNDLE_NUM 1 + +/* Queue pair setup error codes */ +#define QAT_NOMEM 1 +#define QAT_QP_INVALID_DESC_NO 2 +#define QAT_QP_BUSY 3 +#define QAT_PCI_NO_RESOURCE 4 + +#define ADF_ARB_RINGSRVARBEN_OFFSET 0x19C +/** * Structure associated with each queue. */
@@ -124,21 +142,15 @@ struct qat_qp_config { };uint16_t -refactor_qat_enqueue_op_burst (void *qp,qat_op_build_request_t op_build_request, +qat_enqueue_op_burst (void *qp,qat_op_build_request_t op_build_request,void **ops,uint16_t nb_ops); -uint16_t -refactor_qat_dequeue_op_burst (void *qp,void **ops, -qat_op_dequeue_t qat_dequeue_process_response,uint16_t nb_ops); - -uint16_t -qat_enqueue_op_burst (void *qp,void **ops,uint16_t nb_ops); -uint16_t qat_enqueue_comp_op_burst (void *qp,void **ops,uint16_t nb_ops);uint16_t -qat_dequeue_op_burst (void *qp,void **ops,uint16_t nb_ops); +qat_dequeue_op_burst (void *qp,void **ops, +qat_op_dequeue_t qat_dequeue_process_response,uint16_t nb_ops);int qat_qp_release (enum qat_device_gen qat_dev_gen,struct qat_qp **qp_addr);
@@ -150,7 +162,7 @@ qat_qp_setup(struct qat_pci_device *qat_dev,int qat_qps_per_service (struct qat_pci_device *qat_dev, -enum qat_service_type service); +enum qat_service_type service);const struct qat_qp_hw_data * qat_qp_get_hw_data(struct qat_pci_device *qat_dev,
drivers/compress/qat/qat_comp_pmd.c +9 -3
@@ -616,11 +616,18 @@ static struct rte_compressdev_ops compress_qat_dummy_ops = { .private_xform_free = qat_comp_private_xform_free }; +static uint16_t +qat_comp_dequeue_burst (void *qp,struct rte_comp_op **ops,uint16_t nb_ops) +{ +return qat_dequeue_op_burst (qp, (void **)ops, qat_comp_process_response, + nb_ops); +} +static uint16_t qat_comp_pmd_dequeue_first_op_burst (void *qp,struct rte_comp_op **ops,uint16_t nb_ops) { -uint16_t ret =qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +uint16_t ret =qat_comp_dequeue_burst (qp, ops, nb_ops);struct qat_qp *tmp_qp = (struct qat_qp *)qp;if (ret) {
@@ -638,8 +645,7 @@ qat_comp_pmd_dequeue_first_op_burst(void *qp, struct rte_comp_op **ops, }else { tmp_qp->qat_dev->comp_dev->compressdev->dequeue_burst = - (compressdev_dequeue_pkt_burst_t ) - qat_dequeue_op_burst; + qat_comp_dequeue_burst; } }return ret;
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym.h" -#include "qat_asym.h" +#include "qat_sym_refactor.h" +#include "qat_asym_refactor.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym.h" -#include "qat_asym.h" +#include "qat_sym_refactor.h" +#include "qat_asym_refactor.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +1 -1
@@ -13,7 +13,7 @@#include "icp_qat_fw_la.h" #include "qat_sym_session.h" -#include "qat_sym.h" +#include "qat_sym_refactor.h" #include "qat_sym_session.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/qat_asym_refactor.c +2 -2
@@ -5,7 +5,7 @@#include <stdarg.h> -#include <rte_cryptodev_pmd.h> +#include <cryptodev_pmd.h> #include "icp_qat_fw_pke.h" #include "icp_qat_fw.h"
@@ -14,7 +14,7 @@#include "qat_device.h" #include "qat_logs.h" -#include "qat_asym.h" +#include "qat_asym_refactor.h" uint8_t qat_asym_driver_id;
drivers/crypto/qat/qat_asym_refactor.h +1 -1
@@ -5,7 +5,7 @@#ifndef _QAT_ASYM_H_#define _QAT_ASYM_H_ -#include <rte_cryptodev_pmd.h> +#include <cryptodev_pmd.h> #include <rte_crypto_asym.h> #include "icp_qat_fw_pke.h" #include "qat_device.h"
drivers/crypto/qat/qat_sym_hw_dp.c +1 -1
@@ -8,7 +8,7 @@#include "icp_qat_fw.h" #include "icp_qat_fw_la.h" -#include "qat_sym.h" +#include "qat_sym_refactor.h" #include "qat_sym_pmd.h" #include "qat_sym_session.h" #include "qat_qp.h"
drivers/crypto/qat/qat_sym_refactor.c +1 -50
63 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.h +1 -1
@@ -5,7 +5,7 @@#ifndef _QAT_SYM_H_#define _QAT_SYM_H_ -#include <rte_cryptodev_pmd.h> +#include <cryptodev_pmd.h> #ifdef RTE_LIB_SECURITY #include <rte_net_crc.h> #endif
Signature · 1 line
2.17.1
PATCH v3 6/8 crypto/qat: support sgl oop operation
In reply to Kai JiThis patch add-in sgl oop support in qat driver
--- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 28 ++++++++-- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 14 ++++- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 55 +++++++++++++++++--- 3 files changed, 83 insertions(+), 14 deletions(-)
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +24 -4
@@ -467,8 +467,18 @@ qat_sym_dp_enqueue_aead_jobs_gen3(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ;
@@ -564,8 +574,18 @@ qat_sym_dp_enqueue_auth_jobs_gen3(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ; enqueue_one_auth_job_gen3(ctx, cookie, req, &vec->digest[i],
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +12 -2
@@ -295,8 +295,18 @@ qat_sym_dp_enqueue_aead_jobs_gen4(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ;
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +47 -8
80 lines not on this page · raw message
Signature · 1 line
2.17.1
Re: [dpdk-dev] [dpdk-dev v3 6/8] crypto/qat: support sgl oop operation
Quoted 11 lines
-----Original Message-----
From: dev <[email protected]> On Behalf Of Kai Ji
Sent: Tuesday, November 2, 2021 1:49 PM
To: [email protected]
Cc: Ji, Kai <[email protected]>
Subject: [dpdk-dev] [dpdk-dev v3 6/8]crypto/qat: support sgl oop operationThis patch add-in sgl oop support in qat driver
Signed-off-by Kai Ji <[email protected]>---
PATCH v3 7/8 app/test: cryptodev test fix
In reply to Kai Jitest_mixed_auth_cipher: ensure enough space allocate in ibuf & obuf for mbuf to vec conversiontest_kasumi_decryption: cipher length update.
--- app/test/test_cryptodev.c | 58 +++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 12 deletions(-)
app/test/test_cryptodev.c +46 -12
@@ -179,6 +179,10 @@ post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,RTE_CRYPTO_OP_STATUS_ERROR ; } +static struct crypto_testsuite_params testsuite_params = {NULL }; +struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; +static struct crypto_unittest_params unittest_params; + void process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
@@ -193,6 +197,7 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,struct rte_crypto_sgl sgl, dest_sgl;uint32_t max_len;union rte_cryptodev_session_ctx sess; +uint64_t auth_end_iova;uint32_t count =0 ;struct rte_crypto_raw_dp_ctx *ctx; uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
@@ -202,6 +207,9 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,int ctx_service_size;int32_t status =0 ;int enqueue_status, dequeue_status; +struct crypto_unittest_params *ut_params = &unittest_params; +int is_sgl = sop->m_src->nb_segs >1 ; +int is_oop =0 ; ctx_service_size =rte_cryptodev_get_raw_dp_ctx_size (dev_id);if (ctx_service_size <0 ) {
@@ -240,6 +248,9 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, ofs.raw =0 ; +if ((sop->m_dst !=NULL ) && (sop->m_dst != sop->m_src)) + is_oop =1 ; +if (is_cipher && is_auth) { cipher_offset = sop->cipher.data.offset; cipher_len = sop->cipher.data.length;
@@ -267,6 +278,31 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, digest.va = (void *)sop->auth.digest.data; digest.iova = sop->auth.digest.phys_addr; +if (is_sgl) { +uint32_t remaining_off = auth_offset + auth_len; +struct rte_mbuf *sgl_buf = sop->m_src; +if (is_oop) + sgl_buf = sop->m_dst; + +while (remaining_off >=rte_pktmbuf_data_len (sgl_buf) + && sgl_buf->next !=NULL ) { + remaining_off -=rte_pktmbuf_data_len (sgl_buf); + sgl_buf = sgl_buf->next; + } + + auth_end_iova = (uint64_t )rte_pktmbuf_iova_offset ( + sgl_buf, remaining_off); + }else { + auth_end_iova =rte_pktmbuf_iova (op->sym->m_src) + + auth_offset + auth_len; + } +/* Then check if digest-encrypted conditions are met */ +if ((auth_offset + auth_len < cipher_offset + cipher_len) && + (digest.iova == auth_end_iova) && is_sgl) + max_len =RTE_MAX (max_len, + auth_offset + auth_len + + ut_params->auth_xform.auth.digest_length); + }else if (is_cipher) { cipher_offset = sop->cipher.data.offset; cipher_len = sop->cipher.data.length;
@@ -327,7 +363,7 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, sgl.num = n;/* Out of place */ -if (sop->m_dst !=NULL ) { +if (is_oop) { dest_sgl.vec = dest_data_vec; vec.dest_sgl = &dest_sgl; n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
@@ -503,10 +539,6 @@ process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)return op; } -static struct crypto_testsuite_params testsuite_params = {NULL }; -struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; -static struct crypto_unittest_params unittest_params; -static int testsuite_setup (void ) {
@@ -4077,9 +4109,9 @@ test_kasumi_decryption(const struct kasumi_test_data *tdata)/* Create KASUMI operation */ retval =create_wireless_algo_cipher_operation (tdata->cipher_iv.data, - tdata->cipher_iv.len, - tdata->ciphertext.len, - tdata->validCipherOffsetInBits.len); + tdata->cipher_iv.len, +RTE_ALIGN_CEIL (tdata->validCipherLenInBits.len,8 ), + tdata->validCipherOffsetInBits.len);if (retval <0 )return retval;
@@ -7310,6 +7342,7 @@ test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,unsigned int plaintext_len;unsigned int ciphertext_pad_len;unsigned int ciphertext_len; +unsigned int data_len;struct rte_cryptodev_info dev_info;struct rte_crypto_op *op;
@@ -7370,21 +7403,22 @@ test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata, plaintext_len =ceil_byte_length (tdata->plaintext.len_bits); ciphertext_pad_len =RTE_ALIGN_CEIL (ciphertext_len,16 ); plaintext_pad_len =RTE_ALIGN_CEIL (plaintext_len,16 ); + data_len =RTE_MAX (ciphertext_pad_len, plaintext_pad_len);if (verify) { ciphertext = (uint8_t *)rte_pktmbuf_append (ut_params->ibuf, - ciphertext_pad_len); + data_len);memcpy (ciphertext, tdata->ciphertext.data, ciphertext_len);if (op_mode ==OUT_OF_PLACE ) -rte_pktmbuf_append (ut_params->obuf, ciphertext_pad_len); +rte_pktmbuf_append (ut_params->obuf, data_len);debug_hexdump (stdout,"ciphertext:" , ciphertext, ciphertext_len); }else { plaintext = (uint8_t *)rte_pktmbuf_append (ut_params->ibuf, - plaintext_pad_len); + data_len);memcpy (plaintext, tdata->plaintext.data, plaintext_len);if (op_mode ==OUT_OF_PLACE ) -rte_pktmbuf_append (ut_params->obuf, plaintext_pad_len); +rte_pktmbuf_append (ut_params->obuf, data_len);debug_hexdump (stdout,"plaintext:" , plaintext, plaintext_len); }
Signature · 1 line
2.17.1
Re: [dpdk-dev] [dpdk-dev v3 7/8] app/test: cryptodev test fix
Quoted 15 lines
-----Original Message-----
From: dev <[email protected]> On Behalf Of Kai Ji
Sent: Tuesday, November 2, 2021 1:49 PM
To: [email protected]
Cc: Ji, Kai <[email protected]>; De Lara Guarch, Pablo <[email protected]>; [email protected]
Subject: [dpdk-dev] [dpdk-dev v3 7/8] app/test: cryptodev test fix
test_mixed_auth_cipher: ensure enough space allocate in ibuf & obuf for mbuf to vec conversiontest_kasumi_decryption: cipher length update.Fixes 681f540da52b ("cryptodev: do not use AAD in wireless algorithms")
Quoted 6 lines
Fixes e847fc512817 ("test/crypto: add encrypted digest case for AES-CTR-CMAC")
Cc: [email protected]Signed-off-by Kai Ji <[email protected]>---
PATCH v3 8/8 crypto/qat: qat driver rework clean up
In reply to Kai JiThis patch rename back refactor code to qat_sym.c and qat_asym.c, meson build file also updated accordingly.
Integrate qat hw dp apis and qat pmd function to qat_sym.c and qat_asym.c
--- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_device.c | 2 +- drivers/common/qat/qat_qp.c | 4 +- drivers/common/qat/qat_qp.h | 2 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 4 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 4 +- drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 164 +-- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 2 +- drivers/crypto/qat/qat_asym.c | 811 ++++++++------ drivers/crypto/qat/qat_asym.h | 90 +- drivers/crypto/qat/qat_asym_pmd.c | 231 ---- drivers/crypto/qat/qat_asym_pmd.h | 54 - drivers/crypto/qat/qat_asym_refactor.c | 994 ----------------- drivers/crypto/qat/qat_asym_refactor.h | 125 --- drivers/crypto/qat/qat_crypto.h | 5 +- drivers/crypto/qat/qat_sym.c | 1009 ++++++------------ drivers/crypto/qat/qat_sym.h | 141 ++- drivers/crypto/qat/qat_sym_hw_dp.c | 975 ----------------- drivers/crypto/qat/qat_sym_pmd.c | 251 ----- drivers/crypto/qat/qat_sym_pmd.h | 95 -- drivers/crypto/qat/qat_sym_refactor.c | 360 ------- drivers/crypto/qat/qat_sym_refactor.h | 402 ------- drivers/crypto/qat/qat_sym_session.c | 8 +- 23 files changed, 997 insertions(+), 4740 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h delete mode 100644 drivers/crypto/qat/qat_asym_refactor.c delete mode 100644 drivers/crypto/qat/qat_asym_refactor.h delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h delete mode 100644 drivers/crypto/qat/qat_sym_refactor.c delete mode 100644 drivers/crypto/qat/qat_sym_refactor.h
drivers/common/qat/meson.build +2 -2
@@ -70,8 +70,8 @@ if qat_compress endif if qat_crypto - foreach f: ['qat_sym_refactor.c', 'qat_sym_session.c', - 'qat_sym_hw_dp.c', 'qat_asym_refactor.c', 'qat_crypto.c', + foreach f: ['qat_sym.c', 'qat_sym_session.c', + 'qat_asym.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c', 'dev/qat_crypto_pmd_gen2.c',
drivers/common/qat/qat_device.c +1 -1
@@ -8,7 +8,7 @@#include "qat_device.h" #include "adf_transport_access_macros.h" -#include "qat_sym_pmd.h" +#include "qat_sym.h" #include "qat_comp_pmd.h" #include "adf_pf2vf_msg.h" #include "qat_pf2vf.h"
drivers/common/qat/qat_qp.c +2 -2
@@ -15,8 +15,8 @@#include "qat_logs.h" #include "qat_device.h" #include "qat_qp.h" -#include "qat_sym_refactor.h" -#include "qat_asym_refactor.h" +#include "qat_sym.h" +#include "qat_asym.h" #include "qat_comp.h" #define QAT_CQ_MAX_DEQ_RETRIES 10
drivers/common/qat/qat_qp.h +1 -1
@@ -162,7 +162,7 @@ qat_qp_setup(struct qat_pci_device *qat_dev,int qat_qps_per_service (struct qat_pci_device *qat_dev, -enum qat_service_type service); +enum qat_service_type service);const struct qat_qp_hw_data * qat_qp_get_hw_data(struct qat_pci_device *qat_dev,
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym_refactor.h" -#include "qat_asym_refactor.h" +#include "qat_sym.h" +#include "qat_asym.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +2 -2
@@ -5,8 +5,8 @@#include <rte_cryptodev.h> #include <cryptodev_pmd.h> #include "qat_sym_session.h" -#include "qat_sym_refactor.h" -#include "qat_asym_refactor.h" +#include "qat_sym.h" +#include "qat_asym.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +2 -162
182 lines not on this page · raw message
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +1 -1
@@ -13,7 +13,7 @@#include "icp_qat_fw_la.h" #include "qat_sym_session.h" -#include "qat_sym_refactor.h" +#include "qat_sym.h" #include "qat_sym_session.h" #include "qat_crypto.h" #include "qat_crypto_pmd_gens.h"
drivers/crypto/qat/qat_asym.c +483 -328
887 lines not on this page · raw message
drivers/crypto/qat/qat_asym.h +52 -38
123 lines not on this page · raw message
drivers/crypto/qat/qat_asym_pmd.c deleted +0 -231
231 lines not on this page · raw message
drivers/crypto/qat/qat_asym_pmd.h deleted +0 -54
54 lines not on this page · raw message
drivers/crypto/qat/qat_asym_refactor.c deleted +0 -994
994 lines not on this page · raw message
drivers/crypto/qat/qat_asym_refactor.h deleted +0 -125
125 lines not on this page · raw message
drivers/crypto/qat/qat_crypto.h +4 -1
@@ -12,7 +12,10 @@extern uint8_t qat_sym_driver_id;extern uint8_t qat_asym_driver_id; -/** helper macro to set cryptodev capability range **/ +/** +* helper macro to set cryptodev capability range +* <n: name> <l: min > <r: max> <i: increment> <v: value> +**/ #define CAP_RNG (n, l, r, i) .n = {.min = l, .max = r, .increment = i}#define CAP_RNG_ZERO (n) .n = {.min = 0, .max = 0, .increment = 0}
drivers/crypto/qat/qat_sym.c +326 -683
329 lines not on this page · raw message
drivers/crypto/qat/qat_sym.h +115 -26
141 lines not on this page · raw message
drivers/crypto/qat/qat_sym_hw_dp.c deleted +0 -975
975 lines not on this page · raw message
drivers/crypto/qat/qat_sym_pmd.c deleted +0 -251
251 lines not on this page · raw message
drivers/crypto/qat/qat_sym_pmd.h deleted +0 -95
95 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.c deleted +0 -360
360 lines not on this page · raw message
drivers/crypto/qat/qat_sym_refactor.h deleted +0 -402
402 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.17.1
Part of the diff is not shown here. View the raw message.
Quoted 20 lines
-----Original Message-----
From: dev <[email protected]> On Behalf Of Kai Ji
Sent: Tuesday, November 2, 2021 1:49 PM
To: [email protected]
Cc: Ji, Kai <[email protected]>
Subject: [dpdk-dev] [dpdk-dev v3 0/8]drivers/qat: QAT symmetric crypto datapatch reworkThis patch reworks QAT symmetric crypto datapatch implementation where each
generation request building separated and the crypto operation under the raw datapath api implementation are unified.In addtion this patchset also enables QAT OOP support in raw datapath api implementation.
This patch depends on
http://patchwork.dpdk.org/project/dpdk/cover/20211027155055.32264-1-
[email protected]/
Quoted 6 lines
v3:
- sperate a single patch 6 to two different patchesv2:
- review comments addressed
Quoted 8 lines
This patch reworks QAT symmetric crypto datapatch implementation where each
generation request building separated and the crypto operation under the raw datapath api implementation are unified.In addtion this patchset also enables QAT OOP support in raw datapath api implementation.
The patches do not apply cleanly.
Please rebase into a single series.
Rework patch titles as follows
[v7,1/9] common/qat: define gen specific structs and functions [v7,2/9] common/qat: add gen specific device implementation [v7,3/9] common/qat: add gen specific queue pair function [v7,4/9] common/qat: add gen specific queue implementation [v7,5/9] compress/qat: define gen specific structs and functions [v7,6/9] compress/qat: add gen specific implementation [v7,7/9] crypto/qat: unify device private data structure [v7,8/9] crypto/qat: define gen specific structs and functions [v7,9/9] crypto/qat: add gen specific implementation
[v3,1/8] crypto/qat: refactor driver skeleton
[v3,2/8] crypto/qat: refactor symmetric ops
[v3,3/8] crypto/qat: refactor asymmetric ops
[v3,4/8] crypto/qat: rework session APIs
[v3,5/8] crypto/qat: rework data path
[v3,6/8] crypto/qat: support out of place SG list
[v3,7/8] test/crypto: fix ----
The title and description do not show what is happening and what the patch is fixing. [v3,8/8] crypto/qat: rework ----
Can you think of some better title for this one? Also, the description does not specify On what basis rework is done.
Quoted 52 lines
http://patchwork.dpdk.org/project/dpdk/cover/[email protected]/
v3:
- sperate a single patch 6 to two different patchesv2:
- review comments addressedKai Ji (8):
crypro/qat: qat driver refactor skeleton
crypto/qat: qat driver sym op refactor
crypto/qat: qat driver asym op refactor
crypto/qat: qat driver session method rework
crypto/qat: qat driver datapath rework
crypto/qat: support sgl oop operation
app/test: cryptodev test fix
crypto/qat: qat driver rework clean upapp/test/test_cryptodev.c | 58 +- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_device.c | 2 +- drivers/common/qat/qat_qp.c | 40 +- drivers/common/qat/qat_qp.h | 70 +- drivers/compress/qat/qat_comp_pmd.c | 12 +- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 7 + drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 90 ++ drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 487 +++++++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 253 +++++ drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 911 +++++++++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 939 ++++++++++++++++++ drivers/crypto/qat/qat_asym.c | 786 +++++++++------ drivers/crypto/qat/qat_asym.h | 77 +- drivers/crypto/qat/qat_asym_pmd.c | 231 ----- drivers/crypto/qat/qat_asym_pmd.h | 54 - drivers/crypto/qat/qat_crypto.c | 1 + drivers/crypto/qat/qat_crypto.h | 14 +- drivers/crypto/qat/qat_sym.c | 978 ++++++------------ drivers/crypto/qat/qat_sym.h | 141 ++- drivers/crypto/qat/qat_sym_hw_dp.c | 983 ------------------- drivers/crypto/qat/qat_sym_pmd.c | 251 ----- drivers/crypto/qat/qat_sym_pmd.h | 95 -- drivers/crypto/qat/qat_sym_session.c | 114 +-- drivers/crypto/qat/qat_sym_session.h | 8 +- 25 files changed, 3861 insertions(+), 2745 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h--
2.17.1
v4 cover drivers/qat: QAT symmetric crypto datapatch rework
In reply to Kai JiThis patch reworks QAT symmetric crypto datapatch implementation where each generation request building separated and the crypto operation under the raw datapath api implementation are unified.
In addtion this patchset also enables QAT OOP support in raw datapath api implementation.
This patch depends on http://patchwork.dpdk.org/project/dpdk/cover/[email protected]/
v4:
- patchset break down and reconstruct
v3:
- sperate a single patch 6 to two different patches
v2:
- review comments addressed
Kai Ji (11):
common/qat: define build op request and dequeue op crypto/qat: sym build op request specific implementation crypto/qat: rework session APIs
crypto/qat: asym build op request specific implementation crypto/qat: unify sym pmd apis
crypto/qat: unify qat asym pmd apis
crypto/qat: op burst data path rework compress/qat: comp dequeue burst update crypto/qat: raw dp api integration
crypto/qat: support out of place SG list test/cryptodev: fix incomplete data length
app/test/test_cryptodev.c | 27 +- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_device.c | 2 +- drivers/common/qat/qat_qp.c | 40 +- drivers/common/qat/qat_qp.h | 70 +- drivers/compress/qat/qat_comp_pmd.c | 12 +- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 7 + drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 91 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 487 +++++++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 253 +++++ drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 911 +++++++++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 939 ++++++++++++++++++ drivers/crypto/qat/qat_asym.c | 762 ++++++++------ drivers/crypto/qat/qat_asym.h | 77 +- drivers/crypto/qat/qat_asym_pmd.c | 231 ----- drivers/crypto/qat/qat_asym_pmd.h | 54 - drivers/crypto/qat/qat_crypto.c | 1 + drivers/crypto/qat/qat_crypto.h | 14 +- drivers/crypto/qat/qat_sym.c | 978 ++++++------------ drivers/crypto/qat/qat_sym.h | 141 ++- drivers/crypto/qat/qat_sym_hw_dp.c | 983 ------------------- drivers/crypto/qat/qat_sym_pmd.c | 251 ----- drivers/crypto/qat/qat_sym_pmd.h | 95 -- drivers/crypto/qat/qat_sym_session.c | 114 +-- drivers/crypto/qat/qat_sym_session.h | 8 +- 25 files changed, 3820 insertions(+), 2732 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h
--
2.17.1
PATCH v4 1/11 common/qat: define build op request and dequeue op
This patch introduce build request op and dequeue op function pointers to qat queue pair implementation. Those two functions are used to be assigned during qat session generation based on crypto operation
--- drivers/common/qat/qat_qp.c | 8 +++-- drivers/common/qat/qat_qp.h | 52 ++++++++++++++++++++++++++-- drivers/compress/qat/qat_comp_pmd.c | 2 +- drivers/crypto/qat/qat_asym_pmd.c | 4 +-- drivers/crypto/qat/qat_sym_pmd.c | 4 +-- drivers/crypto/qat/qat_sym_session.h | 6 ++++ 6 files changed, 67 insertions(+), 9 deletions(-)
drivers/common/qat/qat_qp.c +6 -2
@@ -550,7 +550,9 @@ adf_modulo(uint32_t data, uint32_t modulo_mask) }uint16_t -qat_enqueue_op_burst (void *qp,void **ops,uint16_t nb_ops) +qat_enqueue_op_burst (void *qp, + __rte_unused qat_op_build_request_t op_build_request, +void **ops,uint16_t nb_ops) { registerstruct qat_queue *queue;struct qat_qp *tmp_qp = (struct qat_qp *)qp;
@@ -817,7 +819,9 @@ qat_enqueue_comp_op_burst(void *qp, void **ops, uint16_t nb_ops) }uint16_t -qat_dequeue_op_burst (void *qp,void **ops,uint16_t nb_ops) +qat_dequeue_op_burst (void *qp,void **ops, + __rte_unused qat_op_dequeue_t qat_dequeue_process_response, +uint16_t nb_ops) {struct qat_queue *rx_queue;struct qat_qp *tmp_qp = (struct qat_qp *)qp;
drivers/common/qat/qat_qp.h +50 -2
75 lines not on this page · raw message
drivers/compress/qat/qat_comp_pmd.c +1 -1
@@ -620,7 +620,7 @@ static uint16_t qat_comp_pmd_dequeue_first_op_burst(void *qp, struct rte_comp_op **ops, uint16_t nb_ops) { -uint16_t ret =qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +uint16_t ret =qat_dequeue_op_burst (qp, (void **)ops,NULL , nb_ops);struct qat_qp *tmp_qp = (struct qat_qp *)qp;if (ret) {
drivers/crypto/qat/qat_asym_pmd.c +2 -2
@@ -62,13 +62,13 @@ static struct rte_cryptodev_ops crypto_qat_ops = {uint16_t qat_asym_pmd_enqueue_op_burst (void *qp,struct rte_crypto_op **ops,uint16_t nb_ops) { -return qat_enqueue_op_burst (qp, (void **)ops, nb_ops); +return qat_enqueue_op_burst (qp,NULL , (void **)ops, nb_ops); }uint16_t qat_asym_pmd_dequeue_op_burst (void *qp,struct rte_crypto_op **ops,uint16_t nb_ops) { -return qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +return qat_dequeue_op_burst (qp, (void **)ops,NULL , nb_ops); }/* An rte_driver is needed in the registration of both the device and the driver
drivers/crypto/qat/qat_sym_pmd.c +2 -2
@@ -49,14 +49,14 @@ static uint16_t qat_sym_pmd_enqueue_op_burst(void *qp, struct rte_crypto_op **ops, uint16_t nb_ops) { -return qat_enqueue_op_burst (qp, (void **)ops, nb_ops); +return qat_enqueue_op_burst (qp,NULL , (void **)ops, nb_ops); }static uint16_t qat_sym_pmd_dequeue_op_burst (void *qp,struct rte_crypto_op **ops,uint16_t nb_ops) { -return qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +return qat_dequeue_op_burst (qp, (void **)ops,NULL , nb_ops); }/* An rte_driver is needed in the registration of both the device and the driver
drivers/crypto/qat/qat_sym_session.h +6 -0
@@ -63,6 +63,11 @@ enum qat_sym_proto_flag {QAT_CRYPTO_PROTO_FLAG_ZUC =4 }; +struct qat_sym_session ; + +typedef int (*qat_sym_build_request_t )(void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); +/* Common content descriptor */ struct qat_sym_cd {struct icp_qat_hw_cipher_algo_blk cipher;
@@ -107,6 +112,7 @@ struct qat_sym_session {/* Some generations need different setup of counter */ uint32_t slice_types;enum qat_sym_proto_flag qat_proto_flag; +qat_sym_build_request_t build_request[2 ]; };int
Signature · 1 line
2.17.1
PATCH v4 2/11 crypto/qat: sym build op request specific implementation
In reply to Kai JiThis patch add-in specific symmetric crypto build op request function pointer implementation for QAT generation 1
--- drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 830 +++++++++++++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 186 +++++ 2 files changed, 1016 insertions(+)
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +830 -0
@@ -8,14 +8,844 @@#include <rte_cryptodev.h> #include "qat_crypto.h" #include "qat_sym_session.h" +#include "qat_sym.h" + +#define QAT_SYM_DP_GET_MAX_ENQ (q, c, n) \ + RTE_MIN((q->max_inflights - q->enqueued + q->dequeued - c), n) + +#define QAT_SYM_DP_IS_RESP_SUCCESS (resp) \ + (ICP_QAT_FW_COMN_STATUS_FLAG_OK == \ + ICP_QAT_FW_COMN_RESP_CRYPTO_STAT_GET(resp->comn_hdr.comn_status)) + +static __rte_always_inline int +op_bpi_cipher_decrypt (uint8_t *src,uint8_t *dst, +uint8_t *iv,int ivlen,int srclen, +void *bpi_ctx) +{ +EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX *)bpi_ctx; +int encrypted_ivlen; +uint8_t encrypted_iv[BPI_MAX_ENCR_IV_LEN ]; +uint8_t *encr = encrypted_iv; + +/* ECB method: encrypt (not decrypt!) the IV, then XOR with plaintext */ +if (EVP_EncryptUpdate (ctx, encrypted_iv, &encrypted_ivlen, iv, ivlen) + <=0 ) + goto cipher_decrypt_err; + +for (; srclen !=0 ; --srclen, ++dst, ++src, ++encr) + *dst = *src ^ *encr; + +return 0 ; + +cipher_decrypt_err: +QAT_DP_LOG (ERR ,"libcrypto ECB cipher decrypt for BPI IV failed" ); +return -EINVAL ; +} + +static __rte_always_inline uint32_t +qat_bpicipher_preprocess (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +int block_len =qat_cipher_get_block_size (ctx->qat_cipher_alg); +struct rte_crypto_sym_op *sym_op = op->sym; +uint8_t last_block_len = block_len >0 ? + sym_op->cipher.data.length % block_len :0 ; + +if (last_block_len && ctx->qat_dir ==ICP_QAT_HW_CIPHER_DECRYPT ) { +/* Decrypt last block */ +uint8_t *last_block, *dst, *iv; +uint32_t last_block_offset = sym_op->cipher.data.offset + + sym_op->cipher.data.length - last_block_len; + last_block = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_src, + uint8_t *, last_block_offset); + +if (unlikely ((sym_op->m_dst !=NULL ) + && (sym_op->m_dst != sym_op->m_src))) +/* out-of-place operation (OOP) */ + dst = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_dst, + uint8_t *, last_block_offset); +else + dst = last_block; + +if (last_block_len < sym_op->cipher.data.length) +/* use previous block ciphertext as IV */ + iv = last_block - block_len; +else +/* runt block, i.e. less than one full block */ + iv = rte_crypto_op_ctod_offset(op, uint8_t *, + ctx->cipher_iv.offset); + +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src before pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst before pre-process:" , + dst, last_block_len); +#endif +op_bpi_cipher_decrypt (last_block, dst, iv, block_len, + last_block_len, ctx->bpi_ctx); +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src after pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst after pre-process:" , + dst, last_block_len); +#endif + } + +return sym_op->cipher.data.length - last_block_len; +} + +static __rte_always_inline int +qat_chk_len_in_bits_auth (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 ) { +if (unlikely ((op->sym->auth.data.offset %BYTE_LENGTH !=0 ) || + (op->sym->auth.data.length %BYTE_LENGTH !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int +qat_chk_len_in_bits_cipher (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_KASUMI || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ) { +if (unlikely ((op->sym->cipher.data.length %BYTE_LENGTH !=0 ) || + ((op->sym->cipher.data.offset % +BYTE_LENGTH ) !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int32_t +qat_sym_build_req_set_data (struct icp_qat_fw_la_bulk_req *req, +void *opaque,struct qat_sym_op_cookie *cookie, +struct rte_crypto_vec *src_vec,uint16_t n_src, +struct rte_crypto_vec *dst_vec,uint16_t n_dst) +{ +struct qat_sgl *list; +uint32_t i; +uint32_t tl_src =0 , total_len_src, total_len_dst; +uint64_t src_data_start =0 , dst_data_start =0 ; +int is_sgl = n_src >1 || n_dst >1 ; + +if (unlikely (n_src <1 || n_src >QAT_SYM_SGL_MAX_NUMBER || + n_dst >QAT_SYM_SGL_MAX_NUMBER )) +return -1 ; + +if (likely (!is_sgl)) { + src_data_start = src_vec[0 ].iova; + tl_src = total_len_src = + src_vec[0 ].len; +if (unlikely (n_dst)) {/* oop */ + total_len_dst = dst_vec[0 ].len; + + dst_data_start = dst_vec[0 ].iova; +if (unlikely (total_len_src != total_len_dst)) +return -EINVAL ; + }else { + dst_data_start = src_data_start; + total_len_dst = tl_src; + } + }else {/* sgl */ + total_len_dst = total_len_src =0 ; + +ICP_QAT_FW_COMN_PTR_TYPE_SET (req->comn_hdr.comn_req_flags, +QAT_COMN_PTR_TYPE_SGL ); + + list = (struct qat_sgl *)&cookie->qat_sgl_src; +for (i =0 ; i < n_src; i++) { + list->buffers[i].len = src_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = src_vec[i].iova; +if (tl_src + src_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -1 ; + } + tl_src += src_vec[i].len; + } + + list->num_bufs = i; + src_data_start = cookie->qat_sgl_src_phys_addr; + +if (unlikely (n_dst >0 )) {/* oop sgl */ +uint32_t tl_dst =0 ; + + list = (struct qat_sgl *)&cookie->qat_sgl_dst; + +for (i =0 ; i < n_dst; i++) { + list->buffers[i].len = dst_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = dst_vec[i].iova; +if (tl_dst + dst_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -ENOTSUP ; + } + + tl_dst += dst_vec[i].len; + } + +if (tl_src != tl_dst) +return -EINVAL ; + list->num_bufs = i; + dst_data_start = cookie->qat_sgl_dst_phys_addr; + }else + dst_data_start = src_data_start; + } + + req->comn_mid.src_data_addr = src_data_start; + req->comn_mid.dest_data_addr = dst_data_start; + req->comn_mid.src_length = total_len_src; + req->comn_mid.dst_length = total_len_dst; + req->comn_mid.opaque_data = (uintptr_t )opaque; + +return tl_src; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_cipher (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, + struct rte_crypto_va_iova_ptr *auth_iv_or_aad __rte_unused, + struct rte_crypto_va_iova_ptr *digest __rte_unused) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int n_src =0 ; +int ret; + + ret =qat_chk_len_in_bits_cipher (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->cipher.data.length >>3 ; + cipher_ofs = op->sym->cipher.data.offset >>3 ; +break ; +case 0 : +if (ctx->bpi_ctx) { +/* DOCSIS - only send complete blocks to device. +* Process any partial block using CFB mode. +* Even if 0 complete blocks, still send this to device +* to get into rx queue for post-process and dequeuing +*/ + cipher_len =qat_bpicipher_preprocess (ctx, op); + cipher_ofs = op->sym->cipher.data.offset; + }else { + cipher_len = op->sym->cipher.data.length; + cipher_ofs = op->sym->cipher.data.offset; + } +break ; +default : +QAT_DP_LOG (ERR , +"SNOW3G/KASUMI/ZUC in QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, + cipher_len, in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if ((n_dst <0 ) || (n_dst > op->sym->m_dst->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_auth (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, + struct rte_crypto_va_iova_ptr *cipher_iv __rte_unused, +struct rte_crypto_va_iova_ptr *auth_iv, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t auth_ofs =0 , auth_len =0 ; +int n_src, ret; + + ret =qat_chk_len_in_bits_auth (ctx, op); +switch (ret) { +case 1 : + auth_ofs = op->sym->auth.data.offset >>3 ; + auth_len = op->sym->auth.data.length >>3 ; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); +break ; +case 0 : +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_128 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_64 ) { +/* AES-GMAC */ + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + }else { + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va =NULL ; + auth_iv->iova =0 ; + } +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, auth_ofs, + auth_ofs + auth_len, in_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, auth_ofs, + auth_ofs + auth_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if ((n_dst <0 ) || (n_dst > op->sym->m_dst->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_chain (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +union rte_crypto_sym_ofs ofs; +uint32_t min_ofs =0 , max_len =0 ; +uint32_t cipher_len =0 , cipher_ofs =0 ; +uint32_t auth_len =0 , auth_ofs =0 ; +int is_oop = (op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src); +int is_sgl = op->sym->m_src->nb_segs >1 ; +int n_src; +int ret; + +if (unlikely (is_oop)) + is_sgl |= op->sym->m_dst->nb_segs >1 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv_or_aad->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + + ret =qat_chk_len_in_bits_cipher (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->aead.data.length >>3 ; + cipher_ofs = op->sym->aead.data.offset >>3 ; +break ; +case 0 : + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + ret =qat_chk_len_in_bits_auth (ctx, op); +switch (ret) { +case 1 : + auth_len = op->sym->auth.data.length >>3 ; + auth_ofs = op->sym->auth.data.offset >>3 ; +break ; +case 0 : + auth_len = op->sym->auth.data.length; + auth_ofs = op->sym->auth.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + min_ofs = cipher_ofs < auth_ofs ? cipher_ofs : auth_ofs; + max_len =RTE_MAX (cipher_ofs + cipher_len, auth_ofs + auth_len); + +/* digest in buffer check. Needed only for wireless algos */ +if (ret ==1 ) { +/* Handle digest-encrypted cases, i.e. +* auth-gen-then-cipher-encrypt and +* cipher-decrypt-then-auth-verify +*/ +uint64_t auth_end_iova; + +if (unlikely (is_sgl)) { +uint32_t remaining_off = auth_ofs + auth_len; +struct rte_mbuf *sgl_buf = (is_oop ? op->sym->m_dst : + op->sym->m_src); + +while (remaining_off >=rte_pktmbuf_data_len (sgl_buf) + && sgl_buf->next !=NULL ) { + remaining_off -=rte_pktmbuf_data_len (sgl_buf); + sgl_buf = sgl_buf->next; + } + + auth_end_iova = (uint64_t )rte_pktmbuf_iova_offset ( + sgl_buf, remaining_off); + }else + auth_end_iova = (is_oop ? +rte_pktmbuf_iova (op->sym->m_dst) : +rte_pktmbuf_iova (op->sym->m_src)) + auth_ofs + + auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_ofs + auth_len < cipher_ofs + cipher_len) && + (digest->iova == auth_end_iova)) + max_len =RTE_MAX (max_len, auth_ofs + auth_len + + ctx->digest_length); + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, min_ofs, max_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (unlikely (n_src <0 || n_src > op->sym->m_src->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + in_sgl->num = n_src; + +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, min_ofs, + max_len, out_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + ofs.ofs.cipher.head = cipher_ofs; + ofs.ofs.cipher.tail = max_len - cipher_ofs - cipher_len; + ofs.ofs.auth.head = auth_ofs; + ofs.ofs.auth.tail = max_len - auth_ofs - auth_len; + +return ofs.raw; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_aead (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int32_t n_src =0 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = (void *)op->sym->aead.aad.data; + auth_iv_or_aad->iova = op->sym->aead.aad.phys_addr; + digest->va = (void *)op->sym->aead.digest.data; + digest->iova = op->sym->aead.digest.phys_addr; + + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, cipher_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline void +qat_set_cipher_iv (struct icp_qat_fw_la_cipher_req_params *cipher_param, +struct rte_crypto_va_iova_ptr *iv_ptr,uint32_t iv_len, +struct icp_qat_fw_la_bulk_req *qat_req) +{ +/* copy IV into request if it fits */ +if (iv_len <=sizeof (cipher_param->u.cipher_IV_array)) +rte_memcpy (cipher_param->u.cipher_IV_array, iv_ptr->va, + iv_len); +else { +ICP_QAT_FW_LA_CIPH_IV_FLD_FLAG_SET ( + qat_req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_CIPH_IV_64BIT_PTR ); + cipher_param->u.s.cipher_IV_ptr = iv_ptr->iova; + } +} + +static __rte_always_inline void +qat_sym_dp_fill_vec_status (int32_t *sta,int status,uint32_t n) +{ +uint32_t i; + +for (i =0 ; i < n; i++) + sta[i] = status; +} + +static __rte_always_inline void +enqueue_one_cipher_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + +/* cipher IV */ +qat_set_cipher_iv (cipher_param, iv, ctx->cipher_iv.length, req); + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; +} + +static __rte_always_inline void +enqueue_one_auth_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = data_len - ofs.ofs.auth.head - + ofs.ofs.auth.tail; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, auth_iv->va, + ctx->auth_iv.length); +break ; +default : +break ; + } +} + +static __rte_always_inline int +enqueue_one_chain_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_vec *src_vec, +uint16_t n_src_vecs, +struct rte_crypto_vec *dst_vec, +uint16_t n_dst_vecs, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; +struct rte_crypto_vec *cvec = n_dst_vecs >0 ? + dst_vec : src_vec; +rte_iova_t auth_iova_end; +int cipher_len, auth_len; +int is_sgl = n_src_vecs >1 || n_dst_vecs >1 ; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + cipher_len = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_len = data_len - ofs.ofs.auth.head - ofs.ofs.auth.tail; + +if (unlikely (cipher_len <0 || auth_len <0 )) +return -1 ; + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = cipher_len; +qat_set_cipher_iv (cipher_param, cipher_iv, ctx->cipher_iv.length, req); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = auth_len; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +break ; +default : +break ; + } + +if (unlikely (is_sgl)) { +/* sgl */ +int i = n_dst_vecs ? n_dst_vecs : n_src_vecs; +uint32_t remaining_off = data_len - ofs.ofs.auth.tail; + +while (remaining_off >= cvec->len && i >=1 ) { + i--; + remaining_off -= cvec->len; + cvec++; + } + + auth_iova_end = cvec->iova + remaining_off; + }else + auth_iova_end = cvec[0 ].iova + auth_param->auth_off + + auth_param->auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_param->auth_off + auth_param->auth_len < + cipher_param->cipher_offset + cipher_param->cipher_length) && + (digest->iova == auth_iova_end)) { +/* Handle partial digest encryption */ +if (cipher_param->cipher_offset + cipher_param->cipher_length < + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length && !is_sgl) + req->comn_mid.dst_length = req->comn_mid.src_length = + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length; +struct icp_qat_fw_comn_req_hdr *header = &req->comn_hdr; +ICP_QAT_FW_LA_DIGEST_IN_BUFFER_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_DIGEST_IN_BUFFER ); + } + +return 0 ; +} + +static __rte_always_inline void +enqueue_one_aead_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param = + (void *)&req->serv_specif_rqpars; +struct icp_qat_fw_la_auth_req_params *auth_param = + (void *)((uint8_t *)&req->serv_specif_rqpars + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); +uint8_t *aad_data; +uint8_t aad_ccm_real_len; +uint8_t aad_len_field_sz; +uint32_t msg_len_be; +rte_iova_t aad_iova =0 ; +uint8_t q; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, iv->va, + ctx->cipher_iv.length); + aad_iova = aad->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_AES_CBC_MAC : + aad_data = aad->va; + aad_iova = aad->iova; + aad_ccm_real_len =0 ; + aad_len_field_sz =0 ; + msg_len_be =rte_bswap32 ((uint32_t )data_len - + ofs.ofs.cipher.head); + +if (ctx->aad_len >ICP_QAT_HW_CCM_AAD_DATA_OFFSET ) { + aad_len_field_sz =ICP_QAT_HW_CCM_AAD_LEN_INFO ; + aad_ccm_real_len = ctx->aad_len - +ICP_QAT_HW_CCM_AAD_B0_LEN - +ICP_QAT_HW_CCM_AAD_LEN_INFO ; + }else { + aad_data = iv->va; + aad_iova = iv->iova; + } + + q =ICP_QAT_HW_CCM_NQ_CONST - ctx->cipher_iv.length; + aad_data[0 ] =ICP_QAT_HW_CCM_BUILD_B0_FLAGS ( + aad_len_field_sz, ctx->digest_length, q); +if (q >ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ) { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET + (q - +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ), + (uint8_t *)&msg_len_be, +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ); + }else { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)&msg_len_be + + (ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE + - q), q); + } + +if (aad_len_field_sz >0 ) { + *(uint16_t *)&aad_data[ICP_QAT_HW_CCM_AAD_B0_LEN ] = +rte_bswap16 (aad_ccm_real_len); + +if ((aad_ccm_real_len + aad_len_field_sz) + %ICP_QAT_HW_CCM_AAD_B0_LEN ) { +uint8_t pad_len =0 ; +uint8_t pad_idx =0 ; + + pad_len =ICP_QAT_HW_CCM_AAD_B0_LEN - + ((aad_ccm_real_len + + aad_len_field_sz) % +ICP_QAT_HW_CCM_AAD_B0_LEN ); + pad_idx =ICP_QAT_HW_CCM_AAD_B0_LEN + + aad_ccm_real_len + + aad_len_field_sz; +memset (&aad_data[pad_idx],0 , pad_len); + } + } + +rte_memcpy (((uint8_t *)cipher_param->u.cipher_IV_array) + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , ctx->cipher_iv.length); + *(uint8_t *)&cipher_param->u.cipher_IV_array[0 ] = + q -ICP_QAT_HW_CCM_NONCE_OFFSET ; + +rte_memcpy ((uint8_t *)aad->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va +ICP_QAT_HW_CCM_NONCE_OFFSET , + ctx->cipher_iv.length); +break ; +default : +break ; + } + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_param->auth_off = ofs.ofs.cipher.head; + auth_param->auth_len = cipher_param->cipher_length; + auth_param->auth_res_addr = digest->iova; + auth_param->u1.aad_adr = aad_iova; +}extern struct rte_cryptodev_ops qat_sym_crypto_ops_gen1;extern struct rte_cryptodev_ops qat_asym_crypto_ops_gen1; +/* -----------------GEN 1 sym crypto op data path APIs ---------------- */ +int +qat_sym_build_op_cipher_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_auth_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_aead_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_chain_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); +/* -----------------GENx control path APIs ---------------- */ uint64_t qat_sym_crypto_feature_flags_get_gen1 (struct qat_pci_device *qat_dev); +int +qat_sym_crypto_set_session_gen1 (void *cryptodev,void *session); +void qat_sym_session_set_ext_hash_flags_gen2 (struct qat_sym_session *session,uint8_t hash_flag);
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +186 -0
192 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v4 3/11 crypto/qat: rework session APIs
In reply to Kai JiThe patch introduce set_session methods to qat gen dev ops Replace min_qat_dev_gen_id with dev_id, the session will become invalid if the device generation id is not matching during session init and crypto ops
--- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 87 ++++++- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 253 +++++++++++++++++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 121 +++++++++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 62 +++++ drivers/crypto/qat/qat_crypto.c | 1 + drivers/crypto/qat/qat_crypto.h | 5 + drivers/crypto/qat/qat_sym.c | 8 +- drivers/crypto/qat/qat_sym_session.c | 106 +------- drivers/crypto/qat/qat_sym_session.h | 2 +- 9 files changed, 544 insertions(+), 101 deletions(-)
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +86 -1
@@ -166,6 +166,90 @@ qat_sym_crypto_qp_setup_gen2(struct rte_cryptodev *dev, uint16_t qp_id,return 0 ; } +void +qat_sym_session_set_ext_hash_flags_gen2 (struct qat_sym_session *session, +uint8_t hash_flag) +{ +struct icp_qat_fw_comn_req_hdr *header = &session->fw_req.comn_hdr; +struct icp_qat_fw_cipher_auth_cd_ctrl_hdr *cd_ctrl = + (struct icp_qat_fw_cipher_auth_cd_ctrl_hdr *) + session->fw_req.cd_ctrl.content_desc_ctrl_lw; + +/* Set the Use Extended Protocol Flags bit in LW 1 */ +QAT_FIELD_SET (header->comn_req_flags, +QAT_COMN_EXT_FLAGS_USED , +QAT_COMN_EXT_FLAGS_BITPOS , +QAT_COMN_EXT_FLAGS_MASK ); + +/* Set Hash Flags in LW 28 */ + cd_ctrl->hash_flags |= hash_flag; + +/* Set proto flags in LW 1 */ +switch (session->qat_cipher_alg) { +case ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_SNOW_3G_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags,0 ); +break ; +case ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_NO_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags, +ICP_QAT_FW_LA_ZUC_3G_PROTO ); +break ; +default : +ICP_QAT_FW_LA_PROTO_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_NO_PROTO ); +ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET ( + header->serv_specif_flags,0 ); +break ; + } +} + +static int +qat_sym_crypto_set_session_gen2 (void *cdev,void *session) +{ +struct rte_cryptodev *dev = cdev; +struct qat_sym_session *ctx = session; +const struct qat_cryptodev_private *qat_private = + dev->data->dev_private; +int ret; + + ret =qat_sym_crypto_set_session_gen1 (cdev, session); +if (ret ==0 || ret != -ENOTSUP ) +return ret; + +/* GEN1 returning -ENOTSUP as it cannot handle some mixed algo, +* but some are not supported by GEN2, so checking here +*/ +if ((qat_private->internal_capabilities & +QAT_SYM_CAP_MIXED_CRYPTO ) ==0 ) +return -ENOTSUP ; + +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 && + ctx->qat_cipher_alg != +ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx, +1 <<ICP_QAT_FW_AUTH_HDR_FLAG_ZUC_EIA3_BITPOS ); + }else if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 && + ctx->qat_cipher_alg != +ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 ) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx, +1 <<ICP_QAT_FW_AUTH_HDR_FLAG_SNOW3G_UIA2_BITPOS ); + }else if ((ctx->aes_cmac || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_NULL ) && + (ctx->qat_cipher_alg == +ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 || + ctx->qat_cipher_alg == +ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 )) { +qat_sym_session_set_ext_hash_flags_gen2 (ctx,0 ); + } + +return 0 ; +} +struct rte_cryptodev_ops qat_sym_crypto_ops_gen2 = {/* Device related operations */
@@ -204,9 +288,10 @@ RTE_INIT(qat_sym_crypto_gen2_init) qat_sym_gen_dev_ops[QAT_GEN2 ].cryptodev_ops = &qat_sym_crypto_ops_gen2; qat_sym_gen_dev_ops[QAT_GEN2 ].get_capabilities = qat_sym_crypto_cap_get_gen2; + qat_sym_gen_dev_ops[QAT_GEN2 ].set_session = + qat_sym_crypto_set_session_gen2; qat_sym_gen_dev_ops[QAT_GEN2 ].get_feature_flags = qat_sym_crypto_feature_flags_get_gen1; -#ifdef RTE_LIB_SECURITY qat_sym_gen_dev_ops[QAT_GEN2 ].create_security_ctx = qat_sym_create_security_gen1;
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +253 -0
269 lines not on this page · raw message
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +121 -0
136 lines not on this page · raw message
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +62 -0
80 lines not on this page · raw message
drivers/crypto/qat/qat_crypto.c +1 -0
@@ -2,6 +2,7 @@* Copyright(c) 2021 Intel Corporation */ +#include <cryptodev_pmd.h> #include "qat_device.h" #include "qat_qp.h" #include "qat_crypto.h"
drivers/crypto/qat/qat_crypto.h +5 -0
@@ -48,15 +48,20 @@ typedef uint64_t (*get_feature_flags_t)(struct qat_pci_device *qat_dev);typedef void * (*create_security_ctx_t )(void *cryptodev); +typedef int (*set_session_t )(void *cryptodev,void *session); +struct qat_crypto_gen_dev_ops {get_feature_flags_t get_feature_flags;get_capabilities_info_t get_capabilities;struct rte_cryptodev_ops *cryptodev_ops; +set_session_t set_session;#ifdef RTE_LIB_SECURITY create_security_ctx_t create_security_ctx;#endif }; +extern struct qat_crypto_gen_dev_ops qat_sym_gen_dev_ops[]; +int qat_cryptodev_config (struct rte_cryptodev *dev,struct rte_cryptodev_config *config);
drivers/crypto/qat/qat_sym.c +1 -7
@@ -212,7 +212,7 @@ handle_spc_gmac(struct qat_sym_session *ctx, struct rte_crypto_op *op,int qat_sym_build_request (void *in_op,uint8_t *out_msg, -void *op_cookie,enum qat_device_gen qat_dev_gen) + void *op_cookie, __rte_unused enum qat_device_gen qat_dev_gen) {int ret =0 ;struct qat_sym_session *ctx =NULL ;
@@ -277,12 +277,6 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg,return -EINVAL ; } -if (unlikely (ctx->min_qat_dev_gen > qat_dev_gen)) { -QAT_DP_LOG (ERR ,"Session alg not supported on this device gen" ); - op->status =RTE_CRYPTO_OP_STATUS_INVALID_SESSION ; -return -EINVAL ; - } - qat_req = (struct icp_qat_fw_la_bulk_req *)out_msg;rte_mov128 ((uint8_t *)qat_req, (const uint8_t *)&(ctx->fw_req)); qat_req->comn_mid.opaque_data = (uint64_t )(uintptr_t )op;
drivers/crypto/qat/qat_sym_session.c +14 -92
186 lines not on this page · raw message
drivers/crypto/qat/qat_sym_session.h +1 -1
@@ -100,7 +100,7 @@ struct qat_sym_session {uint16_t auth_key_length;uint16_t digest_length;rte_spinlock_t lock;/* protects this struct */ -enum qat_device_gen min_qat_dev_gen; +uint16_t dev_id;uint8_t aes_cmac;uint8_t is_single_pass;uint8_t is_single_pass_gmac;
Signature · 1 line
2.17.1
PATCH v4 4/11 crypto/qat: asym build op request specific implementation
In reply to Kai JiThis patch add-in specific asymmetric crypto session and build op request implementation for QAT generations
--- drivers/common/qat/qat_qp.c | 5 +- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 7 + drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 3 + drivers/crypto/qat/qat_asym.c | 620 ++++++++++--------- drivers/crypto/qat/qat_asym.h | 65 +- 5 files changed, 389 insertions(+), 311 deletions(-)
drivers/common/qat/qat_qp.c +3 -2
@@ -622,7 +622,7 @@ qat_enqueue_op_burst(void *qp,#ifdef BUILD_QAT_ASYM ret =qat_asym_build_request (*ops, base_addr + tail, tmp_qp->op_cookies[tail >> queue->trailz], - tmp_qp->qat_dev_gen); +NULL , tmp_qp->qat_dev_gen);#endif }if (ret !=0 ) {
@@ -850,7 +850,8 @@ qat_dequeue_op_burst(void *qp, void **ops,#ifdef BUILD_QAT_ASYM else if (tmp_qp->service_type == QAT_SERVICE_ASYMMETRIC)qat_asym_process_response (ops, resp_msg, - tmp_qp->op_cookies[head >> rx_queue->trailz]); + tmp_qp->op_cookies[head >> rx_queue->trailz], + NULL); #endif head = adf_modulo(head + rx_queue->msg_size,
drivers/crypto/qat/dev/qat_asym_pmd_gen1.c +7 -0
@@ -65,6 +65,13 @@ qat_asym_crypto_feature_flags_get_gen1(return feature_flags; } +int +qat_asym_crypto_set_session_gen1(void *cdev __rte_unused, + void *session __rte_unused) +{ +return 0 ; +} +RTE_INIT (qat_asym_crypto_gen1_init) { qat_asym_gen_dev_ops[QAT_GEN1].cryptodev_ops =
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +3 -0
@@ -853,6 +853,9 @@ qat_sym_session_set_ext_hash_flags_gen2(struct qat_sym_session *session,struct qat_capabilities_info qat_asym_crypto_cap_get_gen1 (struct qat_pci_device *qat_dev); +int +qat_asym_crypto_set_session_gen1 (void *cryptodev,void *session); +uint64_t qat_asym_crypto_feature_flags_get_gen1 (struct qat_pci_device *qat_dev);
drivers/crypto/qat/qat_asym.c +316 -304
665 lines not on this page · raw message
drivers/crypto/qat/qat_asym.h +60 -5
97 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v4 5/11 crypto/qat: unify sym pmd apis
In reply to Kai JiThis patch integrate all the functions from qat_sym_pmd.c into qat_sym.c, The integration unify the sym crypto pmd apis and should make it easier for furture maintains
--- drivers/common/qat/meson.build | 2 +- drivers/common/qat/qat_device.c | 2 +- drivers/common/qat/qat_qp.c | 3 +- drivers/crypto/qat/qat_sym.c | 24 +++ drivers/crypto/qat/qat_sym.h | 141 +++++++++++++-- drivers/crypto/qat/qat_sym_hw_dp.c | 9 - drivers/crypto/qat/qat_sym_pmd.c | 251 --------------------------- drivers/crypto/qat/qat_sym_pmd.h | 95 ---------- drivers/crypto/qat/qat_sym_session.c | 2 +- 9 files changed, 158 insertions(+), 371 deletions(-) delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h
drivers/common/qat/meson.build +1 -1
@@ -70,7 +70,7 @@ if qat_compress endif if qat_crypto - foreach f: ['qat_sym_pmd.c', 'qat_sym.c', 'qat_sym_session.c', + foreach f: ['qat_sym.c', 'qat_sym_session.c', 'qat_sym_hw_dp.c', 'qat_asym_pmd.c', 'qat_asym.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c',
drivers/common/qat/qat_device.c +1 -1
@@ -8,7 +8,7 @@#include "qat_device.h" #include "adf_transport_access_macros.h" -#include "qat_sym_pmd.h" +#include "qat_sym.h" #include "qat_comp_pmd.h" #include "adf_pf2vf_msg.h" #include "qat_pf2vf.h"
drivers/common/qat/qat_qp.c +2 -1
@@ -841,7 +841,8 @@ qat_dequeue_op_burst(void *qp, void **ops,if (tmp_qp->service_type ==QAT_SERVICE_SYMMETRIC )qat_sym_process_response (ops, resp_msg, - tmp_qp->op_cookies[head >> rx_queue->trailz]); + tmp_qp->op_cookies[head >> rx_queue->trailz], +NULL );else if (tmp_qp->service_type ==QAT_SERVICE_COMPRESSION ) nb_fw_responses = qat_comp_process_response( ops, resp_msg,
drivers/crypto/qat/qat_sym.c +24 -0
@@ -12,6 +12,30 @@#include "qat_sym.h" +uint8_t qat_sym_driver_id; + +struct qat_crypto_gen_dev_ops qat_sym_gen_dev_ops[QAT_N_GENS ]; + +void +qat_sym_init_op_cookie (void *op_cookie) +{ +struct qat_sym_op_cookie *cookie = op_cookie; + + cookie->qat_sgl_src_phys_addr = +rte_mempool_virt2iova (cookie) + + offsetof(struct qat_sym_op_cookie , + qat_sgl_src); + + cookie->qat_sgl_dst_phys_addr = +rte_mempool_virt2iova (cookie) + + offsetof(struct qat_sym_op_cookie , + qat_sgl_dst); + + cookie->opt.spc_gmac.cd_phys_addr = +rte_mempool_virt2iova (cookie) + + offsetof(struct qat_sym_op_cookie , + opt.spc_gmac.cd_cipher); +}/** Decrypt a single partial block * Depends on openssl libcrypto
drivers/crypto/qat/qat_sym.h +129 -12
189 lines not on this page · raw message
drivers/crypto/qat/qat_sym_hw_dp.c +0 -9
@@ -9,18 +9,9 @@#include "icp_qat_fw_la.h" #include "qat_sym.h" -#include "qat_sym_pmd.h" #include "qat_sym_session.h" #include "qat_qp.h" -struct qat_sym_dp_ctx { -struct qat_sym_session *session; -uint32_t tail; -uint32_t head; -uint16_t cached_enqueue; -uint16_t cached_dequeue; -}; - static __rte_always_inline int32_tqat_sym_dp_parse_data_vec (struct qat_qp *qp,struct icp_qat_fw_la_bulk_req *req,struct rte_crypto_vec *data,uint16_t n_data_vecs)
drivers/crypto/qat/qat_sym_pmd.c deleted +0 -251
251 lines not on this page · raw message
drivers/crypto/qat/qat_sym_pmd.h deleted +0 -95
95 lines not on this page · raw message
drivers/crypto/qat/qat_sym_session.c +1 -1
@@ -20,7 +20,7 @@#include "qat_logs.h" #include "qat_sym_session.h" -#include "qat_sym_pmd.h" +#include "qat_sym.h" /* SHA1 - 20 bytes - Initialiser state can be found in FIPS stds 180-2 */ static const uint8_t sha1InitialState[] = {
Signature · 1 line
2.17.1
PATCH v4 6/11 crypto/qat: unify qat asym pmd apis
In reply to Kai JiThis patch integrate all the functions from qat_asym_pmd.c into qat_asym.c, The integration unify the asym crypto pmd apis and should make it easier for furture maintains
--- drivers/common/qat/meson.build | 2 +- drivers/crypto/qat/qat_asym.c | 180 +++++++++++++++++++++++ drivers/crypto/qat/qat_asym_pmd.c | 231 ------------------------------ drivers/crypto/qat/qat_asym_pmd.h | 54 ------- 4 files changed, 181 insertions(+), 286 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h
drivers/common/qat/meson.build +1 -1
@@ -71,7 +71,7 @@ endif if qat_crypto foreach f: ['qat_sym.c', 'qat_sym_session.c', - 'qat_sym_hw_dp.c', 'qat_asym_pmd.c', 'qat_asym.c', 'qat_crypto.c', + 'qat_sym_hw_dp.c', 'qat_asym.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c', 'dev/qat_crypto_pmd_gen2.c',
drivers/crypto/qat/qat_asym.c +180 -0
192 lines not on this page · raw message
drivers/crypto/qat/qat_asym_pmd.c deleted +0 -231
231 lines not on this page · raw message
drivers/crypto/qat/qat_asym_pmd.h deleted +0 -54
54 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v4 7/11 crypto/qat: op burst data path rework
In reply to Kai JiThis patch enable op_build_request func in qat enqueue op burst. and qat_dequeue_process_response in qat dequeue op burst. The op_build_request invoked in crypto build request op is based on crypto operations setuped during session init.
--- drivers/common/qat/qat_qp.c | 42 +- drivers/common/qat/qat_qp.h | 18 + drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 2 + drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 180 ++-- drivers/crypto/qat/qat_asym.c | 6 +- drivers/crypto/qat/qat_asym.h | 26 - drivers/crypto/qat/qat_crypto.h | 6 +- drivers/crypto/qat/qat_sym.c | 914 ++++++------------- drivers/crypto/qat/qat_sym.h | 4 - drivers/crypto/qat/qat_sym_session.c | 6 +- drivers/crypto/qat/qat_sym_session.h | 10 +- 11 files changed, 395 insertions(+), 819 deletions(-)
drivers/common/qat/qat_qp.c +9 -33
@@ -550,8 +550,7 @@ adf_modulo(uint32_t data, uint32_t modulo_mask) }uint16_t -qat_enqueue_op_burst (void *qp, - __rte_unused qat_op_build_request_t op_build_request, +qat_enqueue_op_burst (void *qp,qat_op_build_request_t op_build_request,void **ops,uint16_t nb_ops) { registerstruct qat_queue *queue;
@@ -602,29 +601,18 @@ qat_enqueue_op_burst(void *qp, } } -#ifdef BUILD_QAT_SYM +#ifdef RTE_LIB_SECURITY if (tmp_qp->service_type ==QAT_SERVICE_SYMMETRIC )qat_sym_preprocess_requests (ops, nb_ops_possible);#endif +memset (tmp_qp->opaque,0xff ,sizeof (tmp_qp->opaque)); +while (nb_ops_sent != nb_ops_possible) { -if (tmp_qp->service_type ==QAT_SERVICE_SYMMETRIC ) { -#ifdef BUILD_QAT_SYM - ret =qat_sym_build_request (*ops, base_addr + tail, - tmp_qp->op_cookies[tail >> queue->trailz], - tmp_qp->qat_dev_gen); -#endif - }else if (tmp_qp->service_type ==QAT_SERVICE_COMPRESSION ) { - ret =qat_comp_build_request (*ops, base_addr + tail, + ret =op_build_request (*ops, base_addr + tail, tmp_qp->op_cookies[tail >> queue->trailz], - tmp_qp->qat_dev_gen); - }else if (tmp_qp->service_type ==QAT_SERVICE_ASYMMETRIC ) { -#ifdef BUILD_QAT_ASYM - ret =qat_asym_build_request (*ops, base_addr + tail, - tmp_qp->op_cookies[tail >> queue->trailz], -NULL , tmp_qp->qat_dev_gen); -#endif - } + tmp_qp->opaque, tmp_qp->qat_dev_gen); +if (ret !=0 ) { tmp_qp->stats.enqueue_err_count++;/* This message cannot be enqueued */
@@ -820,8 +808,7 @@ qat_enqueue_comp_op_burst(void *qp, void **ops, uint16_t nb_ops)uint16_t qat_dequeue_op_burst (void *qp,void **ops, - __rte_unused qat_op_dequeue_t qat_dequeue_process_response, -uint16_t nb_ops) +qat_op_dequeue_t qat_dequeue_process_response,uint16_t nb_ops) {struct qat_queue *rx_queue;struct qat_qp *tmp_qp = (struct qat_qp *)qp;
@@ -839,21 +826,10 @@ qat_dequeue_op_burst(void *qp, void **ops, nb_fw_responses =1 ; -if (tmp_qp->service_type ==QAT_SERVICE_SYMMETRIC ) -qat_sym_process_response (ops, resp_msg, - tmp_qp->op_cookies[head >> rx_queue->trailz], -NULL ); -else if (tmp_qp->service_type ==QAT_SERVICE_COMPRESSION ) - nb_fw_responses =qat_comp_process_response ( + nb_fw_responses =qat_dequeue_process_response ( ops, resp_msg, tmp_qp->op_cookies[head >> rx_queue->trailz], &tmp_qp->stats.dequeue_err_count); -#ifdef BUILD_QAT_ASYM - else if (tmp_qp->service_type == QAT_SERVICE_ASYMMETRIC) - qat_asym_process_response(ops, resp_msg, - tmp_qp->op_cookies[head >> rx_queue->trailz], - NULL); -#endif head =adf_modulo (head + rx_queue->msg_size, rx_queue->modulo_mask);
drivers/common/qat/qat_qp.h +18 -0
@@ -14,6 +14,24 @@struct qat_pci_device ; +/* Default qp configuration for GEN4 devices */ +#define QAT_GEN4_QP_DEFCON (QAT_SERVICE_SYMMETRIC | \ + QAT_SERVICE_SYMMETRIC << 8 | \ + QAT_SERVICE_SYMMETRIC << 16 | \ + QAT_SERVICE_SYMMETRIC << 24) + +/* QAT GEN 4 specific macros */ +#define QAT_GEN4_BUNDLE_NUM 4 +#define QAT_GEN4_QPS_PER_BUNDLE_NUM 1 + +/* Queue pair setup error codes */ +#define QAT_NOMEM 1 +#define QAT_QP_INVALID_DESC_NO 2 +#define QAT_QP_BUSY 3 +#define QAT_PCI_NO_RESOURCE 4 + +#define ADF_ARB_RINGSRVARBEN_OFFSET 0x19C +/** * Structure associated with each queue. */
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +2 -0
@@ -306,4 +306,6 @@ RTE_INIT(qat_asym_crypto_gen2_init) qat_asym_crypto_cap_get_gen1; qat_asym_gen_dev_ops[QAT_GEN2 ].get_feature_flags = qat_asym_crypto_feature_flags_get_gen1; + qat_asym_gen_dev_ops[QAT_GEN2 ].set_session = + qat_asym_crypto_set_session_gen1; }
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +88 -92
198 lines not on this page · raw message
drivers/crypto/qat/qat_asym.c +5 -1
@@ -15,6 +15,10 @@#include "qat_logs.h" #include "qat_asym.h" +uint8_t qat_asym_driver_id; + +struct qat_crypto_gen_dev_ops qat_asym_gen_dev_ops[QAT_N_GENS ]; +void qat_asym_init_op_cookie (void *op_cookie) {
@@ -769,7 +773,7 @@ qat_asym_fill_arrays(struct rte_crypto_asym_op *asym_op,return 0 ; } -int +static __rte_always_inline intqat_asym_build_request (void *in_op,uint8_t *out_msg,void *op_cookie, __rte_unused uint64_t *opaque, __rte_unused enum qat_device_gen dev_gen)
drivers/crypto/qat/qat_asym.h +0 -26
@@ -29,10 +29,6 @@ typedef uint64_t large_int_ptr;#define QAT_ASYM_RSA_NUM_OUT_PARAMS 1#define QAT_ASYM_RSA_QT_NUM_IN_PARAMS 6 -uint8_t qat_asym_driver_id; - -struct qat_crypto_gen_dev_ops qat_asym_gen_dev_ops[QAT_N_GENS ]; -/** * helper function to add an asym capability * <name> <op type> <modlen (min, max, increment)>
@@ -108,28 +104,6 @@ void qat_asym_session_clear(struct rte_cryptodev *dev, struct rte_cryptodev_asym_session *sess); -/* -* Build PKE request to be sent to the fw, partially uses template -* request generated during session creation. -* -* @param in_op Pointer to the crypto operation, for every -* service it points to service specific struct. -* @param out_msg Message to be returned to enqueue function -* @param op_cookie Cookie pointer that holds private metadata -* @param qat_dev_gen Generation of QAT hardware -* -* @return -* This function always returns zero, -* it is because of backward compatibility. -* - 0: Always returned -* -*/ -int -qat_asym_build_request (void *in_op,uint8_t *out_msg, -void *op_cookie, - __rte_unused uint64_t *opaque, -enum qat_device_gen qat_dev_gen); -/* * Process PKE response received from outgoing queue of QAT *
drivers/crypto/qat/qat_crypto.h +5 -1
@@ -12,7 +12,10 @@extern uint8_t qat_sym_driver_id;extern uint8_t qat_asym_driver_id; -/** helper macro to set cryptodev capability range **/ +/** +* helper macro to set cryptodev capability range +* <n: name> <l: min > <r: max> <i: increment> <v: value> +**/ #define CAP_RNG (n, l, r, i) .n = {.min = l, .max = r, .increment = i}#define CAP_RNG_ZERO (n) .n = {.min = 0, .max = 0, .increment = 0}
@@ -61,6 +64,7 @@ struct qat_crypto_gen_dev_ops { };extern struct qat_crypto_gen_dev_ops qat_sym_gen_dev_ops[]; +extern struct qat_crypto_gen_dev_ops qat_asym_gen_dev_ops[]; int qat_cryptodev_config(struct rte_cryptodev *dev,
drivers/crypto/qat/qat_sym.c +260 -654
980 lines not on this page · raw message
drivers/crypto/qat/qat_sym.h +0 -4
@@ -130,10 +130,6 @@ uint16_t qat_sym_dequeue_burst(void *qp, struct rte_crypto_op **ops, uint16_t nb_ops); -int -qat_sym_build_request (void *in_op,uint8_t *out_msg, -void *op_cookie,enum qat_device_gen qat_dev_gen); -/** Encrypt a single partial block * Depends on openssl libcrypto * Uses ECB+XOR to do CFB encryption, same result, more performant
drivers/crypto/qat/qat_sym_session.c +3 -3
@@ -600,11 +600,11 @@ qat_sym_session_handle_single_pass(struct qat_sym_session *session, session->is_auth =1 ; session->qat_cmd =ICP_QAT_FW_LA_CMD_CIPHER ;/* Chacha-Poly is special case that use QAT CTR mode */ -if (aead_xform->algo ==RTE_CRYPTO_AEAD_AES_GCM ) { +if (aead_xform->algo ==RTE_CRYPTO_AEAD_AES_GCM ) session->qat_mode =ICP_QAT_HW_CIPHER_AEAD_MODE ; - }else { +else session->qat_mode =ICP_QAT_HW_CIPHER_CTR_MODE ; - } + session->cipher_iv.offset = aead_xform->iv.offset; session->cipher_iv.length = aead_xform->iv.length; session->aad_len = aead_xform->aad_length;
drivers/crypto/qat/qat_sym_session.h +5 -5
@@ -55,6 +55,11 @@#define QAT_SESSION_IS_SLICE_SET (flags, flag) \ (!!((flags) & (flag))) +struct qat_sym_session ; + +typedef int (*qat_sym_build_request_t )(void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); +enum qat_sym_proto_flag {QAT_CRYPTO_PROTO_FLAG_NONE =0 ,QAT_CRYPTO_PROTO_FLAG_CCM =1 ,
@@ -63,11 +68,6 @@ enum qat_sym_proto_flag {QAT_CRYPTO_PROTO_FLAG_ZUC =4 }; -struct qat_sym_session ; - -typedef int (*qat_sym_build_request_t )(void *in_op,struct qat_sym_session *ctx, -uint8_t *out_msg,void *op_cookie); -/* Common content descriptor */ struct qat_sym_cd {struct icp_qat_hw_cipher_algo_blk cipher;
Signature · 1 line
2.17.1
PATCH v4 8/11 compress/qat: comp dequeue burst update
In reply to Kai JiThis patch update the newly comp dequeue process response function pointer introduced in dequeue burst
--- drivers/compress/qat/qat_comp_pmd.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/compress/qat/qat_comp_pmd.c +9 -3
@@ -616,11 +616,18 @@ static struct rte_compressdev_ops compress_qat_dummy_ops = { .private_xform_free = qat_comp_private_xform_free }; +static uint16_t +qat_comp_dequeue_burst (void *qp,struct rte_comp_op **ops,uint16_t nb_ops) +{ +return qat_dequeue_op_burst (qp, (void **)ops, qat_comp_process_response, + nb_ops); +} +static uint16_t qat_comp_pmd_dequeue_first_op_burst (void *qp,struct rte_comp_op **ops,uint16_t nb_ops) { -uint16_t ret =qat_dequeue_op_burst (qp, (void **)ops,NULL , nb_ops); +uint16_t ret =qat_comp_dequeue_burst (qp, ops, nb_ops);struct qat_qp *tmp_qp = (struct qat_qp *)qp;if (ret) {
@@ -638,8 +645,7 @@ qat_comp_pmd_dequeue_first_op_burst(void *qp, struct rte_comp_op **ops, }else { tmp_qp->qat_dev->comp_dev->compressdev->dequeue_burst = - (compressdev_dequeue_pkt_burst_t ) - qat_dequeue_op_burst; + qat_comp_dequeue_burst; } }return ret;
Signature · 1 line
2.17.1
PATCH v4 9/11 crypto/qat: raw dp api integration
In reply to Kai JiThis patch unitfy all raw dp api into the qat pmd driver, some qat generation specific are implemented respectively. The qat_sym_hw_dp.c is removed as no longer required.
--- drivers/common/qat/meson.build | 2 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 2 + drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 214 ++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 122 +++ drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 78 ++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 656 +++++++++++++ drivers/crypto/qat/qat_crypto.h | 3 + drivers/crypto/qat/qat_sym.c | 50 + drivers/crypto/qat/qat_sym_hw_dp.c | 974 ------------------- 9 files changed, 1126 insertions(+), 975 deletions(-) delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c
drivers/common/qat/meson.build +1 -1
@@ -71,7 +71,7 @@ endif if qat_crypto foreach f: ['qat_sym.c', 'qat_sym_session.c', - 'qat_sym_hw_dp.c', 'qat_asym.c', 'qat_crypto.c', + 'qat_asym.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c', 'dev/qat_crypto_pmd_gen2.c',
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +2 -0
@@ -290,6 +290,8 @@ RTE_INIT(qat_sym_crypto_gen2_init) qat_sym_crypto_cap_get_gen2; qat_sym_gen_dev_ops[QAT_GEN2 ].set_session = qat_sym_crypto_set_session_gen2; + qat_sym_gen_dev_ops[QAT_GEN2 ].set_raw_dp_ctx = + qat_sym_configure_raw_dp_ctx_gen1; qat_sym_gen_dev_ops[QAT_GEN2 ].get_feature_flags = qat_sym_crypto_feature_flags_get_gen1;#ifdef RTE_LIB_SECURITY
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +214 -0
226 lines not on this page · raw message
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +122 -0
134 lines not on this page · raw message
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +78 -0
84 lines not on this page · raw message
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +656 -0
674 lines not on this page · raw message
drivers/crypto/qat/qat_crypto.h +3 -0
@@ -53,11 +53,14 @@ typedef void * (*create_security_ctx_t)(void *cryptodev);typedef int (*set_session_t )(void *cryptodev,void *session); +typedef int (*set_raw_dp_ctx_t )(void *raw_dp_ctx,void *ctx); +struct qat_crypto_gen_dev_ops {get_feature_flags_t get_feature_flags;get_capabilities_info_t get_capabilities;struct rte_cryptodev_ops *cryptodev_ops;set_session_t set_session; +set_raw_dp_ctx_t set_raw_dp_ctx;#ifdef RTE_LIB_SECURITY create_security_ctx_t create_security_ctx;#endif
drivers/crypto/qat/qat_sym.c +50 -0
56 lines not on this page · raw message
drivers/crypto/qat/qat_sym_hw_dp.c deleted +0 -974
974 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v4 10/11 crypto/qat: support out of place SG list
In reply to Kai JiThis patch add-in sgl oop support in qat driver
--- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 28 ++++++++-- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 14 ++++- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 55 +++++++++++++++++--- 3 files changed, 83 insertions(+), 14 deletions(-)
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +24 -4
@@ -467,8 +467,18 @@ qat_sym_dp_enqueue_aead_jobs_gen3(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ;
@@ -564,8 +574,18 @@ qat_sym_dp_enqueue_auth_jobs_gen3(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ; enqueue_one_auth_job_gen3(ctx, cookie, req, &vec->digest[i],
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +12 -2
@@ -295,8 +295,18 @@ qat_sym_dp_enqueue_aead_jobs_gen4(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ;
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +47 -8
80 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v4 11/11 test/cryptodev: fix incomplete data length
In reply to Kai JiThis patch fixes incorrect data lengths computation in cryptodev unit test. Previously some data lengths were incorrectly set, which was insensitive for crypto op unit tets but is critical for raw data path API unit tests. The patch addressed the issue by setting the correct data lengths for some tests.
--- app/test/test_cryptodev.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
app/test/test_cryptodev.c +18 -9
@@ -209,6 +209,7 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,int enqueue_status, dequeue_status;struct crypto_unittest_params *ut_params = &unittest_params;int is_sgl = sop->m_src->nb_segs >1 ; +int is_oop =0 ; ctx_service_size =rte_cryptodev_get_raw_dp_ctx_size (dev_id);if (ctx_service_size <0 ) {
@@ -247,6 +248,9 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, ofs.raw =0 ; +if ((sop->m_dst !=NULL ) && (sop->m_dst != sop->m_src)) + is_oop =1 ; +if (is_cipher && is_auth) { cipher_offset = sop->cipher.data.offset; cipher_len = sop->cipher.data.length;
@@ -277,6 +281,8 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,if (is_sgl) {uint32_t remaining_off = auth_offset + auth_len;struct rte_mbuf *sgl_buf = sop->m_src; +if (is_oop) + sgl_buf = sop->m_dst;while (remaining_off >=rte_pktmbuf_data_len (sgl_buf) && sgl_buf->next !=NULL ) {
@@ -293,7 +299,8 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,/* Then check if digest-encrypted conditions are met */ if ((auth_offset + auth_len < cipher_offset + cipher_len) && (digest.iova == auth_end_iova) && is_sgl) - max_len =RTE_MAX (max_len, auth_offset + auth_len + + max_len =RTE_MAX (max_len, + auth_offset + auth_len + ut_params->auth_xform.auth.digest_length); }else if (is_cipher) {
@@ -356,7 +363,7 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, sgl.num = n;/* Out of place */ -if (sop->m_dst !=NULL ) { +if (is_oop) { dest_sgl.vec = dest_data_vec; vec.dest_sgl = &dest_sgl; n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
@@ -4102,9 +4109,9 @@ test_kasumi_decryption(const struct kasumi_test_data *tdata)/* Create KASUMI operation */ retval =create_wireless_algo_cipher_operation (tdata->cipher_iv.data, - tdata->cipher_iv.len, - tdata->ciphertext.len, - tdata->validCipherOffsetInBits.len); + tdata->cipher_iv.len, +RTE_ALIGN_CEIL (tdata->validCipherLenInBits.len,8 ), + tdata->validCipherOffsetInBits.len);if (retval <0 )return retval;
@@ -7335,6 +7342,7 @@ test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,unsigned int plaintext_len;unsigned int ciphertext_pad_len;unsigned int ciphertext_len; +unsigned int data_len;struct rte_cryptodev_info dev_info;struct rte_crypto_op *op;
@@ -7395,21 +7403,22 @@ test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata, plaintext_len =ceil_byte_length (tdata->plaintext.len_bits); ciphertext_pad_len =RTE_ALIGN_CEIL (ciphertext_len,16 ); plaintext_pad_len =RTE_ALIGN_CEIL (plaintext_len,16 ); + data_len =RTE_MAX (ciphertext_pad_len, plaintext_pad_len);if (verify) { ciphertext = (uint8_t *)rte_pktmbuf_append (ut_params->ibuf, - ciphertext_pad_len); + data_len);memcpy (ciphertext, tdata->ciphertext.data, ciphertext_len);if (op_mode ==OUT_OF_PLACE ) -rte_pktmbuf_append (ut_params->obuf, ciphertext_pad_len); +rte_pktmbuf_append (ut_params->obuf, data_len);debug_hexdump (stdout,"ciphertext:" , ciphertext, ciphertext_len); }else { plaintext = (uint8_t *)rte_pktmbuf_append (ut_params->ibuf, - plaintext_pad_len); + data_len);memcpy (plaintext, tdata->plaintext.data, plaintext_len);if (op_mode ==OUT_OF_PLACE ) -rte_pktmbuf_append (ut_params->obuf, plaintext_pad_len); +rte_pktmbuf_append (ut_params->obuf, data_len);debug_hexdump (stdout,"plaintext:" , plaintext, plaintext_len); }
Signature · 1 line
2.17.1
v5 cover drivers/qat: QAT symmetric crypto datapatch rework
This patch reworks QAT symmetric crypto datapatch implementation where each generation request building separated and the crypto operation under the raw datapath api implementation are unified.
In addtion this patchset also enables QAT OOP support in raw datapath api implementation.
v5:
- rebase to the latest for-main
- patchset reconstruct
v4:
- patchset break down and reconstruct
v3:
- sperate a single patch 6 to two different patches
v2:
- review comments addressed
Kai Ji (10):
common/qat: define build op request and dequeue op crypto/qat: sym build op request specific implementation crypto/qat: qat generation specific enqueue crypto/qat: rework session APIs
crypto/qat: rework asymmetric crypto build operation crypto/qat: unify qat sym pmd apis
crypto/qat: unify qat asym pmd apis
crypto/qat: op burst data path rework crypto/qat: raw dp api integration
crypto/qat: support out of place SG list
drivers/common/qat/meson.build | 6 +- drivers/common/qat/qat_device.c | 4 +- drivers/common/qat/qat_qp.c | 42 +- drivers/common/qat/qat_qp.h | 54 +- drivers/compress/qat/qat_comp_pmd.c | 14 +- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 9 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 93 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 490 ++++++++- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 257 ++++- drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 913 ++++++++++++++++- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 942 +++++++++++++++++- drivers/crypto/qat/qat_asym.c | 762 ++++++++------ drivers/crypto/qat/qat_asym.h | 79 +- drivers/crypto/qat/qat_asym_pmd.c | 231 ----- drivers/crypto/qat/qat_asym_pmd.h | 54 - drivers/crypto/qat/qat_crypto.h | 16 +- drivers/crypto/qat/qat_sym.c | 978 ++++++------------ drivers/crypto/qat/qat_sym.h | 148 ++- drivers/crypto/qat/qat_sym_hw_dp.c | 983 ------------------- drivers/crypto/qat/qat_sym_pmd.c | 251 ----- drivers/crypto/qat/qat_sym_pmd.h | 95 -- drivers/crypto/qat/qat_sym_session.c | 115 +-- drivers/crypto/qat/qat_sym_session.h | 15 +- 23 files changed, 3812 insertions(+), 2739 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h
Signature · 1 line
2.17.1
PATCH v5 1/10 common/qat: define build op request and dequeue op
This patch introduce build request op and dequeue op function pointers to qat queue pair implementation. Those two functions are used to be assigned during qat session generation based on crypto operation
--- drivers/common/qat/qat_qp.c | 10 ++++-- drivers/common/qat/qat_qp.h | 54 ++++++++++++++++++++++++++-- drivers/compress/qat/qat_comp_pmd.c | 4 +-- drivers/crypto/qat/qat_asym_pmd.c | 4 +-- drivers/crypto/qat/qat_sym_pmd.c | 4 +-- drivers/crypto/qat/qat_sym_session.h | 13 ++++++- 6 files changed, 76 insertions(+), 13 deletions(-)
drivers/common/qat/qat_qp.c +7 -3
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2015-2018 Intel Corporation +* Copyright(c) 2015-2022 Intel Corporation */ #include <rte_common.h>
@@ -550,7 +550,9 @@ adf_modulo(uint32_t data, uint32_t modulo_mask) }uint16_t -qat_enqueue_op_burst (void *qp,void **ops,uint16_t nb_ops) +qat_enqueue_op_burst (void *qp, + __rte_unused qat_op_build_request_t op_build_request, +void **ops,uint16_t nb_ops) { registerstruct qat_queue *queue;struct qat_qp *tmp_qp = (struct qat_qp *)qp;
@@ -817,7 +819,9 @@ qat_enqueue_comp_op_burst(void *qp, void **ops, uint16_t nb_ops) }uint16_t -qat_dequeue_op_burst (void *qp,void **ops,uint16_t nb_ops) +qat_dequeue_op_burst (void *qp,void **ops, + __rte_unused qat_op_dequeue_t qat_dequeue_process_response, +uint16_t nb_ops) {struct qat_queue *rx_queue;struct qat_qp *tmp_qp = (struct qat_qp *)qp;
drivers/common/qat/qat_qp.h +51 -3
81 lines not on this page · raw message
drivers/compress/qat/qat_comp_pmd.c +2 -2
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2015-2019 Intel Corporation +* Copyright(c) 2015-2022 Intel Corporation */ #include <rte_malloc.h>
@@ -620,7 +620,7 @@ static uint16_t qat_comp_pmd_dequeue_first_op_burst(void *qp, struct rte_comp_op **ops, uint16_t nb_ops) { -uint16_t ret =qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +uint16_t ret =qat_dequeue_op_burst (qp, (void **)ops,NULL , nb_ops);struct qat_qp *tmp_qp = (struct qat_qp *)qp;if (ret) {
drivers/crypto/qat/qat_asym_pmd.c +2 -2
@@ -62,13 +62,13 @@ static struct rte_cryptodev_ops crypto_qat_ops = {uint16_t qat_asym_pmd_enqueue_op_burst (void *qp,struct rte_crypto_op **ops,uint16_t nb_ops) { -return qat_enqueue_op_burst (qp, (void **)ops, nb_ops); +return qat_enqueue_op_burst (qp,NULL , (void **)ops, nb_ops); }uint16_t qat_asym_pmd_dequeue_op_burst (void *qp,struct rte_crypto_op **ops,uint16_t nb_ops) { -return qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +return qat_dequeue_op_burst (qp, (void **)ops,NULL , nb_ops); }/* An rte_driver is needed in the registration of both the device and the driver
drivers/crypto/qat/qat_sym_pmd.c +2 -2
@@ -49,14 +49,14 @@ static uint16_t qat_sym_pmd_enqueue_op_burst(void *qp, struct rte_crypto_op **ops, uint16_t nb_ops) { -return qat_enqueue_op_burst (qp, (void **)ops, nb_ops); +return qat_enqueue_op_burst (qp,NULL , (void **)ops, nb_ops); }static uint16_t qat_sym_pmd_dequeue_op_burst (void *qp,struct rte_crypto_op **ops,uint16_t nb_ops) { -return qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +return qat_dequeue_op_burst (qp, (void **)ops,NULL , nb_ops); }/* An rte_driver is needed in the registration of both the device and the driver
drivers/crypto/qat/qat_sym_session.h +12 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2015-2019 Intel Corporation +* Copyright(c) 2015-2022 Intel Corporation */ #ifndef _QAT_SYM_SESSION_H_#define _QAT_SYM_SESSION_H_
@@ -63,6 +63,16 @@ enum qat_sym_proto_flag {QAT_CRYPTO_PROTO_FLAG_ZUC =4 }; +struct qat_sym_session ; + +/* +* typedef qat_op_build_request_t function pointer, passed in as argument +* in enqueue op burst, where a build request assigned base on the type of +* crypto op. +*/ +typedef int (*qat_sym_build_request_t )(void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); +/* Common content descriptor */ struct qat_sym_cd {struct icp_qat_hw_cipher_algo_blk cipher;
@@ -107,6 +117,7 @@ struct qat_sym_session {/* Some generations need different setup of counter */ uint32_t slice_types;enum qat_sym_proto_flag qat_proto_flag; +qat_sym_build_request_t build_request[2 ]; };int
Signature · 1 line
2.17.1
PATCH v5 2/10 crypto/qat: sym build op request specific implementation
In reply to Kai JiThis patch adds common inline functions for QAT symmetric crypto driver to process crypto op and the build op request function pointer implementation for QAT generation 1.
--- drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 832 ++++++++++++++++++- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 187 ++++- drivers/crypto/qat/qat_sym.c | 90 +- 3 files changed, 1019 insertions(+), 90 deletions(-)
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +831 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2017-2021 Intel Corporation +* Copyright(c) 2017-2022 Intel Corporation */ #ifndef _QAT_CRYPTO_PMD_GENS_H_
@@ -8,14 +8,844 @@#include <rte_cryptodev.h> #include "qat_crypto.h" #include "qat_sym_session.h" +#include "qat_sym.h" + +#define QAT_SYM_DP_GET_MAX_ENQ (q, c, n) \ + RTE_MIN((q->max_inflights - q->enqueued + q->dequeued - c), n) + +#define QAT_SYM_DP_IS_RESP_SUCCESS (resp) \ + (ICP_QAT_FW_COMN_STATUS_FLAG_OK == \ + ICP_QAT_FW_COMN_RESP_CRYPTO_STAT_GET(resp->comn_hdr.comn_status)) + +static __rte_always_inline int +op_bpi_cipher_decrypt (uint8_t *src,uint8_t *dst, +uint8_t *iv,int ivlen,int srclen, +void *bpi_ctx) +{ +EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX *)bpi_ctx; +int encrypted_ivlen; +uint8_t encrypted_iv[BPI_MAX_ENCR_IV_LEN ]; +uint8_t *encr = encrypted_iv; + +/* ECB method: encrypt (not decrypt!) the IV, then XOR with plaintext */ +if (EVP_EncryptUpdate (ctx, encrypted_iv, &encrypted_ivlen, iv, ivlen) + <=0 ) + goto cipher_decrypt_err; + +for (; srclen !=0 ; --srclen, ++dst, ++src, ++encr) + *dst = *src ^ *encr; + +return 0 ; + +cipher_decrypt_err: +QAT_DP_LOG (ERR ,"libcrypto ECB cipher decrypt for BPI IV failed" ); +return -EINVAL ; +} + +static __rte_always_inline uint32_t +qat_bpicipher_preprocess (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +int block_len =qat_cipher_get_block_size (ctx->qat_cipher_alg); +struct rte_crypto_sym_op *sym_op = op->sym; +uint8_t last_block_len = block_len >0 ? + sym_op->cipher.data.length % block_len :0 ; + +if (last_block_len && ctx->qat_dir ==ICP_QAT_HW_CIPHER_DECRYPT ) { +/* Decrypt last block */ +uint8_t *last_block, *dst, *iv; +uint32_t last_block_offset = sym_op->cipher.data.offset + + sym_op->cipher.data.length - last_block_len; + last_block = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_src, + uint8_t *, last_block_offset); + +if (unlikely ((sym_op->m_dst !=NULL ) + && (sym_op->m_dst != sym_op->m_src))) +/* out-of-place operation (OOP) */ + dst = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_dst, + uint8_t *, last_block_offset); +else + dst = last_block; + +if (last_block_len < sym_op->cipher.data.length) +/* use previous block ciphertext as IV */ + iv = last_block - block_len; +else +/* runt block, i.e. less than one full block */ + iv = rte_crypto_op_ctod_offset(op, uint8_t *, + ctx->cipher_iv.offset); + +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src before pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst before pre-process:" , + dst, last_block_len); +#endif +op_bpi_cipher_decrypt (last_block, dst, iv, block_len, + last_block_len, ctx->bpi_ctx); +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src after pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst after pre-process:" , + dst, last_block_len); +#endif + } + +return sym_op->cipher.data.length - last_block_len; +} + +static __rte_always_inline int +qat_auth_is_len_in_bits (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 ) { +if (unlikely ((op->sym->auth.data.offset %BYTE_LENGTH !=0 ) || + (op->sym->auth.data.length %BYTE_LENGTH !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int +qat_cipher_is_len_in_bits (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_KASUMI || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ) { +if (unlikely ((op->sym->cipher.data.length %BYTE_LENGTH !=0 ) || + ((op->sym->cipher.data.offset % +BYTE_LENGTH ) !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int32_t +qat_sym_build_req_set_data (struct icp_qat_fw_la_bulk_req *req, +void *opaque,struct qat_sym_op_cookie *cookie, +struct rte_crypto_vec *src_vec,uint16_t n_src, +struct rte_crypto_vec *dst_vec,uint16_t n_dst) +{ +struct qat_sgl *list; +uint32_t i; +uint32_t tl_src =0 , total_len_src, total_len_dst; +uint64_t src_data_start =0 , dst_data_start =0 ; +int is_sgl = n_src >1 || n_dst >1 ; + +if (unlikely (n_src <1 || n_src >QAT_SYM_SGL_MAX_NUMBER || + n_dst >QAT_SYM_SGL_MAX_NUMBER )) +return -1 ; + +if (likely (!is_sgl)) { + src_data_start = src_vec[0 ].iova; + tl_src = total_len_src = + src_vec[0 ].len; +if (unlikely (n_dst)) {/* oop */ + total_len_dst = dst_vec[0 ].len; + + dst_data_start = dst_vec[0 ].iova; +if (unlikely (total_len_src != total_len_dst)) +return -EINVAL ; + }else { + dst_data_start = src_data_start; + total_len_dst = tl_src; + } + }else {/* sgl */ + total_len_dst = total_len_src =0 ; + +ICP_QAT_FW_COMN_PTR_TYPE_SET (req->comn_hdr.comn_req_flags, +QAT_COMN_PTR_TYPE_SGL ); + + list = (struct qat_sgl *)&cookie->qat_sgl_src; +for (i =0 ; i < n_src; i++) { + list->buffers[i].len = src_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = src_vec[i].iova; +if (tl_src + src_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -1 ; + } + tl_src += src_vec[i].len; + } + + list->num_bufs = i; + src_data_start = cookie->qat_sgl_src_phys_addr; + +if (unlikely (n_dst >0 )) {/* oop sgl */ +uint32_t tl_dst =0 ; + + list = (struct qat_sgl *)&cookie->qat_sgl_dst; + +for (i =0 ; i < n_dst; i++) { + list->buffers[i].len = dst_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = dst_vec[i].iova; +if (tl_dst + dst_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -ENOTSUP ; + } + + tl_dst += dst_vec[i].len; + } + +if (tl_src != tl_dst) +return -EINVAL ; + list->num_bufs = i; + dst_data_start = cookie->qat_sgl_dst_phys_addr; + }else + dst_data_start = src_data_start; + } + + req->comn_mid.src_data_addr = src_data_start; + req->comn_mid.dest_data_addr = dst_data_start; + req->comn_mid.src_length = total_len_src; + req->comn_mid.dst_length = total_len_dst; + req->comn_mid.opaque_data = (uintptr_t )opaque; + +return tl_src; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_cipher (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, + struct rte_crypto_va_iova_ptr *auth_iv_or_aad __rte_unused, + struct rte_crypto_va_iova_ptr *digest __rte_unused) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int n_src =0 ; +int ret; + + ret =qat_cipher_is_len_in_bits (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->cipher.data.length >>3 ; + cipher_ofs = op->sym->cipher.data.offset >>3 ; +break ; +case 0 : +if (ctx->bpi_ctx) { +/* DOCSIS - only send complete blocks to device. +* Process any partial block using CFB mode. +* Even if 0 complete blocks, still send this to device +* to get into rx queue for post-process and dequeuing +*/ + cipher_len =qat_bpicipher_preprocess (ctx, op); + cipher_ofs = op->sym->cipher.data.offset; + }else { + cipher_len = op->sym->cipher.data.length; + cipher_ofs = op->sym->cipher.data.offset; + } +break ; +default : +QAT_DP_LOG (ERR , +"SNOW3G/KASUMI/ZUC in QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, + cipher_len, in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if ((n_dst <0 ) || (n_dst > op->sym->m_dst->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_auth (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, + struct rte_crypto_va_iova_ptr *cipher_iv __rte_unused, +struct rte_crypto_va_iova_ptr *auth_iv, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t auth_ofs =0 , auth_len =0 ; +int n_src, ret; + + ret =qat_auth_is_len_in_bits (ctx, op); +switch (ret) { +case 1 : + auth_ofs = op->sym->auth.data.offset >>3 ; + auth_len = op->sym->auth.data.length >>3 ; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); +break ; +case 0 : +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_128 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_64 ) { +/* AES-GMAC */ + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + }else { + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va =NULL ; + auth_iv->iova =0 ; + } +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, auth_ofs, + auth_ofs + auth_len, in_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, auth_ofs, + auth_ofs + auth_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if ((n_dst <0 ) || (n_dst > op->sym->m_dst->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_chain (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +union rte_crypto_sym_ofs ofs; +uint32_t min_ofs =0 , max_len =0 ; +uint32_t cipher_len =0 , cipher_ofs =0 ; +uint32_t auth_len =0 , auth_ofs =0 ; +int is_oop = (op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src); +int is_sgl = op->sym->m_src->nb_segs >1 ; +int n_src; +int ret; + +if (unlikely (is_oop)) + is_sgl |= op->sym->m_dst->nb_segs >1 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv_or_aad->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + + ret =qat_cipher_is_len_in_bits (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->aead.data.length >>3 ; + cipher_ofs = op->sym->aead.data.offset >>3 ; +break ; +case 0 : + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + ret =qat_auth_is_len_in_bits (ctx, op); +switch (ret) { +case 1 : + auth_len = op->sym->auth.data.length >>3 ; + auth_ofs = op->sym->auth.data.offset >>3 ; +break ; +case 0 : + auth_len = op->sym->auth.data.length; + auth_ofs = op->sym->auth.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + min_ofs = cipher_ofs < auth_ofs ? cipher_ofs : auth_ofs; + max_len =RTE_MAX (cipher_ofs + cipher_len, auth_ofs + auth_len); + +/* digest in buffer check. Needed only for wireless algos */ +if (ret ==1 ) { +/* Handle digest-encrypted cases, i.e. +* auth-gen-then-cipher-encrypt and +* cipher-decrypt-then-auth-verify +*/ +uint64_t auth_end_iova; + +if (unlikely (is_sgl)) { +uint32_t remaining_off = auth_ofs + auth_len; +struct rte_mbuf *sgl_buf = (is_oop ? op->sym->m_dst : + op->sym->m_src); + +while (remaining_off >=rte_pktmbuf_data_len (sgl_buf) + && sgl_buf->next !=NULL ) { + remaining_off -=rte_pktmbuf_data_len (sgl_buf); + sgl_buf = sgl_buf->next; + } + + auth_end_iova = (uint64_t )rte_pktmbuf_iova_offset ( + sgl_buf, remaining_off); + }else + auth_end_iova = (is_oop ? +rte_pktmbuf_iova (op->sym->m_dst) : +rte_pktmbuf_iova (op->sym->m_src)) + auth_ofs + + auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_ofs + auth_len < cipher_ofs + cipher_len) && + (digest->iova == auth_end_iova)) + max_len =RTE_MAX (max_len, auth_ofs + auth_len + + ctx->digest_length); + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, min_ofs, max_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (unlikely (n_src <0 || n_src > op->sym->m_src->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + in_sgl->num = n_src; + +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, min_ofs, + max_len, out_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + ofs.ofs.cipher.head = cipher_ofs; + ofs.ofs.cipher.tail = max_len - cipher_ofs - cipher_len; + ofs.ofs.auth.head = auth_ofs; + ofs.ofs.auth.tail = max_len - auth_ofs - auth_len; + +return ofs.raw; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_aead (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int32_t n_src =0 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = (void *)op->sym->aead.aad.data; + auth_iv_or_aad->iova = op->sym->aead.aad.phys_addr; + digest->va = (void *)op->sym->aead.digest.data; + digest->iova = op->sym->aead.digest.phys_addr; + + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, cipher_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline void +qat_set_cipher_iv (struct icp_qat_fw_la_cipher_req_params *cipher_param, +struct rte_crypto_va_iova_ptr *iv_ptr,uint32_t iv_len, +struct icp_qat_fw_la_bulk_req *qat_req) +{ +/* copy IV into request if it fits */ +if (iv_len <=sizeof (cipher_param->u.cipher_IV_array)) +rte_memcpy (cipher_param->u.cipher_IV_array, iv_ptr->va, + iv_len); +else { +ICP_QAT_FW_LA_CIPH_IV_FLD_FLAG_SET ( + qat_req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_CIPH_IV_64BIT_PTR ); + cipher_param->u.s.cipher_IV_ptr = iv_ptr->iova; + } +} + +static __rte_always_inline void +qat_sym_dp_fill_vec_status (int32_t *sta,int status,uint32_t n) +{ +uint32_t i; + +for (i =0 ; i < n; i++) + sta[i] = status; +} + +static __rte_always_inline void +enqueue_one_cipher_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + +/* cipher IV */ +qat_set_cipher_iv (cipher_param, iv, ctx->cipher_iv.length, req); + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; +} + +static __rte_always_inline void +enqueue_one_auth_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = data_len - ofs.ofs.auth.head - + ofs.ofs.auth.tail; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, auth_iv->va, + ctx->auth_iv.length); +break ; +default : +break ; + } +} + +static __rte_always_inline int +enqueue_one_chain_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_vec *src_vec, +uint16_t n_src_vecs, +struct rte_crypto_vec *dst_vec, +uint16_t n_dst_vecs, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; +struct rte_crypto_vec *cvec = n_dst_vecs >0 ? + dst_vec : src_vec; +rte_iova_t auth_iova_end; +int cipher_len, auth_len; +int is_sgl = n_src_vecs >1 || n_dst_vecs >1 ; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + cipher_len = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_len = data_len - ofs.ofs.auth.head - ofs.ofs.auth.tail; + +if (unlikely (cipher_len <0 || auth_len <0 )) +return -1 ; + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = cipher_len; +qat_set_cipher_iv (cipher_param, cipher_iv, ctx->cipher_iv.length, req); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = auth_len; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +break ; +default : +break ; + } + +if (unlikely (is_sgl)) { +/* sgl */ +int i = n_dst_vecs ? n_dst_vecs : n_src_vecs; +uint32_t remaining_off = data_len - ofs.ofs.auth.tail; + +while (remaining_off >= cvec->len && i >=1 ) { + i--; + remaining_off -= cvec->len; + cvec++; + } + + auth_iova_end = cvec->iova + remaining_off; + }else + auth_iova_end = cvec[0 ].iova + auth_param->auth_off + + auth_param->auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_param->auth_off + auth_param->auth_len < + cipher_param->cipher_offset + cipher_param->cipher_length) && + (digest->iova == auth_iova_end)) { +/* Handle partial digest encryption */ +if (cipher_param->cipher_offset + cipher_param->cipher_length < + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length && !is_sgl) + req->comn_mid.dst_length = req->comn_mid.src_length = + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length; +struct icp_qat_fw_comn_req_hdr *header = &req->comn_hdr; +ICP_QAT_FW_LA_DIGEST_IN_BUFFER_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_DIGEST_IN_BUFFER ); + } + +return 0 ; +} + +static __rte_always_inline void +enqueue_one_aead_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param = + (void *)&req->serv_specif_rqpars; +struct icp_qat_fw_la_auth_req_params *auth_param = + (void *)((uint8_t *)&req->serv_specif_rqpars + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); +uint8_t *aad_data; +uint8_t aad_ccm_real_len; +uint8_t aad_len_field_sz; +uint32_t msg_len_be; +rte_iova_t aad_iova =0 ; +uint8_t q; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, iv->va, + ctx->cipher_iv.length); + aad_iova = aad->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_AES_CBC_MAC : + aad_data = aad->va; + aad_iova = aad->iova; + aad_ccm_real_len =0 ; + aad_len_field_sz =0 ; + msg_len_be =rte_bswap32 ((uint32_t )data_len - + ofs.ofs.cipher.head); + +if (ctx->aad_len >ICP_QAT_HW_CCM_AAD_DATA_OFFSET ) { + aad_len_field_sz =ICP_QAT_HW_CCM_AAD_LEN_INFO ; + aad_ccm_real_len = ctx->aad_len - +ICP_QAT_HW_CCM_AAD_B0_LEN - +ICP_QAT_HW_CCM_AAD_LEN_INFO ; + }else { + aad_data = iv->va; + aad_iova = iv->iova; + } + + q =ICP_QAT_HW_CCM_NQ_CONST - ctx->cipher_iv.length; + aad_data[0 ] =ICP_QAT_HW_CCM_BUILD_B0_FLAGS ( + aad_len_field_sz, ctx->digest_length, q); +if (q >ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ) { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET + (q - +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ), + (uint8_t *)&msg_len_be, +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ); + }else { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)&msg_len_be + + (ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE + - q), q); + } + +if (aad_len_field_sz >0 ) { + *(uint16_t *)&aad_data[ICP_QAT_HW_CCM_AAD_B0_LEN ] = +rte_bswap16 (aad_ccm_real_len); + +if ((aad_ccm_real_len + aad_len_field_sz) + %ICP_QAT_HW_CCM_AAD_B0_LEN ) { +uint8_t pad_len =0 ; +uint8_t pad_idx =0 ; + + pad_len =ICP_QAT_HW_CCM_AAD_B0_LEN - + ((aad_ccm_real_len + + aad_len_field_sz) % +ICP_QAT_HW_CCM_AAD_B0_LEN ); + pad_idx =ICP_QAT_HW_CCM_AAD_B0_LEN + + aad_ccm_real_len + + aad_len_field_sz; +memset (&aad_data[pad_idx],0 , pad_len); + } + } + +rte_memcpy (((uint8_t *)cipher_param->u.cipher_IV_array) + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , ctx->cipher_iv.length); + *(uint8_t *)&cipher_param->u.cipher_IV_array[0 ] = + q -ICP_QAT_HW_CCM_NONCE_OFFSET ; + +rte_memcpy ((uint8_t *)aad->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va +ICP_QAT_HW_CCM_NONCE_OFFSET , + ctx->cipher_iv.length); +break ; +default : +break ; + } + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_param->auth_off = ofs.ofs.cipher.head; + auth_param->auth_len = cipher_param->cipher_length; + auth_param->auth_res_addr = digest->iova; + auth_param->u1.aad_adr = aad_iova; +}extern struct rte_cryptodev_ops qat_sym_crypto_ops_gen1;extern struct rte_cryptodev_ops qat_asym_crypto_ops_gen1; +/* -----------------GEN 1 sym crypto op data path APIs ---------------- */ +int +qat_sym_build_op_cipher_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_auth_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_aead_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_chain_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); +/* -----------------GENx control path APIs ---------------- */ uint64_t qat_sym_crypto_feature_flags_get_gen1 (struct qat_pci_device *qat_dev); +int +qat_sym_crypto_set_session_gen1 (void *cryptodev,void *session); +void qat_sym_session_set_ext_hash_flags_gen2 (struct qat_sym_session *session,uint8_t hash_flag);
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +186 -1
197 lines not on this page · raw message
drivers/crypto/qat/qat_sym.c +2 -88
100 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v5 3/10 crypto/qat: qat generation specific enqueue
In reply to Kai JiThis patch add in specific aead & auth build op enqueue functions for QAT Gen3 & Gen4
--- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 117 ++++++++++++++++++- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 34 +++++- 2 files changed, 149 insertions(+), 2 deletions(-)
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +116 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2017-2021 Intel Corporation +* Copyright(c) 2017-2022 Intel Corporation */ #include <rte_cryptodev.h>
@@ -143,6 +143,121 @@ qat_sym_crypto_cap_get_gen3(struct qat_pci_device *qat_dev __rte_unused)return capa_info; } +static __rte_always_inline void +enqueue_one_aead_job_gen3 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +if (ctx->is_single_pass) { +struct icp_qat_fw_la_cipher_req_params *cipher_param = + (void *)&req->serv_specif_rqpars; + +/* QAT GEN3 uses single pass to treat AEAD as +* cipher operation +*/ + cipher_param = (void *)&req->serv_specif_rqpars; + +qat_set_cipher_iv (cipher_param, iv, ctx->cipher_iv.length, req); + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + + cipher_param->spc_aad_addr = aad->iova; + cipher_param->spc_auth_res_addr = digest->iova; + +return ; + } + +enqueue_one_aead_job_gen1 (ctx, req, iv, digest, aad, ofs, data_len); +} + +static __rte_always_inline void +enqueue_one_auth_job_gen3 (struct qat_sym_session *ctx, +struct qat_sym_op_cookie *cookie, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_cipher_cd_ctrl_hdr *cipher_cd_ctrl; +struct icp_qat_fw_la_cipher_req_params *cipher_param; +uint32_t ver_key_offset; +uint32_t auth_data_len = data_len - ofs.ofs.auth.head - + ofs.ofs.auth.tail; + +if (!ctx->is_single_pass_gmac || + (auth_data_len >QAT_AES_GMAC_SPC_MAX_SIZE )) { +enqueue_one_auth_job_gen1 (ctx, req, digest, auth_iv, ofs, + data_len); +return ; + } + + cipher_cd_ctrl = (void *) &req->cd_ctrl; + cipher_param = (void *)&req->serv_specif_rqpars; + ver_key_offset =sizeof (struct icp_qat_hw_auth_setup ) + +ICP_QAT_HW_GALOIS_128_STATE1_SZ + +ICP_QAT_HW_GALOIS_H_SZ +ICP_QAT_HW_GALOIS_LEN_A_SZ + +ICP_QAT_HW_GALOIS_E_CTR0_SZ + +sizeof (struct icp_qat_hw_cipher_config ); + +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_128 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_64 ) { +/* AES-GMAC */ +qat_set_cipher_iv (cipher_param, auth_iv, ctx->auth_iv.length, + req); + } + +/* Fill separate Content Descriptor for this op */ +rte_memcpy (cookie->opt.spc_gmac.cd_cipher.key, + ctx->auth_op ==ICP_QAT_HW_AUTH_GENERATE ? + ctx->cd.cipher.key : +RTE_PTR_ADD (&ctx->cd, ver_key_offset), + ctx->auth_key_length); + cookie->opt.spc_gmac.cd_cipher.cipher_config.val = +ICP_QAT_HW_CIPHER_CONFIG_BUILD ( +ICP_QAT_HW_CIPHER_AEAD_MODE , + ctx->qat_cipher_alg, +ICP_QAT_HW_CIPHER_NO_CONVERT , + (ctx->auth_op ==ICP_QAT_HW_AUTH_GENERATE ? +ICP_QAT_HW_CIPHER_ENCRYPT : +ICP_QAT_HW_CIPHER_DECRYPT )); +QAT_FIELD_SET (cookie->opt.spc_gmac.cd_cipher.cipher_config.val, + ctx->digest_length, +QAT_CIPHER_AEAD_HASH_CMP_LEN_BITPOS , +QAT_CIPHER_AEAD_HASH_CMP_LEN_MASK ); + cookie->opt.spc_gmac.cd_cipher.cipher_config.reserved = +ICP_QAT_HW_CIPHER_CONFIG_BUILD_UPPER (auth_data_len); + +/* Update the request */ + req->cd_pars.u.s.content_desc_addr = + cookie->opt.spc_gmac.cd_phys_addr; + req->cd_pars.u.s.content_desc_params_sz =RTE_ALIGN_CEIL ( +sizeof (struct icp_qat_hw_cipher_config ) + + ctx->auth_key_length,8 ) >>3 ; + req->comn_mid.src_length = data_len; + req->comn_mid.dst_length =0 ; + + cipher_param->spc_aad_addr =0 ; + cipher_param->spc_auth_res_addr = digest->iova; + cipher_param->spc_aad_sz = auth_data_len; + cipher_param->reserved =0 ; + cipher_param->spc_auth_res_sz = ctx->digest_length; + + req->comn_hdr.service_cmd_id =ICP_QAT_FW_LA_CMD_CIPHER ; + cipher_cd_ctrl->cipher_cfg_offset =0 ; +ICP_QAT_FW_COMN_CURR_ID_SET (cipher_cd_ctrl,ICP_QAT_FW_SLICE_CIPHER ); +ICP_QAT_FW_COMN_NEXT_ID_SET (cipher_cd_ctrl,ICP_QAT_FW_SLICE_DRAM_WR ); +ICP_QAT_FW_LA_SINGLE_PASS_PROTO_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_SINGLE_PASS_PROTO ); +ICP_QAT_FW_LA_PROTO_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_NO_PROTO ); +} +RTE_INIT (qat_sym_crypto_gen3_init) { qat_sym_gen_dev_ops[QAT_GEN3 ].cryptodev_ops = &qat_sym_crypto_ops_gen1;
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +33 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2017-2021 Intel Corporation +* Copyright(c) 2017-2022 Intel Corporation */ #include <rte_cryptodev.h>
@@ -103,6 +103,38 @@ qat_sym_crypto_cap_get_gen4(struct qat_pci_device *qat_dev __rte_unused)return capa_info; } +static __rte_always_inline void +enqueue_one_aead_job_gen4 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +if (ctx->is_single_pass && ctx->is_ucs) { +struct icp_qat_fw_la_cipher_20_req_params *cipher_param_20 = + (void *)&req->serv_specif_rqpars; +struct icp_qat_fw_la_cipher_req_params *cipher_param = + (void *)&req->serv_specif_rqpars; + +/* QAT GEN4 uses single pass to treat AEAD as cipher +* operation +*/ +qat_set_cipher_iv (cipher_param, iv, ctx->cipher_iv.length, + req); + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - + ofs.ofs.cipher.head - ofs.ofs.cipher.tail; + + cipher_param_20->spc_aad_addr = aad->iova; + cipher_param_20->spc_auth_res_addr = digest->iova; + +return ; + } + +enqueue_one_aead_job_gen1 (ctx, req, iv, digest, aad, ofs, data_len); +} +RTE_INIT (qat_sym_crypto_gen4_init) { qat_sym_gen_dev_ops[QAT_GEN4 ].cryptodev_ops = &qat_sym_crypto_ops_gen1;
Signature · 1 line
2.17.1
PATCH v5 4/10 crypto/qat: rework session APIs
In reply to Kai JiThis patch introduces the set_session methods for different generations of QAT. In addition, the patch replaces 'min_qat_dev_gen_id' with 'qat_dev_gen'. Thus, the session no longer allow to be created by one generation of QAT used by another generation.
--- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 9 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 91 +++++++++++- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 139 +++++++++++++++++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 91 ++++++++++++ drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 3 + drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 64 +++++++++ drivers/crypto/qat/qat_crypto.h | 8 +- drivers/crypto/qat/qat_sym.c | 12 +- drivers/crypto/qat/qat_sym_session.c | 113 +++------------ drivers/crypto/qat/qat_sym_session.h | 2 +- 10 files changed, 425 insertions(+), 107 deletions(-)
drivers/crypto/qat/dev/qat_asym_pmd_gen1.c +8 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2017-2021 Intel Corporation +* Copyright(c) 2017-2022 Intel Corporation */ #include <rte_cryptodev.h>
@@ -65,6 +65,13 @@ qat_asym_crypto_feature_flags_get_gen1(return feature_flags; } +int +qat_asym_crypto_set_session_gen1(void *cdev __rte_unused, + void *session __rte_unused) +{ +return 0 ; +} +RTE_INIT (qat_asym_crypto_gen1_init) { qat_asym_gen_dev_ops[QAT_GEN1].cryptodev_ops =
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +90 -1
111 lines not on this page · raw message
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +139 -0
155 lines not on this page · raw message
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +91 -0
106 lines not on this page · raw message
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +3 -0
@@ -856,6 +856,9 @@ qat_asym_crypto_cap_get_gen1(struct qat_pci_device *qat_dev);uint64_t qat_asym_crypto_feature_flags_get_gen1 (struct qat_pci_device *qat_dev); +int +qat_asym_crypto_set_session_gen1 (void *cryptodev,void *session); +#ifdef RTE_LIB_SECURITY extern struct rte_security_ops security_qat_ops_gen1;
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +64 -0
76 lines not on this page · raw message
drivers/crypto/qat/qat_crypto.h +7 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2021 Intel Corporation +* Copyright(c) 2022 Intel Corporation */ #ifndef _QAT_CRYPTO_H_
@@ -48,15 +48,21 @@ typedef uint64_t (*get_feature_flags_t)(struct qat_pci_device *qat_dev);typedef void * (*create_security_ctx_t )(void *cryptodev); +typedef int (*set_session_t )(void *cryptodev,void *session); +struct qat_crypto_gen_dev_ops {get_feature_flags_t get_feature_flags;get_capabilities_info_t get_capabilities;struct rte_cryptodev_ops *cryptodev_ops; +set_session_t set_session;#ifdef RTE_LIB_SECURITY create_security_ctx_t create_security_ctx;#endif }; +extern struct qat_crypto_gen_dev_ops qat_sym_gen_dev_ops[]; +extern struct qat_crypto_gen_dev_ops qat_asym_gen_dev_ops[]; +int qat_cryptodev_config (struct rte_cryptodev *dev,struct rte_cryptodev_config *config);
drivers/crypto/qat/qat_sym.c +5 -7
@@ -13,6 +13,10 @@#include "qat_sym.h" #include "dev/qat_crypto_pmd_gens.h" +uint8_t qat_sym_driver_id; + +struct qat_crypto_gen_dev_ops qat_sym_gen_dev_ops[QAT_N_GENS ]; + static inline void set_cipher_iv(uint16_t iv_length, uint16_t iv_offset, struct icp_qat_fw_la_cipher_req_params *cipher_param,
@@ -126,7 +130,7 @@ handle_spc_gmac(struct qat_sym_session *ctx, struct rte_crypto_op *op,int qat_sym_build_request (void *in_op,uint8_t *out_msg, -void *op_cookie,enum qat_device_gen qat_dev_gen) + void *op_cookie, __rte_unused enum qat_device_gen qat_dev_gen) {int ret =0 ;struct qat_sym_session *ctx =NULL ;
@@ -191,12 +195,6 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg,return -EINVAL ; } -if (unlikely (ctx->min_qat_dev_gen > qat_dev_gen)) { -QAT_DP_LOG (ERR ,"Session alg not supported on this device gen" ); - op->status =RTE_CRYPTO_OP_STATUS_INVALID_SESSION ; -return -EINVAL ; - } - qat_req = (struct icp_qat_fw_la_bulk_req *)out_msg;rte_mov128 ((uint8_t *)qat_req, (const uint8_t *)&(ctx->fw_req)); qat_req->comn_mid.opaque_data = (uint64_t )(uintptr_t )op;
drivers/crypto/qat/qat_sym_session.c +17 -96
201 lines not on this page · raw message
drivers/crypto/qat/qat_sym_session.h +1 -1
@@ -105,7 +105,7 @@ struct qat_sym_session {uint16_t auth_key_length;uint16_t digest_length;rte_spinlock_t lock;/* protects this struct */ -enum qat_device_gen min_qat_dev_gen; +uint16_t dev_id;uint8_t aes_cmac;uint8_t is_single_pass;uint8_t is_single_pass_gmac;
Signature · 1 line
2.17.1
PATCH v5 5/10 crypto/qat: rework asymmetric crypto build operation
In reply to Kai JiThis patch reworks the asymmetric crypto data path implementation to QAT driver. The change includes separation of different QAT generations' asymmetric crypto data path implementations and shrink the device capabilities declaration code size.
--- drivers/common/qat/qat_qp.c | 5 +- drivers/crypto/qat/qat_asym.c | 624 +++++++++++++++++----------------- drivers/crypto/qat/qat_asym.h | 63 +++- 3 files changed, 380 insertions(+), 312 deletions(-)
drivers/common/qat/qat_qp.c +3 -2
@@ -622,7 +622,7 @@ qat_enqueue_op_burst(void *qp,#ifdef BUILD_QAT_ASYM ret =qat_asym_build_request (*ops, base_addr + tail, tmp_qp->op_cookies[tail >> queue->trailz], - tmp_qp->qat_dev_gen); +NULL , tmp_qp->qat_dev_gen);#endif }if (ret !=0 ) {
@@ -850,7 +850,8 @@ qat_dequeue_op_burst(void *qp, void **ops,#ifdef BUILD_QAT_ASYM else if (tmp_qp->service_type == QAT_SERVICE_ASYMMETRIC)qat_asym_process_response (ops, resp_msg, - tmp_qp->op_cookies[head >> rx_queue->trailz]); + tmp_qp->op_cookies[head >> rx_queue->trailz], + NULL); #endif head = adf_modulo(head + rx_queue->msg_size,
drivers/crypto/qat/qat_asym.c +320 -304
669 lines not on this page · raw message
drivers/crypto/qat/qat_asym.h +57 -6
99 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v5 6/10 crypto/qat: unify qat sym pmd apis
In reply to Kai JiThis patch removes qat_sym_pmd.c and integrates all the apis into qat_sym.c. The unified/integrated qat sym crypto pmd apis should make them easier to maintain.
--- drivers/common/qat/meson.build | 4 +- drivers/common/qat/qat_device.c | 4 +- drivers/common/qat/qat_qp.c | 3 +- drivers/crypto/qat/qat_crypto.h | 5 +- drivers/crypto/qat/qat_sym.c | 21 +++ drivers/crypto/qat/qat_sym.h | 147 ++++++++++++++-- drivers/crypto/qat/qat_sym_hw_dp.c | 11 +- drivers/crypto/qat/qat_sym_pmd.c | 251 --------------------------- drivers/crypto/qat/qat_sym_pmd.h | 95 ---------- drivers/crypto/qat/qat_sym_session.c | 2 +- 10 files changed, 168 insertions(+), 375 deletions(-) delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h
drivers/common/qat/meson.build +2 -2
@@ -1,5 +1,5 @@ # SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017-2018 Intel Corporation +# Copyright(c) 2017-2022 Intel Corporation if is_windows build = false
@@ -73,7 +73,7 @@ if qat_compress endif if qat_crypto - foreach f: ['qat_sym_pmd.c', 'qat_sym.c', 'qat_sym_session.c', + foreach f: ['qat_sym.c', 'qat_sym_session.c', 'qat_sym_hw_dp.c', 'qat_asym_pmd.c', 'qat_asym.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c',
drivers/common/qat/qat_device.c +2 -2
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2018-2020 Intel Corporation +* Copyright(c) 2018-2022 Intel Corporation */ #include <rte_string_fns.h>
@@ -8,7 +8,7 @@#include "qat_device.h" #include "adf_transport_access_macros.h" -#include "qat_sym_pmd.h" +#include "qat_sym.h" #include "qat_comp_pmd.h" #include "adf_pf2vf_msg.h" #include "qat_pf2vf.h"
drivers/common/qat/qat_qp.c +2 -1
@@ -841,7 +841,8 @@ qat_dequeue_op_burst(void *qp, void **ops,if (tmp_qp->service_type ==QAT_SERVICE_SYMMETRIC )qat_sym_process_response (ops, resp_msg, - tmp_qp->op_cookies[head >> rx_queue->trailz]); + tmp_qp->op_cookies[head >> rx_queue->trailz], +NULL );else if (tmp_qp->service_type ==QAT_SERVICE_COMPRESSION ) nb_fw_responses = qat_comp_process_response( ops, resp_msg,
drivers/crypto/qat/qat_crypto.h +4 -1
@@ -12,7 +12,10 @@extern uint8_t qat_sym_driver_id;extern uint8_t qat_asym_driver_id; -/** helper macro to set cryptodev capability range **/ +/** +* helper macro to set cryptodev capability range +* <n: name> <l: min > <r: max> <i: increment> <v: value> +**/ #define CAP_RNG (n, l, r, i) .n = {.min = l, .max = r, .increment = i}#define CAP_RNG_ZERO (n) .n = {.min = 0, .max = 0, .increment = 0}
drivers/crypto/qat/qat_sym.c +21 -0
@@ -17,6 +17,27 @@ uint8_t qat_sym_driver_id;struct qat_crypto_gen_dev_ops qat_sym_gen_dev_ops[QAT_N_GENS ]; +void +qat_sym_init_op_cookie (void *op_cookie) +{ +struct qat_sym_op_cookie *cookie = op_cookie; + + cookie->qat_sgl_src_phys_addr = +rte_mempool_virt2iova (cookie) + + offsetof(struct qat_sym_op_cookie , + qat_sgl_src); + + cookie->qat_sgl_dst_phys_addr = +rte_mempool_virt2iova (cookie) + + offsetof(struct qat_sym_op_cookie , + qat_sgl_dst); + + cookie->opt.spc_gmac.cd_phys_addr = +rte_mempool_virt2iova (cookie) + + offsetof(struct qat_sym_op_cookie , + opt.spc_gmac.cd_cipher); +} + static inline void set_cipher_iv(uint16_t iv_length, uint16_t iv_offset, struct icp_qat_fw_la_cipher_req_params *cipher_param,
drivers/crypto/qat/qat_sym.h +135 -12
193 lines not on this page · raw message
drivers/crypto/qat/qat_sym_hw_dp.c +1 -10
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2020 Intel Corporation +* Copyright(c) 2022 Intel Corporation */ #include <cryptodev_pmd.h>
@@ -9,18 +9,9 @@#include "icp_qat_fw_la.h" #include "qat_sym.h" -#include "qat_sym_pmd.h" #include "qat_sym_session.h" #include "qat_qp.h" -struct qat_sym_dp_ctx { -struct qat_sym_session *session; -uint32_t tail; -uint32_t head; -uint16_t cached_enqueue; -uint16_t cached_dequeue; -}; - static __rte_always_inline int32_tqat_sym_dp_parse_data_vec (struct qat_qp *qp,struct icp_qat_fw_la_bulk_req *req,struct rte_crypto_vec *data,uint16_t n_data_vecs)
drivers/crypto/qat/qat_sym_pmd.c deleted +0 -251
251 lines not on this page · raw message
drivers/crypto/qat/qat_sym_pmd.h deleted +0 -95
95 lines not on this page · raw message
drivers/crypto/qat/qat_sym_session.c +1 -1
@@ -20,7 +20,7 @@#include "qat_logs.h" #include "qat_sym_session.h" -#include "qat_sym_pmd.h" +#include "qat_sym.h" /* SHA1 - 20 bytes - Initialiser state can be found in FIPS stds 180-2 */ static const uint8_t sha1InitialState[] = {
Signature · 1 line
2.17.1
PATCH v5 7/10 crypto/qat: unify qat asym pmd apis
In reply to Kai JiThis patch removes qat_asym_pmd.c and integrates all the functions into qat_asym.c. The unified/integrated asym crypto pmd apis should make them easier to maintain.
--- drivers/common/qat/meson.build | 2 +- drivers/crypto/qat/qat_asym.c | 180 +++++++++++++++++++++++ drivers/crypto/qat/qat_asym_pmd.c | 231 ------------------------------ drivers/crypto/qat/qat_asym_pmd.h | 54 ------- 4 files changed, 181 insertions(+), 286 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h
drivers/common/qat/meson.build +1 -1
@@ -74,7 +74,7 @@ endif if qat_crypto foreach f: ['qat_sym.c', 'qat_sym_session.c', - 'qat_sym_hw_dp.c', 'qat_asym_pmd.c', 'qat_asym.c', 'qat_crypto.c', + 'qat_sym_hw_dp.c', 'qat_asym.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c', 'dev/qat_crypto_pmd_gen2.c',
drivers/crypto/qat/qat_asym.c +180 -0
192 lines not on this page · raw message
drivers/crypto/qat/qat_asym_pmd.c deleted +0 -231
231 lines not on this page · raw message
drivers/crypto/qat/qat_asym_pmd.h deleted +0 -54
54 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v5 8/10 crypto/qat: op burst data path rework
In reply to Kai JiThis patch enable op_build_request function in qat_enqueue_op_burst, and qat_dequeue_process_response function in qat_dequeue_op_burst. The op_build_request invoked in crypto build request op is based on crypto operations setup during session init.
--- drivers/common/qat/qat_qp.c | 42 +- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 4 - drivers/crypto/qat/qat_asym.c | 2 +- drivers/crypto/qat/qat_asym.h | 22 - drivers/crypto/qat/qat_sym.c | 829 +++++++--------------- drivers/crypto/qat/qat_sym.h | 5 - 6 files changed, 270 insertions(+), 634 deletions(-)
drivers/common/qat/qat_qp.c +9 -33
@@ -550,8 +550,7 @@ adf_modulo(uint32_t data, uint32_t modulo_mask) }uint16_t -qat_enqueue_op_burst (void *qp, - __rte_unused qat_op_build_request_t op_build_request, +qat_enqueue_op_burst (void *qp,qat_op_build_request_t op_build_request,void **ops,uint16_t nb_ops) { registerstruct qat_queue *queue;
@@ -602,29 +601,18 @@ qat_enqueue_op_burst(void *qp, } } -#ifdef BUILD_QAT_SYM +#ifdef RTE_LIB_SECURITY if (tmp_qp->service_type ==QAT_SERVICE_SYMMETRIC )qat_sym_preprocess_requests (ops, nb_ops_possible);#endif +memset (tmp_qp->opaque,0xff ,sizeof (tmp_qp->opaque)); +while (nb_ops_sent != nb_ops_possible) { -if (tmp_qp->service_type ==QAT_SERVICE_SYMMETRIC ) { -#ifdef BUILD_QAT_SYM - ret =qat_sym_build_request (*ops, base_addr + tail, - tmp_qp->op_cookies[tail >> queue->trailz], - tmp_qp->qat_dev_gen); -#endif - }else if (tmp_qp->service_type ==QAT_SERVICE_COMPRESSION ) { - ret =qat_comp_build_request (*ops, base_addr + tail, + ret =op_build_request (*ops, base_addr + tail, tmp_qp->op_cookies[tail >> queue->trailz], - tmp_qp->qat_dev_gen); - }else if (tmp_qp->service_type ==QAT_SERVICE_ASYMMETRIC ) { -#ifdef BUILD_QAT_ASYM - ret =qat_asym_build_request (*ops, base_addr + tail, - tmp_qp->op_cookies[tail >> queue->trailz], -NULL , tmp_qp->qat_dev_gen); -#endif - } + tmp_qp->opaque, tmp_qp->qat_dev_gen); +if (ret !=0 ) { tmp_qp->stats.enqueue_err_count++;/* This message cannot be enqueued */
@@ -820,8 +808,7 @@ qat_enqueue_comp_op_burst(void *qp, void **ops, uint16_t nb_ops)uint16_t qat_dequeue_op_burst (void *qp,void **ops, - __rte_unused qat_op_dequeue_t qat_dequeue_process_response, -uint16_t nb_ops) +qat_op_dequeue_t qat_dequeue_process_response,uint16_t nb_ops) {struct qat_queue *rx_queue;struct qat_qp *tmp_qp = (struct qat_qp *)qp;
@@ -839,21 +826,10 @@ qat_dequeue_op_burst(void *qp, void **ops, nb_fw_responses =1 ; -if (tmp_qp->service_type ==QAT_SERVICE_SYMMETRIC ) -qat_sym_process_response (ops, resp_msg, - tmp_qp->op_cookies[head >> rx_queue->trailz], -NULL ); -else if (tmp_qp->service_type ==QAT_SERVICE_COMPRESSION ) - nb_fw_responses =qat_comp_process_response ( + nb_fw_responses =qat_dequeue_process_response ( ops, resp_msg, tmp_qp->op_cookies[head >> rx_queue->trailz], &tmp_qp->stats.dequeue_err_count); -#ifdef BUILD_QAT_ASYM - else if (tmp_qp->service_type == QAT_SERVICE_ASYMMETRIC) - qat_asym_process_response(ops, resp_msg, - tmp_qp->op_cookies[head >> rx_queue->trailz], - NULL); -#endif head =adf_modulo (head + rx_queue->msg_size, rx_queue->modulo_mask);
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +0 -4
@@ -146,10 +146,6 @@ struct rte_cryptodev_ops qat_sym_crypto_ops_gen1 = { .sym_session_get_size = qat_sym_session_get_private_size, .sym_session_configure = qat_sym_session_configure, .sym_session_clear = qat_sym_session_clear, - -/* Raw data-path API related operations */ - .sym_get_raw_dp_ctx_size = qat_sym_get_dp_ctx_size, - .sym_configure_raw_dp_ctx = qat_sym_configure_dp_ctx, }; static struct qat_capabilities_info
drivers/crypto/qat/qat_asym.c +1 -1
@@ -773,7 +773,7 @@ qat_asym_fill_arrays(struct rte_crypto_asym_op *asym_op,return 0 ; } -int +static __rte_always_inline intqat_asym_build_request (void *in_op,uint8_t *out_msg,void *op_cookie, __rte_unused uint64_t *opaque, __rte_unused enum qat_device_gen dev_gen)
drivers/crypto/qat/qat_asym.h +0 -22
@@ -104,28 +104,6 @@ void qat_asym_session_clear(struct rte_cryptodev *dev, struct rte_cryptodev_asym_session *sess); -/* -* Build PKE request to be sent to the fw, partially uses template -* request generated during session creation. -* -* @param in_op Pointer to the crypto operation, for every -* service it points to service specific struct. -* @param out_msg Message to be returned to enqueue function -* @param op_cookie Cookie pointer that holds private metadata -* @param qat_dev_gen Generation of QAT hardware -* -* @return -* This function always returns zero, -* it is because of backward compatibility. -* - 0: Always returned -* -*/ -int -qat_asym_build_request (void *in_op,uint8_t *out_msg, -void *op_cookie, - __rte_unused uint64_t *opaque, -enum qat_device_gen qat_dev_gen); -/* * Process PKE response received from outgoing queue of QAT *
drivers/crypto/qat/qat_sym.c +260 -569
895 lines not on this page · raw message
drivers/crypto/qat/qat_sym.h +0 -5
@@ -131,11 +131,6 @@ uint16_t qat_sym_dequeue_burst(void *qp, struct rte_crypto_op **ops, uint16_t nb_ops); -int -qat_sym_build_request (void *in_op,uint8_t *out_msg, -void *op_cookie,enum qat_device_gen qat_dev_gen); - -/** Encrypt a single partial block * Depends on openssl libcrypto * Uses ECB+XOR to do CFB encryption, same result, more performant
Signature · 1 line
2.17.1
PATCH v5 9/10 crypto/qat: raw dp api integration
In reply to Kai JiThis patch "unifies" QAT's raw dp api implementations to share the same enqueue/dequeue methods as the crypto operation enqueue/dequeue methods. In addition, different QAT generation specific implementations are done respectively. The qat_sym_hw_dp.c is removed as no longer required.
--- drivers/common/qat/meson.build | 2 +- drivers/compress/qat/qat_comp_pmd.c | 12 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 2 + drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 214 ++++ drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 122 +++ drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 78 ++ drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 656 +++++++++++++ drivers/crypto/qat/qat_crypto.h | 3 + drivers/crypto/qat/qat_sym.c | 56 +- drivers/crypto/qat/qat_sym_hw_dp.c | 974 ------------------- 10 files changed, 1137 insertions(+), 982 deletions(-) delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c
drivers/common/qat/meson.build +1 -1
@@ -74,7 +74,7 @@ endif if qat_crypto foreach f: ['qat_sym.c', 'qat_sym_session.c', - 'qat_sym_hw_dp.c', 'qat_asym.c', 'qat_crypto.c', + 'qat_asym.c', 'qat_crypto.c', 'dev/qat_sym_pmd_gen1.c', 'dev/qat_asym_pmd_gen1.c', 'dev/qat_crypto_pmd_gen2.c',
drivers/compress/qat/qat_comp_pmd.c +9 -3
@@ -616,11 +616,18 @@ static struct rte_compressdev_ops compress_qat_dummy_ops = { .private_xform_free = qat_comp_private_xform_free }; +static uint16_t +qat_comp_dequeue_burst (void *qp,struct rte_comp_op **ops,uint16_t nb_ops) +{ +return qat_dequeue_op_burst (qp, (void **)ops, qat_comp_process_response, + nb_ops); +} +static uint16_t qat_comp_pmd_dequeue_first_op_burst (void *qp,struct rte_comp_op **ops,uint16_t nb_ops) { -uint16_t ret =qat_dequeue_op_burst (qp, (void **)ops,NULL , nb_ops); +uint16_t ret =qat_comp_dequeue_burst (qp, ops, nb_ops);struct qat_qp *tmp_qp = (struct qat_qp *)qp;if (ret) {
@@ -638,8 +645,7 @@ qat_comp_pmd_dequeue_first_op_burst(void *qp, struct rte_comp_op **ops, }else { tmp_qp->qat_dev->comp_dev->compressdev->dequeue_burst = - (compressdev_dequeue_pkt_burst_t ) - qat_dequeue_op_burst; + qat_comp_dequeue_burst; } }return ret;
drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c +2 -0
@@ -291,6 +291,8 @@ RTE_INIT(qat_sym_crypto_gen2_init) qat_sym_crypto_cap_get_gen2; qat_sym_gen_dev_ops[QAT_GEN2 ].set_session = qat_sym_crypto_set_session_gen2; + qat_sym_gen_dev_ops[QAT_GEN2 ].set_raw_dp_ctx = + qat_sym_configure_raw_dp_ctx_gen1; qat_sym_gen_dev_ops[QAT_GEN2 ].get_feature_flags = qat_sym_crypto_feature_flags_get_gen1;
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +214 -0
226 lines not on this page · raw message
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +122 -0
134 lines not on this page · raw message
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +78 -0
84 lines not on this page · raw message
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +656 -0
674 lines not on this page · raw message
drivers/crypto/qat/qat_crypto.h +3 -0
@@ -53,11 +53,14 @@ typedef void * (*create_security_ctx_t)(void *cryptodev);typedef int (*set_session_t )(void *cryptodev,void *session); +typedef int (*set_raw_dp_ctx_t )(void *raw_dp_ctx,void *ctx); +struct qat_crypto_gen_dev_ops {get_feature_flags_t get_feature_flags;get_capabilities_info_t get_capabilities;struct rte_cryptodev_ops *cryptodev_ops;set_session_t set_session; +set_raw_dp_ctx_t set_raw_dp_ctx;#ifdef RTE_LIB_SECURITY create_security_ctx_t create_security_ctx;#endif
drivers/crypto/qat/qat_sym.c +52 -4
80 lines not on this page · raw message
drivers/crypto/qat/qat_sym_hw_dp.c deleted +0 -974
974 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v5 10/10 crypto/qat: support out of place SG list
In reply to Kai JiThis patch adds the SGL out of place support to QAT PMD
--- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 28 ++++++++-- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 14 ++++- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 55 +++++++++++++++++--- 3 files changed, 83 insertions(+), 14 deletions(-)
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +24 -4
@@ -468,8 +468,18 @@ qat_sym_dp_enqueue_aead_jobs_gen3(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ;
@@ -565,8 +575,18 @@ qat_sym_dp_enqueue_auth_jobs_gen3(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ; enqueue_one_auth_job_gen3(ctx, cookie, req, &vec->digest[i],
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +12 -2
@@ -297,8 +297,18 @@ qat_sym_dp_enqueue_aead_jobs_gen4(void *qp_data, uint8_t *drv_ctx, (uint8_t *)tx_queue->base_addr + tail);rte_mov128 ((uint8_t *)req, (const uint8_t *)&(ctx->fw_req)); - data_len =qat_sym_build_req_set_data (req, user_data[i], cookie, - vec->src_sgl[i].vec, vec->src_sgl[i].num,NULL ,0 ); +if (vec->dest_sgl) { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, vec->src_sgl[i].num, + vec->dest_sgl[i].vec, vec->dest_sgl[i].num); + }else { + data_len =qat_sym_build_req_set_data (req, + user_data[i], cookie, + vec->src_sgl[i].vec, + vec->src_sgl[i].num,NULL ,0 ); + } +if (unlikely (data_len <0 ))break ;
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +47 -8
80 lines not on this page · raw message
Signature · 1 line
2.17.1
v6 cover drivers/qat: QAT symmetric crypto datapatch rework
In reply to Kai JiThis patch reworks QAT symmetric crypto datapatch implementation where each generation request building separated and the crypto operation under the raw datapath api implementation are unified.
In addtion this patchset also enables QAT OOP support in raw datapath api implementation.
v6:
- fix of pointer cast error in x86
- rebase to the lastest for-main
v5:
- rebase to the latest for-main
- patchset reconstruct
v4:
- patchset break down and reconstruct
v3:
- sperate a single patch 6 to two different patches
v2:
- review comments addressed
Kai Ji (10):
common/qat: define build op request and dequeue op crypto/qat: sym build op request specific implementation crypto/qat: qat generation specific enqueue crypto/qat: rework session APIs
crypto/qat: rework asymmetric crypto build operation crypto/qat: unify qat sym pmd apis
crypto/qat: unify qat asym pmd apis
crypto/qat: op burst data path rework crypto/qat: raw dp api integration
crypto/qat: support out of place SG list
drivers/common/qat/meson.build | 6 +- drivers/common/qat/qat_device.c | 4 +- drivers/common/qat/qat_qp.c | 42 +- drivers/common/qat/qat_qp.h | 54 +- drivers/compress/qat/qat_comp_pmd.c | 14 +- drivers/crypto/qat/dev/qat_asym_pmd_gen1.c | 9 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 93 +- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 490 ++++++++- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 257 ++++- drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 913 ++++++++++++++++- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 942 +++++++++++++++++- drivers/crypto/qat/qat_asym.c | 762 ++++++++------ drivers/crypto/qat/qat_asym.h | 79 +- drivers/crypto/qat/qat_asym_pmd.c | 231 ----- drivers/crypto/qat/qat_asym_pmd.h | 54 - drivers/crypto/qat/qat_crypto.h | 16 +- drivers/crypto/qat/qat_sym.c | 978 ++++++------------ drivers/crypto/qat/qat_sym.h | 148 ++- drivers/crypto/qat/qat_sym_hw_dp.c | 983 ------------------- drivers/crypto/qat/qat_sym_pmd.c | 251 ----- drivers/crypto/qat/qat_sym_pmd.h | 95 -- drivers/crypto/qat/qat_sym_session.c | 115 +-- drivers/crypto/qat/qat_sym_session.h | 15 +- 23 files changed, 3812 insertions(+), 2739 deletions(-) delete mode 100644 drivers/crypto/qat/qat_asym_pmd.c delete mode 100644 drivers/crypto/qat/qat_asym_pmd.h delete mode 100644 drivers/crypto/qat/qat_sym_hw_dp.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.c delete mode 100644 drivers/crypto/qat/qat_sym_pmd.h
--
2.17.1
PATCH v6 1/10 common/qat: define build op request and dequeue op
This patch introduce build request op and dequeue op function pointers to qat queue pair implementation. Those two functions are used to be assigned during qat session generation based on crypto operation
--- drivers/common/qat/qat_qp.c | 10 ++++-- drivers/common/qat/qat_qp.h | 54 ++++++++++++++++++++++++++-- drivers/compress/qat/qat_comp_pmd.c | 4 +-- drivers/crypto/qat/qat_asym_pmd.c | 4 +-- drivers/crypto/qat/qat_sym_pmd.c | 4 +-- drivers/crypto/qat/qat_sym_session.h | 13 ++++++- 6 files changed, 76 insertions(+), 13 deletions(-)
drivers/common/qat/qat_qp.c +7 -3
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2015-2018 Intel Corporation +* Copyright(c) 2015-2022 Intel Corporation */ #include <rte_common.h>
@@ -550,7 +550,9 @@ adf_modulo(uint32_t data, uint32_t modulo_mask) }uint16_t -qat_enqueue_op_burst (void *qp,void **ops,uint16_t nb_ops) +qat_enqueue_op_burst (void *qp, + __rte_unused qat_op_build_request_t op_build_request, +void **ops,uint16_t nb_ops) { registerstruct qat_queue *queue;struct qat_qp *tmp_qp = (struct qat_qp *)qp;
@@ -817,7 +819,9 @@ qat_enqueue_comp_op_burst(void *qp, void **ops, uint16_t nb_ops) }uint16_t -qat_dequeue_op_burst (void *qp,void **ops,uint16_t nb_ops) +qat_dequeue_op_burst (void *qp,void **ops, + __rte_unused qat_op_dequeue_t qat_dequeue_process_response, +uint16_t nb_ops) {struct qat_queue *rx_queue;struct qat_qp *tmp_qp = (struct qat_qp *)qp;
drivers/common/qat/qat_qp.h +51 -3
81 lines not on this page · raw message
drivers/compress/qat/qat_comp_pmd.c +2 -2
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2015-2019 Intel Corporation +* Copyright(c) 2015-2022 Intel Corporation */ #include <rte_malloc.h>
@@ -620,7 +620,7 @@ static uint16_t qat_comp_pmd_dequeue_first_op_burst(void *qp, struct rte_comp_op **ops, uint16_t nb_ops) { -uint16_t ret =qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +uint16_t ret =qat_dequeue_op_burst (qp, (void **)ops,NULL , nb_ops);struct qat_qp *tmp_qp = (struct qat_qp *)qp;if (ret) {
drivers/crypto/qat/qat_asym_pmd.c +2 -2
@@ -62,13 +62,13 @@ static struct rte_cryptodev_ops crypto_qat_ops = {uint16_t qat_asym_pmd_enqueue_op_burst (void *qp,struct rte_crypto_op **ops,uint16_t nb_ops) { -return qat_enqueue_op_burst (qp, (void **)ops, nb_ops); +return qat_enqueue_op_burst (qp,NULL , (void **)ops, nb_ops); }uint16_t qat_asym_pmd_dequeue_op_burst (void *qp,struct rte_crypto_op **ops,uint16_t nb_ops) { -return qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +return qat_dequeue_op_burst (qp, (void **)ops,NULL , nb_ops); }/* An rte_driver is needed in the registration of both the device and the driver
drivers/crypto/qat/qat_sym_pmd.c +2 -2
@@ -49,14 +49,14 @@ static uint16_t qat_sym_pmd_enqueue_op_burst(void *qp, struct rte_crypto_op **ops, uint16_t nb_ops) { -return qat_enqueue_op_burst (qp, (void **)ops, nb_ops); +return qat_enqueue_op_burst (qp,NULL , (void **)ops, nb_ops); }static uint16_t qat_sym_pmd_dequeue_op_burst (void *qp,struct rte_crypto_op **ops,uint16_t nb_ops) { -return qat_dequeue_op_burst (qp, (void **)ops, nb_ops); +return qat_dequeue_op_burst (qp, (void **)ops,NULL , nb_ops); }/* An rte_driver is needed in the registration of both the device and the driver
drivers/crypto/qat/qat_sym_session.h +12 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2015-2019 Intel Corporation +* Copyright(c) 2015-2022 Intel Corporation */ #ifndef _QAT_SYM_SESSION_H_#define _QAT_SYM_SESSION_H_
@@ -63,6 +63,16 @@ enum qat_sym_proto_flag {QAT_CRYPTO_PROTO_FLAG_ZUC =4 }; +struct qat_sym_session ; + +/* +* typedef qat_op_build_request_t function pointer, passed in as argument +* in enqueue op burst, where a build request assigned base on the type of +* crypto op. +*/ +typedef int (*qat_sym_build_request_t )(void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); +/* Common content descriptor */ struct qat_sym_cd {struct icp_qat_hw_cipher_algo_blk cipher;
@@ -107,6 +117,7 @@ struct qat_sym_session {/* Some generations need different setup of counter */ uint32_t slice_types;enum qat_sym_proto_flag qat_proto_flag; +qat_sym_build_request_t build_request[2 ]; };int
Signature · 1 line
2.17.1
PATCH v6 2/10 crypto/qat: sym build op request specific implementation
In reply to Kai JiThis patch adds common inline functions for QAT symmetric crypto driver to process crypto op and the build op request function pointer implementation for QAT generation 1.
--- drivers/crypto/qat/dev/qat_crypto_pmd_gens.h | 832 ++++++++++++++++++- drivers/crypto/qat/dev/qat_sym_pmd_gen1.c | 187 ++++- drivers/crypto/qat/qat_sym.c | 90 +- 3 files changed, 1019 insertions(+), 90 deletions(-)
drivers/crypto/qat/dev/qat_crypto_pmd_gens.h +831 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2017-2021 Intel Corporation +* Copyright(c) 2017-2022 Intel Corporation */ #ifndef _QAT_CRYPTO_PMD_GENS_H_
@@ -8,14 +8,844 @@#include <rte_cryptodev.h> #include "qat_crypto.h" #include "qat_sym_session.h" +#include "qat_sym.h" + +#define QAT_SYM_DP_GET_MAX_ENQ (q, c, n) \ + RTE_MIN((q->max_inflights - q->enqueued + q->dequeued - c), n) + +#define QAT_SYM_DP_IS_RESP_SUCCESS (resp) \ + (ICP_QAT_FW_COMN_STATUS_FLAG_OK == \ + ICP_QAT_FW_COMN_RESP_CRYPTO_STAT_GET(resp->comn_hdr.comn_status)) + +static __rte_always_inline int +op_bpi_cipher_decrypt (uint8_t *src,uint8_t *dst, +uint8_t *iv,int ivlen,int srclen, +void *bpi_ctx) +{ +EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX *)bpi_ctx; +int encrypted_ivlen; +uint8_t encrypted_iv[BPI_MAX_ENCR_IV_LEN ]; +uint8_t *encr = encrypted_iv; + +/* ECB method: encrypt (not decrypt!) the IV, then XOR with plaintext */ +if (EVP_EncryptUpdate (ctx, encrypted_iv, &encrypted_ivlen, iv, ivlen) + <=0 ) + goto cipher_decrypt_err; + +for (; srclen !=0 ; --srclen, ++dst, ++src, ++encr) + *dst = *src ^ *encr; + +return 0 ; + +cipher_decrypt_err: +QAT_DP_LOG (ERR ,"libcrypto ECB cipher decrypt for BPI IV failed" ); +return -EINVAL ; +} + +static __rte_always_inline uint32_t +qat_bpicipher_preprocess (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +int block_len =qat_cipher_get_block_size (ctx->qat_cipher_alg); +struct rte_crypto_sym_op *sym_op = op->sym; +uint8_t last_block_len = block_len >0 ? + sym_op->cipher.data.length % block_len :0 ; + +if (last_block_len && ctx->qat_dir ==ICP_QAT_HW_CIPHER_DECRYPT ) { +/* Decrypt last block */ +uint8_t *last_block, *dst, *iv; +uint32_t last_block_offset = sym_op->cipher.data.offset + + sym_op->cipher.data.length - last_block_len; + last_block = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_src, + uint8_t *, last_block_offset); + +if (unlikely ((sym_op->m_dst !=NULL ) + && (sym_op->m_dst != sym_op->m_src))) +/* out-of-place operation (OOP) */ + dst = (uint8_t *)rte_pktmbuf_mtod_offset (sym_op->m_dst, + uint8_t *, last_block_offset); +else + dst = last_block; + +if (last_block_len < sym_op->cipher.data.length) +/* use previous block ciphertext as IV */ + iv = last_block - block_len; +else +/* runt block, i.e. less than one full block */ + iv = rte_crypto_op_ctod_offset(op, uint8_t *, + ctx->cipher_iv.offset); + +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src before pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst before pre-process:" , + dst, last_block_len); +#endif +op_bpi_cipher_decrypt (last_block, dst, iv, block_len, + last_block_len, ctx->bpi_ctx); +#if RTE_LOG_DP_LEVEL >=RTE_LOG_DEBUG +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: src after pre-process:" , + last_block, last_block_len); +if (sym_op->m_dst !=NULL ) +QAT_DP_HEXDUMP_LOG (DEBUG ,"BPI: dst after pre-process:" , + dst, last_block_len); +#endif + } + +return sym_op->cipher.data.length - last_block_len; +} + +static __rte_always_inline int +qat_auth_is_len_in_bits (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 ) { +if (unlikely ((op->sym->auth.data.offset %BYTE_LENGTH !=0 ) || + (op->sym->auth.data.length %BYTE_LENGTH !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int +qat_cipher_is_len_in_bits (struct qat_sym_session *ctx, +struct rte_crypto_op *op) +{ +if (ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_SNOW_3G_UEA2 || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_KASUMI || + ctx->qat_cipher_alg ==ICP_QAT_HW_CIPHER_ALGO_ZUC_3G_128_EEA3 ) { +if (unlikely ((op->sym->cipher.data.length %BYTE_LENGTH !=0 ) || + ((op->sym->cipher.data.offset % +BYTE_LENGTH ) !=0 ))) +return -EINVAL ; +return 1 ; + } +return 0 ; +} + +static __rte_always_inline int32_t +qat_sym_build_req_set_data (struct icp_qat_fw_la_bulk_req *req, +void *opaque,struct qat_sym_op_cookie *cookie, +struct rte_crypto_vec *src_vec,uint16_t n_src, +struct rte_crypto_vec *dst_vec,uint16_t n_dst) +{ +struct qat_sgl *list; +uint32_t i; +uint32_t tl_src =0 , total_len_src, total_len_dst; +uint64_t src_data_start =0 , dst_data_start =0 ; +int is_sgl = n_src >1 || n_dst >1 ; + +if (unlikely (n_src <1 || n_src >QAT_SYM_SGL_MAX_NUMBER || + n_dst >QAT_SYM_SGL_MAX_NUMBER )) +return -1 ; + +if (likely (!is_sgl)) { + src_data_start = src_vec[0 ].iova; + tl_src = total_len_src = + src_vec[0 ].len; +if (unlikely (n_dst)) {/* oop */ + total_len_dst = dst_vec[0 ].len; + + dst_data_start = dst_vec[0 ].iova; +if (unlikely (total_len_src != total_len_dst)) +return -EINVAL ; + }else { + dst_data_start = src_data_start; + total_len_dst = tl_src; + } + }else {/* sgl */ + total_len_dst = total_len_src =0 ; + +ICP_QAT_FW_COMN_PTR_TYPE_SET (req->comn_hdr.comn_req_flags, +QAT_COMN_PTR_TYPE_SGL ); + + list = (struct qat_sgl *)&cookie->qat_sgl_src; +for (i =0 ; i < n_src; i++) { + list->buffers[i].len = src_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = src_vec[i].iova; +if (tl_src + src_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -1 ; + } + tl_src += src_vec[i].len; + } + + list->num_bufs = i; + src_data_start = cookie->qat_sgl_src_phys_addr; + +if (unlikely (n_dst >0 )) {/* oop sgl */ +uint32_t tl_dst =0 ; + + list = (struct qat_sgl *)&cookie->qat_sgl_dst; + +for (i =0 ; i < n_dst; i++) { + list->buffers[i].len = dst_vec[i].len; + list->buffers[i].resrvd =0 ; + list->buffers[i].addr = dst_vec[i].iova; +if (tl_dst + dst_vec[i].len >UINT32_MAX ) { +QAT_DP_LOG (ERR ,"Message too long" ); +return -ENOTSUP ; + } + + tl_dst += dst_vec[i].len; + } + +if (tl_src != tl_dst) +return -EINVAL ; + list->num_bufs = i; + dst_data_start = cookie->qat_sgl_dst_phys_addr; + }else + dst_data_start = src_data_start; + } + + req->comn_mid.src_data_addr = src_data_start; + req->comn_mid.dest_data_addr = dst_data_start; + req->comn_mid.src_length = total_len_src; + req->comn_mid.dst_length = total_len_dst; + req->comn_mid.opaque_data = (uintptr_t )opaque; + +return tl_src; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_cipher (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, + struct rte_crypto_va_iova_ptr *auth_iv_or_aad __rte_unused, + struct rte_crypto_va_iova_ptr *digest __rte_unused) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int n_src =0 ; +int ret; + + ret =qat_cipher_is_len_in_bits (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->cipher.data.length >>3 ; + cipher_ofs = op->sym->cipher.data.offset >>3 ; +break ; +case 0 : +if (ctx->bpi_ctx) { +/* DOCSIS - only send complete blocks to device. +* Process any partial block using CFB mode. +* Even if 0 complete blocks, still send this to device +* to get into rx queue for post-process and dequeuing +*/ + cipher_len =qat_bpicipher_preprocess (ctx, op); + cipher_ofs = op->sym->cipher.data.offset; + }else { + cipher_len = op->sym->cipher.data.length; + cipher_ofs = op->sym->cipher.data.offset; + } +break ; +default : +QAT_DP_LOG (ERR , +"SNOW3G/KASUMI/ZUC in QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, + cipher_len, in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if ((n_dst <0 ) || (n_dst > op->sym->m_dst->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_auth (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, + struct rte_crypto_va_iova_ptr *cipher_iv __rte_unused, +struct rte_crypto_va_iova_ptr *auth_iv, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t auth_ofs =0 , auth_len =0 ; +int n_src, ret; + + ret =qat_auth_is_len_in_bits (ctx, op); +switch (ret) { +case 1 : + auth_ofs = op->sym->auth.data.offset >>3 ; + auth_len = op->sym->auth.data.length >>3 ; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); +break ; +case 0 : +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_128 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_64 ) { +/* AES-GMAC */ + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + }else { + auth_ofs = op->sym->auth.data.offset; + auth_len = op->sym->auth.data.length; + auth_iv->va =NULL ; + auth_iv->iova =0 ; + } +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return UINT64_MAX ; + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, auth_ofs, + auth_ofs + auth_len, in_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, auth_ofs, + auth_ofs + auth_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); + +if ((n_dst <0 ) || (n_dst > op->sym->m_dst->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + +return 0 ; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_chain (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +union rte_crypto_sym_ofs ofs; +uint32_t min_ofs =0 , max_len =0 ; +uint32_t cipher_len =0 , cipher_ofs =0 ; +uint32_t auth_len =0 , auth_ofs =0 ; +int is_oop = (op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src); +int is_sgl = op->sym->m_src->nb_segs >1 ; +int n_src; +int ret; + +if (unlikely (is_oop)) + is_sgl |= op->sym->m_dst->nb_segs >1 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = rte_crypto_op_ctod_offset(op, void *, + ctx->auth_iv.offset); + auth_iv_or_aad->iova =rte_crypto_op_ctophys_offset (op, + ctx->auth_iv.offset); + digest->va = (void *)op->sym->auth.digest.data; + digest->iova = op->sym->auth.digest.phys_addr; + + ret =qat_cipher_is_len_in_bits (ctx, op); +switch (ret) { +case 1 : + cipher_len = op->sym->aead.data.length >>3 ; + cipher_ofs = op->sym->aead.data.offset >>3 ; +break ; +case 0 : + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + ret =qat_auth_is_len_in_bits (ctx, op); +switch (ret) { +case 1 : + auth_len = op->sym->auth.data.length >>3 ; + auth_ofs = op->sym->auth.data.offset >>3 ; +break ; +case 0 : + auth_len = op->sym->auth.data.length; + auth_ofs = op->sym->auth.data.offset; +break ; +default : +QAT_DP_LOG (ERR , +"For SNOW3G/KASUMI/ZUC, QAT PMD only supports byte aligned values" ); + op->status =RTE_CRYPTO_OP_STATUS_INVALID_ARGS ; +return -EINVAL ; + } + + min_ofs = cipher_ofs < auth_ofs ? cipher_ofs : auth_ofs; + max_len =RTE_MAX (cipher_ofs + cipher_len, auth_ofs + auth_len); + +/* digest in buffer check. Needed only for wireless algos */ +if (ret ==1 ) { +/* Handle digest-encrypted cases, i.e. +* auth-gen-then-cipher-encrypt and +* cipher-decrypt-then-auth-verify +*/ +uint64_t auth_end_iova; + +if (unlikely (is_sgl)) { +uint32_t remaining_off = auth_ofs + auth_len; +struct rte_mbuf *sgl_buf = (is_oop ? op->sym->m_dst : + op->sym->m_src); + +while (remaining_off >=rte_pktmbuf_data_len (sgl_buf) + && sgl_buf->next !=NULL ) { + remaining_off -=rte_pktmbuf_data_len (sgl_buf); + sgl_buf = sgl_buf->next; + } + + auth_end_iova = (uint64_t )rte_pktmbuf_iova_offset ( + sgl_buf, remaining_off); + }else + auth_end_iova = (is_oop ? +rte_pktmbuf_iova (op->sym->m_dst) : +rte_pktmbuf_iova (op->sym->m_src)) + auth_ofs + + auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_ofs + auth_len < cipher_ofs + cipher_len) && + (digest->iova == auth_end_iova)) + max_len =RTE_MAX (max_len, auth_ofs + auth_len + + ctx->digest_length); + } + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, min_ofs, max_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (unlikely (n_src <0 || n_src > op->sym->m_src->nb_segs)) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + in_sgl->num = n_src; + +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, min_ofs, + max_len, out_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); + +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return -1 ; + } + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + + ofs.ofs.cipher.head = cipher_ofs; + ofs.ofs.cipher.tail = max_len - cipher_ofs - cipher_len; + ofs.ofs.auth.head = auth_ofs; + ofs.ofs.auth.tail = max_len - auth_ofs - auth_len; + +return ofs.raw; +} + +static __rte_always_inline uint64_t +qat_sym_convert_op_to_vec_aead (struct rte_crypto_op *op, +struct qat_sym_session *ctx, +struct rte_crypto_sgl *in_sgl,struct rte_crypto_sgl *out_sgl, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *auth_iv_or_aad, +struct rte_crypto_va_iova_ptr *digest) +{ +uint32_t cipher_len =0 , cipher_ofs =0 ; +int32_t n_src =0 ; + + cipher_iv->va = rte_crypto_op_ctod_offset(op, void *, + ctx->cipher_iv.offset); + cipher_iv->iova =rte_crypto_op_ctophys_offset (op, + ctx->cipher_iv.offset); + auth_iv_or_aad->va = (void *)op->sym->aead.aad.data; + auth_iv_or_aad->iova = op->sym->aead.aad.phys_addr; + digest->va = (void *)op->sym->aead.digest.data; + digest->iova = op->sym->aead.digest.phys_addr; + + cipher_len = op->sym->aead.data.length; + cipher_ofs = op->sym->aead.data.offset; + + n_src =rte_crypto_mbuf_to_vec (op->sym->m_src, cipher_ofs, cipher_len, + in_sgl->vec,QAT_SYM_SGL_MAX_NUMBER ); +if (n_src <0 || n_src > op->sym->m_src->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + in_sgl->num = n_src; + +/* Out-Of-Place operation */ +if (unlikely ((op->sym->m_dst !=NULL ) && + (op->sym->m_dst != op->sym->m_src))) { +int n_dst =rte_crypto_mbuf_to_vec (op->sym->m_dst, cipher_ofs, + cipher_len, out_sgl->vec, +QAT_SYM_SGL_MAX_NUMBER ); +if (n_dst <0 || n_dst > op->sym->m_dst->nb_segs) { + op->status =RTE_CRYPTO_OP_STATUS_ERROR ; +return UINT64_MAX ; + } + + out_sgl->num = n_dst; + }else + out_sgl->num =0 ; + +return 0 ; +} + +static __rte_always_inline void +qat_set_cipher_iv (struct icp_qat_fw_la_cipher_req_params *cipher_param, +struct rte_crypto_va_iova_ptr *iv_ptr,uint32_t iv_len, +struct icp_qat_fw_la_bulk_req *qat_req) +{ +/* copy IV into request if it fits */ +if (iv_len <=sizeof (cipher_param->u.cipher_IV_array)) +rte_memcpy (cipher_param->u.cipher_IV_array, iv_ptr->va, + iv_len); +else { +ICP_QAT_FW_LA_CIPH_IV_FLD_FLAG_SET ( + qat_req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_CIPH_IV_64BIT_PTR ); + cipher_param->u.s.cipher_IV_ptr = iv_ptr->iova; + } +} + +static __rte_always_inline void +qat_sym_dp_fill_vec_status (int32_t *sta,int status,uint32_t n) +{ +uint32_t i; + +for (i =0 ; i < n; i++) + sta[i] = status; +} + +static __rte_always_inline void +enqueue_one_cipher_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + +/* cipher IV */ +qat_set_cipher_iv (cipher_param, iv, ctx->cipher_iv.length, req); + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; +} + +static __rte_always_inline void +enqueue_one_auth_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = data_len - ofs.ofs.auth.head - + ofs.ofs.auth.tail; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, auth_iv->va, + ctx->auth_iv.length); +break ; +default : +break ; + } +} + +static __rte_always_inline int +enqueue_one_chain_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_vec *src_vec, +uint16_t n_src_vecs, +struct rte_crypto_vec *dst_vec, +uint16_t n_dst_vecs, +struct rte_crypto_va_iova_ptr *cipher_iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param; +struct icp_qat_fw_la_auth_req_params *auth_param; +struct rte_crypto_vec *cvec = n_dst_vecs >0 ? + dst_vec : src_vec; +rte_iova_t auth_iova_end; +int cipher_len, auth_len; +int is_sgl = n_src_vecs >1 || n_dst_vecs >1 ; + + cipher_param = (void *)&req->serv_specif_rqpars; + auth_param = (void *)((uint8_t *)cipher_param + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); + + cipher_len = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_len = data_len - ofs.ofs.auth.head - ofs.ofs.auth.tail; + +if (unlikely (cipher_len <0 || auth_len <0 )) +return -1 ; + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = cipher_len; +qat_set_cipher_iv (cipher_param, cipher_iv, ctx->cipher_iv.length, req); + + auth_param->auth_off = ofs.ofs.auth.head; + auth_param->auth_len = auth_len; + auth_param->auth_res_addr = digest->iova; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 : +case ICP_QAT_HW_AUTH_ALGO_KASUMI_F9 : +case ICP_QAT_HW_AUTH_ALGO_ZUC_3G_128_EIA3 : + auth_param->u1.aad_adr = auth_iv->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +break ; +default : +break ; + } + +if (unlikely (is_sgl)) { +/* sgl */ +int i = n_dst_vecs ? n_dst_vecs : n_src_vecs; +uint32_t remaining_off = data_len - ofs.ofs.auth.tail; + +while (remaining_off >= cvec->len && i >=1 ) { + i--; + remaining_off -= cvec->len; + cvec++; + } + + auth_iova_end = cvec->iova + remaining_off; + }else + auth_iova_end = cvec[0 ].iova + auth_param->auth_off + + auth_param->auth_len; + +/* Then check if digest-encrypted conditions are met */ +if ((auth_param->auth_off + auth_param->auth_len < + cipher_param->cipher_offset + cipher_param->cipher_length) && + (digest->iova == auth_iova_end)) { +/* Handle partial digest encryption */ +if (cipher_param->cipher_offset + cipher_param->cipher_length < + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length && !is_sgl) + req->comn_mid.dst_length = req->comn_mid.src_length = + auth_param->auth_off + auth_param->auth_len + + ctx->digest_length; +struct icp_qat_fw_comn_req_hdr *header = &req->comn_hdr; +ICP_QAT_FW_LA_DIGEST_IN_BUFFER_SET (header->serv_specif_flags, +ICP_QAT_FW_LA_DIGEST_IN_BUFFER ); + } + +return 0 ; +} + +static __rte_always_inline void +enqueue_one_aead_job_gen1 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_la_cipher_req_params *cipher_param = + (void *)&req->serv_specif_rqpars; +struct icp_qat_fw_la_auth_req_params *auth_param = + (void *)((uint8_t *)&req->serv_specif_rqpars + +ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET ); +uint8_t *aad_data; +uint8_t aad_ccm_real_len; +uint8_t aad_len_field_sz; +uint32_t msg_len_be; +rte_iova_t aad_iova =0 ; +uint8_t q; + +switch (ctx->qat_hash_alg) { +case ICP_QAT_HW_AUTH_ALGO_GALOIS_128 : +case ICP_QAT_HW_AUTH_ALGO_GALOIS_64 : +ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_GCM_IV_LEN_12_OCTETS ); +rte_memcpy (cipher_param->u.cipher_IV_array, iv->va, + ctx->cipher_iv.length); + aad_iova = aad->iova; +break ; +case ICP_QAT_HW_AUTH_ALGO_AES_CBC_MAC : + aad_data = aad->va; + aad_iova = aad->iova; + aad_ccm_real_len =0 ; + aad_len_field_sz =0 ; + msg_len_be =rte_bswap32 ((uint32_t )data_len - + ofs.ofs.cipher.head); + +if (ctx->aad_len >ICP_QAT_HW_CCM_AAD_DATA_OFFSET ) { + aad_len_field_sz =ICP_QAT_HW_CCM_AAD_LEN_INFO ; + aad_ccm_real_len = ctx->aad_len - +ICP_QAT_HW_CCM_AAD_B0_LEN - +ICP_QAT_HW_CCM_AAD_LEN_INFO ; + }else { + aad_data = iv->va; + aad_iova = iv->iova; + } + + q =ICP_QAT_HW_CCM_NQ_CONST - ctx->cipher_iv.length; + aad_data[0 ] =ICP_QAT_HW_CCM_BUILD_B0_FLAGS ( + aad_len_field_sz, ctx->digest_length, q); +if (q >ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ) { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET + (q - +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ), + (uint8_t *)&msg_len_be, +ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE ); + }else { +memcpy (aad_data + ctx->cipher_iv.length + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)&msg_len_be + + (ICP_QAT_HW_CCM_MSG_LEN_MAX_FIELD_SIZE + - q), q); + } + +if (aad_len_field_sz >0 ) { + *(uint16_t *)&aad_data[ICP_QAT_HW_CCM_AAD_B0_LEN ] = +rte_bswap16 (aad_ccm_real_len); + +if ((aad_ccm_real_len + aad_len_field_sz) + %ICP_QAT_HW_CCM_AAD_B0_LEN ) { +uint8_t pad_len =0 ; +uint8_t pad_idx =0 ; + + pad_len =ICP_QAT_HW_CCM_AAD_B0_LEN - + ((aad_ccm_real_len + + aad_len_field_sz) % +ICP_QAT_HW_CCM_AAD_B0_LEN ); + pad_idx =ICP_QAT_HW_CCM_AAD_B0_LEN + + aad_ccm_real_len + + aad_len_field_sz; +memset (&aad_data[pad_idx],0 , pad_len); + } + } + +rte_memcpy (((uint8_t *)cipher_param->u.cipher_IV_array) + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , ctx->cipher_iv.length); + *(uint8_t *)&cipher_param->u.cipher_IV_array[0 ] = + q -ICP_QAT_HW_CCM_NONCE_OFFSET ; + +rte_memcpy ((uint8_t *)aad->va + +ICP_QAT_HW_CCM_NONCE_OFFSET , + (uint8_t *)iv->va +ICP_QAT_HW_CCM_NONCE_OFFSET , + ctx->cipher_iv.length); +break ; +default : +break ; + } + + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + auth_param->auth_off = ofs.ofs.cipher.head; + auth_param->auth_len = cipher_param->cipher_length; + auth_param->auth_res_addr = digest->iova; + auth_param->u1.aad_adr = aad_iova; +}extern struct rte_cryptodev_ops qat_sym_crypto_ops_gen1;extern struct rte_cryptodev_ops qat_asym_crypto_ops_gen1; +/* -----------------GEN 1 sym crypto op data path APIs ---------------- */ +int +qat_sym_build_op_cipher_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_auth_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_aead_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); + +int +qat_sym_build_op_chain_gen1 (void *in_op,struct qat_sym_session *ctx, +uint8_t *out_msg,void *op_cookie); +/* -----------------GENx control path APIs ---------------- */ uint64_t qat_sym_crypto_feature_flags_get_gen1 (struct qat_pci_device *qat_dev); +int +qat_sym_crypto_set_session_gen1 (void *cryptodev,void *session); +void qat_sym_session_set_ext_hash_flags_gen2 (struct qat_sym_session *session,uint8_t hash_flag);
drivers/crypto/qat/dev/qat_sym_pmd_gen1.c +186 -1
197 lines not on this page · raw message
drivers/crypto/qat/qat_sym.c +2 -88
100 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v6 3/10 crypto/qat: qat generation specific enqueue
In reply to Kai JiThis patch add in specific aead & auth build op enqueue functions for QAT Gen3 & Gen4
--- drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 117 ++++++++++++++++++- drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 34 +++++- 2 files changed, 149 insertions(+), 2 deletions(-)
drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c +116 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2017-2021 Intel Corporation +* Copyright(c) 2017-2022 Intel Corporation */ #include <rte_cryptodev.h>
@@ -143,6 +143,121 @@ qat_sym_crypto_cap_get_gen3(struct qat_pci_device *qat_dev __rte_unused)return capa_info; } +static __rte_always_inline void +enqueue_one_aead_job_gen3 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +if (ctx->is_single_pass) { +struct icp_qat_fw_la_cipher_req_params *cipher_param = + (void *)&req->serv_specif_rqpars; + +/* QAT GEN3 uses single pass to treat AEAD as +* cipher operation +*/ + cipher_param = (void *)&req->serv_specif_rqpars; + +qat_set_cipher_iv (cipher_param, iv, ctx->cipher_iv.length, req); + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - ofs.ofs.cipher.head - + ofs.ofs.cipher.tail; + + cipher_param->spc_aad_addr = aad->iova; + cipher_param->spc_auth_res_addr = digest->iova; + +return ; + } + +enqueue_one_aead_job_gen1 (ctx, req, iv, digest, aad, ofs, data_len); +} + +static __rte_always_inline void +enqueue_one_auth_job_gen3 (struct qat_sym_session *ctx, +struct qat_sym_op_cookie *cookie, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *auth_iv, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +struct icp_qat_fw_cipher_cd_ctrl_hdr *cipher_cd_ctrl; +struct icp_qat_fw_la_cipher_req_params *cipher_param; +uint32_t ver_key_offset; +uint32_t auth_data_len = data_len - ofs.ofs.auth.head - + ofs.ofs.auth.tail; + +if (!ctx->is_single_pass_gmac || + (auth_data_len >QAT_AES_GMAC_SPC_MAX_SIZE )) { +enqueue_one_auth_job_gen1 (ctx, req, digest, auth_iv, ofs, + data_len); +return ; + } + + cipher_cd_ctrl = (void *) &req->cd_ctrl; + cipher_param = (void *)&req->serv_specif_rqpars; + ver_key_offset =sizeof (struct icp_qat_hw_auth_setup ) + +ICP_QAT_HW_GALOIS_128_STATE1_SZ + +ICP_QAT_HW_GALOIS_H_SZ +ICP_QAT_HW_GALOIS_LEN_A_SZ + +ICP_QAT_HW_GALOIS_E_CTR0_SZ + +sizeof (struct icp_qat_hw_cipher_config ); + +if (ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_128 || + ctx->qat_hash_alg ==ICP_QAT_HW_AUTH_ALGO_GALOIS_64 ) { +/* AES-GMAC */ +qat_set_cipher_iv (cipher_param, auth_iv, ctx->auth_iv.length, + req); + } + +/* Fill separate Content Descriptor for this op */ +rte_memcpy (cookie->opt.spc_gmac.cd_cipher.key, + ctx->auth_op ==ICP_QAT_HW_AUTH_GENERATE ? + ctx->cd.cipher.key : +RTE_PTR_ADD (&ctx->cd, ver_key_offset), + ctx->auth_key_length); + cookie->opt.spc_gmac.cd_cipher.cipher_config.val = +ICP_QAT_HW_CIPHER_CONFIG_BUILD ( +ICP_QAT_HW_CIPHER_AEAD_MODE , + ctx->qat_cipher_alg, +ICP_QAT_HW_CIPHER_NO_CONVERT , + (ctx->auth_op ==ICP_QAT_HW_AUTH_GENERATE ? +ICP_QAT_HW_CIPHER_ENCRYPT : +ICP_QAT_HW_CIPHER_DECRYPT )); +QAT_FIELD_SET (cookie->opt.spc_gmac.cd_cipher.cipher_config.val, + ctx->digest_length, +QAT_CIPHER_AEAD_HASH_CMP_LEN_BITPOS , +QAT_CIPHER_AEAD_HASH_CMP_LEN_MASK ); + cookie->opt.spc_gmac.cd_cipher.cipher_config.reserved = +ICP_QAT_HW_CIPHER_CONFIG_BUILD_UPPER (auth_data_len); + +/* Update the request */ + req->cd_pars.u.s.content_desc_addr = + cookie->opt.spc_gmac.cd_phys_addr; + req->cd_pars.u.s.content_desc_params_sz =RTE_ALIGN_CEIL ( +sizeof (struct icp_qat_hw_cipher_config ) + + ctx->auth_key_length,8 ) >>3 ; + req->comn_mid.src_length = data_len; + req->comn_mid.dst_length =0 ; + + cipher_param->spc_aad_addr =0 ; + cipher_param->spc_auth_res_addr = digest->iova; + cipher_param->spc_aad_sz = auth_data_len; + cipher_param->reserved =0 ; + cipher_param->spc_auth_res_sz = ctx->digest_length; + + req->comn_hdr.service_cmd_id =ICP_QAT_FW_LA_CMD_CIPHER ; + cipher_cd_ctrl->cipher_cfg_offset =0 ; +ICP_QAT_FW_COMN_CURR_ID_SET (cipher_cd_ctrl,ICP_QAT_FW_SLICE_CIPHER ); +ICP_QAT_FW_COMN_NEXT_ID_SET (cipher_cd_ctrl,ICP_QAT_FW_SLICE_DRAM_WR ); +ICP_QAT_FW_LA_SINGLE_PASS_PROTO_FLAG_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_SINGLE_PASS_PROTO ); +ICP_QAT_FW_LA_PROTO_SET ( + req->comn_hdr.serv_specif_flags, +ICP_QAT_FW_LA_NO_PROTO ); +} +RTE_INIT (qat_sym_crypto_gen3_init) { qat_sym_gen_dev_ops[QAT_GEN3 ].cryptodev_ops = &qat_sym_crypto_ops_gen1;
drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c +33 -1
@@ -1,5 +1,5 @@/* SPDX-License-Identifier: BSD-3-Clause -* Copyright(c) 2017-2021 Intel Corporation +* Copyright(c) 2017-2022 Intel Corporation */ #include <rte_cryptodev.h>
@@ -103,6 +103,38 @@ qat_sym_crypto_cap_get_gen4(struct qat_pci_device *qat_dev __rte_unused)return capa_info; } +static __rte_always_inline void +enqueue_one_aead_job_gen4 (struct qat_sym_session *ctx, +struct icp_qat_fw_la_bulk_req *req, +struct rte_crypto_va_iova_ptr *iv, +struct rte_crypto_va_iova_ptr *digest, +struct rte_crypto_va_iova_ptr *aad, +union rte_crypto_sym_ofs ofs,uint32_t data_len) +{ +if (ctx->is_single_pass && ctx->is_ucs) { +struct icp_qat_fw_la_cipher_20_req_params *cipher_param_20 = + (void *)&req->serv_specif_rqpars; +struct icp_qat_fw_la_cipher_req_params *cipher_param = + (void *)&req->serv_specif_rqpars; + +/* QAT GEN4 uses single pass to treat AEAD as cipher +* operation +*/ +qat_set_cipher_iv (cipher_param, iv, ctx->cipher_iv.length, + req); + cipher_param->cipher_offset = ofs.ofs.cipher.head; + cipher_param->cipher_length = data_len - + ofs.ofs.cipher.head - ofs.ofs.cipher.tail; + + cipher_param_20->spc_aad_addr = aad->iova; + cipher_param_20->spc_auth_res_addr = digest->iova; + +return ; + } + +enqueue_one_aead_job_gen1 (ctx, req, iv, digest, aad, ofs, data_len); +} +RTE_INIT (qat_sym_crypto_gen4_init) { qat_sym_gen_dev_ops[QAT_GEN4 ].cryptodev_ops = &qat_sym_crypto_ops_gen1;
Signature · 1 line
2.17.1