> -----Original Message-----
> From: Kusztal, ArkadiuszX <arkadiuszx.kusz...@intel.com>
> Sent: Thursday, October 13, 2022 3:03 PM
> To: dev@dpdk.org
> Cc: gak...@marvell.com; Ji, Kai <kai...@intel.com>; Kusztal, ArkadiuszX
> <arkadiuszx.kusz...@intel.com>
> Subject: [PATCH v2] common/qat: read hw slice configuration
> 
> Read slice configuration of QAT capabilities.
> This will allow to recognize if specific hw function is available on 
> particular
> device.
> 
> Signed-off-by: Arek Kusztal <arkadiuszx.kusz...@intel.com>

[KJ] any documentation update needed for qat.rst ?

> ---
>  drivers/common/qat/dev/qat_dev_gen1.c        |  8 +++
>  drivers/common/qat/dev/qat_dev_gen2.c        |  8 +++
>  drivers/common/qat/dev/qat_dev_gen3.c        | 14 +++++
>  drivers/common/qat/dev/qat_dev_gen4.c        |  8 +++
>  drivers/common/qat/qat_adf/icp_qat_hw.h      | 18 +++++++
>  drivers/common/qat/qat_device.c              | 10 +++-
>  drivers/common/qat/qat_device.h              |  5 ++
>  drivers/crypto/qat/dev/qat_asym_pmd_gen1.c   | 42 ++++++++++++---
>  drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c | 41 +++++++++++---
> drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c | 80
> +++++++++++++++++++++++++---
> drivers/crypto/qat/dev/qat_crypto_pmd_gen4.c | 41 +++++++++++---
> drivers/crypto/qat/dev/qat_crypto_pmd_gens.h |  5 +-
>  drivers/crypto/qat/dev/qat_sym_pmd_gen1.c    | 41 +++++++++++---
>  drivers/crypto/qat/qat_asym.c                | 49 ++++++++---------
>  drivers/crypto/qat/qat_crypto.h              |  4 +-
>  drivers/crypto/qat/qat_sym.c                 | 38 +++++--------
>  16 files changed, 324 insertions(+), 88 deletions(-)
> 
> diff --git a/drivers/common/qat/dev/qat_dev_gen1.c
> b/drivers/common/qat/dev/qat_dev_gen1.c
> index c34ae5a51c..0be5b9077c 100644
> --- a/drivers/common/qat/dev/qat_dev_gen1.c
> +++ b/drivers/common/qat/dev/qat_dev_gen1.c
> @@ -241,12 +241,20 @@ qat_dev_get_extra_size_gen1(void)
>       return 0;
>  }
> 
> +static int
> +qat_get_slice_map_gen1(uint16_t *map __rte_unused,
> +     const struct rte_pci_device *pci_dev __rte_unused) {
> +     return 0;
> +}
> +
>  static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen1 = {
>       .qat_dev_reset_ring_pairs = qat_reset_ring_pairs_gen1,
>       .qat_dev_get_transport_bar = qat_dev_get_transport_bar_gen1,
>       .qat_dev_get_misc_bar = qat_dev_get_misc_bar_gen1,
>       .qat_dev_read_config = qat_dev_read_config_gen1,
>       .qat_dev_get_extra_size = qat_dev_get_extra_size_gen1,
> +     .qat_get_slice_map = qat_get_slice_map_gen1,
[KJ] qat_dev_get_slice_map ?
>  };
> 
>  RTE_INIT(qat_dev_gen_gen1_init)
> diff --git a/drivers/common/qat/dev/qat_dev_gen2.c
> b/drivers/common/qat/dev/qat_dev_gen2.c
> index f077fe9eef..cb60fe5309 100644
> --- a/drivers/common/qat/dev/qat_dev_gen2.c
> +++ b/drivers/common/qat/dev/qat_dev_gen2.c
> @@ -21,12 +21,20 @@ static struct qat_qp_hw_spec_funcs
> qat_qp_hw_spec_gen2 = {
>       .qat_qp_get_hw_data = qat_qp_get_hw_data_gen1,  };
> 
> +static int
> +qat_get_slice_map_gen2(uint16_t *map __rte_unused,
> +     const struct rte_pci_device *pci_dev __rte_unused) {
> +     return 0;
> +}
> +
>  static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen2 = {
>       .qat_dev_reset_ring_pairs = qat_reset_ring_pairs_gen1,
>       .qat_dev_get_transport_bar = qat_dev_get_transport_bar_gen1,
>       .qat_dev_get_misc_bar = qat_dev_get_misc_bar_gen1,
>       .qat_dev_read_config = qat_dev_read_config_gen1,
>       .qat_dev_get_extra_size = qat_dev_get_extra_size_gen1,
> +     .qat_get_slice_map = qat_get_slice_map_gen2,
>  };
> 
>  RTE_INIT(qat_dev_gen_gen2_init)
> diff --git a/drivers/common/qat/dev/qat_dev_gen3.c
> b/drivers/common/qat/dev/qat_dev_gen3.c
> index de3fa17fa9..681c946ede 100644
> --- a/drivers/common/qat/dev/qat_dev_gen3.c
> +++ b/drivers/common/qat/dev/qat_dev_gen3.c
> @@ -5,6 +5,7 @@
>  #include "qat_device.h"
>  #include "qat_qp.h"
>  #include "adf_transport_access_macros.h"
> +#include "icp_qat_hw.h"
[KJ] consider move this header file in qat_device.h

