From patchwork Tue Jan 23 13:59:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shreyansh Jain X-Patchwork-Id: 34346 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C8DE11B017; Tue, 23 Jan 2018 15:24:56 +0100 (CET) Received: from NAM02-BL2-obe.outbound.protection.outlook.com (mail-bl2nam02on0077.outbound.protection.outlook.com [104.47.38.77]) by dpdk.org (Postfix) with ESMTP id D5480A495 for ; Tue, 23 Jan 2018 15:24:53 +0100 (CET) Received: from BN6PR03CA0067.namprd03.prod.outlook.com (10.173.137.29) by BLUPR03MB1410.namprd03.prod.outlook.com (10.163.81.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.428.17; Tue, 23 Jan 2018 14:24:52 +0000 Received: from BY2FFO11OLC010.protection.gbl (2a01:111:f400:7c0c::159) by BN6PR03CA0067.outlook.office365.com (2603:10b6:404:4c::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.428.17 via Frontend Transport; Tue, 23 Jan 2018 14:24:52 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; dpdk.org; dkim=none (message not signed) header.d=none;dpdk.org; dmarc=fail action=none header.from=nxp.com; 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 BY2FFO11OLC010.mail.protection.outlook.com (10.1.15.21) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.428.12 via Frontend Transport; Tue, 23 Jan 2018 14:24:50 +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 w0NDj5Rg022838; Tue, 23 Jan 2018 06:45:24 -0700 From: Shreyansh Jain To: , CC: , , , Shreyansh Jain Date: Tue, 23 Jan 2018 19:29:05 +0530 Message-ID: <20180123135910.10755-6-shreyansh.jain@nxp.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180123135910.10755-1-shreyansh.jain@nxp.com> References: <20180102125749.2379-1-shreyansh.jain@nxp.com> <20180123135910.10755-1-shreyansh.jain@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131611910920308853; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(346002)(39380400002)(376002)(396003)(39860400002)(2980300002)(1109001)(1110001)(339900001)(199004)(189003)(316002)(104016004)(498600001)(16586007)(105606002)(106466001)(6666003)(2950100002)(54906003)(110136005)(2906002)(5660300001)(50466002)(8936002)(81166006)(50226002)(48376002)(8676002)(4326008)(81156014)(59450400001)(1076002)(356003)(36756003)(47776003)(53936002)(305945005)(86362001)(97736004)(85426001)(77096007)(51416003)(336011)(76176011)(26005)(68736007); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR03MB1410; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11OLC010; 1:hGmWvhtgB4eBxTPVLfZSMilCYj+51b2sjBnup42T+6VFMgKC8i6JrbOYh7dtU/qHoZ7Ns2Md7SewjeVZSfKBLP3vw7rxB7ZOacWzWSV5ygD/W6wC2B7wx0+QCOvN2kBn MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 9cd8b56a-7742-4d27-8875-08d5626d1114 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(5600026)(4604075)(2017052603307); SRVR:BLUPR03MB1410; X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB1410; 3:EpSej9So23bbsvX01xaFLuObOUYuJLwrPmGSTX151yRaXlR0FFXLW8I2svcPE1YqAK70duaPaMWw4+/Izibj5WVd0sky3CYstCCEpCfuEDas9xC3NoVEec2uJxVPpNv2X0RDGICav0FwOp9rUMvRfAg4YQiPoTKuJCkGwDJ5w2B3lqNwhoWHykgsEK665BiIp2dyxKj5X4+Hpi9DCqsa7aLp3yqBA7u/wwFbeX5CdIP72CZWMGTfQIqE5DTSCN8smYQ5zmZAZJKkAqBCPBhVYdAfb9HxD07rqLY/+WBVSOsdDtL3xfku/xr//ZgI21u3wiWQ4YWK5ulfaWxwGJ2rnf9FEJ8M+sX6Di27tn57tWY=; 25:i183hI3yjs5Qj0smdSt6Iek9hihYmse1NbpmInvfZv30/a6WcMsho2hSSDdzGo3HGEt63r5/h90SVHwjAt/HYPnmlozb9pA5j/VXxMC90RHxSwpyw/VrQgkcA+HLvPleNkOjzpL7/TU5IdiLXdQJ/c5UAJ5ct6ctvEBFt1FpAHRz/eQ9FXdgqYH0qEAaQbi9h1AIhnXJC7nBhmTHw08RKc1xWSYbIawgc5U8Izah20JrzSILUvyZC9UlKn7imIB7ubfsXtBA5NXzwtKD1tlTuJ7EgUc6aLMsUGq3FmbblOKMXQu9uvIXUzl6F6cjUgRvksYdgsPdxOY3/5Y+hD27tw== X-MS-TrafficTypeDiagnostic: BLUPR03MB1410: X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB1410; 31:8ScnN2aK9yBN+BFjo/mJpqoW9b+E+CjK7HXacxK6V8lU2OqvemLNEJ/stk2eaiR/8gWKWvw4qop2iHPTb5HswGE+QfEPzEAVLcltY+HQChiFcb/lAk2rXI9jv9LrYplxueXty/j8V5RdY4L5j+WAdjQAcdNTgXcT0ofpO6UwrObzwiSc8f+Hc2EDYRNG/GCHUR0+rm8EdidFGAx9ZuSVm4jQTk1eeuAh4uqbC0UCQBA=; 4:ksn4/cWNUOhjJ4diQrfG791cqnCrvFD+ONHjqwB7UbZptqW7n0dS0qz2GI2LXskBtJurfcZyRPbH6QNV+Hn9rKiI0mZd1+4UydhoUFbJMCKaWWCdlnowmTwAjDMvCh55+KLocGxtKBch3JWyytqYGy774NLr+CBERej8wwEc9g4k/BjP8SJjym+QAc7QQYtGtz4deqeOQSB0Sx63O4m9K8fT3GBInho+Nfsz1RWEQQsqoStU54/9sBSJzsHrFxAqn99rEa9V1TpdnQSsm7JR986BUuRM8xmO4yg3HF0RkjI41swFgRUFkqhUfThuO6si X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(2401047)(8121501046)(5005006)(3002001)(10201501046)(3231023)(2400081)(944501161)(93006095)(93001095)(6055026)(6096035)(20161123565025)(20161123563025)(201703131430075)(201703131433075)(201703131448075)(201703151042153)(20161123559100)(20161123561025)(20161123556025)(201708071742011); SRVR:BLUPR03MB1410; BCL:0; PCL:0; RULEID:(100000803101)(100110400095)(400006); SRVR:BLUPR03MB1410; X-Forefront-PRVS: 05610E64EE X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR03MB1410; 23:DUxmd59p+fnTFUTV2FryW/xkVB+KagXnC5KIIz888?= YeJIAdgyk3sg9MH/VU2LNkkJ82ok5MVt0AL3nN7JQUqgra/fgG9rAvhCg0GXlqPuFzYZwOE4YGjiNc7EH1/20Fbt3V+QVsSxhj96yYTYNRZSdyHiD9su6XB2z4SZA3rVc76sL4D4NWbKevDXWqNohHc8LvxA5TIBa+d36shYMwiRFW9PgsUAwRBqHJrc1zUrzaVbZXEMMwWdVjiINxniSuSq7pwW1HHaWHHwXI36t9SYE92igJVspKVyc+4mZm//AOeSQrPDAki2oG4p/8/TWDqKfNB18HNyvgP0XFkn+Ei7tqBc55jj36DMcLBBVjd5NohHmFckuMZnvFcvo9JVx+Q84tBzTyGbWbIFjx0Ki5eGXdykjM812Cy6tQEcq0WH0mHSBXHjTRVUYHKCj4gTTE7VKI+SRZEmRK9onddw6ANUCs48aqx6eZaqYifMehST27GiF2aRYQgiGw+my7astmIiFTw7F4x3aveeoy9lRCWQehty3jmPq0Rir+6O8UM7z/YgG8zvL1H49FuPunfrev5Kdp/IA7v6b26qUlA3T89Vm7BytyuNH//w+pnIIU3D+FViR2uYtx9J08bBdvoEi2HcxOwVcCZ13BlaBMt+FmL1Xn85uAFOQlYFo/E4QBkNUt9g/KzhMpnlPYuMmcM8H7vGjX7Rfe1zpilW5xA8QYNQwESiwW3MMdw+r1lqJhln68r0g0Z8Ui9abKaIKdQzTazKPctULRuZHTZfs6lDszIDCzA07ZAJ7X8H4hr9HoCFtapA0h+XYgEqTqMWQ3bFXwIyl6iPVXJtGf6HFVYCXtrYLsVSrgFi9EOUJyqJtF0NIWOz5eNBXr7hPLYqMZuGM3hDYECgcVCMu1UNONfRk98SAho2bu4004HpEEf1If70Cz/TUiVIOotN/HBBGT+pc3tgvff+/5CsZwI4loweOGBm+5FQxaLbbXiT7W+1oaoHxAC+IoS+iVeSh2vvbDKjbtR0p0zJiAAzcd5bKuPbXY04hDlS2qWszLfLaQVyY0afi+CjZ/9xK9EtWiQcMsXsi3Q3AjR4wMzAqUnLq8BxBdLGQ== X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB1410; 6:Jq4e30KVLNQPGc1SvC3o4HAgoTJz5y92TYJylrtt36mjRrqt4E4cxj042aJj7Itn2dNTpq2hEAjcnd9BKV0h3I4CGc5rqazC2D3urb2waNUM2Y67dv8A5klBdbKbvNY8f/Xs1JkLp3TiSC5jm0GCzAQfZ/Gi3nLtdco3iM7p3IGRaiM8YuB/j69A7z+ryUbsHcnAxTbEkwXysAlsoxqbF84T+s3Z6DhPpI/4wd5aUGe2gBHCLk8sRmcig9aqVkWPztqn/KofV7Y6/4dhZ8DBD19hTJkon7w5eWCHBUHqIvVYhjlw8TTRXru+9tC99He5GwTV8IsvwOJXBrmHSDon11EdaERlwTroFRvclwT5ZQA=; 5:yYqVib2DErZ9P225cjp5LMVkk6X4YRvxOPyrkUme4hK3hOMJbYChP0/gm8di+FpXcXmXwb4XrlVqlfdmZRXSevBE9nCg7jIg1cv4VT0ve4Om6DnU7o/kEW1dw1++SNT3n208573aOXErmYX1XHMUraYvoTOI8LGYNXGLhNxosmI=; 24:DBraQqbr5WJeGajbFvf+BDsZKc9cHAba8Tm/oCkJTAwFyzUfJgZBvc04rPKleAhekPPWNw36yA+Zu9U8lEAc6OIlgDWxhX3m7BTpZHhGmB4=; 7:ydlX7XAXNhSi0IQwu0L0SyhuBHOCopiU3sf9MME+wj5GmkkH0cEfgAffjmWryN29tYxTqAKcg2RBiBY69oKbJUJZ2oAcZkHCWsQ6LDNeQjkokiDIdBj7d/vcDYP+BJwUZDBNqaZUp8vKtyRshER4GTMxIN1rbUVs1vqYc3YxJ6MHvlO2+5De6JcbY5BktB467298lSoKm+WO+VyHMsxqKrPkTmjfFKaJaYefC3v8PtBaVUqm1ztOGBqiwOGJsTJA SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jan 2018 14:24:50.2056 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9cd8b56a-7742-4d27-8875-08d5626d1114 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: BLUPR03MB1410 Subject: [dpdk-dev] [PATCH v2 05/10] rawdev: support for firmware management 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" Some generic operations for firmware management can loading, unloading, starting, stopping and querying firmware of a device. This patch adds support for such generic operations. Signed-off-by: Shreyansh Jain --- lib/librte_rawdev/rte_rawdev.c | 43 ++++++++++++++++++++ lib/librte_rawdev/rte_rawdev.h | 64 +++++++++++++++++++++++++++++ lib/librte_rawdev/rte_rawdev_pmd.h | 70 ++++++++++++++++++++++++++++++++ lib/librte_rawdev/rte_rawdev_version.map | 4 ++ 4 files changed, 181 insertions(+) diff --git a/lib/librte_rawdev/rte_rawdev.c b/lib/librte_rawdev/rte_rawdev.c index 3a7800a45..c1001b34b 100644 --- a/lib/librte_rawdev/rte_rawdev.c +++ b/lib/librte_rawdev/rte_rawdev.c @@ -320,6 +320,49 @@ rte_rawdev_xstats_reset(uint16_t dev_id, return (*dev->dev_ops->xstats_reset)(dev, ids, nb_ids); } +int +rte_rawdev_firmware_status_get(uint16_t dev_id, rte_rawdev_obj_t status_info) +{ + RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL); + struct rte_rawdev *dev = &rte_rawdevs[dev_id]; + + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->firmware_status_get, -ENOTSUP); + return (*dev->dev_ops->firmware_status_get)(dev, status_info); +} + +int +rte_rawdev_firmware_version_get(uint16_t dev_id, rte_rawdev_obj_t version_info) +{ + RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL); + struct rte_rawdev *dev = &rte_rawdevs[dev_id]; + + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->firmware_version_get, -ENOTSUP); + return (*dev->dev_ops->firmware_version_get)(dev, version_info); +} + +int +rte_rawdev_firmware_load(uint16_t dev_id, rte_rawdev_obj_t firmware_image) +{ + RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL); + struct rte_rawdev *dev = &rte_rawdevs[dev_id]; + + if (!firmware_image) + return -EINVAL; + + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->firmware_load, -ENOTSUP); + return (*dev->dev_ops->firmware_load)(dev, firmware_image); +} + +int +rte_rawdev_firmware_unload(uint16_t dev_id) +{ + RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL); + struct rte_rawdev *dev = &rte_rawdevs[dev_id]; + + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->firmware_load, -ENOTSUP); + return (*dev->dev_ops->firmware_unload)(dev); +} + int rte_rawdev_start(uint16_t dev_id) { diff --git a/lib/librte_rawdev/rte_rawdev.h b/lib/librte_rawdev/rte_rawdev.h index 221f85856..388a24cf0 100644 --- a/lib/librte_rawdev/rte_rawdev.h +++ b/lib/librte_rawdev/rte_rawdev.h @@ -513,6 +513,70 @@ rte_rawdev_xstats_reset(uint16_t dev_id, const uint32_t ids[], uint32_t nb_ids); +/** + * Get Firmware status of the device.. + * Returns a memory allocated by driver/implementation containing status + * information block. It is responsibility of caller to release the buffer. + * + * @param dev_id + * Raw device identifier + * @param status_info + * Pointer to status information area. Caller is responsible for releasing + * the memory associated. + * @return + * 0 for success, + * !0 for failure, `status_info` argument state is undefined + */ +int +rte_rawdev_firmware_status_get(uint16_t dev_id, + rte_rawdev_obj_t status_info); + +/** + * Get Firmware version of the device. + * Returns a memory allocated by driver/implementation containing version + * information block. It is responsibility of caller to release the buffer. + * + * @param dev_id + * Raw device identifier + * @param version_info + * Pointer to version information area. Caller is responsible for releasing + * the memory associated. + * @return + * 0 for success, + * !0 for failure, `version_info` argument state is undefined + */ +int +rte_rawdev_firmware_version_get(uint16_t dev_id, + rte_rawdev_obj_t version_info); + +/** + * Load firmware on the device. + * TODO: In future, methods like directly flashing from file too can be + * supported. + * + * @param dev_id + * Raw device identifier + * @param firmware_image + * Pointer to buffer containing image binary data + * @return + * 0 for successful load + * !0 for failure to load the provided image, or image incorrect. + */ +int +rte_rawdev_firmware_load(uint16_t dev_id, rte_rawdev_obj_t firmware_image); + +/** + * Unload firmware from the device. + * + * @param dev_id + * Raw device identifiers + * @return + * 0 for successful Unload + * !0 for failure in unloading + */ +int +rte_rawdev_firmware_unload(uint16_t dev_id); + #ifdef __cplusplus } #endif diff --git a/lib/librte_rawdev/rte_rawdev_pmd.h b/lib/librte_rawdev/rte_rawdev_pmd.h index fd94b39c3..a8da39343 100644 --- a/lib/librte_rawdev/rte_rawdev_pmd.h +++ b/lib/librte_rawdev/rte_rawdev_pmd.h @@ -414,6 +414,67 @@ typedef int (*rawdev_xstats_get_names_t)(const struct rte_rawdev *dev, typedef uint64_t (*rawdev_xstats_get_by_name_t)(const struct rte_rawdev *dev, const char *name, unsigned int *id); + +/** + * Get firmware/device-stack status. + * Implementation to allocate buffer for returning information. + * + * @param dev + * Raw device pointer + * @param status + * void block containing device specific status information + * @return + * 0 for success, + * !0 for failure, with undefined value in `status_info` + */ +typedef int (*rawdev_firmware_status_get_t)(struct rte_rawdev *dev, + rte_rawdev_obj_t status_info); + +/** + * Get firmware version information + * + * @param dev + * Raw device pointer + * @param version_info + * void pointer to version information returned by device + * @return + * 0 for success, + * !0 for failure, with undefined value in `version_info` + */ +typedef int (*rawdev_firmware_version_get_t)(struct rte_rawdev *dev, + rte_rawdev_obj_t version_info); + +/** + * Load firwmare from a buffer (DMA'able) + * + * @param dev + * Raw device pointer + * @param firmware_file + * file pointer to firmware area + * @return + * >0, ~0: for successful load + * <0: for failure + * + * @see Application may use 'firmware_version_get` for ascertaining successful + * load + */ +typedef int (*rawdev_firmware_load_t)(struct rte_rawdev *dev, + rte_rawdev_obj_t firmware_buf); + +/** + * Unload firwmare + * + * @param dev + * Raw device pointer + * @return + * >0, ~0 for successful unloading + * <0 for failure in unloading + * + * Note: Application can use the `firmware_status_get` or + * `firmware_version_get` to get result of unload. + */ +typedef int (*rawdev_firmware_unload_t)(struct rte_rawdev *dev); + /** Rawdevice operations function pointer table */ struct rte_rawdev_ops { /**< Get device info. */ @@ -458,6 +519,15 @@ struct rte_rawdev_ops { rawdev_xstats_get_by_name_t xstats_get_by_name; /**< Reset the statistics values in xstats. */ rawdev_xstats_reset_t xstats_reset; + + /**< Obtainer firmware status */ + rawdev_firmware_status_get_t firmware_status_get; + /**< Obtain firmware version information */ + rawdev_firmware_version_get_t firmware_version_get; + /**< Load firmware */ + rawdev_firmware_load_t firmware_load; + /**< Unload firmware */ + rawdev_firmware_unload_t firmware_unload; }; /** diff --git a/lib/librte_rawdev/rte_rawdev_version.map b/lib/librte_rawdev/rte_rawdev_version.map index 469b78d81..8de9abdc4 100644 --- a/lib/librte_rawdev/rte_rawdev_version.map +++ b/lib/librte_rawdev/rte_rawdev_version.map @@ -6,6 +6,10 @@ EXPERIMENTAL { rte_rawdev_count; rte_rawdev_dequeue_buffers; rte_rawdev_enqueue_buffers; + rte_rawdev_firmware_load; + rte_rawdev_firmware_status_get; + rte_rawdev_firmware_unload; + rte_rawdev_firmware_version_get; rte_rawdev_get_attr; rte_rawdev_get_dev_id; rte_rawdev_info_get;