From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <shreyansh.jain@nxp.com>
Received: from NAM01-BY2-obe.outbound.protection.outlook.com
 (mail-by2nam01on0085.outbound.protection.outlook.com [104.47.34.85])
 by dpdk.org (Postfix) with ESMTP id 45DD1FA3F
 for <dev@dpdk.org>; Wed, 18 Jan 2017 11:35:39 +0100 (CET)
Received: from BN6PR03CA0009.namprd03.prod.outlook.com (10.168.230.147) by
 BY2PR0301MB0742.namprd03.prod.outlook.com (10.160.63.20) 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 10:35:36 +0000
Received: from BL2FFO11FD039.protection.gbl (2a01:111:f400:7c09::127) by
 BN6PR03CA0009.outlook.office365.com (2603:10b6:404:23::19) 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 10:35:36 +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
 BL2FFO11FD039.mail.protection.outlook.com (10.173.161.135) 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 10:35:36 +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 v0IAYYhc003396;
 Wed, 18 Jan 2017 03:35:33 -0700
From: Shreyansh Jain <shreyansh.jain@nxp.com>
To: <david.marchand@6wind.com>
CC: <dev@dpdk.org>, <thomas.monjalon@6wind.com>, Shreyansh Jain
 <shreyansh.jain@nxp.com>
Date: Wed, 18 Jan 2017 16:07:58 +0530
Message-ID: <1484735880-17178-11-git-send-email-shreyansh.jain@nxp.com>
X-Mailer: git-send-email 2.7.4
In-Reply-To: <1484735880-17178-1-git-send-email-shreyansh.jain@nxp.com>
References: <1484660264-6531-1-git-send-email-shreyansh.jain@nxp.com>
 <1484735880-17178-1-git-send-email-shreyansh.jain@nxp.com>
X-EOPAttributedMessage: 0
X-Matching-Connectors: 131292093365791382;
 (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)(39380400002)(39400400002)(39850400002)(39410400002)(39450400003)(39860400002)(39840400002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(105606002)(5003940100001)(2351001)(86362001)(189998001)(76176999)(50986999)(106466001)(33646002)(356003)(92566002)(5660300001)(305945005)(626004)(53936002)(110136003)(47776003)(104016004)(97736004)(6916009)(48376002)(4326007)(38730400001)(36756003)(6666003)(50466002)(81156014)(2906002)(85426001)(50226002)(8936002)(77096006)(54906002)(8676002)(8656002)(68736007)(81166006)(2950100002);
 DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR0301MB0742; H:tx30smr01.am.freescale.net;
 FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; 
X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD039;
 1:oeTIwa9lZ5GtVaAYffu6Pi4PoHMxRvrKQy3aEasbpnTLdgwj2fygC6Eb4NXdov/OPytVce/9dHPKdjLQbLb+NVUVs+5ZBdWff4GVzfH6rGvq9sNGs1CurIHE8Ex/MCFWgW+cJdW0y4bmZxBjRpVLdZ8dNfTQCAbi20AikHfZ1+19SIverOacc+KgULXDiIt0tHibgjwlvpWlsR/wBsULsMT2UamjzsqEdHZqWAlnLCVAh7zBORvski++lGeRdW9Phe+q62VpONl87cBifY0kFle200TJhvZPGs/LbuJy6uwyFYGBx7CaYd+wIe6xrJ3euHp1oQLxPl0odbxvlQZymz1NHaw1lBF/UNJWhkBO2kUrdnLr/gmLi9TsfAA/zanQ5Q7yAq03zruBVGOqzl4Hs0c/J5YDGiN9cXIXKuqKrGqtE33NCZbOEWW/7/CZKZxNmWKqzUZi1nDYrBVPS2WfjwYbeYhLWzHhBpQ6n4IuTZ0QkvkV04TKVTkjR0BsqktWSm7BTaDnz1+UBxVXQz7pq9MDGo/fDsElvbRBTjjFGQSl6di6h107v/ysTUh8gaohicpUKtVflVEI9MpBbTSMhkcU2H4NdA85cOhAoZMSpigURDvIYQkSC2wqCwrst5x+t2C69z1BAjlvGUvjZRvZxQ/II/TdSz691VZ00C78XUXNrdjfj4pBmQmpHmMLJJRlPjJ7Ut7wY9V5n2mf9olwww==
MIME-Version: 1.0
Content-Type: text/plain
X-MS-Office365-Filtering-Correlation-Id: cfbe248c-f26a-4e02-3e3f-08d43f8dbd44
X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001);
 SRVR:BY2PR0301MB0742; 
