bus/pci: fill bus specific information
For diagnostic, it may be useful to provide the PCI vendor and device id. Signed-off-by: David Marchand <david.marchand@redhat.com> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
This commit is contained in:
parent
5b569f2ea8
commit
8f4de2dba9
@ -248,7 +248,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
|
|||||||
/* FreeBSD has no NUMA support (yet) */
|
/* FreeBSD has no NUMA support (yet) */
|
||||||
dev->device.numa_node = 0;
|
dev->device.numa_node = 0;
|
||||||
|
|
||||||
pci_name_set(dev);
|
pci_common_set(dev);
|
||||||
|
|
||||||
/* FreeBSD has only one pass through driver */
|
/* FreeBSD has only one pass through driver */
|
||||||
dev->kdrv = RTE_PCI_KDRV_NIC_UIO;
|
dev->kdrv = RTE_PCI_KDRV_NIC_UIO;
|
||||||
@ -299,11 +299,11 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
|
|||||||
} else { /* already registered */
|
} else { /* already registered */
|
||||||
dev2->kdrv = dev->kdrv;
|
dev2->kdrv = dev->kdrv;
|
||||||
dev2->max_vfs = dev->max_vfs;
|
dev2->max_vfs = dev->max_vfs;
|
||||||
pci_name_set(dev2);
|
pci_common_set(dev2);
|
||||||
memmove(dev2->mem_resource,
|
memmove(dev2->mem_resource,
|
||||||
dev->mem_resource,
|
dev->mem_resource,
|
||||||
sizeof(dev->mem_resource));
|
sizeof(dev->mem_resource));
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -313,7 +313,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
skipdev:
|
skipdev:
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@ struct rte_pci_device {
|
|||||||
uint16_t max_vfs; /**< sriov enable if not zero */
|
uint16_t max_vfs; /**< sriov enable if not zero */
|
||||||
enum rte_pci_kernel_driver kdrv; /**< Kernel driver passthrough */
|
enum rte_pci_kernel_driver kdrv; /**< Kernel driver passthrough */
|
||||||
char name[PCI_PRI_STR_SIZE+1]; /**< PCI location (ASCII) */
|
char name[PCI_PRI_STR_SIZE+1]; /**< PCI location (ASCII) */
|
||||||
|
char *bus_info; /**< PCI bus specific info */
|
||||||
struct rte_intr_handle *vfio_req_intr_handle;
|
struct rte_intr_handle *vfio_req_intr_handle;
|
||||||
/**< Handler of VFIO request interrupt */
|
/**< Handler of VFIO request interrupt */
|
||||||
};
|
};
|
||||||
|
@ -226,7 +226,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
|
|||||||
/* get vendor id */
|
/* get vendor id */
|
||||||
snprintf(filename, sizeof(filename), "%s/vendor", dirname);
|
snprintf(filename, sizeof(filename), "%s/vendor", dirname);
|
||||||
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
|
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
dev->id.vendor_id = (uint16_t)tmp;
|
dev->id.vendor_id = (uint16_t)tmp;
|
||||||
@ -234,7 +234,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
|
|||||||
/* get device id */
|
/* get device id */
|
||||||
snprintf(filename, sizeof(filename), "%s/device", dirname);
|
snprintf(filename, sizeof(filename), "%s/device", dirname);
|
||||||
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
|
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
dev->id.device_id = (uint16_t)tmp;
|
dev->id.device_id = (uint16_t)tmp;
|
||||||
@ -243,7 +243,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
|
|||||||
snprintf(filename, sizeof(filename), "%s/subsystem_vendor",
|
snprintf(filename, sizeof(filename), "%s/subsystem_vendor",
|
||||||
dirname);
|
dirname);
|
||||||
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
|
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
dev->id.subsystem_vendor_id = (uint16_t)tmp;
|
dev->id.subsystem_vendor_id = (uint16_t)tmp;
|
||||||
@ -252,7 +252,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
|
|||||||
snprintf(filename, sizeof(filename), "%s/subsystem_device",
|
snprintf(filename, sizeof(filename), "%s/subsystem_device",
|
||||||
dirname);
|
dirname);
|
||||||
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
|
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
dev->id.subsystem_device_id = (uint16_t)tmp;
|
dev->id.subsystem_device_id = (uint16_t)tmp;
|
||||||
@ -261,7 +261,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
|
|||||||
snprintf(filename, sizeof(filename), "%s/class",
|
snprintf(filename, sizeof(filename), "%s/class",
|
||||||
dirname);
|
dirname);
|
||||||
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
|
if (eal_parse_sysfs_value(filename, &tmp) < 0) {
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* the least 24 bits are valid: class, subclass, program interface */
|
/* the least 24 bits are valid: class, subclass, program interface */
|
||||||
@ -295,13 +295,13 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
|
|||||||
dev->device.numa_node = 0;
|
dev->device.numa_node = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_name_set(dev);
|
pci_common_set(dev);
|
||||||
|
|
||||||
/* parse resources */
|
/* parse resources */
|
||||||
snprintf(filename, sizeof(filename), "%s/resource", dirname);
|
snprintf(filename, sizeof(filename), "%s/resource", dirname);
|
||||||
if (pci_parse_sysfs_resource(filename, dev) < 0) {
|
if (pci_parse_sysfs_resource(filename, dev) < 0) {
|
||||||
RTE_LOG(ERR, EAL, "%s(): cannot parse resource\n", __func__);
|
RTE_LOG(ERR, EAL, "%s(): cannot parse resource\n", __func__);
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -310,7 +310,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
|
|||||||
ret = pci_get_kernel_driver_by_path(filename, driver, sizeof(driver));
|
ret = pci_get_kernel_driver_by_path(filename, driver, sizeof(driver));
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
RTE_LOG(ERR, EAL, "Fail to get kernel driver\n");
|
RTE_LOG(ERR, EAL, "Fail to get kernel driver\n");
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,7 +324,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
|
|||||||
else
|
else
|
||||||
dev->kdrv = RTE_PCI_KDRV_UNKNOWN;
|
dev->kdrv = RTE_PCI_KDRV_UNKNOWN;
|
||||||
} else {
|
} else {
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* device is valid, add in list (sorted) */
|
/* device is valid, add in list (sorted) */
|
||||||
@ -346,7 +346,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
|
|||||||
dev2->kdrv = dev->kdrv;
|
dev2->kdrv = dev->kdrv;
|
||||||
dev2->max_vfs = dev->max_vfs;
|
dev2->max_vfs = dev->max_vfs;
|
||||||
dev2->id = dev->id;
|
dev2->id = dev->id;
|
||||||
pci_name_set(dev2);
|
pci_common_set(dev2);
|
||||||
memmove(dev2->mem_resource,
|
memmove(dev2->mem_resource,
|
||||||
dev->mem_resource,
|
dev->mem_resource,
|
||||||
sizeof(dev->mem_resource));
|
sizeof(dev->mem_resource));
|
||||||
@ -376,10 +376,10 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr *addr)
|
|||||||
else if (dev2->device.devargs !=
|
else if (dev2->device.devargs !=
|
||||||
dev->device.devargs) {
|
dev->device.devargs) {
|
||||||
rte_devargs_remove(dev2->device.devargs);
|
rte_devargs_remove(dev2->device.devargs);
|
||||||
pci_name_set(dev2);
|
pci_common_set(dev2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,38 @@ const char *rte_pci_get_sysfs_path(void)
|
|||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef RTE_EXEC_ENV_WINDOWS
|
||||||
|
#define asprintf pci_asprintf
|
||||||
|
|
||||||
|
static int
|
||||||
|
__rte_format_printf(2, 3)
|
||||||
|
pci_asprintf(char **buffer, const char *format, ...)
|
||||||
|
{
|
||||||
|
int size, ret;
|
||||||
|
va_list arg;
|
||||||
|
|
||||||
|
va_start(arg, format);
|
||||||
|
size = vsnprintf(NULL, 0, format, arg);
|
||||||
|
va_end(arg);
|
||||||
|
if (size < 0)
|
||||||
|
return -1;
|
||||||
|
size++;
|
||||||
|
|
||||||
|
*buffer = malloc(size);
|
||||||
|
if (*buffer == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
va_start(arg, format);
|
||||||
|
ret = vsnprintf(*buffer, size, format, arg);
|
||||||
|
va_end(arg);
|
||||||
|
if (ret != size - 1) {
|
||||||
|
free(*buffer);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* RTE_EXEC_ENV_WINDOWS */
|
||||||
|
|
||||||
static struct rte_devargs *
|
static struct rte_devargs *
|
||||||
pci_devargs_lookup(const struct rte_pci_addr *pci_addr)
|
pci_devargs_lookup(const struct rte_pci_addr *pci_addr)
|
||||||
{
|
{
|
||||||
@ -59,7 +91,7 @@ pci_devargs_lookup(const struct rte_pci_addr *pci_addr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pci_name_set(struct rte_pci_device *dev)
|
pci_common_set(struct rte_pci_device *dev)
|
||||||
{
|
{
|
||||||
struct rte_devargs *devargs;
|
struct rte_devargs *devargs;
|
||||||
|
|
||||||
@ -80,6 +112,19 @@ pci_name_set(struct rte_pci_device *dev)
|
|||||||
else
|
else
|
||||||
/* Otherwise, it uses the internal, canonical form. */
|
/* Otherwise, it uses the internal, canonical form. */
|
||||||
dev->device.name = dev->name;
|
dev->device.name = dev->name;
|
||||||
|
|
||||||
|
if (asprintf(&dev->bus_info, "vendor_id=%"PRIx16", device_id=%"PRIx16,
|
||||||
|
dev->id.vendor_id, dev->id.device_id) != -1)
|
||||||
|
dev->device.bus_info = dev->bus_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pci_free(struct rte_pci_device *dev)
|
||||||
|
{
|
||||||
|
if (dev == NULL)
|
||||||
|
return;
|
||||||
|
free(dev->bus_info);
|
||||||
|
free(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* map a particular resource from a file */
|
/* map a particular resource from a file */
|
||||||
@ -604,7 +649,7 @@ pci_unplug(struct rte_device *dev)
|
|||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
rte_pci_remove_device(pdev);
|
rte_pci_remove_device(pdev);
|
||||||
rte_devargs_remove(dev->devargs);
|
rte_devargs_remove(dev->devargs);
|
||||||
free(pdev);
|
pci_free(pdev);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -44,10 +44,16 @@ struct rte_pci_device;
|
|||||||
int rte_pci_scan(void);
|
int rte_pci_scan(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the name of a PCI device.
|
* Set common internal information for a PCI device.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
pci_name_set(struct rte_pci_device *dev);
|
pci_common_set(struct rte_pci_device *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free a PCI device.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
pci_free(struct rte_pci_device *dev);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validate whether a device with given PCI address should be ignored or not.
|
* Validate whether a device with given PCI address should be ignored or not.
|
||||||
|
@ -382,7 +382,7 @@ pci_scan_one(HDEVINFO dev_info, PSP_DEVINFO_DATA device_info_data)
|
|||||||
dev->id = pci_id;
|
dev->id = pci_id;
|
||||||
dev->max_vfs = 0; /* TODO: get max_vfs */
|
dev->max_vfs = 0; /* TODO: get max_vfs */
|
||||||
|
|
||||||
pci_name_set(dev);
|
pci_common_set(dev);
|
||||||
|
|
||||||
set_kernel_driver_type(device_info_data, dev);
|
set_kernel_driver_type(device_info_data, dev);
|
||||||
|
|
||||||
@ -410,7 +410,7 @@ pci_scan_one(HDEVINFO dev_info, PSP_DEVINFO_DATA device_info_data)
|
|||||||
dev2->max_vfs = dev->max_vfs;
|
dev2->max_vfs = dev->max_vfs;
|
||||||
memmove(dev2->mem_resource, dev->mem_resource,
|
memmove(dev2->mem_resource, dev->mem_resource,
|
||||||
sizeof(dev->mem_resource));
|
sizeof(dev->mem_resource));
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -419,7 +419,7 @@ pci_scan_one(HDEVINFO dev_info, PSP_DEVINFO_DATA device_info_data)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
end:
|
end:
|
||||||
free(dev);
|
pci_free(dev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user