[dpdk-dev,PATCHv2,2/4] drivers: Update driver registration macro usage

Message ID 1463605687-649-3-git-send-email-nhorman@tuxdriver.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers

Commit Message

Neil Horman May 18, 2016, 9:08 p.m. UTC
Modify the PMD_REGISTER_DRIVER macro, bifurcating it into two
(PMD_REGISTER_DRIVER_PDEV and PMD_REGISTER_DRIVER_VDEV.  Both of these do the
same thing the origional macro did, but both add the definition of a string
variable that informs interested parties of the name of the pmd, and the former
also defines an second string that holds the symbol name of the pci table that
is registered by this pmd.

pmdinfo uses this information to extract hardware support from an object file
and create a json string to make hardware support info discoverable later.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Bruce Richardson <bruce.richardson@intel.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: Stephen Hemminger <stephen@networkplumber.org>
CC: Panu Matilainen <pmatilai@redhat.com>
---
 drivers/Makefile                           |  2 ++
 drivers/crypto/aesni_gcm/aesni_gcm_pmd.c   |  4 +++-
 drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c |  4 +++-
 drivers/crypto/null/null_crypto_pmd.c      |  4 +++-
 drivers/crypto/qat/rte_qat_cryptodev.c     |  4 +++-
 drivers/crypto/snow3g/rte_snow3g_pmd.c     |  4 +++-
 drivers/net/af_packet/rte_eth_af_packet.c  |  4 +++-
 drivers/net/bnx2x/bnx2x_ethdev.c           |  6 ++++--
 drivers/net/bonding/rte_eth_bond_pmd.c     |  7 ++++++-
 drivers/net/cxgbe/cxgbe_ethdev.c           |  4 +++-
 drivers/net/e1000/em_ethdev.c              |  3 ++-
 drivers/net/e1000/igb_ethdev.c             |  6 ++++--
 drivers/net/ena/ena_ethdev.c               |  3 ++-
 drivers/net/enic/enic_ethdev.c             |  3 ++-
 drivers/net/fm10k/fm10k_ethdev.c           |  3 ++-
 drivers/net/i40e/i40e_ethdev.c             |  3 ++-
 drivers/net/i40e/i40e_ethdev_vf.c          |  3 ++-
 drivers/net/ixgbe/ixgbe_ethdev.c           |  6 ++++--
 drivers/net/mlx4/mlx4.c                    |  3 ++-
 drivers/net/mlx5/mlx5.c                    |  3 ++-
 drivers/net/mpipe/mpipe_tilegx.c           |  4 ++--
 drivers/net/nfp/nfp_net.c                  |  3 ++-
 drivers/net/null/rte_eth_null.c            |  3 ++-
 drivers/net/pcap/rte_eth_pcap.c            |  4 +++-
 drivers/net/ring/rte_eth_ring.c            |  3 ++-
 drivers/net/szedata2/rte_eth_szedata2.c    |  3 ++-
 drivers/net/vhost/rte_eth_vhost.c          |  3 ++-
 drivers/net/virtio/virtio_ethdev.c         |  3 ++-
 drivers/net/vmxnet3/vmxnet3_ethdev.c       |  3 ++-
 drivers/net/xenvirt/rte_eth_xenvirt.c      |  2 +-
 lib/librte_eal/common/include/rte_dev.h    | 20 ++++++++++++++++----
 31 files changed, 93 insertions(+), 37 deletions(-)
  

Comments

Panu Matilainen May 19, 2016, 7:58 a.m. UTC | #1
On 05/19/2016 12:08 AM, Neil Horman wrote:
> Modify the PMD_REGISTER_DRIVER macro, bifurcating it into two
> (PMD_REGISTER_DRIVER_PDEV and PMD_REGISTER_DRIVER_VDEV.  Both of these do the
> same thing the origional macro did, but both add the definition of a string
> variable that informs interested parties of the name of the pmd, and the former
> also defines an second string that holds the symbol name of the pci table that
> is registered by this pmd.
>
> pmdinfo uses this information to extract hardware support from an object file
> and create a json string to make hardware support info discoverable later.
>
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Bruce Richardson <bruce.richardson@intel.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: Stephen Hemminger <stephen@networkplumber.org>
> CC: Panu Matilainen <pmatilai@redhat.com>
> ---
>  drivers/Makefile                           |  2 ++
>  drivers/crypto/aesni_gcm/aesni_gcm_pmd.c   |  4 +++-
>  drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c |  4 +++-
>  drivers/crypto/null/null_crypto_pmd.c      |  4 +++-
>  drivers/crypto/qat/rte_qat_cryptodev.c     |  4 +++-
>  drivers/crypto/snow3g/rte_snow3g_pmd.c     |  4 +++-
>  drivers/net/af_packet/rte_eth_af_packet.c  |  4 +++-
>  drivers/net/bnx2x/bnx2x_ethdev.c           |  6 ++++--
>  drivers/net/bonding/rte_eth_bond_pmd.c     |  7 ++++++-
>  drivers/net/cxgbe/cxgbe_ethdev.c           |  4 +++-
>  drivers/net/e1000/em_ethdev.c              |  3 ++-
>  drivers/net/e1000/igb_ethdev.c             |  6 ++++--
>  drivers/net/ena/ena_ethdev.c               |  3 ++-
>  drivers/net/enic/enic_ethdev.c             |  3 ++-
>  drivers/net/fm10k/fm10k_ethdev.c           |  3 ++-
>  drivers/net/i40e/i40e_ethdev.c             |  3 ++-
>  drivers/net/i40e/i40e_ethdev_vf.c          |  3 ++-
>  drivers/net/ixgbe/ixgbe_ethdev.c           |  6 ++++--
>  drivers/net/mlx4/mlx4.c                    |  3 ++-
>  drivers/net/mlx5/mlx5.c                    |  3 ++-
>  drivers/net/mpipe/mpipe_tilegx.c           |  4 ++--
>  drivers/net/nfp/nfp_net.c                  |  3 ++-
>  drivers/net/null/rte_eth_null.c            |  3 ++-
>  drivers/net/pcap/rte_eth_pcap.c            |  4 +++-
>  drivers/net/ring/rte_eth_ring.c            |  3 ++-
>  drivers/net/szedata2/rte_eth_szedata2.c    |  3 ++-
>  drivers/net/vhost/rte_eth_vhost.c          |  3 ++-
>  drivers/net/virtio/virtio_ethdev.c         |  3 ++-
>  drivers/net/vmxnet3/vmxnet3_ethdev.c       |  3 ++-
>  drivers/net/xenvirt/rte_eth_xenvirt.c      |  2 +-
>  lib/librte_eal/common/include/rte_dev.h    | 20 ++++++++++++++++----
>  31 files changed, 93 insertions(+), 37 deletions(-)
>

drivers/net/qede is missing and causes a build failure with a fresh config.

It seems to be missing in v1 but I managed to test it, guess it must've 
been an old .config generated before QEDE got merged.

	- Panu -
  
Neil Horman May 19, 2016, 10:45 a.m. UTC | #2
On Thu, May 19, 2016 at 10:58:23AM +0300, Panu Matilainen wrote:
> On 05/19/2016 12:08 AM, Neil Horman wrote:
> > Modify the PMD_REGISTER_DRIVER macro, bifurcating it into two
> > (PMD_REGISTER_DRIVER_PDEV and PMD_REGISTER_DRIVER_VDEV.  Both of these do the
> > same thing the origional macro did, but both add the definition of a string
> > variable that informs interested parties of the name of the pmd, and the former
> > also defines an second string that holds the symbol name of the pci table that
> > is registered by this pmd.
> > 
> > pmdinfo uses this information to extract hardware support from an object file
> > and create a json string to make hardware support info discoverable later.
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Bruce Richardson <bruce.richardson@intel.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: Stephen Hemminger <stephen@networkplumber.org>
> > CC: Panu Matilainen <pmatilai@redhat.com>
> > ---
> >  drivers/Makefile                           |  2 ++
> >  drivers/crypto/aesni_gcm/aesni_gcm_pmd.c   |  4 +++-
> >  drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c |  4 +++-
> >  drivers/crypto/null/null_crypto_pmd.c      |  4 +++-
> >  drivers/crypto/qat/rte_qat_cryptodev.c     |  4 +++-
> >  drivers/crypto/snow3g/rte_snow3g_pmd.c     |  4 +++-
> >  drivers/net/af_packet/rte_eth_af_packet.c  |  4 +++-
> >  drivers/net/bnx2x/bnx2x_ethdev.c           |  6 ++++--
> >  drivers/net/bonding/rte_eth_bond_pmd.c     |  7 ++++++-
> >  drivers/net/cxgbe/cxgbe_ethdev.c           |  4 +++-
> >  drivers/net/e1000/em_ethdev.c              |  3 ++-
> >  drivers/net/e1000/igb_ethdev.c             |  6 ++++--
> >  drivers/net/ena/ena_ethdev.c               |  3 ++-
> >  drivers/net/enic/enic_ethdev.c             |  3 ++-
> >  drivers/net/fm10k/fm10k_ethdev.c           |  3 ++-
> >  drivers/net/i40e/i40e_ethdev.c             |  3 ++-
> >  drivers/net/i40e/i40e_ethdev_vf.c          |  3 ++-
> >  drivers/net/ixgbe/ixgbe_ethdev.c           |  6 ++++--
> >  drivers/net/mlx4/mlx4.c                    |  3 ++-
> >  drivers/net/mlx5/mlx5.c                    |  3 ++-
> >  drivers/net/mpipe/mpipe_tilegx.c           |  4 ++--
> >  drivers/net/nfp/nfp_net.c                  |  3 ++-
> >  drivers/net/null/rte_eth_null.c            |  3 ++-
> >  drivers/net/pcap/rte_eth_pcap.c            |  4 +++-
> >  drivers/net/ring/rte_eth_ring.c            |  3 ++-
> >  drivers/net/szedata2/rte_eth_szedata2.c    |  3 ++-
> >  drivers/net/vhost/rte_eth_vhost.c          |  3 ++-
> >  drivers/net/virtio/virtio_ethdev.c         |  3 ++-
> >  drivers/net/vmxnet3/vmxnet3_ethdev.c       |  3 ++-
> >  drivers/net/xenvirt/rte_eth_xenvirt.c      |  2 +-
> >  lib/librte_eal/common/include/rte_dev.h    | 20 ++++++++++++++++----
> >  31 files changed, 93 insertions(+), 37 deletions(-)
> > 
> 
> drivers/net/qede is missing and causes a build failure with a fresh config.
> 
> It seems to be missing in v1 but I managed to test it, guess it must've been
> an old .config generated before QEDE got merged.
> 
> 	- Panu -
> 
No, It only got added recently.  I pulled when I started writing this (about two
weeks ago), and it got added during its development.  I'll rebase
Neil
  
Jan Viktorin May 19, 2016, 10:51 a.m. UTC | #3
Hello Neil,

just few notes...

(sorry if you've recevied this twice, importing mbox files from patchwork
always changes my default From: field)

On Wed, 18 May 2016 17:08:05 -0400
Neil Horman <nhorman@tuxdriver.com> wrote:

> Modify the PMD_REGISTER_DRIVER macro, bifurcating it into two
> (PMD_REGISTER_DRIVER_PDEV and PMD_REGISTER_DRIVER_VDEV.  Both of these do the
> same thing the origional macro did, but both add the definition of a string

I could not find any of those: PMD_REGISTER_DRIVER_PDEV, PMD_REGISTER_DRIVER_VDEV
in this patch. I think the message is misleading...

I am interested as this may lead to merge conflicts when generalizing
rte_pci_device/driver and stuff around it.

> variable that informs interested parties of the name of the pmd, and the former
> also defines an second string that holds the symbol name of the pci table that
> is registered by this pmd.

> 
> pmdinfo uses this information to extract hardware support from an object file
> and create a json string to make hardware support info discoverable later.
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Bruce Richardson <bruce.richardson@intel.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: Stephen Hemminger <stephen@networkplumber.org>
> CC: Panu Matilainen <pmatilai@redhat.com>
> 
> ---
> drivers/Makefile                           |  2 ++
>  drivers/crypto/aesni_gcm/aesni_gcm_pmd.c   |  4 +++-
>  drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c |  4 +++-
>  drivers/crypto/null/null_crypto_pmd.c      |  4 +++-
>  drivers/crypto/qat/rte_qat_cryptodev.c     |  4 +++-
>  drivers/crypto/snow3g/rte_snow3g_pmd.c     |  4 +++-
>  drivers/net/af_packet/rte_eth_af_packet.c  |  4 +++-
>  drivers/net/bnx2x/bnx2x_ethdev.c           |  6 ++++--
>  drivers/net/bonding/rte_eth_bond_pmd.c     |  7 ++++++-
>  drivers/net/cxgbe/cxgbe_ethdev.c           |  4 +++-
>  drivers/net/e1000/em_ethdev.c              |  3 ++-
>  drivers/net/e1000/igb_ethdev.c             |  6 ++++--
>  drivers/net/ena/ena_ethdev.c               |  3 ++-
>  drivers/net/enic/enic_ethdev.c             |  3 ++-
>  drivers/net/fm10k/fm10k_ethdev.c           |  3 ++-
>  drivers/net/i40e/i40e_ethdev.c             |  3 ++-
>  drivers/net/i40e/i40e_ethdev_vf.c          |  3 ++-
>  drivers/net/ixgbe/ixgbe_ethdev.c           |  6 ++++--
>  drivers/net/mlx4/mlx4.c                    |  3 ++-
>  drivers/net/mlx5/mlx5.c                    |  3 ++-
>  drivers/net/mpipe/mpipe_tilegx.c           |  4 ++--
>  drivers/net/nfp/nfp_net.c                  |  3 ++-
>  drivers/net/null/rte_eth_null.c            |  3 ++-
>  drivers/net/pcap/rte_eth_pcap.c            |  4 +++-
>  drivers/net/ring/rte_eth_ring.c            |  3 ++-
>  drivers/net/szedata2/rte_eth_szedata2.c    |  3 ++-
>  drivers/net/vhost/rte_eth_vhost.c          |  3 ++-
>  drivers/net/virtio/virtio_ethdev.c         |  3 ++-
>  drivers/net/vmxnet3/vmxnet3_ethdev.c       |  3 ++-
>  drivers/net/xenvirt/rte_eth_xenvirt.c      |  2 +-
>  lib/librte_eal/common/include/rte_dev.h    | 20 ++++++++++++++++----
>  31 files changed, 93 insertions(+), 37 deletions(-)
> 

[...]

>  
> -PMD_REGISTER_DRIVER(pmd_xenvirt_drv);
> +PMD_REGISTER_DRIVER(pmd_xenvirt_drv, xenvirt);
> diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
> index f1b5507..871089a 100644
> --- a/lib/librte_eal/common/include/rte_dev.h
> +++ b/lib/librte_eal/common/include/rte_dev.h
> @@ -48,7 +48,7 @@ extern "C" {
>  
>  #include <stdio.h>
>  #include <sys/queue.h>
> -
> +#include <rte_pci.h>

This should be done in an opposite way. The rte_pci.h should include rte_dev.h
(more specific includes a generic one). I've introduced this in the following patch:

 [PATCH v1 01/28] eal: make enum rte_kernel_driver non-PCI specific
 http://dpdk.org/dev/patchwork/patch/12488/

Regards
Jan

>  #include <rte_log.h>
>  
>  __attribute__((format(printf, 2, 0)))
> @@ -178,12 +178,24 @@ int rte_eal_vdev_init(const char *name, const char *args);
>   */
>  int rte_eal_vdev_uninit(const char *name);
>  
> -#define PMD_REGISTER_DRIVER(d)\
> +#define DRIVER_EXPORT_NAME_ARRAY(n, idx) n##idx[] __attribute__((used))
> +
> +#define DRIVER_EXPORT_NAME(d, idx) \
> +static const char DRIVER_EXPORT_NAME_ARRAY(this_pmd_name, idx) = RTE_STR(d);\
> + 
> +#define PMD_REGISTER_DRIVER(d, n)\
>  void devinitfn_ ##d(void);\
>  void __attribute__((constructor, used)) devinitfn_ ##d(void)\
>  {\
> -	rte_eal_driver_register(&d);\
> -}
> +        rte_eal_driver_register(&d);\
> +}\
> +DRIVER_EXPORT_NAME(n, __COUNTER__)
> +
> +#define DRIVER_REGISTER_PCI_TABLE(n, t) \
> +static const char n##_pci_tbl_export[] __attribute__((used)) = RTE_STR(t)
> +
> +#define DRIVER_REGISTER_PARAM_STRING(n, s) \
> +static const char n##_param_string_export[] __attribute__((used)) = s
>  
>  #ifdef __cplusplus
>  }
  
Neil Horman May 19, 2016, 11:40 a.m. UTC | #4
On Thu, May 19, 2016 at 12:46:50PM +0200, Jan Viktorin wrote:
> Hello Neil,
> 
> just few notes...
> 
> On Wed, 18 May 2016 17:08:05 -0400
> Neil Horman <nhorman@tuxdriver.com> wrote:
> 
> > Modify the PMD_REGISTER_DRIVER macro, bifurcating it into two
> > (PMD_REGISTER_DRIVER_PDEV and PMD_REGISTER_DRIVER_VDEV.  Both of these do the
> > same thing the origional macro did, but both add the definition of a string
> 

> I could not find any of those: PMD_REGISTER_DRIVER_PDEV, PMD_REGISTER_DRIVER_VDEV
> in this patch. I think the message is misleading...
> 
Forgot to fix up the changelog entry, when I merged these two macros back to the
single PMD_REGISTER_DRIVER

> I am interested as this may lead to merge conflicts when generalizing
> rte_pci_device/driver and stuff around it.
> 
Not sure what you mean by that

> > variable that informs interested parties of the name of the pmd, and the former
> > also defines an second string that holds the symbol name of the pci table that
> > is registered by this pmd.
> 
> > 
> > pmdinfo uses this information to extract hardware support from an object file
> > and create a json string to make hardware support info discoverable later.
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Bruce Richardson <bruce.richardson@intel.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: Stephen Hemminger <stephen@networkplumber.org>
> > CC: Panu Matilainen <pmatilai@redhat.com>
> > 
> > ---
> > drivers/Makefile                           |  2 ++
> >  drivers/crypto/aesni_gcm/aesni_gcm_pmd.c   |  4 +++-
> >  drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c |  4 +++-
> >  drivers/crypto/null/null_crypto_pmd.c      |  4 +++-
> >  drivers/crypto/qat/rte_qat_cryptodev.c     |  4 +++-
> >  drivers/crypto/snow3g/rte_snow3g_pmd.c     |  4 +++-
> >  drivers/net/af_packet/rte_eth_af_packet.c  |  4 +++-
> >  drivers/net/bnx2x/bnx2x_ethdev.c           |  6 ++++--
> >  drivers/net/bonding/rte_eth_bond_pmd.c     |  7 ++++++-
> >  drivers/net/cxgbe/cxgbe_ethdev.c           |  4 +++-
> >  drivers/net/e1000/em_ethdev.c              |  3 ++-
> >  drivers/net/e1000/igb_ethdev.c             |  6 ++++--
> >  drivers/net/ena/ena_ethdev.c               |  3 ++-
> >  drivers/net/enic/enic_ethdev.c             |  3 ++-
> >  drivers/net/fm10k/fm10k_ethdev.c           |  3 ++-
> >  drivers/net/i40e/i40e_ethdev.c             |  3 ++-
> >  drivers/net/i40e/i40e_ethdev_vf.c          |  3 ++-
> >  drivers/net/ixgbe/ixgbe_ethdev.c           |  6 ++++--
> >  drivers/net/mlx4/mlx4.c                    |  3 ++-
> >  drivers/net/mlx5/mlx5.c                    |  3 ++-
> >  drivers/net/mpipe/mpipe_tilegx.c           |  4 ++--
> >  drivers/net/nfp/nfp_net.c                  |  3 ++-
> >  drivers/net/null/rte_eth_null.c            |  3 ++-
> >  drivers/net/pcap/rte_eth_pcap.c            |  4 +++-
> >  drivers/net/ring/rte_eth_ring.c            |  3 ++-
> >  drivers/net/szedata2/rte_eth_szedata2.c    |  3 ++-
> >  drivers/net/vhost/rte_eth_vhost.c          |  3 ++-
> >  drivers/net/virtio/virtio_ethdev.c         |  3 ++-
> >  drivers/net/vmxnet3/vmxnet3_ethdev.c       |  3 ++-
> >  drivers/net/xenvirt/rte_eth_xenvirt.c      |  2 +-
> >  lib/librte_eal/common/include/rte_dev.h    | 20 ++++++++++++++++----
> >  31 files changed, 93 insertions(+), 37 deletions(-)
> > 
> 
> [...]
> 
> >  
> > -PMD_REGISTER_DRIVER(pmd_xenvirt_drv);
> > +PMD_REGISTER_DRIVER(pmd_xenvirt_drv, xenvirt);
> > diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
> > index f1b5507..871089a 100644
> > --- a/lib/librte_eal/common/include/rte_dev.h
> > +++ b/lib/librte_eal/common/include/rte_dev.h
> > @@ -48,7 +48,7 @@ extern "C" {
> >  
> >  #include <stdio.h>
> >  #include <sys/queue.h>
> > -
> > +#include <rte_pci.h>
> 
> This should be done in an opposite way. The rte_pci.h should include rte_dev.h
> (more specific includes a generic one). I've introduced this in the following patch:
> 
>  [PATCH v1 01/28] eal: make enum rte_kernel_driver non-PCI specific
>  http://dpdk.org/dev/patchwork/patch/12488/
> 
> Regards
> Jan
> 
That seems to be still in flight.  If your change lands by the time this gets
merged I'll change it accordingly.
  

Patch

diff --git a/drivers/Makefile b/drivers/Makefile
index 81c03a8..75a3168 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -34,4 +34,6 @@  include $(RTE_SDK)/mk/rte.vars.mk
 DIRS-y += net
 DIRS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += crypto
 
+DEPDIRS-y += buildtools/pmdinfo
+
 include $(RTE_SDK)/mk/rte.subdir.mk
diff --git a/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c b/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
index 2987ef6..593769f 100644
--- a/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
+++ b/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c
@@ -521,4 +521,6 @@  static struct rte_driver aesni_gcm_pmd_drv = {
 	.uninit = aesni_gcm_uninit
 };
 
-PMD_REGISTER_DRIVER(aesni_gcm_pmd_drv);
+PMD_REGISTER_DRIVER(aesni_gcm_pmd_drv, aesni_gcm);
+DRIVER_REGISTER_PARAM_STRING(aesni_gcm, "max_nb_queue_pairs=<int> \
+max_nb_sessions=<int> socket_id=<int>");
diff --git a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c
index 3415ac1..2e30939 100644
--- a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c
+++ b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c
@@ -716,4 +716,6 @@  static struct rte_driver cryptodev_aesni_mb_pmd_drv = {
 	.uninit = cryptodev_aesni_mb_uninit
 };
 
-PMD_REGISTER_DRIVER(cryptodev_aesni_mb_pmd_drv);
+PMD_REGISTER_DRIVER(cryptodev_aesni_mb_pmd_drvi, aesni_mb);
+DRIVER_REGISTER_PARAM_STRING(aesni_gcm, "max_nb_queue_pairs=<int> \
+max_nb_sessions=<int> socket_id=<int>");
diff --git a/drivers/crypto/null/null_crypto_pmd.c b/drivers/crypto/null/null_crypto_pmd.c
index bdaf13c..44c4fba 100644
--- a/drivers/crypto/null/null_crypto_pmd.c
+++ b/drivers/crypto/null/null_crypto_pmd.c
@@ -275,4 +275,6 @@  static struct rte_driver cryptodev_null_pmd_drv = {
 	.uninit = cryptodev_null_uninit
 };
 
-PMD_REGISTER_DRIVER(cryptodev_null_pmd_drv);
+PMD_REGISTER_DRIVER(cryptodev_null_pmd_drv, cryptodev_null_pmd);
+DRIVER_REGISTER_PARAM_STRING(aesni_gcm, "max_nb_queue_pairs=<int> \
+max_nb_sessions=<int> socket_id=<int>");
diff --git a/drivers/crypto/qat/rte_qat_cryptodev.c b/drivers/crypto/qat/rte_qat_cryptodev.c
index a7912f5..92f0d40 100644
--- a/drivers/crypto/qat/rte_qat_cryptodev.c
+++ b/drivers/crypto/qat/rte_qat_cryptodev.c
@@ -137,4 +137,6 @@  static struct rte_driver pmd_qat_drv = {
 	.init = rte_qat_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(pmd_qat_drv);
+PMD_REGISTER_DRIVER(pmd_qat_drv, qat);
+DRIVER_EXPORT_PCI_TABLE(qat, pci_id_qat_map);
+
diff --git a/drivers/crypto/snow3g/rte_snow3g_pmd.c b/drivers/crypto/snow3g/rte_snow3g_pmd.c
index f3e0e66..eee2544 100644
--- a/drivers/crypto/snow3g/rte_snow3g_pmd.c
+++ b/drivers/crypto/snow3g/rte_snow3g_pmd.c
@@ -548,4 +548,6 @@  static struct rte_driver cryptodev_snow3g_pmd_drv = {
 	.uninit = cryptodev_snow3g_uninit
 };
 
-PMD_REGISTER_DRIVER(cryptodev_snow3g_pmd_drv);
+PMD_REGISTER_DRIVER(cryptodev_snow3g_pmd_drv, snow3g);
+DRIVER_REGISTER_PARAM_STRING(aesni_gcm, "max_nb_queue_pairs=<int> \
+max_nb_sessions=<int> socket_id=<int>");
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c
index f17bd7e..e960512 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -878,4 +878,6 @@  static struct rte_driver pmd_af_packet_drv = {
 	.uninit = rte_pmd_af_packet_devuninit,
 };
 
-PMD_REGISTER_DRIVER(pmd_af_packet_drv);
+PMD_REGISTER_DRIVER(pmd_af_packet_drv, eth_af_packet);
+DRIVER_REGISTER_PARAM_STRING(eth_af_packet, "iface=<string> \
+qpairs=<int> blocksz=<int> framesz=<int> framecnt=<int>");
diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index 071b44f..ee9581b 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -550,5 +550,7 @@  static struct rte_driver rte_bnx2xvf_driver = {
 	.init = rte_bnx2xvf_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(rte_bnx2x_driver);
-PMD_REGISTER_DRIVER(rte_bnx2xvf_driver);
+PMD_REGISTER_DRIVER(rte_bnx2x_driver, pci_id_bnx2x_map, bnx2x);
+DRIVER_EXPORT_PCI_TABLE(bnx2x, pci_id_bnx2x_map);
+PMD_REGISTER_DRIVER(rte_bnx2xvf_driver, pci_id_bnx2xvf_map, bnx2xvf);
+DRIVER_EXPORT_PCI_TABLE(bnx2xvf, pci_id_bnx2xvf_map);
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 129f04b..b4556be 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -2511,4 +2511,9 @@  static struct rte_driver bond_drv = {
 	.uninit = bond_uninit,
 };
 
-PMD_REGISTER_DRIVER(bond_drv);
+PMD_REGISTER_DRIVER(bond_drv, bonding);
+
+DRIVER_REGISTER_PARAM_STRING(bonding, "slave=<ifc> primary=<ifc> mode=[0-4] \
+xmit_policy=[l2 | l23 | l34] socket_id=<int> mac=<mac addr> \
+lsc_poll_period_ms=<int> up_delay=<int> down_delay=<int>");
+
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
index 04eddaf..e84e48b 100644
--- a/drivers/net/cxgbe/cxgbe_ethdev.c
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c
@@ -894,4 +894,6 @@  static struct rte_driver rte_cxgbe_driver = {
 	.init = rte_cxgbe_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(rte_cxgbe_driver);
+PMD_REGISTER_DRIVER(rte_cxgbe_driver, cxgb4);
+DRIVER_REGISTER_PCI_TABLE(cxgb4, cxgb4_pci_tbl);
+
diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
index 653be09..4de5eb2 100644
--- a/drivers/net/e1000/em_ethdev.c
+++ b/drivers/net/e1000/em_ethdev.c
@@ -1777,4 +1777,5 @@  struct rte_driver em_pmd_drv = {
 	.init = rte_em_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(em_pmd_drv);
+PMD_REGISTER_DRIVER(em_pmd_drv, em);
+DRIVER_REGISTER_PCI_TABLE(em, pci_id_em_map);
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index f0921ee..f49aae7 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -4973,5 +4973,7 @@  eth_igb_configure_msix_intr(struct rte_eth_dev *dev)
 	E1000_WRITE_FLUSH(hw);
 }
 
-PMD_REGISTER_DRIVER(pmd_igb_drv);
-PMD_REGISTER_DRIVER(pmd_igbvf_drv);
+PMD_REGISTER_DRIVER(pmd_igb_drv, igb);
+DRIVER_REGISTER_PCI_TABLE(igb, pci_id_igb_map);
+PMD_REGISTER_DRIVER(pmd_igbvf_drv, igbvf);
+DRIVER_REGISTER_PCI_TABLE(igbvf, pci_id_igbvf_map);
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index e157587..702289b 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -1450,4 +1450,5 @@  struct rte_driver ena_pmd_drv = {
 	.init = rte_ena_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(ena_pmd_drv);
+PMD_REGISTER_DRIVER(ena_pmd_drv, ena);
+DRIVER_REGISTER_PCI_TABLE(ena, pci_id_ena_map);
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
index 6bea940..36ee7ca 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -684,4 +684,5 @@  static struct rte_driver rte_enic_driver = {
 	.init = rte_enic_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(rte_enic_driver);
+PMD_REGISTER_DRIVER(rte_enic_driver, enic);
+DRIVER_REGISTER_PCI_TABLE(enic, pci_id_enic_map);
diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index c2d377f..9b2a7ee 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -3055,4 +3055,5 @@  static struct rte_driver rte_fm10k_driver = {
 	.init = rte_pmd_fm10k_init,
 };
 
-PMD_REGISTER_DRIVER(rte_fm10k_driver);
+PMD_REGISTER_DRIVER(rte_fm10k_driver, fm10k);
+DRIVER_REGISTER_PCI_TABLE(fm10k, pci_id_fm10k_map);
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index d8b6bd7..57f89d9 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -695,7 +695,8 @@  static struct rte_driver rte_i40e_driver = {
 	.init = rte_i40e_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(rte_i40e_driver);
+PMD_REGISTER_DRIVER(rte_i40e_driver, i40e);
+DRIVER_REGISTER_PCI_TABLE(i40e, pci_id_i40e_map);
 
 /*
  * Initialize registers for flexible payload, which should be set by NVM.
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 2bce69b..348d9a8 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -1560,7 +1560,8 @@  static struct rte_driver rte_i40evf_driver = {
 	.init = rte_i40evf_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(rte_i40evf_driver);
+PMD_REGISTER_DRIVER(rte_i40evf_driver, i40evf);
+DRIVER_REGISTER_PCI_TABLE(i40evf, pci_id_i40evf_map);
 
 static int
 i40evf_dev_configure(struct rte_eth_dev *dev)
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index eec607c..933f013 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -7141,5 +7141,7 @@  static struct rte_driver rte_ixgbevf_driver = {
 	.init = rte_ixgbevf_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(rte_ixgbe_driver);
-PMD_REGISTER_DRIVER(rte_ixgbevf_driver);
+PMD_REGISTER_DRIVER(rte_ixgbe_driver, ixgbe);
+DRIVER_REGISTER_PCI_TABLE(ixgbe, pci_id_ixgbe_map);
+PMD_REGISTER_DRIVER(rte_ixgbevf_driver, ixgbevf);
+DRIVER_REGISTER_PCI_TABLE(ixgbevf, pci_id_ixgbevf_map);
diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index 4f21dbe..b0d2f3c 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -5817,4 +5817,5 @@  static struct rte_driver rte_mlx4_driver = {
 	.init = rte_mlx4_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(rte_mlx4_driver)
+PMD_REGISTER_DRIVER(rte_mlx4_driveri, mlx4)
+DRIVER_REGISTER_PCI_TABLE(mlx4, mlx4_pci_id_map);
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index 041cfc3..5f2d6c8 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -672,4 +672,5 @@  static struct rte_driver rte_mlx5_driver = {
 	.init = rte_mlx5_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(rte_mlx5_driver)
+PMD_REGISTER_DRIVER(rte_mlx5_driveri, mlx5)
+DRIVER_REGISTER_PCI_TABLE(mlx5, mlx5_pci_id_map);
diff --git a/drivers/net/mpipe/mpipe_tilegx.c b/drivers/net/mpipe/mpipe_tilegx.c
index adcbc19..4717a43 100644
--- a/drivers/net/mpipe/mpipe_tilegx.c
+++ b/drivers/net/mpipe/mpipe_tilegx.c
@@ -1635,8 +1635,8 @@  static struct rte_driver pmd_mpipe_gbe_drv = {
 	.init = rte_pmd_mpipe_devinit,
 };
 
-PMD_REGISTER_DRIVER(pmd_mpipe_xgbe_drv);
-PMD_REGISTER_DRIVER(pmd_mpipe_gbe_drv);
+PMD_REGISTER_DRIVER(pmd_mpipe_xgbe_drv, mpipe_xgbe);
+PMD_REGISTER_DRIVER(pmd_mpipe_gbe_drv, mpipe_gbe);
 
 static void __attribute__((constructor, used))
 mpipe_init_contexts(void)
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index bc0a3d8..75e780f 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -2482,7 +2482,8 @@  static struct rte_driver rte_nfp_net_driver = {
 	.init = nfp_net_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(rte_nfp_net_driver);
+PMD_REGISTER_DRIVER(rte_nfp_net_driver, nfp);
+DRIVER_REGISTER_PCI_TABLE(nfp, pci_id_nfp_net_map);
 
 /*
  * Local variables:
diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c
index 5e8e203..88eb582 100644
--- a/drivers/net/null/rte_eth_null.c
+++ b/drivers/net/null/rte_eth_null.c
@@ -689,4 +689,5 @@  static struct rte_driver pmd_null_drv = {
 	.uninit = rte_pmd_null_devuninit,
 };
 
-PMD_REGISTER_DRIVER(pmd_null_drv);
+PMD_REGISTER_DRIVER(pmd_null_drv, eth_null);
+DRIVER_REGISTER_PARAM_STRING(eth_null, "size=<int> copy=<int>");
diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
index c98e234..397f01c 100644
--- a/drivers/net/pcap/rte_eth_pcap.c
+++ b/drivers/net/pcap/rte_eth_pcap.c
@@ -1090,4 +1090,6 @@  static struct rte_driver pmd_pcap_drv = {
 	.uninit = rte_pmd_pcap_devuninit,
 };
 
-PMD_REGISTER_DRIVER(pmd_pcap_drv);
+PMD_REGISTER_DRIVER(pmd_pcap_drv, pcap);
+DRIVER_REGISTER_PARAM_STRING(pcap, "rx_pcap=<string> tx_pcap=<string> \
+rx_iface=<ifc> tx_iface=<ifc> iface=<ifc>");
diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c
index b1783c3..f2f5217 100644
--- a/drivers/net/ring/rte_eth_ring.c
+++ b/drivers/net/ring/rte_eth_ring.c
@@ -630,4 +630,5 @@  static struct rte_driver pmd_ring_drv = {
 	.uninit = rte_pmd_ring_devuninit,
 };
 
-PMD_REGISTER_DRIVER(pmd_ring_drv);
+PMD_REGISTER_DRIVER(pmd_ring_drv, eth_ring);
+DRIVER_REGISTER_PARAM_STRING(eth_ring, "nodeaction=[attach|detach]");
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index 78c43b0..abbc907 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -1601,4 +1601,5 @@  static struct rte_driver rte_szedata2_driver = {
 	.uninit = rte_szedata2_uninit,
 };
 
-PMD_REGISTER_DRIVER(rte_szedata2_driver);
+PMD_REGISTER_DRIVER(rte_szedata2_driver, rte_szedata2_pmd);
+DRIVER_REGISTER_PCI_TABLE(rte_szedata2_pmd, rte_szedata2_pci_id_table);
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index 310cbef..d321c3e 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -924,4 +924,5 @@  static struct rte_driver pmd_vhost_drv = {
 	.uninit = rte_pmd_vhost_devuninit,
 };
 
-PMD_REGISTER_DRIVER(pmd_vhost_drv);
+PMD_REGISTER_DRIVER(pmd_vhost_drv, eth_vhost);
+DRIVER_REGISTER_PARAM_STRING(eth_vhost, "iface=<ifc> queues=<int>");
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 63a368a..030a206 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1458,4 +1458,5 @@  static struct rte_driver rte_virtio_driver = {
 	.init = rte_virtio_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(rte_virtio_driver);
+PMD_REGISTER_DRIVER(rte_virtio_driver, virtio_net);
+DRIVER_REGISTER_PCI_TABLE(virtio_net, pci_id_virtio_map);
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 29b469c..8da4449 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -954,4 +954,5 @@  static struct rte_driver rte_vmxnet3_driver = {
 	.init = rte_vmxnet3_pmd_init,
 };
 
-PMD_REGISTER_DRIVER(rte_vmxnet3_driver);
+PMD_REGISTER_DRIVER(rte_vmxnet3_driver, vmxnet3);
+DRIVER_REGISTER_PCI_TABLE(vmxnet3, pci_id_vmxnet3_map);
diff --git a/drivers/net/xenvirt/rte_eth_xenvirt.c b/drivers/net/xenvirt/rte_eth_xenvirt.c
index b9638d9..bcc1847 100644
--- a/drivers/net/xenvirt/rte_eth_xenvirt.c
+++ b/drivers/net/xenvirt/rte_eth_xenvirt.c
@@ -775,4 +775,4 @@  static struct rte_driver pmd_xenvirt_drv = {
 	.uninit = rte_pmd_xenvirt_devuninit,
 };
 
-PMD_REGISTER_DRIVER(pmd_xenvirt_drv);
+PMD_REGISTER_DRIVER(pmd_xenvirt_drv, xenvirt);
diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
index f1b5507..871089a 100644
--- a/lib/librte_eal/common/include/rte_dev.h
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -48,7 +48,7 @@  extern "C" {
 
 #include <stdio.h>
 #include <sys/queue.h>
-
+#include <rte_pci.h>
 #include <rte_log.h>
 
 __attribute__((format(printf, 2, 0)))
@@ -178,12 +178,24 @@  int rte_eal_vdev_init(const char *name, const char *args);
  */
 int rte_eal_vdev_uninit(const char *name);
 
-#define PMD_REGISTER_DRIVER(d)\
+#define DRIVER_EXPORT_NAME_ARRAY(n, idx) n##idx[] __attribute__((used))
+
+#define DRIVER_EXPORT_NAME(d, idx) \
+static const char DRIVER_EXPORT_NAME_ARRAY(this_pmd_name, idx) = RTE_STR(d);\
+ 
+#define PMD_REGISTER_DRIVER(d, n)\
 void devinitfn_ ##d(void);\
 void __attribute__((constructor, used)) devinitfn_ ##d(void)\
 {\
-	rte_eal_driver_register(&d);\
-}
+        rte_eal_driver_register(&d);\
+}\
+DRIVER_EXPORT_NAME(n, __COUNTER__)
+
+#define DRIVER_REGISTER_PCI_TABLE(n, t) \
+static const char n##_pci_tbl_export[] __attribute__((used)) = RTE_STR(t)
+
+#define DRIVER_REGISTER_PARAM_STRING(n, s) \
+static const char n##_param_string_export[] __attribute__((used)) = s
 
 #ifdef __cplusplus
 }