X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0742;
 3:0a5oZ+h9B35KlsQZ4fW4qZqYQlAdP46H8OI+b8hZ4iGaMi1GVzXLkuLh5JIobAGmqdBSmRKpbMtjafYWA3wmuuuYiNRdkacg2UGDvexTScnKLAcuM/l2+nu8iqCBr7Lzlnx5zKzxDeS9fgtDA6xYwUjlqET6/7yNcpMuDM7j3c98DVRQrfSAd8PkhdROx/vDs4JuJL4bmJav/FKGUvkQd+9W50gtNlz8XLcn3re32SBdrOZDAGR8TJu/tAkZrKyoBiFjsDpRWcC5bjNsZmVwTATBDIFFkDY4NUt0ZckBMMWu92r/e6Qq/2o8SgkJi+0pJQv6uCOwIkGC1avxcYj8HcLK541oh4qd7w6/xqh3ytreUgmUPyEOR2H3Zraq1PMv;
 25:4H2Ly8JcSzHiJ6xGKeRac5rRApRka4D4eZlf/5W9JanS6ejq4g2rEqNCEWDrsmvrF/OsD5BPebxf7Pm6ENNqGT6ithpWQ7yCJMwJ4+R8Ofd6xCaduud0kdMm4qZSxxRDfoWZVdo68S7qnDGtQcrlPoutN4i9VgAlcULoDFfKqR83VfFENV7x0P/XZZfPs5+tKQcrn4UaoOyX4yeN23t69nYiOXC0I6bIFxXBM+71V/aOa0xAB62WEAMHiZLE9uTLrIPzFkGqyXNUjrcVJ9W6M9sRvK8xJQ0uFkwt9SBCOSd4yyYSsJ2Rt/ltt9JOZuGvkic6vm1wcrZyMmw986SD6sHMnoO7iiYATXxabDr7B5BamUFe62oRHtOnyYV05qm03CUCNk0GCMk96G6lTh2pVZ/RmPmWl3pZCIGXI+G/sUnX/e4waoRbHKj03MYbMrDwEaq1Opsyt9c3CR5RlAIaIA==
X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0742;
 31:yzDzrIiJHb3Tm2Krn5VnkqrusCTJGtvNsG5RHG9g4RNxyIVHRcG6xXQh/vSicVivJCPo5BdmBFV4kxXyK07V7IO7CiIkdaCZhK+ukDsz78SE0JGDeuOj+1bPsYuTtDuQxqJDO0LJMjkcHsSmd9R1p+z6ZAaOCncfACdcxsHeYSoeQEut7cWOKaRYb5FDbOEDo4n0dI0a2Rj+zhXG4Y+zs8P3ldQ799h0xSKiWSaDcqwwNJklgr4AUPN2E6n5HO13BJIaBo9dIOxM4O/3TXmpeY/Oi/SAUyPDSJAVk3ftBJ0=
