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