From patchwork Tue Jan 17 13:37:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shreyansh Jain X-Patchwork-Id: 19612 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 6F41BF94D; Tue, 17 Jan 2017 14:35:30 +0100 (CET) Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0058.outbound.protection.outlook.com [104.47.41.58]) by dpdk.org (Postfix) with ESMTP id C1B8E5320 for ; Tue, 17 Jan 2017 14:35:13 +0100 (CET) Received: from DM5PR03CA0019.namprd03.prod.outlook.com (10.175.104.29) by BY2PR0301MB0743.namprd03.prod.outlook.com (10.160.63.21) 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 13:35:10 +0000 Received: from BY2FFO11OLC009.protection.gbl (2a01:111:f400:7c0c::196) by DM5PR03CA0019.outlook.office365.com (2603:10b6:3:118::29) 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 13:35:10 +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 BY2FFO11OLC009.mail.protection.outlook.com (10.1.15.0) 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 13:35:09 +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 v0HDYI2l005071; Tue, 17 Jan 2017 06:35:06 -0700 From: Shreyansh Jain To: CC: , , Shreyansh Jain Date: Tue, 17 Jan 2017 19:07:42 +0530 Message-ID: <1484660264-6531-8-git-send-email-shreyansh.jain@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1484660264-6531-1-git-send-email-shreyansh.jain@nxp.com> References: <1484647774-28984-1-git-send-email-shreyansh.jain@nxp.com> <1484660264-6531-1-git-send-email-shreyansh.jain@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131291337093274535; (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)(7916002)(336005)(39860400002)(39400400002)(39410400002)(39450400003)(39380400002)(39840400002)(39850400002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(2906002)(68736007)(8656002)(4326007)(85426001)(38730400001)(54906002)(104016004)(50226002)(189998001)(77096006)(6916009)(50986999)(6666003)(36756003)(5660300001)(110136003)(30001)(81156014)(2950100002)(48376002)(8936002)(76176999)(81166006)(8676002)(50466002)(106466001)(33646002)(2351001)(626004)(86362001)(15650500001)(105606002)(305945005)(92566002)(356003)(47776003)(5003940100001)(97736004); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR0301MB0743; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11OLC009; 1:fvVVPL4wzmBbUX7Jto1F4mhc24QMhVaE8Vbs+1mAx/d/2lVGIcoOsFXiweYsRjWlWtEoHG0ssMyS9zTHQqFwdxUz1Hbrqe+/uJdTjHuYIAVD/RJp6EFJf7Q7IqjNiba8zJ9yeVYLRR9b2JsAu7X16dUXsfIIrPurVeNXNcJnJdN27BBT6kC/GMpjATGXPJ8Qix4E8HI2TG+0Ro9IXm77C7LIfJyyWgPGUDz89/3ove8r0OZWvSb4thgvEzl3b1CrnS5ylmwwrWpNyH8HCYVU84RIfu9rKfj/Su8Z7YnNOEyVUl6AFWPOTmhJ1hGh3I/LNafblt4a+SJ/uCqFNp886hOfOttxqtqgK4O19Uy3xgOVTTiZT9axkos4TuI/pV8dj3xm7ldedysMPWBn9ASibxFjIwkJJFfAnDrFY21iUENWlbahZm8AZsj3DVnxmQ+T3nI7v8FrZECrHLraZ9WtFiMaoYR/dWN0MuBwCE4P2cQEZ4jaX/8M0+Q2uLjjQTZMzNnTCOw/dHauiS++dfFOdbJCRDmwUvS0jVAKB7IkKhMVwr7Uy+3X14E/vYpd+PekE1UDboPH6smXsivGQeYy8Ghr9uJlT4n6rn5hEQEaIJp3ebfNJELgQklvdFyTjjhKypZ64TPvs+5X+5Bqj5R48cu2VgI79A9My9Xi0GRXT/3mxLoxmULXVs1MZesO62Q6VkSJ82bO4z5Fuprm66wJzA== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 255e075a-78f7-4985-d0df-08d43edda7eb X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:BY2PR0301MB0743; X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0743; 3:g4aHCIm6PwsnprNiNJwOdPsgXWWcPxrnk8Toov1On4CRUUL6b14Cv1RyhNNnUo8FKWKJlOgGs+rAga1eTVwsVBaqsuYNB6umQVQ0rgMcO2uJMK4+HBUGrEeI6kb+0FRXLPH7ytmN1s4cUj0yj4321eM6ke3E2pm/Ws7bSrGg/3pUwh220sf9ekME3Uv7q5b1rknExmkJ0yAbgQLUxWkdsbKy439+rOf/2QZP3Ovu1rDnDqrtUZtgjKNtMik0q48gSnQwKbyGfZQlKBPtzJxeROzZ6QO3d79HBuL/4U8lpOtHemrpyXr4LxQg8sAI5rwVD0DduXPfizUkr3cxeNS0kTa1NDpDBPkKKl9uasSZ4uqUBINeM7jq39zBuI3tYWuX; 25:5X5UYIwGj9r7Xm4VVJRQoeyhwkrjxvGWSr7mV4DkJ84fAeP5c5imXBiceCupSodGF/DrUsMkprjZvBAWFYOhoDsMsSBdaQJuiba3cFabuxHmdo1j6szaeQjKzMadKDts7/W6gpbbi0cmFh3wk1akpn5jS+kCPSmk797y7/ROodGWnFVAtPVKODE7az4zH0I+zcQxahtXb6LvKkjDQVyJuh4Mv9EAZOQIdrQ3Q1pw+AwWfdELCKqHTo1lG4GkjSLFanz7dzufm/BxsJnmDI/HCb2R2g0PQ3NocvRh1dAYtzPgm/nGUj1GyBipNNs4vHoqUrjS6Dd8gnuR0tC1WpkBEIRgxrhC0LlKirAtO+dEDLs39Fd7I+XSItAtY9xBoMXNYIUk2cEauvYKBBCcwZRU4U7LFqjCfBGIGHm4W/5xVEoqOH8atL3rEBKIpHHSdQQs2m9rua2fuw3V9RLD2G4Z5g== X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0743; 31:DOutQFJJyYbNKue39gJpzptL9i+AnTQApmSLx1hcNJwleFU6+aVOUpAKhYpvmQeh8SxpvGiFpWrjB4yVpva9rGuStEioYwgkm0l8moo0TyoNhu5wNY9cdFuxYkvVyXFZDUemtwINYl2pJlMAPJxil3WATUtJ02mmRMWEvlJZDyVUjDHUw3d9HMmr5zzm0bh9BnK6/tREGe1ReL8CPB4zwl8IXEVPpWB3OI0qIgiL+ancbc+YkQpri1O6SIi+nG5WsO85yJypUyWKGdw8QUT1LnC6UAqT74euIiMq4dahve4= 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)(13023025)(13017025)(13015025)(13024025)(13018025)(5005006)(8121501046)(3002001)(10201501046)(6055026)(6096035)(20161123561025)(20161123559025)(20161123556025)(20161123563025)(20161123565025); SRVR:BY2PR0301MB0743; BCL:0; PCL:0; RULEID:(400006); SRVR:BY2PR0301MB0743; X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0743; 4:hddCCBxNvboApVIHnR+dN5gdHYHgYnkkl1MK6+wZSQN+r0fAh2wyR3buJZZfWKJMthy/bxF1VhWrawxPtV+Mx2GbJpvdnZeXXNZc7DUYjRvLcFQJQ1DYeTYDJuELv80i2zsai0wHKmk6vSFjF5V7HI4ABJKfudB91R6VKH7MYD+hXfbmKiMvmNyCR7QPA2z+abogVMBIBCv/pPFPDJlZFx7mg4yoDo6xPGTwfzLj4EnqVZ8b0Ryq7VC1yQfYBP9VfVJmHyt4eZY2EgW8aMGESKXGymx21go9fv2pEy3VUQk/uoMZGKpVegBcnA7pXvYJUlBh6b/mk0EjdmSrZScNxCZqagAjHhpWGuGoU6zP31Bc1GUaSnGAD+AsJTHKtDHqTsjmhG4l1FR3TYcYsvkWZGEYaVmXEDJWwJpVoEo9d1zuukeOFUXlQ6J3pBjtkjZLbSqKWHt12Q2XIALh9eaKKyyvrVBHq/20PLnuYwjho992u3QkxaEbdlRrYlAEZBv/jTWGmE0z6g6GqkcjvpTQgRauD3DlAtOWuf+cjdZVX0xnGLrnNfCePx+J95VSSD18U9xAeoSXz7NB9RqdvWlbUGq4s9IieU0PmF6XdFylfKIQ2rdEWTZadLiVJy+vtPWoE2anMzAJ3QuinlF5XzboYEJWi/oFMfS+GBy7spuM1jbCIanusx/6kFhAYUHcFm/0xEpLGQGjpKSY2mRjQoqM7UScgi+zDjluoGe2CaT2L9K0rVsDv9/0FKT9gJOeqH3u+8UlqGv02ZURRnoy1WeJIg== X-Forefront-PRVS: 01901B3451 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR0301MB0743; 23:8D5Hcc+JV7J6MbuFVXTNO1vgd9MJCHhOZx4wxlS?= WsXbVPupl30Amscd4woK2DO9yU5Ko1EvBarMcX67vZhzQcleVThc6PVaoblv8wTGynroTQx8TUw2CUJukn/8XuE+k+Zqq4/BZ05Mn89rthf4sIq9G4iNKKEJZ5hHhB3uBJEtjBdfufRC1Qk8LP/1ahY0q6PdWWj0CJmISDA7K6zJ67KS+CLkl3K4ERWyLKBD+Qn+tioJ3O5HNJDv26P5qKS78d1dhTIKzxYPJaAtVguMk+nICeZTENaoU+ynqmbpEFJJKwet9q8mhKk93Q2gfqTfaw796tkppvwRarsGwLBg12FPiZDIO0NUVjZ5HwuG1JEP4oAWj+z/dr5q2p4X9krMa3GsZywRs5Mpa2Oo9FS/y9ARcRoeHvebPscIFG2dnV739B/4wvasB+g3z4WY5PPoRiYHT828+/0h2RxsqOzzE5G5Zun/fIbwzOXQBURIzVhcBwvXrZTZ7NqTBIxQvnLNBlPfYutl8sznE62ua40cEG5p+fIdiTbc9Kn0XyDV1moSG4QghkXzp6nSR/whLhgaEYzqDIkbOQVICEIkiiKNgHysBr0TvvfHYe2USechQDShm5DpAJ9XMzDFaDXey40xSngBIQkbrM3NrngYTFq8R0sncddq5xtVY12loB25QBbkSfwPdpYNBhOxXqaBFWv/ZYJXuGhPuAI0w4kEIyhYg4C4r4jvkIFsi2ilSLZjRF7jAjwgjWkVvHSPkmk5wx2+wsjC2BUie3/QCInRzMreiCFVvYTPGtTyI5jfXSluIlvzVA3/rSaV0ACUR3G8lcBWNvVSXEFNlNn1Do/QR87txDMzPvb6nCypb+JI/q/hEvXOrFKTLrugqOv3ggdQb7aid9KY2FzoP4uh7TLtMER3DqIRyOawPfrDEnlSvwPd3DXb6gL5ul8//HoSWQbHUBAY1bTammOGPoAWbmqcE7jUiJborJDXUd/nEqdaUjgY9jCg5UvAS8ich/tvSV2/wNICiVted1tGVSdl8z1s355hs6TNq/DA6sT8eIcO0FIXHKS8vdNcWXWjRff8ZXeOLQaHXJ+UKQGSXx1LSRJBfS4EkLIxiph58c8nWwiRAwEhFWXLmvG1tdrEHMAvWLFwN3zJrQZLqdt7ZBvJU2/ItvRn+fGvVi3BKl0njTjdGJajmuy+hRoKV+9w38fstbdOLVacJdLU8CAaQS+oAF+LaNHuz6+k109AK26Hv0MvKF/FbXnp3pY0CTjJl7sBOXr7zaHY0aDH1i+40j0ll3biI+KYLV1HdwD1YLdDL3KoG4ugFRB05V3tN7bUoeW7ZtwbYvzZL X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0743; 6:eMm6RegxaCh6/D8Tk89vwwfQso8moOhCxuMSYUIPkjOz2CC4zFLzsMC4p2d3bPAMV0La8+RxyhWJ0ScD/1FRLG6IgdlBWZ6ZcNCAAt85+M9EQhGsjRFVSdyvZfwxTo9NZiQTtRVoUoXY0VYntNo4/tSVmYlE5mSITp/Ni9MKYIfRvEubYCXZkbgowUxaOp57hlkhHUlTAqGvSagm6Q9zlUco4AF+e4h9ibQNli76HcqpmnWkB7KJK6lMYWu5TAhY/0DS58USD8gs0YexWhEmXIA/lAD/EoRBdRQdDIvaU0SNhhNt6E8aqcevoDuji+ACwe45RawzweBKyFt4EGWpcD57Usw+44CG97uHqDITsXWWyGITHxOp/0/MM1SNyH0t9JDTFWYKm7SqvyoBLPCvayZW8kFWvKfImbvhuGECL/dgoHN8QJoAyXF7x7rqFIMU; 5:PBO0JM+vezZHidbHOLKo4pCbU9C2lSZtN0YArT2FHZLUCryCiycSOU7nmbROFXKzM5QLgB61Q0hxMG9z/UUi88p5AoHkqev30STtJRxSnOwNHVWaxD1hcEEE/HLtseFkboTo0R8POgsbjYnJZXMiHTwAXzyhjeiW/RNQGPZ42FEUBNzGfAbqeitWlhiPOKpl; 24:TF3yUlmn3WOx+eEIXq1WlYaaGtzCDqD5ANkDZ16QMj+FSKZYa9cRcgDgftZgpb0+9Tn+dGX9X01EGfnfvbZg0HlokyUIUArZQ0QhIYTPoeI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BY2PR0301MB0743; 7:ikPmGs+CAytP8nl2/n+zHasGIqhNJp3z5FFLp8ud10jszriltwGgUIDHHjUjjkvIGp0bMcaB1SsPEDCz20sjFs5DNiAADthGXwSPedUt2lNJCtQF+7EgzxAG65Hk0wsINIHR/gL1huMobfV8LXYxell5LDt+QKkPGAzIFPVB2Aag052WERE31C2MfrB0kWh+IZeuLEayRbHy4ltqsm4S/S2nEyz2GeRNLZRE5bq2vVxnqqNIyQX5VxnyzqxMyA8T7f4gDQmzlM7guUeF5fm7KsIYjuGP9UKJcuEPaa+kBgRpy5BnAaTyctCmo0M6fZkdF4n9l3opwHu0PknA0ppSzltOF16ZZJ8crFdvZeEx1HrQ0sM1FPgrdxa/lsEkVG6Yoxk7TjqBofuYn+YkhP+UEavHMB/DWYqQHmnFMWmFRdrM7exSJwKoiV0kJHOBZbjHvHAUIkFmNvybg5qEgc/LSw== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jan 2017 13:35:09.0154 (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: BY2PR0301MB0743 Subject: [dpdk-dev] [PATCH v8 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Signed-off-by: Shreyansh Jain Reviewed-by: Ferruh Yigit --- 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; }