X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fcrypto%2Fqat%2Fqat_sym_pmd.c;h=314742f5348c69865a0417caa68b79472cf60609;hb=9339a1ec6102e4e018abdc5bc844f617185c1baf;hp=bdcb42e9dbdb9b475663cfb3ad61121c976153da;hpb=9904ff684981e09019103d48af6f39d5a00ac800;p=dpdk.git diff --git a/drivers/crypto/qat/qat_sym_pmd.c b/drivers/crypto/qat/qat_sym_pmd.c index bdcb42e9db..314742f534 100644 --- a/drivers/crypto/qat/qat_sym_pmd.c +++ b/drivers/crypto/qat/qat_sym_pmd.c @@ -19,7 +19,7 @@ #define MIXED_CRYPTO_MIN_FW_VER 0x04090000 -uint8_t cryptodev_qat_driver_id; +uint8_t qat_sym_driver_id; static const struct rte_cryptodev_capabilities qat_gen1_sym_capabilities[] = { QAT_BASE_GEN1_SYM_CAPABILITIES, @@ -32,6 +32,13 @@ static const struct rte_cryptodev_capabilities qat_gen2_sym_capabilities[] = { RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() }; +static const struct rte_cryptodev_capabilities qat_gen3_sym_capabilities[] = { + QAT_BASE_GEN1_SYM_CAPABILITIES, + QAT_EXTRA_GEN2_SYM_CAPABILITIES, + QAT_EXTRA_GEN3_SYM_CAPABILITIES, + RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() +}; + #ifdef RTE_LIBRTE_SECURITY static const struct rte_cryptodev_capabilities qat_security_sym_capabilities[] = { @@ -92,7 +99,7 @@ static void qat_sym_dev_info_get(struct rte_cryptodev *dev, qat_qps_per_service(sym_hw_qps, QAT_SERVICE_SYMMETRIC); info->feature_flags = dev->feature_flags; info->capabilities = internals->qat_dev_capabilities; - info->driver_id = cryptodev_qat_driver_id; + info->driver_id = qat_sym_driver_id; /* No limit of number of sessions */ info->sym.max_nb_sessions = 0; } @@ -174,7 +181,6 @@ static int qat_sym_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id, } qat_qp_conf.hw = qp_hw_data; - qat_qp_conf.build_request = qat_sym_build_request; qat_qp_conf.cookie_size = sizeof(struct qat_sym_op_cookie); qat_qp_conf.nb_descriptors = qp_conf->nb_descriptors; qat_qp_conf.socket_id = socket_id; @@ -303,7 +309,7 @@ int qat_sym_dev_create(struct qat_pci_device *qat_pci_dev, struct qat_dev_cmd_param *qat_dev_cmd_param __rte_unused) { - int i = 0; + int i = 0, ret = 0; struct qat_device_info *qat_dev_instance = &qat_pci_devs[qat_pci_dev->qat_dev_id]; @@ -314,12 +320,30 @@ qat_sym_dev_create(struct qat_pci_device *qat_pci_dev, .private_data_size = sizeof(struct qat_sym_dev_private) }; char name[RTE_CRYPTODEV_NAME_MAX_LEN]; + char capa_memz_name[RTE_CRYPTODEV_NAME_MAX_LEN]; struct rte_cryptodev *cryptodev; struct qat_sym_dev_private *internals; - -#ifdef RTE_LIBRTE_SECURITY - struct rte_security_ctx *security_instance; -#endif + const struct rte_cryptodev_capabilities *capabilities; + uint64_t capa_size; + + /* + * All processes must use same driver id so they can share sessions. + * Store driver_id so we can validate that all processes have the same + * value, typically they have, but could differ if binaries built + * separately. + */ + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { + qat_pci_dev->qat_sym_driver_id = + qat_sym_driver_id; + } else if (rte_eal_process_type() == RTE_PROC_SECONDARY) { + if (qat_pci_dev->qat_sym_driver_id != + qat_sym_driver_id) { + QAT_LOG(ERR, + "Device %s have different driver id than corresponding device in primary process", + name); + return -(EFAULT); + } + } snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s_%s", qat_pci_dev->name, "sym"); @@ -338,7 +362,7 @@ qat_sym_dev_create(struct qat_pci_device *qat_pci_dev, return -ENODEV; qat_dev_instance->sym_rte_dev.name = cryptodev->data->name; - cryptodev->driver_id = cryptodev_qat_driver_id; + cryptodev->driver_id = qat_sym_driver_id; cryptodev->dev_ops = &crypto_qat_ops; cryptodev->enqueue_burst = qat_sym_pmd_enqueue_op_burst; @@ -352,26 +376,31 @@ qat_sym_dev_create(struct qat_pci_device *qat_pci_dev, RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT | RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT | RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT | - RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED | - RTE_CRYPTODEV_FF_SECURITY; + RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED; if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; + snprintf(capa_memz_name, RTE_CRYPTODEV_NAME_MAX_LEN, + "QAT_SYM_CAPA_GEN_%d", + qat_pci_dev->qat_dev_gen); + #ifdef RTE_LIBRTE_SECURITY + struct rte_security_ctx *security_instance; security_instance = rte_malloc("qat_sec", sizeof(struct rte_security_ctx), RTE_CACHE_LINE_SIZE); if (security_instance == NULL) { QAT_LOG(ERR, "rte_security_ctx memory alloc failed"); - rte_cryptodev_pmd_destroy(cryptodev); - return -ENOMEM; + ret = -ENOMEM; + goto error; } security_instance->device = (void *)cryptodev; security_instance->ops = &security_qat_ops; security_instance->sess_cnt = 0; cryptodev->security_ctx = security_instance; + cryptodev->feature_flags |= RTE_CRYPTODEV_FF_SECURITY; #endif internals = cryptodev->data->dev_private; @@ -380,19 +409,43 @@ qat_sym_dev_create(struct qat_pci_device *qat_pci_dev, internals->sym_dev_id = cryptodev->data->dev_id; switch (qat_pci_dev->qat_dev_gen) { case QAT_GEN1: - internals->qat_dev_capabilities = qat_gen1_sym_capabilities; + capabilities = qat_gen1_sym_capabilities; + capa_size = sizeof(qat_gen1_sym_capabilities); break; case QAT_GEN2: + capabilities = qat_gen2_sym_capabilities; + capa_size = sizeof(qat_gen2_sym_capabilities); + break; case QAT_GEN3: - internals->qat_dev_capabilities = qat_gen2_sym_capabilities; + capabilities = qat_gen3_sym_capabilities; + capa_size = sizeof(qat_gen3_sym_capabilities); break; default: QAT_LOG(DEBUG, - "QAT gen %d capabilities unknown, default to GEN2", - qat_pci_dev->qat_dev_gen); - break; + "QAT gen %d capabilities unknown", + qat_pci_dev->qat_dev_gen); + ret = -(EINVAL); + goto error; } + internals->capa_mz = rte_memzone_lookup(capa_memz_name); + if (internals->capa_mz == NULL) { + internals->capa_mz = rte_memzone_reserve(capa_memz_name, + capa_size, + rte_socket_id(), 0); + } + if (internals->capa_mz == NULL) { + QAT_LOG(DEBUG, + "Error allocating memzone for capabilities, destroying " + "PMD for %s", + name); + ret = -EFAULT; + goto error; + } + + memcpy(internals->capa_mz->addr, capabilities, capa_size); + internals->qat_dev_capabilities = internals->capa_mz->addr; + while (1) { if (qat_dev_cmd_param[i].name == NULL) break; @@ -407,6 +460,17 @@ qat_sym_dev_create(struct qat_pci_device *qat_pci_dev, cryptodev->data->name, internals->sym_dev_id); return 0; + +error: +#ifdef RTE_LIBRTE_SECURITY + rte_free(cryptodev->security_ctx); + cryptodev->security_ctx = NULL; +#endif + rte_cryptodev_pmd_destroy(cryptodev); + memset(&qat_dev_instance->sym_rte_dev, 0, + sizeof(qat_dev_instance->sym_rte_dev)); + + return ret; } int @@ -418,11 +482,14 @@ qat_sym_dev_destroy(struct qat_pci_device *qat_pci_dev) return -ENODEV; if (qat_pci_dev->sym_dev == NULL) return 0; + if (rte_eal_process_type() == RTE_PROC_PRIMARY) + rte_memzone_free(qat_pci_dev->sym_dev->capa_mz); /* free crypto device */ cryptodev = rte_cryptodev_pmd_get_dev(qat_pci_dev->sym_dev->sym_dev_id); #ifdef RTE_LIBRTE_SECURITY rte_free(cryptodev->security_ctx); + cryptodev->security_ctx = NULL; #endif rte_cryptodev_pmd_destroy(cryptodev); qat_pci_devs[qat_pci_dev->qat_dev_id].sym_rte_dev.name = NULL; @@ -434,4 +501,4 @@ qat_sym_dev_destroy(struct qat_pci_device *qat_pci_dev) static struct cryptodev_driver qat_crypto_drv; RTE_PMD_REGISTER_CRYPTO_DRIVER(qat_crypto_drv, cryptodev_qat_sym_driver, - cryptodev_qat_driver_id); + qat_sym_driver_id);