X-Microsoft-Antispam-PRVS: <BY2PR0301MB07429903541EDE8CC962522D907F0@BY2PR0301MB0742.namprd03.prod.outlook.com>
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:BY2PR0301MB0742; BCL:0; PCL:0; RULEID:(400006); SRVR:BY2PR0301MB0742; 
X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0742;
 4:nBn0E4t1EmRbUhhhV1ihzJqjqccNXreNe2cglkanWgbIhp8vMHU0Ke6kxbCleBZpj6PFL7sR57N3XcgXl2QH6ue5Xi/duEcKfwclkHp7Iyk5MuUQ2UnuSylnDJneSyZEGcdrntl6KAS2LE9xkz7U64YRFTKIaQaC6kUzVOlOH9jAO+EXNlUsn0p9Io7l9MhtrKh+LqcF23/qe3MUs2yTIdZvGkLCvSE1rGw1OIqp7FTMlhcLMM587BWcd7OGPh/UJbwvotyu1P3qhAthUET2cV4+pwfWRuEI3izDJDNg7OWFNXEyfMvuWuKSju/tdcq/iJ5JcMW+mb4Jis2IpDuP1nwfBy0j7EoYKtNooeT25E6VuADPiBKK2gmY/u/Vm5jlGWr6CX5HyjYp2mtdEPiMkQAu4QhH5o1yZHOcptpjZBjuRuwqCwfsGowDtICr8xpx4NWSbyEZpVDXWuZXWeKaF39jVJf0no8I0OXeM091rRPikOMo+WBP5QoLguzNRVmu/14rkefnza8xnxw7rEud5j0hVpJsGpAZT4Fp45xvsztsNXU0K2quDBqzCGxYzh5gfVKDiFwHcDc2rPiHhyZYzTG7sPdYrgwz1LW68HLcS3R4LD546J4QiDZlCCXDo5SS/9kBzOAA4glPzHLhEIptxkuO8tCakElBaGH0VuuB4pPfPw8kWyixRSM5OHpHJ5fp7aWihMyjqt9KewyDRjhdEHj89ZbCEl0SzGj0EV5YzmGsDc+YNxZnfYW+CaoUR5W7kxifOs5AZN3BmU6JsiAjxg==
X-Forefront-PRVS: 01917B1794
X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR0301MB0742;
 23:F1KeCrS5tPk9zYkrK79eDc9S0JgeQPTwzqsJOIg?=
 =?us-ascii?Q?oXaccmJItKPJcSxVnvI1t1BvqhLRGZ9pjhKa0TAAA7K98lh/w8JeukUnj9TW?=
 =?us-ascii?Q?aIPQUKKy7Runez60D1t0xkP7Hdtu+ZpgDlbBsQ5KqD5f+9dpLtJgzbcWKekR?=
 =?us-ascii?Q?eVhP7aGXIkCrIeotW7JgXMUB4ctFT/HhEloEineLGWy5sGsTVp9AGeKqtM2C?=
 =?us-ascii?Q?z2fQqKD7KwDZ9bSCaulGltrM2fF0iG8/l4C/i1S1W3YB7+AxGvZ68ePCQeVz?=
 =?us-ascii?Q?EF+tnUZBWwnNduiRa2F+ReJEcuefIyt5Ru6mGr43yDAOb08u4XXQvh/82HAI?=
 =?us-ascii?Q?JpgUO7PcgLBXNJwIqz2b68ulILVZbjNsfqV8BqnjQ6IaIsPq8KUpFhzwKmxZ?=
 =?us-ascii?Q?QyOZ/Cx5yvVedAuW4GDaxwU7YuA1IUwBbirbqzcpFKaVF99oAMtV0j8fknvG?=
 =?us-ascii?Q?7ciqfncvyrUoUwqzOZSYUSTk8nrSOJ0vDz6pyyQc5C0dlDFg9xayIzuOfefh?=
 =?us-ascii?Q?OItDydfzMA62lTO+mJpeqMpHVguCvmKV86ezpqCVTDyundfc3ol5usgPOss/?=
 =?us-ascii?Q?jSPyKKETwaKji1TDRNlvQfnUxzWx10vPnl+AJxm3I7uIEfaC9fG2QtCXb6rZ?=
 =?us-ascii?Q?4hru5inFajCXKsbxGaadEw+uU6t2O7KmJzqw3xSQVqYBkP41LV505EadC35U?=
 =?us-ascii?Q?s5de/ihln33cufPGYSoZAxZeurivDpSAt5y0zU4huJ003EuhcUHcIH0op3ei?=
 =?us-ascii?Q?n9fL+bq1DAReOeY6MmKeAP/1Pqs9VDcOGG06jm9GFrCKPMrEdVJNC2ch2njm?=
 =?us-ascii?Q?S8LB2hOgi3zh5P9o0WqfCjtkmla/cNObPMaGJpB4pS0OU0l3BTLDQDjIvkaV?=
 =?us-ascii?Q?kGPMf2XBUc7+ADbkTJCh4VbTwrAP62jzki3Uawi7+npRzFq430mwC/cvEbeF?=
 =?us-ascii?Q?NK/5ELKZStZZu0K+LQoz+22DTLqbVH34VAnzDSeRVmylhK4IO7c4Kgpappiz?=
 =?us-ascii?Q?QcWBNbWKKSn5g3rrpqPfsDVjkZX3U7w7ZSbBIGw5ru9ek9+g3GsnUflToHRL?=
 =?us-ascii?Q?A5VJQPDDZcdpLOl6TvytioUnN14lOnubpuRUqSTZuiFLjiAbPUgyeJz4CeMJ?=
 =?us-ascii?Q?zeDuhQ9Fzm47MG+ZFWZrmAJ6tiqUWh47S+7aARFlnFVNnriLOvuj7dycwXO5?=
 =?us-ascii?Q?RO5kNaMgPc+sKtR2nqf4QS/sLXVdBcAT2IHapSGwGvi+d/a/5dE8FGier0wq?=
 =?us-ascii?Q?QAiW3l4H1q/WORhaNEXuDzfWZi/gU+4unT+Xq9FdXvkomKcMvF7P5aMk0/l1?=
 =?us-ascii?Q?6JFXVY9rtaiS8JFKuZxTNoi0=3D?=
