common/mlx5: share PCI device detection

Move PCI detection by IB device from mlx5 PMD to the common code.

Signed-off-by: Matan Azrad <matan@mellanox.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
This commit is contained in:
Matan Azrad 2020-01-29 12:38:29 +00:00 committed by Ferruh Yigit
parent 7b4f1e6bd3
commit 93e3098296
9 changed files with 66 additions and 55 deletions

View File

@ -41,7 +41,7 @@ else
LDLIBS += -libverbs -lmlx5
endif
LDLIBS += -lrte_eal
LDLIBS += -lrte_eal -lrte_pci
# A few warnings cannot be avoided in external headers.
CFLAGS += -Wno-error=cast-qual -DNDEBUG -UPEDANTIC

View File

@ -5,6 +5,7 @@
#include <dlfcn.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <rte_errno.h>
@ -16,6 +17,58 @@
int mlx5_common_logtype;
/**
* Get PCI information by sysfs device path.
*
* @param dev_path
* Pointer to device sysfs folder name.
* @param[out] pci_addr
* PCI bus address output buffer.
*
* @return
* 0 on success, a negative errno value otherwise and rte_errno is set.
*/
int
mlx5_dev_to_pci_addr(const char *dev_path,
struct rte_pci_addr *pci_addr)
{
FILE *file;
char line[32];
MKSTR(path, "%s/device/uevent", dev_path);
file = fopen(path, "rb");
if (file == NULL) {
rte_errno = errno;
return -rte_errno;
}
while (fgets(line, sizeof(line), file) == line) {
size_t len = strlen(line);
int ret;
/* Truncate long lines. */
if (len == (sizeof(line) - 1))
while (line[(len - 1)] != '\n') {
ret = fgetc(file);
if (ret == EOF)
break;
line[(len - 1)] = ret;
}
/* Extract information. */
if (sscanf(line,
"PCI_SLOT_NAME="
"%" SCNx32 ":%" SCNx8 ":%" SCNx8 ".%" SCNx8 "\n",
&pci_addr->domain,
&pci_addr->bus,
&pci_addr->devid,
&pci_addr->function) == 4) {
ret = 0;
break;
}
}
fclose(file);
return 0;
}
#ifdef RTE_IBVERBS_LINK_DLOPEN
/**

View File

@ -6,7 +6,9 @@
#define RTE_PMD_MLX5_COMMON_H_
#include <assert.h>
#include <stdio.h>
#include <rte_pci.h>
#include <rte_log.h>
@ -84,4 +86,6 @@ pmd_drv_log_basename(const char *s)
\
snprintf(name, sizeof(name), "" __VA_ARGS__)
int mlx5_dev_to_pci_addr(const char *dev_path, struct rte_pci_addr *pci_addr);
#endif /* RTE_PMD_MLX5_COMMON_H_ */

View File

@ -17,4 +17,6 @@ DPDK_20.02 {
mlx5_devx_cmd_qp_query_tis_td;
mlx5_devx_cmd_query_hca_attr;
mlx5_devx_get_out_command_status;
mlx5_dev_to_pci_addr;
};

View File

@ -39,6 +39,7 @@
#include <mlx5_glue.h>
#include <mlx5_devx_cmds.h>
#include <mlx5_common.h>
#include "mlx5_defs.h"
#include "mlx5.h"

View File

@ -655,8 +655,6 @@ int mlx5_dev_get_flow_ctrl(struct rte_eth_dev *dev,
struct rte_eth_fc_conf *fc_conf);
int mlx5_dev_set_flow_ctrl(struct rte_eth_dev *dev,
struct rte_eth_fc_conf *fc_conf);
int mlx5_dev_to_pci_addr(const char *dev_path,
struct rte_pci_addr *pci_addr);
void mlx5_dev_link_status_handler(void *arg);
void mlx5_dev_interrupt_handler(void *arg);
void mlx5_dev_interrupt_handler_devx(void *arg);

View File

@ -38,6 +38,7 @@
#include <mlx5_glue.h>
#include <mlx5_devx_cmds.h>
#include <mlx5_common.h>
#include "mlx5.h"
#include "mlx5_rxtx.h"
@ -1211,58 +1212,6 @@ mlx5_dev_set_flow_ctrl(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
return 0;
}
/**
* Get PCI information by sysfs device path.
*
* @param dev_path
* Pointer to device sysfs folder name.
* @param[out] pci_addr
* PCI bus address output buffer.
*
* @return
* 0 on success, a negative errno value otherwise and rte_errno is set.
*/
int
mlx5_dev_to_pci_addr(const char *dev_path,
struct rte_pci_addr *pci_addr)
{
FILE *file;
char line[32];
MKSTR(path, "%s/device/uevent", dev_path);
file = fopen(path, "rb");
if (file == NULL) {
rte_errno = errno;
return -rte_errno;
}
while (fgets(line, sizeof(line), file) == line) {
size_t len = strlen(line);
int ret;
/* Truncate long lines. */
if (len == (sizeof(line) - 1))
while (line[(len - 1)] != '\n') {
ret = fgetc(file);
if (ret == EOF)
break;
line[(len - 1)] = ret;
}
/* Extract information. */
if (sscanf(line,
"PCI_SLOT_NAME="
"%" SCNx32 ":%" SCNx8 ":%" SCNx8 ".%" SCNx8 "\n",
&pci_addr->domain,
&pci_addr->bus,
&pci_addr->devid,
&pci_addr->function) == 4) {
ret = 0;
break;
}
}
fclose(file);
return 0;
}
/**
* Handle asynchronous removal event for entire multiport device.
*

View File

@ -30,6 +30,7 @@
#include <mlx5_devx_cmds.h>
#include <mlx5_prm.h>
#include <mlx5_common.h>
#include "mlx5_defs.h"
#include "mlx5.h"

View File

@ -13,10 +13,13 @@
#include <rte_common.h>
#include <rte_malloc.h>
#include <mlx5_common.h>
#include "mlx5_defs.h"
#include "mlx5.h"
#include "mlx5_rxtx.h"
static const struct mlx5_counter_ctrl mlx5_counters_init[] = {
{
.dpdk_name = "rx_port_unicast_bytes",