[dpdk-dev] ethdev: The users could get device types now

Message ID 1411874836-3274-1-git-send-email-hengx.ding@intel.com (mailing list archive)
State Rejected, archived
Headers

Commit Message

Heng Ding Sept. 28, 2014, 3:27 a.m. UTC
  As different PMDs support different features, application may want
to know the NIC type of a port, then decide how to use that port.
Add a new field in struct rte_eth_dev, users are able to get
device type now.

Signed-off-by: Ding Heng <hengx.ding@intel.com>
---
 lib/librte_ether/rte_ethdev.c | 32 ++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_ethdev.h | 20 ++++++++++++++++++++
 2 files changed, 52 insertions(+)
  

Comments

Zhang, Helin Sept. 28, 2014, 3:50 a.m. UTC | #1
Acked-by: Helin Zhang <helin.zhang@intel.com>

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Ding Heng
> Sent: Sunday, September 28, 2014 11:27 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] ethdev: The users could get device types now
> 
> As different PMDs support different features, application may want to know
> the NIC type of a port, then decide how to use that port.
> Add a new field in struct rte_eth_dev, users are able to get device type now.
> 
> Signed-off-by: Ding Heng <hengx.ding@intel.com>
> ---
>  lib/librte_ether/rte_ethdev.c | 32 ++++++++++++++++++++++++++++++++
> lib/librte_ether/rte_ethdev.h | 20 ++++++++++++++++++++
>  2 files changed, 52 insertions(+)
> 
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index
> fd1010a..490ea3a 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -235,6 +235,38 @@ rte_eth_dev_init(struct rte_pci_driver *pci_drv,
>  	if (diag == 0)
>  		return (0);
> 
> +	/* Define the device type */
> +	if (strcmp(eth_drv->pci_drv.name, "rte_i40e_pmd") == 0)
> +		eth_dev->dev_type = ETH_DEV_I40E;
> +	else if (strcmp(eth_drv->pci_drv.name, "rte_i40evf_pmd") == 0)
> +		eth_dev->dev_type = ETH_DEV_I40E_VF;
> +	else if (strcmp(eth_drv->pci_drv.name, "rte_em_pmd") == 0)
> +		eth_dev->dev_type = ETH_DEV_EM;
> +	else if (strcmp(eth_drv->pci_drv.name, "rte_igb_pmd") == 0)
> +		eth_dev->dev_type = ETH_DEV_IGB;
> +	else if (strcmp(eth_drv->pci_drv.name, "rte_igbvf_pmd") == 0)
> +		eth_dev->dev_type = ETH_DEV_IGB_VF;
> +	else if (strcmp(eth_drv->pci_drv.name, "rte_ixgbe_pmd") == 0)
> +		eth_dev->dev_type = ETH_DEV_IXGBE;
> +	else if (strcmp(eth_drv->pci_drv.name, "rte_ixgbevf_pmd") == 0)
> +		eth_dev->dev_type = ETH_DEV_IXGBE_VF;
> +	else if (strcmp(eth_drv->pci_drv.name, "eth_bond") == 0)
> +		eth_dev->dev_type = ETH_DEV_BOND;
> +	else if (strcmp(eth_drv->pci_drv.name, "eth_ring") == 0)
> +		eth_dev->dev_type = ETH_DEV_RING;
> +	else if (strcmp(eth_drv->pci_drv.name, "rte_virtio_pmd") == 0)
> +		eth_dev->dev_type = ETH_DEV_VIRTIO;
> +	else if (strcmp(eth_drv->pci_drv.name, "rte_vmxnet3_pmd") == 0)
> +		eth_dev->dev_type = ETH_DEV_VMXNET3;
> +	else if (strcmp(eth_drv->pci_drv.name, "eth_xenvirt") == 0)
> +		eth_dev->dev_type = ETH_DEV_XENVIRT;
> +	else if (strcmp(eth_drv->pci_drv.name, "rte_max_pmd") == 0)
> +		eth_dev->dev_type = ETH_DEV_MAX;
> +	else if (strcmp(eth_drv->pci_drv.name, "eth_pcap") == 0)
> +		eth_dev->dev_type = ETH_DEV_PCAP;
> +	else
> +		eth_dev->dev_type = ETH_DEV_UNKNOWN;
> +
>  	PMD_DEBUG_TRACE("driver %s: eth_dev_init(vendor_id=0x%u
> device_id=0x%x)"
>  			" failed\n", pci_drv->name,
>  			(unsigned) pci_dev->id.vendor_id,
> diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index
> 50df654..83a7ea5 100644
> --- a/lib/librte_ether/rte_ethdev.h
> +++ b/lib/librte_ether/rte_ethdev.h
> @@ -268,6 +268,25 @@ enum rte_eth_rx_mq_mode {
>  	ETH_MQ_RX_VMDQ_DCB_RSS, /**< Enable both VMDQ and DCB in
> VMDq */  };
> 
> +/*Device type*/
> +enum rte_eth_dev_type {
> +	ETH_DEV_UNKNOWN = 0,
> +	ETH_DEV_EM,
> +	ETH_DEV_IGB,
> +	ETH_DEV_IGB_VF,
> +	ETH_DEV_IXGBE,
> +	ETH_DEV_IXGBE_VF,
> +	ETH_DEV_I40E,
> +	ETH_DEV_I40E_VF,
> +	ETH_DEV_BOND,
> +	ETH_DEV_PCAP,
> +	ETH_DEV_RING,
> +	ETH_DEV_VIRTIO,
> +	ETH_DEV_VMXNET3,
> +	ETH_DEV_XENVIRT,
> +	ETH_DEV_MAX
> +};
> +
>  /**
>   * for rx mq mode backward compatible
>   */
> @@ -1487,6 +1506,7 @@ struct rte_eth_dev {
>  	struct eth_dev_ops *dev_ops;    /**< Functions exported by PMD */
>  	struct rte_pci_device *pci_dev; /**< PCI info. supplied by probing */
>  	struct rte_eth_dev_cb_list callbacks; /**< User application callbacks */
> +	enum rte_eth_dev_type dev_type;  /**< Device type info. */
>  };
> 
>  struct rte_eth_dev_sriov {
> --
> 1.9.3
  
Neil Horman Sept. 28, 2014, 12:36 p.m. UTC | #2
On Sun, Sep 28, 2014 at 11:27:16AM +0800, Ding Heng wrote:
> As different PMDs support different features, application may want
> to know the NIC type of a port, then decide how to use that port.
> Add a new field in struct rte_eth_dev, users are able to get
> device type now.
> 
> Signed-off-by: Ding Heng <hengx.ding@intel.com>
Nack.  This patch embodies PMD specific information in a common library, which
really isn't necessecary.  It implies that developers who maintain PMDs outside
of the core dpdk still need to do some maintenence in the core for all the dpdk
features to work.  Its also a layering violation.   The core shouldn't have to
know any specifics about a driver to initalize it, even its name.

If an application wants to know what type of driver a NIC is,
the application can just interrogate the pci drivers name field directly.

Neil
  
Stephen Hemminger Sept. 29, 2014, 3:06 a.m. UTC | #3
Agree with NACK. This type of string matching won't scale.
THe better way is to encapsulate required behavior in feature flags.
I started that with drv_flags, and that seems natural home for such device
specific stuff.

On Sun, Sep 28, 2014 at 5:36 AM, Neil Horman <nhorman@tuxdriver.com> wrote:

> On Sun, Sep 28, 2014 at 11:27:16AM +0800, Ding Heng wrote:
> > As different PMDs support different features, application may want
> > to know the NIC type of a port, then decide how to use that port.
> > Add a new field in struct rte_eth_dev, users are able to get
> > device type now.
> >
> > Signed-off-by: Ding Heng <hengx.ding@intel.com>
> Nack.  This patch embodies PMD specific information in a common library,
> which
> really isn't necessecary.  It implies that developers who maintain PMDs
> outside
> of the core dpdk still need to do some maintenence in the core for all the
> dpdk
> features to work.  Its also a layering violation.   The core shouldn't
> have to
> know any specifics about a driver to initalize it, even its name.
>
> If an application wants to know what type of driver a NIC is,
> the application can just interrogate the pci drivers name field directly.
>
> Neil
>
>
  

Patch

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index fd1010a..490ea3a 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -235,6 +235,38 @@  rte_eth_dev_init(struct rte_pci_driver *pci_drv,
 	if (diag == 0)
 		return (0);
 
+	/* Define the device type */
+	if (strcmp(eth_drv->pci_drv.name, "rte_i40e_pmd") == 0)
+		eth_dev->dev_type = ETH_DEV_I40E;
+	else if (strcmp(eth_drv->pci_drv.name, "rte_i40evf_pmd") == 0)
+		eth_dev->dev_type = ETH_DEV_I40E_VF;
+	else if (strcmp(eth_drv->pci_drv.name, "rte_em_pmd") == 0)
+		eth_dev->dev_type = ETH_DEV_EM;
+	else if (strcmp(eth_drv->pci_drv.name, "rte_igb_pmd") == 0)
+		eth_dev->dev_type = ETH_DEV_IGB;
+	else if (strcmp(eth_drv->pci_drv.name, "rte_igbvf_pmd") == 0)
+		eth_dev->dev_type = ETH_DEV_IGB_VF;
+	else if (strcmp(eth_drv->pci_drv.name, "rte_ixgbe_pmd") == 0)
+		eth_dev->dev_type = ETH_DEV_IXGBE;
+	else if (strcmp(eth_drv->pci_drv.name, "rte_ixgbevf_pmd") == 0)
+		eth_dev->dev_type = ETH_DEV_IXGBE_VF;
+	else if (strcmp(eth_drv->pci_drv.name, "eth_bond") == 0)
+		eth_dev->dev_type = ETH_DEV_BOND;
+	else if (strcmp(eth_drv->pci_drv.name, "eth_ring") == 0)
+		eth_dev->dev_type = ETH_DEV_RING;
+	else if (strcmp(eth_drv->pci_drv.name, "rte_virtio_pmd") == 0)
+		eth_dev->dev_type = ETH_DEV_VIRTIO;
+	else if (strcmp(eth_drv->pci_drv.name, "rte_vmxnet3_pmd") == 0)
+		eth_dev->dev_type = ETH_DEV_VMXNET3;
+	else if (strcmp(eth_drv->pci_drv.name, "eth_xenvirt") == 0)
+		eth_dev->dev_type = ETH_DEV_XENVIRT;
+	else if (strcmp(eth_drv->pci_drv.name, "rte_max_pmd") == 0)
+		eth_dev->dev_type = ETH_DEV_MAX;
+	else if (strcmp(eth_drv->pci_drv.name, "eth_pcap") == 0)
+		eth_dev->dev_type = ETH_DEV_PCAP;
+	else
+		eth_dev->dev_type = ETH_DEV_UNKNOWN;
+
 	PMD_DEBUG_TRACE("driver %s: eth_dev_init(vendor_id=0x%u device_id=0x%x)"
 			" failed\n", pci_drv->name,
 			(unsigned) pci_dev->id.vendor_id,
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 50df654..83a7ea5 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -268,6 +268,25 @@  enum rte_eth_rx_mq_mode {
 	ETH_MQ_RX_VMDQ_DCB_RSS, /**< Enable both VMDQ and DCB in VMDq */
 };
 
+/*Device type*/
+enum rte_eth_dev_type {
+	ETH_DEV_UNKNOWN = 0,
+	ETH_DEV_EM,
+	ETH_DEV_IGB,
+	ETH_DEV_IGB_VF,
+	ETH_DEV_IXGBE,
+	ETH_DEV_IXGBE_VF,
+	ETH_DEV_I40E,
+	ETH_DEV_I40E_VF,
+	ETH_DEV_BOND,
+	ETH_DEV_PCAP,
+	ETH_DEV_RING,
+	ETH_DEV_VIRTIO,
+	ETH_DEV_VMXNET3,
+	ETH_DEV_XENVIRT,
+	ETH_DEV_MAX
+};
+
 /**
  * for rx mq mode backward compatible
  */
@@ -1487,6 +1506,7 @@  struct rte_eth_dev {
 	struct eth_dev_ops *dev_ops;    /**< Functions exported by PMD */
 	struct rte_pci_device *pci_dev; /**< PCI info. supplied by probing */
 	struct rte_eth_dev_cb_list callbacks; /**< User application callbacks */
+	enum rte_eth_dev_type dev_type;  /**< Device type info. */
 };
 
 struct rte_eth_dev_sriov {