X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fbus%2Fpci%2Fpci_common.c;h=4a3a87f24fb8eae870ec986a42c4a9d13a81d818;hb=f40e9f0e2278daf72d7f308f17e5f591d3ce8b09;hp=9b8d769287749027270d9d86ac58a4bdd868e47a;hpb=b23fd370cd5b84228d453e52931eaa5cd3f2846c;p=dpdk.git diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 9b8d769287..4a3a87f24f 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -133,18 +134,18 @@ rte_pci_match(const struct rte_pci_driver *pci_drv, id_table++) { /* check if device's identifiers match the driver's ones */ if (id_table->vendor_id != pci_dev->id.vendor_id && - id_table->vendor_id != PCI_ANY_ID) + id_table->vendor_id != RTE_PCI_ANY_ID) continue; if (id_table->device_id != pci_dev->id.device_id && - id_table->device_id != PCI_ANY_ID) + id_table->device_id != RTE_PCI_ANY_ID) continue; if (id_table->subsystem_vendor_id != pci_dev->id.subsystem_vendor_id && - id_table->subsystem_vendor_id != PCI_ANY_ID) + id_table->subsystem_vendor_id != RTE_PCI_ANY_ID) continue; if (id_table->subsystem_device_id != pci_dev->id.subsystem_device_id && - id_table->subsystem_device_id != PCI_ANY_ID) + id_table->subsystem_device_id != RTE_PCI_ANY_ID) continue; if (id_table->class_id != pci_dev->id.class_id && id_table->class_id != RTE_CLASS_ANY_ID) @@ -190,7 +191,9 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, } if (dev->device.numa_node < 0) { - RTE_LOG(WARNING, EAL, " Invalid NUMA socket, default to 0\n"); + if (rte_socket_count() > 1) + RTE_LOG(INFO, EAL, "Device %s is not NUMA-aware, defaulting socket to 0\n", + dev->name); dev->device.numa_node = 0; } @@ -223,16 +226,39 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, return -EINVAL; } - dev->driver = dr; - } + /* Allocate interrupt instance for pci device */ + dev->intr_handle = + rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE); + if (dev->intr_handle == NULL) { + RTE_LOG(ERR, EAL, + "Failed to create interrupt instance for %s\n", + dev->device.name); + return -ENOMEM; + } - if (!already_probed && (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING)) { - /* map resources for devices that use igb_uio */ - ret = rte_pci_map_device(dev); - if (ret != 0) { - dev->driver = NULL; - return ret; + dev->vfio_req_intr_handle = + rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE); + if (dev->vfio_req_intr_handle == NULL) { + rte_intr_instance_free(dev->intr_handle); + dev->intr_handle = NULL; + RTE_LOG(ERR, EAL, + "Failed to create vfio req interrupt instance for %s\n", + dev->device.name); + return -ENOMEM; } + + if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { + ret = rte_pci_map_device(dev); + if (ret != 0) { + rte_intr_instance_free(dev->vfio_req_intr_handle); + dev->vfio_req_intr_handle = NULL; + rte_intr_instance_free(dev->intr_handle); + dev->intr_handle = NULL; + return ret; + } + } + + dev->driver = dr; } RTE_LOG(INFO, EAL, "Probe PCI driver: %s (%x:%x) device: "PCI_PRI_FMT" (socket %i)\n", @@ -252,6 +278,10 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, !(ret > 0 && (dr->drv_flags & RTE_PCI_DRV_KEEP_MAPPED_RES))) rte_pci_unmap_device(dev); + rte_intr_instance_free(dev->vfio_req_intr_handle); + dev->vfio_req_intr_handle = NULL; + rte_intr_instance_free(dev->intr_handle); + dev->intr_handle = NULL; } else { dev->device.driver = &dr->driver; } @@ -297,6 +327,11 @@ rte_pci_detach_dev(struct rte_pci_device *dev) /* unmap resources for devices that use igb_uio */ rte_pci_unmap_device(dev); + rte_intr_instance_free(dev->intr_handle); + dev->intr_handle = NULL; + rte_intr_instance_free(dev->vfio_req_intr_handle); + dev->vfio_req_intr_handle = NULL; + return 0; } @@ -746,6 +781,34 @@ rte_pci_find_ext_capability(struct rte_pci_device *dev, uint32_t cap) return 0; } +int +rte_pci_set_bus_master(struct rte_pci_device *dev, bool enable) +{ + uint16_t old_cmd, cmd; + + if (rte_pci_read_config(dev, &old_cmd, sizeof(old_cmd), + RTE_PCI_COMMAND) < 0) { + RTE_LOG(ERR, EAL, "error in reading PCI command register\n"); + return -1; + } + + if (enable) + cmd = old_cmd | RTE_PCI_COMMAND_MASTER; + else + cmd = old_cmd & ~RTE_PCI_COMMAND_MASTER; + + if (cmd == old_cmd) + return 0; + + if (rte_pci_write_config(dev, &cmd, sizeof(cmd), + RTE_PCI_COMMAND) < 0) { + RTE_LOG(ERR, EAL, "error in writing PCI command register\n"); + return -1; + } + + return 0; +} + struct rte_pci_bus rte_pci_bus = { .bus = { .scan = rte_pci_scan, @@ -754,6 +817,7 @@ struct rte_pci_bus rte_pci_bus = { .plug = pci_plug, .unplug = pci_unplug, .parse = pci_parse, + .devargs_parse = rte_pci_devargs_parse, .dma_map = pci_dma_map, .dma_unmap = pci_dma_unmap, .get_iommu_class = rte_pci_get_iommu_class,