> -----Original Message-----
> From: Pei, Andy <andy....@intel.com>
> Sent: Friday, September 16, 2022 2:16 PM
> To: dev@dpdk.org
> Cc: Xia, Chenbo <chenbo....@intel.com>; Xu, Rosen <rosen...@intel.com>;
> Huang, Wei <wei.hu...@intel.com>; Cao, Gang <gang....@intel.com>;
> maxime.coque...@redhat.com
> Subject: [PATCH v3 3/8] vdpa/ifc: set max queues based on virtio spec
> 
> Set max_queues according to virtio HW spec.

Virtio spec

> For virtio BLK device, set max_queues to the value of "num_queues".
> "num_queues" is element of struct virtio_blk_config.

Set max_queues to the value of num_queues in struct virtio_blk_config

> For virtio NET device, read num_queues from truct ifcvf_pci_common_cfg,

truct -> struct 

> calculate "queue_pairs = (num_queues - 1) / 2" and get queue_pairs.
> Set max_queues to the value of "queue_pairs".

And say 'get the queue pair number using num_queues and set max_queues to it'.

> 
> Signed-off-by: Andy Pei <andy....@intel.com>
> Signed-off-by: Huang Wei <wei.hu...@intel.com>
> ---
>  drivers/vdpa/ifc/base/ifcvf.h |  2 +-
>  drivers/vdpa/ifc/ifcvf_vdpa.c | 19 ++++++++++++++++++-
>  2 files changed, 19 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/vdpa/ifc/base/ifcvf.h b/drivers/vdpa/ifc/base/ifcvf.h
> index d16d9ab..1e133c0 100644
> --- a/drivers/vdpa/ifc/base/ifcvf.h
> +++ b/drivers/vdpa/ifc/base/ifcvf.h
> @@ -21,7 +21,7 @@
>  #define IFCVF_SUBSYS_NET_DEVICE_ID          0x0001
>  #define IFCVF_SUBSYS_BLK_DEVICE_ID          0x0002
> 
> -#define IFCVF_MAX_QUEUES             1
> +#define IFCVF_MAX_QUEUES             32
> 
>  #ifndef VIRTIO_F_IOMMU_PLATFORM
>  #define VIRTIO_F_IOMMU_PLATFORM              33
> diff --git a/drivers/vdpa/ifc/ifcvf_vdpa.c b/drivers/vdpa/ifc/ifcvf_vdpa.c
> index 3e5ffba..376239a 100644
> --- a/drivers/vdpa/ifc/ifcvf_vdpa.c
> +++ b/drivers/vdpa/ifc/ifcvf_vdpa.c
> @@ -26,6 +26,12 @@
> 
>  #include "base/ifcvf.h"
> 
> +/*
> + * RTE_MIN() cannot be used since braced-group within expression allowed
> + * only inside a function.
> + */
> +#define MIN(v1, v2)  ((v1) < (v2) ? (v1) : (v2))
> +
>  RTE_LOG_REGISTER(ifcvf_vdpa_logtype, pmd.vdpa.ifcvf, NOTICE);
>  #define DRV_LOG(level, fmt, args...) \
>       rte_log(RTE_LOG_ ## level, ifcvf_vdpa_logtype, \
> @@ -1512,6 +1518,7 @@ struct rte_vdpa_dev_info dev_info[] = {
>       uint64_t capacity = 0;
>       uint8_t *byte;
>       uint32_t i;
> +     uint16_t queue_pairs;
> 
>       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
>               return 0;
> @@ -1559,7 +1566,6 @@ struct rte_vdpa_dev_info dev_info[] = {
>       }
> 
>       internal->configured = 0;
> -     internal->max_queues = IFCVF_MAX_QUEUES;
>       features = ifcvf_get_features(&internal->hw);
> 
>       device_id = ifcvf_pci_get_device_type(pci_dev);
> @@ -1570,6 +1576,14 @@ struct rte_vdpa_dev_info dev_info[] = {
> 
>       if (device_id == VIRTIO_ID_NET) {
>               internal->hw.device_type = IFCVF_NET;
> +             /*
> +              * ifc driver always has CTRL_VQ,

I think it's ifc _device_ has CTRL_VQ

Thanks,
Chenbo

> +              * and supports VIRTIO_NET_F_CTRL_VQ feature.
> +              */
> +             queue_pairs = (internal->hw.common_cfg->num_queues - 1) / 2;
> +             DRV_LOG(INFO, "%s support %u queue pairs", pci_dev->name,
> +                     queue_pairs);
> +             internal->max_queues = MIN(IFCVF_MAX_QUEUES, queue_pairs);
>               internal->features = features &
>                                       ~(1ULL << VIRTIO_F_IOMMU_PLATFORM);
>               internal->features |= dev_info[IFCVF_NET].features;
> @@ -1609,6 +1623,9 @@ struct rte_vdpa_dev_info dev_info[] = {
>                       internal->hw.blk_cfg->geometry.sectors);
>               DRV_LOG(DEBUG, "num_queues: 0x%08x",
>                       internal->hw.blk_cfg->num_queues);
> +
> +             internal->max_queues = MIN(IFCVF_MAX_QUEUES,
> +                     internal->hw.blk_cfg->num_queues);
>       }
> 
>       list->internal = internal;
> --
> 1.8.3.1

Reply via email to