From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 ; 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 To: CC: , , Shreyansh Jain 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: 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Jan 2017 10:35:40 -0000 Signed-off-by: Shreyansh Jain Reviewed-by: Ferruh Yigit --- 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 #include +#include #include #include #include +#include #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