18c515d96SZhangfei Gao /* SPDX-License-Identifier: BSD-3-Clause 28c515d96SZhangfei Gao * Copyright 2022-2023 Huawei Technologies Co.,Ltd. All rights reserved. 38c515d96SZhangfei Gao * Copyright 2022-2023 Linaro ltd. 48c515d96SZhangfei Gao */ 58c515d96SZhangfei Gao 68c515d96SZhangfei Gao #include <stdlib.h> 78c515d96SZhangfei Gao 88c515d96SZhangfei Gao #include <bus_vdev_driver.h> 98c515d96SZhangfei Gao #include <cryptodev_pmd.h> 108c515d96SZhangfei Gao #include <rte_bus_vdev.h> 118c515d96SZhangfei Gao 128c515d96SZhangfei Gao #include <uadk/wd_cipher.h> 138c515d96SZhangfei Gao #include <uadk/wd_digest.h> 148c515d96SZhangfei Gao #include <uadk/wd_sched.h> 158c515d96SZhangfei Gao 168c515d96SZhangfei Gao #include "uadk_crypto_pmd_private.h" 178c515d96SZhangfei Gao 188c515d96SZhangfei Gao static uint8_t uadk_cryptodev_driver_id; 198c515d96SZhangfei Gao 2053ae1393SZhangfei Gao static const struct rte_cryptodev_capabilities uadk_crypto_v2_capabilities[] = { 21ec23c286SZhangfei Gao { /* MD5 HMAC */ 22ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 23ec23c286SZhangfei Gao {.sym = { 24ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 25ec23c286SZhangfei Gao {.auth = { 26ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_MD5_HMAC, 27ec23c286SZhangfei Gao .block_size = 64, 28ec23c286SZhangfei Gao .key_size = { 29ec23c286SZhangfei Gao .min = 1, 30ec23c286SZhangfei Gao .max = 64, 31ec23c286SZhangfei Gao .increment = 1 32ec23c286SZhangfei Gao }, 33ec23c286SZhangfei Gao .digest_size = { 34ec23c286SZhangfei Gao .min = 1, 35ec23c286SZhangfei Gao .max = 16, 36ec23c286SZhangfei Gao .increment = 1 37ec23c286SZhangfei Gao }, 38ec23c286SZhangfei Gao .iv_size = { 0 } 39ec23c286SZhangfei Gao }, } 40ec23c286SZhangfei Gao }, } 41ec23c286SZhangfei Gao }, 42ec23c286SZhangfei Gao { /* MD5 */ 43ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 44ec23c286SZhangfei Gao {.sym = { 45ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 46ec23c286SZhangfei Gao {.auth = { 47ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_MD5, 48ec23c286SZhangfei Gao .block_size = 64, 49ec23c286SZhangfei Gao .key_size = { 50ec23c286SZhangfei Gao .min = 0, 51ec23c286SZhangfei Gao .max = 0, 52ec23c286SZhangfei Gao .increment = 0 53ec23c286SZhangfei Gao }, 54ec23c286SZhangfei Gao .digest_size = { 55ec23c286SZhangfei Gao .min = 16, 56ec23c286SZhangfei Gao .max = 16, 57ec23c286SZhangfei Gao .increment = 0 58ec23c286SZhangfei Gao }, 59ec23c286SZhangfei Gao .iv_size = { 0 } 60ec23c286SZhangfei Gao }, } 61ec23c286SZhangfei Gao }, } 62ec23c286SZhangfei Gao }, 63ec23c286SZhangfei Gao { /* SHA1 HMAC */ 64ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 65ec23c286SZhangfei Gao {.sym = { 66ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 67ec23c286SZhangfei Gao {.auth = { 68ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 69ec23c286SZhangfei Gao .block_size = 64, 70ec23c286SZhangfei Gao .key_size = { 71ec23c286SZhangfei Gao .min = 1, 72ec23c286SZhangfei Gao .max = 64, 73ec23c286SZhangfei Gao .increment = 1 74ec23c286SZhangfei Gao }, 75ec23c286SZhangfei Gao .digest_size = { 76ec23c286SZhangfei Gao .min = 1, 77ec23c286SZhangfei Gao .max = 20, 78ec23c286SZhangfei Gao .increment = 1 79ec23c286SZhangfei Gao }, 80ec23c286SZhangfei Gao .iv_size = { 0 } 81ec23c286SZhangfei Gao }, } 82ec23c286SZhangfei Gao }, } 83ec23c286SZhangfei Gao }, 84ec23c286SZhangfei Gao { /* SHA1 */ 85ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 86ec23c286SZhangfei Gao {.sym = { 87ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 88ec23c286SZhangfei Gao {.auth = { 89ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_SHA1, 90ec23c286SZhangfei Gao .block_size = 64, 91ec23c286SZhangfei Gao .key_size = { 92ec23c286SZhangfei Gao .min = 0, 93ec23c286SZhangfei Gao .max = 0, 94ec23c286SZhangfei Gao .increment = 0 95ec23c286SZhangfei Gao }, 96ec23c286SZhangfei Gao .digest_size = { 97ec23c286SZhangfei Gao .min = 20, 98ec23c286SZhangfei Gao .max = 20, 99ec23c286SZhangfei Gao .increment = 0 100ec23c286SZhangfei Gao }, 101ec23c286SZhangfei Gao .iv_size = { 0 } 102ec23c286SZhangfei Gao }, } 103ec23c286SZhangfei Gao }, } 104ec23c286SZhangfei Gao }, 105ec23c286SZhangfei Gao { /* SHA224 HMAC */ 106ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 107ec23c286SZhangfei Gao {.sym = { 108ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 109ec23c286SZhangfei Gao {.auth = { 110ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_SHA224_HMAC, 111ec23c286SZhangfei Gao .block_size = 64, 112ec23c286SZhangfei Gao .key_size = { 113ec23c286SZhangfei Gao .min = 1, 114ec23c286SZhangfei Gao .max = 64, 115ec23c286SZhangfei Gao .increment = 1 116ec23c286SZhangfei Gao }, 117ec23c286SZhangfei Gao .digest_size = { 118ec23c286SZhangfei Gao .min = 1, 119ec23c286SZhangfei Gao .max = 28, 120ec23c286SZhangfei Gao .increment = 1 121ec23c286SZhangfei Gao }, 122ec23c286SZhangfei Gao .iv_size = { 0 } 123ec23c286SZhangfei Gao }, } 124ec23c286SZhangfei Gao }, } 125ec23c286SZhangfei Gao }, 126ec23c286SZhangfei Gao { /* SHA224 */ 127ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 128ec23c286SZhangfei Gao {.sym = { 129ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 130ec23c286SZhangfei Gao {.auth = { 131ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_SHA224, 132ec23c286SZhangfei Gao .block_size = 64, 133ec23c286SZhangfei Gao .key_size = { 134ec23c286SZhangfei Gao .min = 0, 135ec23c286SZhangfei Gao .max = 0, 136ec23c286SZhangfei Gao .increment = 0 137ec23c286SZhangfei Gao }, 138ec23c286SZhangfei Gao .digest_size = { 139ec23c286SZhangfei Gao .min = 1, 140ec23c286SZhangfei Gao .max = 28, 141ec23c286SZhangfei Gao .increment = 1 142ec23c286SZhangfei Gao }, 143ec23c286SZhangfei Gao .iv_size = { 0 } 144ec23c286SZhangfei Gao }, } 145ec23c286SZhangfei Gao }, } 146ec23c286SZhangfei Gao }, 147ec23c286SZhangfei Gao { /* SHA256 HMAC */ 148ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 149ec23c286SZhangfei Gao {.sym = { 150ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 151ec23c286SZhangfei Gao {.auth = { 152ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_SHA256_HMAC, 153ec23c286SZhangfei Gao .block_size = 64, 154ec23c286SZhangfei Gao .key_size = { 155ec23c286SZhangfei Gao .min = 1, 156ec23c286SZhangfei Gao .max = 64, 157ec23c286SZhangfei Gao .increment = 1 158ec23c286SZhangfei Gao }, 159ec23c286SZhangfei Gao .digest_size = { 160ec23c286SZhangfei Gao .min = 1, 161ec23c286SZhangfei Gao .max = 32, 162ec23c286SZhangfei Gao .increment = 1 163ec23c286SZhangfei Gao }, 164ec23c286SZhangfei Gao .iv_size = { 0 } 165ec23c286SZhangfei Gao }, } 166ec23c286SZhangfei Gao }, } 167ec23c286SZhangfei Gao }, 168ec23c286SZhangfei Gao { /* SHA256 */ 169ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 170ec23c286SZhangfei Gao {.sym = { 171ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 172ec23c286SZhangfei Gao {.auth = { 173ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_SHA256, 174ec23c286SZhangfei Gao .block_size = 64, 175ec23c286SZhangfei Gao .key_size = { 176ec23c286SZhangfei Gao .min = 0, 177ec23c286SZhangfei Gao .max = 0, 178ec23c286SZhangfei Gao .increment = 0 179ec23c286SZhangfei Gao }, 180ec23c286SZhangfei Gao .digest_size = { 181ec23c286SZhangfei Gao .min = 32, 182ec23c286SZhangfei Gao .max = 32, 183ec23c286SZhangfei Gao .increment = 0 184ec23c286SZhangfei Gao }, 185ec23c286SZhangfei Gao .iv_size = { 0 } 186ec23c286SZhangfei Gao }, } 187ec23c286SZhangfei Gao }, } 188ec23c286SZhangfei Gao }, 189ec23c286SZhangfei Gao { /* SHA384 HMAC */ 190ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 191ec23c286SZhangfei Gao {.sym = { 192ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 193ec23c286SZhangfei Gao {.auth = { 194ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_SHA384_HMAC, 195ec23c286SZhangfei Gao .block_size = 128, 196ec23c286SZhangfei Gao .key_size = { 197ec23c286SZhangfei Gao .min = 1, 198ec23c286SZhangfei Gao .max = 128, 199ec23c286SZhangfei Gao .increment = 1 200ec23c286SZhangfei Gao }, 201ec23c286SZhangfei Gao .digest_size = { 202ec23c286SZhangfei Gao .min = 1, 203ec23c286SZhangfei Gao .max = 48, 204ec23c286SZhangfei Gao .increment = 1 205ec23c286SZhangfei Gao }, 206ec23c286SZhangfei Gao .iv_size = { 0 } 207ec23c286SZhangfei Gao }, } 208ec23c286SZhangfei Gao }, } 209ec23c286SZhangfei Gao }, 210ec23c286SZhangfei Gao { /* SHA384 */ 211ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 212ec23c286SZhangfei Gao {.sym = { 213ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 214ec23c286SZhangfei Gao {.auth = { 215ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_SHA384, 216ec23c286SZhangfei Gao .block_size = 128, 217ec23c286SZhangfei Gao .key_size = { 218ec23c286SZhangfei Gao .min = 0, 219ec23c286SZhangfei Gao .max = 0, 220ec23c286SZhangfei Gao .increment = 0 221ec23c286SZhangfei Gao }, 222ec23c286SZhangfei Gao .digest_size = { 223ec23c286SZhangfei Gao .min = 48, 224ec23c286SZhangfei Gao .max = 48, 225ec23c286SZhangfei Gao .increment = 0 226ec23c286SZhangfei Gao }, 227ec23c286SZhangfei Gao .iv_size = { 0 } 228ec23c286SZhangfei Gao }, } 229ec23c286SZhangfei Gao }, } 230ec23c286SZhangfei Gao }, 231ec23c286SZhangfei Gao { /* SHA512 HMAC */ 232ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 233ec23c286SZhangfei Gao {.sym = { 234ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 235ec23c286SZhangfei Gao {.auth = { 236ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_SHA512_HMAC, 237ec23c286SZhangfei Gao .block_size = 128, 238ec23c286SZhangfei Gao .key_size = { 239ec23c286SZhangfei Gao .min = 1, 240ec23c286SZhangfei Gao .max = 128, 241ec23c286SZhangfei Gao .increment = 1 242ec23c286SZhangfei Gao }, 243ec23c286SZhangfei Gao .digest_size = { 244ec23c286SZhangfei Gao .min = 1, 245ec23c286SZhangfei Gao .max = 64, 246ec23c286SZhangfei Gao .increment = 1 247ec23c286SZhangfei Gao }, 248ec23c286SZhangfei Gao .iv_size = { 0 } 249ec23c286SZhangfei Gao }, } 250ec23c286SZhangfei Gao }, } 251ec23c286SZhangfei Gao }, 252ec23c286SZhangfei Gao { /* SHA512 */ 253ec23c286SZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 254ec23c286SZhangfei Gao {.sym = { 255ec23c286SZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 256ec23c286SZhangfei Gao {.auth = { 257ec23c286SZhangfei Gao .algo = RTE_CRYPTO_AUTH_SHA512, 258ec23c286SZhangfei Gao .block_size = 128, 259ec23c286SZhangfei Gao .key_size = { 260ec23c286SZhangfei Gao .min = 0, 261ec23c286SZhangfei Gao .max = 0, 262ec23c286SZhangfei Gao .increment = 0 263ec23c286SZhangfei Gao }, 264ec23c286SZhangfei Gao .digest_size = { 265ec23c286SZhangfei Gao .min = 64, 266ec23c286SZhangfei Gao .max = 64, 267ec23c286SZhangfei Gao .increment = 0 268ec23c286SZhangfei Gao }, 269ec23c286SZhangfei Gao .iv_size = { 0 } 270ec23c286SZhangfei Gao }, } 271ec23c286SZhangfei Gao }, } 272ec23c286SZhangfei Gao }, 2733b3cd89eSZhangfei Gao { /* AES ECB */ 2743b3cd89eSZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 2753b3cd89eSZhangfei Gao {.sym = { 2763b3cd89eSZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 2773b3cd89eSZhangfei Gao {.cipher = { 2783b3cd89eSZhangfei Gao .algo = RTE_CRYPTO_CIPHER_AES_ECB, 2793b3cd89eSZhangfei Gao .block_size = 16, 2803b3cd89eSZhangfei Gao .key_size = { 2813b3cd89eSZhangfei Gao .min = 16, 2823b3cd89eSZhangfei Gao .max = 32, 2833b3cd89eSZhangfei Gao .increment = 8 2843b3cd89eSZhangfei Gao }, 2853b3cd89eSZhangfei Gao .iv_size = { 2863b3cd89eSZhangfei Gao .min = 0, 2873b3cd89eSZhangfei Gao .max = 0, 2883b3cd89eSZhangfei Gao .increment = 0 2893b3cd89eSZhangfei Gao } 2903b3cd89eSZhangfei Gao }, } 2913b3cd89eSZhangfei Gao }, } 2923b3cd89eSZhangfei Gao }, 2933b3cd89eSZhangfei Gao { /* AES CBC */ 2943b3cd89eSZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 2953b3cd89eSZhangfei Gao {.sym = { 2963b3cd89eSZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 2973b3cd89eSZhangfei Gao {.cipher = { 2983b3cd89eSZhangfei Gao .algo = RTE_CRYPTO_CIPHER_AES_CBC, 2993b3cd89eSZhangfei Gao .block_size = 16, 3003b3cd89eSZhangfei Gao .key_size = { 3013b3cd89eSZhangfei Gao .min = 16, 3023b3cd89eSZhangfei Gao .max = 32, 3033b3cd89eSZhangfei Gao .increment = 8 3043b3cd89eSZhangfei Gao }, 3053b3cd89eSZhangfei Gao .iv_size = { 3063b3cd89eSZhangfei Gao .min = 16, 3073b3cd89eSZhangfei Gao .max = 16, 3083b3cd89eSZhangfei Gao .increment = 0 3093b3cd89eSZhangfei Gao } 3103b3cd89eSZhangfei Gao }, } 3113b3cd89eSZhangfei Gao }, } 3123b3cd89eSZhangfei Gao }, 3133b3cd89eSZhangfei Gao { /* AES XTS */ 3143b3cd89eSZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 3153b3cd89eSZhangfei Gao {.sym = { 3163b3cd89eSZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 3173b3cd89eSZhangfei Gao {.cipher = { 3183b3cd89eSZhangfei Gao .algo = RTE_CRYPTO_CIPHER_AES_XTS, 3193b3cd89eSZhangfei Gao .block_size = 1, 3203b3cd89eSZhangfei Gao .key_size = { 3213b3cd89eSZhangfei Gao .min = 32, 3223b3cd89eSZhangfei Gao .max = 64, 3233b3cd89eSZhangfei Gao .increment = 32 3243b3cd89eSZhangfei Gao }, 3253b3cd89eSZhangfei Gao .iv_size = { 3263b3cd89eSZhangfei Gao .min = 0, 3273b3cd89eSZhangfei Gao .max = 0, 3283b3cd89eSZhangfei Gao .increment = 0 3293b3cd89eSZhangfei Gao } 3303b3cd89eSZhangfei Gao }, } 3313b3cd89eSZhangfei Gao }, } 3323b3cd89eSZhangfei Gao }, 3333b3cd89eSZhangfei Gao { /* DES CBC */ 3343b3cd89eSZhangfei Gao .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 3353b3cd89eSZhangfei Gao {.sym = { 3363b3cd89eSZhangfei Gao .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 3373b3cd89eSZhangfei Gao {.cipher = { 3383b3cd89eSZhangfei Gao .algo = RTE_CRYPTO_CIPHER_DES_CBC, 3393b3cd89eSZhangfei Gao .block_size = 8, 3403b3cd89eSZhangfei Gao .key_size = { 3413b3cd89eSZhangfei Gao .min = 8, 3423b3cd89eSZhangfei Gao .max = 8, 3433b3cd89eSZhangfei Gao .increment = 0 3443b3cd89eSZhangfei Gao }, 3453b3cd89eSZhangfei Gao .iv_size = { 3463b3cd89eSZhangfei Gao .min = 8, 3473b3cd89eSZhangfei Gao .max = 8, 3483b3cd89eSZhangfei Gao .increment = 0 3493b3cd89eSZhangfei Gao } 3503b3cd89eSZhangfei Gao }, } 3513b3cd89eSZhangfei Gao }, } 3523b3cd89eSZhangfei Gao }, 35353ae1393SZhangfei Gao /* End of capabilities */ 35453ae1393SZhangfei Gao RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() 35553ae1393SZhangfei Gao }; 35653ae1393SZhangfei Gao 35753ae1393SZhangfei Gao /* Configure device */ 35853ae1393SZhangfei Gao static int 35953ae1393SZhangfei Gao uadk_crypto_pmd_config(struct rte_cryptodev *dev __rte_unused, 360a8ca598cSZhangfei Gao struct rte_cryptodev_config *config) 36153ae1393SZhangfei Gao { 362a8ca598cSZhangfei Gao char env[128]; 363a8ca598cSZhangfei Gao 364a8ca598cSZhangfei Gao /* set queue pairs num via env */ 365a8ca598cSZhangfei Gao sprintf(env, "sync:%d@0", config->nb_queue_pairs); 366a8ca598cSZhangfei Gao setenv("WD_CIPHER_CTX_NUM", env, 1); 367a8ca598cSZhangfei Gao setenv("WD_DIGEST_CTX_NUM", env, 1); 368a8ca598cSZhangfei Gao 36953ae1393SZhangfei Gao return 0; 37053ae1393SZhangfei Gao } 37153ae1393SZhangfei Gao 37253ae1393SZhangfei Gao /* Start device */ 37353ae1393SZhangfei Gao static int 37453ae1393SZhangfei Gao uadk_crypto_pmd_start(struct rte_cryptodev *dev __rte_unused) 37553ae1393SZhangfei Gao { 37653ae1393SZhangfei Gao return 0; 37753ae1393SZhangfei Gao } 37853ae1393SZhangfei Gao 37953ae1393SZhangfei Gao /* Stop device */ 38053ae1393SZhangfei Gao static void 38153ae1393SZhangfei Gao uadk_crypto_pmd_stop(struct rte_cryptodev *dev __rte_unused) 38253ae1393SZhangfei Gao { 38353ae1393SZhangfei Gao } 38453ae1393SZhangfei Gao 38553ae1393SZhangfei Gao /* Close device */ 38653ae1393SZhangfei Gao static int 3873b3cd89eSZhangfei Gao uadk_crypto_pmd_close(struct rte_cryptodev *dev) 38853ae1393SZhangfei Gao { 3893b3cd89eSZhangfei Gao struct uadk_crypto_priv *priv = dev->data->dev_private; 3903b3cd89eSZhangfei Gao 3913b3cd89eSZhangfei Gao if (priv->env_cipher_init) { 3923b3cd89eSZhangfei Gao wd_cipher_env_uninit(); 3933b3cd89eSZhangfei Gao priv->env_cipher_init = false; 3943b3cd89eSZhangfei Gao } 3953b3cd89eSZhangfei Gao 396ec23c286SZhangfei Gao if (priv->env_auth_init) { 397ec23c286SZhangfei Gao wd_digest_env_uninit(); 398ec23c286SZhangfei Gao priv->env_auth_init = false; 399ec23c286SZhangfei Gao } 400ec23c286SZhangfei Gao 40153ae1393SZhangfei Gao return 0; 40253ae1393SZhangfei Gao } 40353ae1393SZhangfei Gao 40453ae1393SZhangfei Gao /* Get device statistics */ 40553ae1393SZhangfei Gao static void 40653ae1393SZhangfei Gao uadk_crypto_pmd_stats_get(struct rte_cryptodev *dev, 40753ae1393SZhangfei Gao struct rte_cryptodev_stats *stats) 40853ae1393SZhangfei Gao { 40953ae1393SZhangfei Gao int qp_id; 41053ae1393SZhangfei Gao 41153ae1393SZhangfei Gao for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) { 41253ae1393SZhangfei Gao struct uadk_qp *qp = dev->data->queue_pairs[qp_id]; 41353ae1393SZhangfei Gao 41453ae1393SZhangfei Gao stats->enqueued_count += qp->qp_stats.enqueued_count; 41553ae1393SZhangfei Gao stats->dequeued_count += qp->qp_stats.dequeued_count; 41653ae1393SZhangfei Gao stats->enqueue_err_count += qp->qp_stats.enqueue_err_count; 41753ae1393SZhangfei Gao stats->dequeue_err_count += qp->qp_stats.dequeue_err_count; 41853ae1393SZhangfei Gao } 41953ae1393SZhangfei Gao } 42053ae1393SZhangfei Gao 42153ae1393SZhangfei Gao /* Reset device statistics */ 42253ae1393SZhangfei Gao static void 42353ae1393SZhangfei Gao uadk_crypto_pmd_stats_reset(struct rte_cryptodev *dev __rte_unused) 42453ae1393SZhangfei Gao { 42553ae1393SZhangfei Gao int qp_id; 42653ae1393SZhangfei Gao 42753ae1393SZhangfei Gao for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) { 42853ae1393SZhangfei Gao struct uadk_qp *qp = dev->data->queue_pairs[qp_id]; 42953ae1393SZhangfei Gao 43053ae1393SZhangfei Gao memset(&qp->qp_stats, 0, sizeof(qp->qp_stats)); 43153ae1393SZhangfei Gao } 43253ae1393SZhangfei Gao } 43353ae1393SZhangfei Gao 43453ae1393SZhangfei Gao /* Get device info */ 43553ae1393SZhangfei Gao static void 43653ae1393SZhangfei Gao uadk_crypto_pmd_info_get(struct rte_cryptodev *dev, 43753ae1393SZhangfei Gao struct rte_cryptodev_info *dev_info) 43853ae1393SZhangfei Gao { 43953ae1393SZhangfei Gao struct uadk_crypto_priv *priv = dev->data->dev_private; 44053ae1393SZhangfei Gao 44153ae1393SZhangfei Gao if (dev_info != NULL) { 44253ae1393SZhangfei Gao dev_info->driver_id = dev->driver_id; 44353ae1393SZhangfei Gao dev_info->driver_name = dev->device->driver->name; 444a8ca598cSZhangfei Gao dev_info->max_nb_queue_pairs = priv->max_nb_qpairs; 44553ae1393SZhangfei Gao /* No limit of number of sessions */ 44653ae1393SZhangfei Gao dev_info->sym.max_nb_sessions = 0; 44753ae1393SZhangfei Gao dev_info->feature_flags = dev->feature_flags; 44853ae1393SZhangfei Gao 44953ae1393SZhangfei Gao if (priv->version == UADK_CRYPTO_V2) 45053ae1393SZhangfei Gao dev_info->capabilities = uadk_crypto_v2_capabilities; 45153ae1393SZhangfei Gao } 45253ae1393SZhangfei Gao } 45353ae1393SZhangfei Gao 45453ae1393SZhangfei Gao /* Release queue pair */ 45553ae1393SZhangfei Gao static int 45653ae1393SZhangfei Gao uadk_crypto_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id) 45753ae1393SZhangfei Gao { 45853ae1393SZhangfei Gao struct uadk_qp *qp = dev->data->queue_pairs[qp_id]; 45953ae1393SZhangfei Gao 46053ae1393SZhangfei Gao if (qp) { 46153ae1393SZhangfei Gao rte_ring_free(qp->processed_pkts); 46253ae1393SZhangfei Gao rte_free(qp); 46353ae1393SZhangfei Gao dev->data->queue_pairs[qp_id] = NULL; 46453ae1393SZhangfei Gao } 46553ae1393SZhangfei Gao 46653ae1393SZhangfei Gao return 0; 46753ae1393SZhangfei Gao } 46853ae1393SZhangfei Gao 46953ae1393SZhangfei Gao /* set a unique name for the queue pair based on its name, dev_id and qp_id */ 47053ae1393SZhangfei Gao static int 47153ae1393SZhangfei Gao uadk_pmd_qp_set_unique_name(struct rte_cryptodev *dev, 47253ae1393SZhangfei Gao struct uadk_qp *qp) 47353ae1393SZhangfei Gao { 47453ae1393SZhangfei Gao unsigned int n = snprintf(qp->name, sizeof(qp->name), 47553ae1393SZhangfei Gao "uadk_crypto_pmd_%u_qp_%u", 47653ae1393SZhangfei Gao dev->data->dev_id, qp->id); 47753ae1393SZhangfei Gao 47853ae1393SZhangfei Gao if (n >= sizeof(qp->name)) 47953ae1393SZhangfei Gao return -EINVAL; 48053ae1393SZhangfei Gao 48153ae1393SZhangfei Gao return 0; 48253ae1393SZhangfei Gao } 48353ae1393SZhangfei Gao 48453ae1393SZhangfei Gao /* Create a ring to place process packets on */ 48553ae1393SZhangfei Gao static struct rte_ring * 48653ae1393SZhangfei Gao uadk_pmd_qp_create_processed_pkts_ring(struct uadk_qp *qp, 48753ae1393SZhangfei Gao unsigned int ring_size, int socket_id) 48853ae1393SZhangfei Gao { 48953ae1393SZhangfei Gao struct rte_ring *r = qp->processed_pkts; 49053ae1393SZhangfei Gao 49153ae1393SZhangfei Gao if (r) { 49253ae1393SZhangfei Gao if (rte_ring_get_size(r) >= ring_size) { 49353ae1393SZhangfei Gao UADK_LOG(INFO, "Reusing existing ring %s for processed packets", 49453ae1393SZhangfei Gao qp->name); 49553ae1393SZhangfei Gao return r; 49653ae1393SZhangfei Gao } 49753ae1393SZhangfei Gao 49853ae1393SZhangfei Gao UADK_LOG(ERR, "Unable to reuse existing ring %s for processed packets", 49953ae1393SZhangfei Gao qp->name); 50053ae1393SZhangfei Gao return NULL; 50153ae1393SZhangfei Gao } 50253ae1393SZhangfei Gao 50353ae1393SZhangfei Gao return rte_ring_create(qp->name, ring_size, socket_id, 50453ae1393SZhangfei Gao RING_F_EXACT_SZ); 50553ae1393SZhangfei Gao } 50653ae1393SZhangfei Gao 50753ae1393SZhangfei Gao static int 50853ae1393SZhangfei Gao uadk_crypto_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id, 50953ae1393SZhangfei Gao const struct rte_cryptodev_qp_conf *qp_conf, 51053ae1393SZhangfei Gao int socket_id) 51153ae1393SZhangfei Gao { 51253ae1393SZhangfei Gao struct uadk_qp *qp; 51353ae1393SZhangfei Gao 51453ae1393SZhangfei Gao /* Free memory prior to re-allocation if needed. */ 51553ae1393SZhangfei Gao if (dev->data->queue_pairs[qp_id] != NULL) 51653ae1393SZhangfei Gao uadk_crypto_pmd_qp_release(dev, qp_id); 51753ae1393SZhangfei Gao 51853ae1393SZhangfei Gao /* Allocate the queue pair data structure. */ 51953ae1393SZhangfei Gao qp = rte_zmalloc_socket("uadk PMD Queue Pair", sizeof(*qp), 52053ae1393SZhangfei Gao RTE_CACHE_LINE_SIZE, socket_id); 52153ae1393SZhangfei Gao if (qp == NULL) 52253ae1393SZhangfei Gao return (-ENOMEM); 52353ae1393SZhangfei Gao 52453ae1393SZhangfei Gao qp->id = qp_id; 52553ae1393SZhangfei Gao dev->data->queue_pairs[qp_id] = qp; 52653ae1393SZhangfei Gao 52753ae1393SZhangfei Gao if (uadk_pmd_qp_set_unique_name(dev, qp)) 52853ae1393SZhangfei Gao goto qp_setup_cleanup; 52953ae1393SZhangfei Gao 53053ae1393SZhangfei Gao qp->processed_pkts = uadk_pmd_qp_create_processed_pkts_ring(qp, 53153ae1393SZhangfei Gao qp_conf->nb_descriptors, socket_id); 53253ae1393SZhangfei Gao if (qp->processed_pkts == NULL) 53353ae1393SZhangfei Gao goto qp_setup_cleanup; 53453ae1393SZhangfei Gao 53553ae1393SZhangfei Gao memset(&qp->qp_stats, 0, sizeof(qp->qp_stats)); 53653ae1393SZhangfei Gao 53753ae1393SZhangfei Gao return 0; 53853ae1393SZhangfei Gao 53953ae1393SZhangfei Gao qp_setup_cleanup: 54053ae1393SZhangfei Gao if (qp) { 54153ae1393SZhangfei Gao rte_free(qp); 54253ae1393SZhangfei Gao qp = NULL; 54353ae1393SZhangfei Gao } 54453ae1393SZhangfei Gao return -EINVAL; 54553ae1393SZhangfei Gao } 54653ae1393SZhangfei Gao 5473b3cd89eSZhangfei Gao static unsigned int 5483b3cd89eSZhangfei Gao uadk_crypto_sym_session_get_size(struct rte_cryptodev *dev __rte_unused) 5493b3cd89eSZhangfei Gao { 5503b3cd89eSZhangfei Gao return sizeof(struct uadk_crypto_session); 5513b3cd89eSZhangfei Gao } 5523b3cd89eSZhangfei Gao 5533b3cd89eSZhangfei Gao static enum uadk_chain_order 5543b3cd89eSZhangfei Gao uadk_get_chain_order(const struct rte_crypto_sym_xform *xform) 5553b3cd89eSZhangfei Gao { 5563b3cd89eSZhangfei Gao enum uadk_chain_order res = UADK_CHAIN_NOT_SUPPORTED; 5573b3cd89eSZhangfei Gao 5583b3cd89eSZhangfei Gao if (xform != NULL) { 559ec23c286SZhangfei Gao if (xform->type == RTE_CRYPTO_SYM_XFORM_AUTH) { 560ec23c286SZhangfei Gao if (xform->next == NULL) 561ec23c286SZhangfei Gao res = UADK_CHAIN_ONLY_AUTH; 562ec23c286SZhangfei Gao else if (xform->next->type == 563ec23c286SZhangfei Gao RTE_CRYPTO_SYM_XFORM_CIPHER) 564ec23c286SZhangfei Gao res = UADK_CHAIN_AUTH_CIPHER; 565ec23c286SZhangfei Gao } 566ec23c286SZhangfei Gao 5673b3cd89eSZhangfei Gao if (xform->type == RTE_CRYPTO_SYM_XFORM_CIPHER) { 5683b3cd89eSZhangfei Gao if (xform->next == NULL) 5693b3cd89eSZhangfei Gao res = UADK_CHAIN_ONLY_CIPHER; 570ec23c286SZhangfei Gao else if (xform->next->type == RTE_CRYPTO_SYM_XFORM_AUTH) 571ec23c286SZhangfei Gao res = UADK_CHAIN_CIPHER_AUTH; 5723b3cd89eSZhangfei Gao } 5733b3cd89eSZhangfei Gao } 5743b3cd89eSZhangfei Gao 5753b3cd89eSZhangfei Gao return res; 5763b3cd89eSZhangfei Gao } 5773b3cd89eSZhangfei Gao 5783b3cd89eSZhangfei Gao static int 5793b3cd89eSZhangfei Gao uadk_set_session_cipher_parameters(struct rte_cryptodev *dev, 5803b3cd89eSZhangfei Gao struct uadk_crypto_session *sess, 5813b3cd89eSZhangfei Gao struct rte_crypto_sym_xform *xform) 5823b3cd89eSZhangfei Gao { 5833b3cd89eSZhangfei Gao struct uadk_crypto_priv *priv = dev->data->dev_private; 5843b3cd89eSZhangfei Gao struct rte_crypto_cipher_xform *cipher = &xform->cipher; 5853b3cd89eSZhangfei Gao struct wd_cipher_sess_setup setup = {0}; 5863b3cd89eSZhangfei Gao struct sched_params params = {0}; 5873b3cd89eSZhangfei Gao int ret; 5883b3cd89eSZhangfei Gao 5893b3cd89eSZhangfei Gao if (!priv->env_cipher_init) { 5903b3cd89eSZhangfei Gao ret = wd_cipher_env_init(NULL); 5913b3cd89eSZhangfei Gao if (ret < 0) 5923b3cd89eSZhangfei Gao return -EINVAL; 5933b3cd89eSZhangfei Gao priv->env_cipher_init = true; 5943b3cd89eSZhangfei Gao } 5953b3cd89eSZhangfei Gao 5963b3cd89eSZhangfei Gao sess->cipher.direction = cipher->op; 5973b3cd89eSZhangfei Gao sess->iv.offset = cipher->iv.offset; 5983b3cd89eSZhangfei Gao sess->iv.length = cipher->iv.length; 5993b3cd89eSZhangfei Gao 6003b3cd89eSZhangfei Gao switch (cipher->algo) { 6013b3cd89eSZhangfei Gao /* Cover supported cipher algorithms */ 6023b3cd89eSZhangfei Gao case RTE_CRYPTO_CIPHER_AES_CTR: 6033b3cd89eSZhangfei Gao setup.alg = WD_CIPHER_AES; 6043b3cd89eSZhangfei Gao setup.mode = WD_CIPHER_CTR; 6053b3cd89eSZhangfei Gao sess->cipher.req.out_bytes = 64; 6063b3cd89eSZhangfei Gao break; 6073b3cd89eSZhangfei Gao case RTE_CRYPTO_CIPHER_AES_ECB: 6083b3cd89eSZhangfei Gao setup.alg = WD_CIPHER_AES; 6093b3cd89eSZhangfei Gao setup.mode = WD_CIPHER_ECB; 6103b3cd89eSZhangfei Gao sess->cipher.req.out_bytes = 16; 6113b3cd89eSZhangfei Gao break; 6123b3cd89eSZhangfei Gao case RTE_CRYPTO_CIPHER_AES_CBC: 6133b3cd89eSZhangfei Gao setup.alg = WD_CIPHER_AES; 6143b3cd89eSZhangfei Gao setup.mode = WD_CIPHER_CBC; 6153b3cd89eSZhangfei Gao if (cipher->key.length == 16) 6163b3cd89eSZhangfei Gao sess->cipher.req.out_bytes = 16; 6173b3cd89eSZhangfei Gao else 6183b3cd89eSZhangfei Gao sess->cipher.req.out_bytes = 64; 6193b3cd89eSZhangfei Gao break; 6203b3cd89eSZhangfei Gao case RTE_CRYPTO_CIPHER_AES_XTS: 6213b3cd89eSZhangfei Gao setup.alg = WD_CIPHER_AES; 6223b3cd89eSZhangfei Gao setup.mode = WD_CIPHER_XTS; 6233b3cd89eSZhangfei Gao if (cipher->key.length == 16) 6243b3cd89eSZhangfei Gao sess->cipher.req.out_bytes = 32; 6253b3cd89eSZhangfei Gao else 6263b3cd89eSZhangfei Gao sess->cipher.req.out_bytes = 512; 6273b3cd89eSZhangfei Gao break; 6283b3cd89eSZhangfei Gao default: 6293b3cd89eSZhangfei Gao ret = -ENOTSUP; 6303b3cd89eSZhangfei Gao goto env_uninit; 6313b3cd89eSZhangfei Gao } 6323b3cd89eSZhangfei Gao 6333b3cd89eSZhangfei Gao params.numa_id = -1; /* choose nearby numa node */ 6343b3cd89eSZhangfei Gao setup.sched_param = ¶ms; 6353b3cd89eSZhangfei Gao sess->handle_cipher = wd_cipher_alloc_sess(&setup); 6363b3cd89eSZhangfei Gao if (!sess->handle_cipher) { 637*f665790aSDavid Marchand UADK_LOG(ERR, "uadk failed to alloc session!"); 6383b3cd89eSZhangfei Gao ret = -EINVAL; 6393b3cd89eSZhangfei Gao goto env_uninit; 6403b3cd89eSZhangfei Gao } 6413b3cd89eSZhangfei Gao 6423b3cd89eSZhangfei Gao ret = wd_cipher_set_key(sess->handle_cipher, cipher->key.data, cipher->key.length); 6433b3cd89eSZhangfei Gao if (ret) { 6443b3cd89eSZhangfei Gao wd_cipher_free_sess(sess->handle_cipher); 645*f665790aSDavid Marchand UADK_LOG(ERR, "uadk failed to set key!"); 6463b3cd89eSZhangfei Gao ret = -EINVAL; 6473b3cd89eSZhangfei Gao goto env_uninit; 6483b3cd89eSZhangfei Gao } 6493b3cd89eSZhangfei Gao 6503b3cd89eSZhangfei Gao return 0; 6513b3cd89eSZhangfei Gao 6523b3cd89eSZhangfei Gao env_uninit: 6533b3cd89eSZhangfei Gao wd_cipher_env_uninit(); 6543b3cd89eSZhangfei Gao priv->env_cipher_init = false; 6553b3cd89eSZhangfei Gao return ret; 6563b3cd89eSZhangfei Gao } 6573b3cd89eSZhangfei Gao 658ec23c286SZhangfei Gao /* Set session auth parameters */ 659ec23c286SZhangfei Gao static int 660ec23c286SZhangfei Gao uadk_set_session_auth_parameters(struct rte_cryptodev *dev, 661ec23c286SZhangfei Gao struct uadk_crypto_session *sess, 662ec23c286SZhangfei Gao struct rte_crypto_sym_xform *xform) 663ec23c286SZhangfei Gao { 664ec23c286SZhangfei Gao struct uadk_crypto_priv *priv = dev->data->dev_private; 665ec23c286SZhangfei Gao struct wd_digest_sess_setup setup = {0}; 666ec23c286SZhangfei Gao struct sched_params params = {0}; 667ec23c286SZhangfei Gao int ret; 668ec23c286SZhangfei Gao 669ec23c286SZhangfei Gao if (!priv->env_auth_init) { 670ec23c286SZhangfei Gao ret = wd_digest_env_init(NULL); 671ec23c286SZhangfei Gao if (ret < 0) 672ec23c286SZhangfei Gao return -EINVAL; 673ec23c286SZhangfei Gao priv->env_auth_init = true; 674ec23c286SZhangfei Gao } 675ec23c286SZhangfei Gao 676ec23c286SZhangfei Gao sess->auth.operation = xform->auth.op; 677ec23c286SZhangfei Gao sess->auth.digest_length = xform->auth.digest_length; 678ec23c286SZhangfei Gao 679ec23c286SZhangfei Gao switch (xform->auth.algo) { 680ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_MD5: 681ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_MD5_HMAC: 682ec23c286SZhangfei Gao setup.mode = (xform->auth.algo == RTE_CRYPTO_AUTH_MD5) ? 683ec23c286SZhangfei Gao WD_DIGEST_NORMAL : WD_DIGEST_HMAC; 684ec23c286SZhangfei Gao setup.alg = WD_DIGEST_MD5; 685ec23c286SZhangfei Gao sess->auth.req.out_buf_bytes = 16; 686ec23c286SZhangfei Gao sess->auth.req.out_bytes = 16; 687ec23c286SZhangfei Gao break; 688ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_SHA1: 689ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_SHA1_HMAC: 690ec23c286SZhangfei Gao setup.mode = (xform->auth.algo == RTE_CRYPTO_AUTH_SHA1) ? 691ec23c286SZhangfei Gao WD_DIGEST_NORMAL : WD_DIGEST_HMAC; 692ec23c286SZhangfei Gao setup.alg = WD_DIGEST_SHA1; 693ec23c286SZhangfei Gao sess->auth.req.out_buf_bytes = 20; 694ec23c286SZhangfei Gao sess->auth.req.out_bytes = 20; 695ec23c286SZhangfei Gao break; 696ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_SHA224: 697ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_SHA224_HMAC: 698ec23c286SZhangfei Gao setup.mode = (xform->auth.algo == RTE_CRYPTO_AUTH_SHA224) ? 699ec23c286SZhangfei Gao WD_DIGEST_NORMAL : WD_DIGEST_HMAC; 700ec23c286SZhangfei Gao setup.alg = WD_DIGEST_SHA224; 701ec23c286SZhangfei Gao sess->auth.req.out_buf_bytes = 28; 702ec23c286SZhangfei Gao sess->auth.req.out_bytes = 28; 703ec23c286SZhangfei Gao break; 704ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_SHA256: 705ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_SHA256_HMAC: 706ec23c286SZhangfei Gao setup.mode = (xform->auth.algo == RTE_CRYPTO_AUTH_SHA256) ? 707ec23c286SZhangfei Gao WD_DIGEST_NORMAL : WD_DIGEST_HMAC; 708ec23c286SZhangfei Gao setup.alg = WD_DIGEST_SHA256; 709ec23c286SZhangfei Gao sess->auth.req.out_buf_bytes = 32; 710ec23c286SZhangfei Gao sess->auth.req.out_bytes = 32; 711ec23c286SZhangfei Gao break; 712ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_SHA384: 713ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_SHA384_HMAC: 714ec23c286SZhangfei Gao setup.mode = (xform->auth.algo == RTE_CRYPTO_AUTH_SHA384) ? 715ec23c286SZhangfei Gao WD_DIGEST_NORMAL : WD_DIGEST_HMAC; 716ec23c286SZhangfei Gao setup.alg = WD_DIGEST_SHA384; 717ec23c286SZhangfei Gao sess->auth.req.out_buf_bytes = 48; 718ec23c286SZhangfei Gao sess->auth.req.out_bytes = 48; 719ec23c286SZhangfei Gao break; 720ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_SHA512: 721ec23c286SZhangfei Gao case RTE_CRYPTO_AUTH_SHA512_HMAC: 722ec23c286SZhangfei Gao setup.mode = (xform->auth.algo == RTE_CRYPTO_AUTH_SHA512) ? 723ec23c286SZhangfei Gao WD_DIGEST_NORMAL : WD_DIGEST_HMAC; 724ec23c286SZhangfei Gao setup.alg = WD_DIGEST_SHA512; 725ec23c286SZhangfei Gao sess->auth.req.out_buf_bytes = 64; 726ec23c286SZhangfei Gao sess->auth.req.out_bytes = 64; 727ec23c286SZhangfei Gao break; 728ec23c286SZhangfei Gao default: 729ec23c286SZhangfei Gao ret = -ENOTSUP; 730ec23c286SZhangfei Gao goto env_uninit; 731ec23c286SZhangfei Gao } 732ec23c286SZhangfei Gao 733ec23c286SZhangfei Gao params.numa_id = -1; /* choose nearby numa node */ 734ec23c286SZhangfei Gao setup.sched_param = ¶ms; 735ec23c286SZhangfei Gao sess->handle_digest = wd_digest_alloc_sess(&setup); 736ec23c286SZhangfei Gao if (!sess->handle_digest) { 737*f665790aSDavid Marchand UADK_LOG(ERR, "uadk failed to alloc session!"); 738ec23c286SZhangfei Gao ret = -EINVAL; 739ec23c286SZhangfei Gao goto env_uninit; 740ec23c286SZhangfei Gao } 741ec23c286SZhangfei Gao 742ec23c286SZhangfei Gao /* if mode is HMAC, should set key */ 743ec23c286SZhangfei Gao if (setup.mode == WD_DIGEST_HMAC) { 744ec23c286SZhangfei Gao ret = wd_digest_set_key(sess->handle_digest, 745ec23c286SZhangfei Gao xform->auth.key.data, 746ec23c286SZhangfei Gao xform->auth.key.length); 747ec23c286SZhangfei Gao if (ret) { 748*f665790aSDavid Marchand UADK_LOG(ERR, "uadk failed to alloc session!"); 749ec23c286SZhangfei Gao wd_digest_free_sess(sess->handle_digest); 750ec23c286SZhangfei Gao sess->handle_digest = 0; 751ec23c286SZhangfei Gao ret = -EINVAL; 752ec23c286SZhangfei Gao goto env_uninit; 753ec23c286SZhangfei Gao } 754ec23c286SZhangfei Gao } 755ec23c286SZhangfei Gao 756ec23c286SZhangfei Gao return 0; 757ec23c286SZhangfei Gao 758ec23c286SZhangfei Gao env_uninit: 759ec23c286SZhangfei Gao wd_digest_env_uninit(); 760ec23c286SZhangfei Gao priv->env_auth_init = false; 761ec23c286SZhangfei Gao return ret; 762ec23c286SZhangfei Gao } 763ec23c286SZhangfei Gao 7643b3cd89eSZhangfei Gao static int 7653b3cd89eSZhangfei Gao uadk_crypto_sym_session_configure(struct rte_cryptodev *dev, 7663b3cd89eSZhangfei Gao struct rte_crypto_sym_xform *xform, 7673b3cd89eSZhangfei Gao struct rte_cryptodev_sym_session *session) 7683b3cd89eSZhangfei Gao { 7693b3cd89eSZhangfei Gao struct rte_crypto_sym_xform *cipher_xform = NULL; 770ec23c286SZhangfei Gao struct rte_crypto_sym_xform *auth_xform = NULL; 7713b3cd89eSZhangfei Gao struct uadk_crypto_session *sess = CRYPTODEV_GET_SYM_SESS_PRIV(session); 7723b3cd89eSZhangfei Gao int ret; 7733b3cd89eSZhangfei Gao 7743b3cd89eSZhangfei Gao if (unlikely(!sess)) { 7753b3cd89eSZhangfei Gao UADK_LOG(ERR, "Session not available"); 7763b3cd89eSZhangfei Gao return -EINVAL; 7773b3cd89eSZhangfei Gao } 7783b3cd89eSZhangfei Gao 7793b3cd89eSZhangfei Gao sess->chain_order = uadk_get_chain_order(xform); 7803b3cd89eSZhangfei Gao switch (sess->chain_order) { 7813b3cd89eSZhangfei Gao case UADK_CHAIN_ONLY_CIPHER: 7823b3cd89eSZhangfei Gao cipher_xform = xform; 7833b3cd89eSZhangfei Gao break; 784ec23c286SZhangfei Gao case UADK_CHAIN_ONLY_AUTH: 785ec23c286SZhangfei Gao auth_xform = xform; 786ec23c286SZhangfei Gao break; 787ec23c286SZhangfei Gao case UADK_CHAIN_CIPHER_AUTH: 788ec23c286SZhangfei Gao cipher_xform = xform; 789ec23c286SZhangfei Gao auth_xform = xform->next; 790ec23c286SZhangfei Gao break; 791ec23c286SZhangfei Gao case UADK_CHAIN_AUTH_CIPHER: 792ec23c286SZhangfei Gao auth_xform = xform; 793ec23c286SZhangfei Gao cipher_xform = xform->next; 794ec23c286SZhangfei Gao break; 7953b3cd89eSZhangfei Gao default: 7963b3cd89eSZhangfei Gao return -ENOTSUP; 7973b3cd89eSZhangfei Gao } 7983b3cd89eSZhangfei Gao 7993b3cd89eSZhangfei Gao if (cipher_xform) { 8003b3cd89eSZhangfei Gao ret = uadk_set_session_cipher_parameters(dev, sess, cipher_xform); 8013b3cd89eSZhangfei Gao if (ret != 0) { 8023b3cd89eSZhangfei Gao UADK_LOG(ERR, 8033b3cd89eSZhangfei Gao "Invalid/unsupported cipher parameters"); 8043b3cd89eSZhangfei Gao return ret; 8053b3cd89eSZhangfei Gao } 8063b3cd89eSZhangfei Gao } 8073b3cd89eSZhangfei Gao 808ec23c286SZhangfei Gao if (auth_xform) { 809ec23c286SZhangfei Gao ret = uadk_set_session_auth_parameters(dev, sess, auth_xform); 810ec23c286SZhangfei Gao if (ret != 0) { 811ec23c286SZhangfei Gao UADK_LOG(ERR, 812ec23c286SZhangfei Gao "Invalid/unsupported auth parameters"); 813ec23c286SZhangfei Gao return ret; 814ec23c286SZhangfei Gao } 815ec23c286SZhangfei Gao } 816ec23c286SZhangfei Gao 8173b3cd89eSZhangfei Gao return 0; 8183b3cd89eSZhangfei Gao } 8193b3cd89eSZhangfei Gao 8203b3cd89eSZhangfei Gao static void 8213b3cd89eSZhangfei Gao uadk_crypto_sym_session_clear(struct rte_cryptodev *dev __rte_unused, 8223b3cd89eSZhangfei Gao struct rte_cryptodev_sym_session *session) 8233b3cd89eSZhangfei Gao { 8243b3cd89eSZhangfei Gao struct uadk_crypto_session *sess = CRYPTODEV_GET_SYM_SESS_PRIV(session); 8253b3cd89eSZhangfei Gao 8263b3cd89eSZhangfei Gao if (unlikely(sess == NULL)) { 8273b3cd89eSZhangfei Gao UADK_LOG(ERR, "Session not available"); 8283b3cd89eSZhangfei Gao return; 8293b3cd89eSZhangfei Gao } 8303b3cd89eSZhangfei Gao 8313b3cd89eSZhangfei Gao if (sess->handle_cipher) { 8323b3cd89eSZhangfei Gao wd_cipher_free_sess(sess->handle_cipher); 8333b3cd89eSZhangfei Gao sess->handle_cipher = 0; 8343b3cd89eSZhangfei Gao } 835ec23c286SZhangfei Gao 836ec23c286SZhangfei Gao if (sess->handle_digest) { 837ec23c286SZhangfei Gao wd_digest_free_sess(sess->handle_digest); 838ec23c286SZhangfei Gao sess->handle_digest = 0; 839ec23c286SZhangfei Gao } 8403b3cd89eSZhangfei Gao } 8413b3cd89eSZhangfei Gao 8428c515d96SZhangfei Gao static struct rte_cryptodev_ops uadk_crypto_pmd_ops = { 84353ae1393SZhangfei Gao .dev_configure = uadk_crypto_pmd_config, 84453ae1393SZhangfei Gao .dev_start = uadk_crypto_pmd_start, 84553ae1393SZhangfei Gao .dev_stop = uadk_crypto_pmd_stop, 84653ae1393SZhangfei Gao .dev_close = uadk_crypto_pmd_close, 84753ae1393SZhangfei Gao .stats_get = uadk_crypto_pmd_stats_get, 84853ae1393SZhangfei Gao .stats_reset = uadk_crypto_pmd_stats_reset, 84953ae1393SZhangfei Gao .dev_infos_get = uadk_crypto_pmd_info_get, 85053ae1393SZhangfei Gao .queue_pair_setup = uadk_crypto_pmd_qp_setup, 85153ae1393SZhangfei Gao .queue_pair_release = uadk_crypto_pmd_qp_release, 8523b3cd89eSZhangfei Gao .sym_session_get_size = uadk_crypto_sym_session_get_size, 8533b3cd89eSZhangfei Gao .sym_session_configure = uadk_crypto_sym_session_configure, 8543b3cd89eSZhangfei Gao .sym_session_clear = uadk_crypto_sym_session_clear, 8558c515d96SZhangfei Gao }; 8568c515d96SZhangfei Gao 8573b3cd89eSZhangfei Gao static void 8583b3cd89eSZhangfei Gao uadk_process_cipher_op(struct rte_crypto_op *op, 8593b3cd89eSZhangfei Gao struct uadk_crypto_session *sess, 8603b3cd89eSZhangfei Gao struct rte_mbuf *msrc, struct rte_mbuf *mdst) 8613b3cd89eSZhangfei Gao { 8623b3cd89eSZhangfei Gao uint32_t off = op->sym->cipher.data.offset; 8633b3cd89eSZhangfei Gao int ret; 8643b3cd89eSZhangfei Gao 8653b3cd89eSZhangfei Gao if (!sess) { 8663b3cd89eSZhangfei Gao op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; 8673b3cd89eSZhangfei Gao return; 8683b3cd89eSZhangfei Gao } 8693b3cd89eSZhangfei Gao 8703b3cd89eSZhangfei Gao sess->cipher.req.src = rte_pktmbuf_mtod_offset(msrc, uint8_t *, off); 8713b3cd89eSZhangfei Gao sess->cipher.req.in_bytes = op->sym->cipher.data.length; 8723b3cd89eSZhangfei Gao sess->cipher.req.dst = rte_pktmbuf_mtod_offset(mdst, uint8_t *, off); 8733b3cd89eSZhangfei Gao sess->cipher.req.out_buf_bytes = sess->cipher.req.in_bytes; 8743b3cd89eSZhangfei Gao sess->cipher.req.iv_bytes = sess->iv.length; 8753b3cd89eSZhangfei Gao sess->cipher.req.iv = rte_crypto_op_ctod_offset(op, uint8_t *, 8763b3cd89eSZhangfei Gao sess->iv.offset); 8773b3cd89eSZhangfei Gao if (sess->cipher.direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) 8783b3cd89eSZhangfei Gao sess->cipher.req.op_type = WD_CIPHER_ENCRYPTION; 8793b3cd89eSZhangfei Gao else 8803b3cd89eSZhangfei Gao sess->cipher.req.op_type = WD_CIPHER_DECRYPTION; 8813b3cd89eSZhangfei Gao 8823b3cd89eSZhangfei Gao do { 8833b3cd89eSZhangfei Gao ret = wd_do_cipher_sync(sess->handle_cipher, &sess->cipher.req); 8843b3cd89eSZhangfei Gao } while (ret == -WD_EBUSY); 8853b3cd89eSZhangfei Gao 8863b3cd89eSZhangfei Gao if (ret) 8873b3cd89eSZhangfei Gao op->status = RTE_CRYPTO_OP_STATUS_ERROR; 8883b3cd89eSZhangfei Gao } 8893b3cd89eSZhangfei Gao 890ec23c286SZhangfei Gao static void 891ec23c286SZhangfei Gao uadk_process_auth_op(struct uadk_qp *qp, struct rte_crypto_op *op, 892ec23c286SZhangfei Gao struct uadk_crypto_session *sess, 893ec23c286SZhangfei Gao struct rte_mbuf *msrc, struct rte_mbuf *mdst) 894ec23c286SZhangfei Gao { 895ec23c286SZhangfei Gao uint32_t srclen = op->sym->auth.data.length; 896ec23c286SZhangfei Gao uint32_t off = op->sym->auth.data.offset; 897ec23c286SZhangfei Gao uint8_t *dst = qp->temp_digest; 898ec23c286SZhangfei Gao int ret; 899ec23c286SZhangfei Gao 900ec23c286SZhangfei Gao if (!sess) { 901ec23c286SZhangfei Gao op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS; 902ec23c286SZhangfei Gao return; 903ec23c286SZhangfei Gao } 904ec23c286SZhangfei Gao 905ec23c286SZhangfei Gao sess->auth.req.in = rte_pktmbuf_mtod_offset(msrc, uint8_t *, off); 906ec23c286SZhangfei Gao sess->auth.req.in_bytes = srclen; 907ec23c286SZhangfei Gao sess->auth.req.out = dst; 908ec23c286SZhangfei Gao 909ec23c286SZhangfei Gao do { 910ec23c286SZhangfei Gao ret = wd_do_digest_sync(sess->handle_digest, &sess->auth.req); 911ec23c286SZhangfei Gao } while (ret == -WD_EBUSY); 912ec23c286SZhangfei Gao 913ec23c286SZhangfei Gao if (sess->auth.operation == RTE_CRYPTO_AUTH_OP_VERIFY) { 914ec23c286SZhangfei Gao if (memcmp(dst, op->sym->auth.digest.data, 915ec23c286SZhangfei Gao sess->auth.digest_length) != 0) { 916ec23c286SZhangfei Gao op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 917ec23c286SZhangfei Gao } 918ec23c286SZhangfei Gao } else { 919ec23c286SZhangfei Gao uint8_t *auth_dst; 920ec23c286SZhangfei Gao 921ec23c286SZhangfei Gao auth_dst = op->sym->auth.digest.data; 922ec23c286SZhangfei Gao if (auth_dst == NULL) 923ec23c286SZhangfei Gao auth_dst = rte_pktmbuf_mtod_offset(mdst, uint8_t *, 924ec23c286SZhangfei Gao op->sym->auth.data.offset + 925ec23c286SZhangfei Gao op->sym->auth.data.length); 926ec23c286SZhangfei Gao memcpy(auth_dst, dst, sess->auth.digest_length); 927ec23c286SZhangfei Gao } 928ec23c286SZhangfei Gao 929ec23c286SZhangfei Gao if (ret) 930ec23c286SZhangfei Gao op->status = RTE_CRYPTO_OP_STATUS_ERROR; 931ec23c286SZhangfei Gao } 932ec23c286SZhangfei Gao 933be2874cdSZhangfei Gao static uint16_t 934be2874cdSZhangfei Gao uadk_crypto_enqueue_burst(void *queue_pair, struct rte_crypto_op **ops, 935be2874cdSZhangfei Gao uint16_t nb_ops) 936be2874cdSZhangfei Gao { 937be2874cdSZhangfei Gao struct uadk_qp *qp = queue_pair; 9383b3cd89eSZhangfei Gao struct uadk_crypto_session *sess = NULL; 9393b3cd89eSZhangfei Gao struct rte_mbuf *msrc, *mdst; 940be2874cdSZhangfei Gao struct rte_crypto_op *op; 941be2874cdSZhangfei Gao uint16_t enqd = 0; 942be2874cdSZhangfei Gao int i, ret; 943be2874cdSZhangfei Gao 944be2874cdSZhangfei Gao for (i = 0; i < nb_ops; i++) { 945be2874cdSZhangfei Gao op = ops[i]; 946be2874cdSZhangfei Gao op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED; 9473b3cd89eSZhangfei Gao msrc = op->sym->m_src; 9483b3cd89eSZhangfei Gao mdst = op->sym->m_dst ? op->sym->m_dst : op->sym->m_src; 9493b3cd89eSZhangfei Gao 9503b3cd89eSZhangfei Gao if (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION) { 9513b3cd89eSZhangfei Gao if (likely(op->sym->session != NULL)) 9523b3cd89eSZhangfei Gao sess = CRYPTODEV_GET_SYM_SESS_PRIV( 9533b3cd89eSZhangfei Gao op->sym->session); 9543b3cd89eSZhangfei Gao } 9553b3cd89eSZhangfei Gao 9563b3cd89eSZhangfei Gao switch (sess->chain_order) { 9573b3cd89eSZhangfei Gao case UADK_CHAIN_ONLY_CIPHER: 9583b3cd89eSZhangfei Gao uadk_process_cipher_op(op, sess, msrc, mdst); 9593b3cd89eSZhangfei Gao break; 960ec23c286SZhangfei Gao case UADK_CHAIN_ONLY_AUTH: 961ec23c286SZhangfei Gao uadk_process_auth_op(qp, op, sess, msrc, mdst); 962ec23c286SZhangfei Gao break; 963ec23c286SZhangfei Gao case UADK_CHAIN_CIPHER_AUTH: 964ec23c286SZhangfei Gao uadk_process_cipher_op(op, sess, msrc, mdst); 965ec23c286SZhangfei Gao uadk_process_auth_op(qp, op, sess, mdst, mdst); 966ec23c286SZhangfei Gao break; 967ec23c286SZhangfei Gao case UADK_CHAIN_AUTH_CIPHER: 968ec23c286SZhangfei Gao uadk_process_auth_op(qp, op, sess, msrc, mdst); 969ec23c286SZhangfei Gao uadk_process_cipher_op(op, sess, msrc, mdst); 970ec23c286SZhangfei Gao break; 9713b3cd89eSZhangfei Gao default: 9723b3cd89eSZhangfei Gao op->status = RTE_CRYPTO_OP_STATUS_ERROR; 9733b3cd89eSZhangfei Gao break; 9743b3cd89eSZhangfei Gao } 975be2874cdSZhangfei Gao 976be2874cdSZhangfei Gao if (op->status == RTE_CRYPTO_OP_STATUS_NOT_PROCESSED) 977be2874cdSZhangfei Gao op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 978be2874cdSZhangfei Gao 979be2874cdSZhangfei Gao if (op->status != RTE_CRYPTO_OP_STATUS_ERROR) { 980be2874cdSZhangfei Gao ret = rte_ring_enqueue(qp->processed_pkts, (void *)op); 981be2874cdSZhangfei Gao if (ret < 0) 982be2874cdSZhangfei Gao goto enqueue_err; 983be2874cdSZhangfei Gao qp->qp_stats.enqueued_count++; 984be2874cdSZhangfei Gao enqd++; 985be2874cdSZhangfei Gao } else { 986be2874cdSZhangfei Gao /* increment count if failed to enqueue op */ 987be2874cdSZhangfei Gao qp->qp_stats.enqueue_err_count++; 988be2874cdSZhangfei Gao } 989be2874cdSZhangfei Gao } 990be2874cdSZhangfei Gao 991be2874cdSZhangfei Gao return enqd; 992be2874cdSZhangfei Gao 993be2874cdSZhangfei Gao enqueue_err: 994be2874cdSZhangfei Gao qp->qp_stats.enqueue_err_count++; 995be2874cdSZhangfei Gao return enqd; 996be2874cdSZhangfei Gao } 997be2874cdSZhangfei Gao 998be2874cdSZhangfei Gao static uint16_t 999be2874cdSZhangfei Gao uadk_crypto_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops, 1000be2874cdSZhangfei Gao uint16_t nb_ops) 1001be2874cdSZhangfei Gao { 1002be2874cdSZhangfei Gao struct uadk_qp *qp = queue_pair; 1003be2874cdSZhangfei Gao unsigned int nb_dequeued; 1004be2874cdSZhangfei Gao 1005be2874cdSZhangfei Gao nb_dequeued = rte_ring_dequeue_burst(qp->processed_pkts, 1006be2874cdSZhangfei Gao (void **)ops, nb_ops, NULL); 1007be2874cdSZhangfei Gao qp->qp_stats.dequeued_count += nb_dequeued; 1008be2874cdSZhangfei Gao 1009be2874cdSZhangfei Gao return nb_dequeued; 1010be2874cdSZhangfei Gao } 1011be2874cdSZhangfei Gao 10128c515d96SZhangfei Gao static int 10138c515d96SZhangfei Gao uadk_cryptodev_probe(struct rte_vdev_device *vdev) 10148c515d96SZhangfei Gao { 10158c515d96SZhangfei Gao struct rte_cryptodev_pmd_init_params init_params = { 10168c515d96SZhangfei Gao .name = "", 10178c515d96SZhangfei Gao .private_data_size = sizeof(struct uadk_crypto_priv), 10188c515d96SZhangfei Gao .max_nb_queue_pairs = 10198c515d96SZhangfei Gao RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS, 10208c515d96SZhangfei Gao }; 10218c515d96SZhangfei Gao enum uadk_crypto_version version = UADK_CRYPTO_V2; 10228c515d96SZhangfei Gao struct uadk_crypto_priv *priv; 10238c515d96SZhangfei Gao struct rte_cryptodev *dev; 10248c515d96SZhangfei Gao struct uacce_dev *udev; 1025a8ca598cSZhangfei Gao const char *input_args; 10268c515d96SZhangfei Gao const char *name; 10278c515d96SZhangfei Gao 10288c515d96SZhangfei Gao udev = wd_get_accel_dev("cipher"); 10298c515d96SZhangfei Gao if (!udev) 10308c515d96SZhangfei Gao return -ENODEV; 10318c515d96SZhangfei Gao 10328c515d96SZhangfei Gao if (!strcmp(udev->api, "hisi_qm_v2")) 10338c515d96SZhangfei Gao version = UADK_CRYPTO_V2; 10348c515d96SZhangfei Gao 10358c515d96SZhangfei Gao free(udev); 10368c515d96SZhangfei Gao 10378c515d96SZhangfei Gao name = rte_vdev_device_name(vdev); 10388c515d96SZhangfei Gao if (name == NULL) 10398c515d96SZhangfei Gao return -EINVAL; 10408c515d96SZhangfei Gao 1041a8ca598cSZhangfei Gao input_args = rte_vdev_device_args(vdev); 1042a8ca598cSZhangfei Gao rte_cryptodev_pmd_parse_input_args(&init_params, input_args); 1043a8ca598cSZhangfei Gao 10448c515d96SZhangfei Gao dev = rte_cryptodev_pmd_create(name, &vdev->device, &init_params); 10458c515d96SZhangfei Gao if (dev == NULL) { 10468c515d96SZhangfei Gao UADK_LOG(ERR, "driver %s: create failed", init_params.name); 10478c515d96SZhangfei Gao return -ENODEV; 10488c515d96SZhangfei Gao } 10498c515d96SZhangfei Gao 10508c515d96SZhangfei Gao dev->dev_ops = &uadk_crypto_pmd_ops; 10518c515d96SZhangfei Gao dev->driver_id = uadk_cryptodev_driver_id; 1052be2874cdSZhangfei Gao dev->dequeue_burst = uadk_crypto_dequeue_burst; 1053be2874cdSZhangfei Gao dev->enqueue_burst = uadk_crypto_enqueue_burst; 10543b3cd89eSZhangfei Gao dev->feature_flags = RTE_CRYPTODEV_FF_HW_ACCELERATED | 10553b3cd89eSZhangfei Gao RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO; 10568c515d96SZhangfei Gao priv = dev->data->dev_private; 10578c515d96SZhangfei Gao priv->version = version; 1058a8ca598cSZhangfei Gao priv->max_nb_qpairs = init_params.max_nb_queue_pairs; 10598c515d96SZhangfei Gao 10608c515d96SZhangfei Gao rte_cryptodev_pmd_probing_finish(dev); 10618c515d96SZhangfei Gao 10628c515d96SZhangfei Gao return 0; 10638c515d96SZhangfei Gao } 10648c515d96SZhangfei Gao 10658c515d96SZhangfei Gao static int 10668c515d96SZhangfei Gao uadk_cryptodev_remove(struct rte_vdev_device *vdev) 10678c515d96SZhangfei Gao { 10688c515d96SZhangfei Gao struct rte_cryptodev *cryptodev; 10698c515d96SZhangfei Gao const char *name; 10708c515d96SZhangfei Gao 10718c515d96SZhangfei Gao name = rte_vdev_device_name(vdev); 10728c515d96SZhangfei Gao if (name == NULL) 10738c515d96SZhangfei Gao return -EINVAL; 10748c515d96SZhangfei Gao 10758c515d96SZhangfei Gao cryptodev = rte_cryptodev_pmd_get_named_dev(name); 10768c515d96SZhangfei Gao if (cryptodev == NULL) 10778c515d96SZhangfei Gao return -ENODEV; 10788c515d96SZhangfei Gao 10798c515d96SZhangfei Gao return rte_cryptodev_pmd_destroy(cryptodev); 10808c515d96SZhangfei Gao } 10818c515d96SZhangfei Gao 10828c515d96SZhangfei Gao static struct rte_vdev_driver uadk_crypto_pmd = { 10838c515d96SZhangfei Gao .probe = uadk_cryptodev_probe, 10848c515d96SZhangfei Gao .remove = uadk_cryptodev_remove, 10858c515d96SZhangfei Gao }; 10868c515d96SZhangfei Gao 10878c515d96SZhangfei Gao static struct cryptodev_driver uadk_crypto_drv; 10888c515d96SZhangfei Gao 10898c515d96SZhangfei Gao #define UADK_CRYPTO_DRIVER_NAME crypto_uadk 10908c515d96SZhangfei Gao RTE_PMD_REGISTER_VDEV(UADK_CRYPTO_DRIVER_NAME, uadk_crypto_pmd); 10918c515d96SZhangfei Gao RTE_PMD_REGISTER_CRYPTO_DRIVER(uadk_crypto_drv, uadk_crypto_pmd.driver, 10928c515d96SZhangfei Gao uadk_cryptodev_driver_id); 1093a8ca598cSZhangfei Gao RTE_PMD_REGISTER_PARAM_STRING(UADK_CRYPTO_DRIVER_NAME, 1094a8ca598cSZhangfei Gao "max_nb_queue_pairs=<int>"); 10958c515d96SZhangfei Gao RTE_LOG_REGISTER_DEFAULT(uadk_crypto_logtype, INFO); 1096