get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 17058,
    "url": "https://patches.dpdk.org/api/patches/17058/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1479360605-20558-6-git-send-email-shreyansh.jain@nxp.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": "<1479360605-20558-6-git-send-email-shreyansh.jain@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1479360605-20558-6-git-send-email-shreyansh.jain@nxp.com",
    "date": "2016-11-17T05:30:04",
    "name": "[dpdk-dev,RFC,5/6] eal: supporting bus model in init process",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "1400a1e88fb12a1a8b256237324561cd32052b9e",
    "submitter": {
        "id": 497,
        "url": "https://patches.dpdk.org/api/people/497/?format=api",
        "name": "Shreyansh Jain",
        "email": "shreyansh.jain@nxp.com"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1479360605-20558-6-git-send-email-shreyansh.jain@nxp.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/17058/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/17058/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 DE2625934;\n\tThu, 17 Nov 2016 06:29:15 +0100 (CET)",
            "from NAM01-SN1-obe.outbound.protection.outlook.com\n\t(mail-sn1nam01on0075.outbound.protection.outlook.com [104.47.32.75])\n\tby dpdk.org (Postfix) with ESMTP id 298BD558B\n\tfor <dev@dpdk.org>; Thu, 17 Nov 2016 06:28:18 +0100 (CET)",
            "from DM2PR03CA0042.namprd03.prod.outlook.com (10.141.96.41) by\n\tBN1PR0301MB0737.namprd03.prod.outlook.com (10.160.78.144) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id\n\t15.1.721.10; Thu, 17 Nov 2016 05:28:15 +0000",
            "from BN1AFFO11FD048.protection.gbl (2a01:111:f400:7c10::121) by\n\tDM2PR03CA0042.outlook.office365.com (2a01:111:e400:2428::41) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.721.10 via\n\tFrontend Transport; Thu, 17 Nov 2016 05:28:15 +0000",
            "from tx30smr01.am.freescale.net (192.88.168.50) by\n\tBN1AFFO11FD048.mail.protection.outlook.com (10.58.53.63) with\n\tMicrosoft SMTP Server (version=TLS1_0,\n\tcipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.721.5\n\tvia Frontend Transport; Thu, 17 Nov 2016 05:28:14 +0000",
            "from Tophie.ap.freescale.net ([10.232.14.87])\n\tby tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id\n\tuAH5S1pu018741; Wed, 16 Nov 2016 22:28:12 -0700"
        ],
        "Authentication-Results": "spf=fail (sender IP is 192.88.168.50)\n\tsmtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed)\n\theader.d=none; nxp.com; dmarc=fail action=none header.from=nxp.com;\n\tnxp.com; \n\tdkim=none (message not signed) header.d=none;",
        "Received-SPF": "Fail (protection.outlook.com: domain of nxp.com does not\n\tdesignate 192.88.168.50 as permitted sender)\n\treceiver=protection.outlook.com; \n\tclient-ip=192.88.168.50; helo=tx30smr01.am.freescale.net;",
        "X-IncomingTopHeaderMarker": "OriginalChecksum:; UpperCasedChecksum:;\n\tSizeAsReceived:663; Count:10",
        "From": "Shreyansh Jain <shreyansh.jain@nxp.com>",
        "To": "<david.marchand@6wind.com>",
        "CC": "<dev@dpdk.org>, Shreyansh Jain <shreyansh.jain@nxp.com>",
        "Date": "Thu, 17 Nov 2016 11:00:04 +0530",
        "Message-ID": "<1479360605-20558-6-git-send-email-shreyansh.jain@nxp.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1479360605-20558-1-git-send-email-shreyansh.jain@nxp.com>",
        "References": "<1479360605-20558-1-git-send-email-shreyansh.jain@nxp.com>",
        "X-IncomingHeaderCount": "10",
        "X-EOPAttributedMessage": "0",
        "X-Matching-Connectors": "131238340949449667;\n\t(91ab9b29-cfa4-454e-5278-08d120cd25b8); ()",
        "X-Forefront-Antispam-Report": "CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI;\n\tSFV:NSPM;\n\tSFS:(10009020)(6009001)(7916002)(2980300002)(1109001)(1110001)(339900001)(336004)(189002)(199003)(50466002)(48376002)(76176999)(47776003)(110136003)(50986999)(85426001)(189998001)(97736004)(7846002)(6666003)(50226002)(2950100002)(6916009)(33646002)(8676002)(8666005)(5660300001)(305945005)(68736007)(2351001)(77096005)(626004)(92566002)(106466001)(356003)(2906002)(104016004)(8936002)(5003940100001)(87936001)(105606002)(4326007)(86362001)(36756003)(81156014)(81166006)(7059030)(217873001);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:BN1PR0301MB0737;\n\tH:tx30smr01.am.freescale.net; \n\tFPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; BN1AFFO11FD048;\n\t1:Y4NmytDwztD4GEtkO6e4zouvioRODU/NDW9Z9vroN9D7GbdMhMx2wHulYwKQLKwcgMAS6vhSfRYCbebfVyHErv9eD+YkEKtjPhtkq8XUytLmSXZsF972k0RZIntwJIdiBh6XebG7AzBN8zFzkGDyRgRn4XqcAGGszINS1BwM9dSPfoZjWB0IBKmeOOjBjIPbG+gaUhvSqhjFl/PndOIvdXhJGC3rGENmoxlqwj8B/byEnXY5t3xuXf8owREwNUcj+A7WlP7ytM2C8VdpWrLwVK66aT8VEs9NtS28mdOazUx2oInmJQgp//MRh2HAdci1wMlubMW9oWwUh9qc4CnMUyacNUfPc15VFovX7nFqlFQ9nFTk/X9njIpZ2KvW+MixV4nV+/6qmo/wvFqztiJh+tvz32G6tzNs/MJVZM7IL65S/6uft8Xgj72ZKXOPi4rZIq03Qqf1VscfEcycS7czm8s3ztlzEU8/qvIRu5XOysHuNrwle/yEXYbFNmiXnkqchgA577o1ZOaL5r8p+aUq+5HPTKG3wcGrcxE+oPHCpxEGxeVW+bKpUPrAhbYS8OpysvMvCxSjOQEubdBtxx+8RzCKv+27REDShteM21Glri9THTjqmbuE4bUR25ntNkXDNgVGNi3NLUZOse5f2OkZP0jFkBkY+I7wKZkPI3/qzvgvQfgXygFbKeKV0tGmdp7uNGtSV4SOuIi6MR1a4Aig2dOWezKLu1sQp1Kf8IUBgCo=",
            "1; BN1PR0301MB0737;\n\t2:CTFvpRWxHl0NFSNEK0eQ8gBQEdHDsbO+1XtrzkPdZKfnAkR5jOqZKs5kQgdX3Lofeuj7fPbnFDQ9QKud3C+Boddj3Hr+8GXikTXBlxMy6TgpcSquHb5Ef6qWqfEDMbdE1BR7gez+L9uLyrVJbinb+Yz4M+XfDA299t/H/sqIBPU=;\n\t3:TWVwZHHN9WIwGzzYQ+ZsLfkTlJ9XLtWO7KdHe1hCloRleklMYzFlAMsaRtOiqF8YFg1mjB7U5GbY3MUhLNCmVaErgeS2LIkmnMD9eAi5NUpeT46wX1/Za1Ec77V388f7G/g+BaBlGhOKvuIJAp9HwVsEhmWovrKOFflzJEXYYiPasc17LfOoBO2D4EbGY6xHowFtu8XGNQ4WzQnuZGMkl+9RfozjO6QC+AWs/JxJ7Whq0Ecl2a+hW3OC3rslD+ZBEACvyAiSfkTXCZWnnbAIRA==;\n\t25:wc9E2A6MRIRU2lA0Ikx/AW4lMZWCpOtXJ1JHIOTHMunUuK2dlSnZg43a3SyQE2U6/p0WavEQe6l5ZzLXsY7wz7IDIBT0Y4n8BRJQ5Fs5GCJ9tgvnd4kr2B1pOrkSMs2Crxv5tBQkVbVz17e0CzOc4IbPSYzOjJtarwZ1nGq/lT8ADO+uokzpItrsfXG1p9PL/wsWOKzsbsqIJuzlJboYQzdFyBuPY6Le/ojnM8b0RQlcqk9K2+Z+PMaXMcAL9VTQTrcSZZDAl00l02d4DYRbNZEMSg80t9qTP7Dd0FqfjY7Q40NeHAl3t0amq8fTgr8KTTRpy3C/kNjEfnIafKGS4vYcxKLjwiaYtb1zA4xlR4QBCgWqMVLnHevuXQRT9FfrjIQcCYbKsyEHP7K6Q0AzSyHHosAdJzysA4o7aoZz5UglRC/FgiCWU9YiM9/IkAPEu7D+wRxrn1WAc38DKE9X4w==",
            "1; BN1PR0301MB0737;\n\t31:lV7s+KDEJA9VK+45EugpW6+1Cv7/bk9HeYTFqLlMctiQHagUTIISN/f+kzbdkdwazm0wX3CZEa8V84SyEJaKFXrXliMYOWmHW/WbyqF3KdPz6zqgR2Uhlxz76g8HLziqJSp+bBAnJDWApCnDXKCXKCNjOLYUAP/0eFSvqieWMB9LLWdHv6dyHZ4QPiodw9HSLAwRCY5/0ohcKg61jEeMeFqLibaLQm3DzNLVd3n0LhvMfsA9xh1S/8Kqn0DBOE7nUnNRbTMOYbQTfHjXo0p7KTtB8Ew7JtYWU21K2lrb1Y4=;\n\t4:B9QskG4J53940DOCWE+ADVCzBaeYqQGM2iR4EOKDYd9yEFxapj/hDBFVswn5VcAmcOaPp5xYwwRK/zw+uat0MSjZAn+UTDOVrrvu+I0m6G2CvATlsbFWG5AbqoJRdWZn84JeE4v6p2yAAds4b6A6fHAY3BZiK4GqfLeoItFaueQk0cEFHCWttF0XICcGbsOAmMHHoANKZyxKL/UzdpsxecwTOVfcKYB2ZKT2N4xxbAM7hBMxqsFa6E5WeSHonCZUwcJAVSUczebcJqdPdkyLk5JXatPKvV2VodPINt++28t3Z7GgNJA9HRw5bymkOiyadoLRIflfQok5KcAi8YlkpTV/JnYsz6wBVEmZX6vhYcMHMHZ1JawkzUF7UaTbdUPU3pq84uU2kNGUpco3zhyhHakam8VRvHbmfVcgQvaH9PKuGWzPkSA/DDsxVFLMpJYiLrgXFy1Y6HTdo1Cq1mXqyefWRI93n0It7RBXmcAEZrScKVwuGZQ1Cy4Of4zf78VxBKQh72Awwgv745UKxcUtq2b5dPaMqi/c/fqViF5/vp9AJb4vChMvGfF0gcYsgjGFIkm2vsSlcxUaiEVuFuFyUA==",
            "=?us-ascii?Q?1; BN1PR0301MB0737;\n\t23:4yTAhOovM+HCJ1WyNDDbdug3G1ESts2psUrL+JK?=\n\t=?us-ascii?Q?WKO5BAsUhOeMnKwI/mkVj7eU/z7s8r4SFbQIG5wxeGEqc3xe+6M1G2XUjVhA?=\n\t=?us-ascii?Q?moRNXR114wFchb5tULi1EW62X66RS2Ou3ybdgGHrsPUQcNcl3VF1lt/v8Mlo?=\n\t=?us-ascii?Q?IGpu5VXt6HZJz3Wmz33Flw75LE9X9nAG5nbpAVPA+/d7+9FIIv/Om0oJFO27?=\n\t=?us-ascii?Q?dC8OeRtSWTdICrixsssYiQ4BzuRfPET7Coo+vGFYc5z/KFGNsWXHp+E8Sg5Y?=\n\t=?us-ascii?Q?X3WzTtp1jNtz5lpOhZDY8Ov4b+hmForL6HLsUth2dulEwYXF5U5SxgX5go0i?=\n\t=?us-ascii?Q?KZRCeELLz5vD1PUKKiaG/1kzE6Udz2jo/tS6K7vuqVqhTC2UyzvOwMgrWhud?=\n\t=?us-ascii?Q?puv6CgNJlZ01q/0ApUvDiYq5apK63l3yipGe/bOLofr/EilpCLJofYBcWLT1?=\n\t=?us-ascii?Q?4SW5w6tnM3rNpnAq9tJ3D/FH/+umubKuBcYlrSoFKz6HiL4KfHDW4TswIQSq?=\n\t=?us-ascii?Q?DAIUlAR4xMNaGytHbxkB83rqIodePCXgt3IX4rVLKp7i9nAm32/vetOXFOy4?=\n\t=?us-ascii?Q?QI6mHTUd0ei9Mzx3J9+JqP4B8ra7v2iazvJQjaXazfGkfakX5jKuaRFiK/5k?=\n\t=?us-ascii?Q?ddwye64iXJ8P0Ixf/apD1mN0T0SJLM8PuQeqsPlzXuGLtg3e4fTdYGKz84+d?=\n\t=?us-ascii?Q?sQBYsJGuRyD2iI87J1ugeuaqeMx0ipo1eyxxSGsINYzmNboTg7FEqVKXtJCY?=\n\t=?us-ascii?Q?8wcaNbsRvi5B8p5ADSiquvdF+nk4vF5v0ujFaIYHG/QsLP7GM3414Vu0sXbL?=\n\t=?us-ascii?Q?i0uSQZTZEAh9h2ok694tShir1zpcIksUAm2PK4v823Ll396NEYGyXEzfaaEm?=\n\t=?us-ascii?Q?JuM8SMCLooKeuvbqBn6edlySY05bFDvFWdnkunRS+QPESQ4hcsWyUtKg6/yb?=\n\t=?us-ascii?Q?TwITUEXPpk+ulj3Z6GWIIjZeY9ifW2zMx1GRYfJ6y0IGV0IkkWOEXRcH8KGU?=\n\t=?us-ascii?Q?VY3yc+pTjw0zU1TAr77FVRXUfDFP3GoO/1HM2woGXSJmKFCbcIhJjGq0vzKF?=\n\t=?us-ascii?Q?Jw3NHVUMgo6YwL+eZu+8yy7q2gXaO5aH4Y1lLV2dwrH6IEWiF1yWcEVhpA8R?=\n\t=?us-ascii?Q?yqgQ7am8a2IgA/jd+5SiCi/53c0wSo0Xq?=",
            "1; BN1PR0301MB0737;\n\t6:qDprBGWshSEeVF1DWjgvSO2RLDQmuS9ykv6BJfIiV5/lIVP8jfVT+v8lyvsJzW7CiB6DeUC8/01T0ouX7hXTubQer9zA+cxq3ft+cZUe6f7sRFjZtYa2aOhAzJthmX3qEtASPzEgDV4M1zSNg+n0R3HE4cVNS9okbSXtdKRHoDPoagafV4L/l+Ob3TGUQKlsDKx1JsH09DNhNuAz3VYziqXbGzqFPyQopXRqOUgLEsdSNupYRpzgP1QUu7B0NPxmAJ8b7zu/qhTP3k1tWFmAuCQ6s5+IhiCeVwzhat8VxdtzDNDZRdKCXN/caN5s/vy7vaxwGItLvLOCaZWGDusUJQ==;\n\t5:0l88goxl1KIMnG2yqikIGoWGtodsCXXvVRqyiXDqMKLXSC+mn+k0Af+2ZCKOnMrcnraZk88bCygHKgpLdFY1QKLJh/NwKpizKc3ZE+0Jl4pZ/h/JpH29TD7ba+39f11dOI0OsTh81yBDKn6g4ZK2IBTg+tMmSwNiNT1c5h0CZJd7aC8aKGJsIrnl1nvOOwvJ;\n\t24:kjTj2mtS+30GKs+3AA/3kuGeySPuhpm1IJoFr3YsQr60A9PuBQoevLJfVURrqd/B0yVr3WvLbpeQwXIdHo+oVB2H2aG9I+c7ATue8/fRQFY=",
            "1; BN1PR0301MB0737;\n\t7:EiAdF/aJgBNIZd10d9lMXipQJ3b+zCwzhofE+y2+AK8G2PrsSy7lzHTg7SLx7eufTpc9L+PXGXcCxNMgZSFhy/gXoRbI/PM/gTjWaxUUQ/pob5NYUiGcFeq5+2Fn00n/xZnfQsE4TvYc/tx4aX/7++QqbAJazcRqGtH8CgJhr+rKFV4qoyNzBWYmkso8uYobMnpbBfcVLyHOCbYj7C3kbZ/bvha/zbgtvIq5R5diACN4z8iOCUDfAK2U3haGJ0DC9E52G0Vn2H2/VWZSFPyA8w2pLXWfjzKD/xad9AF8LknzjYVsKPz34uMK9UZIEmmPHxRtsmFKLw0U3fFvqURpUn3wuZRVy2xsCzxKP6xIBJQ="
        ],
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-MS-Office365-Filtering-Correlation-Id": "fe9f78a7-5fe0-4de0-ba64-08d40eaa87a8",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0; RULEID:(22001);\n\tSRVR:BN1PR0301MB0737; ",
        "X-Microsoft-Antispam-PRVS": "<BN1PR0301MB0737417EAE7D25821979DBA090B10@BN1PR0301MB0737.namprd03.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:(185117386973197);",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(6095035)(601004)(2401047)(13023025)(8121501046)(13024025)(5005006)(13015025)(13017025)(13018025)(3002001)(10201501046)(6055026)(6096035);\n\tSRVR:BN1PR0301MB0737; BCL:0; PCL:0; RULEID:(400006);\n\tSRVR:BN1PR0301MB0737; ",
        "X-Forefront-PRVS": "01294F875B",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "17 Nov 2016 05:28:14.7577\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Id": "5afe0b00-7697-4969-b663-5eab37d5f47e",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;\n\tIp=[192.88.168.50]; \n\tHelo=[tx30smr01.am.freescale.net]",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "BN1PR0301MB0737",
        "Subject": "[dpdk-dev] [RFC PATCH 5/6] eal: supporting bus model in init process",
        "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": "This patch makes necessary changes to the EAL for handling bus scan and\nprobe. Most of the scan function has been moved to bus/* implementation,\n(currently only for pci, linuxapp). There are still some functions which\nexists in the EAL (bind, unbind module, mmap etc).\n\nMissing/Grey area;\n - Should all the operations for a PCI device, whether binding to a driver\n   or mmap, be moved to PCI bus code base? All of that is not relevant for\n   a bus, but then having multiple implementation areas for a common\n   sub-system (PCI, here) is also not a nice thing.\n\nSigned-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>\n---\n lib/librte_eal/linuxapp/eal/Makefile  |   1 +\n lib/librte_eal/linuxapp/eal/eal.c     |  51 +++++-\n lib/librte_eal/linuxapp/eal/eal_pci.c | 298 ----------------------------------\n 3 files changed, 44 insertions(+), 306 deletions(-)",
    "diff": "diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile\nindex 4e206f0..124dceb 100644\n--- a/lib/librte_eal/linuxapp/eal/Makefile\n+++ b/lib/librte_eal/linuxapp/eal/Makefile\n@@ -77,6 +77,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_timer.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memzone.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_log.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_launch.c\n+SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_bus.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_vdev.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_pci.c\n SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_pci_uio.c\ndiff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c\nindex 2075282..332d1f4 100644\n--- a/lib/librte_eal/linuxapp/eal/eal.c\n+++ b/lib/librte_eal/linuxapp/eal/eal.c\n@@ -739,6 +739,44 @@ static int rte_eal_vfio_setup(void)\n }\n #endif\n \n+static int\n+rte_eal_scan(void)\n+{\n+\tint ret = 0;\n+\n+\t/* For now, as vdev replacement is not complete, continue with a call\n+\t * rte_bus_list scan\n+\t */\n+\trte_eal_bus_scan();\n+\n+\tret = rte_eal_dev_init();\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, EAL, \"Cannot init pmd devices\\n\");\n+\t}\n+\n+out:\n+\treturn ret;\n+}\n+\n+static int\n+rte_eal_probe(void)\n+{\n+\tint ret = 0;\n+\n+\t/* Probe & Initialize PCI devices */\n+\tret = rte_eal_pci_probe();\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, EAL, \"Cannot probe PCI\\n\");\n+\t\tgoto out;\n+\t}\n+\n+\t/* ToDo: vdev scan already does the probe - it should be moved here */\n+\n+\t/* Last successful bus probe would set ret = 0 */\n+out:\n+\treturn ret;\n+}\n+\n /* Launch threads, called at application init(). */\n int\n rte_eal_init(int argc, char **argv)\n@@ -802,9 +840,6 @@ rte_eal_init(int argc, char **argv)\n \tif (rte_eal_log_init(logid, internal_config.syslog_facility) < 0)\n \t\trte_panic(\"Cannot init logs\\n\");\n \n-\tif (rte_eal_pci_init() < 0)\n-\t\trte_panic(\"Cannot init PCI\\n\");\n-\n #ifdef VFIO_PRESENT\n \tif (rte_eal_vfio_setup() < 0)\n \t\trte_panic(\"Cannot init VFIO\\n\");\n@@ -828,6 +863,9 @@ rte_eal_init(int argc, char **argv)\n \tif (rte_eal_timer_init() < 0)\n \t\trte_panic(\"Cannot init HPET or TSC timers\\n\");\n \n+\tif (rte_eal_scan() < 0)\n+\t\trte_panic(\"Cannot scan for devices\\n\");\n+\n \teal_check_mem_on_local_socket();\n \n \tif (eal_plugins_init() < 0)\n@@ -841,9 +879,6 @@ rte_eal_init(int argc, char **argv)\n \t\trte_config.master_lcore, (int)thread_id, cpuset,\n \t\tret == 0 ? \"\" : \"...\");\n \n-\tif (rte_eal_dev_init() < 0)\n-\t\trte_panic(\"Cannot init pmd devices\\n\");\n-\n \tif (rte_eal_intr_init() < 0)\n \t\trte_panic(\"Cannot init interrupt-handling thread\\n\");\n \n@@ -884,8 +919,8 @@ rte_eal_init(int argc, char **argv)\n \trte_eal_mp_wait_lcore();\n \n \t/* Probe & Initialize PCI devices */\n-\tif (rte_eal_pci_probe())\n-\t\trte_panic(\"Cannot probe PCI\\n\");\n+\tif (rte_eal_probe())\n+\t\trte_panic(\"Cannot complete probe\\n\");\n \n \trte_eal_mcfg_complete();\n \ndiff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c\nindex 876ba38..e3916ab 100644\n--- a/lib/librte_eal/linuxapp/eal/eal_pci.c\n+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c\n@@ -224,202 +224,6 @@ pci_parse_one_sysfs_resource(char *line, size_t len, uint64_t *phys_addr,\n \treturn 0;\n }\n \n-/* parse the \"resource\" sysfs file */\n-static int\n-pci_parse_sysfs_resource(const char *filename, struct rte_pci_device *dev)\n-{\n-\tFILE *f;\n-\tchar buf[BUFSIZ];\n-\tint i;\n-\tuint64_t phys_addr, end_addr, flags;\n-\n-\tf = fopen(filename, \"r\");\n-\tif (f == NULL) {\n-\t\tRTE_LOG(ERR, EAL, \"Cannot open sysfs resource\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tfor (i = 0; i<PCI_MAX_RESOURCE; i++) {\n-\n-\t\tif (fgets(buf, sizeof(buf), f) == NULL) {\n-\t\t\tRTE_LOG(ERR, EAL,\n-\t\t\t\t\"%s(): cannot read resource\\n\", __func__);\n-\t\t\tgoto error;\n-\t\t}\n-\t\tif (pci_parse_one_sysfs_resource(buf, sizeof(buf), &phys_addr,\n-\t\t\t\t&end_addr, &flags) < 0)\n-\t\t\tgoto error;\n-\n-\t\tif (flags & IORESOURCE_MEM) {\n-\t\t\tdev->mem_resource[i].phys_addr = phys_addr;\n-\t\t\tdev->mem_resource[i].len = end_addr - phys_addr + 1;\n-\t\t\t/* not mapped for now */\n-\t\t\tdev->mem_resource[i].addr = NULL;\n-\t\t}\n-\t}\n-\tfclose(f);\n-\treturn 0;\n-\n-error:\n-\tfclose(f);\n-\treturn -1;\n-}\n-\n-/* Scan one pci sysfs entry, and fill the devices list from it. */\n-static int\n-pci_scan_one(const char *dirname, uint16_t domain, uint8_t bus,\n-\t     uint8_t devid, uint8_t function)\n-{\n-\tchar filename[PATH_MAX];\n-\tunsigned long tmp;\n-\tstruct rte_pci_device *dev;\n-\tchar driver[PATH_MAX];\n-\tint ret;\n-\n-\tdev = malloc(sizeof(*dev));\n-\tif (dev == NULL)\n-\t\treturn -1;\n-\n-\tmemset(dev, 0, sizeof(*dev));\n-\tdev->addr.domain = domain;\n-\tdev->addr.bus = bus;\n-\tdev->addr.devid = devid;\n-\tdev->addr.function = function;\n-\n-\t/* get vendor id */\n-\tsnprintf(filename, sizeof(filename), \"%s/vendor\", dirname);\n-\tif (eal_parse_sysfs_value(filename, &tmp) < 0) {\n-\t\tfree(dev);\n-\t\treturn -1;\n-\t}\n-\tdev->id.vendor_id = (uint16_t)tmp;\n-\n-\t/* get device id */\n-\tsnprintf(filename, sizeof(filename), \"%s/device\", dirname);\n-\tif (eal_parse_sysfs_value(filename, &tmp) < 0) {\n-\t\tfree(dev);\n-\t\treturn -1;\n-\t}\n-\tdev->id.device_id = (uint16_t)tmp;\n-\n-\t/* get subsystem_vendor id */\n-\tsnprintf(filename, sizeof(filename), \"%s/subsystem_vendor\",\n-\t\t dirname);\n-\tif (eal_parse_sysfs_value(filename, &tmp) < 0) {\n-\t\tfree(dev);\n-\t\treturn -1;\n-\t}\n-\tdev->id.subsystem_vendor_id = (uint16_t)tmp;\n-\n-\t/* get subsystem_device id */\n-\tsnprintf(filename, sizeof(filename), \"%s/subsystem_device\",\n-\t\t dirname);\n-\tif (eal_parse_sysfs_value(filename, &tmp) < 0) {\n-\t\tfree(dev);\n-\t\treturn -1;\n-\t}\n-\tdev->id.subsystem_device_id = (uint16_t)tmp;\n-\n-\t/* get class_id */\n-\tsnprintf(filename, sizeof(filename), \"%s/class\",\n-\t\t dirname);\n-\tif (eal_parse_sysfs_value(filename, &tmp) < 0) {\n-\t\tfree(dev);\n-\t\treturn -1;\n-\t}\n-\t/* the least 24 bits are valid: class, subclass, program interface */\n-\tdev->id.class_id = (uint32_t)tmp & RTE_CLASS_ANY_ID;\n-\n-\t/* get max_vfs */\n-\tdev->max_vfs = 0;\n-\tsnprintf(filename, sizeof(filename), \"%s/max_vfs\", dirname);\n-\tif (!access(filename, F_OK) &&\n-\t    eal_parse_sysfs_value(filename, &tmp) == 0)\n-\t\tdev->max_vfs = (uint16_t)tmp;\n-\telse {\n-\t\t/* for non igb_uio driver, need kernel version >= 3.8 */\n-\t\tsnprintf(filename, sizeof(filename),\n-\t\t\t \"%s/sriov_numvfs\", dirname);\n-\t\tif (!access(filename, F_OK) &&\n-\t\t    eal_parse_sysfs_value(filename, &tmp) == 0)\n-\t\t\tdev->max_vfs = (uint16_t)tmp;\n-\t}\n-\n-\t/* get numa node */\n-\tsnprintf(filename, sizeof(filename), \"%s/numa_node\",\n-\t\t dirname);\n-\tif (access(filename, R_OK) != 0) {\n-\t\t/* if no NUMA support, set default to 0 */\n-\t\tdev->device.numa_node = 0;\n-\t} else {\n-\t\tif (eal_parse_sysfs_value(filename, &tmp) < 0) {\n-\t\t\tfree(dev);\n-\t\t\treturn -1;\n-\t\t}\n-\t\tdev->device.numa_node = tmp;\n-\t}\n-\n-\t/* parse resources */\n-\tsnprintf(filename, sizeof(filename), \"%s/resource\", dirname);\n-\tif (pci_parse_sysfs_resource(filename, dev) < 0) {\n-\t\tRTE_LOG(ERR, EAL, \"%s(): cannot parse resource\\n\", __func__);\n-\t\tfree(dev);\n-\t\treturn -1;\n-\t}\n-\n-\t/* parse driver */\n-\tsnprintf(filename, sizeof(filename), \"%s/driver\", dirname);\n-\tret = pci_get_kernel_driver_by_path(filename, driver);\n-\tif (ret < 0) {\n-\t\tRTE_LOG(ERR, EAL, \"Fail to get kernel driver\\n\");\n-\t\tfree(dev);\n-\t\treturn -1;\n-\t}\n-\n-\tif (!ret) {\n-\t\tif (!strcmp(driver, \"vfio-pci\"))\n-\t\t\tdev->kdrv = RTE_KDRV_VFIO;\n-\t\telse if (!strcmp(driver, \"igb_uio\"))\n-\t\t\tdev->kdrv = RTE_KDRV_IGB_UIO;\n-\t\telse if (!strcmp(driver, \"uio_pci_generic\"))\n-\t\t\tdev->kdrv = RTE_KDRV_UIO_GENERIC;\n-\t\telse\n-\t\t\tdev->kdrv = RTE_KDRV_UNKNOWN;\n-\t} else\n-\t\tdev->kdrv = RTE_KDRV_NONE;\n-\n-\t/* device is valid, add in list (sorted) */\n-\tif (TAILQ_EMPTY(&pci_device_list)) {\n-\t\trte_eal_device_insert(&dev->device);\n-\t\tTAILQ_INSERT_TAIL(&pci_device_list, dev, next);\n-\t} else {\n-\t\tstruct rte_pci_device *dev2;\n-\t\tint ret;\n-\n-\t\tTAILQ_FOREACH(dev2, &pci_device_list, next) {\n-\t\t\tret = rte_eal_compare_pci_addr(&dev->addr, &dev2->addr);\n-\t\t\tif (ret > 0)\n-\t\t\t\tcontinue;\n-\n-\t\t\tif (ret < 0) {\n-\t\t\t\tTAILQ_INSERT_BEFORE(dev2, dev, next);\n-\t\t\t\trte_eal_device_insert(&dev->device);\n-\t\t\t} else { /* already registered */\n-\t\t\t\tdev2->kdrv = dev->kdrv;\n-\t\t\t\tdev2->max_vfs = dev->max_vfs;\n-\t\t\t\tmemmove(dev2->mem_resource, dev->mem_resource,\n-\t\t\t\t\tsizeof(dev->mem_resource));\n-\t\t\t\tfree(dev);\n-\t\t\t}\n-\t\t\treturn 0;\n-\t\t}\n-\t\trte_eal_device_insert(&dev->device);\n-\t\tTAILQ_INSERT_TAIL(&pci_device_list, dev, next);\n-\t}\n-\n-\treturn 0;\n-}\n-\n int\n pci_update_device(const struct rte_pci_addr *addr)\n {\n@@ -433,93 +237,7 @@ pci_update_device(const struct rte_pci_addr *addr)\n \t\t\t\taddr->function);\n }\n \n-/*\n- * split up a pci address into its constituent parts.\n- */\n-static int\n-parse_pci_addr_format(const char *buf, int bufsize, uint16_t *domain,\n-\t\tuint8_t *bus, uint8_t *devid, uint8_t *function)\n-{\n-\t/* first split on ':' */\n-\tunion splitaddr {\n-\t\tstruct {\n-\t\t\tchar *domain;\n-\t\t\tchar *bus;\n-\t\t\tchar *devid;\n-\t\t\tchar *function;\n-\t\t};\n-\t\tchar *str[PCI_FMT_NVAL]; /* last element-separator is \".\" not \":\" */\n-\t} splitaddr;\n-\n-\tchar *buf_copy = strndup(buf, bufsize);\n-\tif (buf_copy == NULL)\n-\t\treturn -1;\n-\n-\tif (rte_strsplit(buf_copy, bufsize, splitaddr.str, PCI_FMT_NVAL, ':')\n-\t\t\t!= PCI_FMT_NVAL - 1)\n-\t\tgoto error;\n-\t/* final split is on '.' between devid and function */\n-\tsplitaddr.function = strchr(splitaddr.devid,'.');\n-\tif (splitaddr.function == NULL)\n-\t\tgoto error;\n-\t*splitaddr.function++ = '\\0';\n-\n-\t/* now convert to int values */\n-\terrno = 0;\n-\t*domain = (uint16_t)strtoul(splitaddr.domain, NULL, 16);\n-\t*bus = (uint8_t)strtoul(splitaddr.bus, NULL, 16);\n-\t*devid = (uint8_t)strtoul(splitaddr.devid, NULL, 16);\n-\t*function = (uint8_t)strtoul(splitaddr.function, NULL, 10);\n-\tif (errno != 0)\n-\t\tgoto error;\n-\n-\tfree(buf_copy); /* free the copy made with strdup */\n-\treturn 0;\n-error:\n-\tfree(buf_copy);\n-\treturn -1;\n-}\n-\n-/*\n- * Scan the content of the PCI bus, and the devices in the devices\n- * list\n- */\n-int\n-rte_eal_pci_scan(void)\n-{\n-\tstruct dirent *e;\n-\tDIR *dir;\n-\tchar dirname[PATH_MAX];\n-\tuint16_t domain;\n-\tuint8_t bus, devid, function;\n-\n-\tdir = opendir(pci_get_sysfs_path());\n-\tif (dir == NULL) {\n-\t\tRTE_LOG(ERR, EAL, \"%s(): opendir failed: %s\\n\",\n-\t\t\t__func__, strerror(errno));\n-\t\treturn -1;\n-\t}\n \n-\twhile ((e = readdir(dir)) != NULL) {\n-\t\tif (e->d_name[0] == '.')\n-\t\t\tcontinue;\n-\n-\t\tif (parse_pci_addr_format(e->d_name, sizeof(e->d_name), &domain,\n-\t\t\t\t&bus, &devid, &function) != 0)\n-\t\t\tcontinue;\n-\n-\t\tsnprintf(dirname, sizeof(dirname), \"%s/%s\",\n-\t\t\t\tpci_get_sysfs_path(), e->d_name);\n-\t\tif (pci_scan_one(dirname, domain, bus, devid, function) < 0)\n-\t\t\tgoto error;\n-\t}\n-\tclosedir(dir);\n-\treturn 0;\n-\n-error:\n-\tclosedir(dir);\n-\treturn -1;\n-}\n \n /* Read PCI config space. */\n int rte_eal_pci_read_config(const struct rte_pci_device *device,\n@@ -754,19 +472,3 @@ rte_eal_pci_ioport_unmap(struct rte_pci_ioport *p)\n \n \treturn ret;\n }\n-\n-/* Init the PCI EAL subsystem */\n-int\n-rte_eal_pci_init(void)\n-{\n-\t/* for debug purposes, PCI can be disabled */\n-\tif (internal_config.no_pci)\n-\t\treturn 0;\n-\n-\tif (rte_eal_pci_scan() < 0) {\n-\t\tRTE_LOG(ERR, EAL, \"%s(): Cannot scan PCI bus\\n\", __func__);\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n",
    "prefixes": [
        "dpdk-dev",
        "RFC",
        "5/6"
    ]
}