X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0742;
 6:kCidb36C50sc+mIOmkHgUDKU0vbq0lxaiga0JVpt/YDyRR1+gmrvTzBa/OXw2SqyYecUOMpSpugidBf2+8mLKWGRPj8N/xgGl/hDN48p8zlvKOkDYJ4YXmawKHhlTd943kxDvA3Zc2/jgbPIeoweCJ4JqdMAmjHsQci76QAmk+KBIAl2qroeEW9KU4SHQShmsRsbAbGiQTthSN0QL7E+pykXbGrluwXu0r9664PzYQgt+jyBAfMn3AA2qwqG9f4P/FlagVWGualaPhUZcuX75VqAbgVrJI3nke0W314uxSKNNPyeHZ2UMNlZZCyZ7vZu82vFNd+/8kHdmtYc76u71DjudqhkhnhxA9L8PH0xjEDfsFVANi833oywVz0+1C3U/uXE99IZRE6OvigYzxmL672+SmPK3dsY15gwAJlWdgxWe/Ro+rM3OVSo5YuBxtQp;
 5:W7lnBtb/h3sddTvq0Pv3Weea7EHHHY8bCRrRFG2UpXexE4NEozVGZ6l/tlPl8itq0Y5385RYwbEK48Q2gPTHOorXpvwPiENI6Qoup4cPkZH0Dv6inBbC2W9Lo3P4cDsDoSTW3zfezmN0ubIvTHtWnGfBxXYd4a8cwwedFYZitZYi+ARG7Gt4hRgDoLZwm5SL;
 24:UNUHVTV23QdIlZH6Y6iRWcGc6VU3sD/7P4BkDYC2/1CLfQJ7gXNzANPubDMOQDKs4N8gigB9uocGO0xjdne51lYHJ0FQhJfaka+BFd+QoVA=
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0742;
 7:m05wTvVMujxO3PcrG6X0593c1TFJXnGLhCyNRmHELf0ekMkkPVWVKbGR1w9eiQkSLslCxl5QlF8G0uxSAy8RGyob8iGOgFN+JiM6wq+OuEgvS1qx6BUdPV86abvP3FMDIY/VaI9m6sviwTP/CIcHh3ZSw4nk5+G70zyojMdv7oa1Pbnun9FBeI39oYJhXVsbNMVY8t5qqp+FN5omoZGsoVUeWkg0qsablO+CQFbHAuE70skURLUXSHFpIA0I1hU6KHhcGbyHq1Hi/GRkq0imlFpUOeL6enPbNlouq5hKFQrM8zTkTp3LTsJd0RYWoE2zwGspNoM+5kogdkhuv54t6BvinTJ4t1a7znrliyK/0A2F1oKDfvthWtdNxiMhyiI/S+6d81Y053ArnhdjkuYwXD6a/lnIwTKGsptz+KCMvemcwpMg4X1gL0wEUurXFAD8bShcivvb3lJMgwp0awfPNg==
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2017 10:35:36.2671 (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: BY2PR0301MB0742
Subject: [dpdk-dev] [PATCH v9 10/12] test: add Bus based scan and probe test
	cases for PCI
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <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>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Wed, 18 Jan 2017 10:35:40 -0000

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
 app/test/test_pci.c | 164 ++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 114 insertions(+), 50 deletions(-)

diff --git a/app/test/test_pci.c b/app/test/test_pci.c
index cda186d..09261cc 100644
--- a/app/test/test_pci.c
+++ b/app/test/test_pci.c
@@ -38,9 +38,11 @@
 #include <sys/queue.h>
 
 #include <rte_interrupts.h>
+#include <rte_bus.h>
 #include <rte_pci.h>
 #include <rte_ethdev.h>
 #include <rte_devargs.h>
+#include <rte_tailq.h>
 
 #include "test.h"
 #include "resource.h"
@@ -61,10 +63,31 @@
 
 int test_pci_run = 0; /* value checked by the multiprocess test */
 static unsigned pci_dev_count;
+struct test_pci_bus;
+static struct test_pci_bus *pci_bus; /* global reference to a Test PCI bus */
+
+/** List of PCI devices */
+TAILQ_HEAD(test_pci_device_list, rte_pci_device);
+/** List of PCI drivers */
+TAILQ_HEAD(test_pci_driver_list, rte_pci_driver);
 
 static int my_driver_init(struct rte_pci_driver *dr,
 			  struct rte_pci_device *dev);
 
+struct test_pci_bus {
+	struct rte_bus bus;
+	struct test_pci_device_list test_device_list;
+	struct test_pci_driver_list test_driver_list;
+};
+
+struct test_pci_bus test_pci_bus = {
+	.bus = {
+		.name = "test_pci_bus",
+		.scan = rte_eal_pci_scan,
+		.probe = rte_eal_pci_probe,
+	},
+};
+
 /* IXGBE NICS */
 struct rte_pci_id my_driver_id[] = {
 	{RTE_PCI_DEVICE(0x0001, 0x1234)},
@@ -79,7 +102,7 @@ struct rte_pci_id my_driver_id2[] = {
 
 struct rte_pci_driver my_driver = {
 	.driver = {
-		.name = "test_driver"
+		.name = "test_driver",
 	},
 	.probe = my_driver_init,
 	.id_table = my_driver_id,
@@ -88,7 +111,7 @@ struct rte_pci_driver my_driver = {
 
 struct rte_pci_driver my_driver2 = {
 	.driver = {
-		.name = "test_driver2"
+		.name = "test_driver2",
 	},
 	.probe = my_driver_init,
 	.id_table = my_driver_id2,
@@ -108,6 +131,55 @@ my_driver_init(__attribute__((unused)) struct rte_pci_driver *dr,
 	return 0;
 }
 
+/* dump devices on the bus */
+static void
+do_pci_device_dump(FILE *f)
+{
+	int i;
+	struct rte_pci_device *dev = NULL;
+
+	TAILQ_FOREACH(dev, &test_pci_bus.test_device_list, next) {
+
+		fprintf(f, PCI_PRI_FMT, dev->addr.domain, dev->addr.bus,
+		       dev->addr.devid, dev->addr.function);
+		fprintf(f, " - vendor:%x device:%x\n", dev->id.vendor_id,
+		       dev->id.device_id);
+
+		for (i = 0; i != sizeof(dev->mem_resource) /
+			sizeof(dev->mem_resource[0]); i++) {
+			fprintf(f, "   %16.16"PRIx64" %16.16"PRIx64"\n",
+				dev->mem_resource[i].phys_addr,
+				dev->mem_resource[i].len);
+		}
+	}
+}
+
+/* Dummy implementation for rte_eal_pci_probe() over test_pci_bus */
+static int
+do_pci_bus_probe(void)
+{
+	int ret;
+	struct rte_pci_device *device;
+	struct rte_pci_driver *driver;
+
+	TAILQ_FOREACH(device, &test_pci_bus.test_device_list, next) {
+		TAILQ_FOREACH(driver, &test_pci_bus.test_driver_list, next) {
+			ret = rte_pci_match(driver, device);
+			if (!ret) {
+				if (!driver->probe)
+					continue;
+
+				device->driver = driver;
+				ret = driver->probe(driver, device);
+				if (ret != 0)
+					return ret;
+			}
+		}
+	}
+
+	return 0;
+}
+
 static void
 blacklist_all_devices(void)
 {
@@ -115,7 +187,7 @@ blacklist_all_devices(void)
 	unsigned i = 0;
 	char pci_addr_str[16];
 
-	TAILQ_FOREACH(dev, &pci_device_list, next) {
+	TAILQ_FOREACH(dev, &(test_pci_bus.test_device_list), next) {
 		snprintf(pci_addr_str, sizeof(pci_addr_str), PCI_PRI_FMT,
 			dev->addr.domain, dev->addr.bus, dev->addr.devid,
 			dev->addr.function);
@@ -142,19 +214,11 @@ static void free_devargs_list(void)
 	}
 }
 
-/* backup real devices & drivers (not used for testing) */
-struct pci_driver_list real_pci_driver_list =
-	TAILQ_HEAD_INITIALIZER(real_pci_driver_list);
-struct pci_device_list real_pci_device_list =
-	TAILQ_HEAD_INITIALIZER(real_pci_device_list);
-
 REGISTER_LINKED_RESOURCE(test_pci_sysfs);
 
 static int
 test_pci_setup(void)
 {
-	struct rte_pci_device *dev;
-	struct rte_pci_driver *dr;
 	const struct resource *r;
 	int ret;
 
@@ -167,22 +231,22 @@ test_pci_setup(void)
 	ret = setenv("SYSFS_PCI_DEVICES", "test_pci_sysfs/bus/pci/devices", 1);
 	TEST_ASSERT_SUCCESS(ret, "failed to setenv");
 
-	/* Unregister original devices & drivers lists */
-	while (!TAILQ_EMPTY(&pci_driver_list)) {
-		dr = TAILQ_FIRST(&pci_driver_list);
-		rte_eal_pci_unregister(dr);
-		TAILQ_INSERT_TAIL(&real_pci_driver_list, dr, next);
-	}
+	TAILQ_INIT(&test_pci_bus.test_device_list);
+	TAILQ_INIT(&test_pci_bus.test_driver_list);
 
-	while (!TAILQ_EMPTY(&pci_device_list)) {
-		dev = TAILQ_FIRST(&pci_device_list);
-		TAILQ_REMOVE(&pci_device_list, dev, next);
-		TAILQ_INSERT_TAIL(&real_pci_device_list, dev, next);
-	}
+	/* Create a new Bus called 'test_pci_bus' */
+	/* Bus doesn't exist; Create the test bus */
+	printf("Creating a Test PCI bus\n");
+	rte_bus_register(&test_pci_bus.bus);
+	pci_bus = &test_pci_bus;
+
+	printf("Scan for Test devices and add to bus\n");
+	ret = pci_bus->bus.scan();
 
-	ret = rte_eal_pci_scan();
 	TEST_ASSERT_SUCCESS(ret, "failed to scan PCI bus");
-	rte_eal_pci_dump(stdout);
+
+	printf("Dump of all devices scanned:\n");
+	do_pci_device_dump(stdout);
 
 	return 0;
 }
@@ -190,10 +254,11 @@ test_pci_setup(void)
 static int
 test_pci_cleanup(void)
 {
-	struct rte_pci_device *dev;
-	struct rte_pci_driver *dr;
+	struct rte_pci_device *dev = NULL;
+	struct rte_pci_driver *dr = NULL;
 	const struct resource *r;
 	int ret;
+	void *temp;
 
 	unsetenv("SYSFS_PCI_DEVICES");
 
@@ -203,28 +268,23 @@ test_pci_cleanup(void)
 	ret = resource_rm_by_tar(r);
 	TEST_ASSERT_SUCCESS(ret, "Failed to delete resource %s", r->name);
 
+	TEST_ASSERT_NOT_NULL(pci_bus, "Invalid bus specified");
+
 	/*
 	 * FIXME: there is no API in DPDK to free a rte_pci_device so we
 	 * cannot free the devices in the right way. Let's assume that we
 	 * don't care for tests.
 	 */
-	while (!TAILQ_EMPTY(&pci_device_list)) {
-		dev = TAILQ_FIRST(&pci_device_list);
-		TAILQ_REMOVE(&pci_device_list, dev, next);
+	TAILQ_FOREACH_SAFE(dev, &(test_pci_bus.test_device_list), next, temp) {
+		TAILQ_REMOVE(&(test_pci_bus.test_device_list), dev, next);
+		dev->driver = NULL;
 	}
 
-	/* Restore original devices & drivers lists */
-	while (!TAILQ_EMPTY(&real_pci_driver_list)) {
-		dr = TAILQ_FIRST(&real_pci_driver_list);
-		TAILQ_REMOVE(&real_pci_driver_list, dr, next);
-		rte_eal_pci_register(dr);
+	TAILQ_FOREACH_SAFE(dr, &(test_pci_bus.test_driver_list), next, temp) {
+		TAILQ_REMOVE(&(test_pci_bus.test_driver_list), dr, next);
 	}
 
-	while (!TAILQ_EMPTY(&real_pci_device_list)) {
-		dev = TAILQ_FIRST(&real_pci_device_list);
-		TAILQ_REMOVE(&real_pci_device_list, dev, next);
-		TAILQ_INSERT_TAIL(&pci_device_list, dev, next);
-	}
+	rte_bus_unregister(&pci_bus->bus);
 
 	return 0;
 }
@@ -234,16 +294,19 @@ test_pci_blacklist(void)
 {
 	struct rte_devargs_list save_devargs_list;
 
-	printf("Dump all devices\n");
-	TEST_ASSERT(TAILQ_EMPTY(&pci_driver_list),
-			"pci_driver_list not empty");
+	TEST_ASSERT_NOT_NULL(pci_bus, "Invalid bus specified");
 
-	rte_eal_pci_register(&my_driver);
-	rte_eal_pci_register(&my_driver2);
+	TEST_ASSERT(TAILQ_EMPTY(&test_pci_bus.test_driver_list),
+		    "PCI Driver list not empty");
+
+	/* Add test drivers to Bus */
+	TAILQ_INSERT_TAIL(&test_pci_bus.test_driver_list, &my_driver, next);
+	TAILQ_INSERT_TAIL(&test_pci_bus.test_driver_list, &my_driver2, next);
 
 	pci_dev_count = 0;
-	printf("Scan bus\n");
-	rte_eal_pci_probe();
+
+	printf("Probe the Test Bus\n");
+	do_pci_bus_probe();
 
 	if (pci_dev_count == 0) {
 		printf("no device detected\n");
@@ -257,8 +320,8 @@ test_pci_blacklist(void)
 	blacklist_all_devices();
 
 	pci_dev_count = 0;
-	printf("Scan bus with all devices blacklisted\n");
-	rte_eal_pci_probe();
+	printf("Probe bus with all devices blacklisted\n");
+	do_pci_bus_probe();
 
 	free_devargs_list();
 	devargs_list = save_devargs_list;
@@ -270,8 +333,9 @@ test_pci_blacklist(void)
 
 	test_pci_run = 1;
 
-	rte_eal_pci_unregister(&my_driver);
-	rte_eal_pci_unregister(&my_driver2);
+	/* Clear the test drivers added to Test Bus */
+	TAILQ_REMOVE(&(test_pci_bus.test_driver_list), &my_driver, next);
+	TAILQ_REMOVE(&(test_pci_bus.test_driver_list), &my_driver2, next);
 
 	return 0;
 }
-- 
2.7.4