From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0045.outbound.protection.outlook.com [104.47.33.45]) by dpdk.org (Postfix) with ESMTP id 8441CFA55 for ; Wed, 18 Jan 2017 15:03:40 +0100 (CET) Received: from DM2PR03CA0004.namprd03.prod.outlook.com (10.141.96.14) by MWHPR03MB2479.namprd03.prod.outlook.com (10.169.200.149) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.860.13; Wed, 18 Jan 2017 14:03:39 +0000 Received: from BN1BFFO11FD048.protection.gbl (2a01:111:f400:7c10::1:189) by DM2PR03CA0004.outlook.office365.com (2a01:111:e400:2428::14) 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 14:03:39 +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 BN1BFFO11FD048.mail.protection.outlook.com (10.58.145.3) 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 14:03:38 +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 v0IE250x026776; Wed, 18 Jan 2017 07:03:36 -0700 From: Shreyansh Jain To: CC: , , Shreyansh Jain Date: Wed, 18 Jan 2017 19:35:21 +0530 Message-ID: <1484748329-5418-6-git-send-email-shreyansh.jain@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1484748329-5418-1-git-send-email-shreyansh.jain@nxp.com> References: <1484735880-17178-1-git-send-email-shreyansh.jain@nxp.com> <1484748329-5418-1-git-send-email-shreyansh.jain@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131292218188032936; (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)(39410400002)(39380400002)(39840400002)(39860400002)(39450400003)(39400400002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(8676002)(110136003)(5660300001)(2950100002)(36756003)(97736004)(5003940100001)(105606002)(92566002)(6666003)(86362001)(85426001)(626004)(38730400001)(33646002)(50466002)(77096006)(53936002)(5890100001)(6916009)(106466001)(48376002)(50986999)(81166006)(104016004)(2351001)(2906002)(305945005)(4326007)(8656002)(356003)(76176999)(189998001)(47776003)(81156014)(54906002)(50226002)(8936002)(68736007); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR03MB2479; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD048; 1:b2TSOj9z1Lsjkf8Xh1KZupLyPfqfHe6bjfGbABisnUr41Rm7LT4DzU70hSY93C5nQP5rD8CD51YvjycdKloDcTJTKM1Jl4wyv8H8PCZus8irHWN0QT9ObvDlfZKyw/t1DVaWnkU0LZdyp1V6ObYn0+cPaU+WBcNBBiLfFRHNaRXlp6CrOtxigJkGC3G5Zjd4R4jJ2pjrLXHOm6/8gUp/wqHFvkxJ+F/axnjVRv/Y5CzTbRWwJLtluHrDFKk/dbqDaVsN1K0Oe2Q6cQ2R4x+cMu6fU5HnlnFk9PXucXs66g5Q+FU6dRKRRWHRTJJjZy8THrW8hsbviV8qZ47smeKWB6JgToMRpuXfAaDE9ULnDm2GyuquqT+w/VJWZlQzpgQRKhqWmrit1q0eLRZe+YGA6koH+1aqaLSu0x/L0nBwKaCjh7fK01ID0pZNXNxDb9bG5EQmmbChDA3q1zO/zLpHJU/g5++DRColrx9U/WDkFWRcxsm4VumXxOYXTeBOUORbrceRrVmzpzbsRblq7j1eYO7/1BhkslZTuID97zzMEWhG8QUKK9S09NwlNvnsAZzsjXaA/8Puor0nIoE9fQQkawsfDeNyuVPMVJWPHlUlrS4+J81+nwvm78YaXxWu3l+ZicNztMJajZ0qBQ7nkQZN9dFz8mgXRLeiuzRu6uzm3zNdN5dRWdzl2qq7I7njH8tS76uy6wEsf9fZkm1nAFvTog== MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 6fe71ec8-f3da-4736-8a4f-08d43faacd53 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:MWHPR03MB2479; X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2479; 3:E1VnsI4upF5tUugsukyxrGvT9KuEOTCVEMRj1QcHMrlpt3ckO4JBVow1V7DHtzNxI8F1HYVl8Y8dLzUjsK66aFfBcemw4U3OD2D2/gWfB4bWzD2gzSntxyz5rctcVHDgLXShYxMMEfFM6kKRji1DWDi9s4aAoCxe6kwURI76gdBsWKL8YRiHNY71tMu/lbn/FR23M5iH8TRhNPuN20icQwB+i/bp7voOq9YUIv7zgbKXSTuUZ6DsOm+s0DtDumtG4N2ZUpIHr91AwgrvhYHYfut8+yRXNSAs/8JAHrxz5Kf0U8fqNXkKrweFlgWqiaB5VBupGNCbRXqw6E+9JRuCgpqgVs0Uf9iStwaEHiod9z9R3Tl6bllGhgxa+MSrqo+F; 25:7kl6/fDs0xqrgBMBRqC8hBf4G2SRGvS2Vfk7KSzrwph0RJmbrhF3AfkORzsR71A3MukZ/tK6gLhC3aHYN2FHXvfbsOlCa7eMh6t9hMPVJIZ8bxcmMklN0PwquxM5PuaIIGlkTyxdTHAkFb8zJU/f5Fi4HRQgRKJLxpZhZN1JY9F2RAn6M8Etnx0OW+9uuS3KsepFrzKVATv/KwBRiP0aGU6M4woCoBuasd5ByuASnZ/Xlm8QPCBs1ebEkSevqd3YlgJqPsYAhA2AlsD8Ypyr+4lB0fDivOFfWMcm6iv7etGM55REeICWxZmJr6BGEJFkUy5rLXzBWPuG9aTqjvpiM4eiwBj4jXg5RWRx4cU7eSVdm3Ns672KXDonNxwoDfezYgyQYvl5crB+E+dhH5jqtNrA+yzD1OlUVi5KDNbq1mRQEYrvUly/ILdS6wQRJVUetEskXEx/BVzJ+uugt/MErA== X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2479; 31:+bjyWiAcSLH2MNWu3H+l9B8v4od4O6Pg1EeJkLak4qf/P/s3Y1Bh8cjkyBqRogaZUhUHmt4qH6DVNpxRCmj3ixZYltj5OmuWKdJILo+GhZsBwLVJ60lLV/JU9wQhmj5ydfu8gonTkhwvBAJIZdZqXMUKw1njBiKJEE8sXnf2Nk87sZ+j5ueZnryjvloQxAOSfNH14ER0xuKPBaOXMuHpGRN5naPkWGq0xMd3O3apYNMqrBiAXLLlN8poks+gaZNzbev/u9RPnIRHTokVkX3YumpItvKnk91cdtUYGj7ZLxI= 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)(13018025)(13017025)(13023025)(13024025)(5005006)(8121501046)(10201501046)(3002001)(6055026)(6096035)(20161123561025)(20161123556025)(20161123563025)(20161123565025)(20161123559025); SRVR:MWHPR03MB2479; BCL:0; PCL:0; RULEID:(400006); SRVR:MWHPR03MB2479; X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2479; 4:0Eui+oizbuK3S4aZUfTnLWDaGJQAuav/SJ3jvvmWZvjSYL9oAxKlnoPtjbIdhVZUottt1uR8xvYgvgyFZ7/bxpkLdM2/I3JLXsxZviHPjQ7WQ8f/F/jWEj90rGeTZmSohWBTkE3STbMlhpPFMzy6/hiqNRNWuqwspv5ViOslEOtaUM/CKEk/FueMi5FIGVRDcfsOKTcN9YF6sOrMy8w2ikAOqZBYDawaxUYgRXLH6cD3kP5ucObR3omXXYtwjbnGC/lHvU1/3WJNTepTXtLbelKJ3DcR4MiMuaW+KMjs5Fr1K+2mwmreVqMYhOQVU2+Rx+bcqPAA9wT7stshc14QIrEI+4jZSM3MVpBA4xahosK8N/WjP+jXpyciVo9CQW2T9T9/eQTc2TeEXYyCd+rlPSfRHSZi1BCp5/EMSNW9ck6KeQqrEQxhJ/EON1sBmeuxNDteOCFWlRKvEb6e6taAtYYAK/LgLFpTdxHRNpcXjvZE5CT4FzYgmhZ9TD/gEMl6ajgg6Q2rNNNX4hC3hHDCcy36OWknYPE1hpuvehWIbNPi7jrkYQwPMckKcIV0hPohIoJlNBmrRS1DPqzRgJnJFjSx20U+6IXlArYF6d97ztXUdDdqdg68mqVmPxln2yRZqqWLq/zXxHGd4CDrmIdowqUR3lSeKQoBEz5eb15X+So5hI1jfIOluexZ9Wk9QVa59++Ykf8g76ZBHmtTsuigmt/gNsBoY2BWTreRVHYeog72vweLSl20lM6odLqgdktEV4RD/WRr/9cEyeoIx9+aLQ== X-Forefront-PRVS: 01917B1794 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; MWHPR03MB2479; 23:Mmk4I4eEGJdc54O/ZKTFCzFzz+eX6Y+4nOwRuB+C5?= =?us-ascii?Q?sjYYX+vbIGiWTFWCfUIIY58lVo9QN12MpybrCHrdPXXUYPe1ldrdf4iGoaV+?= =?us-ascii?Q?ncjzEVfU71vOrNw9VaCBUhTmS4E9fl2AbDBH5hbEP9NJUN0fIzOfcxf6DnLP?= =?us-ascii?Q?avSi2C2SrpTc+CIruDzSpppMzu+o81NSCTC62rt2t1UQCynZb2h9zMYayW0m?= =?us-ascii?Q?+TwCD7SsoacEAs3hY3ziOXwc+3cnuONzRRpe761toSMl8kDVjHWnogQ60dgP?= =?us-ascii?Q?VGkBJuYNalHypNtiZkkdzHWPIGKN8B3w70QjUoFhFJfk+xsaSen6sAWlFdhe?= =?us-ascii?Q?GLzPoQCKLQs6zSGQdLWiMV/VuCnv9JYAk/uDRqll4qgputh2wq8cmuz7WcPV?= =?us-ascii?Q?bk2FuAMpLByaSr4Y2Rj+S7WygBa2qpan9Ldn2r8CTlTn0bl1TYQy1rnzohf+?= =?us-ascii?Q?Ipg+kdfNgkVFJ7gH3BMfnxd8Tsscgf6GFhzI0eRaB3Gx8TagDmsz+hlGRGsR?= =?us-ascii?Q?lhoVG4QvKMlIkFhXzaUq9vFwUqwL4vaNk/7gKZs0jtDeCV1OC9prJfPA0Omi?= =?us-ascii?Q?OLbvNGUMESTa30cVdsSNhDs1Cx34QhOtEx6BFu6uwoFXIj+flIJJu/u9mK1V?= =?us-ascii?Q?eQcR3O6ADgB88INiawUBhtx9AtvrGC1Vi185BoxIMihlo9hZuqCY6rq3QbwZ?= =?us-ascii?Q?UWI0o7IHcQWvyjwNDdbJX8y5hmQfwdZ7/kwpTJg61ePHzXQuaD3ZqQT39mKW?= =?us-ascii?Q?E8zSjmOIHq37+x9oH+5E5sQOSU89tyPjB0jetp5hu8TCyFSdkD5mPlKVpgUn?= =?us-ascii?Q?2j8wTYCxS2BmRj3/kDf/FTHE5ceag7MqnJ6q9XnfqiI++/ueXahKwhcZKR5E?= =?us-ascii?Q?QqVc3wP2pE5xwwm7DLx/LrCFmqS/Qj+fFvE9LLi9563AHb5t4d0bP8qQPhdU?= =?us-ascii?Q?eHBglBIUaOHzy46dYQm66+lJulZKmYK0+rsdSODQTudgsWvRgnpHeqkBcnam?= =?us-ascii?Q?pG0qsihV0Xk+NZI+y0XC2jAAxhQio/5OAdvG24CtopyiFCNITU9oCPVZ+Buy?= =?us-ascii?Q?w9heahOOXeGmebXtHo/8qhSHQKwrbvun+ei7pRTm+GvYDsXH1R8GVyFNodL5?= =?us-ascii?Q?krIXGj44PQKV46V5k/a/2wNTT6/iXHTRyow11NqKO2cvHFMNmaBZLAc4LMrl?= =?us-ascii?Q?EJBtEcKz9ccK6Q55IXQw9b9DuUxUp0AQVg4OXl1VVhj6fs/Se4Yvy5v8sk81?= =?us-ascii?Q?mPxpJBmoRP4sZA8skyf8+InvZikOz68H9PgQ7mUoLEQ6kfSJbjBn/JAGfCz4?= =?us-ascii?Q?P41X7qaW9pFMYvbhI2lzfcXiVYuTh+rqnQF+f2Sg6cT?= X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2479; 6:pzkEfd7mvuPqBJEfvczUUeIQagEds3YU3SolWnDxTfhpeVwHIY863MzRljqqC8qZCuMEKQkz4uXoQOeAI17KEtzU+MwTb1U1esGZrtVHMLd9rWPFuUeSkr0qWQpZgOxyi0lb4eCZln9RkxC9mWZ1ScDPiZo7CqcYsuHcOy+WEIDyBDJYhjLDo+F6KZ/lTe+gJO/betXuBvAGEDvr51CPkgF6nwNSKml+GJGG3LPB+Ucl7DmQzFxpLpI4KGL00PD0j+ayLML48ebUhUUWbVhoJIsal8ZIXim3uUm6GYtpK2q+/ulZ7PfoJr8RoDB3npTivqQqUAifKJyxcNjWPbaMR7xIeZk5vy5we0GWXn/iVXxEmYwaVVPEJ8a3M9yZr8X7h3GY+WtUZ/sDe3u4+2w1N+SMpQJYJcdx2YiccuyqPxdzwbeZAYtDNYI7ZXKR4lTB; 5:6NHF3x7Wi4ndo2SSB+iRZNSJ71NSWoNu0sXODJRxiKvfnaxJgK7OjaAN+db+TKnDXqCeIHsV4QdqjajoYHh/F4feyz0/utiaQLUyT55x+UVvjBTooEkyDSDT0wog3oCEi7g55fbhg294GRlpcRn2Qqy2DWhlbGvy99T+MDDDIrCXd9Oa1GiRyc4uM7amyAYc; 24:eikA/GjCgMguI9HcGw+DNLdOIvaw2S4HUg545F4Oq/acLSz4hGG1PxRCLnMt7myw1sNj9oRvmuryxM3HsboK8vS5I2+MpQzbk8j368dxfEA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2479; 7:9B0UmyMUAmiyns7qblQjUMj+X4uEjVx+Biutvf6vce3A+yW9Ih40zwJMzC88WVJF5X5oeIXN3Ts+uOojSRX8v0GJKhZhfhebQVUtH8g0npYHmq7ItmuY2vd/EgNbiTrz/TznzcfVDpSDDruiNrs/CClg8Kz+qhJCyvECPZfzg2iILB6x4VRA4Q0s5Bq+CxXga7KMIPOeXdhyatV8KiaMfFLVn1vScMldtibwbGYzEROhynNLUntDPjQFu3jZ74d5Fgr4Wv1OfHuVsWws/xJRzGfS33RIhefv0YnhrAOiTqpy7t6SszRnwtQhgkr3E8zilu/ReUmqfLHiHweMZuPmfdF/+K9qlQ6Wz/1J9FTGd5BiRlPttm8JZ5QyTUACLU5kc5FwENvyYnrryRfdLPHg1M+fjtLx9jE5WW3QTfIQrVNVvI12JVwVskt/6QLyg0Gj1LaUOK6cgQ1JWOEGRTXkKg== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2017 14:03:38.6005 (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: MWHPR03MB2479 Subject: [dpdk-dev] [PATCH v10 05/13] eal/bus: support for scanning of bus 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 14:03:41 -0000 Scan for bus discovers the devices available on the bus and adds them to a bus specific device list. Each bus mandatorily implements this method. Test cases for Bus are also updated by this patch. Signed-off-by: Shreyansh Jain Reviewed-by: Ferruh Yigit --- app/test/test_bus.c | 175 ++++++++++++++++++++++++++++++++ lib/librte_eal/common/eal_common_bus.c | 2 + lib/librte_eal/common/include/rte_bus.h | 14 +++ 3 files changed, 191 insertions(+) diff --git a/app/test/test_bus.c b/app/test/test_bus.c index 9680bac..0b6d011 100644 --- a/app/test/test_bus.c +++ b/app/test/test_bus.c @@ -106,10 +106,26 @@ struct dummy_bus_map { struct rte_bus_list orig_bus_list = TAILQ_HEAD_INITIALIZER(orig_bus_list); +/* Forward declarations for callbacks from bus */ + +/* Bus A + * Scan would register devA1 and devA2 to bus + */ +static int scan_fn_for_busA(void); + +/* Bus B + * Scan would register devB1 and devB2 to bus + */ +static int scan_fn_for_busB(void); + +/* generic implementations wrapped around by above declarations */ +static int generic_scan_fn(struct rte_bus *bus); + struct dummy_bus busA = { .name = "busA_impl", /* busA */ .bus = { .name = "busA", + .scan = scan_fn_for_busA, }, }; @@ -117,6 +133,7 @@ struct dummy_bus busB = { .name = "busB_impl", /* busB */ .bus = { .name = "busB", + .scan = scan_fn_for_busB, }, }; @@ -226,9 +243,81 @@ dump_device_tree(void) printf("------>8-------\n"); } +/* @internal + * Move over the bus_map and find the entry matching the bus object + * passed as argument. + * For each device in that bus_map list, register. + * + * @param bus + * bus to scan againt test entry + * @return + * 0 for successful scan, even if no devices are found + * !0 for any error in scanning (like, invalid bus) + */ +static int +generic_scan_fn(struct rte_bus *bus) +{ + int i = 0; + struct dummy_device *ddev = NULL; + struct dummy_bus_map *dbmap = NULL; + struct dummy_bus *db = NULL; + + if (!bus) + return -1; + + /* Extract the device tree node using the bus passed */ + for (i = 0; bus_map[i].name; i++) { + if (!strcmp(bus_map[i].name, bus->name)) { + dbmap = &bus_map[i]; + break; + } + } + + if (!dbmap) + return -1; + + db = dbmap->dbus; + + /* For all the devices in the device tree (bus_map), add device */ + for (i = 0; dbmap->ddevices[i]; i++) { + ddev = dbmap->ddevices[i]; + TAILQ_INSERT_TAIL(&db->device_list, ddev, next); + ddev->dev.bus = bus; + } + + return 0; +} + +int +scan_fn_for_busA(void) { + struct dummy_bus_map *dbm; + + dbm = &bus_map[0]; + while (dbm) { + if (strcmp(dbm->name, "busA") == 0) + return generic_scan_fn(&dbm->dbus->bus); + dbm++; + } + return 1; +} + +int +scan_fn_for_busB(void) { + struct dummy_bus_map *dbm; + + dbm = &bus_map[0]; + while (dbm) { + if (strcmp(dbm->name, "busB") == 0) + return generic_scan_fn(&dbm->dbus->bus); + dbm++; + } + return 1; +} + static int test_bus_setup(void) { + int i = 0; struct rte_bus *bus_p = NULL; /* Preserve the original bus list before executing test */ @@ -238,6 +327,13 @@ test_bus_setup(void) TAILQ_INSERT_TAIL(&orig_bus_list, bus_p, next); } + /* Initialize the bus lists */ + for (i = 0; bus_map[i].name; i++) { + TAILQ_INIT(&bus_map[i].dbus->device_list); + TAILQ_INIT(&bus_map[i].dbus->driver_list); + } + + dump_device_tree(); return 0; } @@ -336,6 +432,79 @@ test_bus_unregistration(void) return 0; } +static int +test_device_unregistration_on_bus(void) +{ + int i; + struct rte_bus *bus = NULL; + struct dummy_device *ddev; + struct dummy_bus *dbus; + + for (i = 0; bus_map[i].name; i++) { + bus = &(bus_map[i].dbus->bus); + if (!bus) { + printf("Unable to find bus (%s)\n", + bus_map[i].name); + return -1; + } + + dbus = container_of(bus, struct dummy_bus, bus); + /* For bus 'bus', unregister all devices */ + TAILQ_FOREACH(ddev, &dbus->device_list, next) { + TAILQ_REMOVE(&dbus->device_list, ddev, next); + } + } + + for (i = 0; bus_map[i].name; i++) { + bus = &(bus_map[i].dbus->bus); + dbus = container_of(bus, struct dummy_bus, bus); + + if (!TAILQ_EMPTY(&dbus->device_list)) { + printf("Unable to remove all devices on bus (%s)\n", + bus->name); + return -1; + } + } + + /* All devices from all buses have been removed */ + printf("All devices on all buses unregistered.\n"); + dump_device_tree(); + + return 0; +} + +/* @internal + * For each bus registered, call the scan function to identify devices + * on the bus. + * + * @param void + * @return + * 0 for successful scan + * !0 for unsuccessful scan + * + */ +static int +test_bus_scan(void) +{ + int ret; + struct rte_bus *bus; + + TAILQ_FOREACH(bus, &rte_bus_list, next) { + /* Call the scan function for each bus */ + ret = bus->scan(); + if (ret) { + printf("Scan of buses failed.\n"); + return -1; + } + } + + printf("Scan of all buses completed.\n"); + dump_device_tree(); + + return 0; +} + + int test_bus(void) { @@ -346,6 +515,12 @@ test_bus(void) if (test_bus_registration()) return -1; + if (test_bus_scan()) + return -1; + + if (test_device_unregistration_on_bus()) + return -1; + if (test_bus_unregistration()) return -1; diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c index 49b3516..d5d6beb 100644 --- a/lib/librte_eal/common/eal_common_bus.c +++ b/lib/librte_eal/common/eal_common_bus.c @@ -50,6 +50,8 @@ rte_bus_register(struct rte_bus *bus) { RTE_VERIFY(bus); RTE_VERIFY(bus->name && strlen(bus->name)); + /* A bus should mandatorily have the scan implemented */ + RTE_VERIFY(bus->scan); TAILQ_INSERT_TAIL(&rte_bus_list, bus, next); RTE_LOG(DEBUG, EAL, "Registered [%s] bus.\n", bus->name); diff --git a/lib/librte_eal/common/include/rte_bus.h b/lib/librte_eal/common/include/rte_bus.h index 204e576..ba7d866 100644 --- a/lib/librte_eal/common/include/rte_bus.h +++ b/lib/librte_eal/common/include/rte_bus.h @@ -60,11 +60,25 @@ TAILQ_HEAD(rte_bus_list, rte_bus); extern struct rte_bus_list rte_bus_list; /** + * Bus specific scan for devices attached on the bus. + * For each bus object, the scan would be reponsible for finding devices and + * adding them to its private device list. + * + * A bus should mandatorily implement this method. + * + * @return + * 0 for successful scan + * <0 for unsuccessful scan with error value + */ +typedef int (*rte_bus_scan_t)(void); + +/** * A structure describing a generic bus. */ struct rte_bus { TAILQ_ENTRY(rte_bus) next; /**< Next bus object in linked list */ const char *name; /**< Name of the bus */ + rte_bus_scan_t scan; /**< Scan for devices attached to bus */ }; /** -- 2.7.4