Use rte_pci_device to map device resources and delete
useless device search processes.

Signed-off-by: Yong Zhang <zhang.yon...@zte.com.cn>
---
 drivers/raw/zxdh/meson.build   |   2 +-
 drivers/raw/zxdh/zxdh_pci.c    | 562 ---------------------------------
 drivers/raw/zxdh/zxdh_pci.h    |  41 ---
 drivers/raw/zxdh/zxdh_rawdev.c |  93 +++++-
 4 files changed, 78 insertions(+), 620 deletions(-)
 delete mode 100644 drivers/raw/zxdh/zxdh_pci.c
 delete mode 100644 drivers/raw/zxdh/zxdh_pci.h

diff --git a/drivers/raw/zxdh/meson.build b/drivers/raw/zxdh/meson.build
index c9e5c83f1b..266d3db6d8 100644
--- a/drivers/raw/zxdh/meson.build
+++ b/drivers/raw/zxdh/meson.build
@@ -2,4 +2,4 @@
 #Copyright 2024 ZTE Corporation
 
 deps += ['rawdev', 'kvargs', 'mbuf', 'bus_pci']
-sources = files('zxdh_rawdev.c', 'zxdh_pci.c')
+sources = files('zxdh_rawdev.c')
diff --git a/drivers/raw/zxdh/zxdh_pci.c b/drivers/raw/zxdh/zxdh_pci.c
deleted file mode 100644
index 884e39109a..0000000000
--- a/drivers/raw/zxdh/zxdh_pci.c
+++ /dev/null
@@ -1,562 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2024 ZTE Corporation
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <getopt.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <dirent.h>
-#include <unistd.h>
-
-#include "zxdh_rawdev.h"
-#include "zxdh_pci.h"
-
-#define PCI_DEVICES_DIR          "/sys/bus/pci/devices"
-
-#define BAR0_IDX                 (0)
-#define BAR2_IDX                 (2)
-
-#define IORESOURCE_MEM           (0x00000200)
-#define FILE_FMT_NVAL            (2)
-
-#define STR_BUFF_LEN             (128)
-
-#define BYTES_NO_SWAP            (0)
-#define BYTES_SWAP               (1)
-
-#define PCI_CMD_OFFSET           (0x04)
-#define PCI_CMD_BYTES            (2)
-#define PCI_CMD_MSE_BIT          (1)
-#define FPGA_VER_OFFSET          (0x420)
-#define FPGA_VER_BYTES           (4)
-#define BOM_ID_OFFSET            (0x424)
-#define BOM_ID_BYTES             (1)
-#define FPGA_PR_FLAG_OFFSET      (0x425)
-#define FPGA_PR_FLAG_BYTES       (1)
-#define BOARD_ID_OFFSET          (0x426)
-#define BOARD_ID_BYTES           (2)
-#define FPGA_MAKE_TIME_OFFSET    (0x428)
-#define FPGA_MAKE_TIME_BYTES     (4)
-
-#define PARA_PR_FLAG             (0)
-#define PARA_FPGA_VER            (1)
-#define PARA_FPGA_MAKE_TIME      (2)
-#define PARA_BOARD_ID            (3)
-#define PARA_BOM_ID              (4)
-#define PARA_PCI_CMD             (5)
-
-#define PCI_READ                 (0)
-#define PCI_WRITE                (1)
-
-struct zxdh_pci_dev gdev;
-
-static int
-zxdh_gdma_rw_pci_config(struct zxdh_pci_dev *dev, uint8_t rw, uint offset, 
uint count, uint8_t *buf)
-{
-       int fd = -1;
-       uint res = 0;
-       int ret = -1;
-       char filename[FILE_PATH_LEN] = {0};
-
-       snprintf(filename, sizeof(filename), "/proc/bus/pci/%02x/%02x.%d",
-                       dev->bus, dev->devid, dev->function);
-       fd = open(filename, O_RDWR);
-       if (fd < 0) {
-               snprintf(filename, sizeof(filename), 
"/proc/bus/pci/%04x:%02x/%02x.%d",
-                               dev->domain, dev->bus, dev->devid, 
dev->function);
-               fd = open(filename, O_RDWR);
-               if (fd < 0) {
-                       ZXDH_PMD_LOG(ERR, "Failed to open file:%s, fd:%d!", 
filename, fd);
-                       return -1;
-               }
-       }
-
-       res = lseek(fd, offset, SEEK_SET);
-       if (res != offset) {
-               close(fd);
-               ZXDH_PMD_LOG(ERR, "Failed to lseek pci, res:%d!", res);
-               return -1;
-       }
-
-       if (rw == PCI_READ)
-               ret = read(fd, buf, count);
-       else
-               ret = write(fd, buf, count);
-
-       if (ret < 0) {
-               close(fd);
-               ZXDH_PMD_LOG(ERR, "Failed to rw pci:%d, ret:%d!", rw, ret);
-               return -1;
-       }
-
-       close(fd);
-       return 0;
-}
-
-static int
-zxdh_gdma_cfg_space_read(struct zxdh_pci_dev *dev, uint8_t ParaType, uint 
*pParaVer)
-{
-       int ret = 0;
-       uint8_t aRegVal[sizeof(uint)] = {0};
-       uint8_t ucLoop = 0;
-       uint8_t ucSwap = BYTES_NO_SWAP;
-       uint dwRegOffset = 0;
-       uint dwRegLen = 0;
-
-       if ((dev == NULL) || (pParaVer == NULL)) {
-               ZXDH_PMD_LOG(ERR, "Param is invalid!");
-               return -EINVAL;
-       }
-
-       switch (ParaType) {
-       case PARA_PR_FLAG:
-               dwRegOffset = FPGA_PR_FLAG_OFFSET;
-               dwRegLen    = FPGA_PR_FLAG_BYTES;
-               ucSwap      = BYTES_NO_SWAP;
-               break;
-       case PARA_FPGA_VER:
-               dwRegOffset = FPGA_VER_OFFSET;
-               dwRegLen    = FPGA_VER_BYTES;
-               ucSwap      = BYTES_NO_SWAP;
-               break;
-       case PARA_FPGA_MAKE_TIME:
-               dwRegOffset = FPGA_MAKE_TIME_OFFSET;
-               dwRegLen    = FPGA_MAKE_TIME_BYTES;
-               ucSwap      = BYTES_NO_SWAP;
-               break;
-       case PARA_BOARD_ID:
-               dwRegOffset = BOARD_ID_OFFSET;
-               dwRegLen    = BOARD_ID_BYTES;
-               ucSwap      = BYTES_NO_SWAP;
-               break;
-       case PARA_BOM_ID:
-               dwRegOffset = BOM_ID_OFFSET;
-               dwRegLen    = BOM_ID_BYTES;
-               ucSwap      = BYTES_NO_SWAP;
-               break;
-       case PARA_PCI_CMD:
-               dwRegOffset = PCI_CMD_OFFSET;
-               dwRegLen    = PCI_CMD_BYTES;
-               ucSwap      = BYTES_SWAP;
-               break;
-       default:
-               ZXDH_PMD_LOG(ERR, "ParaType %u not support!", ParaType);
-               return -EINVAL;
-       }
-
-       if (dwRegLen > sizeof(uint)) {
-               ZXDH_PMD_LOG(ERR, "dwRegLen %u is invalid", dwRegLen);
-               return -1;
-       }
-
-       *pParaVer = 0;
-       ret = zxdh_gdma_rw_pci_config(dev, PCI_READ, dwRegOffset, dwRegLen, 
aRegVal);
-       if (ret != 0) {
-               ZXDH_PMD_LOG(ERR, "ParaType %u, zxdh_gdma_rw_pci_config 
failed!", ParaType);
-               return ret;
-       }
-
-       if (ucSwap == BYTES_SWAP) {
-               for (ucLoop = 0; ucLoop < dwRegLen; ucLoop++)
-                       *pParaVer = (*pParaVer << 8) | 
aRegVal[dwRegLen-1-ucLoop];
-       } else {
-               for (ucLoop = 0; ucLoop < dwRegLen; ucLoop++)
-                       *pParaVer = (*pParaVer << 8) | aRegVal[ucLoop];
-       }
-
-       return ret;
-}
-
-static int
-zxdh_gdma_cfg_space_write(struct zxdh_pci_dev *dev, uint8_t ParaType, uint 
*pParaVer)
-{
-       int ret = 0;
-       uint8_t aRegVal[sizeof(uint)] = {0};
-       uint8_t ucLoop = 0;
-       uint8_t ucSwap = BYTES_NO_SWAP;
-       uint dwRegOffset = 0;
-       uint dwRegLen = 0;
-
-       if ((dev == NULL) || (pParaVer == NULL)) {
-               ZXDH_PMD_LOG(ERR, "Param is invalid");
-               return -EINVAL;
-       }
-
-       if (ParaType != PARA_PCI_CMD) {
-               ZXDH_PMD_LOG(ERR, "ParaType %u not support!", ParaType);
-               return -EINVAL;
-       }
-
-       dwRegOffset = PCI_CMD_OFFSET;
-       dwRegLen = PCI_CMD_BYTES;
-       ucSwap = BYTES_SWAP;
-
-       if (dwRegLen > sizeof(uint)) {
-               ZXDH_PMD_LOG(ERR, "dwRegLen %u is invalid", dwRegLen);
-               return -1;
-       }
-
-       if (ucSwap == BYTES_SWAP) {
-               for (ucLoop = 0; ucLoop < dwRegLen; ucLoop++)
-                       aRegVal[ucLoop] = (*pParaVer >> 8*ucLoop) & 0xff;
-       } else {
-               for (ucLoop = 0; ucLoop < dwRegLen; ucLoop++)
-                       aRegVal[ucLoop] = (*pParaVer >> 8*(dwRegLen-1-ucLoop)) 
& 0xff;
-       }
-
-       ret = zxdh_gdma_rw_pci_config(dev, PCI_WRITE, dwRegOffset, dwRegLen, 
aRegVal);
-       if (ret != 0) {
-               ZXDH_PMD_LOG(ERR, "ParaType %u, zxdh_gdma_rw_pci_config 
failed!", ParaType);
-               return ret;
-       }
-
-       return ret;
-}
-
-static int
-zxdh_gdma_str_split(char *string, int stringlen, char **tokens, int maxtokens, 
char delim)
-{
-       int loop = 0;
-       int tok = 0;
-       int tokstart = 1; /* first token is right at start of string */
-
-       if (string == NULL || tokens == NULL) {
-               ZXDH_PMD_LOG(ERR, "Param is invalid!");
-               return -1;
-       }
-
-       for (loop = 0; loop < stringlen; loop++) {
-               if (string[loop] == '\0' || tok >= maxtokens)
-                       break;
-
-               if (tokstart) {
-                       tokstart = 0;
-                       tokens[tok++] = &string[loop];
-               }
-
-               if (string[loop] == delim) {
-                       string[loop] = '\0';
-                       tokstart = 1;
-               }
-       }
-
-       return tok;
-}
-
-static int
-zxdh_gdma_devfs_parse(const char *filename, unsigned long *val)
-{
-       FILE *f = NULL;
-       char *end = NULL;
-       char buf[STR_BUFF_LEN] = {0};
-
-       f = fopen(filename, "r");
-       if (f == NULL) {
-               ZXDH_PMD_LOG(ERR, "Cannot open sysfs %s", filename);
-               return -1;
-       }
-
-       if (fgets(buf, sizeof(buf), f) == NULL) {
-               ZXDH_PMD_LOG(ERR, "Cannot read sysfs value %s", filename);
-               fclose(f);
-               return -1;
-       }
-
-       *val = strtoul(buf, &end, 0);
-       if ((buf[0] == '\0') || (end == NULL) || (*end != '\n')) {
-               ZXDH_PMD_LOG(ERR, "Cannot parse sysfs value %s", filename);
-               fclose(f);
-               return -1;
-       }
-
-       fclose(f);
-       return 0;
-}
-
-static int
-zxdh_gdma_resfs_parse(const char *filename, struct zxdh_pci_dev *dev)
-{
-       FILE *fp = NULL;
-       char buf[STR_BUFF_LEN] = {0};
-       uint8_t  loop = 0;
-       uint64_t phys_addr = 0;
-       uint64_t end_addr = 0;
-       uint64_t flags = 0;
-       int ret = 0;
-       union pci_resource_info {
-               struct {
-                       char *phys_addr;
-                       char *end_addr;
-                       char *flags;
-               };
-               char *ptrs[PCI_RESOURCE_FMT_NVAL];
-       } res_info;
-
-       fp = fopen(filename, "r");
-       if (fp == NULL) {
-               ZXDH_PMD_LOG(ERR, "Failed to open file %s", filename);
-               return -1;
-       }
-
-       for (loop = 0; loop < PCI_MAX_RESOURCE; loop++) {
-               if (fgets(buf, sizeof(buf), fp) == NULL) {
-                       ZXDH_PMD_LOG(ERR, "Failed to gets file %s", filename);
-                       goto err_exit;
-               }
-
-               ret = zxdh_gdma_str_split(buf, sizeof(buf), res_info.ptrs,
-                                                                       
PCI_RESOURCE_FMT_NVAL, ' ');
-               if (ret != PCI_RESOURCE_FMT_NVAL) {
-                       ZXDH_PMD_LOG(ERR, "file %s:zxdh_gdma_str_split 
failed!", filename);
-                       goto err_exit;
-               }
-               errno = 0;
-               phys_addr = strtoull(res_info.phys_addr, NULL, 16);
-               end_addr  = strtoull(res_info.end_addr, NULL, 16);
-               flags     = strtoull(res_info.flags, NULL, 16);
-
-               if (errno != 0) {
-                       ZXDH_PMD_LOG(ERR, "file %s:bad resource format!", 
filename);
-                       goto err_exit;
-               }
-
-               if (flags & IORESOURCE_MEM) {
-                       if (loop == BAR0_IDX) {
-                               dev->bar_pa[BAR0_IDX] = phys_addr;
-                               dev->bar_len[BAR0_IDX] = end_addr - phys_addr + 
1;
-                       }
-
-                       if (loop == BAR2_IDX) {
-                               dev->bar_pa[BAR2_IDX] = phys_addr;
-                               dev->bar_len[BAR2_IDX] = end_addr - phys_addr + 
1;
-                               fclose(fp);
-                               return 0;
-                       }
-               }
-       }
-
-       ZXDH_PMD_LOG(ERR, "file %s: Not found IO resource memory!", filename);
-
-err_exit:
-       fclose(fp);
-       return -1;
-}
-
-static int
-zxdh_gdma_pci_addr_parse(const char *buf, int buf_size, struct zxdh_pci_dev 
*dev)
-{
-       char *buf_copy = NULL;
-       int ret = 0;
-       union splitaddr {
-               struct {
-                       char *domain;
-                       char *bus;
-                       char *devid;
-                       char *function;
-               };
-               char *str[PCI_FMT_NVAL];
-       } splitaddr;
-
-       buf_copy = strndup(buf, buf_size);
-       if (buf_copy == NULL) {
-               ZXDH_PMD_LOG(ERR, "buf %s: strndup failed!", buf);
-               return -1;
-       }
-
-       /* first split on ':' */
-       ret = zxdh_gdma_str_split(buf_copy, buf_size, splitaddr.str, 
PCI_FMT_NVAL, ':');
-       if (ret != (PCI_FMT_NVAL - 1)) {
-               ZXDH_PMD_LOG(ERR, "buf %s: zxdh_gdma_str_split failed!", buf);
-               goto err_exit;
-       }
-
-       /* final split is on '.' between devid and function */
-       splitaddr.function = strchr(splitaddr.devid, '.');
-       if (splitaddr.function == NULL) {
-               ZXDH_PMD_LOG(ERR, "buf %s: strchr failed!", buf);
-               goto err_exit;
-       }
-       *splitaddr.function++ = '\0';
-
-       /* now convert to int values */
-       errno = 0;
-       dev->domain = (uint16_t)strtoul(splitaddr.domain, NULL, 16);
-       dev->bus = (uint8_t)strtoul(splitaddr.bus, NULL, 16);
-       dev->devid = (uint8_t)strtoul(splitaddr.devid, NULL, 16);
-       dev->function = (uint8_t)strtoul(splitaddr.function, NULL, 10);
-       if (errno != 0) {
-               ZXDH_PMD_LOG(ERR, "buf %s: bad format!", buf);
-               goto err_exit;
-       }
-       free(buf_copy);
-       return 0;
-
-err_exit:
-       free(buf_copy);
-       return -1;
-}
-
-static int
-zxdh_gdma_pci_dev_mmap(const char *filename, struct zxdh_pci_dev *dev, uint8_t 
bar_idx)
-{
-       int fd = -1;
-
-       if (dev->bar_va[bar_idx] == NULL) {
-               fd = open(filename, O_RDWR);
-               if (fd < 0) {
-                       ZXDH_PMD_LOG(ERR, "Failed to open file %s", filename);
-                       return -1;
-               }
-
-               dev->bar_va[bar_idx] = mmap((void *)dev->bar_pa[bar_idx],
-                                                                       
dev->bar_len[bar_idx],
-                                                                       
PROT_READ | PROT_WRITE,
-                                                                       
MAP_SHARED, fd, 0);
-
-               if (dev->bar_va[bar_idx] == MAP_FAILED) {
-                       ZXDH_PMD_LOG(ERR, "Failed to mmap file %s!", filename);
-                       goto err_exit;
-               }
-               close(fd);
-       } else
-               ZXDH_PMD_LOG(ERR, "BarVirtAddr is not NULL!");
-
-       return 0;
-
-err_exit:
-       close(fd);
-       return -1;
-}
-
-void
-zxdh_gdma_pci_dev_munmap(void)
-{
-       if (gdev.bar_va[BAR0_IDX] != NULL) {
-               munmap(gdev.bar_va[BAR0_IDX], gdev.bar_len[BAR0_IDX]);
-               gdev.bar_va[BAR0_IDX] = NULL;
-       }
-
-       if (gdev.bar_va[BAR2_IDX] != NULL) {
-               munmap(gdev.bar_va[BAR2_IDX], gdev.bar_len[BAR2_IDX]);
-               gdev.bar_va[BAR2_IDX] = NULL;
-       }
-}
-
-static int
-zxdh_gdma_pci_mse_en(struct zxdh_pci_dev *dev)
-{
-       int ret = 0;
-       uint RegVal = 0;
-
-       ret = zxdh_gdma_cfg_space_read(dev, PARA_PCI_CMD, &RegVal);
-       if (ret != 0) {
-               ZXDH_PMD_LOG(ERR, "Failed to read %04x:%02x:%02x.%01x pci 
config space!",
-                                               dev->domain, dev->bus, 
dev->devid, dev->function);
-               return ret;
-       }
-
-       if ((RegVal & (1 << PCI_CMD_MSE_BIT)) == 0) {
-               RegVal = RegVal | (1 << PCI_CMD_MSE_BIT);
-
-               ret = zxdh_gdma_cfg_space_write(dev, PARA_PCI_CMD, &RegVal);
-               if (ret != 0) {
-                       ZXDH_PMD_LOG(ERR, "Failed to write %04x:%02x:%02x.%01x 
pci config space!",
-                                                       dev->domain, dev->bus,
-                                                       dev->devid, 
dev->function);
-                       return ret;
-               }
-       }
-
-       return ret;
-}
-
-int
-zxdh_gdma_pci_scan(void)
-{
-       struct dirent *e = NULL;
-       DIR *dir = NULL;
-       char dirname[FILE_PATH_LEN] = {0};
-       char filename[FILE_PATH_LEN] = {0};
-       uint16_t vendor_id = 0;
-       uint16_t device_id = 0;
-       unsigned long tmp = 0;
-       bool found = false;
-       int ret = 0;
-
-       dir = opendir(PCI_DEVICES_DIR);
-       if (dir == NULL) {
-               ZXDH_PMD_LOG(ERR, "Failed to opendir %s", PCI_DEVICES_DIR);
-               return -1;
-       }
-
-       while ((e = readdir(dir)) != NULL) {
-               if (e->d_name[0] == '.')
-                       continue;
-
-               memset(dirname, 0, FILE_PATH_LEN);
-               snprintf(dirname, FILE_PATH_LEN, "%s/%s", PCI_DEVICES_DIR, 
e->d_name);
-
-               snprintf(filename, sizeof(filename), "%s/vendor", dirname);
-               ret = zxdh_gdma_devfs_parse(filename, &tmp);
-               if (ret != 0)
-                       goto out;
-
-               vendor_id = (uint16_t)tmp;
-
-               snprintf(filename, sizeof(filename), "%s/device", dirname);
-               ret = zxdh_gdma_devfs_parse(filename, &tmp);
-               if (ret != 0)
-                       goto out;
-
-               device_id = (uint16_t)tmp;
-
-               if ((vendor_id == ZXDH_GDMA_VENDORID) && (device_id == 
ZXDH_GDMA_DEVICEID)) {
-                       found = true;
-                       break;
-               }
-       }
-
-       if (found != true) {
-               ZXDH_PMD_LOG(ERR, "Failed to found gdma pci dev");
-               ret = -1;
-               goto out;
-       }
-
-       gdev.vendor_id = vendor_id;
-       gdev.device_id = device_id;
-       memcpy(gdev.d_name, e->d_name, PCI_BUFF_LEN);
-       memcpy(gdev.dirname, dirname, FILE_PATH_LEN);
-       ZXDH_PMD_LOG(INFO, "Found gdma pci dev %s", e->d_name);
-
-       /* Parse pci addr */
-       ret = zxdh_gdma_pci_addr_parse(e->d_name, sizeof(e->d_name), &gdev);
-       if (ret != 0)
-               goto out;
-
-       /* Enable MSE */
-       ret = zxdh_gdma_pci_mse_en(&gdev);
-       if (ret != 0)
-               goto out;
-
-       /* Get bar0 phyaddr and len */
-       snprintf(filename, sizeof(filename), "%s/resource", dirname);
-       ret = zxdh_gdma_resfs_parse(filename, &gdev);
-       if (ret != 0)
-               goto out;
-
-       /* Mmap bar0 virtaddr */
-       snprintf(filename, sizeof(filename), "%s/resource0", dirname);
-       ret = zxdh_gdma_pci_dev_mmap(filename, &gdev, BAR0_IDX);
-       if (ret != 0)
-               goto out;
-
-       ZXDH_PMD_LOG(INFO, "Found pci_scan success");
-
-out:
-       closedir(dir);
-       return ret;
-}
diff --git a/drivers/raw/zxdh/zxdh_pci.h b/drivers/raw/zxdh/zxdh_pci.h
deleted file mode 100644
index 6ecaaeaa2f..0000000000
--- a/drivers/raw/zxdh/zxdh_pci.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2024 ZTE Corporation
- */
-
-#ifndef __ZXDH_PCI_H__
-#define __ZXDH_PCI_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <rte_pci.h>
-
-#define FILE_PATH_LEN                       (100)
-#define PCI_BUFF_LEN                        (16)
-
-struct zxdh_pci_dev {
-       uint16_t    vendor_id;
-       uint16_t    device_id;
-       uint16_t    domain;
-       uint8_t     bus;
-       uint8_t     devid;
-       uint8_t     function;
-       char        dirname[FILE_PATH_LEN];
-       char        d_name[PCI_BUFF_LEN];
-       void       *bar_va[PCI_MAX_RESOURCE];
-       uint64_t    bar_pa[PCI_MAX_RESOURCE];
-       uint64_t    bar_len[PCI_MAX_RESOURCE];
-};
-
-extern struct zxdh_pci_dev gdev;
-
-void zxdh_gdma_pci_dev_munmap(void);
-int zxdh_gdma_pci_scan(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __ZXDH_PCI_H__ */
-
diff --git a/drivers/raw/zxdh/zxdh_rawdev.c b/drivers/raw/zxdh/zxdh_rawdev.c
index 07d2784468..f6f54a74c0 100644
--- a/drivers/raw/zxdh/zxdh_rawdev.c
+++ b/drivers/raw/zxdh/zxdh_rawdev.c
@@ -9,8 +9,9 @@
 #include <stdint.h>
 #include <inttypes.h>
 #include <string.h>
-#include <time.h>
 #include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
 
 #include <rte_byteorder.h>
 #include <rte_errno.h>
@@ -31,9 +32,9 @@
 #include <rte_rawdev_pmd.h>
 #include <rte_pci.h>
 #include <bus_pci_driver.h>
+#include <rte_eal_paging.h>
 
 #include "zxdh_rawdev.h"
-#include "zxdh_pci.h"
 
 /*
  * User define:
@@ -824,6 +825,58 @@ zxdh_gdma_queue_free(struct rte_rawdev *dev, uint16_t 
queue_id)
        return 0;
 }
 
+static int
+zxdh_gdma_map_resource(struct rte_pci_device *dev)
+{
+       int fd = -1;
+       char devname[PATH_MAX];
+       void *mapaddr = NULL;
+       struct rte_pci_addr *loc;
+
+       loc = &dev->addr;
+       snprintf(devname, sizeof(devname), "%s/" PCI_PRI_FMT "/resource0",
+               rte_pci_get_sysfs_path(),
+               loc->domain, loc->bus, loc->devid,
+               loc->function);
+
+               fd = open(devname, O_RDWR);
+               if (fd < 0) {
+                       ZXDH_PMD_LOG(ERR, "Cannot open %s: %s", devname, 
strerror(errno));
+                       return -1;
+               }
+
+       /* Map the PCI memory resource of device */
+       mapaddr = rte_mem_map(NULL, (size_t)dev->mem_resource[0].len,
+                               RTE_PROT_READ | RTE_PROT_WRITE,
+                               RTE_MAP_SHARED, fd, 0);
+       if (mapaddr == NULL) {
+               ZXDH_PMD_LOG(ERR, "cannot map resource(%d, 0x%zx): %s (%p)",
+                               fd, (size_t)dev->mem_resource[0].len,
+                               rte_strerror(rte_errno), mapaddr);
+               close(fd);
+               return -1;
+       }
+
+       close(fd);
+       dev->mem_resource[0].addr = mapaddr;
+
+       return 0;
+}
+
+static void
+zxdh_gdma_unmap_resource(void *requested_addr, size_t size)
+{
+       if (requested_addr == NULL)
+               return;
+
+       /* Unmap the PCI memory resource of device */
+       if (rte_mem_unmap(requested_addr, size))
+               ZXDH_PMD_LOG(ERR, "cannot mem unmap(%p, %#zx): %s",
+                       requested_addr, size, rte_strerror(rte_errno));
+       else
+               ZXDH_PMD_LOG(DEBUG, "PCI memory unmapped at %p", 
requested_addr);
+}
+
 static int
 zxdh_gdma_rawdev_probe(struct rte_pci_driver *pci_drv __rte_unused,
                                                struct rte_pci_device *pci_dev)
@@ -832,27 +885,26 @@ zxdh_gdma_rawdev_probe(struct rte_pci_driver *pci_drv 
__rte_unused,
        struct zxdh_gdma_rawdev *gdmadev = NULL;
        struct zxdh_gdma_queue *queue = NULL;
        uint8_t i = 0;
+       int ret;
 
-       if (zxdh_gdma_pci_scan() != 0) {
-               ZXDH_PMD_LOG(ERR, "Failed to scan gdma pci device!");
+       if (pci_dev->mem_resource[0].phys_addr == 0) {
+               ZXDH_PMD_LOG(ERR, "PCI bar0 resource is invalid");
                return -1;
        }
 
-       if ((gdev.bar_pa[0]) == 0) {
-               ZXDH_PMD_LOG(ERR, "Empty bars 0x%"PRIx64,
-                                                       
(uint64_t)gdev.bar_pa[0]);
-               zxdh_gdma_pci_dev_munmap();
-               return -ENODEV;
+       ret = zxdh_gdma_map_resource(pci_dev);
+       if (ret != 0) {
+               ZXDH_PMD_LOG(ERR, "Failed to mmap pci device(%s)", 
pci_dev->name);
+               return -1;
        }
-       ZXDH_PMD_LOG(INFO, "%04x:%02x:%02x.%01x Bar0 PhyAddr: 0x%"PRIx64,
-                                       gdev.domain, gdev.bus, gdev.devid, 
gdev.function,
-                                       (uint64_t)gdev.bar_pa[0]);
+       ZXDH_PMD_LOG(INFO, "%s bar0 0x%"PRIx64" mapped at %p",
+                               pci_dev->name, 
pci_dev->mem_resource[0].phys_addr,
+                               pci_dev->mem_resource[0].addr);
 
        dev = rte_rawdev_pmd_allocate(dev_name, sizeof(struct 
zxdh_gdma_rawdev), rte_socket_id());
        if (dev == NULL) {
                ZXDH_PMD_LOG(ERR, "Unable to allocate gdma rawdev");
-               zxdh_gdma_pci_dev_munmap();
-               return -1;
+               goto err_out;
        }
        ZXDH_PMD_LOG(INFO, "Init %s on NUMA node %d, dev_id is %d",
                                                dev_name, rte_socket_id(), 
dev->dev_id);
@@ -865,7 +917,7 @@ zxdh_gdma_rawdev_probe(struct rte_pci_driver *pci_drv 
__rte_unused,
        gdmadev->rawdev = dev;
        gdmadev->queue_num = ZXDH_GDMA_TOTAL_CHAN_NUM;
        gdmadev->used_num = 0;
-       gdmadev->base_addr = (uintptr_t)gdev.bar_va[0] + ZXDH_GDMA_BASE_OFFSET;
+       gdmadev->base_addr = (uintptr_t)pci_dev->mem_resource[0].addr + 
ZXDH_GDMA_BASE_OFFSET;
 
        for (i = 0; i < ZXDH_GDMA_TOTAL_CHAN_NUM; i++) {
                queue = &(gdmadev->vqs[i]);
@@ -875,10 +927,15 @@ zxdh_gdma_rawdev_probe(struct rte_pci_driver *pci_drv 
__rte_unused,
        }
 
        return 0;
+
+err_out:
+       zxdh_gdma_unmap_resource(pci_dev->mem_resource[0].addr,
+               (size_t)pci_dev->mem_resource[0].len);
+       return -1;
 }
 
 static int
-zxdh_gdma_rawdev_remove(__rte_unused struct rte_pci_device *pci_dev)
+zxdh_gdma_rawdev_remove(struct rte_pci_device *pci_dev)
 {
        struct rte_rawdev *dev = NULL;
        int ret = 0;
@@ -893,6 +950,10 @@ zxdh_gdma_rawdev_remove(__rte_unused struct rte_pci_device 
*pci_dev)
                ZXDH_PMD_LOG(ERR, "Device cleanup failed");
                return -1;
        }
+
+       zxdh_gdma_unmap_resource(pci_dev->mem_resource[0].addr,
+               (size_t)pci_dev->mem_resource[0].len);
+
        ZXDH_PMD_LOG(DEBUG, "rawdev %s remove done!", dev_name);
 
        return ret;
-- 
2.43.0

Reply via email to