From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0069.outbound.protection.outlook.com [104.47.32.69]) by dpdk.org (Postfix) with ESMTP id 4A1F59E7 for ; Wed, 15 Feb 2017 12:25:35 +0100 (CET) Received: from BN3PR0301CA0001.namprd03.prod.outlook.com (10.160.180.139) by BN1PR0301MB0724.namprd03.prod.outlook.com (10.160.78.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.888.16; Wed, 15 Feb 2017 11:25:33 +0000 Received: from BY2FFO11OLC003.protection.gbl (2a01:111:f400:7c0c::113) by BN3PR0301CA0001.outlook.office365.com (2a01:111:e400:4000::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.919.13 via Frontend Transport; Wed, 15 Feb 2017 11:25:33 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; infradead.org; dkim=none (message not signed) header.d=none;infradead.org; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11OLC003.mail.protection.outlook.com (10.1.15.183) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.904.16 via Frontend Transport; Wed, 15 Feb 2017 11:25:32 +0000 Received: from [10.232.14.39] ([10.232.14.39]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v1FBPRjw025954; Wed, 15 Feb 2017 04:25:28 -0700 To: Jan Blunck , Thomas Monjalon References: <1484748329-5418-1-git-send-email-shreyansh.jain@nxp.com> <1484801117-779-1-git-send-email-thomas.monjalon@6wind.com> <1484801117-779-8-git-send-email-thomas.monjalon@6wind.com> CC: dev From: Shreyansh Jain Message-ID: <4f1f05ef-7cea-9306-c37b-554a66cd15ac@nxp.com> Date: Wed, 15 Feb 2017 17:00:19 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-EOPAttributedMessage: 0 X-Matching-Connectors: 131316315331289836; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(336005)(39410400002)(39400400002)(39860400002)(39840400002)(39850400002)(39380400002)(39450400003)(2980300002)(1109001)(1110001)(339900001)(377454003)(24454002)(189002)(199003)(97736004)(50986999)(575784001)(8676002)(81156014)(54356999)(92566002)(65806001)(47776003)(65956001)(76176999)(50466002)(104016004)(23676002)(229853002)(189998001)(389900002)(77096006)(4326007)(2906002)(68736007)(81166006)(106466001)(31686004)(626004)(36756003)(64126003)(4001350100001)(230700001)(86362001)(38730400002)(5660300001)(356003)(305945005)(31696002)(6666003)(2950100002)(33646002)(93886004)(53936002)(65826007)(6246003)(83506001)(105606002)(85426001)(8936002); DIR:OUT; SFP:1101; SCL:1; SRVR:BN1PR0301MB0724; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11OLC003; 1:VSbgbX6YQDCZ6covdr8bhMudweNjK+gQYiCmsBUaL/GWQmb3Qbq835Uy6HCOKakOTXbkfhbL9jc1oC0rRIxBXtinOzfXVhrhXGxY4MKWhUcPwC/AA/kehmQU+6tmsUs77HzP4cJdTQmwqafpn5hkKB47y0xlatN7mEVDeSlXPSDJ8aVhRZLK1rOdIRP6+Vu818CljlFgTyJRH9VMv0C1cCwP5tDHpWt4Jez3Q4d2mm3faKtl9o+K9Ig5IPnfrf4sqxk/mPDrKmDZZ+mSAdu+k/U+0KUyCjdtXhzrkEomtRCORoM3iCh0KVfqc+9lUICtB4hig2i3e7/YxrckyduFVjriRHWfiQmRfmkajwI6rLvyT4j2A4TFRtt9RrI+waxpsYk48SVHRPPudJlPVDpgl7uMo07D44H0ZRAscKg7Y54XHM5KGCFTYBjQSYzgBoE05iDsN0kTQYsSGu8WCqpYbv/m8fR9D0HbpH+m43f5zMrG1N77jfsJk08/s7PH3pC87gKmcRQtm7DQO509Y9+Q6vYw/+Eu4YJ/pyKUoSQASqKbX4wz0zZz4UfLphO6MxRl X-MS-Office365-Filtering-Correlation-Id: 18477ff0-3c23-4d59-d804-08d455955aec X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:BN1PR0301MB0724; X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0724; 3:cfEBRVM/JKRxvT0+ZEkxc6CvkTJ4ZG/yFp5VUxchyNO1stswl1AIfUiZyLSGNDybWgCOfYP71C+IDifGazV+BrFvs/MbnjhYdbTbLOEqD2Ydisy8Vm8bz7JFAF7NYF2OwHGNPfBxSd0KLsENnpceruQvoU6o9bNfCUa57nId++6Dbm7noHUVVoQPXkQfZFzKQHhyEBcwYXlRdRnu2RVwYl14bXaM7rIZGVboGQM9mlLAoCZupnomN+vyWqWBBENirIcabHJ/54PNUI4zaH36kiIXOMwp1I34ID8vFSKHrQfqyq8TOWUZ12etyrPARupegtH1SIxE1XWluNH9L7dAMBb7lpxZbnThMW2guQh9vnDUVLgujN6RAJVw7B6quo2M; 25:3vKTXqJgXs2Evwt873E1CTGm+jNsfr4EncRl/+1y2knmzy9bDs7snFARXgprha1H6IsfO/v1rtuyhKJE8cdbf/c/tdImi167jcozCVuTm9htYY0n2oVAVNgYrBBe3LS6KggBMH2WTGxzQRBJq2+SJOSNTS4Zg2KuNrZEThDmH8c4qHRUcSPOQ2vJOXV8ZQTtbATW5F5yl4haysqQzkr+CnXVGqo9IVBqMtU32DOXSOa35cBFVtLXYIi4tIKo0D5ENv6UEs6lu/sO8lgwNEiHb8pnNEXyqdcKtFsGxBHu8upVk51zOvdV5eU9gHbatkK7tiPGPgRIymlJ8gyQRsetQ1csbFnE54BsH6HzuHojYTpBzT/oRz68BdGyfrQQcypPW7zaTW7fzbXZ3zunXBjez0Y/R5xwHEZOg5lV2yVHEJdTY9R8cGtAb+HxRpdHTPX16VXgUJs8O6Tc6ot3RKaKXA== X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0724; 31:MeqNr2LWW7Cz6+3MDdDLbCskwuTJ5KyXMC+bBV6pjJNprqUQ7Tut+gS6GrJEEgGrb/beqOisTVMcGvWNnaBhV73rdcaID9hE44wXK+wBerF1kCHwRRtON8w5P2uU3uFc7RS32OhRpQ1E1q0QGm7YrsLiWn1yXNxruZhvbAK0Ci/ZCnwKig9roMNV57mdB4fFRUzi/MhvhqlDl7H65BWLU/nz1PwF7EmGnNEpSbw1CGigF10cR0kLKwScTRGm19qfv/SW2r/dJzp+UwTvtekgDg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095060)(601004)(2401047)(13023025)(8121501046)(13015025)(13017025)(5005006)(13018025)(13024025)(3002001)(10201501046)(6055026)(6096035)(20161123563025)(20161123561025)(20161123565025)(20161123559025)(20161123556025); SRVR:BN1PR0301MB0724; BCL:0; PCL:0; RULEID:(400006); SRVR:BN1PR0301MB0724; X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0724; 4:ay/vRG4StDUH7QZUjBiir/4a9oyLyZMa1Pu2GuRCmHAHrp8dtN2g65EAiLMrocnLnlrgNI7UemBNdPqBmZuPrF7hRRHug4wvUaq8sRhP2fPRgv3HLkBtwyTGY5nNouwYy14M6z2S6gVIBigoyDOVvWhuaTVJy4pKyZKhSrxFnsntXGBi6hfoqbjZcT3E4jmCcSnD/pVAJg69b/k6TRMzoaX5up2GOqK7kD/tQM4efC/x+UEp3VEM5wFFKFIhej9z1RSbWeXzMM/By55XbjidhHA5rBU2PLVb2WROX00x4rq1bsv9/6luVT1cTAmIVBKT3rpJO2sOl8GiPkwM61Nn0vcYCoThcDU6qEn+FBbeftC7DQTcg3lMUhw+2qhL0RH0ZQSSa7cgL/zmFb7y+XXOKmiPoA6b2Z3PR7IBo7aOy8VgoD5syVWwjE77cyMZdDwf09a8CmBUk1yfrTIGaTDmY+qU9jYPl1Tv7lZnml9GE9Ub67Cf9vQ1dUlAINiJvlQrEEuSd4NsoB0zn96uZGg7qPrTY4NU2zqdc2Z570aLe5G0PcPBE5i6eCRqPFqz2pTkzl/bn7K/fRyDhBLjH4OjSwBXBQ++pobFZkRNvRXUskDp57dp533V6RfK+VWpPLLO+E9Ov7bFAevj/uDFgp2a+tfrbxnPdMrTmtVIs3s9jC9QzMe7l10IeqEk2RgG8O+uAy2RlultAxbzrTgqINV+I6DgHElmuwe/uu8D+zf09wRa4beTUQ6Llh8DgBqCoDFiSmeETPz3L57n4DMZ02Lywg== X-Forefront-PRVS: 021975AE46 X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCTjFQUjAzMDFNQjA3MjQ7MjM6L0ZHK2w0dmJYR3V3dVFNMXc1RTlLbk9Z?= =?utf-8?B?cW9LVHlwZUZWNGVDQnZvblptTnJxWFJ3QVJQKzAyekhKUjJqcVZURW53QklI?= =?utf-8?B?NnBiaWFMNVR0K21aNTl2TjAwQzFhQzdUR3k0TlJodGlnU0czQW42Yzc5V1FY?= =?utf-8?B?amptbHM3TFVRMmtvSzdHV0NiUjNjRHpZVW9WQjJKVE82N0wxcmRydlZ1NUZO?= =?utf-8?B?ZmR1eDY4d3gzMzlKeitEMFAxekk2MzEvaTJKeUI5ZjBIS0RaNkcweVlZTnVG?= =?utf-8?B?ZnFaV21nMHRub21GL2s0bzZOVndGbVpnU21tRnJpdzR2UEVWTVA1bEhES0Fy?= =?utf-8?B?ek1tWjZsSXRESEFUZDA0N1RXL2hiVzhUWEV4SXFvcXZJZ21wN1hGYUxsL2o4?= =?utf-8?B?Y1NaQjcxUnd6cFo3V3R5R3ozVlZXUEFJMDFBekEzS1ppVmxDTUJzb25iL1Y5?= =?utf-8?B?UU5iRFF2bW10TjkvaHN1RHhMblh6QVhrQTZXZEVOby9hR21tRDhOWXhZRklY?= =?utf-8?B?dzBRUVFHa1VidkdFY1E3amNLS1BFQWVZOE9jc05BLytZM1J4Z0diNFBzbGNx?= =?utf-8?B?SDFVZkpzVnRwVW4rWHBkeXF3amdvT0x0KzlHWHdnMW5oak1TLzhpdDlaaHlH?= =?utf-8?B?RjduTW5zaVFNRGhXYm9RMy9QcGwwNzZQNzFUU1gweGhFRmRDR3duT0g2TDRV?= =?utf-8?B?TU9renFoaGl6NHY4VjlKMEtxNnJzSmtjaUZwS0d1Tm9ueFV1bnlRM3lQV2FK?= =?utf-8?B?Tmh4NE5VWHhtM0IyRHR5aXptVytZbEdsUVZTWHAwUlFBNUxMNHF2N2tLVi9p?= =?utf-8?B?dUphemhoOThEbzl0OHBYVGxKWXpkTGFaOXEvajYvRnpsTE9IV2cwZ0svVWFy?= =?utf-8?B?dnAvTGFVMjQwYW4rOHZhVFR3MTdETE5oYnp3Vkw0Mkh4ajZGQldETUpkZG9T?= =?utf-8?B?dDlaVytubGp2alMxTXViNXg1Y2dKS1dFaHlxYXViOHR0dUgveWhhaVlPam5C?= =?utf-8?B?UHk2d09rSE1DTHlzTDdsWGk1S1pURXhOWFNwSDZYOGZtUDNFdDNTamhhSmhI?= =?utf-8?B?cXVDTVhwREhJeDNONkVtNlA5elg2QXRhaVRpZUdrMFdYUzdQOW4rS2VlOWo2?= =?utf-8?B?Y1BZdUxEVUpGZ29veUgzc3FQbVgvZ3lCTVMwcHd2SU5CVEVRQ2laWmh4aW9y?= =?utf-8?B?UUQ2TmRwd0QwRHovNS91NWdUdWhuQlBuV3FENVBFaTFXeHdHKzkxUktTdUxk?= =?utf-8?B?b2NiS2VEZ1JPNzQwODM3c3JUTFVXZEtEZlcyOTloM3lZTUswTzVacXlUV0NY?= =?utf-8?B?djNZTVRZSHVwUE5JdG5oZVZrV1crZFM2bktWRDlOVVJHajRJbVc2ZGJVS05H?= =?utf-8?B?NUFNTERsVURQcEllMGMydnExQ2FrTXJJYTFMNXA4MjFIaUdsTDUybXRMU1Yy?= =?utf-8?B?SHJlMmJmeld2SXU1NWlTOVo3bnNrVDgrUi9ZMTV5RnUzM3RCMUtSY3AyQnM3?= =?utf-8?B?NFpOeWtYV3VjWTJLLy9QQ0dPOXNKem5zcVJUbkpYUWRDSGIwd3JGUVZsVFNT?= =?utf-8?B?YVFwOHBrNDR4Rm1pUHphR3FGUm5wSk9MNEZvVkJDRVo4Uitlbjk2RjY0cThU?= =?utf-8?B?aE1mSC90M0hsSVRPNWtBV2c5VjB2Z05BK2dTeldsWlcyRGM5TEJkVFdjTFZo?= =?utf-8?B?c0E4MHA5RSt4eEZZc3pSVU9DYU9hLzlOZGFIMWl3eXUxdUpUWVJqUEhsS1k1?= =?utf-8?B?VXdtVjA2ejZZam01dXk4N2F0KzRKMEUxcmREdTJZQ01OWm5XMzNpTUpHV3lD?= =?utf-8?B?U21QZEEwbExIREpqOUNCaXJWeVp2Mm81V1Q5TDFWcStuSi9NRVFOaUFPbW5K?= =?utf-8?B?R0Zoa1Zoa3dQV2UvU3kwSElyMkhtcW9SZHF0cnBYWjZOSmV5R1FaN1pDMm5N?= =?utf-8?B?YmlvUk9UUFpLQmdUM05EclVKYWlxYVpiK3ZSUlExVXpWYTQ5MFljeXZyRlVY?= =?utf-8?B?V01BVXpXQ3RDNTFvRmpUSlR4Y0k1Z29ZTjJCR01yNTZRTXJlaDdwS09HYXdk?= =?utf-8?B?b2pPdlhkSGIwVG1NeTA0d2RUemo2SG1aME1HbkljZURSYmJiSk1LNDRLMjZJ?= =?utf-8?B?RFVOQT09?= X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0724; 6:wn2B1wvHohqtpAvcjRnIylTdlpx6WnM1pQlmgnSsF1MrwcLfVf/K3r8MqdJ4wo1DiHO/ymZ+y8AA8zcLnmqb3WvV1C2LiMzUsV6P5zGTIVpA3oGuMY+1KvPQMcuKEHeOEclpBiIjq4p1f55QCkyfCoP7hzFjnL0lggXtAQ3KqjdZw2QXVMAG9lQXRSHciyjEBUvyPRF/V42dPtu9p235mIFuKiDMMCRl7vqpR75RcfVUCwkwMkn6cE5yEUwzsvLllWysZoCU0DHRhtEh4Al8fCAPiqpgWFTqLE+8HrLMsVucCwYwYnfQZIRhmu/hHhg1XaWtabiHd8++M0CEJBsUW74vqirmk/HgOGq1rEI7zI0Pe71NZKMRsX6AHM762Ge/sCASR1zdNwVOOc4gq77HsuRw9r000WkUkvTxdYSUNq4=; 5:6KbyZPsGH86zmYVNgwqVM3+RPzxQbQSWUrPr3BwWuydZ3drkBy5IgaZQHkXYjQVEDo5eXwLLGk62laoYTNY628Ad/QDkJEakUeIqw6N0Itq8WuNbl8dlKLrXXhLIN3X86taQvTVBQ0DiOirVeiFAAJ+/ehSM0G6zirKzEW3XQ95YtquFDff+fOrffxsfRbhR; 24:d//Py+994DTzBIqb/iJlBbY0cd8V0F8JOgLZLZve+kW4aRTBj9pkOkeyFbysDONiWtGJRdVty1psidKtoOb/0D8HuV0iZjITOhLHHpVUAaY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0724; 7:21C+dcEi8Jx8G7FwHsyvbFxHE6p+8O3Uy7zK5G/W+pDznIoJOd6r7nwVaqgKj4LMbTJjnssgkqdo0R0LTOs2M6TGAIIj5kd8xyPtSNFRP4D+KZkLszsh+r4SLCISe9De004c/2ib27PagVSKaAf//TV2RurGfDcZjBzpM3m07iusbiGoomARKWw1iJY2577EW6niVal29TLuwMzyodr1IWHiBDIZR3uDP8ar1C59HIFuE91SVy3+s5JJoV0WIJuV8iOEOvNS3WA+xJonBhBsLJF9IsGwd1laxDEmzBn0ZBvSBmH300VRlwxkUentTp3jsdmo62g8Szb7H0kEPocA+bx3Q8hEtVWU3xkOxz9HD0+1KwQa1ekUfDD0k/7uYoJcVK5BHfPoTDsxZx6pp2DVGCVjWBHtqMgc7Gko4sp3yVvB8zU5aas2ZW9xX8bfxFOa1JE1f0suxtvmrykt0/9DqL//o03QTrR+dj8eeJDtl1YHVto5m84D3k7S5kSd+cu9tnf+D3cx7zi5RQFAsB/r1g== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Feb 2017 11:25:32.7077 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN1PR0301MB0724 Subject: Re: [dpdk-dev] [PATCH v11 07/13] pci: split match and probe X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 15 Feb 2017 11:25:35 -0000 On Wednesday 15 February 2017 04:15 PM, Jan Blunck wrote: > On Thu, Jan 19, 2017 at 5:45 AM, Thomas Monjalon > wrote: >> From: Shreyansh Jain >> >> Matching of PCI device address and driver ID table is being done at two >> discreet locations duplicating the code. (rte_eal_pci_probe_one_driver >> and rte_eal_pci_detach_dev). >> >> Splitting the matching function into a public fn rte_pci_match. >> >> Signed-off-by: Shreyansh Jain >> Reviewed-by: Ferruh Yigit >> --- >> lib/librte_eal/bsdapp/eal/rte_eal_version.map | 1 + >> lib/librte_eal/common/eal_common_pci.c | 189 +++++++++++++----------- >> lib/librte_eal/common/include/rte_pci.h | 15 ++ >> lib/librte_eal/linuxapp/eal/rte_eal_version.map | 1 + >> 4 files changed, 121 insertions(+), 85 deletions(-) >> >> diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map >> index a3d9fac..afa1643 100644 >> --- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map >> +++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map >> @@ -184,5 +184,6 @@ DPDK_17.02 { >> rte_bus_register; >> rte_bus_scan; >> rte_bus_unregister; >> + rte_pci_match; >> >> } DPDK_16.11; >> diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c >> index 72547bd..4f155c6 100644 >> --- a/lib/librte_eal/common/eal_common_pci.c >> +++ b/lib/librte_eal/common/eal_common_pci.c >> @@ -152,129 +152,148 @@ pci_unmap_resource(void *requested_addr, size_t size) >> requested_addr); >> } >> >> -/* >> - * If vendor/device ID match, call the probe() function of the >> - * driver. >> - */ >> -static int >> -rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *dev) >> +int >> +rte_pci_match(const struct rte_pci_driver *pci_drv, >> + const struct rte_pci_device *pci_dev) >> { >> - int ret; >> + int match = 1; >> const struct rte_pci_id *id_table; >> >> - for (id_table = dr->id_table; id_table->vendor_id != 0; id_table++) { >> + if (!pci_drv || !pci_dev || !pci_drv->id_table) { >> + RTE_LOG(DEBUG, EAL, "Invalid PCI Driver object\n"); >> + return -1; >> + } >> >> + for (id_table = pci_drv->id_table; id_table->vendor_id != 0; >> + id_table++) { >> /* check if device's identifiers match the driver's ones */ >> - if (id_table->vendor_id != dev->id.vendor_id && >> + if (id_table->vendor_id != pci_dev->id.vendor_id && >> id_table->vendor_id != PCI_ANY_ID) >> continue; >> - if (id_table->device_id != dev->id.device_id && >> + if (id_table->device_id != pci_dev->id.device_id && >> id_table->device_id != PCI_ANY_ID) >> continue; >> - if (id_table->subsystem_vendor_id != dev->id.subsystem_vendor_id && >> - id_table->subsystem_vendor_id != PCI_ANY_ID) >> + if (id_table->subsystem_vendor_id != >> + pci_dev->id.subsystem_vendor_id && >> + id_table->subsystem_vendor_id != PCI_ANY_ID) >> continue; >> - if (id_table->subsystem_device_id != dev->id.subsystem_device_id && >> - id_table->subsystem_device_id != PCI_ANY_ID) >> + if (id_table->subsystem_device_id != >> + pci_dev->id.subsystem_device_id && >> + id_table->subsystem_device_id != PCI_ANY_ID) >> continue; >> - if (id_table->class_id != dev->id.class_id && >> + if (id_table->class_id != pci_dev->id.class_id && >> id_table->class_id != RTE_CLASS_ANY_ID) >> continue; >> >> - struct rte_pci_addr *loc = &dev->addr; >> - >> - RTE_LOG(INFO, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", >> - loc->domain, loc->bus, loc->devid, loc->function, >> - dev->device.numa_node); >> - >> - /* no initialization when blacklisted, return without error */ >> - if (dev->device.devargs != NULL && >> - dev->device.devargs->type == >> - RTE_DEVTYPE_BLACKLISTED_PCI) { >> - RTE_LOG(INFO, EAL, " Device is blacklisted, not initializing\n"); >> - return 1; >> - } >> - >> - RTE_LOG(INFO, EAL, " probe driver: %x:%x %s\n", dev->id.vendor_id, >> - dev->id.device_id, dr->driver.name); >> - >> - if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { >> - /* map resources for devices that use igb_uio */ >> - ret = rte_eal_pci_map_device(dev); >> - if (ret != 0) >> - return ret; >> - } >> - >> - /* reference driver structure */ >> - dev->driver = dr; >> - >> - /* call the driver probe() function */ >> - ret = dr->probe(dr, dev); >> - if (ret) { >> - dev->driver = NULL; >> - if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) >> - rte_eal_pci_unmap_device(dev); >> - } >> - >> - return ret; >> + match = 0; >> + break; >> } >> - /* return positive value if driver doesn't support this device */ >> - return 1; >> + >> + return match; >> } >> >> /* >> - * If vendor/device ID match, call the remove() function of the >> + * If vendor/device ID match, call the probe() function of the >> * driver. >> */ >> static int >> -rte_eal_pci_detach_dev(struct rte_pci_driver *dr, >> - struct rte_pci_device *dev) >> +rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, >> + struct rte_pci_device *dev) >> { >> - const struct rte_pci_id *id_table; >> + int ret; >> + struct rte_pci_addr *loc; >> >> if ((dr == NULL) || (dev == NULL)) >> return -EINVAL; >> >> - for (id_table = dr->id_table; id_table->vendor_id != 0; id_table++) { >> + loc = &dev->addr; >> >> - /* check if device's identifiers match the driver's ones */ >> - if (id_table->vendor_id != dev->id.vendor_id && >> - id_table->vendor_id != PCI_ANY_ID) >> - continue; >> - if (id_table->device_id != dev->id.device_id && >> - id_table->device_id != PCI_ANY_ID) >> - continue; >> - if (id_table->subsystem_vendor_id != dev->id.subsystem_vendor_id && >> - id_table->subsystem_vendor_id != PCI_ANY_ID) >> - continue; >> - if (id_table->subsystem_device_id != dev->id.subsystem_device_id && >> - id_table->subsystem_device_id != PCI_ANY_ID) >> - continue; >> + /* The device is not blacklisted; Check if driver supports it */ >> + ret = rte_pci_match(dr, dev); >> + if (ret) { >> + /* Match of device and driver failed */ >> + RTE_LOG(DEBUG, EAL, "Driver (%s) doesn't match the device\n", >> + dr->driver.name); >> + return 1; >> + } >> >> - struct rte_pci_addr *loc = &dev->addr; >> + RTE_LOG(INFO, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", >> + loc->domain, loc->bus, loc->devid, loc->function, >> + dev->device.numa_node); >> + >> + /* no initialization when blacklisted, return without error */ >> + if (dev->device.devargs != NULL && >> + dev->device.devargs->type == >> + RTE_DEVTYPE_BLACKLISTED_PCI) { >> + RTE_LOG(INFO, EAL, " Device is blacklisted, not" >> + " initializing\n"); >> + return 1; >> + } >> >> - RTE_LOG(DEBUG, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", >> - loc->domain, loc->bus, loc->devid, >> - loc->function, dev->device.numa_node); >> + RTE_LOG(INFO, EAL, " probe driver: %x:%x %s\n", dev->id.vendor_id, >> + dev->id.device_id, dr->driver.name); >> >> - RTE_LOG(DEBUG, EAL, " remove driver: %x:%x %s\n", dev->id.vendor_id, >> - dev->id.device_id, dr->driver.name); >> + if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { >> + /* map resources for devices that use igb_uio */ >> + ret = rte_eal_pci_map_device(dev); >> + if (ret != 0) >> + return ret; >> + } >> >> - if (dr->remove && (dr->remove(dev) < 0)) >> - return -1; /* negative value is an error */ >> + /* reference driver structure */ >> + dev->driver = dr; >> >> - /* clear driver structure */ >> + /* call the driver probe() function */ >> + ret = dr->probe(dr, dev); >> + if (ret) { >> dev->driver = NULL; >> - >> if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) >> - /* unmap resources for devices that use igb_uio */ >> rte_eal_pci_unmap_device(dev); >> + } >> >> - return 0; >> + return ret; >> +} >> + >> +/* >> + * If vendor/device ID match, call the remove() function of the >> + * driver. >> + */ >> +static int >> +rte_eal_pci_detach_dev(struct rte_pci_driver *dr, >> + struct rte_pci_device *dev) >> +{ >> + int ret; >> + struct rte_pci_addr *loc; >> + >> + if ((dr == NULL) || (dev == NULL)) >> + return -EINVAL; >> + >> + ret = rte_pci_match(dr, dev); >> + if (ret) { >> + /* Device and driver don't match */ >> + return 1; >> } >> >> - /* return positive value if driver doesn't support this device */ >> - return 1; >> + loc = &dev->addr; >> + >> + RTE_LOG(DEBUG, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", >> + loc->domain, loc->bus, loc->devid, >> + loc->function, dev->device.numa_node); >> + >> + RTE_LOG(DEBUG, EAL, " remove driver: %x:%x %s\n", dev->id.vendor_id, >> + dev->id.device_id, dr->driver.name); >> + >> + if (dr->remove && (dr->remove(dev) < 0)) >> + return -1; /* negative value is an error */ >> + >> + /* clear driver structure */ >> + dev->driver = NULL; >> + >> + if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) >> + /* unmap resources for devices that use igb_uio */ >> + rte_eal_pci_unmap_device(dev); >> + >> + return 0; >> } >> >> /* >> diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h >> index 8557e47..adc20b9 100644 >> --- a/lib/librte_eal/common/include/rte_pci.h >> +++ b/lib/librte_eal/common/include/rte_pci.h >> @@ -371,6 +371,21 @@ rte_eal_compare_pci_addr(const struct rte_pci_addr *addr, >> int rte_eal_pci_scan(void); >> >> /** >> + * Match the PCI Driver and Device using the ID Table >> + * >> + * @param pci_drv >> + * PCI driver from which ID table would be extracted >> + * @param pci_dev >> + * PCI device to match against the driver >> + * @return >> + * 0 for successful match >> + * !0 for unsuccessful match >> + */ >> +int >> +rte_pci_match(const struct rte_pci_driver *pci_drv, >> + const struct rte_pci_device *pci_dev); > > I don't think this symbol needs to be exported and visible outside of EAL. Agree. 2 reasons why this exists: 1. Initial RFC has match as a callback. That doesn't exist now. 2. Earlier the idea was that other buses/device-types might use this function (buses which are PCI like), but that is not a good assumption. > >> + >> +/** >> * Probe the PCI bus for registered drivers. >> * >> * Scan the content of the PCI bus, and call the probe() function for >> diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map >> index 69e0e7b..b557e7c 100644 >> --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map >> +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map >> @@ -188,5 +188,6 @@ DPDK_17.02 { >> rte_bus_register; >> rte_bus_scan; >> rte_bus_unregister; >> + rte_pci_match; >> >> } DPDK_16.11; >> -- >> 2.7.0 >> >