From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-cys01nam02on0074.outbound.protection.outlook.com [104.47.37.74]) by dpdk.org (Postfix) with ESMTP id 581C5FA60 for ; Wed, 18 Jan 2017 15:03:36 +0100 (CET) Received: from BLUPR0301CA0019.namprd03.prod.outlook.com (10.162.113.157) by CY4PR03MB2472.namprd03.prod.outlook.com (10.168.165.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.845.12; Wed, 18 Jan 2017 14:03:34 +0000 Received: from BN1AFFO11FD006.protection.gbl (2a01:111:f400:7c10::160) by BLUPR0301CA0019.outlook.office365.com (2a01:111:e400:5259::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.860.13 via Frontend Transport; Wed, 18 Jan 2017 14:03:34 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;nxp.com; dkim=none (message not signed) header.d=none; 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 BN1AFFO11FD006.mail.protection.outlook.com (10.58.52.66) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.803.8 via Frontend Transport; Wed, 18 Jan 2017 14:03:34 +0000 Received: from tophie.ap.freescale.net ([10.232.14.39]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v0IE250v026776; Wed, 18 Jan 2017 07:03:32 -0700 From: Shreyansh Jain To: CC: , , Shreyansh Jain Date: Wed, 18 Jan 2017 19:35:19 +0530 Message-ID: <1484748329-5418-4-git-send-email-shreyansh.jain@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1484748329-5418-1-git-send-email-shreyansh.jain@nxp.com> References: <1484735880-17178-1-git-send-email-shreyansh.jain@nxp.com> <1484748329-5418-1-git-send-email-shreyansh.jain@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131292218145351248; (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)(336005)(7916002)(39860400002)(39400400002)(39410400002)(39380400002)(39840400002)(39850400002)(39450400003)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(189998001)(4326007)(97736004)(626004)(5660300001)(81156014)(8936002)(54906002)(38730400001)(8676002)(47776003)(53936002)(77096006)(8656002)(36756003)(2906002)(85426001)(50986999)(6666003)(48376002)(50226002)(33646002)(50466002)(76176999)(110136003)(86362001)(106466001)(81166006)(92566002)(68736007)(5003940100001)(6916009)(2351001)(2950100002)(356003)(105606002)(104016004)(305945005); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR03MB2472; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD006; 1:7fdbbQamhr36pWoTQhtwFJd4A3h/BHv4BQJT01vKuVSqvoblTg080WuLpeGWTaBR2ejOxxf7bB5Z0HISrwP/VcBgATjA1QSRfzCxjYbMmowCIhztxYtkQk4GU6+2QGhdeK0dlnUcbn8GWEJu3C/dICQ1aUp9lyNZEx8d9wnzbNUxFcaiWLbXwomyR5eBQ4407jdpdemlgUjstoS7FkKPlPNekWnBCn1Bb4xIV7hI7bHkNpCF9YQTioB0FumRkzFNP1/4gYdXh1LvbT1NuA00Aq8JKhKCoNcd+Rqkk4XN/DeY698TGwqFk3CqQvLlAyvTfinDnUi19X2the5TuyHAYT5r5IVEyIkgFaiwH26j35CNkggTMhQ1lVv53r6Du1YakjcZuOL3pFaK7a2xQwPMRMQX03IOFZUqSCaXOPLjoHO9OgK3benK8xLaBn83esbTHpGQRZ40YKyVDUwiq0ZDwqEwdgML2yanw8wD51gTsXdHZ7eBFfz8Lx8fxZB2HZtyvdPYPXN5xIYsXFd7bOqObtU0Pwj5GDkD1tyb0OlQ/5RgqZA39wNYdf9wnyhojk/HPvdcLuJ7yDw2xi+8/vF22eV/PNjFClXgK+Kis1/m46xICaf1SwdCOJcY0R29txvoxIvCZ2tYXE2AaVX2sGhQiGbQBWH7lHrx15sSSiSxURHVHYxxj8fUKyUydI968FsXKYLgc4o6wR5KLG5qg0v/8A== MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 6a4bd925-f7d5-46d4-fcc5-08d43faacab9 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:CY4PR03MB2472; X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2472; 3:ed8Ifr2cxa6Pk5y7dlc0coCrveRj9zZyFihN0byWeL/1weNsT7h3GI5BFP69ji+8Iz+VdQBRgmDDOlN00eMmyGa2aVi+neNrZPgC/9sY1+wWJIOlx6OZRbvetlSWxWGOjN/s57rull2PP3DW8fawzfPcMZsiApPEHJgHLPV4aw6ISzkYUf499UC65i83TrzaXQd115fAJYzjrGpUXfL8LdGZYa7zsdOx+7DyMOCooelUcpFDBLx6XWzfaV414md7p3xdvYLjnhQtGvRE/ghgsJrQg7dUln20kH4WWPsQOQvs0MMSGk1BRaOmIjmZy8mBneEsyUFXQE6VtAaKxnDdQxTEkXhFZpHucMuqOZKbjQdR95MMaXrRMWPKDXmoUuDg X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2472; 25:GB88cLGitq9D2iId8jMnHDWtH71sWUHhtnUECAPRvoKsriKY/QBJywkBUPrqAv/b8oTimJTk+HCiYU+KBJR93u+nFAAQ8sb/l+2pjROEz7kiNNcnHlXbsybWjabZCWEyWEd13a7ujPvsp15fM2dj0ROrq1anfyShJz6OWmiS4Yj1Meok0plYPMe7Ic3/Mt1PGC+lz+/QWnybqufTXXcb+d4IMcRmafjXaeGxWrwvNbRl7WLcoCoHQ3m4VZUACWaHfD7mNCuek5BvN7QJCV5rEed0y/Ih0hPBzcttiiFrzqZcpWvP4rD9ms8DO/QApv3mXUa2VwTegFNMuoZJFk8mjVe8tkjYNVwYvCmKZ77wsQAMkiqiOf3hOWKJa8bo5SA7rbbb6PRKV/DaPFOIRJ3wO9Rmdr8yXrsfsKB0+CGSCAT/m9o9eEbMq0nPKrMXVJeXe33EAjjKzWSbYVvjHlqA29xs/XmtKkCdbyVDijbKeXGpi+FYkTYseF0QXXSTxtBAspB5zeRrpk0jvyFSqGPXRh1CqCl12b7l8NnoHawq2PSwHIJ8xMQtuOTIel1HBzzkz7J6TpdHfxiYSDJgfRtqzuOORSfRag3KZZ15nNjw0bMjCh+yMzIswKAl6IOgXoUGCF5F0XnYwJFEbVibRopNQTND6CcliglbdOkTYpEAyuewpizuiMYSzSrM/nChHf+ODRbXRtGySm6JTvXqEc41xZbgN1g+YHZbzo665gkU04LAibxtyxEtUPavw5QDK0VqcXBPA5gWdAfSHMO+eNzOFfbUZfhtxWYBWy11tfuDFLc= X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2472; 31:DYA8ZAkuHVKP79qbeTyMY9Zm/ZwNiOyE49ZOJq8ng7mIrw8sFbBPNPw6ajRYaisNQJ7zFa0PPgRuATYIAKBp0DLbB5144HCio43LfsF8a9lLRDZ65Sy6yL4VjifzGeRlwQKunG0uWH7uJYdyDRyWeSdvRz/RMFQQKZegEbfT6FH8d7aPPZaBnG3f1r4tVPRdDf6HsoGd/LpaUVCBFfwMmic+gdMxnLJ0OQMRtPlXI1DFUxR0qjGDQFErxOOFEkrUxmw8xX2xOT1Pk6jJhTr4M8KLKBhX1wu6A0W0YLXolrM= 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)(13015025)(13024025)(13023025)(13018025)(13017025)(5005006)(8121501046)(3002001)(10201501046)(6055026)(6096035)(20161123565025)(20161123563025)(20161123556025)(20161123561025)(20161123559025); SRVR:CY4PR03MB2472; BCL:0; PCL:0; RULEID:(400006); SRVR:CY4PR03MB2472; X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2472; 4:O2O9RwDYi89TsMJcdLHK2UyeHPr5QA0s/lV3sIuRcMm74S2DM+wV8ScVJdY/J9hNdlhWAbAzIKf3EXkZfEb2WebYiiRfzmwHQN3tdjUsX6uljSVwU9XWG2M6a6Knr0NjtCW9X2T6BM5vtWqcCEBtgqNLsR2ANymBFh3Vc+UUX1Q+5Q1oH13Jz3n4vW1p+hHzWxze9fgzhkNIDDJO5cdnxlCd86LsHLSTbYql50hLv4/O+SlicjHNhYeUU6FYwV/ztM/7lYVNyzEvzFXQaQpbAv9rCjUvdUJuvdaxqZG3fhzp280reXLpPNXYIb5OBh7CcXG+CEx3gBJs7U62s7yoeIQIO8i3V6RHN2VM+vUamS0h7LqoHsSzw6bAchikob9hKnWpusfGftOZhimcPJn82MyopyozCiFKcZ4oS/MUk6gI3SeOinSD0uK/4fZdC1QUFfqe/LVbjtkzQaLNaovuNthg9bsViqJ8BSr85NoFW+slmZGKRIlx5/+2qBVklwQsKMQjQEVspihl+nuQq7bHrRiiUKKgQGWzWxuHtlrz6o1C3/3mBLyij4IhRsb1IW8y+0/d/5kBt6d0pMmgV8wd5tZS1JKrrCbRHhX9xm3094W3PYAyPXjKKH8ZQfeSy/bd5WBec1xcEg1ws9ZcQamgrGFVP0Q2AtkAHwyqCyg2rOYcLy1DBKSQ09HVfxOPrnUSyONwq2c6Rl+M2zEa9ZEymZM3kwin8cph6GTc67dEym6SH4zkbjsWVrn6oazlkb8pKLZxzufCIqzUfe9kSNTSPw== X-Forefront-PRVS: 01917B1794 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR03MB2472; 23:S+3i7p+3ncAM8g51tB0cS5rAcQI61Ykzzp1sP0BIm?= =?us-ascii?Q?JHBpN+YZ2L0PrhbAFtb/buFTw3JqvxFIuEUAsyVQuUsNCBruwGP3h1SEzeqX?= =?us-ascii?Q?254i9uSjv6x7rM5R69aQKVlBkYbTrOL/wSp1tvHB78guVlsmyt0HYjmi9J26?= =?us-ascii?Q?rLwiGbqqlt4+KS0KlI6Nb459aoeMpwErXV2ab9I90t7VcZ+Dpo6MWivNr4Ma?= =?us-ascii?Q?Jrv9ZPSDL7pwy3ogj8aH4ukd2HihViU8QLVvCmqPAoPMTTv6LXRLVxeeSlBz?= =?us-ascii?Q?E99zg+fUSHAMoSxU4o4cxBDJPecBjsfP+vVUeKWgRdI/WTHttYlfDlwWyEvz?= =?us-ascii?Q?DTe0kNiB1M1VDhUqFmA+IbE0mXwjUHuU0UGD6C1Z7Jkk9dnKLJ75yIB4LyyH?= =?us-ascii?Q?3WHGiUJpPHMmf9cbdzmWLjwgoNZZkLvV8RUXDQ6pmg+wmQs0nLiJZ+iyItR7?= =?us-ascii?Q?+Yr7UrPBl8E94o+Yr3OkwDlNVwvkzlOzq4SCUHWYEKnyLKU/IJinUrexxnlL?= =?us-ascii?Q?K9u9gsKMy+VS0jJZ1Cv6XM/Hrj7/wQmXiA5gIudnvtRnpAbUOqYJN8p7PzpH?= =?us-ascii?Q?NjyLdp89yrVUdb00GYSc3U+qndrOw9cjdFGH2uM6gKMf6nzEjciesi8/VSdd?= =?us-ascii?Q?nrIs+lrQRJr+b4fZiFxBWfwymvu9fGYL2r3dLG4mOIBzmytRvF9kmBPkjVpO?= =?us-ascii?Q?tF7sCkrydZdjKkn34FLgIeQY6hZzbl7lnmWroKJvUimaWu4ep7snCOY1Ec1K?= =?us-ascii?Q?KGG1kFu3Ubd6UIf411EYar45MNKnVrBdIA29k4Guoj0dbGtyCccUHnrKKddY?= =?us-ascii?Q?10XBrmtUq5mz0QlIRnECJQS4/hHklLXUsAFitofX+AlbGaTSLye35YkOKFL5?= =?us-ascii?Q?+3bsUiENF1eI8bQ0roU/VKg3Ndwr1oVVrQ2MH30998pdEwVoRjh9Z515QXjQ?= =?us-ascii?Q?7BI0PI5eM8OEZjqVHLCMn7IJ5hRQn6iSnZglInzkwwMtpi9rvqfonqhNAQy0?= =?us-ascii?Q?HURsKu8wmlGg/irlX+hI1257XvVOmsFaVBqPpKpFtQNUmIxhM1JhpyooQ7wm?= =?us-ascii?Q?oFZfxchtTVEJa5qJzZkdOx2q5j3Uzk6bpBhcEo9KhK7pJEK+SoNJnnF8eq8N?= =?us-ascii?Q?QHyxVpsiIRRLvg7EpoNxkoTSwp6Eqm0y2b0FhETqLG1L75o4cIGzpObUco8y?= =?us-ascii?Q?+xuNDI7L6AdrvlhXAA+HUslfAHooTdO2Gslk6gDZtKMw9G7KntIIZZAjAGu9?= =?us-ascii?Q?NqgMUVVZVl9iL/1WgHB46R/5Wumr6KPOrt8pshVhj0++MAQikG/f8xeEsH39?= =?us-ascii?Q?i3a1s1TuxrLTXcxBV6Ipi8=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2472; 6:RPnx8DWdimgiKiV4mB5KvUhVqOwE8G74q5muLF2Mig6tfqafYnBjatRaf5ub4Hviow1QkjX3LjQdhrWGsIoqMi3vHJONp+O0WEw4m8J5BsT9V95BZojwprFMS4dzl6kkeFwSyqE4enQEPpNTQpjizSzV7zZ6NzNAzbxmGThRgVs4rcsR0eUsYEAMs6brROemIBGGZWJbkqTr4/xf2ZiFNJZl1B2WGaRvEDE+QbuKiOexW6B0ogMxVs/DUopKuGcG+xndPFMj7GSR/BkmFRxAg8auckShAsbk6tJjq76oFM/tiVIhBa5cnm+hQbL+xmRl3hN59pLJ3VyVUSDm+A9Jrxxkssw6GXgIlVmhfwmDRyzsDCVZwmQtkJ1N5zIvDF6jbO3qIy8gvj5H5fioCI0QkYRSR47JEPHO6jTdwlc4yce6glEeRUO/iR0LM1tDsg1t; 5:tgHRBHyy8K08B/HgbUCFRbDUZcFyq0PAk0i9z+7ENzUZQtSG9XXirol3SFaDf61JEjoG3FfTGmMkxY7qAX7/mSYsicEV/B42nRczmlL9nn+BoDmKjdjcm5TU/Wbbd0dBbcPaXnK07fZ9Smfw+xyQNwHXW5W1nmWRYiCV7QYtlPb0sE98l5o4QHfoaSOqiVxv; 24:8z8ivrJQRYPtZU9I99J9DzgTJF9fF6QvaUt1qMzCjd6d/P1N313/Vma/7RaXqMrnPSs7Ub6vGjDdiOAn2bwSr0gikWHmSgix4bRPgQo9gmk= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2472; 7:OJmwSFu21PMeuVrQfXyVal8WqWExBnDa3EVWYq1s3yovifLOjCx/S7RxFIZ5bv8ELy2JFutnIioYZpoVuSuv3WMuXb0ayaJfwjktqKiP5KzJdQBf37eUqB3oPrqLh/cjwFQ4CbIDdCbEA4eAjC38s02rb/VGn0spt+g679+y62Aii3qyaAWyAq55Wg8x3X1uCZ8kVlGjBWM7blO++e3QUyknOuy+126Z5NoXNDlDYeQhZaBv7Wz6cBQwUSWfy3Qge0gpmq2ElMkdNWQmaXqmCx6SM7Ud3NwU5uOEp1Th+CRLKxaTrVFd4wvK0UMPdn1hKwmULpAKJPiRy/CivDI3BeVrJt6b+3DUawthznmMlH9j6wlTB59E9tv28eIFZ2hvlC6l8EeZAo3gQHt74Mku1zB+nbH1EgVDQpqNI76joO9KEHfauRlI8YXJhVNTM6IV5F8XWsUJvc5XTTeTvfItuw== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2017 14:03:34.2387 (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: CY4PR03MB2472 Subject: [dpdk-dev] [PATCH v10 03/13] pci: split match and probe function 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, 18 Jan 2017 14:03:37 -0000 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 4dcf653..c015889 100644 --- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map +++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map @@ -182,5 +182,6 @@ DPDK_17.02 { rte_bus_dump; rte_bus_register; 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); + +/** * 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 b553b13..5ed2589 100644 --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map @@ -186,5 +186,6 @@ DPDK_17.02 { rte_bus_dump; rte_bus_register; rte_bus_unregister; + rte_pci_match; } DPDK_16.11; -- 2.7.4