From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0052.outbound.protection.outlook.com [104.47.41.52]) by dpdk.org (Postfix) with ESMTP id 0E7BE2BA2 for ; Tue, 17 Jan 2017 11:06:31 +0100 (CET) Received: from BN3PR03CA0112.namprd03.prod.outlook.com (10.174.66.30) by BY2PR0301MB0741.namprd03.prod.outlook.com (10.160.63.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.845.12; Tue, 17 Jan 2017 10:06:29 +0000 Received: from BN1AFFO11FD042.protection.gbl (2a01:111:f400:7c10::115) by BN3PR03CA0112.outlook.office365.com (2603:10b6:400:4::30) 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; Tue, 17 Jan 2017 10:06:29 +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 BN1AFFO11FD042.mail.protection.outlook.com (10.58.52.253) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.803.8 via Frontend Transport; Tue, 17 Jan 2017 10:06:28 +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 v0HA67Tk024558; Tue, 17 Jan 2017 03:06:26 -0700 From: Shreyansh Jain To: CC: , , Shreyansh Jain Date: Tue, 17 Jan 2017 15:39:32 +0530 Message-ID: <1484647774-28984-8-git-send-email-shreyansh.jain@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1484647774-28984-1-git-send-email-shreyansh.jain@nxp.com> References: <1484581107-2025-1-git-send-email-shreyansh.jain@nxp.com> <1484647774-28984-1-git-send-email-shreyansh.jain@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131291211885503204; (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)(39850400002)(39400400002)(39410400002)(39380400002)(39450400003)(39860400002)(39840400002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(189998001)(104016004)(356003)(8936002)(81166006)(50226002)(97736004)(106466001)(68736007)(8676002)(47776003)(81156014)(105606002)(5660300001)(8656002)(48376002)(6666003)(30001)(15650500001)(2906002)(50466002)(110136003)(6916009)(54906002)(4326007)(86362001)(626004)(2950100002)(38730400001)(77096006)(92566002)(85426001)(305945005)(36756003)(2351001)(50986999)(76176999)(5003940100001)(33646002); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR0301MB0741; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD042; 1:ZHo4aGWKkf19k+hLFN16lrL4IuRBSrRYtrbmRNmTt2susY5s6Ro/zcIUux4d2XdKBjU4bRYB4UwAeZ/lhDVk3sB0oyY8FHvOn+rtRp+JidPAUcMFmwcDX7f1pNQ/c7moWDDCgpLQBLPYkiX+IpVl4z/snX+2MgabASACoj2mbZpBsRdZ3O0XzUPFcr1NGRDOmRmUtj6ph3xsaLY4/WFbo518nuOJw1vrKdnqgwLQnyJuMS5t46dtsbrOmaIBvKlSIKa6m+DZGBl72/Is7mnG+hAzeiEOwAi3WN9KstWuFcjno7xgFN+LaDlkFcnyTKwX8/mS+42NCpoOV7QuASRd3mz7KdolXCoQ2aqEmo807RQmFxTUTEHTU8QHUwnQWCdhXqnx+NqtG+q7CX3XPf2ysehJYqV0iKj8LK2uBQEn/RtQtJkofRLKBgoOVY3YkXzC60IxqniC2QEW1gQ4d5dLa4UbACc3OpvHCh6zQ7+FGxy69m9nlxZq4iDzkm5s4kL1uvMEgCcOQgGF96PgaIbheJWxoZMW8/BizRT8PhMY8yf82h+m0x5UJrwwZx/ilzNeQ3Zn4AI0W9eLhVrL62dkxQqW5wOrNtn58UV6NFwQ6zDZO/NiW6Ua1VDaeLCOhTVRrKY3A3D6lQvWQB+OL2lBj37BDeVt1ZsszRsLtIRXwBXt0VsOwwKnLPAgFt23PSn0mZ289l9vVdzh1IlPgsyL7Q== MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: f7fe0c47-e69e-4a3d-8185-08d43ec08105 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:BY2PR0301MB0741; X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0741; 3:4v7aJw1aodbJy036YSraMs50stauanCG7DY9SeDt1urWYx5F7mP+uXKhA2f7xpV50qcnVOX3J+pdGbkeWWLzWD47bz+CO4plGIJaFhQRUmp1HZX+H+WaEuFPlkFSnl48wzvtAxLX9qRw71BKcid38DI5U6e5CLm2qUCLbIwZIxg88yb0kyZyi/IczNexxGl3walNUgSoUV/6zkm+nIXagbH0Woy8eBTeCa1Ku56/mzhOE8I7MelboiSG9SUSj32VcuE6AzGNgcyE/SGETjEfaQ62cuWFzEUHLHXUWJzWcX4Jn+DpqL/ppO1So1U4A7nPHWW8zWM6OFkKphSIYLmVmG7X2DibF1+Re+eB6Jipdomcde/QnwnQjAdK3zSYN72M; 25:ZsHpT4scBNNorsDkTjWsN6ob4uy7zS5OLgB1tLpBq5lJyUUbEiNAr4UgbLy1WxH0HMfmw+2c0F+WfS6W0QJUVIENjtMjqdOQihqD6yNK26TWrdfKvszmrCroYYGYGNT1oQECHdrJfbJy0NpoLm3aTZjMnGdY2hvLuAO+htwn/ukxeYudCsH/u+7JSeFHkFXFHP8Wj3o+JoFp2gvVZ0r/oAXtGUxRSbWKo+KSO7OzxmfBpRmrVYNfAxhoCRLKop0Wt55pO3fzWmFBnQ6gHj+N5Iv13m8l3oOVwmNLxuJ5qV5mc07c1LalYGfCPXnLhmHWw/5/msQ0MJ8n/NWhVyk2lV5pW/rASsDcBJYkQAP5ZXJx5BxnzatFuiwQvXVhAUo39eyrBRxyWXqEXTB8cPRgv1jnf+doYC+2SQloEO4bJO61l6SzseOmXsiVB+/zXOwxzPuTWfxCA0hBCPLgmNaLcg== X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0741; 31:oLctdF/We2+gArPrDf+YOjphIiAl3S70+zGmezOlNZ83KyGGyZ3X8KfAHTBOs6uZAkmkqibtLyD0oa/FJTKNcu/0jQggJyUdhz2XqNB7p+dT7wNepFBIouJjWDgiIRSlloq798kUO7WjGOGlwMrayH99KcTO7NIQUIpoL50Y3/Hdux0kLepClFVY9DgajUVi5gF7VpRawjlnif1SfVrY/n6CF3AnpE2IqY7ZyvRYV2qfNEQoAMPKvjBLi83NTPu70py45PYTUNLRwiKfc5xMBLSzHAYr6YtswHoFXq1d4HY= 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)(13015025)(13017025)(13023025)(13024025)(13018025)(5005006)(8121501046)(3002001)(10201501046)(6055026)(6096035)(20161123565025)(20161123563025)(20161123556025)(20161123559025)(20161123561025); SRVR:BY2PR0301MB0741; BCL:0; PCL:0; RULEID:(400006); SRVR:BY2PR0301MB0741; X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0741; 4:R+XCGYKm3LkIsac/mHM68Oc1aJLiylnLDv5/Ogi+8uPzL0/AV22BRAh+6WnIo8QyRD9MShH58VOriCNbn1pYuTlXL3K+Ruym9NLgHoW2JPf6noZyAMFVkkEXUFcdAx6qWCyHX2K6hmnVbioy6hDWGJa+8m4HhKZMVhVL+xVqcp1ntu5RsXJ1RVQfV/J2OrN48b5aHOUtjjES++dq8kNR+IrmyK44tfbktEtP8IO+OZJG0ze2Y4NThpLnE5ihtALRvlJ/k1dq5lD5lmi/hES1poV1i855Yu12LgbCIDN3eZEmcCArP8zD6oa61KeOMCm1bq1QwdQjwDkEXVxGddlcBHKWzayF4ObDy4+bJ7TjOslezrOgzCk8jdCzNnHhFtYJEFTVaV2GHu81BGx/KXKjWumFqoJwbjgH5v3x2NpdMQsQhxo3t5ILADX3oFzrX9zfNvPBw1R+glxVOuJUD7Je1/y8HBYrehr0GzfRHbEO9fBkED/5lw7IZVL3OQCBgpSI0xibBF2go0EgXKV+FzuyEfgr/Pwyh3ENKuU8fJtN6fXT5H48YWL3heMNgGLGm9KTjy+HbiPgj2LH4skKdUwastrx38hm+Lcv7P74dTTKPFwf9Z2sADSJZQzWUCthjdNvykzd7GNOWIgyzUvV0ettbYTmKQk42VqTX8am6TD04HaUn8E01ezOdiDQoG+vpsUCq+mG7Ez6YIs5g5sfv+HluKJv2KCBRgRFjTjLp9XpUggYMxBIAwmcn8Lzk84w0vco X-Forefront-PRVS: 01901B3451 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR0301MB0741; 23:UFP1oID/JeLwBm+ZytY8kuRWU5qDeeDwWmS/FWr?= =?us-ascii?Q?CpAi/9W4jlxgH3/+7fbDWYcBxXakYsENVtQa8gtClKOnZzIT/aXKWU85W+go?= =?us-ascii?Q?gKUwBmNaqcbvmHT4WPpMoZTByOeOQemg1k53SWuLA/59aV3rP16VgFqEwrbc?= =?us-ascii?Q?3W7+Vw8J5mW/5hC6hdTDBjabhTrv5FdbGsfhDU6ywYOr7mEn5zODHSxvu8Ri?= =?us-ascii?Q?Fc2IRt6SVtvpn3OPH5zSeIMkXaNf7b4scki2gtEip1bQc0DR1SU8CDPP27Vb?= =?us-ascii?Q?gl3sCxIjbqzwGn4S4tMrAEnSud+QxMrkH60gKaQaCk46VpLuyXG6KosrAZQi?= =?us-ascii?Q?QUilw6unGYH0qY6MID5IWW2QoNmWpJpb7+O1ya+AFVUVxKKSqAzcjBMGIcJI?= =?us-ascii?Q?QK/pkOgiQ/zlq1+fUI4EoakjxpvPailTuStVnXH7lx0efrcloWkmos1VoW15?= =?us-ascii?Q?L2mw27f35fcK0G3rJ1ZzwwXNAlElfzQ/fLH6ndLCPA6qbkKpomNT3B+MLcZW?= =?us-ascii?Q?uWdZoR8k14deOxRwhZ+ej5RyYT8SNvI/aZUxkA1RkFn+9W9TK9GjFEkpq8oD?= =?us-ascii?Q?3Kz8YCfmKtWyZqp5qriX3dl3S4Dc7oi8446ng12z83ycJPU1QP9s/cmmxErx?= =?us-ascii?Q?LVMDpq9PfdVXXwICl4eqcoTqO58ROFwESXfaq1UBpMTU7dwjwClDWOXQxGO2?= =?us-ascii?Q?fmd9oFqAeMr1d6VrgufNhivZTT6GBjtdhR/mfJcky98Evk/2ru1htOdJwwCb?= =?us-ascii?Q?Ii0JMiQ20raUcvVNaDFRtTjYMkfrxU0Cd2WGQCVOirMgOTMAKDqD+ybF23gH?= =?us-ascii?Q?WA7z3lTSZ3158ofjwuhJ2+yHGcf2aEZ2SGuiM4pga6AEQJq+AtizF0wZySE5?= =?us-ascii?Q?y4ASNLEawv7/J6wSA+3vgJR9cZGnJythLmQUEEGA45Y+lhlb4RpppgrcEbJ+?= =?us-ascii?Q?60GQT1n0zE1YHBKoWcJslT8g8JolFrBDaAT2RGpdbooMq6LnLOqsoGiNxNFm?= =?us-ascii?Q?/02AHnLzvNGoBIJVS0cyhzlJdJZ7CK96JIpDVmSZabBBKHIiJUS23/BFIBcX?= =?us-ascii?Q?11Kfiy6FyvVkk/cyZ7k/EhLPZtk/mke3xObcZWtKj40+CUwegsV9/0h2Merz?= =?us-ascii?Q?HOLROI9MJicGRbkJaBJWBiVdzxARZwwjCC8Ry+IFM9j0P/kG5jyVeWxeKXMI?= =?us-ascii?Q?LK5PrYfZuBwqc8rbgpzwPBVP3DQOp/wEm+T6joPz5zZWBMRyA96+mUPaI2HA?= =?us-ascii?Q?hPdgZn0YPklCIg8VEov5Iil7NYZgDcMQe1N3IsTx/Brsv8/E45wgP/dheNG3?= =?us-ascii?Q?ulSkCSvWt2qg6Isudcp+WDM0NXMHhzuNpCN+3WUnPyiMc?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0741; 6:yC7gUFG936MQ7FQCvwtC4r1agDmlL71ceOABKRCewCytJc1z8hzRk+qBUQjysejLHQhCn3LiAnZHOi3HTUKz7W4QAnJrnVBklm2JOVvmo9fDHfV38fsvqig2r3R1+Q8iHxwi4L4yIHQSdUlTMw6uteU4mTPCam7F9e7PVua4WWChGMl1XAVTdSlk5aF6FZfWgtvzdW0Z/ioGppEvshxXFgQBXh5c25cnl2Dz9AaGjdZNPwcX3ay0QMvUsbLYgEauLlFtKzvxe1Dh4oW/sxr2iHCSJUqMZR2wCswaJOkbkafIBg4Uab9zromqk+5RZz6oUeHwFys+usbK0xO1tU5ED795AWhSMA9uwSmZYWSqpo78bi/BhSBpSVUorgi6or7WuWtcBDgLnOaGt/AHVj9Ci12U9Nc0NDwPkXFak30bbWpPGEIFWbdgY02XfP+r/BWX; 5:bmQjnQEqXgB7luBbplmPdjS443he0iCOVeohBv9hwyjRzNkCGR9FPFybLyaYXpgjZxZmvPqifcKv1n0AYRRJFMbFj5wS7n73qkxG/xyaIrfrPcJjplcP+19LGQVwtwdmKAUmhn9AkpifpNI403QfSDcw5XJip7kmCIvQgwYoOKOVorJ4lAed0ph+nUxNbhln; 24:lDNiNvti58cPiBclh6Hnsy0vmLqnOHcoW6X/OtGqfUz25UjBhHR8n2Sd5I7LDZTSAuOYAFPaM9KTFarojgXh8ynzIWZpZmcC3H7aEiirw/0= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0741; 7:uwXfHRL5n912dFpFwO0UnN1fjwWyTEWjbHYJXoKQ3wYEbeSEBThqnv9lHAeh/CaVj1NKs37Zg5O8xrfaMNFgI7onATVtcdDTPKIpI9Ek3I+7aICl1v3sJllSQMjpdVcrQ5hdWoqHyElJUTefTvfELxKBnR9kecFDDgVFCB4s7ElNbE9XiE8opeVexFPYgs6KKOb8S2mHgKK8BJtdqC0P6KjKtynggeQ7wChl+DVomSi2cwVINDZMS2vlrDH1hWjDUFbNePQLOILL9gOgMqUK9uht2d9jNd3f/DvuXnSWSc/VNrDPEX3f9N6fZSfvdY+dYBpn7kdf1jjPc33HQ9muvdS5Dnzvgy/lpGyQDTLDBnYmTm3m0/UvLkkdq0JzjYy8WXcBq6440uceUd58nSaGASp4/DMGmUmb5p2qusjOSJ+tEu95X+rPUM99PoJQ4hjLfcJ1H6jhfZ8X0RK9ieOYHQ== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jan 2017 10:06:28.3631 (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: BY2PR0301MB0741 Subject: [dpdk-dev] [PATCH v7 7/9] 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: Tue, 17 Jan 2017 10:06:31 -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