[EXT] [PATCH resend v5 1/6] crypto/uadk: introduce uadk crypto driver

Akhil Goyal gakhil at marvell.com
Tue Oct 25 16:08:05 CEST 2022


> diff --git a/doc/guides/cryptodevs/uadk.rst b/doc/guides/cryptodevs/uadk.rst
> new file mode 100644
> index 0000000000..1dfaab73c8
> --- /dev/null
> +++ b/doc/guides/cryptodevs/uadk.rst
> @@ -0,0 +1,73 @@
> +..  SPDX-License-Identifier: BSD-3-Clause
> +    Copyright 2022-2023 Huawei Technologies Co.,Ltd. All rights reserved.
> +    Copyright 2022-2023 Linaro ltd.
> +
> +UADK Crypto Poll Mode Driver
> +=======================================================

The number of '=' are more than the above heading.

> +
> +UADK crypto PMD provides poll mode driver
> +All cryptographic operations are using UADK crypto API.
> +Hardware accelerators using UADK are supposed to be supported.

The above description does not make sense.
Please rewrite and add more information if possible.

> +
> +
> +Features
> +--------
> +
> +UADK crypto PMD has support for:
> +
> +
> +Test steps
> +----------
> +
> +   .. code-block:: console
> +
> +	1. Build UADK
> +	$ git clone https://github.com/Linaro/uadk
> +	$ cd uadk
> +	$ mkdir build
> +	$ ./autogen.sh
> +	$ ./configure --prefix=$PWD/build
> +	$ make
> +	$ make install
> +
> +	* Without --prefix, UADK will be installed to /usr/local/lib by default
> +	* If get error:"cannot find -lnuma", please install the libnuma-dev
> +
> +	2. Run pkg-config libwd to ensure env is setup correctly
> +	$ export PKG_CONFIG_PATH=$PWD/build/lib/pkgconfig
> +	$ pkg-config libwd --cflags --libs
> +	-I/usr/local/include -L/usr/local/lib -lwd
> +
> +	* export PKG_CONFIG_PATH is required on demand,
> +	  not needed if UADK is installed to /usr/local/lib
> +
> +	3. Build DPDK
> +	$ cd dpdk
> +	$ mkdir build
> +	$ meson build (--reconfigure)
> +	$ cd build
> +	$ ninja
> +	$ sudo ninja install
> +
> +	4. Prepare hugepage for dpdk
> +	$ echo 1024 >
> /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
> +	$ echo 1024 >
> /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
> +	$ echo 1024 >
> /sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages
> +	$ echo 1024 >
> /sys/devices/system/node/node3/hugepages/hugepages-2048kB/nr_hugepages
> +	$ mkdir -p /mnt/huge_2mb
> +	$ mount -t hugetlbfs none /mnt/huge_2mb -o pagesize=2MB
> +
> +	5. Run test app
> +
> +Dependency
> +----------
> +
> +UADK crypto PMD relies on UADK library [1]
> +
> +UADK is a framework for user applications to access hardware accelerators.
> +UADK relies on IOMMU SVA (Shared Virtual Address) feature, which share
> +the same page table between IOMMU and MMU.
> +As a result, user application can directly use virtual address for device dma,
> +which enhances the performance as well as easy usability.

s/dma/DMA

> diff --git a/drivers/crypto/uadk/uadk_crypto_pmd.c
> b/drivers/crypto/uadk/uadk_crypto_pmd.c
> new file mode 100644
> index 0000000000..2ae2b33bd7
> --- /dev/null
> +++ b/drivers/crypto/uadk/uadk_crypto_pmd.c
> @@ -0,0 +1,121 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright 2022-2023 Huawei Technologies Co.,Ltd. All rights reserved.
> + * Copyright 2022-2023 Linaro ltd.
> + */
> +
> +#include <bus_vdev_driver.h>
> +#include <cryptodev_pmd.h>
> +#include <rte_bus_vdev.h>
> +#include <stdlib.h>
> +#include <uadk/wd_cipher.h>
> +#include <uadk/wd_digest.h>
> +#include <uadk/wd_sched.h>

Separate out different type of headers with a blank line.
#include <stdlib.h>

#include <rte_bus_vdev.h>

#include <bus_vdev_driver.h>
#include <cryptodev_pmd.h>

#include <uadk/wd_cipher.h>
#include <uadk/wd_digest.h>
#include <uadk/wd_sched.h>

