From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-CO1-obe.outbound.protection.outlook.com (mail-co1nam03on0064.outbound.protection.outlook.com [104.47.40.64]) by dpdk.org (Postfix) with ESMTP id 0F2CEF8C0 for ; Mon, 16 Jan 2017 16:35:36 +0100 (CET) Received: from BN6PR03CA0026.namprd03.prod.outlook.com (10.175.124.12) by BN1PR0301MB0740.namprd03.prod.outlook.com (10.160.78.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.845.12; Mon, 16 Jan 2017 15:35:31 +0000 Received: from BN1BFFO11FD029.protection.gbl (2a01:111:f400:7c10::1:103) by BN6PR03CA0026.outlook.office365.com (2603:10b6:404:10c::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.845.12 via Frontend Transport; Mon, 16 Jan 2017 15:35:31 +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 BN1BFFO11FD029.mail.protection.outlook.com (10.58.144.92) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.803.8 via Frontend Transport; Mon, 16 Jan 2017 15:35:31 +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 v0GFZ4mm019448; Mon, 16 Jan 2017 08:35:28 -0700 From: Shreyansh Jain To: CC: , , Shreyansh Jain Date: Mon, 16 Jan 2017 21:08:25 +0530 Message-ID: <1484581107-2025-7-git-send-email-shreyansh.jain@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1484581107-2025-1-git-send-email-shreyansh.jain@nxp.com> References: <1484581107-2025-1-git-send-email-shreyansh.jain@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131290545312707502; (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)(39400400002)(39410400002)(39860400002)(39380400002)(39850400002)(39450400003)(39840400002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(2906002)(27001)(4326007)(356003)(92566002)(15650500001)(189998001)(8656002)(38730400001)(86362001)(54906002)(47776003)(77096006)(305945005)(97736004)(105606002)(81156014)(50226002)(2351001)(5003940100001)(68736007)(50986999)(76176999)(8676002)(104016004)(626004)(5660300001)(8936002)(81166006)(106466001)(36756003)(85426001)(6666003)(48376002)(33646002)(110136003)(6916009)(2950100002)(50466002); DIR:OUT; SFP:1101; SCL:1; SRVR:BN1PR0301MB0740; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD029; 1:Suqxo8nRPo+gytNghTx+twawoOSl3P9GvXMLU7eNzndR6EfzdA/gOCDEIcuANScfj1ynsF7Xea9Rq3eHA0omHvwjOMt3uGsqei8n09MjQxWy9XXeRa1Lm7Pfyrn37m73Uh6qkdkGZ5/fsqduSr57aeiEPW2Tm3BkeQtEZpP6un2fxNnkM6Ppa7c/6LcfB682L0CRYEWdO7k6318J0nk1E3ilcSNqULxa95iVyNZIC7OPGrmoN712qq/IiASMLDtRR6hEcSsNiD+uX+oucVPiOfSNpqrTZoNbDT8QlrO+j/1rT/Mq5X9VJXt3idCXRnUrRGxthPidLGtAS821fkh9FiVcJdC/6HNdOf6aPPDgdgvLxUQpWcXdLm5yo+yao4/VLzF1s7vUT5lOr//RaTbdrLNNosmJBCkjyg+Jh7aZwRXk4AZY0i7QuEyVZSTZAVWGOeAZKjXxflmSwf3O3UFtkwI8gdLd4lJgGEE+RauStS1LIWv3IPr7QIMDjRrt3Ri5Oj670sSxpgYIiX0wvhLX4mSfsRY5RDkjILAmv7KqCw5PVCGdtj0xE0E3JhJ5Uyuhil9JfLHqCe2mW54BAL6aKaSXCCl5ljxTXgEE0oXHQxZBecqaZdvVQqqfUCG+OkvZs6GB38QFxGy7hXN5b8gjpgGBA9AGzJYZw9AAEZMn97/pkjIkzCtm1XUUHcDPY+iQieLnW/LHwYoOsQot9IPizg== MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 1a290eb6-37d5-41bf-d254-08d43e254e2f X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:BN1PR0301MB0740; X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0740; 3:+fWliywz5M47OFIkGvDK16jSMOflmdWozyEp14x0gIfPYfqLkKbdJMkVFLeihVvq9GbPaJHP2spiKLjOMHqdrNrznzUByGJJ/D0eWOhkB6N1I6n2fSppHDXtVhvc4eN6Y4li2mXHBbFflvq3lXXwKmcb0NQqW04fLqyFOmChjdjOpE+Ob/s6V6oEa0cqvCyrI3zPQgpwtaWyt8fEK/vCcL/SFi6WyYbcNU6OqkBKhK4jq9Ed2jpapjqieZqn9+dFN/HeCkRPckfZHd6r0fyhRGOd7GoXuGazVVZ95uH8Ga7n13iAaIo/0LuVOGLmxcgxmrBEOAOQ90r0Pt76Xa1Fz6P5AaWyhyvC4laAXWF9ls3awPVt16tmd9fChwm5kVqg; 25:txBuF2D8JSLtIYUiDIOz/+StrUv++guAZNFcmTbciuSE9qV6+IC9O4PA/vN6FLTvsL3n1hrBQj0P6u63jkC42b2KE+GmcjJA1Dy8JxRETnBLo+G2ZtT/8j8LcfySGibgdsEo32thjXnJ37CiCK26KrU/hCtIYNzYDo4s92ZwZvdCRfFWuSb2GY6RK08giJ5f9QgLrILYzOPeXM7wOHIt9dUO9ejaiDor2o20T+5vXgvPZNcASfya8V16Y5JEBIQVPovrJVZI9j/WL8e1W7TVZRLVHenKyUp+xLcVOd4O9QZiY2e/vGEQPOw5IBDDm5FtUS00afMiCxuvEw8TRgY9ZGqeCw86EI7sPuGbVN+kh6pvgmpdfMH4ZZKGx69jC/X3WTrQj06PyP7Tuk8KtYz9wl+xyhJyHIG7lxxkTlzBaDBk1ZoYUmMZ2cqzsE8AHqWhl52S1dEl3IBzETaq0eL0og== X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0740; 31:DlpHi1yoMOq0x+0Rhf5Ba2oc6z8wVHI1p0LFrKiHfHhscIf2wQp4tI6M8VqKaqaIkug8yxUwThb+q0Uwzd45NXkLBRYFQNS3m5gNhN2CAMcMoo2XBep1SYCvYkkGh/Z1bH928++DUSWmzav/cW8wOpl7jwhjt+eLN5N9CzLNNbQb2XwZfk58teGVAFHvMoMQpE0nZsqjZEJ2AJhfJNXdMpQuLvwKg0vwyBqKnagewgAOGPlZO2eVDrb3qRRwYZTSS3X983Jcyhcp/lBhYJBZuA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095060)(601004)(2401047)(13023025)(13017025)(13015025)(13024025)(13018025)(5005006)(8121501046)(3002001)(10201501046)(6055026)(6096035)(20161123561025)(20161123559025)(20161123556025)(20161123563025)(20161123565025); SRVR:BN1PR0301MB0740; BCL:0; PCL:0; RULEID:(400006); SRVR:BN1PR0301MB0740; X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0740; 4:KFZsCX/qwXj8qaqft0FZelmURG0XNYPABc7ptBgZVFoNmVQU9wLnlPu6fSOXii9aCV5mtZELttnXIoY1dvw+Fbs6jluuCaUyUJV52symxYcXQGoLhyTzKjg1qj7strIqc05n+VQ2CrpKfX2C2fGHz/l1yXJr+LCRU5+RZjD2zD0uq1rm9dZO7W7c5qq0JoEUgg2MUHCOvQLILofcQdn+UJo8nBGRUK0u8YkrI16ph0pBMvZRNFKvSUw/DM3Kotlb05Ej5U1/DNUaR7UGksZ7WRx/1rfyKAPgOtka5UFQaH9Hq3C7Av47nTEchJ1b0P1Zt3IdrjV3U+Es3ld8lvHpIsvFkEF6J1ZO8IlXKBjjo/ml6h/gJUqg/b9CzEf039ZKagBtwl74Q9pyWXHC9siIIcx5mLSgfQhcDCvyCakU4Tdnw30j7Ji7oxN9HqtBN3lt6JU0oqvoGPe4U/FUKe+lvd7loymtwVovJAzskwJ3Y6pJVrwu5Mu8lRERRs4Q0rFQXPQGb5yESege7VF3VciX2RhlddXL0HccnL28Qw6fo3+7V24P6mpa2enkoVYqbSzX5R1kBtImLPWP34MvmMmXx+vMhMsOoFWdr3m+mLgHdWgibsx3X7+cllrkkQxrtwtMAabRxDHRFfacZCw4JSUvKjZVmwjNeultOWlm1CGLbDw6+v6tytUCgvDvFg71zLl/uXWabYP7agaeUc2MEIuqbDqbPBwTnsobPyCWfGnya/6nWFOIR5LHRFgxAqvR6XsZ X-Forefront-PRVS: 01894AD3B8 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN1PR0301MB0740; 23:cZ/2E+1wUz7qj7URsw8oeodU5207NlqY6B+lirb?= =?us-ascii?Q?LR/6F2a+ZO41yuVO2uk3VytTtaJr+Vq4rx5Wyv3E0RRqiLf1BaqaRf34Hwcs?= =?us-ascii?Q?g2T6jrE++vT1lqRz1VAZ4ZD4xHGqatyLzW0u6g5Y4Nb/ubx5mCn27G5/89VO?= =?us-ascii?Q?uLGuIMtcGfPgUXvTv7+E0Zqi1GWVUuy/Dk19bYbWqTHC8l+wGp9o7bKWa8D1?= =?us-ascii?Q?bX/CjpMomoIJ2hbxf5t1PiLH05Kyc5lFmeaqriGVj50947Uq6eMEjtKgkvsR?= =?us-ascii?Q?pcBwbLF5gBje5pqqXOX/Co3v8M43GUS63MvzsR4hyoT/BcvLqGIL6JzZOPgB?= =?us-ascii?Q?nrcK6gr744dhh/E/Z+XP4ygyRGPpmTPVup3CFFsjLkgfwnPe1hnC19TGxjkg?= =?us-ascii?Q?iZMvVKWyuHmTXzaWdLtOxlZttf0v0cmgqluLrPJ0kLq0HcowwFK2fLiI11iI?= =?us-ascii?Q?8fA4yPSG9xn+P0Dd569Q0tDhwecjgPYFPxzFiPjK4XRVWwsulQ/scfBJE0gq?= =?us-ascii?Q?HnHCD0eMaoQim2GlKFPFB2LTBmOI7HuGNhTzmle961z4lJO1JiVgNIgigtQi?= =?us-ascii?Q?KYfBbBK9TBZ8X5j7QaLSLcYFqY/QPXQKk4wqYu1JK36natkr6u+REYHh75GL?= =?us-ascii?Q?n84SAQclSX0hse2bM9VLl3d1vYsWTmqH7IuKpp5kDUOfrPf2LJExN3jzTRFb?= =?us-ascii?Q?97sbfAtc7+0Qmm7aHrHSNTbQX5XCgcnMRIn0vKZr3a4n2r5+quYfmmcOxTk9?= =?us-ascii?Q?mZJv/S06TR4wNjBz4mcdgU0nDmXtWnpwN4yWhxy5Np6P7mmwriMGJk2S5x6B?= =?us-ascii?Q?Z5dr/IGQLBfdMrbVbMI16kBVVHSfbvnnXjs5W1IfKSK63KzZJW/tmELTKe4l?= =?us-ascii?Q?phdcGzQlhD5xRvppGVbMRySAEASL8dIVe15h9uip57QA+CKTkva07OXwDKbJ?= =?us-ascii?Q?DQzBFYB8AabguItLu8hOTY5vDbFIyZJXG9/fWgoTbiRCljaGjWEco9R9te2y?= =?us-ascii?Q?lQpiz1DbxDnDuT5Bg3H9ENNc+nqgE6T1mdHq3UIhQDxT6xUG9KhoaD0pr642?= =?us-ascii?Q?8JlY1tQme0ekS8FY2k7riYMqEPRpZs1Cwg9QTETQZ5Py0JdM5Tcc3HYF+XJa?= =?us-ascii?Q?XDozjXokdlMvNf30ty2QPeXgbciKpx0jDrHUOJqbdD1v9YhDMb62PjzSG9A3?= =?us-ascii?Q?orbxVQDchmSVD5hq5ITQwNx64iIwieIK6iNrISVUSaVbMjR8Gg4I0HusCCA/?= =?us-ascii?Q?/QjhHQEVLWSOutR3mApLntFy1daI3Tu9sTNQxq5kiwEU7i82iQezkw9e8RT/?= =?us-ascii?Q?WQXYuwkjOGglrWndaEfjrChRy2roSogiM3WR6tYoxsNzF?= X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0740; 6:pjvTzaafBpo1l1acFTHza6TQfjSLdIqwMCRQfIHe2jtNAuITWrujowhG1AzN+2iJg+X72f6F3JQ7QhcnybuckHMytGuFokwCiPlGbzqFkGonv7YpWe1n1zbfCocoZP//fju/9Zr+ixqhQQYtU4cYvg6+HfYEsMR+AiGsGMS0nGfQWJxla+TI+v/uPFS9ON5ADQxJ7uWxfzhehvcTu6vzxDAlWtxASFIBYqz2g9uZ8Lb7bAM6J4IWDFyruVyLfBfTgIeR/uJ5UeD1L1lQpqmrk5FLkUQJZCqbcvtPWe8giMNzAWkE+kgYBcp/new5eZjPJLSgK1iXTHNpbU92IcJaRIJVoJxd4Q6v7RTPkzhsJfSuXkmpJhVxOTZFbB0IRa3hKFvGHjdvpiNmei7UDAras88XYsVJhWuRNI4x1wW3p2z8FK8tnDpajXCZ4rVDIbVt; 5:nl4xpk6yrCsNmq4lPLLCb6yG+4YlzQADbIrIyyWhrbat+vGYRJQui8GTCpwhmapHLDObNn+zlYjkjIh1pohxZ2mAjsrQZ8kPGUfRM3eSQ6chpRKAVzwMgFVUXf9T6p2LU+VT4pLhxwgc5WqXZ2zpuhRPdQpXQabDAbtkcDfgQ3Rus5koOBF5lTU/+Xy9Ufxp; 24:0IrGO7H5RvM5QVfuY4eVhhPrIlnKuJzjyhrTfw+w1coKo9Y386oKPlhlO0/sg4P2xF3ErioVmO+PZ2IAN31y1rPOStMSkPWmMFgNaSx8SCE= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN1PR0301MB0740; 7:xFFrhLDEniNQ51vHCT/XAwC3QbxrVcz604AvikRxZGHiypg2rkRIXKaylchoYL9tfHenkVwLZWuEJvRQHzPB2JMME9AzJRAqUGyi5G66oL8FOoMk7qkscfNCRQWFsvQOlrCXSUxNIgymke3vfuaC98jzjS5mm1ygXtUq7Qi2CapyMCTk8JhJy8NtjKmwBwVkyHB5eEYSoPq2izEroC4fwKYQ8FLsxx9xtzkZok1eOr+A1a5GmilQJT9cwIyW/7X7avGICRwk30MehzJf4WKI2c6VogNqehMaQ7FEOzInrly5+v1YknqqCX20HYZ5lc3j0iWsWriKOcU8Ze81yI52bj1udAkYX+4JxBZU9vNKC0QyPiWZUeGV/QBhhgr1tT+g5izVdKLVAfZ0udnbBY3RK/GEgGnO57XYUpn5QHLqoN6B1ZDUHBueH82+TnxKQOn82ocJIJ3EERBrAgJvkEvJHw== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jan 2017 15:35:31.0679 (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: BN1PR0301MB0740 Subject: [dpdk-dev] [PATCH v6 6/8] test: update bus and pci unit test cases 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: Mon, 16 Jan 2017 15:35:36 -0000 Signed-off-by: Shreyansh Jain --- app/test/test_bus.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++++ app/test/test_pci.c | 164 ++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 266 insertions(+), 50 deletions(-) diff --git a/app/test/test_bus.c b/app/test/test_bus.c index 0b6d011..ef7fa89 100644 --- a/app/test/test_bus.c +++ b/app/test/test_bus.c @@ -120,12 +120,15 @@ static int scan_fn_for_busB(void); /* generic implementations wrapped around by above declarations */ static int generic_scan_fn(struct rte_bus *bus); +static int generic_probe_fn(void); +static int dummy_match_fn(struct rte_driver *drv, struct rte_device *dev); struct dummy_bus busA = { .name = "busA_impl", /* busA */ .bus = { .name = "busA", .scan = scan_fn_for_busA, + .probe = generic_probe_fn, }, }; @@ -134,6 +137,7 @@ struct dummy_bus busB = { .bus = { .name = "busB", .scan = scan_fn_for_busB, + .probe = generic_probe_fn, }, }; @@ -288,6 +292,46 @@ generic_scan_fn(struct rte_bus *bus) return 0; } +/* @internal + * Obtain bus from driver object. Match the address of rte_device object + * with all the devices associated with that bus. + * + * Being a test function, all this does is validate that device object + * provided is available on the same bus to which driver is registered. + * + * @param drv + * driver to match with + * @param dev + * device object + * @return + * 0 for successful match + * !0 for failed match + */ +static int +dummy_match_fn(struct rte_driver *drv __rte_unused, struct rte_device *dev) +{ + struct rte_bus *bus; + struct dummy_device *ddev = NULL; + struct dummy_device *ddev_as_arg; + struct dummy_bus *dbus = NULL; + + /* Match is based entirely on address of 'dev' and 'dev_p' extracted + * from bus->device_list. + */ + + /* a driver is registered with the bus *before* the scan. */ + bus = dev->bus; + dbus = container_of(bus, struct dummy_bus, bus); + ddev_as_arg = container_of(dev, struct dummy_device, dev); + + TAILQ_FOREACH(ddev, &dbus->device_list, next) { + if (ddev == ddev_as_arg) + return 0; + } + + return 1; +} + int scan_fn_for_busA(void) { struct dummy_bus_map *dbm; @@ -504,6 +548,110 @@ test_bus_scan(void) return 0; } +/* + * + */ +static int +generic_probe_fn(void) +{ + int ret = 0; + int i, j; + struct rte_driver *drv; + struct rte_device *dev; + struct dummy_bus *dbus = NULL; + struct dummy_device *ddev = NULL; + struct dummy_driver *ddrv = NULL; + + /* In case of this test: + * 1. for each bus in rte_bus_list + * 2. for each device on that bus (bus specific->device_list) + * 3. for each driver on that bus (bus specific->driver_list) + * 4. call match + * 5. link driver and device + * 6. Verify the linkage. + */ + for (i = 0; bus_map[i].name; i++) { + /* get bus pointer from bus_map itself */ + dbus = bus_map[i].dbus; + + /* Looping over all scanned devices */ + TAILQ_FOREACH(ddev, &dbus->device_list, next) { + /* There is a list of drivers within dummy_bus_map. + * In case of PMDs, this would be driver registration + * APIs/list + */ + for (j = 0; bus_map[i].ddrivers[j]; j++) { + ddrv = bus_map[i].ddrivers[j]; + + drv = &ddrv->drv; + dev = &ddev->dev; + ret = dummy_match_fn(drv, dev); + if (!ret) { + /* As match is generic, it always + * results in dev->drv pointing to + * first driver entry in bus_map[i] + */ + dev->driver = drv; + dev->bus = &dbus->bus; + } + /* Else, continue */ + } + } + } + + /* Verify the linkage. All devices belonging to a bus_map[i] + * should have same driver (first driver entry of bus_map[i]) + */ + for (i = 0; bus_map[i].name; i++) { + ddrv = bus_map[i].ddrivers[0]; + drv = &ddrv->drv; + + for (j = 0; bus_map[i].ddevices[j]; j++) { + ddev = bus_map[i].ddevices[j]; + dev = &ddev->dev; + if (dev->driver != drv) { + printf("Incorrect driver<->device linkage.\n"); + return -1; + } + } + } + + return 0; +} + +/* @internal + * Function to perform 'probe' and link devices and drivers on a bus. + * This would work over all the buses registered, and all devices and drivers + * registered with it - call match on each pair. + * + * @param void + * @return + * 0 for successful probe + * !0 for failure in probe + * + */ +static int +test_probe_on_bus(void) +{ + int ret = 0; + int i; + struct dummy_bus *dbus; + struct rte_bus *bus; + + for (i = 0; bus_map[i].name; i++) { + /* get bus pointer from bus_map itself */ + dbus = bus_map[i].dbus; + bus = &dbus->bus; + ret = bus->probe(); + if (ret) + printf("Probe for %s failed.\n", bus_map[i].name); + } + + printf("Probe on all buses successful.\n"); + dump_device_tree(); + + return 0; +} int test_bus(void) @@ -518,6 +666,10 @@ test_bus(void) if (test_bus_scan()) return -1; + /* Now that the devices and drivers are registered, perform probe */ + if (test_probe_on_bus()) + return -1; + if (test_device_unregistration_on_bus()) return -1; 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