get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/9844/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 9844,
    "url": "http://patches.dpdk.org/api/patches/9844/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1452757372-686-4-git-send-email-yuanhan.liu@linux.intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1452757372-686-4-git-send-email-yuanhan.liu@linux.intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1452757372-686-4-git-send-email-yuanhan.liu@linux.intel.com",
    "date": "2016-01-14T07:42:47",
    "name": "[dpdk-dev,v3,3/8] virtio: move left pci stuff to virtio_pci.c",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "19c46c6da757d23b42fb1ac8af2da89f2ae2559e",
    "submitter": {
        "id": 307,
        "url": "http://patches.dpdk.org/api/people/307/?format=api",
        "name": "Yuanhan Liu",
        "email": "yuanhan.liu@linux.intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1452757372-686-4-git-send-email-yuanhan.liu@linux.intel.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/9844/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/9844/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 114418E8E;\n\tThu, 14 Jan 2016 08:41:45 +0100 (CET)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby dpdk.org (Postfix) with ESMTP id 3D8938E6A\n\tfor <dev@dpdk.org>; Thu, 14 Jan 2016 08:41:41 +0100 (CET)",
            "from fmsmga003.fm.intel.com ([10.253.24.29])\n\tby orsmga102.jf.intel.com with ESMTP; 13 Jan 2016 23:41:39 -0800",
            "from yliu-dev.sh.intel.com ([10.239.66.49])\n\tby FMSMGA003.fm.intel.com with ESMTP; 13 Jan 2016 23:41:38 -0800"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.22,293,1449561600\"; d=\"scan'208\";a=\"633215271\"",
        "From": "Yuanhan Liu <yuanhan.liu@linux.intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Thu, 14 Jan 2016 15:42:47 +0800",
        "Message-Id": "<1452757372-686-4-git-send-email-yuanhan.liu@linux.intel.com>",
        "X-Mailer": "git-send-email 1.9.0",
        "In-Reply-To": "<1452757372-686-1-git-send-email-yuanhan.liu@linux.intel.com>",
        "References": "<1452581944-24838-1-git-send-email-yuanhan.liu@linux.intel.com>\n\t<1452757372-686-1-git-send-email-yuanhan.liu@linux.intel.com>",
        "Cc": "\"Michael S. Tsirkin\" <mst@redhat.com>",
        "Subject": "[dpdk-dev] [PATCH v3 3/8] virtio: move left pci stuff to\n\tvirtio_pci.c",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "virtio_pci.c is a more proper place for pci stuff; virtio_ethdev.c is not.\n\nSigned-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>\n---\n drivers/net/virtio/virtio_ethdev.c | 265 +-----------------------------------\n drivers/net/virtio/virtio_pci.c    | 270 ++++++++++++++++++++++++++++++++++++-\n 2 files changed, 270 insertions(+), 265 deletions(-)",
    "diff": "diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c\nindex 6c1d3a0..b57224d 100644\n--- a/drivers/net/virtio/virtio_ethdev.c\n+++ b/drivers/net/virtio/virtio_ethdev.c\n@@ -36,10 +36,6 @@\n #include <stdio.h>\n #include <errno.h>\n #include <unistd.h>\n-#ifdef RTE_EXEC_ENV_LINUXAPP\n-#include <dirent.h>\n-#include <fcntl.h>\n-#endif\n \n #include <rte_ethdev.h>\n #include <rte_memcpy.h>\n@@ -955,260 +951,6 @@ virtio_negotiate_features(struct virtio_hw *hw)\n \t\thw->guest_features);\n }\n \n-#ifdef RTE_EXEC_ENV_LINUXAPP\n-static int\n-parse_sysfs_value(const char *filename, unsigned long *val)\n-{\n-\tFILE *f;\n-\tchar buf[BUFSIZ];\n-\tchar *end = NULL;\n-\n-\tf = fopen(filename, \"r\");\n-\tif (f == NULL) {\n-\t\tPMD_INIT_LOG(ERR, \"%s(): cannot open sysfs value %s\",\n-\t\t\t     __func__, filename);\n-\t\treturn -1;\n-\t}\n-\n-\tif (fgets(buf, sizeof(buf), f) == NULL) {\n-\t\tPMD_INIT_LOG(ERR, \"%s(): cannot read sysfs value %s\",\n-\t\t\t     __func__, filename);\n-\t\tfclose(f);\n-\t\treturn -1;\n-\t}\n-\t*val = strtoul(buf, &end, 0);\n-\tif ((buf[0] == '\\0') || (end == NULL) || (*end != '\\n')) {\n-\t\tPMD_INIT_LOG(ERR, \"%s(): cannot parse sysfs value %s\",\n-\t\t\t     __func__, filename);\n-\t\tfclose(f);\n-\t\treturn -1;\n-\t}\n-\tfclose(f);\n-\treturn 0;\n-}\n-\n-static int get_uio_dev(struct rte_pci_addr *loc, char *buf, unsigned int buflen,\n-\t\t\tunsigned int *uio_num)\n-{\n-\tstruct dirent *e;\n-\tDIR *dir;\n-\tchar dirname[PATH_MAX];\n-\n-\t/* depending on kernel version, uio can be located in uio/uioX\n-\t * or uio:uioX */\n-\tsnprintf(dirname, sizeof(dirname),\n-\t\t     SYSFS_PCI_DEVICES \"/\" PCI_PRI_FMT \"/uio\",\n-\t\t     loc->domain, loc->bus, loc->devid, loc->function);\n-\tdir = opendir(dirname);\n-\tif (dir == NULL) {\n-\t\t/* retry with the parent directory */\n-\t\tsnprintf(dirname, sizeof(dirname),\n-\t\t\t     SYSFS_PCI_DEVICES \"/\" PCI_PRI_FMT,\n-\t\t\t     loc->domain, loc->bus, loc->devid, loc->function);\n-\t\tdir = opendir(dirname);\n-\n-\t\tif (dir == NULL) {\n-\t\t\tPMD_INIT_LOG(ERR, \"Cannot opendir %s\", dirname);\n-\t\t\treturn -1;\n-\t\t}\n-\t}\n-\n-\t/* take the first file starting with \"uio\" */\n-\twhile ((e = readdir(dir)) != NULL) {\n-\t\t/* format could be uio%d ...*/\n-\t\tint shortprefix_len = sizeof(\"uio\") - 1;\n-\t\t/* ... or uio:uio%d */\n-\t\tint longprefix_len = sizeof(\"uio:uio\") - 1;\n-\t\tchar *endptr;\n-\n-\t\tif (strncmp(e->d_name, \"uio\", 3) != 0)\n-\t\t\tcontinue;\n-\n-\t\t/* first try uio%d */\n-\t\terrno = 0;\n-\t\t*uio_num = strtoull(e->d_name + shortprefix_len, &endptr, 10);\n-\t\tif (errno == 0 && endptr != (e->d_name + shortprefix_len)) {\n-\t\t\tsnprintf(buf, buflen, \"%s/uio%u\", dirname, *uio_num);\n-\t\t\tbreak;\n-\t\t}\n-\n-\t\t/* then try uio:uio%d */\n-\t\terrno = 0;\n-\t\t*uio_num = strtoull(e->d_name + longprefix_len, &endptr, 10);\n-\t\tif (errno == 0 && endptr != (e->d_name + longprefix_len)) {\n-\t\t\tsnprintf(buf, buflen, \"%s/uio:uio%u\", dirname,\n-\t\t\t\t     *uio_num);\n-\t\t\tbreak;\n-\t\t}\n-\t}\n-\tclosedir(dir);\n-\n-\t/* No uio resource found */\n-\tif (e == NULL) {\n-\t\tPMD_INIT_LOG(ERR, \"Could not find uio resource\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int\n-virtio_has_msix(const struct rte_pci_addr *loc)\n-{\n-\tDIR *d;\n-\tchar dirname[PATH_MAX];\n-\n-\tsnprintf(dirname, sizeof(dirname),\n-\t\t     SYSFS_PCI_DEVICES \"/\" PCI_PRI_FMT \"/msi_irqs\",\n-\t\t     loc->domain, loc->bus, loc->devid, loc->function);\n-\n-\td = opendir(dirname);\n-\tif (d)\n-\t\tclosedir(d);\n-\n-\treturn (d != NULL);\n-}\n-\n-/* Extract I/O port numbers from sysfs */\n-static int virtio_resource_init_by_uio(struct rte_pci_device *pci_dev)\n-{\n-\tchar dirname[PATH_MAX];\n-\tchar filename[PATH_MAX];\n-\tunsigned long start, size;\n-\tunsigned int uio_num;\n-\n-\tif (get_uio_dev(&pci_dev->addr, dirname, sizeof(dirname), &uio_num) < 0)\n-\t\treturn -1;\n-\n-\t/* get portio size */\n-\tsnprintf(filename, sizeof(filename),\n-\t\t     \"%s/portio/port0/size\", dirname);\n-\tif (parse_sysfs_value(filename, &size) < 0) {\n-\t\tPMD_INIT_LOG(ERR, \"%s(): cannot parse size\",\n-\t\t\t     __func__);\n-\t\treturn -1;\n-\t}\n-\n-\t/* get portio start */\n-\tsnprintf(filename, sizeof(filename),\n-\t\t \"%s/portio/port0/start\", dirname);\n-\tif (parse_sysfs_value(filename, &start) < 0) {\n-\t\tPMD_INIT_LOG(ERR, \"%s(): cannot parse portio start\",\n-\t\t\t     __func__);\n-\t\treturn -1;\n-\t}\n-\tpci_dev->mem_resource[0].addr = (void *)(uintptr_t)start;\n-\tpci_dev->mem_resource[0].len =  (uint64_t)size;\n-\tPMD_INIT_LOG(DEBUG,\n-\t\t     \"PCI Port IO found start=0x%lx with size=0x%lx\",\n-\t\t     start, size);\n-\n-\t/* save fd */\n-\tmemset(dirname, 0, sizeof(dirname));\n-\tsnprintf(dirname, sizeof(dirname), \"/dev/uio%u\", uio_num);\n-\tpci_dev->intr_handle.fd = open(dirname, O_RDWR);\n-\tif (pci_dev->intr_handle.fd < 0) {\n-\t\tPMD_INIT_LOG(ERR, \"Cannot open %s: %s\\n\",\n-\t\t\tdirname, strerror(errno));\n-\t\treturn -1;\n-\t}\n-\n-\tpci_dev->intr_handle.type = RTE_INTR_HANDLE_UIO;\n-\tpci_dev->driver->drv_flags |= RTE_PCI_DRV_INTR_LSC;\n-\n-\treturn 0;\n-}\n-\n-/* Extract port I/O numbers from proc/ioports */\n-static int virtio_resource_init_by_ioports(struct rte_pci_device *pci_dev)\n-{\n-\tuint16_t start, end;\n-\tint size;\n-\tFILE *fp;\n-\tchar *line = NULL;\n-\tchar pci_id[16];\n-\tint found = 0;\n-\tsize_t linesz;\n-\n-\tsnprintf(pci_id, sizeof(pci_id), PCI_PRI_FMT,\n-\t\t pci_dev->addr.domain,\n-\t\t pci_dev->addr.bus,\n-\t\t pci_dev->addr.devid,\n-\t\t pci_dev->addr.function);\n-\n-\tfp = fopen(\"/proc/ioports\", \"r\");\n-\tif (fp == NULL) {\n-\t\tPMD_INIT_LOG(ERR, \"%s(): can't open ioports\", __func__);\n-\t\treturn -1;\n-\t}\n-\n-\twhile (getdelim(&line, &linesz, '\\n', fp) > 0) {\n-\t\tchar *ptr = line;\n-\t\tchar *left;\n-\t\tint n;\n-\n-\t\tn = strcspn(ptr, \":\");\n-\t\tptr[n] = 0;\n-\t\tleft = &ptr[n+1];\n-\n-\t\twhile (*left && isspace(*left))\n-\t\t\tleft++;\n-\n-\t\tif (!strncmp(left, pci_id, strlen(pci_id))) {\n-\t\t\tfound = 1;\n-\n-\t\t\twhile (*ptr && isspace(*ptr))\n-\t\t\t\tptr++;\n-\n-\t\t\tsscanf(ptr, \"%04hx-%04hx\", &start, &end);\n-\t\t\tsize = end - start + 1;\n-\n-\t\t\tbreak;\n-\t\t}\n-\t}\n-\n-\tfree(line);\n-\tfclose(fp);\n-\n-\tif (!found)\n-\t\treturn -1;\n-\n-\tpci_dev->mem_resource[0].addr = (void *)(uintptr_t)(uint32_t)start;\n-\tpci_dev->mem_resource[0].len =  (uint64_t)size;\n-\tPMD_INIT_LOG(DEBUG,\n-\t\t\"PCI Port IO found start=0x%x with size=0x%x\",\n-\t\tstart, size);\n-\n-\t/* can't support lsc interrupt without uio */\n-\tpci_dev->driver->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;\n-\n-\treturn 0;\n-}\n-\n-/* Extract I/O port numbers from sysfs */\n-static int virtio_resource_init(struct rte_pci_device *pci_dev)\n-{\n-\tif (virtio_resource_init_by_uio(pci_dev) == 0)\n-\t\treturn 0;\n-\telse\n-\t\treturn virtio_resource_init_by_ioports(pci_dev);\n-}\n-\n-#else\n-static int\n-virtio_has_msix(const struct rte_pci_addr *loc __rte_unused)\n-{\n-\t/* nic_uio does not enable interrupts, return 0 (false). */\n-\treturn 0;\n-}\n-\n-static int virtio_resource_init(struct rte_pci_device *pci_dev __rte_unused)\n-{\n-\t/* no setup required */\n-\treturn 0;\n-}\n-#endif\n-\n /*\n  * Process Virtio Config changed interrupt and call the callback\n  * if link state changed.\n@@ -1279,14 +1021,9 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)\n \n \tpci_dev = eth_dev->pci_dev;\n \n-\tvtpci_init(pci_dev, hw);\n-\n-\tif (virtio_resource_init(pci_dev) < 0)\n+\tif (vtpci_init(pci_dev, hw) < 0)\n \t\treturn -1;\n \n-\thw->use_msix = virtio_has_msix(&pci_dev->addr);\n-\thw->io_base = (uint32_t)(uintptr_t)pci_dev->mem_resource[0].addr;\n-\n \t/* Reset the device although not necessary at startup */\n \tvtpci_reset(hw);\n \ndiff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c\nindex 9930efa..03d623b 100644\n--- a/drivers/net/virtio/virtio_pci.c\n+++ b/drivers/net/virtio/virtio_pci.c\n@@ -32,6 +32,11 @@\n  */\n #include <stdint.h>\n \n+#ifdef RTE_EXEC_ENV_LINUXAPP\n+ #include <dirent.h>\n+ #include <fcntl.h>\n+#endif\n+\n #include \"virtio_pci.h\"\n #include \"virtio_logs.h\"\n #include \"virtqueue.h\"\n@@ -156,6 +161,264 @@ legacy_notify_queue(struct virtio_hw *hw, struct virtqueue *vq)\n \tVIRTIO_WRITE_REG_2(hw, VIRTIO_PCI_QUEUE_NOTIFY, vq->vq_queue_index);\n }\n \n+#ifdef RTE_EXEC_ENV_LINUXAPP\n+static int\n+parse_sysfs_value(const char *filename, unsigned long *val)\n+{\n+\tFILE *f;\n+\tchar buf[BUFSIZ];\n+\tchar *end = NULL;\n+\n+\tf = fopen(filename, \"r\");\n+\tif (f == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"%s(): cannot open sysfs value %s\",\n+\t\t\t     __func__, filename);\n+\t\treturn -1;\n+\t}\n+\n+\tif (fgets(buf, sizeof(buf), f) == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"%s(): cannot read sysfs value %s\",\n+\t\t\t     __func__, filename);\n+\t\tfclose(f);\n+\t\treturn -1;\n+\t}\n+\t*val = strtoul(buf, &end, 0);\n+\tif ((buf[0] == '\\0') || (end == NULL) || (*end != '\\n')) {\n+\t\tPMD_INIT_LOG(ERR, \"%s(): cannot parse sysfs value %s\",\n+\t\t\t     __func__, filename);\n+\t\tfclose(f);\n+\t\treturn -1;\n+\t}\n+\tfclose(f);\n+\treturn 0;\n+}\n+\n+static int\n+get_uio_dev(struct rte_pci_addr *loc, char *buf, unsigned int buflen,\n+\t\t\tunsigned int *uio_num)\n+{\n+\tstruct dirent *e;\n+\tDIR *dir;\n+\tchar dirname[PATH_MAX];\n+\n+\t/* depending on kernel version, uio can be located in uio/uioX\n+\t * or uio:uioX */\n+\tsnprintf(dirname, sizeof(dirname),\n+\t\t     SYSFS_PCI_DEVICES \"/\" PCI_PRI_FMT \"/uio\",\n+\t\t     loc->domain, loc->bus, loc->devid, loc->function);\n+\tdir = opendir(dirname);\n+\tif (dir == NULL) {\n+\t\t/* retry with the parent directory */\n+\t\tsnprintf(dirname, sizeof(dirname),\n+\t\t\t     SYSFS_PCI_DEVICES \"/\" PCI_PRI_FMT,\n+\t\t\t     loc->domain, loc->bus, loc->devid, loc->function);\n+\t\tdir = opendir(dirname);\n+\n+\t\tif (dir == NULL) {\n+\t\t\tPMD_INIT_LOG(ERR, \"Cannot opendir %s\", dirname);\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\t/* take the first file starting with \"uio\" */\n+\twhile ((e = readdir(dir)) != NULL) {\n+\t\t/* format could be uio%d ...*/\n+\t\tint shortprefix_len = sizeof(\"uio\") - 1;\n+\t\t/* ... or uio:uio%d */\n+\t\tint longprefix_len = sizeof(\"uio:uio\") - 1;\n+\t\tchar *endptr;\n+\n+\t\tif (strncmp(e->d_name, \"uio\", 3) != 0)\n+\t\t\tcontinue;\n+\n+\t\t/* first try uio%d */\n+\t\terrno = 0;\n+\t\t*uio_num = strtoull(e->d_name + shortprefix_len, &endptr, 10);\n+\t\tif (errno == 0 && endptr != (e->d_name + shortprefix_len)) {\n+\t\t\tsnprintf(buf, buflen, \"%s/uio%u\", dirname, *uio_num);\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t/* then try uio:uio%d */\n+\t\terrno = 0;\n+\t\t*uio_num = strtoull(e->d_name + longprefix_len, &endptr, 10);\n+\t\tif (errno == 0 && endptr != (e->d_name + longprefix_len)) {\n+\t\t\tsnprintf(buf, buflen, \"%s/uio:uio%u\", dirname,\n+\t\t\t\t     *uio_num);\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\tclosedir(dir);\n+\n+\t/* No uio resource found */\n+\tif (e == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Could not find uio resource\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+legacy_virtio_has_msix(const struct rte_pci_addr *loc)\n+{\n+\tDIR *d;\n+\tchar dirname[PATH_MAX];\n+\n+\tsnprintf(dirname, sizeof(dirname),\n+\t\t     SYSFS_PCI_DEVICES \"/\" PCI_PRI_FMT \"/msi_irqs\",\n+\t\t     loc->domain, loc->bus, loc->devid, loc->function);\n+\n+\td = opendir(dirname);\n+\tif (d)\n+\t\tclosedir(d);\n+\n+\treturn (d != NULL);\n+}\n+\n+/* Extract I/O port numbers from sysfs */\n+static int\n+virtio_resource_init_by_uio(struct rte_pci_device *pci_dev)\n+{\n+\tchar dirname[PATH_MAX];\n+\tchar filename[PATH_MAX];\n+\tunsigned long start, size;\n+\tunsigned int uio_num;\n+\n+\tif (get_uio_dev(&pci_dev->addr, dirname, sizeof(dirname), &uio_num) < 0)\n+\t\treturn -1;\n+\n+\t/* get portio size */\n+\tsnprintf(filename, sizeof(filename),\n+\t\t     \"%s/portio/port0/size\", dirname);\n+\tif (parse_sysfs_value(filename, &size) < 0) {\n+\t\tPMD_INIT_LOG(ERR, \"%s(): cannot parse size\",\n+\t\t\t     __func__);\n+\t\treturn -1;\n+\t}\n+\n+\t/* get portio start */\n+\tsnprintf(filename, sizeof(filename),\n+\t\t \"%s/portio/port0/start\", dirname);\n+\tif (parse_sysfs_value(filename, &start) < 0) {\n+\t\tPMD_INIT_LOG(ERR, \"%s(): cannot parse portio start\",\n+\t\t\t     __func__);\n+\t\treturn -1;\n+\t}\n+\tpci_dev->mem_resource[0].addr = (void *)(uintptr_t)start;\n+\tpci_dev->mem_resource[0].len =  (uint64_t)size;\n+\tPMD_INIT_LOG(DEBUG,\n+\t\t     \"PCI Port IO found start=0x%lx with size=0x%lx\",\n+\t\t     start, size);\n+\n+\t/* save fd */\n+\tmemset(dirname, 0, sizeof(dirname));\n+\tsnprintf(dirname, sizeof(dirname), \"/dev/uio%u\", uio_num);\n+\tpci_dev->intr_handle.fd = open(dirname, O_RDWR);\n+\tif (pci_dev->intr_handle.fd < 0) {\n+\t\tPMD_INIT_LOG(ERR, \"Cannot open %s: %s\\n\",\n+\t\t\tdirname, strerror(errno));\n+\t\treturn -1;\n+\t}\n+\n+\tpci_dev->intr_handle.type = RTE_INTR_HANDLE_UIO;\n+\tpci_dev->driver->drv_flags |= RTE_PCI_DRV_INTR_LSC;\n+\n+\treturn 0;\n+}\n+\n+/* Extract port I/O numbers from proc/ioports */\n+static int\n+virtio_resource_init_by_ioports(struct rte_pci_device *pci_dev)\n+{\n+\tuint16_t start, end;\n+\tint size;\n+\tFILE *fp;\n+\tchar *line = NULL;\n+\tchar pci_id[16];\n+\tint found = 0;\n+\tsize_t linesz;\n+\n+\tsnprintf(pci_id, sizeof(pci_id), PCI_PRI_FMT,\n+\t\t pci_dev->addr.domain,\n+\t\t pci_dev->addr.bus,\n+\t\t pci_dev->addr.devid,\n+\t\t pci_dev->addr.function);\n+\n+\tfp = fopen(\"/proc/ioports\", \"r\");\n+\tif (fp == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"%s(): can't open ioports\", __func__);\n+\t\treturn -1;\n+\t}\n+\n+\twhile (getdelim(&line, &linesz, '\\n', fp) > 0) {\n+\t\tchar *ptr = line;\n+\t\tchar *left;\n+\t\tint n;\n+\n+\t\tn = strcspn(ptr, \":\");\n+\t\tptr[n] = 0;\n+\t\tleft = &ptr[n+1];\n+\n+\t\twhile (*left && isspace(*left))\n+\t\t\tleft++;\n+\n+\t\tif (!strncmp(left, pci_id, strlen(pci_id))) {\n+\t\t\tfound = 1;\n+\n+\t\t\twhile (*ptr && isspace(*ptr))\n+\t\t\t\tptr++;\n+\n+\t\t\tsscanf(ptr, \"%04hx-%04hx\", &start, &end);\n+\t\t\tsize = end - start + 1;\n+\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tfree(line);\n+\tfclose(fp);\n+\n+\tif (!found)\n+\t\treturn -1;\n+\n+\tpci_dev->mem_resource[0].addr = (void *)(uintptr_t)(uint32_t)start;\n+\tpci_dev->mem_resource[0].len =  (uint64_t)size;\n+\tPMD_INIT_LOG(DEBUG,\n+\t\t\"PCI Port IO found start=0x%x with size=0x%x\",\n+\t\tstart, size);\n+\n+\t/* can't support lsc interrupt without uio */\n+\tpci_dev->driver->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;\n+\n+\treturn 0;\n+}\n+\n+/* Extract I/O port numbers from sysfs */\n+static int\n+legacy_virtio_resource_init(struct rte_pci_device *pci_dev)\n+{\n+\tif (virtio_resource_init_by_uio(pci_dev) == 0)\n+\t\treturn 0;\n+\telse\n+\t\treturn virtio_resource_init_by_ioports(pci_dev);\n+}\n+\n+#else\n+static int\n+legayc_virtio_has_msix(const struct rte_pci_addr *loc __rte_unused)\n+{\n+\t/* nic_uio does not enable interrupts, return 0 (false). */\n+\treturn 0;\n+}\n+\n+static int\n+legacy_virtio_resource_init(struct rte_pci_device *pci_dev __rte_unused)\n+{\n+\t/* no setup required */\n+\treturn 0;\n+}\n+#endif\n \n static const struct virtio_pci_ops legacy_ops = {\n \t.read_dev_cfg\t= legacy_read_dev_config,\n@@ -241,9 +504,14 @@ vtpci_irq_config(struct virtio_hw *hw, uint16_t vec)\n }\n \n int\n-vtpci_init(struct rte_pci_device *dev __rte_unused, struct virtio_hw *hw)\n+vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw)\n {\n \thw->vtpci_ops = &legacy_ops;\n \n+\tif (legacy_virtio_resource_init(dev) < 0)\n+\t\treturn -1;\n+\thw->use_msix = legacy_virtio_has_msix(&dev->addr);\n+\thw->io_base  = (uint32_t)(uintptr_t)dev->mem_resource[0].addr;\n+\n \treturn 0;\n }\n",
    "prefixes": [
        "dpdk-dev",
        "v3",
        "3/8"
    ]
}