> +
> +enum uadk_crypto_version {
> +	UADK_CRYPTO_V2,
> +	UADK_CRYPTO_V3,
> +};
> +
> +struct uadk_crypto_priv {
> +	enum uadk_crypto_version version;
> +} __rte_cache_aligned;
> +
> +static uint8_t uadk_cryptodev_driver_id;
> +
> +RTE_LOG_REGISTER_DEFAULT(uadk_crypto_logtype, INFO);
> +
> +#define UADK_LOG(level, fmt, ...)  \
> +	rte_log(RTE_LOG_ ## level, uadk_crypto_logtype,  \
> +		"%s() line %u: " fmt "\n", __func__, __LINE__,  \
> +		## __VA_ARGS__)
> +

Is it not good to define the above macros and structs in header file?

> +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,
> +		.sym_session_get_size	= NULL,
> +		.sym_session_configure	= NULL,
> +		.sym_session_clear	= NULL,
> +};
> +
> +static int
> +uadk_cryptodev_probe(struct rte_vdev_device *vdev)
> +{
> +	struct rte_cryptodev_pmd_init_params init_params = {
> +		.name = "",
> +		.private_data_size = sizeof(struct uadk_crypto_priv),
> +		.max_nb_queue_pairs =
> +
> 	RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS,
> +	};
> +	enum uadk_crypto_version version = UADK_CRYPTO_V2;
> +	struct uadk_crypto_priv *priv;
> +	struct rte_cryptodev *dev;
> +	struct uacce_dev *udev;
> +	const char *name;
> +
> +	udev = wd_get_accel_dev("cipher");
> +	if (!udev)
> +		return -ENODEV;
> +
> +	if (!strcmp(udev->api, "hisi_qm_v2"))
> +		version = UADK_CRYPTO_V2;
> +
> +	free(udev);
> +
> +	name = rte_vdev_device_name(vdev);
> +	if (name == NULL)
> +		return -EINVAL;
> +
> +	dev = rte_cryptodev_pmd_create(name, &vdev->device, &init_params);
> +	if (dev == NULL) {
> +		UADK_LOG(ERR, "driver %s: create failed", init_params.name);
> +		return -ENODEV;
> +	}
> +
> +	dev->dev_ops = &uadk_crypto_pmd_ops;
> +	dev->driver_id = uadk_cryptodev_driver_id;
> +	dev->dequeue_burst = NULL;
> +	dev->enqueue_burst = NULL;
> +	dev->feature_flags = RTE_CRYPTODEV_FF_HW_ACCELERATED;
> +	priv = dev->data->dev_private;
> +	priv->version = version;
> +
> +	rte_cryptodev_pmd_probing_finish(dev);
> +
> +	return 0;
> +}
> +
> +static int
> +uadk_cryptodev_remove(struct rte_vdev_device *vdev)
> +{
> +	struct rte_cryptodev *cryptodev;
> +	const char *name;
> +
> +	name = rte_vdev_device_name(vdev);
> +	if (name == NULL)
> +		return -EINVAL;
> +
> +	cryptodev = rte_cryptodev_pmd_get_named_dev(name);
> +	if (cryptodev == NULL)
> +		return -ENODEV;
> +
> +	return rte_cryptodev_pmd_destroy(cryptodev);
> +}
> +
> +static struct rte_vdev_driver uadk_crypto_pmd = {
> +	.probe       = uadk_cryptodev_probe,
> +	.remove      = uadk_cryptodev_remove,
> +};
> +
> +static struct cryptodev_driver uadk_crypto_drv;
> +
> +#define UADK_CRYPTO_DRIVER_NAME crypto_uadk
> +RTE_PMD_REGISTER_VDEV(UADK_CRYPTO_DRIVER_NAME,
> uadk_crypto_pmd);
> +RTE_PMD_REGISTER_CRYPTO_DRIVER(uadk_crypto_drv,
> uadk_crypto_pmd.driver,
> +			       uadk_cryptodev_driver_id);
> diff --git a/drivers/crypto/uadk/version.map b/drivers/crypto/uadk/version.map
> new file mode 100644
> index 0000000000..c2e0723b4c
> --- /dev/null
> +++ b/drivers/crypto/uadk/version.map
> @@ -0,0 +1,3 @@
> +DPDK_22 {
> +	local: *;
> +};

This should be DPDK_23

> --
> 2.38.1



More information about the dev mailing list