From patchwork Tue Feb 7 15:13:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerin Jacob Kollanukkaran X-Patchwork-Id: 123259 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id BA12041C30; Tue, 7 Feb 2023 16:13:57 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6077D427F5; Tue, 7 Feb 2023 16:13:45 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id 26767427F5 for ; Tue, 7 Feb 2023 16:13:44 +0100 (CET) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 317EdPWX011264; Tue, 7 Feb 2023 07:13:43 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=+qrFVdZdihsqAtrh8xmMKPCojouHLHETmWCqZPOOcZo=; b=chZG4tuf9VzwxFggH/4iFa7BAufxPH4BLCxHi9+aIjEfA6oE/dcsuRekLjd/gmumP+Mx R8SejcTbNJJRT0ny4ThypBc+Zb4uTF3fpJDSPps9Hp6BWsExdUDuOnGTTsWLTON4Jk3I rPPAvcqpdfYJzjeQu5gvvSeniiw7QeEhuWAcB2JOgHtjr0sk/jnzeXBj1XUPrXGzFhZu rGX3VEwsER38oq01h19hTPo0cgwJSqlH1rpkdd9n0wO2QLi3uWJDNaJzVVS/IyP3qUY+ Kt4kay7OkUwHe/wwr2wk7MHjUkDdcTEk2VFFLcxTcyNY05BdcO6VkMPUxZnVb16AgMvK 6w== Received: from dc5-exch02.marvell.com ([199.233.59.182]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3nkdyrsk1v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Tue, 07 Feb 2023 07:13:43 -0800 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Tue, 7 Feb 2023 07:13:41 -0800 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.42 via Frontend Transport; Tue, 7 Feb 2023 07:13:41 -0800 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id E9CEF3F7083; Tue, 7 Feb 2023 07:13:38 -0800 (PST) From: To: , Srikanth Yalavarthi CC: , , , , , Jerin Jacob Subject: [dpdk-dev] [PATCH v3 03/12] mldev: support ML device handling functions Date: Tue, 7 Feb 2023 20:43:07 +0530 Message-ID: <20230207151316.835441-4-jerinj@marvell.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230207151316.835441-1-jerinj@marvell.com> References: <20230206202453.336280-1-jerinj@marvell.com> <20230207151316.835441-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-ORIG-GUID: htZCRTZOl1Bhdvl7ZcU8BpnlSnHqlJnx X-Proofpoint-GUID: htZCRTZOl1Bhdvl7ZcU8BpnlSnHqlJnx X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.930,Hydra:6.0.562,FMLib:17.11.122.1 definitions=2023-02-07_07,2023-02-06_03,2022-06-22_01 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Srikanth Yalavarthi Added ML device handling APIs. These APIs are used to get device information, configure, start, stop and close ML devices. Added function prototypes to PMD layer which are used by the ML driver implementations in the poll mode driver. Signed-off-by: Srikanth Yalavarthi Signed-off-by: Jerin Jacob --- lib/mldev/rte_mldev.c | 175 +++++++++++++++++++++++++++++++++++++ lib/mldev/rte_mldev_core.h | 107 +++++++++++++++++++++++ lib/mldev/version.map | 8 ++ 3 files changed, 290 insertions(+) diff --git a/lib/mldev/rte_mldev.c b/lib/mldev/rte_mldev.c index 833afcbf87..961e12d150 100644 --- a/lib/mldev/rte_mldev.c +++ b/lib/mldev/rte_mldev.c @@ -177,4 +177,179 @@ rte_ml_dev_init(size_t dev_max) return 0; } +uint16_t +rte_ml_dev_count(void) +{ + return ml_dev_globals.nb_devs; +} + +int +rte_ml_dev_is_valid_dev(int16_t dev_id) +{ + struct rte_ml_dev *dev = NULL; + + if (dev_id >= ml_dev_globals.max_devs || ml_dev_globals.devs[dev_id].data == NULL) + return 0; + + dev = rte_ml_dev_pmd_get_dev(dev_id); + if (dev->attached != ML_DEV_ATTACHED) + return 0; + else + return 1; +} + +int +rte_ml_dev_socket_id(int16_t dev_id) +{ + struct rte_ml_dev *dev; + + if (!rte_ml_dev_is_valid_dev(dev_id)) { + RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); + return -EINVAL; + } + + dev = rte_ml_dev_pmd_get_dev(dev_id); + + return dev->data->socket_id; +} + +int +rte_ml_dev_info_get(int16_t dev_id, struct rte_ml_dev_info *dev_info) +{ + struct rte_ml_dev *dev; + + if (!rte_ml_dev_is_valid_dev(dev_id)) { + RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); + return -EINVAL; + } + + dev = rte_ml_dev_pmd_get_dev(dev_id); + if (*dev->dev_ops->dev_info_get == NULL) + return -ENOTSUP; + + if (dev_info == NULL) { + RTE_MLDEV_LOG(ERR, "Dev %d, dev_info cannot be NULL\n", dev_id); + return -EINVAL; + } + memset(dev_info, 0, sizeof(struct rte_ml_dev_info)); + + return (*dev->dev_ops->dev_info_get)(dev, dev_info); +} + +int +rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *config) +{ + struct rte_ml_dev_info dev_info; + struct rte_ml_dev *dev; + int ret; + + if (!rte_ml_dev_is_valid_dev(dev_id)) { + RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); + return -EINVAL; + } + + dev = rte_ml_dev_pmd_get_dev(dev_id); + if (*dev->dev_ops->dev_configure == NULL) + return -ENOTSUP; + + if (dev->data->dev_started) { + RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id); + return -EBUSY; + } + + if (config == NULL) { + RTE_MLDEV_LOG(ERR, "Dev %d, config cannot be NULL\n", dev_id); + return -EINVAL; + } + + ret = rte_ml_dev_info_get(dev_id, &dev_info); + if (ret < 0) + return ret; + + if (config->nb_queue_pairs > dev_info.max_queue_pairs) { + RTE_MLDEV_LOG(ERR, "Device %d num of queues %u > %u\n", dev_id, + config->nb_queue_pairs, dev_info.max_queue_pairs); + return -EINVAL; + } + + return (*dev->dev_ops->dev_configure)(dev, config); +} + +int +rte_ml_dev_close(int16_t dev_id) +{ + struct rte_ml_dev *dev; + + if (!rte_ml_dev_is_valid_dev(dev_id)) { + RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); + return -EINVAL; + } + + dev = rte_ml_dev_pmd_get_dev(dev_id); + if (*dev->dev_ops->dev_close == NULL) + return -ENOTSUP; + + /* Device must be stopped before it can be closed */ + if (dev->data->dev_started == 1) { + RTE_MLDEV_LOG(ERR, "Device %d must be stopped before closing", dev_id); + return -EBUSY; + } + + return (*dev->dev_ops->dev_close)(dev); +} + +int +rte_ml_dev_start(int16_t dev_id) +{ + struct rte_ml_dev *dev; + int ret; + + if (!rte_ml_dev_is_valid_dev(dev_id)) { + RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); + return -EINVAL; + } + + dev = rte_ml_dev_pmd_get_dev(dev_id); + if (*dev->dev_ops->dev_start == NULL) + return -ENOTSUP; + + if (dev->data->dev_started != 0) { + RTE_MLDEV_LOG(ERR, "Device %d is already started", dev_id); + return -EBUSY; + } + + ret = (*dev->dev_ops->dev_start)(dev); + if (ret == 0) + dev->data->dev_started = 1; + + return ret; +} + +int +rte_ml_dev_stop(int16_t dev_id) +{ + struct rte_ml_dev *dev; + int ret; + + if (!rte_ml_dev_is_valid_dev(dev_id)) { + RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); + return -EINVAL; + } + + dev = rte_ml_dev_pmd_get_dev(dev_id); + if (*dev->dev_ops->dev_stop == NULL) + return -ENOTSUP; + + if (dev->data->dev_started == 0) { + RTE_MLDEV_LOG(ERR, "Device %d is not started", dev_id); + return -EBUSY; + } + + ret = (*dev->dev_ops->dev_stop)(dev); + if (ret == 0) + dev->data->dev_started = 0; + + return ret; +} + RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO); diff --git a/lib/mldev/rte_mldev_core.h b/lib/mldev/rte_mldev_core.h index 1564d0fa4d..dc79c5f630 100644 --- a/lib/mldev/rte_mldev_core.h +++ b/lib/mldev/rte_mldev_core.h @@ -31,6 +31,110 @@ extern "C" { #define ML_DEV_DETACHED (0) #define ML_DEV_ATTACHED (1) +struct rte_ml_dev; + +/** + * Definitions of all functions exported by a driver through the generic structure of type + * *ml_dev_ops* supplied in the *rte_ml_dev* structure associated with a device. + */ + +/** + * @internal + * + * Function used to get device information. + * + * @param dev + * ML device pointer. + * @param dev_info + * Pointer to info structure. + * + * @return + * - 0 on success. + * - < 0, error code on failure. + */ +typedef int (*mldev_info_get_t)(struct rte_ml_dev *dev, struct rte_ml_dev_info *dev_info); + +/** + * @internal + * + * Function used to configure device. + * + * @param dev + * ML device pointer. + * @param config + * ML device configurations. + * + * @return + * - 0 on success + * - < 0, error code on failure. + */ +typedef int (*mldev_configure_t)(struct rte_ml_dev *dev, const struct rte_ml_dev_config *config); + +/** + * @internal + * + * Function used to close a configured device. + * + * @param dev + * ML device pointer. + * + * @return + * - 0 on success. + * - -EAGAIN if can't close as device is busy. + * - < 0, error code on failure, other than busy. + */ +typedef int (*mldev_close_t)(struct rte_ml_dev *dev); + +/** + * @internal + * + * Function used to start a configured device. + * + * @param dev + * ML device pointer. + * + * @return + * - 0 on success. + * - < 0, error code on failure. + */ +typedef int (*mldev_start_t)(struct rte_ml_dev *dev); + +/** + * @internal + * + * Function used to stop a configured device. + * + * @param dev + * ML device pointer. + * + * @return + * - 0 on success. + * - < 0, error code on failure. + */ +typedef int (*mldev_stop_t)(struct rte_ml_dev *dev); + +/** + * @internal + * + * ML device operations function pointer table. + */ +struct rte_ml_dev_ops { + /** Get device information. */ + mldev_info_get_t dev_info_get; + + /** Configure device. */ + mldev_configure_t dev_configure; + + /** Close device. */ + mldev_close_t dev_close; + + /** Start device. */ + mldev_start_t dev_start; + + /** Stop device. */ + mldev_stop_t dev_stop; +}; + /** * @internal * @@ -75,6 +179,9 @@ struct rte_ml_dev { /** Pointer to device data. */ struct rte_ml_dev_data *data; + /** Functions exported by PMD. */ + struct rte_ml_dev_ops *dev_ops; + /** Backing RTE device. */ struct rte_device *device; diff --git a/lib/mldev/version.map b/lib/mldev/version.map index d6bf7c8ebb..028b6a464d 100644 --- a/lib/mldev/version.map +++ b/lib/mldev/version.map @@ -1,8 +1,16 @@ EXPERIMENTAL { global: + rte_ml_dev_close; + rte_ml_dev_configure; + rte_ml_dev_count; + rte_ml_dev_info_get; rte_ml_dev_init; + rte_ml_dev_is_valid_dev; rte_ml_dev_logtype; + rte_ml_dev_socket_id; + rte_ml_dev_start; + rte_ml_dev_stop; local: *; };