crypto/uadk: support basic operations

Support the basic dev control operations: configure, close, start,
stop and get info, as well as queue pairs operations.

Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
Acked-by: Akhil Goyal <gakhil@marvell.com>
This commit is contained in:
Zhangfei Gao 2022-10-27 11:25:01 +08:00 committed by Akhil Goyal
parent 8c515d9680
commit 53ae139336
2 changed files with 204 additions and 9 deletions

View File

@ -17,16 +17,192 @@
static uint8_t uadk_cryptodev_driver_id;
static const struct rte_cryptodev_capabilities uadk_crypto_v2_capabilities[] = {
/* End of capabilities */
RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
};
/* Configure device */
static int
uadk_crypto_pmd_config(struct rte_cryptodev *dev __rte_unused,
struct rte_cryptodev_config *config __rte_unused)
{
return 0;
}
/* Start device */
static int
uadk_crypto_pmd_start(struct rte_cryptodev *dev __rte_unused)
{
return 0;
}
/* Stop device */
static void
uadk_crypto_pmd_stop(struct rte_cryptodev *dev __rte_unused)
{
}
/* Close device */
static int
uadk_crypto_pmd_close(struct rte_cryptodev *dev __rte_unused)
{
return 0;
}
/* Get device statistics */
static void
uadk_crypto_pmd_stats_get(struct rte_cryptodev *dev,
struct rte_cryptodev_stats *stats)
{
int qp_id;
for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
struct uadk_qp *qp = dev->data->queue_pairs[qp_id];
stats->enqueued_count += qp->qp_stats.enqueued_count;
stats->dequeued_count += qp->qp_stats.dequeued_count;
stats->enqueue_err_count += qp->qp_stats.enqueue_err_count;
stats->dequeue_err_count += qp->qp_stats.dequeue_err_count;
}
}
/* Reset device statistics */
static void
uadk_crypto_pmd_stats_reset(struct rte_cryptodev *dev __rte_unused)
{
int qp_id;
for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
struct uadk_qp *qp = dev->data->queue_pairs[qp_id];
memset(&qp->qp_stats, 0, sizeof(qp->qp_stats));
}
}
/* Get device info */
static void
uadk_crypto_pmd_info_get(struct rte_cryptodev *dev,
struct rte_cryptodev_info *dev_info)
{
struct uadk_crypto_priv *priv = dev->data->dev_private;
if (dev_info != NULL) {
dev_info->driver_id = dev->driver_id;
dev_info->driver_name = dev->device->driver->name;
dev_info->max_nb_queue_pairs = 128;
/* No limit of number of sessions */
dev_info->sym.max_nb_sessions = 0;
dev_info->feature_flags = dev->feature_flags;
if (priv->version == UADK_CRYPTO_V2)
dev_info->capabilities = uadk_crypto_v2_capabilities;
}
}
/* Release queue pair */
static int
uadk_crypto_pmd_qp_release(struct rte_cryptodev *dev, uint16_t qp_id)
{
struct uadk_qp *qp = dev->data->queue_pairs[qp_id];
if (qp) {
rte_ring_free(qp->processed_pkts);
rte_free(qp);
dev->data->queue_pairs[qp_id] = NULL;
}
return 0;
}
/* set a unique name for the queue pair based on its name, dev_id and qp_id */
static int
uadk_pmd_qp_set_unique_name(struct rte_cryptodev *dev,
struct uadk_qp *qp)
{
unsigned int n = snprintf(qp->name, sizeof(qp->name),
"uadk_crypto_pmd_%u_qp_%u",
dev->data->dev_id, qp->id);
if (n >= sizeof(qp->name))
return -EINVAL;
return 0;
}
/* Create a ring to place process packets on */
static struct rte_ring *
uadk_pmd_qp_create_processed_pkts_ring(struct uadk_qp *qp,
unsigned int ring_size, int socket_id)
{
struct rte_ring *r = qp->processed_pkts;
if (r) {
if (rte_ring_get_size(r) >= ring_size) {
UADK_LOG(INFO, "Reusing existing ring %s for processed packets",
qp->name);
return r;
}
UADK_LOG(ERR, "Unable to reuse existing ring %s for processed packets",
qp->name);
return NULL;
}
return rte_ring_create(qp->name, ring_size, socket_id,
RING_F_EXACT_SZ);
}
static int
uadk_crypto_pmd_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id,
const struct rte_cryptodev_qp_conf *qp_conf,
int socket_id)
{
struct uadk_qp *qp;
/* Free memory prior to re-allocation if needed. */
if (dev->data->queue_pairs[qp_id] != NULL)
uadk_crypto_pmd_qp_release(dev, qp_id);
/* Allocate the queue pair data structure. */
qp = rte_zmalloc_socket("uadk PMD Queue Pair", sizeof(*qp),
RTE_CACHE_LINE_SIZE, socket_id);
if (qp == NULL)
return (-ENOMEM);
qp->id = qp_id;
dev->data->queue_pairs[qp_id] = qp;
if (uadk_pmd_qp_set_unique_name(dev, qp))
goto qp_setup_cleanup;
qp->processed_pkts = uadk_pmd_qp_create_processed_pkts_ring(qp,
qp_conf->nb_descriptors, socket_id);
if (qp->processed_pkts == NULL)
goto qp_setup_cleanup;
memset(&qp->qp_stats, 0, sizeof(qp->qp_stats));
return 0;
qp_setup_cleanup:
if (qp) {
rte_free(qp);
qp = NULL;
}
return -EINVAL;
}
static struct rte_cryptodev_ops uadk_crypto_pmd_ops = {
.dev_configure = NULL,
.dev_start = NULL,
.dev_stop = NULL,
.dev_close = NULL,
.stats_get = NULL,
.stats_reset = NULL,
.dev_infos_get = NULL,
.queue_pair_setup = NULL,
.queue_pair_release = NULL,
.dev_configure = uadk_crypto_pmd_config,
.dev_start = uadk_crypto_pmd_start,
.dev_stop = uadk_crypto_pmd_stop,
.dev_close = uadk_crypto_pmd_close,
.stats_get = uadk_crypto_pmd_stats_get,
.stats_reset = uadk_crypto_pmd_stats_reset,
.dev_infos_get = uadk_crypto_pmd_info_get,
.queue_pair_setup = uadk_crypto_pmd_qp_setup,
.queue_pair_release = uadk_crypto_pmd_qp_release,
.sym_session_get_size = NULL,
.sym_session_configure = NULL,
.sym_session_clear = NULL,

View File

@ -6,6 +6,25 @@
#ifndef _UADK_CRYPTO_PMD_PRIVATE_H_
#define _UADK_CRYPTO_PMD_PRIVATE_H_
/* Maximum length for digest (SHA-512 needs 64 bytes) */
#define DIGEST_LENGTH_MAX 64
struct uadk_qp {
/* Ring for placing process packets */
struct rte_ring *processed_pkts;
/* Queue pair statistics */
struct rte_cryptodev_stats qp_stats;
/* Queue Pair Identifier */
uint16_t id;
/* Unique Queue Pair Name */
char name[RTE_CRYPTODEV_NAME_MAX_LEN];
/* Buffer used to store the digest generated
* by the driver when verifying a digest provided
* by the user (using authentication verify operation)
*/
uint8_t temp_digest[DIGEST_LENGTH_MAX];
} __rte_cache_aligned;
enum uadk_crypto_version {
UADK_CRYPTO_V2,
UADK_CRYPTO_V3,