get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/14507/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 14507,
    "url": "http://patches.dpdk.org/api/patches/14507/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1467594845-3487-2-git-send-email-thomas.monjalon@6wind.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1467594845-3487-2-git-send-email-thomas.monjalon@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1467594845-3487-2-git-send-email-thomas.monjalon@6wind.com",
    "date": "2016-07-04T01:13:59",
    "name": "[dpdk-dev,v9,1/7] drivers: export infos as string symbols",
    "commit_ref": null,
    "pull_url": null,
    "state": "rejected",
    "archived": true,
    "hash": "986074d2b0fd34432aa87a9350a509a2becac0a6",
    "submitter": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/people/1/?format=api",
        "name": "Thomas Monjalon",
        "email": "thomas.monjalon@6wind.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1467594845-3487-2-git-send-email-thomas.monjalon@6wind.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/14507/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/14507/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id AFE772C4A;\n\tMon,  4 Jul 2016 03:14:16 +0200 (CEST)",
            "from mail-wm0-f54.google.com (mail-wm0-f54.google.com\n\t[74.125.82.54]) by dpdk.org (Postfix) with ESMTP id D37992B93\n\tfor <dev@dpdk.org>; Mon,  4 Jul 2016 03:14:14 +0200 (CEST)",
            "by mail-wm0-f54.google.com with SMTP id f126so85734877wma.1\n\tfor <dev@dpdk.org>; Sun, 03 Jul 2016 18:14:14 -0700 (PDT)",
            "from XPS13.localdomain (184.203.134.77.rev.sfr.net.\n\t[77.134.203.184]) by smtp.gmail.com with ESMTPSA id\n\tl4sm5527127wjk.18.2016.07.03.18.14.13\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tSun, 03 Jul 2016 18:14:13 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=6wind-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=wNjxrdv1FgI2tojXEppAGj0LfiIdh3G0acwK1nDj3TU=;\n\tb=lq0OlUB7NwQtFXdoHCU68L80RiDozlY8ADsjMSFgcUcmESr6hmtNB1xN8qY2XeaSly\n\tmrUDdC0aCFHkhSw8fpQL4OQhDYFBsfCsHfqHlRqN1+m4+VLrelaK+m5Rb2BZDaYERZY3\n\t8FrQTEkN2KzH7yZZdtslB98Nc50BEzFd8P7c4INdscGxgsouAUnEZVOVpjYud7L1oJbA\n\tafWiFo/gA3A+4zgA4SOhkrRMpZxV3zA9JABPIKwb/1dnALpqzOnWVH7xdc24ox5TjE6e\n\t9YuoezAmcQ9QRk7SLRZ9roe7tuWsc3MB3BeFvJwA9wBvq1KL5e4E3LP5xRNNb7VDlXRV\n\tv6Rg==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20130820;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=wNjxrdv1FgI2tojXEppAGj0LfiIdh3G0acwK1nDj3TU=;\n\tb=gW6o9SOFSPJzORS0YvDZbKduFCVHMAcRUTOKoIwBxaGFHp3KWTYvOlKQNUeVPZ4vZj\n\tbBql1TMd/45+kAC7tdxa1Sg8cBvtbRoDkTUyrbRbxJdIxQqDpKw0zGe/80EWCPneMXtj\n\t1yMrd7uOTAUBgrUEF00A7+DehPkWVJakaQ6GJF6SrAe9grETd+FGAmrcM7mp9ebOWFTp\n\tfNiDFIIbLB9CtIFCDV8S9wgE2OacOw11gwt7ARXN/ZzoL/PVGhOfaLGXm6AXC71slj7X\n\tS03pnU0+N+ZR12yRm7Cm76A8T5DXECrmvEvj6tg2mcyxmpRJ2bHSs4yPnibF9jlqZoo9\n\toIcw==",
        "X-Gm-Message-State": "ALyK8tJy9RwcrOyPpOczSX+s2FNTATuLnTqYwxXFrmHQT4P4b7I3FnASWeRwAPLINbEKSJ05",
        "X-Received": "by 10.194.9.38 with SMTP id w6mr7660961wja.62.1467594854400;\n\tSun, 03 Jul 2016 18:14:14 -0700 (PDT)",
        "From": "Thomas Monjalon <thomas.monjalon@6wind.com>",
        "To": "Neil Horman <nhorman@tuxdriver.com>",
        "Cc": "dev@dpdk.org,\n\tPanu Matilainen <pmatilai@redhat.com>",
        "Date": "Mon,  4 Jul 2016 03:13:59 +0200",
        "Message-Id": "<1467594845-3487-2-git-send-email-thomas.monjalon@6wind.com>",
        "X-Mailer": "git-send-email 2.7.0",
        "In-Reply-To": "<1467594845-3487-1-git-send-email-thomas.monjalon@6wind.com>",
        "References": "<1466189185-21952-1-git-send-email-nhorman@tuxdriver.com>\n\t<1467594845-3487-1-git-send-email-thomas.monjalon@6wind.com>",
        "Subject": "[dpdk-dev] [PATCH v9 1/7] drivers: export infos as string symbols",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Neil Horman <nhorman@tuxdriver.com>\n\nModify the PMD_REGISTER_DRIVER macro, adding a name argument to it.  The\naddition of a name argument creates a token that can be used for subsequent\nmacros in the creation of unique symbol names to export additional bits of\ninformation for use by the dpdk-pmdinfogen tool.  For example:\n\n    RTE_REGISTER_DRIVER(ena, ena_driver);\nregisters the ena_driver struct as PMD_REGISTER_DRIVER did, and creates\na symbol\n    const char rte_pmd_name0[] __attribute__((used)) = \"ena\";\nwhich dpdk-pmdinfogen can search for and extract.  The subsequent macro\n    RTE_EXPORT_PCI_TABLE(ena, ena_pci_id_map);\ncreates a symbol\n    const char ena_pci_table_export[] __attribute__((used)) = \"ena_pci_id_map\";\nWhich allows dpdk-pmdinfogen to find the pci table of this driver.\n\nUsing this pattern, we can export arbitrary bits of information.\n\ndpdk-pmdinfo uses this information to extract hardware support from an object\nfile and create a json string to make hardware support info discoverable\nlater.\n\nSigned-off-by: Neil Horman <nhorman@tuxdriver.com>\nAcked-by: Panu Matilainen <pmatilai@redhat.com>\nAcked-by: Remy Horton <remy.horton@intel.com>\nSigned-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>\n---\n doc/guides/prog_guide/dev_kit_build_system.rst | 19 ++++++++++++++++\n drivers/crypto/aesni_gcm/aesni_gcm_pmd.c       |  4 +++-\n drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c     |  4 +++-\n drivers/crypto/kasumi/rte_kasumi_pmd.c         |  4 +++-\n drivers/crypto/null/null_crypto_pmd.c          |  4 +++-\n drivers/crypto/qat/rte_qat_cryptodev.c         |  3 ++-\n drivers/crypto/snow3g/rte_snow3g_pmd.c         |  4 +++-\n drivers/net/af_packet/rte_eth_af_packet.c      |  4 +++-\n drivers/net/bnx2x/bnx2x_ethdev.c               |  6 ++++--\n drivers/net/bnxt/bnxt_ethdev.c                 |  3 ++-\n drivers/net/bonding/rte_eth_bond_pmd.c         |  5 ++++-\n drivers/net/cxgbe/cxgbe_ethdev.c               |  3 ++-\n drivers/net/e1000/em_ethdev.c                  |  3 ++-\n drivers/net/e1000/igb_ethdev.c                 |  6 ++++--\n drivers/net/ena/ena_ethdev.c                   |  3 ++-\n drivers/net/enic/enic_ethdev.c                 |  3 ++-\n drivers/net/fm10k/fm10k_ethdev.c               |  3 ++-\n drivers/net/i40e/i40e_ethdev.c                 |  3 ++-\n drivers/net/i40e/i40e_ethdev_vf.c              |  3 ++-\n drivers/net/ixgbe/ixgbe_ethdev.c               |  6 ++++--\n drivers/net/mlx4/mlx4.c                        |  3 ++-\n drivers/net/mlx5/mlx5.c                        |  3 ++-\n drivers/net/mpipe/mpipe_tilegx.c               |  4 ++--\n drivers/net/nfp/nfp_net.c                      |  3 ++-\n drivers/net/null/rte_eth_null.c                |  3 ++-\n drivers/net/pcap/rte_eth_pcap.c                |  4 +++-\n drivers/net/qede/qede_ethdev.c                 |  6 ++++--\n drivers/net/ring/rte_eth_ring.c                |  3 ++-\n drivers/net/szedata2/rte_eth_szedata2.c        |  3 ++-\n drivers/net/thunderx/nicvf_ethdev.c            |  3 ++-\n drivers/net/vhost/rte_eth_vhost.c              |  3 ++-\n drivers/net/virtio/virtio_ethdev.c             |  3 ++-\n drivers/net/virtio/virtio_user_ethdev.c        |  2 +-\n drivers/net/vmxnet3/vmxnet3_ethdev.c           |  3 ++-\n drivers/net/xenvirt/rte_eth_xenvirt.c          |  2 +-\n lib/librte_eal/common/eal_common_dev.c         |  2 +-\n lib/librte_eal/common/include/rte_dev.h        | 30 ++++++++++++++++++++------\n 37 files changed, 127 insertions(+), 46 deletions(-)",
    "diff": "diff --git a/doc/guides/prog_guide/dev_kit_build_system.rst b/doc/guides/prog_guide/dev_kit_build_system.rst\nindex 3e89eae..f3a4bff 100644\n--- a/doc/guides/prog_guide/dev_kit_build_system.rst\n+++ b/doc/guides/prog_guide/dev_kit_build_system.rst\n@@ -304,6 +304,25 @@ Misc\n \n *   rte.subdir.mk: Build several directories in the development kit framework.\n \n+.. _Internally_Generated_Build_Tools:\n+\n+Internally Generated Build Tools\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+These well known symbol names are defined by various macros and used to export\n+important information about hardware support and usage for PMD files.  For\n+instance the macro:\n+\n+.. code-block:: c\n+\n+   RTE_REGISTER_DRIVER(drv, name)\n+\n+Creates the following symbol:\n+\n+.. code-block:: c\n+\n+   static char rte_pmd_name0[] __attribute__((used)) = \"<name>\";\n+\n .. _Useful_Variables_Provided_by_the_Build_System:\n \n Useful Variables Provided by the Build System\ndiff --git a/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c b/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c\nindex 2987ef6..3e13eae 100644\n--- a/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c\n+++ b/drivers/crypto/aesni_gcm/aesni_gcm_pmd.c\n@@ -521,4 +521,6 @@ static struct rte_driver aesni_gcm_pmd_drv = {\n \t.uninit = aesni_gcm_uninit\n };\n \n-PMD_REGISTER_DRIVER(aesni_gcm_pmd_drv);\n+RTE_REGISTER_DRIVER(aesni_gcm, aesni_gcm_pmd_drv);\n+RTE_EXPORT_PARAM_STRING(aesni_gcm, \"max_nb_queue_pairs=<int> \"\n+\"max_nb_sessions=<int> socket_id=<int>\");\ndiff --git a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c\nindex 6554fc4..2afc2bb 100644\n--- a/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c\n+++ b/drivers/crypto/aesni_mb/rte_aesni_mb_pmd.c\n@@ -721,4 +721,6 @@ static struct rte_driver cryptodev_aesni_mb_pmd_drv = {\n \t.uninit = cryptodev_aesni_mb_uninit\n };\n \n-PMD_REGISTER_DRIVER(cryptodev_aesni_mb_pmd_drv);\n+RTE_REGISTER_DRIVER(aesni_mb, cryptodev_aesni_mb_pmd_drv);\n+RTE_EXPORT_PARAM_STRING(aesni_gcm, \"max_nb_queue_pairs=<int> \"\n+\"max_nb_sessions=<int> socket_id=<int>\");\ndiff --git a/drivers/crypto/kasumi/rte_kasumi_pmd.c b/drivers/crypto/kasumi/rte_kasumi_pmd.c\nindex 5f8c7a2..3dda257 100644\n--- a/drivers/crypto/kasumi/rte_kasumi_pmd.c\n+++ b/drivers/crypto/kasumi/rte_kasumi_pmd.c\n@@ -654,4 +654,6 @@ static struct rte_driver cryptodev_kasumi_pmd_drv = {\n \t.uninit = cryptodev_kasumi_uninit\n };\n \n-PMD_REGISTER_DRIVER(cryptodev_kasumi_pmd_drv);\n+RTE_REGISTER_DRIVER(kasumi, cryptodev_kasumi_pmd_drv);\n+RTE_EXPORT_PARAM_STRING(kasumi, \"max_nb_queue_pairs=<int> \"\n+\"max_nb_sessions=<int> socket_id=<int>\");\ndiff --git a/drivers/crypto/null/null_crypto_pmd.c b/drivers/crypto/null/null_crypto_pmd.c\nindex bdaf13c..003dce7 100644\n--- a/drivers/crypto/null/null_crypto_pmd.c\n+++ b/drivers/crypto/null/null_crypto_pmd.c\n@@ -275,4 +275,6 @@ static struct rte_driver cryptodev_null_pmd_drv = {\n \t.uninit = cryptodev_null_uninit\n };\n \n-PMD_REGISTER_DRIVER(cryptodev_null_pmd_drv);\n+RTE_REGISTER_DRIVER(cryptodev_null_pmd, cryptodev_null_pmd_drv);\n+RTE_EXPORT_PARAM_STRING(aesni_gcm, \"max_nb_queue_pairs=<int> \"\n+\"max_nb_sessions=<int> socket_id=<int>\");\ndiff --git a/drivers/crypto/qat/rte_qat_cryptodev.c b/drivers/crypto/qat/rte_qat_cryptodev.c\nindex f46ec85..d9cd10a 100644\n--- a/drivers/crypto/qat/rte_qat_cryptodev.c\n+++ b/drivers/crypto/qat/rte_qat_cryptodev.c\n@@ -134,4 +134,5 @@ static struct rte_driver pmd_qat_drv = {\n \t.init = rte_qat_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(pmd_qat_drv);\n+RTE_REGISTER_DRIVER(qat, pmd_qat_drv);\n+RTE_EXPORT_PCI_TABLE(qat, pci_id_qat_map);\ndiff --git a/drivers/crypto/snow3g/rte_snow3g_pmd.c b/drivers/crypto/snow3g/rte_snow3g_pmd.c\nindex dc8de6b..e531408 100644\n--- a/drivers/crypto/snow3g/rte_snow3g_pmd.c\n+++ b/drivers/crypto/snow3g/rte_snow3g_pmd.c\n@@ -645,4 +645,6 @@ static struct rte_driver cryptodev_snow3g_pmd_drv = {\n \t.uninit = cryptodev_snow3g_uninit\n };\n \n-PMD_REGISTER_DRIVER(cryptodev_snow3g_pmd_drv);\n+RTE_REGISTER_DRIVER(snow3g, cryptodev_snow3g_pmd_drv);\n+RTE_EXPORT_PARAM_STRING(aesni_gcm, \"max_nb_queue_pairs=<int> \"\n+\"max_nb_sessions=<int> socket_id=<int>\");\ndiff --git a/drivers/net/af_packet/rte_eth_af_packet.c b/drivers/net/af_packet/rte_eth_af_packet.c\nindex 2d7f344..9a9547c 100644\n--- a/drivers/net/af_packet/rte_eth_af_packet.c\n+++ b/drivers/net/af_packet/rte_eth_af_packet.c\n@@ -896,4 +896,6 @@ static struct rte_driver pmd_af_packet_drv = {\n \t.uninit = rte_pmd_af_packet_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_af_packet_drv);\n+RTE_REGISTER_DRIVER(eth_af_packet, pmd_af_packet_drv);\n+RTE_EXPORT_PARAM_STRING(eth_af_packet, \"iface=<string> \"\n+\"qpairs=<int> blocksz=<int> framesz=<int> framecnt=<int>\");\ndiff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c\nindex 3ff57c4..ec0d88d 100644\n--- a/drivers/net/bnx2x/bnx2x_ethdev.c\n+++ b/drivers/net/bnx2x/bnx2x_ethdev.c\n@@ -566,5 +566,7 @@ static struct rte_driver rte_bnx2xvf_driver = {\n \t.init = rte_bnx2xvf_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_bnx2x_driver);\n-PMD_REGISTER_DRIVER(rte_bnx2xvf_driver);\n+RTE_REGISTER_DRIVER(bnx2x,rte_bnx2x_driver);\n+RTE_EXPORT_PCI_TABLE(bnx2x, pci_id_bnx2x_map);\n+RTE_REGISTER_DRIVER(bnx2xvf, rte_bnx2xvf_driver);\n+RTE_EXPORT_PCI_TABLE(bnx2xvf, pci_id_bnx2xvf_map);\ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex 406e38a..2e0801f 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -1046,4 +1046,5 @@ static struct rte_driver bnxt_pmd_drv = {\n \t.init = bnxt_rte_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(bnxt_pmd_drv);\n+RTE_REGISTER_DRIVER(bnxt, bnxt_pmd_drv);\n+RTE_EXPORT_PCI_TABLE(bnxt, bnxt_pci_id_map);\ndiff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c\nindex 9a2518f..579e67e 100644\n--- a/drivers/net/bonding/rte_eth_bond_pmd.c\n+++ b/drivers/net/bonding/rte_eth_bond_pmd.c\n@@ -2515,4 +2515,7 @@ static struct rte_driver bond_drv = {\n \t.uninit = bond_uninit,\n };\n \n-PMD_REGISTER_DRIVER(bond_drv);\n+RTE_REGISTER_DRIVER(bonding, bond_drv);\n+RTE_EXPORT_PARAM_STRING(bonding, \"slave=<ifc> primary=<ifc> mode=[0-4] \"\n+\"xmit_policy=[l2 | l23 | l34] socket_id=<int> mac=<mac addr> \"\n+\"lsc_poll_period_ms=<int> up_delay=<int> down_delay=<int>\");\ndiff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c\nindex 6c130ed..7e12617 100644\n--- a/drivers/net/cxgbe/cxgbe_ethdev.c\n+++ b/drivers/net/cxgbe/cxgbe_ethdev.c\n@@ -1061,4 +1061,5 @@ static struct rte_driver rte_cxgbe_driver = {\n \t.init = rte_cxgbe_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_cxgbe_driver);\n+RTE_REGISTER_DRIVER(cxgb4, rte_cxgbe_driver);\n+RTE_EXPORT_PCI_TABLE(cxgb4, cxgb4_pci_tbl);\ndiff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c\nindex 653be09..d0a104e 100644\n--- a/drivers/net/e1000/em_ethdev.c\n+++ b/drivers/net/e1000/em_ethdev.c\n@@ -1777,4 +1777,5 @@ struct rte_driver em_pmd_drv = {\n \t.init = rte_em_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(em_pmd_drv);\n+RTE_REGISTER_DRIVER(em, em_pmd_drv);\n+RTE_EXPORT_PCI_TABLE(em, pci_id_em_map);\ndiff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c\nindex 5067d20..164aae5 100644\n--- a/drivers/net/e1000/igb_ethdev.c\n+++ b/drivers/net/e1000/igb_ethdev.c\n@@ -5210,5 +5210,7 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev)\n \tE1000_WRITE_FLUSH(hw);\n }\n \n-PMD_REGISTER_DRIVER(pmd_igb_drv);\n-PMD_REGISTER_DRIVER(pmd_igbvf_drv);\n+RTE_REGISTER_DRIVER(igb, pmd_igb_drv);\n+RTE_EXPORT_PCI_TABLE(igb, pci_id_igb_map);\n+RTE_REGISTER_DRIVER(igbvf, pmd_igbvf_drv);\n+RTE_EXPORT_PCI_TABLE(igbvf, pci_id_igbvf_map);\ndiff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c\nindex e157587..82ade83 100644\n--- a/drivers/net/ena/ena_ethdev.c\n+++ b/drivers/net/ena/ena_ethdev.c\n@@ -1450,4 +1450,5 @@ struct rte_driver ena_pmd_drv = {\n \t.init = rte_ena_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(ena_pmd_drv);\n+RTE_REGISTER_DRIVER(ena, ena_pmd_drv);\n+RTE_EXPORT_PCI_TABLE(ena, pci_id_ena_map);\ndiff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c\nindex a7ce064..4e62282 100644\n--- a/drivers/net/enic/enic_ethdev.c\n+++ b/drivers/net/enic/enic_ethdev.c\n@@ -636,4 +636,5 @@ static struct rte_driver rte_enic_driver = {\n \t.init = rte_enic_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_enic_driver);\n+RTE_REGISTER_DRIVER(enic, rte_enic_driver);\n+RTE_EXPORT_PCI_TABLE(enic, pci_id_enic_map);\ndiff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c\nindex eb77705..62f7d41 100644\n--- a/drivers/net/fm10k/fm10k_ethdev.c\n+++ b/drivers/net/fm10k/fm10k_ethdev.c\n@@ -3086,4 +3086,5 @@ static struct rte_driver rte_fm10k_driver = {\n \t.init = rte_pmd_fm10k_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_fm10k_driver);\n+RTE_REGISTER_DRIVER(fm10k, rte_fm10k_driver);\n+RTE_EXPORT_PCI_TABLE(fm10k, pci_id_fm10k_map);\ndiff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c\nindex f414d93..8fc0852 100644\n--- a/drivers/net/i40e/i40e_ethdev.c\n+++ b/drivers/net/i40e/i40e_ethdev.c\n@@ -705,7 +705,8 @@ static struct rte_driver rte_i40e_driver = {\n \t.init = rte_i40e_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_i40e_driver);\n+RTE_REGISTER_DRIVER(i40e, rte_i40e_driver);\n+RTE_EXPORT_PCI_TABLE(i40e, pci_id_i40e_map);\n \n /*\n  * Initialize registers for flexible payload, which should be set by NVM.\ndiff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c\nindex 7b6df1d..27b7b57 100644\n--- a/drivers/net/i40e/i40e_ethdev_vf.c\n+++ b/drivers/net/i40e/i40e_ethdev_vf.c\n@@ -1581,7 +1581,8 @@ static struct rte_driver rte_i40evf_driver = {\n \t.init = rte_i40evf_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_i40evf_driver);\n+RTE_REGISTER_DRIVER(i40evf, rte_i40evf_driver);\n+RTE_EXPORT_PCI_TABLE(i40evf, pci_id_i40evf_map);\n \n static int\n i40evf_dev_configure(struct rte_eth_dev *dev)\ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c\nindex 0629b42..014b972 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.c\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.c\n@@ -7352,5 +7352,7 @@ static struct rte_driver rte_ixgbevf_driver = {\n \t.init = rte_ixgbevf_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_ixgbe_driver);\n-PMD_REGISTER_DRIVER(rte_ixgbevf_driver);\n+RTE_REGISTER_DRIVER(ixgbe, rte_ixgbe_driver);\n+RTE_EXPORT_PCI_TABLE(ixgbe, pci_id_ixgbe_map);\n+RTE_REGISTER_DRIVER(ixgbevf, rte_ixgbevf_driver);\n+RTE_EXPORT_PCI_TABLE(ixgbevf, pci_id_ixgbevf_map);\ndiff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c\nindex f8ed42b..1681fc3 100644\n--- a/drivers/net/mlx4/mlx4.c\n+++ b/drivers/net/mlx4/mlx4.c\n@@ -5861,4 +5861,5 @@ static struct rte_driver rte_mlx4_driver = {\n \t.init = rte_mlx4_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_mlx4_driver)\n+RTE_REGISTER_DRIVER(mlx4, rte_mlx4_driver);\n+RTE_EXPORT_PCI_TABLE(mlx4, mlx4_pci_id_map);\ndiff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c\nindex 5aa4adc..5f4186a 100644\n--- a/drivers/net/mlx5/mlx5.c\n+++ b/drivers/net/mlx5/mlx5.c\n@@ -762,4 +762,5 @@ static struct rte_driver rte_mlx5_driver = {\n \t.init = rte_mlx5_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_mlx5_driver)\n+RTE_REGISTER_DRIVER(mlx5, rte_mlx5_driver);\n+RTE_EXPORT_PCI_TABLE(mlx5, mlx5_pci_id_map);\ndiff --git a/drivers/net/mpipe/mpipe_tilegx.c b/drivers/net/mpipe/mpipe_tilegx.c\nindex 26e1424..94f71ad 100644\n--- a/drivers/net/mpipe/mpipe_tilegx.c\n+++ b/drivers/net/mpipe/mpipe_tilegx.c\n@@ -1635,8 +1635,8 @@ static struct rte_driver pmd_mpipe_gbe_drv = {\n \t.init = rte_pmd_mpipe_devinit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_mpipe_xgbe_drv);\n-PMD_REGISTER_DRIVER(pmd_mpipe_gbe_drv);\n+RTE_REGISTER_DRIVER(mpipe_xgbe, pmd_mpipe_xgbe_drv);\n+RTE_REGISTER_DRIVER(mpipe_gbe, pmd_mpipe_gbe_drv);\n \n static void __attribute__((constructor, used))\n mpipe_init_contexts(void)\ndiff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c\nindex 6afd49b..de0f961 100644\n--- a/drivers/net/nfp/nfp_net.c\n+++ b/drivers/net/nfp/nfp_net.c\n@@ -2486,7 +2486,8 @@ static struct rte_driver rte_nfp_net_driver = {\n \t.init = nfp_net_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_nfp_net_driver);\n+RTE_REGISTER_DRIVER(nfp, rte_nfp_net_driver);\n+RTE_EXPORT_PCI_TABLE(nfp, pci_id_nfp_net_map);\n \n /*\n  * Local variables:\ndiff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c\nindex ab440f3..e22b5c3 100644\n--- a/drivers/net/null/rte_eth_null.c\n+++ b/drivers/net/null/rte_eth_null.c\n@@ -693,4 +693,5 @@ static struct rte_driver pmd_null_drv = {\n \t.uninit = rte_pmd_null_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_null_drv);\n+RTE_REGISTER_DRIVER(eth_null, pmd_null_drv);\n+RTE_EXPORT_PARAM_STRING(eth_null, \"size=<int> copy=<int>\");\ndiff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c\nindex c86f17b..2dd536e 100644\n--- a/drivers/net/pcap/rte_eth_pcap.c\n+++ b/drivers/net/pcap/rte_eth_pcap.c\n@@ -1090,4 +1090,6 @@ static struct rte_driver pmd_pcap_drv = {\n \t.uninit = rte_pmd_pcap_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_pcap_drv);\n+RTE_REGISTER_DRIVER(pcap, pmd_pcap_drv);\n+RTE_EXPORT_PARAM_STRING(pcap, \"rx_pcap=<string> tx_pcap=<string> \"\n+\"rx_iface=<ifc> tx_iface=<ifc> iface=<ifc>\");\ndiff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c\nindex bb531be..bc07b99 100644\n--- a/drivers/net/qede/qede_ethdev.c\n+++ b/drivers/net/qede/qede_ethdev.c\n@@ -1340,5 +1340,7 @@ static struct rte_driver rte_qede_driver = {\n \t.init = rte_qedevf_pmd_init\n };\n \n-PMD_REGISTER_DRIVER(rte_qede_driver);\n-PMD_REGISTER_DRIVER(rte_qedevf_driver);\n+RTE_REGISTER_DRIVER(qede, rte_qede_driver);\n+RTE_EXPORT_PCI_TABLE(qede, pci_id_qede_map);\n+RTE_REGISTER_DRIVER(qedevf, rte_qedevf_driver);\n+RTE_EXPORT_PCI_TABLE(qedevf, pci_id_qedevf_map);\ndiff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c\nindex b1783c3..7a11d78 100644\n--- a/drivers/net/ring/rte_eth_ring.c\n+++ b/drivers/net/ring/rte_eth_ring.c\n@@ -630,4 +630,5 @@ static struct rte_driver pmd_ring_drv = {\n \t.uninit = rte_pmd_ring_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_ring_drv);\n+RTE_REGISTER_DRIVER(eth_ring, pmd_ring_drv);\n+RTE_EXPORT_PARAM_STRING(eth_ring, \"nodeaction=[attach|detach]\");\ndiff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c\nindex 985a8d6..d8564d9 100644\n--- a/drivers/net/szedata2/rte_eth_szedata2.c\n+++ b/drivers/net/szedata2/rte_eth_szedata2.c\n@@ -1601,4 +1601,5 @@ static struct rte_driver rte_szedata2_driver = {\n \t.uninit = rte_szedata2_uninit,\n };\n \n-PMD_REGISTER_DRIVER(rte_szedata2_driver);\n+RTE_REGISTER_DRIVER(rte_szedata2_pmd, rte_szedata2_driver);\n+RTE_EXPORT_PCI_TABLE(rte_szedata2_pmd, rte_szedata2_pci_id_table);\ndiff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c\nindex 48ed381..4593251 100644\n--- a/drivers/net/thunderx/nicvf_ethdev.c\n+++ b/drivers/net/thunderx/nicvf_ethdev.c\n@@ -1788,4 +1788,5 @@ static struct rte_driver rte_nicvf_driver = {\n \t.init = rte_nicvf_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_nicvf_driver);\n+RTE_REGISTER_DRIVER(thunderx_nicvf, rte_nicvf_driver);\n+RTE_EXPORT_PCI_TABLE(thunderx_nicvf, pci_id_nicvf_map);\ndiff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c\nindex c5bbb87..ea3a248 100644\n--- a/drivers/net/vhost/rte_eth_vhost.c\n+++ b/drivers/net/vhost/rte_eth_vhost.c\n@@ -921,4 +921,5 @@ static struct rte_driver pmd_vhost_drv = {\n \t.uninit = rte_pmd_vhost_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_vhost_drv);\n+RTE_REGISTER_DRIVER(eth_vhost, pmd_vhost_drv);\n+RTE_EXPORT_PARAM_STRING(eth_vhost, \"iface=<ifc> queues=<int>\");\ndiff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c\nindex 480daa3..a884d77 100644\n--- a/drivers/net/virtio/virtio_ethdev.c\n+++ b/drivers/net/virtio/virtio_ethdev.c\n@@ -1571,4 +1571,5 @@ static struct rte_driver rte_virtio_driver = {\n \t.init = rte_virtio_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_virtio_driver);\n+RTE_REGISTER_DRIVER(virtio_net, rte_virtio_driver);\n+RTE_EXPORT_PCI_TABLE(virtio_net, pci_id_virtio_map);\ndiff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c\nindex 5ab2471..587de75 100644\n--- a/drivers/net/virtio/virtio_user_ethdev.c\n+++ b/drivers/net/virtio/virtio_user_ethdev.c\n@@ -437,4 +437,4 @@ static struct rte_driver virtio_user_driver = {\n \t.uninit = virtio_user_pmd_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(virtio_user_driver);\n+RTE_REGISTER_DRIVER(virtio_user, virtio_user_driver);\ndiff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c\nindex 29b469c..be4c404 100644\n--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c\n+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c\n@@ -954,4 +954,5 @@ static struct rte_driver rte_vmxnet3_driver = {\n \t.init = rte_vmxnet3_pmd_init,\n };\n \n-PMD_REGISTER_DRIVER(rte_vmxnet3_driver);\n+RTE_REGISTER_DRIVER(vmxnet3, rte_vmxnet3_driver);\n+RTE_EXPORT_PCI_TABLE(vmxnet3, pci_id_vmxnet3_map);\ndiff --git a/drivers/net/xenvirt/rte_eth_xenvirt.c b/drivers/net/xenvirt/rte_eth_xenvirt.c\nindex 3e45808..f28f5f0 100644\n--- a/drivers/net/xenvirt/rte_eth_xenvirt.c\n+++ b/drivers/net/xenvirt/rte_eth_xenvirt.c\n@@ -766,4 +766,4 @@ static struct rte_driver pmd_xenvirt_drv = {\n \t.uninit = rte_pmd_xenvirt_devuninit,\n };\n \n-PMD_REGISTER_DRIVER(pmd_xenvirt_drv);\n+RTE_REGISTER_DRIVER(xenvirt, pmd_xenvirt_drv);\ndiff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c\nindex a8a4146..707e875 100644\n--- a/lib/librte_eal/common/eal_common_dev.c\n+++ b/lib/librte_eal/common/eal_common_dev.c\n@@ -98,7 +98,7 @@ rte_eal_dev_init(void)\n \t/*\n \t * Note that the dev_driver_list is populated here\n \t * from calls made to rte_eal_driver_register from constructor functions\n-\t * embedded into PMD modules via the PMD_REGISTER_DRIVER macro\n+\t * embedded into PMD modules via the RTE_REGISTER_DRIVER macro\n \t */\n \n \t/* call the init function for each virtual device */\ndiff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h\nindex f1b5507..1aa7656 100644\n--- a/lib/librte_eal/common/include/rte_dev.h\n+++ b/lib/librte_eal/common/include/rte_dev.h\n@@ -48,7 +48,7 @@ extern \"C\" {\n \n #include <stdio.h>\n #include <sys/queue.h>\n-\n+#include <rte_pci.h>\n #include <rte_log.h>\n \n __attribute__((format(printf, 2, 0)))\n@@ -178,12 +178,30 @@ int rte_eal_vdev_init(const char *name, const char *args);\n  */\n int rte_eal_vdev_uninit(const char *name);\n \n-#define PMD_REGISTER_DRIVER(d)\\\n-void devinitfn_ ##d(void);\\\n-void __attribute__((constructor, used)) devinitfn_ ##d(void)\\\n+#define _RTE_EXPORT_DRIVER_NAME(name, index) name##index[]\n+\n+#define RTE_EXPORT_DRIVER_NAME(name, index) \\\n+static const char _RTE_EXPORT_DRIVER_NAME(rte_pmd_name, index) \\\n+__attribute__((used)) = RTE_STR(name)\n+\n+#define RTE_REGISTER_DRIVER(_name, driver)\\\n+void devinitfn_ ##driver(void);\\\n+void __attribute__((constructor, used)) devinitfn_ ##driver(void)\\\n {\\\n-\trte_eal_driver_register(&d);\\\n-}\n+\t(driver).name = RTE_STR(_name);\\\n+\trte_eal_driver_register(&driver);\\\n+} \\\n+RTE_EXPORT_DRIVER_NAME(_name, __COUNTER__)\n+\n+#define _RTE_EXPORT_TAG(name, tag) __##name##_##tag\n+\n+#define RTE_EXPORT_PCI_TABLE(name, table) \\\n+static const char _RTE_EXPORT_TAG(name, pci_table_export)[] \\\n+__attribute__((used)) = RTE_STR(table)\n+\n+#define RTE_EXPORT_PARAM_STRING(name, str) \\\n+static const char _RTE_EXPORT_TAG(name, param_string_export)[] \\\n+__attribute__((used)) = str\n \n #ifdef __cplusplus\n }\n",
    "prefixes": [
        "dpdk-dev",
        "v9",
        "1/7"
    ]
}