>  #include "qat_dev_gens.h"
> 
<snip>

> diff --git a/drivers/common/qat/qat_device.h
> b/drivers/common/qat/qat_device.h index d1512f3b89..175b801a6c 100644
> --- a/drivers/common/qat/qat_device.h
> +++ b/drivers/common/qat/qat_device.h
> @@ -20,6 +20,8 @@
>  #define SYM_ENQ_THRESHOLD_NAME "qat_sym_enq_threshold"
>  #define ASYM_ENQ_THRESHOLD_NAME "qat_asym_enq_threshold"
>  #define COMP_ENQ_THRESHOLD_NAME "qat_comp_enq_threshold"
> +#define QAT_CMD_SLICE_MAP "qat_slice_disable"
[KJ] consider to rename the command to match the #define name 

> +#define QAT_CMD_SLICE_MAP_POS        4
>  #define MAX_QP_THRESHOLD_SIZE        32
> 
<snip>

> 
>  extern struct qat_dev_hw_spec_funcs *qat_dev_hw_spec[]; diff --git
> a/drivers/crypto/qat/dev/qat_asym_pmd_gen1.c
> b/drivers/crypto/qat/dev/qat_asym_pmd_gen1.c
> index 4499fdaf2d..67b1892c32 100644
> --- a/drivers/crypto/qat/dev/qat_asym_pmd_gen1.c
> +++ b/drivers/crypto/qat/dev/qat_asym_pmd_gen1.c
> @@ -41,14 +41,42 @@ static struct rte_cryptodev_capabilities
> qat_asym_crypto_caps_gen1[] = {
>       RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
>  };
> 
> -
> -struct qat_capabilities_info
> -qat_asym_crypto_cap_get_gen1(struct qat_pci_device *qat_dev
> __rte_unused)
> +int
> +qat_asym_crypto_cap_get_gen1(struct qat_cryptodev_private *internals,
> +                     const char *capa_memz_name,
> +                     const uint16_t __rte_unused slice_map)
>  {
> -     struct qat_capabilities_info capa_info;
> -     capa_info.data = qat_asym_crypto_caps_gen1;
> -     capa_info.size = sizeof(qat_asym_crypto_caps_gen1);
> -     return capa_info;
> +     const uint32_t size = sizeof(qat_asym_crypto_caps_gen1);
> +     uint32_t i;
> +
> +     internals->capa_mz = rte_memzone_lookup(capa_memz_name);
> +     if (internals->capa_mz == NULL) {
> +             internals->capa_mz =
> rte_memzone_reserve(capa_memz_name,
> +                             size, rte_socket_id(), 0);
> +             if (internals->capa_mz == NULL) {
> +                     QAT_LOG(DEBUG,
> +                             "Error allocating memzone for capabilities");
> +                     return -1;
[KJ] ENOMEM ? 
> +             }
> +     }
> +
> +     struct rte_cryptodev_capabilities *addr =
> +                     (struct rte_cryptodev_capabilities *)
> +                             internals->capa_mz->addr;
> +     const struct rte_cryptodev_capabilities *capabilities =
> +             qat_asym_crypto_caps_gen1;
> +     const uint32_t capa_num =
> +             size / sizeof(struct rte_cryptodev_capabilities);
> +     uint32_t curr_capa = 0;
> +
> +     for (i = 0; i < capa_num; i++) {
> +             memcpy(addr + curr_capa, capabilities + i,
> +                     sizeof(struct rte_cryptodev_capabilities));
> +             curr_capa++;
> +     }
> +     internals->qat_dev_capabilities = internals->capa_mz->addr;
> +
> +     return 0;
>  }
> 
>  uint64_t
> diff --git a/drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c
> b/drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c
> index 0c64c1e43f..3d01fa7770 100644
> --- a/drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c
> +++ b/drivers/crypto/qat/dev/qat_crypto_pmd_gen2.c
> @@ -275,13 +275,42 @@ struct rte_cryptodev_ops
> qat_sym_crypto_ops_gen2 = {
>       .sym_configure_raw_dp_ctx = qat_sym_configure_dp_ctx,  };
> 
> -static struct qat_capabilities_info
> -qat_sym_crypto_cap_get_gen2(struct qat_pci_device *qat_dev
> __rte_unused)
> +static int
> +qat_sym_crypto_cap_get_gen2(struct qat_cryptodev_private *internals,
> +                     const char *capa_memz_name,
> +                     const uint16_t __rte_unused slice_map)
>  {
> -     struct qat_capabilities_info capa_info;
> -     capa_info.data = qat_sym_crypto_caps_gen2;
> -     capa_info.size = sizeof(qat_sym_crypto_caps_gen2);
> -     return capa_info;
> +     const uint32_t size = sizeof(qat_sym_crypto_caps_gen2);
> +     uint32_t i;
> +
> +     internals->capa_mz = rte_memzone_lookup(capa_memz_name);
> +     if (internals->capa_mz == NULL) {
> +             internals->capa_mz =
> rte_memzone_reserve(capa_memz_name,
> +                             size, rte_socket_id(), 0);
> +             if (internals->capa_mz == NULL) {
> +                     QAT_LOG(DEBUG,
> +                             "Error allocating memzone for capabilities");
> +                     return -1;
[KJ] ENOMEM ?
> +             }
> +     }
> +
> +     struct rte_cryptodev_capabilities *addr =
> +                     (struct rte_cryptodev_capabilities *)
> +                             internals->capa_mz->addr;
> +     const struct rte_cryptodev_capabilities *capabilities =
> +             qat_sym_crypto_caps_gen2;
> +     const uint32_t capa_num =
> +             size / sizeof(struct rte_cryptodev_capabilities);
> +     uint32_t curr_capa = 0;
> +
> +     for (i = 0; i < capa_num; i++) {
> +             memcpy(addr + curr_capa, capabilities + i,
> +                     sizeof(struct rte_cryptodev_capabilities));
> +             curr_capa++;
> +     }
> +     internals->qat_dev_capabilities = internals->capa_mz->addr;
> +
> +     return 0;
>  }
> 
>  RTE_INIT(qat_sym_crypto_gen2_init)
> diff --git a/drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c
> b/drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c
> index d1285cdbd4..7f00f6097d 100644
> --- a/drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c
> +++ b/drivers/crypto/qat/dev/qat_crypto_pmd_gen3.c
> @@ -143,13 +143,81 @@ static struct rte_cryptodev_capabilities
<snip>

