.match_buf_len = sizeof(matches),
.matches = &matches[0],
};
+ struct rte_pci_addr pci_addr;
/* for debug purposes, PCI can be disabled */
if (!rte_eal_has_pci())
goto error;
}
- for (i = 0; i < conf_io.num_matches; i++)
+ for (i = 0; i < conf_io.num_matches; i++) {
+ pci_addr.domain = matches[i].pc_sel.pc_domain;
+ pci_addr.bus = matches[i].pc_sel.pc_bus;
+ pci_addr.devid = matches[i].pc_sel.pc_dev;
+ pci_addr.function = matches[i].pc_sel.pc_func;
+
+ if (rte_pci_ignore_device(&pci_addr))
+ continue;
+
if (pci_scan_one(fd, &matches[i]) < 0)
goto error;
+ }
dev_count += conf_io.num_matches;
} while(conf_io.status == PCI_GETCONF_MORE_DEVS);
return path;
}
-static struct rte_devargs *pci_devargs_lookup(struct rte_pci_device *dev)
+static struct rte_devargs *
+pci_devargs_lookup(const struct rte_pci_addr *pci_addr)
{
struct rte_devargs *devargs;
struct rte_pci_addr addr;
RTE_EAL_DEVARGS_FOREACH("pci", devargs) {
devargs->bus->parse(devargs->name, &addr);
- if (!rte_pci_addr_cmp(&dev->addr, &addr))
+ if (!rte_pci_addr_cmp(pci_addr, &addr))
return devargs;
}
return NULL;
/* Each device has its internal, canonical name set. */
rte_pci_device_name(&dev->addr,
dev->name, sizeof(dev->name));
- devargs = pci_devargs_lookup(dev);
+ devargs = pci_devargs_lookup(&dev->addr);
dev->device.devargs = devargs;
/* In blacklist mode, if the device is not blacklisted, no
* rte_devargs exists for it.
{
struct rte_pci_device *dev = NULL;
size_t probed = 0, failed = 0;
- struct rte_devargs *devargs;
- int probe_all = 0;
int ret = 0;
- if (rte_pci_bus.bus.conf.scan_mode != RTE_BUS_SCAN_WHITELIST)
- probe_all = 1;
-
FOREACH_DEVICE_ON_PCIBUS(dev) {
probed++;
- devargs = dev->device.devargs;
- /* probe all or only whitelisted devices */
- if (probe_all)
- ret = pci_probe_all_drivers(dev);
- else if (devargs != NULL &&
- devargs->policy == RTE_DEV_WHITELISTED)
- ret = pci_probe_all_drivers(dev);
+ ret = pci_probe_all_drivers(dev);
if (ret < 0) {
if (ret != -EEXIST) {
RTE_LOG(ERR, EAL, "Requested device "
return -1;
}
-static bool
-pci_ignore_device(const struct rte_pci_device *dev)
+bool
+rte_pci_ignore_device(const struct rte_pci_addr *pci_addr)
{
- struct rte_devargs *devargs = dev->device.devargs;
+ struct rte_devargs *devargs = pci_devargs_lookup(pci_addr);
switch (rte_pci_bus.bus.conf.scan_mode) {
case RTE_BUS_SCAN_WHITELIST:
if (iommu_no_va == -1)
iommu_no_va = pci_device_iommu_support_va(dev)
? 0 : 1;
- if (pci_ignore_device(dev))
- continue;
+
if (dev->kdrv == RTE_KDRV_UNKNOWN ||
dev->kdrv == RTE_KDRV_NONE)
continue;
void
pci_name_set(struct rte_pci_device *dev);
+/**
+ * Validate whether a device with given PCI address should be ignored or not.
+ *
+ * @param pci_addr
+ * PCI address of device to be validated
+ * @return
+ * true: if device is to be ignored,
+ * false: if device is to be scanned,
+ */
+bool rte_pci_ignore_device(const struct rte_pci_addr *pci_addr);
+
/**
* Add a PCI device to the PCI Bus (append to PCI Device list). This function
* also updates the bus references of the PCI Device (and the generic device