10054d84fSRavi Kumar /* SPDX-License-Identifier: BSD-3-Clause 20054d84fSRavi Kumar * Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved. 30054d84fSRavi Kumar */ 40054d84fSRavi Kumar 5*6723c0fcSBruce Richardson #include <rte_string_fns.h> 6ef4b04f8SRavi Kumar #include <rte_bus_pci.h> 70054d84fSRavi Kumar #include <rte_bus_vdev.h> 8ef4b04f8SRavi Kumar #include <rte_common.h> 9ef4b04f8SRavi Kumar #include <rte_config.h> 100054d84fSRavi Kumar #include <rte_cryptodev.h> 110054d84fSRavi Kumar #include <rte_cryptodev_pmd.h> 12ef4b04f8SRavi Kumar #include <rte_pci.h> 13ef4b04f8SRavi Kumar #include <rte_dev.h> 14ef4b04f8SRavi Kumar #include <rte_malloc.h> 150054d84fSRavi Kumar 1670f0f8a8SRavi Kumar #include "ccp_crypto.h" 17ef4b04f8SRavi Kumar #include "ccp_dev.h" 18ef4b04f8SRavi Kumar #include "ccp_pmd_private.h" 19ef4b04f8SRavi Kumar 20ef4b04f8SRavi Kumar /** 21ef4b04f8SRavi Kumar * Global static parameter used to find if CCP device is already initialized. 22ef4b04f8SRavi Kumar */ 23ef4b04f8SRavi Kumar static unsigned int ccp_pmd_init_done; 240054d84fSRavi Kumar uint8_t ccp_cryptodev_driver_id; 250054d84fSRavi Kumar 26e0d88a39SRavi Kumar struct ccp_pmd_init_params { 27e0d88a39SRavi Kumar struct rte_cryptodev_pmd_init_params def_p; 28e0d88a39SRavi Kumar bool auth_opt; 29e0d88a39SRavi Kumar }; 30e0d88a39SRavi Kumar 31e0d88a39SRavi Kumar #define CCP_CRYPTODEV_PARAM_NAME ("name") 32e0d88a39SRavi Kumar #define CCP_CRYPTODEV_PARAM_SOCKET_ID ("socket_id") 33e0d88a39SRavi Kumar #define CCP_CRYPTODEV_PARAM_MAX_NB_QP ("max_nb_queue_pairs") 34e0d88a39SRavi Kumar #define CCP_CRYPTODEV_PARAM_AUTH_OPT ("ccp_auth_opt") 35e0d88a39SRavi Kumar 36e0d88a39SRavi Kumar const char *ccp_pmd_valid_params[] = { 37e0d88a39SRavi Kumar CCP_CRYPTODEV_PARAM_NAME, 38e0d88a39SRavi Kumar CCP_CRYPTODEV_PARAM_SOCKET_ID, 39e0d88a39SRavi Kumar CCP_CRYPTODEV_PARAM_MAX_NB_QP, 40e0d88a39SRavi Kumar CCP_CRYPTODEV_PARAM_AUTH_OPT, 41e0d88a39SRavi Kumar }; 42e0d88a39SRavi Kumar 43e0d88a39SRavi Kumar /** ccp pmd auth option */ 44e0d88a39SRavi Kumar enum ccp_pmd_auth_opt { 45e0d88a39SRavi Kumar CCP_PMD_AUTH_OPT_CCP = 0, 46e0d88a39SRavi Kumar CCP_PMD_AUTH_OPT_CPU, 47e0d88a39SRavi Kumar }; 48e0d88a39SRavi Kumar 49e0d88a39SRavi Kumar /** parse integer from integer argument */ 50e0d88a39SRavi Kumar static int 51e0d88a39SRavi Kumar parse_integer_arg(const char *key __rte_unused, 52e0d88a39SRavi Kumar const char *value, void *extra_args) 53e0d88a39SRavi Kumar { 54e0d88a39SRavi Kumar int *i = (int *) extra_args; 55e0d88a39SRavi Kumar 56e0d88a39SRavi Kumar *i = atoi(value); 57e0d88a39SRavi Kumar if (*i < 0) { 58e0d88a39SRavi Kumar CCP_LOG_ERR("Argument has to be positive.\n"); 59e0d88a39SRavi Kumar return -EINVAL; 60e0d88a39SRavi Kumar } 61e0d88a39SRavi Kumar 62e0d88a39SRavi Kumar return 0; 63e0d88a39SRavi Kumar } 64e0d88a39SRavi Kumar 65e0d88a39SRavi Kumar /** parse name argument */ 66e0d88a39SRavi Kumar static int 67e0d88a39SRavi Kumar parse_name_arg(const char *key __rte_unused, 68e0d88a39SRavi Kumar const char *value, void *extra_args) 69e0d88a39SRavi Kumar { 70e0d88a39SRavi Kumar struct rte_cryptodev_pmd_init_params *params = extra_args; 71e0d88a39SRavi Kumar 72e0d88a39SRavi Kumar if (strlen(value) >= RTE_CRYPTODEV_NAME_MAX_LEN - 1) { 73e0d88a39SRavi Kumar CCP_LOG_ERR("Invalid name %s, should be less than " 74e0d88a39SRavi Kumar "%u bytes.\n", value, 75e0d88a39SRavi Kumar RTE_CRYPTODEV_NAME_MAX_LEN - 1); 76e0d88a39SRavi Kumar return -EINVAL; 77e0d88a39SRavi Kumar } 78e0d88a39SRavi Kumar 79e0d88a39SRavi Kumar strncpy(params->name, value, RTE_CRYPTODEV_NAME_MAX_LEN); 80e0d88a39SRavi Kumar 81e0d88a39SRavi Kumar return 0; 82e0d88a39SRavi Kumar } 83e0d88a39SRavi Kumar 84e0d88a39SRavi Kumar /** parse authentication operation option */ 85e0d88a39SRavi Kumar static int 86e0d88a39SRavi Kumar parse_auth_opt_arg(const char *key __rte_unused, 87e0d88a39SRavi Kumar const char *value, void *extra_args) 88e0d88a39SRavi Kumar { 89e0d88a39SRavi Kumar struct ccp_pmd_init_params *params = extra_args; 90e0d88a39SRavi Kumar int i; 91e0d88a39SRavi Kumar 92e0d88a39SRavi Kumar i = atoi(value); 93e0d88a39SRavi Kumar if (i < CCP_PMD_AUTH_OPT_CCP || i > CCP_PMD_AUTH_OPT_CPU) { 94e0d88a39SRavi Kumar CCP_LOG_ERR("Invalid ccp pmd auth option. " 95e0d88a39SRavi Kumar "0->auth on CCP(default), " 96e0d88a39SRavi Kumar "1->auth on CPU\n"); 97e0d88a39SRavi Kumar return -EINVAL; 98e0d88a39SRavi Kumar } 99e0d88a39SRavi Kumar params->auth_opt = i; 100e0d88a39SRavi Kumar return 0; 101e0d88a39SRavi Kumar } 102e0d88a39SRavi Kumar 103e0d88a39SRavi Kumar static int 104e0d88a39SRavi Kumar ccp_pmd_parse_input_args(struct ccp_pmd_init_params *params, 105e0d88a39SRavi Kumar const char *input_args) 106e0d88a39SRavi Kumar { 107e0d88a39SRavi Kumar struct rte_kvargs *kvlist = NULL; 108e0d88a39SRavi Kumar int ret = 0; 109e0d88a39SRavi Kumar 110e0d88a39SRavi Kumar if (params == NULL) 111e0d88a39SRavi Kumar return -EINVAL; 112e0d88a39SRavi Kumar 113e0d88a39SRavi Kumar if (input_args) { 114e0d88a39SRavi Kumar kvlist = rte_kvargs_parse(input_args, 115e0d88a39SRavi Kumar ccp_pmd_valid_params); 116e0d88a39SRavi Kumar if (kvlist == NULL) 117e0d88a39SRavi Kumar return -1; 118e0d88a39SRavi Kumar 119e0d88a39SRavi Kumar ret = rte_kvargs_process(kvlist, 120e0d88a39SRavi Kumar CCP_CRYPTODEV_PARAM_MAX_NB_QP, 121e0d88a39SRavi Kumar &parse_integer_arg, 122e0d88a39SRavi Kumar ¶ms->def_p.max_nb_queue_pairs); 123e0d88a39SRavi Kumar if (ret < 0) 124e0d88a39SRavi Kumar goto free_kvlist; 125e0d88a39SRavi Kumar 126e0d88a39SRavi Kumar ret = rte_kvargs_process(kvlist, 127e0d88a39SRavi Kumar CCP_CRYPTODEV_PARAM_SOCKET_ID, 128e0d88a39SRavi Kumar &parse_integer_arg, 129e0d88a39SRavi Kumar ¶ms->def_p.socket_id); 130e0d88a39SRavi Kumar if (ret < 0) 131e0d88a39SRavi Kumar goto free_kvlist; 132e0d88a39SRavi Kumar 133e0d88a39SRavi Kumar ret = rte_kvargs_process(kvlist, 134e0d88a39SRavi Kumar CCP_CRYPTODEV_PARAM_NAME, 135e0d88a39SRavi Kumar &parse_name_arg, 136e0d88a39SRavi Kumar ¶ms->def_p); 137e0d88a39SRavi Kumar if (ret < 0) 138e0d88a39SRavi Kumar goto free_kvlist; 139e0d88a39SRavi Kumar 140e0d88a39SRavi Kumar ret = rte_kvargs_process(kvlist, 141e0d88a39SRavi Kumar CCP_CRYPTODEV_PARAM_AUTH_OPT, 142e0d88a39SRavi Kumar &parse_auth_opt_arg, 143e0d88a39SRavi Kumar params); 144e0d88a39SRavi Kumar if (ret < 0) 145e0d88a39SRavi Kumar goto free_kvlist; 146e0d88a39SRavi Kumar 147e0d88a39SRavi Kumar } 148e0d88a39SRavi Kumar 149e0d88a39SRavi Kumar free_kvlist: 150e0d88a39SRavi Kumar rte_kvargs_free(kvlist); 151e0d88a39SRavi Kumar return ret; 152e0d88a39SRavi Kumar } 153e0d88a39SRavi Kumar 15470f0f8a8SRavi Kumar static struct ccp_session * 155ffdace42SRavi Kumar get_ccp_session(struct ccp_qp *qp, struct rte_crypto_op *op) 156ef4b04f8SRavi Kumar { 15770f0f8a8SRavi Kumar struct ccp_session *sess = NULL; 158ef4b04f8SRavi Kumar 15970f0f8a8SRavi Kumar if (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION) { 16070f0f8a8SRavi Kumar if (unlikely(op->sym->session == NULL)) 16170f0f8a8SRavi Kumar return NULL; 16270f0f8a8SRavi Kumar 16370f0f8a8SRavi Kumar sess = (struct ccp_session *) 164012c5076SPablo de Lara get_sym_session_private_data( 16570f0f8a8SRavi Kumar op->sym->session, 16670f0f8a8SRavi Kumar ccp_cryptodev_driver_id); 167ffdace42SRavi Kumar } else if (op->sess_type == RTE_CRYPTO_OP_SESSIONLESS) { 168ffdace42SRavi Kumar void *_sess; 169ffdace42SRavi Kumar void *_sess_private_data = NULL; 170e0d88a39SRavi Kumar struct ccp_private *internals; 171ffdace42SRavi Kumar 172ffdace42SRavi Kumar if (rte_mempool_get(qp->sess_mp, &_sess)) 173ffdace42SRavi Kumar return NULL; 174ffdace42SRavi Kumar if (rte_mempool_get(qp->sess_mp, (void **)&_sess_private_data)) 175ffdace42SRavi Kumar return NULL; 176ffdace42SRavi Kumar 177ffdace42SRavi Kumar sess = (struct ccp_session *)_sess_private_data; 178ffdace42SRavi Kumar 179e0d88a39SRavi Kumar internals = (struct ccp_private *)qp->dev->data->dev_private; 180e0d88a39SRavi Kumar if (unlikely(ccp_set_session_parameters(sess, op->sym->xform, 181e0d88a39SRavi Kumar internals) != 0)) { 182ffdace42SRavi Kumar rte_mempool_put(qp->sess_mp, _sess); 183725d2a7fSFan Zhang rte_mempool_put(qp->sess_mp_priv, _sess_private_data); 184ffdace42SRavi Kumar sess = NULL; 185ffdace42SRavi Kumar } 186ffdace42SRavi Kumar op->sym->session = (struct rte_cryptodev_sym_session *)_sess; 187012c5076SPablo de Lara set_sym_session_private_data(op->sym->session, 188ffdace42SRavi Kumar ccp_cryptodev_driver_id, 189ffdace42SRavi Kumar _sess_private_data); 19070f0f8a8SRavi Kumar } 19170f0f8a8SRavi Kumar 19270f0f8a8SRavi Kumar return sess; 19370f0f8a8SRavi Kumar } 19470f0f8a8SRavi Kumar 19570f0f8a8SRavi Kumar static uint16_t 19670f0f8a8SRavi Kumar ccp_pmd_enqueue_burst(void *queue_pair, struct rte_crypto_op **ops, 19770f0f8a8SRavi Kumar uint16_t nb_ops) 19870f0f8a8SRavi Kumar { 19970f0f8a8SRavi Kumar struct ccp_session *sess = NULL; 20070f0f8a8SRavi Kumar struct ccp_qp *qp = queue_pair; 20170f0f8a8SRavi Kumar struct ccp_queue *cmd_q; 20270f0f8a8SRavi Kumar struct rte_cryptodev *dev = qp->dev; 20370f0f8a8SRavi Kumar uint16_t i, enq_cnt = 0, slots_req = 0; 20470f0f8a8SRavi Kumar 20570f0f8a8SRavi Kumar if (nb_ops == 0) 20670f0f8a8SRavi Kumar return 0; 20770f0f8a8SRavi Kumar 20870f0f8a8SRavi Kumar if (unlikely(rte_ring_full(qp->processed_pkts) != 0)) 20970f0f8a8SRavi Kumar return 0; 21070f0f8a8SRavi Kumar 21170f0f8a8SRavi Kumar for (i = 0; i < nb_ops; i++) { 21270f0f8a8SRavi Kumar sess = get_ccp_session(qp, ops[i]); 21370f0f8a8SRavi Kumar if (unlikely(sess == NULL) && (i == 0)) { 21470f0f8a8SRavi Kumar qp->qp_stats.enqueue_err_count++; 21570f0f8a8SRavi Kumar return 0; 21670f0f8a8SRavi Kumar } else if (sess == NULL) { 21770f0f8a8SRavi Kumar nb_ops = i; 21870f0f8a8SRavi Kumar break; 21970f0f8a8SRavi Kumar } 22070f0f8a8SRavi Kumar slots_req += ccp_compute_slot_count(sess); 22170f0f8a8SRavi Kumar } 22270f0f8a8SRavi Kumar 22370f0f8a8SRavi Kumar cmd_q = ccp_allot_queue(dev, slots_req); 22470f0f8a8SRavi Kumar if (unlikely(cmd_q == NULL)) 22570f0f8a8SRavi Kumar return 0; 22670f0f8a8SRavi Kumar 22770f0f8a8SRavi Kumar enq_cnt = process_ops_to_enqueue(qp, ops, cmd_q, nb_ops, slots_req); 22870f0f8a8SRavi Kumar qp->qp_stats.enqueued_count += enq_cnt; 229ef4b04f8SRavi Kumar return enq_cnt; 230ef4b04f8SRavi Kumar } 231ef4b04f8SRavi Kumar 232ef4b04f8SRavi Kumar static uint16_t 23370f0f8a8SRavi Kumar ccp_pmd_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops, 23470f0f8a8SRavi Kumar uint16_t nb_ops) 235ef4b04f8SRavi Kumar { 23670f0f8a8SRavi Kumar struct ccp_qp *qp = queue_pair; 237ffdace42SRavi Kumar uint16_t nb_dequeued = 0, i; 238ef4b04f8SRavi Kumar 23970f0f8a8SRavi Kumar nb_dequeued = process_ops_to_dequeue(qp, ops, nb_ops); 24070f0f8a8SRavi Kumar 241ffdace42SRavi Kumar /* Free session if a session-less crypto op */ 242ffdace42SRavi Kumar for (i = 0; i < nb_dequeued; i++) 243ffdace42SRavi Kumar if (unlikely(ops[i]->sess_type == 244ffdace42SRavi Kumar RTE_CRYPTO_OP_SESSIONLESS)) { 245725d2a7fSFan Zhang struct ccp_session *sess = (struct ccp_session *) 246725d2a7fSFan Zhang get_sym_session_private_data( 247725d2a7fSFan Zhang ops[i]->sym->session, 248725d2a7fSFan Zhang ccp_cryptodev_driver_id); 249725d2a7fSFan Zhang 250725d2a7fSFan Zhang rte_mempool_put(qp->sess_mp_priv, 251725d2a7fSFan Zhang sess); 252ffdace42SRavi Kumar rte_mempool_put(qp->sess_mp, 253ffdace42SRavi Kumar ops[i]->sym->session); 254ffdace42SRavi Kumar ops[i]->sym->session = NULL; 255ffdace42SRavi Kumar } 25670f0f8a8SRavi Kumar qp->qp_stats.dequeued_count += nb_dequeued; 25770f0f8a8SRavi Kumar 258ef4b04f8SRavi Kumar return nb_dequeued; 259ef4b04f8SRavi Kumar } 260ef4b04f8SRavi Kumar 261ef4b04f8SRavi Kumar /* 262ef4b04f8SRavi Kumar * The set of PCI devices this driver supports 263ef4b04f8SRavi Kumar */ 264ef4b04f8SRavi Kumar static struct rte_pci_id ccp_pci_id[] = { 265ef4b04f8SRavi Kumar { 266ef4b04f8SRavi Kumar RTE_PCI_DEVICE(0x1022, 0x1456), /* AMD CCP-5a */ 267ef4b04f8SRavi Kumar }, 268ef4b04f8SRavi Kumar { 269ef4b04f8SRavi Kumar RTE_PCI_DEVICE(0x1022, 0x1468), /* AMD CCP-5b */ 270ef4b04f8SRavi Kumar }, 271ef4b04f8SRavi Kumar {.device_id = 0}, 272ef4b04f8SRavi Kumar }; 273ef4b04f8SRavi Kumar 2740054d84fSRavi Kumar /** Remove ccp pmd */ 2750054d84fSRavi Kumar static int 276ef4b04f8SRavi Kumar cryptodev_ccp_remove(struct rte_vdev_device *dev) 2770054d84fSRavi Kumar { 278ef4b04f8SRavi Kumar const char *name; 279ef4b04f8SRavi Kumar 280ef4b04f8SRavi Kumar ccp_pmd_init_done = 0; 281ef4b04f8SRavi Kumar name = rte_vdev_device_name(dev); 282ef4b04f8SRavi Kumar if (name == NULL) 283ef4b04f8SRavi Kumar return -EINVAL; 284ef4b04f8SRavi Kumar 285ef4b04f8SRavi Kumar RTE_LOG(INFO, PMD, "Closing ccp device %s on numa socket %u\n", 286ef4b04f8SRavi Kumar name, rte_socket_id()); 287ef4b04f8SRavi Kumar 2880054d84fSRavi Kumar return 0; 2890054d84fSRavi Kumar } 2900054d84fSRavi Kumar 291ef4b04f8SRavi Kumar /** Create crypto device */ 292ef4b04f8SRavi Kumar static int 293ef4b04f8SRavi Kumar cryptodev_ccp_create(const char *name, 294ef4b04f8SRavi Kumar struct rte_vdev_device *vdev, 295e0d88a39SRavi Kumar struct ccp_pmd_init_params *init_params) 296ef4b04f8SRavi Kumar { 297ef4b04f8SRavi Kumar struct rte_cryptodev *dev; 298ef4b04f8SRavi Kumar struct ccp_private *internals; 299ef4b04f8SRavi Kumar uint8_t cryptodev_cnt = 0; 300ef4b04f8SRavi Kumar 301e0d88a39SRavi Kumar if (init_params->def_p.name[0] == '\0') 302*6723c0fcSBruce Richardson strlcpy(init_params->def_p.name, name, 303*6723c0fcSBruce Richardson sizeof(init_params->def_p.name)); 304ef4b04f8SRavi Kumar 305e0d88a39SRavi Kumar dev = rte_cryptodev_pmd_create(init_params->def_p.name, 306ef4b04f8SRavi Kumar &vdev->device, 307e0d88a39SRavi Kumar &init_params->def_p); 308ef4b04f8SRavi Kumar if (dev == NULL) { 309ef4b04f8SRavi Kumar CCP_LOG_ERR("failed to create cryptodev vdev"); 310ef4b04f8SRavi Kumar goto init_error; 311ef4b04f8SRavi Kumar } 312ef4b04f8SRavi Kumar 313ef4b04f8SRavi Kumar cryptodev_cnt = ccp_probe_devices(ccp_pci_id); 314ef4b04f8SRavi Kumar 315ef4b04f8SRavi Kumar if (cryptodev_cnt == 0) { 316ef4b04f8SRavi Kumar CCP_LOG_ERR("failed to detect CCP crypto device"); 317ef4b04f8SRavi Kumar goto init_error; 318ef4b04f8SRavi Kumar } 319ef4b04f8SRavi Kumar 320ef4b04f8SRavi Kumar printf("CCP : Crypto device count = %d\n", cryptodev_cnt); 321ef4b04f8SRavi Kumar dev->driver_id = ccp_cryptodev_driver_id; 322ef4b04f8SRavi Kumar 323ef4b04f8SRavi Kumar /* register rx/tx burst functions for data path */ 324ef4b04f8SRavi Kumar dev->dev_ops = ccp_pmd_ops; 325ef4b04f8SRavi Kumar dev->enqueue_burst = ccp_pmd_enqueue_burst; 326ef4b04f8SRavi Kumar dev->dequeue_burst = ccp_pmd_dequeue_burst; 327ef4b04f8SRavi Kumar 328ef4b04f8SRavi Kumar dev->feature_flags = RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO | 329ef4b04f8SRavi Kumar RTE_CRYPTODEV_FF_HW_ACCELERATED | 330ef4b04f8SRavi Kumar RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING; 331ef4b04f8SRavi Kumar 332ef4b04f8SRavi Kumar internals = dev->data->dev_private; 333ef4b04f8SRavi Kumar 334e0d88a39SRavi Kumar internals->max_nb_qpairs = init_params->def_p.max_nb_queue_pairs; 335e0d88a39SRavi Kumar internals->auth_opt = init_params->auth_opt; 336ef4b04f8SRavi Kumar internals->crypto_num_dev = cryptodev_cnt; 337ef4b04f8SRavi Kumar 338ef4b04f8SRavi Kumar return 0; 339ef4b04f8SRavi Kumar 340ef4b04f8SRavi Kumar init_error: 341ef4b04f8SRavi Kumar CCP_LOG_ERR("driver %s: %s() failed", 342e0d88a39SRavi Kumar init_params->def_p.name, __func__); 343ef4b04f8SRavi Kumar cryptodev_ccp_remove(vdev); 344ef4b04f8SRavi Kumar 345ef4b04f8SRavi Kumar return -EFAULT; 346ef4b04f8SRavi Kumar } 347ef4b04f8SRavi Kumar 3480054d84fSRavi Kumar /** Probe ccp pmd */ 3490054d84fSRavi Kumar static int 350ef4b04f8SRavi Kumar cryptodev_ccp_probe(struct rte_vdev_device *vdev) 3510054d84fSRavi Kumar { 352ef4b04f8SRavi Kumar int rc = 0; 353ef4b04f8SRavi Kumar const char *name; 354e0d88a39SRavi Kumar struct ccp_pmd_init_params init_params = { 355e0d88a39SRavi Kumar .def_p = { 356ef4b04f8SRavi Kumar "", 357ef4b04f8SRavi Kumar sizeof(struct ccp_private), 358ef4b04f8SRavi Kumar rte_socket_id(), 359e1fc5b76SPablo de Lara CCP_PMD_MAX_QUEUE_PAIRS 360e0d88a39SRavi Kumar }, 361e0d88a39SRavi Kumar .auth_opt = CCP_PMD_AUTH_OPT_CCP, 362ef4b04f8SRavi Kumar }; 363ef4b04f8SRavi Kumar const char *input_args; 364ef4b04f8SRavi Kumar 365ef4b04f8SRavi Kumar if (ccp_pmd_init_done) { 366ef4b04f8SRavi Kumar RTE_LOG(INFO, PMD, "CCP PMD already initialized\n"); 367ef4b04f8SRavi Kumar return -EFAULT; 368ef4b04f8SRavi Kumar } 369ef4b04f8SRavi Kumar name = rte_vdev_device_name(vdev); 370ef4b04f8SRavi Kumar if (name == NULL) 371ef4b04f8SRavi Kumar return -EINVAL; 372ef4b04f8SRavi Kumar 373ef4b04f8SRavi Kumar input_args = rte_vdev_device_args(vdev); 374e0d88a39SRavi Kumar ccp_pmd_parse_input_args(&init_params, input_args); 375e0d88a39SRavi Kumar init_params.def_p.max_nb_queue_pairs = CCP_PMD_MAX_QUEUE_PAIRS; 376ef4b04f8SRavi Kumar 377ef4b04f8SRavi Kumar RTE_LOG(INFO, PMD, "Initialising %s on NUMA node %d\n", name, 378e0d88a39SRavi Kumar init_params.def_p.socket_id); 379ef4b04f8SRavi Kumar RTE_LOG(INFO, PMD, "Max number of queue pairs = %d\n", 380e0d88a39SRavi Kumar init_params.def_p.max_nb_queue_pairs); 381e0d88a39SRavi Kumar RTE_LOG(INFO, PMD, "Authentication offload to %s\n", 382e0d88a39SRavi Kumar ((init_params.auth_opt == 0) ? "CCP" : "CPU")); 383ef4b04f8SRavi Kumar 384ef4b04f8SRavi Kumar rc = cryptodev_ccp_create(name, vdev, &init_params); 385ef4b04f8SRavi Kumar if (rc) 386ef4b04f8SRavi Kumar return rc; 387ef4b04f8SRavi Kumar ccp_pmd_init_done = 1; 3880054d84fSRavi Kumar return 0; 3890054d84fSRavi Kumar } 3900054d84fSRavi Kumar 3910054d84fSRavi Kumar static struct rte_vdev_driver cryptodev_ccp_pmd_drv = { 3920054d84fSRavi Kumar .probe = cryptodev_ccp_probe, 3930054d84fSRavi Kumar .remove = cryptodev_ccp_remove 3940054d84fSRavi Kumar }; 3950054d84fSRavi Kumar 3960054d84fSRavi Kumar static struct cryptodev_driver ccp_crypto_drv; 3970054d84fSRavi Kumar 3980054d84fSRavi Kumar RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_CCP_PMD, cryptodev_ccp_pmd_drv); 3990054d84fSRavi Kumar RTE_PMD_REGISTER_PARAM_STRING(CRYPTODEV_NAME_CCP_PMD, 400e0d88a39SRavi Kumar "max_nb_queue_pairs=<int> " 401e0d88a39SRavi Kumar "socket_id=<int> " 402e0d88a39SRavi Kumar "ccp_auth_opt=<int>"); 4030054d84fSRavi Kumar RTE_PMD_REGISTER_CRYPTO_DRIVER(ccp_crypto_drv, cryptodev_ccp_pmd_drv.driver, 4040054d84fSRavi Kumar ccp_cryptodev_driver_id); 405