@@ -269,6 +269,7 @@ struct opt_tag {
static const struct opt_tag opt_tags[] = {
{"_param_string_export", "params"},
+ {"_kmod_dep_export", "kmod"},
};
static int complete_pmd_entry(struct elf_info *info, struct pmd_driver *drv)
@@ -85,6 +85,7 @@ else \
enum opt_params {
PMD_PARAM_STRING = 0,
+ PMD_KMOD_DEP,
PMD_OPT_MAX
};
@@ -667,5 +667,7 @@ static struct rte_driver rte_bnx2xvf_driver = {
PMD_REGISTER_DRIVER(rte_bnx2x_driver, bnx2x);
DRIVER_REGISTER_PCI_TABLE(bnx2x, pci_id_bnx2x_map);
+DRIVER_REGISTER_KMOD_DEP(bnx2x, "* igb_uio | uio_pci_generic | vfio");
PMD_REGISTER_DRIVER(rte_bnx2xvf_driver, bnx2xvf);
DRIVER_REGISTER_PCI_TABLE(bnx2xvf, pci_id_bnx2xvf_map);
+DRIVER_REGISTER_KMOD_DEP(bnx2xvf, "* igb_uio | uio_pci_generic | vfio");
@@ -1068,3 +1068,4 @@ static struct rte_driver bnxt_pmd_drv = {
PMD_REGISTER_DRIVER(bnxt_pmd_drv, bnxt);
DRIVER_REGISTER_PCI_TABLE(bnxt, bnxt_pci_id_map);
+DRIVER_REGISTER_KMOD_DEP(bnxt, "* igb_uio | uio_pci_generic | vfio");
@@ -1068,4 +1068,5 @@ static struct rte_driver rte_cxgbe_driver = {
PMD_REGISTER_DRIVER(rte_cxgbe_driver, cxgb4);
DRIVER_REGISTER_PCI_TABLE(cxgb4, cxgb4_pci_tbl);
+DRIVER_REGISTER_KMOD_DEP(cxgb4, "* igb_uio | uio_pci_generic | vfio");
@@ -1806,3 +1806,4 @@ struct rte_driver em_pmd_drv = {
PMD_REGISTER_DRIVER(em_pmd_drv, em);
DRIVER_REGISTER_PCI_TABLE(em, pci_id_em_map);
+DRIVER_REGISTER_KMOD_DEP(em, "* igb_uio | uio_pci_generic | vfio");
@@ -5257,5 +5257,7 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev)
PMD_REGISTER_DRIVER(pmd_igb_drv, igb);
DRIVER_REGISTER_PCI_TABLE(igb, pci_id_igb_map);
+DRIVER_REGISTER_KMOD_DEP(igb, "* igb_uio | uio_pci_generic | vfio");
PMD_REGISTER_DRIVER(pmd_igbvf_drv, igbvf);
DRIVER_REGISTER_PCI_TABLE(igbvf, pci_id_igbvf_map);
+DRIVER_REGISTER_KMOD_DEP(igbvf, "* igb_uio | uio_pci_generic | vfio");
@@ -1709,3 +1709,4 @@ struct rte_driver ena_pmd_drv = {
PMD_REGISTER_DRIVER(ena_pmd_drv, ena);
DRIVER_REGISTER_PCI_TABLE(ena, pci_id_ena_map);
+DRIVER_REGISTER_KMOD_DEP(ena, "* igb_uio | uio_pci_generic | vfio");
@@ -642,3 +642,4 @@ static struct rte_driver rte_enic_driver = {
PMD_REGISTER_DRIVER(rte_enic_driver, enic);
DRIVER_REGISTER_PCI_TABLE(enic, pci_id_enic_map);
+DRIVER_REGISTER_KMOD_DEP(enic, "* igb_uio | uio_pci_generic | vfio");
@@ -3086,3 +3086,4 @@ static struct rte_driver rte_fm10k_driver = {
PMD_REGISTER_DRIVER(rte_fm10k_driver, fm10k);
DRIVER_REGISTER_PCI_TABLE(fm10k, pci_id_fm10k_map);
+DRIVER_REGISTER_KMOD_DEP(fm10k, "* igb_uio | uio_pci_generic | vfio");
@@ -723,6 +723,7 @@ static struct rte_driver rte_i40e_driver = {
PMD_REGISTER_DRIVER(rte_i40e_driver, i40e);
DRIVER_REGISTER_PCI_TABLE(i40e, pci_id_i40e_map);
+DRIVER_REGISTER_KMOD_DEP(i40e, "* igb_uio | uio_pci_generic | vfio");
/*
* Initialize registers for flexible payload, which should be set by NVM.
@@ -1586,6 +1586,7 @@ static struct rte_driver rte_i40evf_driver = {
PMD_REGISTER_DRIVER(rte_i40evf_driver, i40evf);
DRIVER_REGISTER_PCI_TABLE(i40evf, pci_id_i40evf_map);
+DRIVER_REGISTER_KMOD_DEP(i40evf, "* igb_uio | uio_pci_generic | vfio");
static int
i40evf_dev_configure(struct rte_eth_dev *dev)
@@ -7421,5 +7421,7 @@ static struct rte_driver rte_ixgbevf_driver = {
PMD_REGISTER_DRIVER(rte_ixgbe_driver, ixgbe);
DRIVER_REGISTER_PCI_TABLE(ixgbe, pci_id_ixgbe_map);
+DRIVER_REGISTER_KMOD_DEP(ixgbe, "* igb_uio | uio_pci_generic | vfio");
PMD_REGISTER_DRIVER(rte_ixgbevf_driver, ixgbevf);
DRIVER_REGISTER_PCI_TABLE(ixgbevf, pci_id_ixgbevf_map);
+DRIVER_REGISTER_KMOD_DEP(ixgbevf, "* igb_uio | uio_pci_generic | vfio");
@@ -5948,3 +5948,4 @@ static struct rte_driver rte_mlx4_driver = {
PMD_REGISTER_DRIVER(rte_mlx4_driver, mlx4);
DRIVER_REGISTER_PCI_TABLE(mlx4, mlx4_pci_id_map);
+DRIVER_REGISTER_KMOD_DEP(mlx4, "* ib_uverbs & mlx4_en & mlx4_ib");
@@ -763,3 +763,4 @@ static struct rte_driver rte_mlx5_driver = {
PMD_REGISTER_DRIVER(rte_mlx5_driver, mlx5);
DRIVER_REGISTER_PCI_TABLE(mlx5, mlx5_pci_id_map);
+DRIVER_REGISTER_KMOD_DEP(mlx5, "* ib_uverbs & mlx5_ib");
@@ -2488,6 +2488,7 @@ static struct rte_driver rte_nfp_net_driver = {
PMD_REGISTER_DRIVER(rte_nfp_net_driver, nfp);
DRIVER_REGISTER_PCI_TABLE(nfp, pci_id_nfp_net_map);
+DRIVER_REGISTER_KMOD_DEP(nfp, "* igb_uio | uio_pci_generic | vfio");
/*
* Local variables:
@@ -1530,5 +1530,7 @@ static struct rte_driver rte_qede_driver = {
PMD_REGISTER_DRIVER(rte_qede_driver, qede);
DRIVER_REGISTER_PCI_TABLE(qede, pci_id_qede_map);
+DRIVER_REGISTER_KMOD_DEP(qede, "* igb_uio | uio_pci_generic | vfio");
PMD_REGISTER_DRIVER(rte_qedevf_driver, qedevf);
DRIVER_REGISTER_PCI_TABLE(qedevf, pci_id_qedevf_map);
+DRIVER_REGISTER_KMOD_DEP(qedevf, "* igb_uio | uio_pci_generic | vfio");
@@ -1602,3 +1602,5 @@ static struct rte_driver rte_szedata2_driver = {
PMD_REGISTER_DRIVER(rte_szedata2_driver, RTE_SZEDATA2_DRIVER_NAME);
DRIVER_REGISTER_PCI_TABLE(RTE_SZEDATA2_DRIVER_NAME, rte_szedata2_pci_id_table);
+DRIVER_REGISTER_KMOD_DEP(RTE_SZEDATA2_DRIVER_NAME,
+ "* combo6core & combov3 & szedata2 & szedata2_cv3");
@@ -1785,3 +1785,4 @@ static struct rte_driver rte_nicvf_driver = {
PMD_REGISTER_DRIVER(rte_nicvf_driver, thunderx_nicvf);
DRIVER_REGISTER_PCI_TABLE(thunderx_nicvf, pci_id_nicvf_map);
+DRIVER_REGISTER_KMOD_DEP(thunderx_nicvf, "* igb_uio | uio_pci_generic | vfio");
@@ -1570,3 +1570,4 @@ static struct rte_driver rte_virtio_driver = {
PMD_REGISTER_DRIVER(rte_virtio_driver, virtio_net);
DRIVER_REGISTER_PCI_TABLE(virtio_net, pci_id_virtio_map);
+DRIVER_REGISTER_KMOD_DEP(virtio_net, "* igb_uio | uio_pci_generic | vfio");
@@ -955,3 +955,4 @@ static struct rte_driver rte_vmxnet3_driver = {
PMD_REGISTER_DRIVER(rte_vmxnet3_driver, vmxnet3);
DRIVER_REGISTER_PCI_TABLE(vmxnet3, pci_id_vmxnet3_map);
+DRIVER_REGISTER_KMOD_DEP(vmxnet3, "* igb_uio | uio_pci_generic | vfio");
@@ -203,6 +203,31 @@ RTE_STR(table)
static const char DRV_EXP_TAG(name, param_string_export)[] \
__attribute__((used)) = str
+/**
+ * Advertise the list of kernel modules required to run this driver
+ *
+ * This string lists the kernel modules required for the devices
+ * associated to a PMD. The format of each line of the string is:
+ * "<device-pattern> <kmod-expression>".
+ *
+ * The possible formats for the device pattern are:
+ * "*" all devices supported by this driver
+ * "pci:*" all PCI devices supported by this driver
+ * "pci:v8086:d*:sv*:sd*" all PCI devices supported by this driver
+ * whose vendor id is 0x8086.
+ *
+ * The format of the kernel modules list is a parenthesed expression
+ * containing logical-and (&) and logical-or (|).
+ *
+ * The device pattern and the kmod expression are separated by a space.
+ *
+ * Example:
+ * - "* igb_uio | uio_pci_generic | vfio"
+ */
+#define DRIVER_REGISTER_KMOD_DEP(name, str) \
+static const char DRV_EXP_TAG(name, kmod_dep_export)[] \
+__attribute__((used)) = str
+
#ifdef __cplusplus
}
#endif
@@ -312,7 +312,10 @@ class ReadElf(object):
global raw_output
global pcidb
- optional_pmd_info = [{'id': 'params', 'tag': 'PMD PARAMETERS'}]
+ optional_pmd_info = [
+ {'id': 'params', 'tag': 'PMD PARAMETERS'},
+ {'id': 'kmod', 'tag': 'PMD KMOD DEPENDENCIES'}
+ ]
i = mystring.index("=")
mystring = mystring[i + 2:]