From patchwork Wed Jan 18 14:05:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shreyansh Jain X-Patchwork-Id: 19723 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 49170FAC7; Wed, 18 Jan 2017 15:04:18 +0100 (CET) Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-cys01nam02on0069.outbound.protection.outlook.com [104.47.37.69]) by dpdk.org (Postfix) with ESMTP id 88057FA76 for ; Wed, 18 Jan 2017 15:03:55 +0100 (CET) Received: from BN3PR0301CA0078.namprd03.prod.outlook.com (10.160.152.174) by CY4PR03MB2469.namprd03.prod.outlook.com (10.168.163.147) 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 14:03:54 +0000 Received: from BN1BFFO11FD035.protection.gbl (2a01:111:f400:7c10::1:155) by BN3PR0301CA0078.outlook.office365.com (2a01:111:e400:401e::46) 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; Wed, 18 Jan 2017 14:03:53 +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 BN1BFFO11FD035.mail.protection.outlook.com (10.58.144.98) 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:53 +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 v0IE2516026776; Wed, 18 Jan 2017 07:03:51 -0700 From: Shreyansh Jain To: CC: , , Shreyansh Jain Date: Wed, 18 Jan 2017 19:35:28 +0530 Message-ID: <1484748329-5418-13-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: 131292218336561307; (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)(39860400002)(39400400002)(39450400003)(39850400002)(39840400002)(39380400002)(39410400002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(53936002)(68736007)(81156014)(8936002)(626004)(97736004)(2950100002)(8676002)(50226002)(36756003)(5660300001)(2351001)(104016004)(76176999)(105606002)(5003940100001)(50986999)(48376002)(50466002)(6916009)(33646002)(81166006)(6666003)(85426001)(189998001)(92566002)(106466001)(356003)(2906002)(110136003)(4326007)(47776003)(77096006)(5890100001)(8656002)(54906002)(86362001)(38730400001)(575784001)(305945005); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR03MB2469; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD035; 1:hGm/On7JWg8RUlbOJWgsBogGXNV6iWCeXjkZPu4C1LSADu2evAHwxZCoLHdAnT8i6hdT8ilPbf3JPf4QxqtKhh+ivYylSz337ELWRenPZKEGs39cZtXGlt93zDL0PzO/iaS5Gi9vAv+qTXHLUOJECFzn04rd+EbfyXDG5n6it+agYuPmhmxp2XH424wgt+JG5MJnEbUIDrgG+/Tz0XDZT4/bXxPBzg/YotLB2juzo4cbPQRkoRd00Jn8LGDpvkDyZaFb4IZ536EgRFjF1e4pX5F/ubCqcdA61672wSB7useLR/MWfpdgVYhG3/6mjzBrVoEcCMfIw/asR27d7tO3t+aq7Q80qoC05pYtAHFzVzDqSNiyOPmEMKsYvi8SdtBCZ6rsMRAsPvubOuth+JtckEJdLOEDMA7iQK2IU3y/OUX5R1Gl1r/zswPA2YQRVcmEjKm6eg57Usop+udlH9JmlnaiEV3HfhLiXjnVMKGdhbnDiROUdkJg4WrJbkbiWpTU1PIYAOYsfLTiPBwYClA12xI3oqZXE7BP7YdvP18qGyGAPu2L2qGllP8oN0bhMT9vQ9FNS+n/1W3EbkiI72O2IxOROHZT7a6aBYBWVqYXaWfdCWBuqfbPx1KSeLdQj1dsIoE7tOfhC3apJowtLz8LbsG71eYd8MrRZa/pWzVszBSO0aSMzgbqkMt3liftTynhZuhHrLs9iUA5aP6yQ8buOA== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 7d336add-ccf6-473e-489b-08d43faad630 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:CY4PR03MB2469; X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2469; 3:ElZIRe5T5w/XmzKvHrxVmDCABXp4BSz78uUrIh17ogaCC+OX/iLZZLu0ENaJOHseYsODDhIhRpE6Lq2tYY94RTXsy/jKA/omGha3dBzuNJjZhZECQYtmW1Z6kPVwNAjhNuZS+VPZDNJcPu1zRnzl3PBBJhtdmTAyHdPtBaP/EOUV27ghX5BuhFVe6StqskHNDS+vLSwzb7aWgu0h8l6/Q9IVdg5cj04wZ2aFphoC7qfvRrr7WgUZgbR5Z+YqaSWDmCIjxU6lQ1coCE132rtuWO7VYBWoK2hfNW7JcjjFz3TrzfSAyVTRnKjBxFQKsEbwF3PiVpSvy4bf3o6KhdKs9HjCj2hUi/aBKZtP12a2hIGVPrKTWraLiBzuMIAwy2lM X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2469; 25:RhsmPM2JZzEmIy6bPhet45m0D46KZc0go/0ozD9SVlePUiuOIneFb4DvnXMP1GTUoynviqmSdQRHtBwHmYNW3Z5XR9qcQDmTxgB3tzc9hkHcwo0TnxJuaSsaGm7PywnPk47hXpoijKP5wwwegPVCyk3rRwsJBkkwOCkPF7y51Gx2SpiG6KHfDWETtxOWm46Yh7UpYykLnKCHrnUha0hsA2cY3xWgEgbY06aspWy8gp3zB+sCECWpQgn7icLGV0lvxCNaXAk5XdMQPdbp/V13mDAziH+NMl5UGPx1XFgvwq96jIhPq2w8ZXuSZG/G3Zo1xrUaCPaxGmKDuJnDTxD6/+QK+p014iBagGf6c6dkfFgXAM4OK3LU/camIZl+fa0v7yICZIx798eJ9m/aSWlgYaODhn/Y31Zo8Ktxr3fL/R9E043ykZdFCAu4+n2FYljUAV6xnA7WCJRmYOx/fHaGC8cRDn4Qyxk/ei+lt4dG5tkVyMeaBs0ZKRHRvBywFues4S1tuaN2To8IG4y8BP5ztbh9+144+P1QzD0IloRb03njmDuYCa6Ox2RK9gwZ/Ig8mczX67YjH7fw1wKf++TBEVwXwhJVClJ3UvXjCGj3BU5oIsGk0sqta/5ZvjZ6ogAYgNtz+QXmbx+NY4hR0a6gnHk+n0RdpfSovc3caKdnB7bTwCCCi1H828bHrajR06KLHQBIYntFNoQfaigl6G0St8tTOupp79EiahexCpxMTHWafIIRiJ3iSEiDjTN+PggQohKYe/6qmroFibgsL2Op2UKdw64QeW7b0wAJ/vP3hwU= X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2469; 31:wfSXdAoeR9AAdZUfyQefsQvCuXq9puWI1pY+bkNHNEjemMG2SDNeleQSSo38WtxGAnsxkWQe6HvSoEFYOl9TN5Wq6JqdnCv+2SrvQpTnwyPKL0hniBqPxJMpknSZLtYpVx6FQ5Y44KjxPemfZVelw7ZCNmQjDfvZaoozcsqGf2pM3VmqgEipC7gRv/ppEex5jppsXOLNUfOqkD1YxBXKmZRtRMweSxiwZTIxV8r+ioZodCPFdUK+OTzCps5X1vUpj/2Eolt1ZCdy7W+HLOd368IIl9GkF2x8pS/dUCK3G6c= 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:CY4PR03MB2469; BCL:0; PCL:0; RULEID:(400006); SRVR:CY4PR03MB2469; X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2469; 4:6ajskfX06lQy71SsQbDLQuyr2ctXr3c3beOnwGYKDZoE10+TPoisSbsg84okJ/wcqKg01Pkt07faMXSajrFbTFbuBielOFNBvSU2cNRN8wCUwEr41n+QLLm7hG2FTJK+p5v5CQJowFw7jKcbGQnKSgUacP5nsnSofx+vhGYUc3b9cfn1VFiPOohWhgXVwU2QaNXOkaGz3GrCOtjq33ROC7CPm0cZOXPwU5l3GMHmlrEmq0ppB6aOnZPGLjjy8caOFhj8nAlcgZRJ6fsAtBuJSFTdQ/HkQVDMYhnQCZQh0ER+gPau9xeL7A7o7fDzsOw/v/a9sMuG1NRk4N2N8NwyIJtYgX0+IkWCsuBiQ6tJyV69nY8gwVqHwDbx9zLKMzplIqcdZOb1q1nuHXG2c3v//KXtO9nVYeaoWV4uJLTjKnaTSM+6hokNcJ4nm1uQuIh5nI01lPmHUBG0zblJaZFRxiTnaPcIBOxZ0isSaNfdKyoy3i3kMfDNnAvq/ATACWUkMxfghM0MCYEDSpZPZM2un9IcZK2WE0aLKO7VrVg8Wl95eZV/d2NAz4ZtYmvZo/deUL9WbtaFr8O8DL0JAXDYB5h+iI06O2zFvNBvoxp2UEQrm2ByEH01v099Hh3CcOt/1GX9RV3XDh4qLbAM7BfPCi57mru/mt1+9JgxyOdByk8NXav1t2vYP3uQKFUE2vPqd3WSEAP/mFWrN337lSpghg4YOICfpDm/Gn+Uj3wvq4oM1odOZZFQ8qck2IJTNZa5X+LhnhpWVOt5tVKbCzGQ4w== X-Forefront-PRVS: 01917B1794 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR03MB2469; 23:9FUbmxIt0fqgnpqILECst94/WLRhURSUUKeoaHGxT?= DmtyURfCNyEIrxKHySM1BQljdopSqieTX4KEJ1K4/bpp7KaNUIvBy3ViFdJuEbovb9i4jgBgkpgcZ9wL8VDlSUOBAbuRDxgRYlWX0nJuK3lAw5viqy4aSyHkVZwSugAswcidqZaaQZECetUi2uB4Ar6PpoUa14ldWYfQwpWd0LGSd5muOb+eSby+XWX6H0wjcId5d6fvVm+qvTIX1rPfpayJXs3b7awujqhZDpcZQkLs9N+dh1ZYQBYXs21RAvc7mbD0J5uvp87KX9HTyOk/TUG8Hq9rPSHBcW53B8DFUJADn1cvZWy/g/CtkHWacyhBmlX5jp632FKbqd4z5hyzeiAxoiv/T8UeaS2iyY+dReXmhONw0RUR0QDnrjAF9U2gZmJCoOx32qBLMg6+Esc9Fz11RYWyzwhKFgiTRxPzgNdmxbLMHkq4AB2dvPCKimlOOwNrvUHhbwu3HbnTFsdjPzUGN5cmeepbwG6bBsDH4iCBAz98+HmEY0PbtKpsXkB20gH7u5V3qQXalMA9zmv96pPAzjfikU2ZEbC7vnbETgm7xmENq8kcaBWFNHGnoCXNiFio4i0+n3epfI6wD4CeMXgA4ZG9262d9wNyPTDzfm9SOpj8hy23ou3yiVPdEQUWvEr8pfDDmqRPJq7p3ta29c0OjNXNESsirgLahjPUPvwwAq2lTX1WtjiynT6KgVzAYrGuQ9kG6h+9PX7pVupC9InrbmIkI5A+2QjbtpaInO4lTkWzH/ikx01E17nD1wKO25JPoFoBm4/pvVBOtCbkZd0O3GcoSpBX+khcY+HY5P0f3ozQh2AbASflTkZGxkrRr8oqpoe1IKvzVewpwOW+7an3105763YHmKy2sK/HB7RPWvVgrlydxvvOkT8u01FbBHaBq62WyzZTiwwfbG4ir0od/2C9tE5AAZgFTNLU6/9RGWQBYg9jnr4ONyJ+rVjIpXDoM0FlfgG6hQd2cj6g4KQ1KxGcZwHZWCsiQ56NUdO/YuI7umYreBUkA7oN8j600ZYtbAw2S3NXfsh2YI3QQj0annT/zZJzC8fg2uISlsmSnJSX0UDOqbCiOvKtXRoJBsy+d9GWXVDewFEQ0zgB/P1Yd/soPK32a42p54hwFllKIESe1PizinE4on0oS7N5jHOhCAbcaexJyvGdsxtwzlmGy8q5nm7NAsWXoRaM8alb7W0r+ziQteu4cLY2XBKxw1cLKWyH8WmApr662REsFbo2kgMj+zjIe5KRKIKOZFXRL28VfVbhMQuYrwvh35OhWhs50bOiF4zHW5s7gvNheFtyR5s4TH9HghGxgzvi8e80w== X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2469; 6:wNe1ov4mVnRe07CzlDAmS0agmaK9UEquVd3IisQwgEMvOuBmWmrXnBfXiSKsxCZuzTdSCqQLFlqc1gEKZM5TpTv/oA5L8OJPlJIAoYnGUv025Gxxv5SVEpFZZDccKsmC/ZwVZn5+mST7HqB+TB9iyIKkXZKzv0KVJkI4Ynhq4bKVKYgjt0KlhLJqn9fzQp3JziYB3iwSkfNuFA1qikPjX9wRuxOokXN932iSrORIdZ/Vu12OehvcxDH2WXiMqZiEZ08CZJH30mbxQAbcIpFVXM3Zuu1cMM7Dw5hE5NqtEohC2kPaeNFMeufhuX3kQBjcWIBqSCTdmIkdCmuQDfL1KY3MPHfc3FMFzfYoY/6vGVTz55B00OFdjbr+HOY7pNb/8io3A+lvLJRHVJBuXxDYOUbl6Xx0V/fymaZIf80fTnkX7boc9LnKqxvk9A2BtgIj; 5:IiSN35TBKokEauDi2/hy0p9uv6B28ClN7HhoQBiWuuooff5zdud8r75JaTSieyoNwYKTUBpCWAjtJC7JWbT/NnRIthDFoYYc+zCtN0cesoAEU2Kc4zhhxroxEz9NkzYx1Bs8lRG+t5+MTvvzFkPdOaruQAC8zGk2u37q1JTIoeJD9e7rPmHkSh23IYmcnvVe; 24:Mb2fcgInBca5gRoumUf637nX5c7krvNQSDXkRGudQApnGUCkYJ7J+gZ/MhdOIJYvYoEXxKT05caWAz+e9IBry8NkgjjyR7Bzz0zxyieAKIQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2469; 7:BShx32hAcWPgmwPDp1j9c51ZX8Uq9OfC/t2ckFbscjiu+DFImmgf8mVSeoY70lVfym5DpoJun5w7bv/MPDPWlPuH59pVepjsyh2FFdD/P95AcgErSHhXayhL188GNTQZay74qg0GY3MOFytHx1SSQz39afu+y0SmC/5MCsxiJYtorY6YVaQE64UKyLYsi3/6F6CXN0HNpl3Fdv/8vmeihk5N1iSEbn5desWOZNB/xV9bf6RzIDZ0Sk6Ss9k1SwjY/KEpUwND3oWJIeAsJQV7/o+zHtTWvk/X8AdgaZgclq3lA9qdzgBobeefmqiU3iybeb1zydfyPQDKmUy1Q+QILwMuuQOdXzKvpqty9QNj+TqzbP0yDmwEuwDOm5qT/XJZ0WQv9DYW7fQEt2S7ilUzS9XDT4iEM6vEqpLPZc1PbQ67Gecq43fcC0xof/cR+NJ4OOC97hv5nQidg63BTmgjsA== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2017 14:03:53.4689 (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: CY4PR03MB2469 Subject: [dpdk-dev] [PATCH v10 12/13] eal: enable hotplugging of devices on 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Given a bus, attach and detach callbacks allow the implementation to handles calls from EAL for attaching or detaching a named device. Signed-off-by: Shreyansh Jain Reviewed-by: Ferruh Yigit --- lib/librte_eal/bsdapp/eal/eal_pci.c | 2 + lib/librte_eal/common/eal_common_dev.c | 56 ++++++++++++++++----- lib/librte_eal/common/eal_common_pci.c | 89 +++++++++++++++++++++++++++++++-- lib/librte_eal/common/include/rte_bus.h | 31 ++++++++++++ lib/librte_eal/common/include/rte_pci.h | 45 +++++++++++------ lib/librte_eal/linuxapp/eal/eal_pci.c | 2 + 6 files changed, 193 insertions(+), 32 deletions(-) diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c index e0deded..7d7f90c 100644 --- a/lib/librte_eal/bsdapp/eal/eal_pci.c +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c @@ -682,6 +682,8 @@ struct rte_pci_bus rte_pci_bus = { .bus = { .scan = rte_eal_pci_scan, .probe = rte_eal_pci_probe, + .attach = rte_eal_pci_attach, + .detach = rte_eal_pci_detach, }, .device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list), .driver_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.driver_list), diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index 4f3b493..97d0cf5 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -38,6 +38,7 @@ #include #include +#include #include #include #include @@ -106,23 +107,37 @@ rte_eal_dev_init(void) int rte_eal_dev_attach(const char *name, const char *devargs) { - struct rte_pci_addr addr; + int ret = 1; + struct rte_bus *bus; if (name == NULL || devargs == NULL) { RTE_LOG(ERR, EAL, "Invalid device or arguments provided\n"); return -EINVAL; } - if (eal_parse_pci_DomBDF(name, &addr) == 0) { - if (rte_eal_pci_probe_one(&addr) < 0) + FOREACH_BUS(bus) { + if (!bus->attach) { + RTE_LOG(DEBUG, EAL, "Bus (%s) doesn't implement" + " attach.\n", bus->name); + continue; + } + ret = bus->attach(name); + if (!ret) /* device successfully attached */ + return ret; + if (ret > 0) /* device not found on bus */ + continue; + else goto err; + } - } else { - if (rte_eal_vdev_init(name, devargs)) + if (ret > 0) { + /* In case the device was not found on any bus, search VDEV */ + ret = rte_eal_vdev_init(name, devargs); + if (ret) goto err; } - return 0; + return ret; err: RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n", name); @@ -131,21 +146,38 @@ int rte_eal_dev_attach(const char *name, const char *devargs) int rte_eal_dev_detach(const char *name) { - struct rte_pci_addr addr; + int ret = 1; + struct rte_bus *bus; if (name == NULL) { RTE_LOG(ERR, EAL, "Invalid device provided.\n"); return -EINVAL; } - if (eal_parse_pci_DomBDF(name, &addr) == 0) { - if (rte_eal_pci_detach(&addr) < 0) + FOREACH_BUS(bus) { + if (!bus->detach) { + RTE_LOG(DEBUG, EAL, "Bus (%s) doesn't implement" + " detach.\n", bus->name); + continue; + } + + ret = bus->detach(name); + if (!ret) /* device successfully detached */ + return ret; + if (ret > 0) /* device not found on the bus */ + continue; + else goto err; - } else { - if (rte_eal_vdev_uninit(name)) + } + + if (ret > 0) { + /* In case the device was not found on any bus, search VDEV */ + ret = rte_eal_vdev_uninit(name); + if (ret) goto err; } - return 0; + + return ret; err: RTE_LOG(ERR, EAL, "Driver cannot detach the device (%s)\n", name); diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c index ca7c0ce..7991645 100644 --- a/lib/librte_eal/common/eal_common_pci.c +++ b/lib/librte_eal/common/eal_common_pci.c @@ -356,19 +356,98 @@ rte_eal_pci_probe_one(const struct rte_pci_addr *addr) } /* + * Attach device specific by its name + */ +int +rte_eal_pci_attach(const char *device_name) +{ + struct rte_pci_device *dev = NULL; + struct rte_pci_driver *drv = NULL; + struct rte_pci_addr addr; + int ret; + + if (!device_name) + return -1; + + memset(&addr, 0, sizeof(addr)); + if (eal_parse_pci_DomBDF(device_name, &addr)) { + /* Device doesn't match PCI BDF naming format */ + return 1; + } + + if (pci_update_device(&addr) < 0) + goto err_return; + + FOREACH_DEVICE_ON_PCIBUS(dev) { + if (rte_eal_compare_pci_addr(&dev->addr, &addr)) + continue; + + FOREACH_DRIVER_ON_PCIBUS(drv) { + ret = rte_pci_match(drv, dev); + if (ret) { + /* Match of device and driver failed */ + RTE_LOG(DEBUG, EAL, "Driver (%s) doesn't match" + " the device (%s)\n", drv->driver.name, + device_name); + continue; + } + + RTE_LOG(INFO, EAL, " probe driver: %x:%x %s\n", + dev->id.vendor_id, dev->id.device_id, + drv->driver.name); + + if (drv->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { + /* map resources for devices that use + * igb_uio + */ + ret = rte_eal_pci_map_device(dev); + if (ret != 0) + goto err_return; + } + + /* reference driver structure */ + dev->driver = drv; + + /* call the driver probe() function */ + ret = drv->probe(drv, dev); + if (ret) { + dev->driver = NULL; + if (drv->drv_flags & RTE_PCI_DRV_NEED_MAPPING) + rte_eal_pci_unmap_device(dev); + } + return ret; + } + } + + return 1; +err_return: + RTE_LOG(WARNING, EAL, "Requested device " PCI_PRI_FMT + " cannot be used\n", dev->addr.domain, dev->addr.bus, + dev->addr.devid, dev->addr.function); + return -1; +} + +/* * Detach device specified by its pci address. */ int -rte_eal_pci_detach(const struct rte_pci_addr *addr) +rte_eal_pci_detach(const char *device_name) { struct rte_pci_device *dev = NULL; - int ret = 0; + struct rte_pci_addr addr; + int ret = 1; - if (addr == NULL) + if (!device_name) return -1; + memset(&addr, 0, sizeof(addr)); + if (eal_parse_pci_DomBDF(device_name, &addr)) { + /* Device doesn't match PCI BDF naming format */ + return 1; + } + FOREACH_DEVICE_ON_PCIBUS(dev) { - if (rte_eal_compare_pci_addr(&dev->addr, addr)) + if (rte_eal_compare_pci_addr(&dev->addr, &addr)) continue; ret = rte_eal_pci_detach_dev(dev); @@ -383,8 +462,8 @@ rte_eal_pci_detach(const struct rte_pci_addr *addr) free(dev); return 0; } - return -1; + return ret; err_return: RTE_LOG(WARNING, EAL, "Requested device " PCI_PRI_FMT " cannot be used\n", dev->addr.domain, dev->addr.bus, diff --git a/lib/librte_eal/common/include/rte_bus.h b/lib/librte_eal/common/include/rte_bus.h index 4b4bb36..1214908 100644 --- a/lib/librte_eal/common/include/rte_bus.h +++ b/lib/librte_eal/common/include/rte_bus.h @@ -59,6 +59,8 @@ TAILQ_HEAD(rte_bus_list, rte_bus); /* Bus list exposed */ extern struct rte_bus_list rte_bus_list; +#define FOREACH_BUS(bus_p) TAILQ_FOREACH(bus_p, &rte_bus_list, next) + /** * Bus specific scan for devices attached on the bus. * For each bus object, the scan would be reponsible for finding devices and @@ -85,6 +87,33 @@ typedef int (*rte_bus_scan_t)(void); typedef int (*rte_bus_probe_t)(void); /** + * Attach a device to a bus, assuming it is 'connected' to the bus. + * A bus is responsible for scanning for devices. Attaching a new device is + * for reenabling the device after being detached/removed. + * + * @param device_name + * Name of the device to attach. + * + * @return + * 0 for successful attach + * !0 for unsuccessful attach (or incorrect device name) + */ +typedef int (*rte_bus_attach_t)(const char *device_name); + +/** + * Detach a named device from a bus. Implementation would check the existence + * of device on the bus and detach it. + * + * @param device_name + * Name of the device to detach + * + * @return + * 0 for successful detaching + * !0 if device not found or can't detach + */ +typedef int (*rte_bus_detach_t)(const char *device_name); + +/** * A structure describing a generic bus. */ struct rte_bus { @@ -92,6 +121,8 @@ struct rte_bus { const char *name; /**< Name of the bus */ rte_bus_scan_t scan; /**< Scan for devices attached to bus */ rte_bus_probe_t probe; /**< Probe devices on bus */ + rte_bus_attach_t attach; /**< Attach a named device */ + rte_bus_detach_t detach; /**< Detach a named device */ }; /** diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h index 53793f3..820b9df 100644 --- a/lib/librte_eal/common/include/rte_pci.h +++ b/lib/librte_eal/common/include/rte_pci.h @@ -421,6 +421,36 @@ int rte_eal_pci_probe(void); /** + * Search and attach a PCI device to PCI Bus + * Implements rte_bus->attach + * + * @param device_name + * Name of the device to search and attach + * + * @return + * 0 for successful removal of device + * >0 if device not found on bus + * <0 in case of error in removal. + */ +int +rte_eal_pci_attach(const char *device_name); + +/** + * Search and detach a PCI device from PCI Bus + * Implements rte_bus->detach + * + * @param device_name + * Name of the device to search and detach + * + * @return + * 0 for successful detaching of device + * >0 if device not found on bus + * <0 in case of error in removal. + */ +int +rte_eal_pci_detach(const char *device_name); + +/** * Map the PCI device resources in user space virtual memory address * * Note that driver should not call this function when flag @@ -494,21 +524,6 @@ void pci_unmap_resource(void *requested_addr, size_t size); int rte_eal_pci_probe_one(const struct rte_pci_addr *addr); /** - * Close the single PCI device. - * - * Scan the content of the PCI bus, and find the pci device specified by pci - * address, then call the remove() function for registered driver that has a - * matching entry in its id_table for discovered device. - * - * @param addr - * The PCI Bus-Device-Function address to close. - * @return - * - 0 on success. - * - Negative on error. - */ -int rte_eal_pci_detach(const struct rte_pci_addr *addr); - -/** * Dump the content of the PCI bus. * * @param f diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c index 51522af..4c562c5 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c @@ -720,6 +720,8 @@ struct rte_pci_bus rte_pci_bus = { .bus = { .scan = rte_eal_pci_scan, .probe = rte_eal_pci_probe, + .attach = rte_eal_pci_attach, + .detach = rte_eal_pci_detach, }, .device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list), .driver_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.driver_list),