From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2633545977; Fri, 13 Sep 2024 08:00:56 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0BAAE42E71; Fri, 13 Sep 2024 08:00:14 +0200 (CEST) Received: from inva020.nxp.com (inva020.nxp.com [92.121.34.13]) by mails.dpdk.org (Postfix) with ESMTP id 21053402C8 for ; Fri, 13 Sep 2024 08:00:06 +0200 (CEST) Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 0246F1A012E; Fri, 13 Sep 2024 08:00:06 +0200 (CEST) Received: from aprdc01srsp001v.ap-rdc01.nxp.com (aprdc01srsp001v.ap-rdc01.nxp.com [165.114.16.16]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 3DD4A1A1DAE; Fri, 13 Sep 2024 08:00:05 +0200 (CEST) Received: from lsv03379.swis.in-blr01.nxp.com (lsv03379.swis.in-blr01.nxp.com [92.120.147.188]) by aprdc01srsp001v.ap-rdc01.nxp.com (Postfix) with ESMTP id C2239183DC03; Fri, 13 Sep 2024 14:00:02 +0800 (+08) From: vanshika.shukla@nxp.com To: dev@dpdk.org, Hemant Agrawal , Sachin Saxena , Anatoly Burakov Cc: Rohit Raj Subject: [v1 06/43] bus/fslmc: add close API to close DPAA2 device Date: Fri, 13 Sep 2024 11:29:22 +0530 Message-Id: <20240913055959.3246917-7-vanshika.shukla@nxp.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240913055959.3246917-1-vanshika.shukla@nxp.com> References: <20240913055959.3246917-1-vanshika.shukla@nxp.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Virus-Scanned: ClamAV using ClamSMTP 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: Rohit Raj Add rte_fslmc_close API to close all the DPAA2 devices while closing the DPDK application. Signed-off-by: Rohit Raj --- drivers/bus/fslmc/bus_fslmc_driver.h | 3 + drivers/bus/fslmc/fslmc_bus.c | 13 ++++ drivers/bus/fslmc/fslmc_vfio.c | 87 ++++++++++++++++++++++++ drivers/bus/fslmc/fslmc_vfio.h | 3 +- drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c | 31 ++++++++- drivers/bus/fslmc/portal/dpaa2_hw_dpci.c | 32 ++++++++- drivers/bus/fslmc/portal/dpaa2_hw_dpio.c | 34 +++++++++ drivers/event/dpaa2/dpaa2_hw_dpcon.c | 32 ++++++++- drivers/net/dpaa2/dpaa2_mux.c | 18 ++++- drivers/net/dpaa2/rte_pmd_dpaa2.h | 5 +- 10 files changed, 252 insertions(+), 6 deletions(-) diff --git a/drivers/bus/fslmc/bus_fslmc_driver.h b/drivers/bus/fslmc/bus_fslmc_driver.h index 7ac5fe6ff1..dc2f395f60 100644 --- a/drivers/bus/fslmc/bus_fslmc_driver.h +++ b/drivers/bus/fslmc/bus_fslmc_driver.h @@ -98,6 +98,8 @@ typedef int (*rte_dpaa2_obj_create_t)(int vdev_fd, struct vfio_device_info *obj_info, int object_id); +typedef void (*rte_dpaa2_obj_close_t)(int object_id); + /** * A structure describing a DPAA2 object. */ @@ -106,6 +108,7 @@ struct rte_dpaa2_object { const char *name; /**< Name of Object. */ enum rte_dpaa2_dev_type dev_type; /**< Type of device */ rte_dpaa2_obj_create_t create; + rte_dpaa2_obj_close_t close; }; /** diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c index c155f4a2fd..7baadf99b9 100644 --- a/drivers/bus/fslmc/fslmc_bus.c +++ b/drivers/bus/fslmc/fslmc_bus.c @@ -384,6 +384,18 @@ rte_fslmc_match(struct rte_dpaa2_driver *dpaa2_drv, return 1; } +static int +rte_fslmc_close(void) +{ + int ret = 0; + + ret = fslmc_vfio_close_group(); + if (ret) + DPAA2_BUS_ERR("Unable to close devices %d", ret); + + return 0; +} + static int rte_fslmc_probe(void) { @@ -664,6 +676,7 @@ struct rte_fslmc_bus rte_fslmc_bus = { .bus = { .scan = rte_fslmc_scan, .probe = rte_fslmc_probe, + .cleanup = rte_fslmc_close, .parse = rte_fslmc_parse, .find_device = rte_fslmc_find_device, .get_iommu_class = rte_dpaa2_get_iommu_class, diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c index e12fd62f34..17163333af 100644 --- a/drivers/bus/fslmc/fslmc_vfio.c +++ b/drivers/bus/fslmc/fslmc_vfio.c @@ -702,6 +702,54 @@ rte_dpaa2_vfio_setup_intr(struct rte_intr_handle *intr_handle, return -1; } +static void +fslmc_close_iodevices(struct rte_dpaa2_device *dev) +{ + struct rte_dpaa2_object *object = NULL; + struct rte_dpaa2_driver *drv; + int ret, probe_all; + + switch (dev->dev_type) { + case DPAA2_IO: + case DPAA2_CON: + case DPAA2_CI: + case DPAA2_BPOOL: + case DPAA2_MUX: + TAILQ_FOREACH(object, &dpaa2_obj_list, next) { + if (dev->dev_type == object->dev_type) + object->close(dev->object_id); + else + continue; + } + break; + case DPAA2_ETH: + case DPAA2_CRYPTO: + case DPAA2_QDMA: + probe_all = rte_fslmc_bus.bus.conf.scan_mode != + RTE_BUS_SCAN_ALLOWLIST; + TAILQ_FOREACH(drv, &rte_fslmc_bus.driver_list, next) { + if (drv->drv_type != dev->dev_type) + continue; + if (rte_dev_is_probed(&dev->device)) + continue; + if (probe_all || + (dev->device.devargs && + dev->device.devargs->policy == + RTE_DEV_ALLOWED)) { + ret = drv->remove(dev); + if (ret) + DPAA2_BUS_ERR("Unable to remove"); + } + } + break; + default: + break; + } + + DPAA2_BUS_LOG(DEBUG, "Device (%s) Closed", + dev->device.name); +} + /* * fslmc_process_iodevices for processing only IO (ETH, CRYPTO, and possibly * EVENT) devices. @@ -807,6 +855,45 @@ fslmc_process_mcp(struct rte_dpaa2_device *dev) return ret; } +int +fslmc_vfio_close_group(void) +{ + struct rte_dpaa2_device *dev, *dev_temp; + + RTE_TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) { + if (dev->device.devargs && + dev->device.devargs->policy == RTE_DEV_BLOCKED) { + DPAA2_BUS_LOG(DEBUG, "%s Blacklisted, skipping", + dev->device.name); + TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next); + continue; + } + switch (dev->dev_type) { + case DPAA2_ETH: + case DPAA2_CRYPTO: + case DPAA2_QDMA: + case DPAA2_IO: + fslmc_close_iodevices(dev); + break; + case DPAA2_CON: + case DPAA2_CI: + case DPAA2_BPOOL: + case DPAA2_MUX: + if (rte_eal_process_type() == RTE_PROC_SECONDARY) + continue; + + fslmc_close_iodevices(dev); + break; + case DPAA2_DPRTC: + default: + DPAA2_BUS_DEBUG("Device cannot be closed: Not supported (%s)", + dev->device.name); + } + } + + return 0; +} + int fslmc_vfio_process_group(void) { diff --git a/drivers/bus/fslmc/fslmc_vfio.h b/drivers/bus/fslmc/fslmc_vfio.h index 133606a9fd..b6677bdd18 100644 --- a/drivers/bus/fslmc/fslmc_vfio.h +++ b/drivers/bus/fslmc/fslmc_vfio.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause * * Copyright (c) 2015-2016 Freescale Semiconductor, Inc. All rights reserved. - * Copyright 2016,2019 NXP + * Copyright 2016,2019-2020 NXP * */ @@ -55,6 +55,7 @@ int rte_dpaa2_vfio_setup_intr(struct rte_intr_handle *intr_handle, int fslmc_vfio_setup_group(void); int fslmc_vfio_process_group(void); +int fslmc_vfio_close_group(void); char *fslmc_get_container(void); int fslmc_get_container_group(int *gropuid); int rte_fslmc_vfio_dmamap(void); diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c index d7f6e45b7d..bc36607e64 100644 --- a/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c +++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause * * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. - * Copyright 2016 NXP + * Copyright 2016,2020 NXP * */ @@ -33,6 +33,19 @@ TAILQ_HEAD(dpbp_dev_list, dpaa2_dpbp_dev); static struct dpbp_dev_list dpbp_dev_list = TAILQ_HEAD_INITIALIZER(dpbp_dev_list); /*!< DPBP device list */ +static struct dpaa2_dpbp_dev *get_dpbp_from_id(uint32_t dpbp_id) +{ + struct dpaa2_dpbp_dev *dpbp_dev = NULL; + + /* Get DPBP dev handle from list using index */ + TAILQ_FOREACH(dpbp_dev, &dpbp_dev_list, next) { + if (dpbp_dev->dpbp_id == dpbp_id) + break; + } + + return dpbp_dev; +} + static int dpaa2_create_dpbp_device(int vdev_fd __rte_unused, struct vfio_device_info *obj_info __rte_unused, @@ -116,9 +129,25 @@ int dpaa2_dpbp_supported(void) return 0; } +static void +dpaa2_close_dpbp_device(int object_id) +{ + struct dpaa2_dpbp_dev *dpbp_dev = NULL; + + dpbp_dev = get_dpbp_from_id((uint32_t)object_id); + + if (dpbp_dev) { + dpaa2_free_dpbp_dev(dpbp_dev); + dpbp_close(&dpbp_dev->dpbp, CMD_PRI_LOW, dpbp_dev->token); + TAILQ_REMOVE(&dpbp_dev_list, dpbp_dev, next); + rte_free(dpbp_dev); + } +} + static struct rte_dpaa2_object rte_dpaa2_dpbp_obj = { .dev_type = DPAA2_BPOOL, .create = dpaa2_create_dpbp_device, + .close = dpaa2_close_dpbp_device, }; RTE_PMD_REGISTER_DPAA2_OBJECT(dpbp, rte_dpaa2_dpbp_obj); diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c index 07256ed7ec..d7de2bca05 100644 --- a/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c +++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * - * Copyright 2017 NXP + * Copyright 2017,2020 NXP * */ @@ -30,6 +30,19 @@ TAILQ_HEAD(dpci_dev_list, dpaa2_dpci_dev); static struct dpci_dev_list dpci_dev_list = TAILQ_HEAD_INITIALIZER(dpci_dev_list); /*!< DPCI device list */ +static struct dpaa2_dpci_dev *get_dpci_from_id(uint32_t dpci_id) +{ + struct dpaa2_dpci_dev *dpci_dev = NULL; + + /* Get DPCI dev handle from list using index */ + TAILQ_FOREACH(dpci_dev, &dpci_dev_list, next) { + if (dpci_dev->dpci_id == dpci_id) + break; + } + + return dpci_dev; +} + static int rte_dpaa2_create_dpci_device(int vdev_fd __rte_unused, struct vfio_device_info *obj_info __rte_unused, @@ -179,9 +192,26 @@ void rte_dpaa2_free_dpci_dev(struct dpaa2_dpci_dev *dpci) } } + +static void +rte_dpaa2_close_dpci_device(int object_id) +{ + struct dpaa2_dpci_dev *dpci_dev = NULL; + + dpci_dev = get_dpci_from_id((uint32_t)object_id); + + if (dpci_dev) { + rte_dpaa2_free_dpci_dev(dpci_dev); + dpci_close(&dpci_dev->dpci, CMD_PRI_LOW, dpci_dev->token); + TAILQ_REMOVE(&dpci_dev_list, dpci_dev, next); + rte_free(dpci_dev); + } +} + static struct rte_dpaa2_object rte_dpaa2_dpci_obj = { .dev_type = DPAA2_CI, .create = rte_dpaa2_create_dpci_device, + .close = rte_dpaa2_close_dpci_device, }; RTE_PMD_REGISTER_DPAA2_OBJECT(dpci, rte_dpaa2_dpci_obj); diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c index 4aec7b2cd8..8265fee497 100644 --- a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c +++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c @@ -86,6 +86,19 @@ static int dpaa2_cluster_sz = 2; * Cluster 4 (ID = x07) : CPU14, CPU15; */ +static struct dpaa2_dpio_dev *get_dpio_dev_from_id(int32_t dpio_id) +{ + struct dpaa2_dpio_dev *dpio_dev = NULL; + + /* Get DPIO dev handle from list using index */ + TAILQ_FOREACH(dpio_dev, &dpio_dev_list, next) { + if (dpio_dev->hw_id == dpio_id) + break; + } + + return dpio_dev; +} + static int dpaa2_get_core_id(void) { @@ -358,6 +371,26 @@ static void dpaa2_portal_finish(void *arg) pthread_setspecific(dpaa2_portal_key, NULL); } +static void +dpaa2_close_dpio_device(int object_id) +{ + struct dpaa2_dpio_dev *dpio_dev = NULL; + + dpio_dev = get_dpio_dev_from_id((int32_t)object_id); + + if (dpio_dev) { + if (dpio_dev->dpio) { + dpio_disable(dpio_dev->dpio, CMD_PRI_LOW, + dpio_dev->token); + dpio_close(dpio_dev->dpio, CMD_PRI_LOW, + dpio_dev->token); + rte_free(dpio_dev->dpio); + } + TAILQ_REMOVE(&dpio_dev_list, dpio_dev, next); + rte_free(dpio_dev); + } +} + static int dpaa2_create_dpio_device(int vdev_fd, struct vfio_device_info *obj_info, @@ -635,6 +668,7 @@ dpaa2_free_eq_descriptors(void) static struct rte_dpaa2_object rte_dpaa2_dpio_obj = { .dev_type = DPAA2_IO, .create = dpaa2_create_dpio_device, + .close = dpaa2_close_dpio_device, }; RTE_PMD_REGISTER_DPAA2_OBJECT(dpio, rte_dpaa2_dpio_obj); diff --git a/drivers/event/dpaa2/dpaa2_hw_dpcon.c b/drivers/event/dpaa2/dpaa2_hw_dpcon.c index a68d3ac154..64b0136e24 100644 --- a/drivers/event/dpaa2/dpaa2_hw_dpcon.c +++ b/drivers/event/dpaa2/dpaa2_hw_dpcon.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * - * Copyright 2017 NXP + * Copyright 2017,2020 NXP * */ @@ -30,6 +30,19 @@ TAILQ_HEAD(dpcon_dev_list, dpaa2_dpcon_dev); static struct dpcon_dev_list dpcon_dev_list = TAILQ_HEAD_INITIALIZER(dpcon_dev_list); /*!< DPCON device list */ +static struct dpaa2_dpcon_dev *get_dpcon_from_id(uint32_t dpcon_id) +{ + struct dpaa2_dpcon_dev *dpcon_dev = NULL; + + /* Get DPCONC dev handle from list using index */ + TAILQ_FOREACH(dpcon_dev, &dpcon_dev_list, next) { + if (dpcon_dev->dpcon_id == dpcon_id) + break; + } + + return dpcon_dev; +} + static int rte_dpaa2_create_dpcon_device(int dev_fd __rte_unused, struct vfio_device_info *obj_info __rte_unused, @@ -105,9 +118,26 @@ void rte_dpaa2_free_dpcon_dev(struct dpaa2_dpcon_dev *dpcon) } } + +static void +rte_dpaa2_close_dpcon_device(int object_id) +{ + struct dpaa2_dpcon_dev *dpcon_dev = NULL; + + dpcon_dev = get_dpcon_from_id((uint32_t)object_id); + + if (dpcon_dev) { + rte_dpaa2_free_dpcon_dev(dpcon_dev); + dpcon_close(&dpcon_dev->dpcon, CMD_PRI_LOW, dpcon_dev->token); + TAILQ_REMOVE(&dpcon_dev_list, dpcon_dev, next); + rte_free(dpcon_dev); + } +} + static struct rte_dpaa2_object rte_dpaa2_dpcon_obj = { .dev_type = DPAA2_CON, .create = rte_dpaa2_create_dpcon_device, + .close = rte_dpaa2_close_dpcon_device, }; RTE_PMD_REGISTER_DPAA2_OBJECT(dpcon, rte_dpaa2_dpcon_obj); diff --git a/drivers/net/dpaa2/dpaa2_mux.c b/drivers/net/dpaa2/dpaa2_mux.c index d682a61e52..fa3659e452 100644 --- a/drivers/net/dpaa2/dpaa2_mux.c +++ b/drivers/net/dpaa2/dpaa2_mux.c @@ -44,7 +44,7 @@ static struct dpaa2_dpdmux_dev *get_dpdmux_from_id(uint32_t dpdmux_id) { struct dpaa2_dpdmux_dev *dpdmux_dev = NULL; - /* Get DPBP dev handle from list using index */ + /* Get DPDMUX dev handle from list using index */ TAILQ_FOREACH(dpdmux_dev, &dpdmux_dev_list, next) { if (dpdmux_dev->dpdmux_id == dpdmux_id) break; @@ -442,9 +442,25 @@ dpaa2_create_dpdmux_device(int vdev_fd __rte_unused, return -1; } +static void +dpaa2_close_dpdmux_device(int object_id) +{ + struct dpaa2_dpdmux_dev *dpdmux_dev; + + dpdmux_dev = get_dpdmux_from_id((uint32_t)object_id); + + if (dpdmux_dev) { + dpdmux_close(&dpdmux_dev->dpdmux, CMD_PRI_LOW, + dpdmux_dev->token); + TAILQ_REMOVE(&dpdmux_dev_list, dpdmux_dev, next); + rte_free(dpdmux_dev); + } +} + static struct rte_dpaa2_object rte_dpaa2_dpdmux_obj = { .dev_type = DPAA2_MUX, .create = dpaa2_create_dpdmux_device, + .close = dpaa2_close_dpdmux_device, }; RTE_PMD_REGISTER_DPAA2_OBJECT(dpdmux, rte_dpaa2_dpdmux_obj); diff --git a/drivers/net/dpaa2/rte_pmd_dpaa2.h b/drivers/net/dpaa2/rte_pmd_dpaa2.h index fd9acd841b..80e5e3298b 100644 --- a/drivers/net/dpaa2/rte_pmd_dpaa2.h +++ b/drivers/net/dpaa2/rte_pmd_dpaa2.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright 2018-2021 NXP + * Copyright 2018-2024 NXP */ #ifndef _RTE_PMD_DPAA2_H @@ -32,6 +32,9 @@ struct rte_flow * rte_pmd_dpaa2_mux_flow_create(uint32_t dpdmux_id, struct rte_flow_item *pattern[], struct rte_flow_action *actions[]); +int +rte_pmd_dpaa2_mux_flow_destroy(uint32_t dpdmux_id, + uint16_t entry_index); /** * @warning -- 2.25.1