Using syctl call the PCI addr is derived
dev.mlx5_core.0.%location: slot=8 function=0 dbsf=pci0:0:8:0

Signed-off-by: Srikanth Kaka <srikant...@oneconvergence.com>
Signed-off-by: Vag Singh <vag.si...@oneconvergence.com>
Signed-off-by: Anand Thulasiram <av...@juniper.net>
---
 drivers/common/mlx5/freebsd/mlx5_common_os.c | 48 ++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/drivers/common/mlx5/freebsd/mlx5_common_os.c 
b/drivers/common/mlx5/freebsd/mlx5_common_os.c
index 23370857eb..aa3b73f8a8 100644
--- a/drivers/common/mlx5/freebsd/mlx5_common_os.c
+++ b/drivers/common/mlx5/freebsd/mlx5_common_os.c
@@ -14,6 +14,54 @@
 #include "mlx5_common_os.h"
 #include "mlx5_glue.h"
 
+/**
+ * Derive PCI address from devpath
+ */
+int
+mlx5_get_pci_addr(const char *dev_path, struct rte_pci_addr *pci_addr)
+{
+       char id[10];
+       char searchstr[MLX5_SYSCTL_BY_NAME_SIZE];
+       size_t length = MLX5_SYSCTL_BY_NAME_SIZE;
+       char name[MLX5_SYSCTL_BY_NAME_SIZE];
+       int traverse = 0;
+
+       strncpy(id, &dev_path[strlen("/sys/class/infiniband/mlx5_")],
+               strlen(dev_path) - strlen("/sys/class/infiniband/mlx5_"));
+       sprintf(searchstr, "dev.mlx5_core.%s.%slocation", id, "%");
+       sysctlbyname(searchstr, &name, &length, NULL, 0);
+
+       while (name[traverse]) {
+               if (name[traverse] == 'p' && name[traverse + 1] == 'c' &&
+                               name[traverse + 2] == 'i')
+                       break;
+               ++traverse;
+       }
+       traverse += 3;
+
+       int end = traverse;
+
+       while (name[end] != ' ')
+               ++end;
+
+       char address[end - traverse + 1];
+
+       memcpy(address, &name[traverse], end - traverse);
+       address[end - traverse] = '\0';
+
+       char *ptr = strtok(address, " :");
+
+       pci_addr->domain = (uint32_t)atoi(ptr);
+       ptr = strtok(NULL, " :");
+       pci_addr->bus = (uint8_t)atoi(ptr);
+       ptr =   strtok(NULL, " :");
+       pci_addr->devid = (uint8_t)atoi(ptr);
+       ptr =   strtok(NULL, " :");
+       pci_addr->function = (uint8_t)atoi(ptr);
+
+       return 0;
+}
+
 /**
  * Derive IB dev index from devpath
  */
-- 
2.30.2

Reply via email to