get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 87517,
    "url": "https://patches.dpdk.org/api/patches/87517/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1611890309-99135-2-git-send-email-huawei.xhw@alibaba-inc.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<1611890309-99135-2-git-send-email-huawei.xhw@alibaba-inc.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1611890309-99135-2-git-send-email-huawei.xhw@alibaba-inc.com",
    "date": "2021-01-29T03:18:28",
    "name": "[v6,1/2] bus/pci: use PCI standard sysfs entry to get PIO address",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "480bacfe8c21ed6fde67afbd8beca93c806bde4a",
    "submitter": {
        "id": 1977,
        "url": "https://patches.dpdk.org/api/people/1977/?format=api",
        "name": "谢华伟(此时此刻)",
        "email": "huawei.xhw@alibaba-inc.com"
    },
    "delegate": {
        "id": 24651,
        "url": "https://patches.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1611890309-99135-2-git-send-email-huawei.xhw@alibaba-inc.com/mbox/",
    "series": [
        {
            "id": 15024,
            "url": "https://patches.dpdk.org/api/series/15024/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=15024",
            "date": "2021-01-29T03:18:27",
            "name": "support both PIO and MMIO BAR for legacy device in virtio PMD",
            "version": 6,
            "mbox": "https://patches.dpdk.org/series/15024/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/87517/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/87517/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 65430A09E4;\n\tFri, 29 Jan 2021 04:19:02 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 0934540693;\n\tFri, 29 Jan 2021 04:19:00 +0100 (CET)",
            "from out0-150.mail.aliyun.com (out0-150.mail.aliyun.com\n [140.205.0.150]) by mails.dpdk.org (Postfix) with ESMTP id 57F1640693\n for <dev@dpdk.org>; Fri, 29 Jan 2021 04:18:57 +0100 (CET)",
            "from\n rs3a10040.et2sqa.z1.et2sqa.tbsite.net(mailfrom:huawei.xhw@alibaba-inc.com\n fp:SMTPD_---.JRv0iAd_1611890328) by smtp.aliyun-inc.com(127.0.0.1);\n Fri, 29 Jan 2021 11:18:54 +0800"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=alibaba-inc.com; s=default;\n t=1611890335; h=From:To:Subject:Date:Message-Id;\n bh=2snZIOLXG7EHN06Csv0LOfwunYLYbMzb3+0YJPH/R+I=;\n b=xemu5/tIHs/u3uRflpFXWMZm8ZLgMWetqu3AJ5bVdZwvc4OY8A+Y5FlvehPvAYLxnxFpPZlQcq1U0johSsG0xoOrsELttxHcChcQtLvBeg2qdcxNcgpBXBZfngmycfklh2vccwypvMGWFIUMlE7lQzUO12nMVI/zRS65FIpAYRI=",
        "X-Alimail-AntiSpam": "AC=PASS; BC=-1|-1; BR=01201311R151e4; CH=green;\n DM=||false|;\n DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=ay29a033018047199;\n MF=huawei.xhw@alibaba-inc.com; NM=1; PH=DS; RN=10; SR=0;\n TI=SMTPD_---.JRv0iAd_1611890328;",
        "From": "\" =?utf-8?b?6LCi5Y2O5LyfKOatpOaXtuatpOWIu++8iQ==?= \"\n <huawei.xhw@alibaba-inc.com>",
        "To": "ferruh.yigit@intel.com,\n\tmaxime.coquelin@redhat.com",
        "Cc": "<dev@dpdk.org>, <david.marchand@redhat.com>, <anatoly.burakov@intel.com>,\n <xuemingl@nvidia.com>, <grive@u256.net>, <chenbo.xia@intel.com>, \"\n\t=?utf-8?b?6LCi5Y2O5LyfKOatpOaXtuatpOWIu++8iQ==?= \"\n <huawei.xhw@alibaba-inc.com>",
        "Date": "Fri, 29 Jan 2021 11:18:28 +0800",
        "Message-Id": "<1611890309-99135-2-git-send-email-huawei.xhw@alibaba-inc.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1611890309-99135-1-git-send-email-huawei.xhw@alibaba-inc.com>",
        "References": "<1611890309-99135-1-git-send-email-huawei.xhw@alibaba-inc.com>",
        "Subject": "[dpdk-dev] [PATCH v6 1/2] bus/pci: use PCI standard sysfs entry to\n get PIO address",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: \"huawei.xhw\" <huawei.xhw@alibaba-inc.com>\n\nCurrently virtio PMD asssumes legacy device uses PIO bar.\nThere are three ways to get PIO(PortIO) address for virtio legacy device.\n    under igb_uio, get pio address from uio/uio# sysfs attribute\n    under uio_pci_generic:\n        for X86, get PIO address from /proc/ioport\n        for other ARCH, get PIO address from standard PCI sysfs attribute\n\nActually, igb_uio sysfs attribute exports exactly the same thing as standard PCI sysfs, i.e,\n    pci_dev->resource[]\n\nThis patch fixes these messy things, and uses standard PCI sysfs attribute.\n\nSigned-off-by: huawei xie <huawei.xhw@alibaba-inc.com>\nReviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>\n---\n drivers/bus/pci/linux/pci.c     | 77 -----------------------------------------\n drivers/bus/pci/linux/pci_uio.c | 64 ++++++++++++++++++++++++----------\n 2 files changed, 46 insertions(+), 95 deletions(-)",
    "diff": "diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c\nindex 2e1808b..0f38abf 100644\n--- a/drivers/bus/pci/linux/pci.c\n+++ b/drivers/bus/pci/linux/pci.c\n@@ -677,71 +677,6 @@ int rte_pci_write_config(const struct rte_pci_device *device,\n \t}\n }\n \n-#if defined(RTE_ARCH_X86)\n-static int\n-pci_ioport_map(struct rte_pci_device *dev, int bar __rte_unused,\n-\t\tstruct rte_pci_ioport *p)\n-{\n-\tuint16_t start, end;\n-\tFILE *fp;\n-\tchar *line = NULL;\n-\tchar pci_id[16];\n-\tint found = 0;\n-\tsize_t linesz;\n-\n-\tif (rte_eal_iopl_init() != 0) {\n-\t\tRTE_LOG(ERR, EAL, \"%s(): insufficient ioport permissions for PCI device %s\\n\",\n-\t\t\t__func__, dev->name);\n-\t\treturn -1;\n-\t}\n-\n-\tsnprintf(pci_id, sizeof(pci_id), PCI_PRI_FMT,\n-\t\t dev->addr.domain, dev->addr.bus,\n-\t\t dev->addr.devid, dev->addr.function);\n-\n-\tfp = fopen(\"/proc/ioports\", \"r\");\n-\tif (fp == NULL) {\n-\t\tRTE_LOG(ERR, EAL, \"%s(): can't open ioports\\n\", __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-\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-\tp->base = start;\n-\tRTE_LOG(DEBUG, EAL, \"PCI Port IO found start=0x%x\\n\", start);\n-\n-\treturn 0;\n-}\n-#endif\n-\n int\n rte_pci_ioport_map(struct rte_pci_device *dev, int bar,\n \t\tstruct rte_pci_ioport *p)\n@@ -756,14 +691,8 @@ int rte_pci_write_config(const struct rte_pci_device *device,\n \t\tbreak;\n #endif\n \tcase RTE_PCI_KDRV_IGB_UIO:\n-\t\tret = pci_uio_ioport_map(dev, bar, p);\n-\t\tbreak;\n \tcase RTE_PCI_KDRV_UIO_GENERIC:\n-#if defined(RTE_ARCH_X86)\n-\t\tret = pci_ioport_map(dev, bar, p);\n-#else\n \t\tret = pci_uio_ioport_map(dev, bar, p);\n-#endif\n \t\tbreak;\n \tdefault:\n \t\tbreak;\n@@ -830,14 +759,8 @@ int rte_pci_write_config(const struct rte_pci_device *device,\n \t\tbreak;\n #endif\n \tcase RTE_PCI_KDRV_IGB_UIO:\n-\t\tret = pci_uio_ioport_unmap(p);\n-\t\tbreak;\n \tcase RTE_PCI_KDRV_UIO_GENERIC:\n-#if defined(RTE_ARCH_X86)\n-\t\tret = 0;\n-#else\n \t\tret = pci_uio_ioport_unmap(p);\n-#endif\n \t\tbreak;\n \tdefault:\n \t\tbreak;\ndiff --git a/drivers/bus/pci/linux/pci_uio.c b/drivers/bus/pci/linux/pci_uio.c\nindex f3305a2..01f2a40 100644\n--- a/drivers/bus/pci/linux/pci_uio.c\n+++ b/drivers/bus/pci/linux/pci_uio.c\n@@ -373,10 +373,13 @@\n pci_uio_ioport_map(struct rte_pci_device *dev, int bar,\n \t\t   struct rte_pci_ioport *p)\n {\n+\tFILE *f = NULL;\n \tchar dirname[PATH_MAX];\n \tchar filename[PATH_MAX];\n-\tint uio_num;\n-\tunsigned long start;\n+\tchar buf[BUFSIZ];\n+\tuint64_t phys_addr, end_addr, flags;\n+\tunsigned long base;\n+\tint i;\n \n \tif (rte_eal_iopl_init() != 0) {\n \t\tRTE_LOG(ERR, EAL, \"%s(): insufficient ioport permissions for PCI device %s\\n\",\n@@ -384,41 +387,66 @@\n \t\treturn -1;\n \t}\n \n-\tuio_num = pci_get_uio_dev(dev, dirname, sizeof(dirname), 0);\n-\tif (uio_num < 0)\n+\t/* open and read addresses of the corresponding resource in sysfs */\n+\tsnprintf(filename, sizeof(filename), \"%s/\" PCI_PRI_FMT \"/resource\",\n+\t\trte_pci_get_sysfs_path(), dev->addr.domain, dev->addr.bus,\n+\t\tdev->addr.devid, dev->addr.function);\n+\tf = fopen(filename, \"r\");\n+\tif (f == NULL) {\n+\t\tRTE_LOG(ERR, EAL, \"%s(): Cannot open sysfs resource: %s\\n\",\n+\t\t\t__func__, strerror(errno));\n \t\treturn -1;\n+\t}\n \n-\t/* get portio start */\n-\tsnprintf(filename, sizeof(filename),\n-\t\t \"%s/portio/port%d/start\", dirname, bar);\n-\tif (eal_parse_sysfs_value(filename, &start) < 0) {\n-\t\tRTE_LOG(ERR, EAL, \"%s(): cannot parse portio start\\n\",\n-\t\t\t__func__);\n-\t\treturn -1;\n+\tfor (i = 0; i < bar + 1; i++) {\n+\t\tif (fgets(buf, sizeof(buf), f) == NULL) {\n+\t\t\tRTE_LOG(ERR, EAL, \"%s(): Cannot read sysfs resource\\n\", __func__);\n+\t\t\tgoto error;\n+\t\t}\n \t}\n-\t/* ensure we don't get anything funny here, read/write will cast to\n-\t * uin16_t */\n-\tif (start > UINT16_MAX)\n-\t\treturn -1;\n+\tif (pci_parse_one_sysfs_resource(buf, sizeof(buf), &phys_addr,\n+\t\t&end_addr, &flags) < 0)\n+\t\tgoto error;\n+\n+\tif (!(flags & IORESOURCE_IO)) {\n+\t\tRTE_LOG(ERR, EAL, \"%s(): bar resource other than IO is not supported\\n\", __func__);\n+\t\tgoto error;\n+\t}\n+\tbase = (unsigned long)phys_addr;\n+\tRTE_LOG(INFO, EAL, \"%s(): PIO BAR %08lx detected\\n\", __func__, base);\n+\n+\tif (base > UINT16_MAX)\n+\t\tgoto error;\n \n \t/* FIXME only for primary process ? */\n \tif (dev->intr_handle.type == RTE_INTR_HANDLE_UNKNOWN) {\n+\t\tint uio_num = pci_get_uio_dev(dev, dirname, sizeof(dirname), 0);\n+\t\tif (uio_num < 0) {\n+\t\t\tRTE_LOG(ERR, EAL, \"cannot open %s: %s\\n\",\n+\t\t\t\tdirname, strerror(errno));\n+\t\t\tgoto error;\n+\t\t}\n \n \t\tsnprintf(filename, sizeof(filename), \"/dev/uio%u\", uio_num);\n \t\tdev->intr_handle.fd = open(filename, O_RDWR);\n \t\tif (dev->intr_handle.fd < 0) {\n \t\t\tRTE_LOG(ERR, EAL, \"Cannot open %s: %s\\n\",\n \t\t\t\tfilename, strerror(errno));\n-\t\t\treturn -1;\n+\t\t\tgoto error;\n \t\t}\n \t\tdev->intr_handle.type = RTE_INTR_HANDLE_UIO;\n \t}\n \n-\tRTE_LOG(DEBUG, EAL, \"PCI Port IO found start=0x%lx\\n\", start);\n+\tRTE_LOG(DEBUG, EAL, \"PCI Port IO found start=0x%lx\\n\", base);\n \n-\tp->base = start;\n+\tp->base = base;\n \tp->len = 0;\n+\tfclose(f);\n \treturn 0;\n+error:\n+\tif (f)\n+\t\tfclose(f);\n+\treturn -1;\n }\n #else\n int\n",
    "prefixes": [
        "v6",
        "1/2"
    ]
}