static int cryptodev_scheduler_create(const char *name, struct scheduler_init_params *init_params) { struct rte_cryptodev *dev; struct scheduler_ctx *sched_ctx; uint32_t i; int ret; if (init_params->def_p.name[0] == '\0') snprintf(init_params->def_p.name, sizeof(init_params->def_p.name), "%s", name); dev = rte_cryptodev_pmd_virtual_dev_init(init_params->def_p.name, sizeof(struct scheduler_ctx), init_params->def_p.socket_id); if (dev == NULL) { CS_LOG_ERR("driver %s: failed to create cryptodev vdev", name); return -EFAULT; } dev->dev_type = RTE_CRYPTODEV_SCHEDULER_PMD; dev->dev_ops = rte_crypto_scheduler_pmd_ops; sched_ctx = dev->data->dev_private; sched_ctx->max_nb_queue_pairs = init_params->def_p.max_nb_queue_pairs; if (init_params->mode > CDEV_SCHED_MODE_USERDEFINED && init_params->mode < CDEV_SCHED_MODE_COUNT) { ret = rte_cryptodev_scheduler_mode_set(dev->data->dev_id, init_params->mode); if (ret < 0) { rte_cryptodev_pmd_release_device(dev); return ret; } for (i = 0; i < RTE_DIM(scheduler_mode_map); i++) { if (scheduler_mode_map[i].val != sched_ctx->mode) continue; RTE_LOG(INFO, PMD, " Scheduling mode = %s\n", scheduler_mode_map[i].name); break; } } sched_ctx->reordering_enabled = init_params->enable_ordering; for (i = 0; i < RTE_DIM(scheduler_ordering_map); i++) { if (scheduler_ordering_map[i].val != sched_ctx->reordering_enabled) continue; RTE_LOG(INFO, PMD, " Packet ordering = %s\n", scheduler_ordering_map[i].name); break; } for (i = 0; i < init_params->nb_slaves; i++) { sched_ctx->init_slave_names[sched_ctx->nb_init_slaves] = rte_zmalloc_socket( NULL, RTE_CRYPTODEV_SCHEDULER_NAME_MAX_LEN, 0, SOCKET_ID_ANY); if (!sched_ctx->init_slave_names[ sched_ctx->nb_init_slaves]) { CS_LOG_ERR("driver %s: Insufficient memory", name); return -ENOMEM; } strncpy(sched_ctx->init_slave_names[ sched_ctx->nb_init_slaves], init_params->slave_names[i], RTE_CRYPTODEV_SCHEDULER_NAME_MAX_LEN - 1); sched_ctx->nb_init_slaves++; } /* * Initialize capabilities structure as an empty structure, * in case device information is requested when no slaves are attached */ sched_ctx->capabilities = rte_zmalloc_socket(NULL, sizeof(struct rte_cryptodev_capabilities), 0, SOCKET_ID_ANY); if (!sched_ctx->capabilities) { RTE_LOG(ERR, PMD, "Not enough memory for capability " "information\n"); return -ENOMEM; } return 0; }
static int cryptodev_aesni_mb_create(const char *name, unsigned socket_id) { struct rte_cryptodev *dev; char crypto_dev_name[RTE_CRYPTODEV_NAME_MAX_LEN]; struct aesni_mb_private *internals; enum aesni_mb_vector_mode vector_mode; /* Check CPU for support for AES instruction set */ if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_AES)) { MB_LOG_ERR("AES instructions not supported by CPU"); return -EFAULT; } /* Check CPU for supported vector instruction set */ if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2)) vector_mode = RTE_AESNI_MB_AVX2; else if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX)) vector_mode = RTE_AESNI_MB_AVX; else if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_SSE4_1)) vector_mode = RTE_AESNI_MB_SSE; else { MB_LOG_ERR("Vector instructions are not supported by CPU"); return -EFAULT; } /* create a unique device name */ if (create_unique_device_name(crypto_dev_name, RTE_CRYPTODEV_NAME_MAX_LEN) != 0) { MB_LOG_ERR("failed to create unique cryptodev name"); return -EINVAL; } dev = rte_cryptodev_pmd_virtual_dev_init(crypto_dev_name, sizeof(struct aesni_mb_private), socket_id); if (dev == NULL) { MB_LOG_ERR("failed to create cryptodev vdev"); goto init_error; } dev->dev_type = RTE_CRYPTODEV_AESNI_MB_PMD; dev->dev_ops = rte_aesni_mb_pmd_ops; /* register rx/tx burst functions for data path */ dev->dequeue_burst = aesni_mb_pmd_dequeue_burst; dev->enqueue_burst = aesni_mb_pmd_enqueue_burst; /* Set vector instructions mode supported */ internals = dev->data->dev_private; internals->vector_mode = vector_mode; internals->max_nb_queue_pairs = RTE_AESNI_MB_PMD_MAX_NB_QUEUE_PAIRS; internals->max_nb_sessions = RTE_AESNI_MB_PMD_MAX_NB_SESSIONS; return dev->data->dev_id; init_error: MB_LOG_ERR("driver %s: cryptodev_aesni_create failed", name); cryptodev_aesni_mb_uninit(crypto_dev_name); return -EFAULT; }