> +
> +static int
> +qat_sym_crypto_cap_get_gen3(struct qat_cryptodev_private *internals,
> +                     const char *capa_memz_name, const uint16_t
> slice_map) {
> +     const uint32_t size = sizeof(qat_sym_crypto_caps_gen3);
> +     uint32_t i;
> +
> +     internals->capa_mz = rte_memzone_lookup(capa_memz_name);
> +     if (internals->capa_mz == NULL) {
> +             internals->capa_mz =
> rte_memzone_reserve(capa_memz_name,
> +                             size, rte_socket_id(), 0);
> +             if (internals->capa_mz == NULL) {
> +                     QAT_LOG(DEBUG,
> +                             "Error allocating memzone for capabilities");
> +                     return -1;
[KJ] ENOMEM ?

> +             }
> +     }
> +
> +     struct rte_cryptodev_capabilities *addr =
> +                     (struct rte_cryptodev_capabilities *)
> +                             internals->capa_mz->addr;
> +     const struct rte_cryptodev_capabilities *capabilities =
> +             qat_sym_crypto_caps_gen3;
> +     const uint32_t capa_num =
> +             size / sizeof(struct rte_cryptodev_capabilities);
> +     uint32_t curr_capa = 0;
> +
> +     for (i = 0; i < capa_num; i++) {
[KJ] can you add short comments why we need check SM4 & SM3 here ?

<snip>
> 
>  uint64_t
> diff --git a/drivers/crypto/qat/qat_asym.c b/drivers/crypto/qat/qat_asym.c
> index 19931791c4..486affb157 100644
> --- a/drivers/crypto/qat/qat_asym.c
> +++ b/drivers/crypto/qat/qat_asym.c
<snip>

> 
> +     if (slice_map & ICP_ACCEL_MASK_PKE_SLICE) {
> +             QAT_LOG(ERR, "Device %s does not support PKE slice",
> +                             name);
> +             rte_cryptodev_pmd_destroy(cryptodev);
> +             memset(&qat_dev_instance->asym_rte_dev, 0,
> +                     sizeof(qat_dev_instance->asym_rte_dev));
> +             return -1;
[KJ] EINVAL?
> +     }
> +
> +     if (gen_dev_ops->get_capabilities(internals,
> +                     capa_memz_name, slice_map) < 0) {
> +             QAT_LOG(ERR,
> +                     "Device cannot obtain capabilties, destroying PMD
> for %s",
> +                     name);
> +             rte_cryptodev_pmd_destroy(cryptodev);
> +             memset(&qat_dev_instance->asym_rte_dev, 0,
> +                     sizeof(qat_dev_instance->asym_rte_dev));
> +             return -1;
[KJ] EFAULT?
> +     }
> +
>       qat_pci_dev->asym_dev = internals;
>       internals->service_type = QAT_SERVICE_ASYMMETRIC;
>       QAT_LOG(DEBUG, "Created QAT ASYM device %s as cryptodev
> instance %d", diff --git a/drivers/crypto/qat/qat_crypto.h
> b/drivers/crypto/qat/qat_crypto.h index cf386d0ed0..6fe1326c51 100644
> --- a/drivers/crypto/qat/qat_crypto.h
> +++ b/drivers/crypto/qat/qat_crypto.h
> @@ -44,8 +44,8 @@ struct qat_capabilities_info {
>       uint64_t size;
>  };
> 
> -typedef struct qat_capabilities_info (*get_capabilities_info_t)
> -                     (struct qat_pci_device *qat_dev);
> +typedef int (*get_capabilities_info_t)(struct qat_cryptodev_private
> *internals,
> +                     const char *capa_memz_name, uint16_t slice_map);
> 
>  typedef uint64_t (*get_feature_flags_t)(struct qat_pci_device *qat_dev);
> 
> diff --git a/drivers/crypto/qat/qat_sym.c b/drivers/crypto/qat/qat_sym.c
> index 54c3d59a51..79f8a0b74f 100644
> --- a/drivers/crypto/qat/qat_sym.c
> +++ b/drivers/crypto/qat/qat_sym.c
> @@ -182,6 +182,7 @@ 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, ret = 0;
> +     uint16_t slice_map = 0;
>       struct qat_device_info *qat_dev_instance =
>                       &qat_pci_devs[qat_pci_dev->qat_dev_id];
>       struct rte_cryptodev_pmd_init_params init_params = { @@ -193,11
> +194,8 @@ qat_sym_dev_create(struct qat_pci_device *qat_pci_dev,
>       char capa_memz_name[RTE_CRYPTODEV_NAME_MAX_LEN];
>       struct rte_cryptodev *cryptodev;
>       struct qat_cryptodev_private *internals;
> -     struct qat_capabilities_info capa_info;
> -     const struct rte_cryptodev_capabilities *capabilities;
>       const struct qat_crypto_gen_dev_ops *gen_dev_ops =
>               &qat_sym_gen_dev_ops[qat_pci_dev->qat_dev_gen];
> -     uint64_t capa_size;
> 
>       snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s_%s",
>                       qat_pci_dev->name, "sym");
> @@ -277,37 +275,25 @@ qat_sym_dev_create(struct qat_pci_device
> *qat_pci_dev,
> 
>       internals->dev_id = cryptodev->data->dev_id;
> 
> -     capa_info = gen_dev_ops->get_capabilities(qat_pci_dev);
> -     capabilities = capa_info.data;
> -     capa_size = capa_info.size;
> -
> -     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;
> +     while (qat_dev_cmd_param[i].name != NULL) {
>               if (!strcmp(qat_dev_cmd_param[i].name,
> SYM_ENQ_THRESHOLD_NAME))
>                       internals->min_enq_burst_threshold =
>                                       qat_dev_cmd_param[i].val;
>               if (!strcmp(qat_dev_cmd_param[i].name,
> QAT_IPSEC_MB_LIB))
>                       qat_ipsec_mb_lib = qat_dev_cmd_param[i].val;
> +             if (!strcmp(qat_dev_cmd_param[i].name,
> QAT_CMD_SLICE_MAP))
> +                     slice_map = qat_dev_cmd_param[i].val;
>               i++;
>       }
> 
> +     if (gen_dev_ops->get_capabilities(internals,
> +                     capa_memz_name, slice_map) < 0) {
> +             QAT_LOG(ERR,
> +                     "Device cannot obtain capabilties, destroying PMD
> for %s",
> +                     name);
> +             ret = -1;
> +             goto error;
> +     }
>       internals->service_type = QAT_SERVICE_SYMMETRIC;
>       qat_pci_dev->sym_dev = internals;
>       QAT_LOG(DEBUG, "Created QAT SYM device %s as cryptodev
> instance %d",
> --
> 2.13.6


Reply via email to