All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] NXP DPAA2: Refactor bus scan/probe code
@ 2017-08-18 12:51 Shreyansh Jain
  2017-08-18 12:51 ` [PATCH 1/6] bus/fslmc: support only single group and container Shreyansh Jain
                   ` (6 more replies)
  0 siblings, 7 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-18 12:51 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, Shreyansh Jain

In [1], during the IOVA Mapping patch set [2] discussion, it was
observed that DPAA2 scan was actually doing work meant for probing.

This patchset demarcates the roles of FSLMC bus scan and probe
functions much more clearly than before:

1. scan now only add devices into a list
 unlike previously, scan doesn't initialize the devices using the VFIO
 operations. Now, scan would only add the devices onto a local device
 list after marking their type and filling in device name.

2. probe would now perform VFIO operations
 in dpaa2, for the device added in list, an initialization needs
 to be done so as to enable the devices - before actually API calls
 can be served. Probe function now initializes the devices as well
 as links then to the Eth/Crypto drivers.

3. Refactoring some VFIO code
 This patch improves the overall code contained within DPAA2 bus
 for DPAA2 VFIO layer.

[1] http://dpdk.org/ml/archives/dev/2017-July/071270.html
[2] http://dpdk.org/ml/archives/dev/2017-July/070833.html

Shreyansh Jain (6):
  bus/fslmc: support only single group and container
  bus/fslmc: introduce new device type enumerator
  net/dpaa2: update driver type field
  crypto/dpaa2_sec: update driver type field
  drivers: refactor DPAA2 object definition
  bus/fslmc: refactor scan and probe functions

 drivers/bus/fslmc/fslmc_bus.c               | 185 +++++++++-
 drivers/bus/fslmc/fslmc_vfio.c              | 521 +++++++++++++---------------
 drivers/bus/fslmc/fslmc_vfio.h              |  44 +--
 drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c    |   6 +-
 drivers/bus/fslmc/portal/dpaa2_hw_dpci.c    |   8 +-
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c    |   8 +-
 drivers/bus/fslmc/rte_bus_fslmc_version.map |   7 +
 drivers/bus/fslmc/rte_fslmc.h               |  63 +++-
 drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c |   2 +-
 drivers/event/dpaa2/dpaa2_hw_dpcon.c        |   8 +-
 drivers/net/dpaa2/dpaa2_ethdev.c            |   2 +-
 11 files changed, 494 insertions(+), 360 deletions(-)

-- 
2.9.3

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 1/6] bus/fslmc: support only single group and container
  2017-08-18 12:51 [PATCH 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
@ 2017-08-18 12:51 ` Shreyansh Jain
  2017-08-18 12:51 ` [PATCH 2/6] bus/fslmc: introduce new device type enumerator Shreyansh Jain
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-18 12:51 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, Shreyansh Jain

Currently DPAA2 code doesn't support multiple groups and containers.
Remove such provision in code to simplify code.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/bus/fslmc/fslmc_vfio.c | 70 +++++++++++++++---------------------------
 drivers/bus/fslmc/fslmc_vfio.h |  3 +-
 2 files changed, 26 insertions(+), 47 deletions(-)

diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
index 45e5927..3423b57 100644
--- a/drivers/bus/fslmc/fslmc_vfio.c
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -62,8 +62,6 @@
 #include "portal/dpaa2_hw_pvt.h"
 #include "portal/dpaa2_hw_dpio.h"
 
-#define VFIO_MAX_CONTAINERS	1
-
 #define FSLMC_VFIO_LOG(level, fmt, args...) \
 	RTE_LOG(level, EAL, "%s(): " fmt "\n", __func__, ##args)
 
@@ -71,8 +69,8 @@
 #define SYSFS_FSL_MC_DEVICES "/sys/bus/fsl-mc/devices"
 
 /* Number of VFIO containers & groups with in */
-static struct fslmc_vfio_group vfio_groups[VFIO_MAX_GRP];
-static struct fslmc_vfio_container vfio_containers[VFIO_MAX_CONTAINERS];
+static struct fslmc_vfio_group vfio_group;
+static struct fslmc_vfio_container vfio_container;
 static int container_device_fd;
 static uint32_t *msi_intr_vaddr;
 void *(*rte_mcp_ptr_list);
@@ -90,22 +88,18 @@ rte_fslmc_object_register(struct rte_dpaa2_object *object)
 	TAILQ_INSERT_TAIL(&fslmc_obj_list, object, next);
 }
 
-static int vfio_connect_container(struct fslmc_vfio_group *vfio_group)
+static int vfio_connect_container(void)
 {
-	struct fslmc_vfio_container *container;
-	int i, fd, ret;
+	int fd, ret;
 
 	/* Try connecting to vfio container if already created */
-	for (i = 0; i < VFIO_MAX_CONTAINERS; i++) {
-		container = &vfio_containers[i];
-		if (!ioctl(vfio_group->fd, VFIO_GROUP_SET_CONTAINER,
-			   &container->fd)) {
-			FSLMC_VFIO_LOG(INFO,
-			    "Container pre-exists with FD[0x%x] for this group",
-			    container->fd);
-			vfio_group->container = container;
-			return 0;
-		}
+	if (!ioctl(vfio_group.fd, VFIO_GROUP_SET_CONTAINER,
+		&vfio_container.fd)) {
+		FSLMC_VFIO_LOG(INFO,
+		    "Container pre-exists with FD[0x%x] for this group",
+		    vfio_container.fd);
+		vfio_group.container = &vfio_container;
+		return 0;
 	}
 
 	/* Opens main vfio file descriptor which represents the "container" */
@@ -118,7 +112,7 @@ static int vfio_connect_container(struct fslmc_vfio_group *vfio_group)
 	/* Check whether support for SMMU type IOMMU present or not */
 	if (ioctl(fd, VFIO_CHECK_EXTENSION, VFIO_TYPE1_IOMMU)) {
 		/* Connect group to container */
-		ret = ioctl(vfio_group->fd, VFIO_GROUP_SET_CONTAINER, &fd);
+		ret = ioctl(vfio_group.fd, VFIO_GROUP_SET_CONTAINER, &fd);
 		if (ret) {
 			FSLMC_VFIO_LOG(ERR, "Failed to setup group container");
 			close(fd);
@@ -137,23 +131,11 @@ static int vfio_connect_container(struct fslmc_vfio_group *vfio_group)
 		return -EINVAL;
 	}
 
-	container = NULL;
-	for (i = 0; i < VFIO_MAX_CONTAINERS; i++) {
-		if (vfio_containers[i].used)
-			continue;
-		container = &vfio_containers[i];
-	}
-	if (!container) {
-		FSLMC_VFIO_LOG(ERR, "No free container found");
-		close(fd);
-		return -ENOMEM;
-	}
+	vfio_container.used = 1;
+	vfio_container.fd = fd;
+	vfio_container.group = &vfio_group;
+	vfio_group.container = &vfio_container;
 
-	container->used = 1;
-	container->fd = fd;
-	container->group_list[container->index] = vfio_group;
-	vfio_group->container = container;
-	container->index++;
 	return 0;
 }
 
@@ -222,7 +204,7 @@ int rte_fslmc_vfio_dmamap(void)
 #endif
 
 		/* SET DMA MAP for IOMMU */
-		group = &vfio_groups[0];
+		group = &vfio_group;
 
 		if (!group->container) {
 			FSLMC_VFIO_LOG(ERR, "Container is not connected ");
@@ -392,7 +374,7 @@ int fslmc_vfio_process_group(void)
 	char path[PATH_MAX];
 	int64_t v_addr;
 	int ndev_count;
-	struct fslmc_vfio_group *group = &vfio_groups[0];
+	struct fslmc_vfio_group *group = &vfio_group;
 	static int process_once;
 
 	/* if already done once */
@@ -569,7 +551,7 @@ int fslmc_vfio_setup_group(void)
 {
 	struct fslmc_vfio_group *group = NULL;
 	int groupid;
-	int ret, i;
+	int ret;
 	char *container;
 	struct vfio_group_status status = { .argsz = sizeof(status) };
 
@@ -599,13 +581,11 @@ int fslmc_vfio_setup_group(void)
 	FSLMC_VFIO_LOG(DEBUG, "VFIO iommu group id = %d", groupid);
 
 	/* Check if group already exists */
-	for (i = 0; i < VFIO_MAX_GRP; i++) {
-		group = &vfio_groups[i];
-		if (group->groupid == groupid) {
-			FSLMC_VFIO_LOG(ERR, "groupid already exists %d",
-				       groupid);
-			return 0;
-		}
+	group = &vfio_group;
+	if (group->groupid == groupid) {
+		FSLMC_VFIO_LOG(ERR, "groupid already exists %d",
+			       groupid);
+		return 0;
 	}
 
 	/* get the actual group fd */
@@ -637,7 +617,7 @@ int fslmc_vfio_setup_group(void)
 	/* check if group does not have a container yet */
 	if (!(status.flags & VFIO_GROUP_FLAGS_CONTAINER_SET)) {
 		/* Now connect this IOMMU group to given container */
-		ret = vfio_connect_container(group);
+		ret = vfio_connect_container();
 		if (ret) {
 			FSLMC_VFIO_LOG(ERR, "VFIO error connecting container"
 				       " with groupid %d", groupid);
diff --git a/drivers/bus/fslmc/fslmc_vfio.h b/drivers/bus/fslmc/fslmc_vfio.h
index 0aff9b1..942a33c 100644
--- a/drivers/bus/fslmc/fslmc_vfio.h
+++ b/drivers/bus/fslmc/fslmc_vfio.h
@@ -44,7 +44,6 @@
 #define DPAA2_MC_DPBP_DEVID	10
 #define DPAA2_MC_DPCI_DEVID	11
 
-#define VFIO_MAX_GRP 1
 
 typedef struct fslmc_vfio_device {
 	int fd; /* fslmc root container device ?? */
@@ -64,7 +63,7 @@ typedef struct fslmc_vfio_container {
 	int fd; /* /dev/vfio/vfio */
 	int used;
 	int index; /* index in group list */
-	struct fslmc_vfio_group *group_list[VFIO_MAX_GRP];
+	struct fslmc_vfio_group *group;
 } fslmc_vfio_container;
 
 struct rte_dpaa2_object;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 2/6] bus/fslmc: introduce new device type enumerator
  2017-08-18 12:51 [PATCH 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
  2017-08-18 12:51 ` [PATCH 1/6] bus/fslmc: support only single group and container Shreyansh Jain
@ 2017-08-18 12:51 ` Shreyansh Jain
  2017-08-18 12:51 ` [PATCH 3/6] net/dpaa2: update driver type field Shreyansh Jain
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-18 12:51 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, Shreyansh Jain

Existing devices and drivers depended on device ID rather than type.
A new enumerator for all DPAA2 devices is introduced in this patch.

At this point, the probe would not be able to link DPAA2 devices
with the driver and I/O would not work. Subsequent patches will
fix this.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/bus/fslmc/fslmc_vfio.c              |  6 +++---
 drivers/bus/fslmc/rte_bus_fslmc_version.map |  7 +++++++
 drivers/bus/fslmc/rte_fslmc.h               | 24 ++++++++++++++++++++----
 3 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
index 3423b57..3b452e1 100644
--- a/drivers/bus/fslmc/fslmc_vfio.c
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -288,8 +288,8 @@ dpaa2_compare_dpaa2_dev(const struct rte_dpaa2_device *dev,
 			 const struct rte_dpaa2_device *dev2)
 {
 	/*not the same family device */
-	if (dev->dev_type != DPAA2_MC_DPNI_DEVID ||
-			dev->dev_type != DPAA2_MC_DPSECI_DEVID)
+	if (dev->dev_type != DPAA2_ETH ||
+			dev->dev_type != DPAA2_CRYPTO)
 		return -1;
 
 	if (dev->object_id == dev2->object_id)
@@ -506,7 +506,7 @@ int fslmc_vfio_process_group(void)
 			/* store hw_id of dpni/dpseci device */
 			dev->object_id = object_id;
 			dev->dev_type = (strcmp(object_type, "dpseci")) ?
-				DPAA2_MC_DPNI_DEVID : DPAA2_MC_DPSECI_DEVID;
+				DPAA2_ETH : DPAA2_CRYPTO;
 
 			sprintf(dev->name, "%s.%d", object_type, object_id);
 			dev->device.name = dev->name;
diff --git a/drivers/bus/fslmc/rte_bus_fslmc_version.map b/drivers/bus/fslmc/rte_bus_fslmc_version.map
index 3cdf14e..6ac256d 100644
--- a/drivers/bus/fslmc/rte_bus_fslmc_version.map
+++ b/drivers/bus/fslmc/rte_bus_fslmc_version.map
@@ -77,3 +77,10 @@ DPDK_17.08 {
 	rte_global_active_dqs_list;
 
 } DPDK_17.05;
+
+DPDK_17.11 {
+	global:
+
+	rte_dpaa2_dev_type;
+
+} DPDK_17.08;
diff --git a/drivers/bus/fslmc/rte_fslmc.h b/drivers/bus/fslmc/rte_fslmc.h
index e60d6eb..ff7a49e 100644
--- a/drivers/bus/fslmc/rte_fslmc.h
+++ b/drivers/bus/fslmc/rte_fslmc.h
@@ -56,6 +56,8 @@ extern "C" {
 #include <rte_dev.h>
 #include <rte_bus.h>
 
+#define FSLMC_OBJECT_MAX_LEN 32   /**< Length of each device on bus */
+
 struct rte_dpaa2_driver;
 
 /* DPAA2 Device and Driver lists for FSLMC bus */
@@ -64,6 +66,20 @@ TAILQ_HEAD(rte_fslmc_driver_list, rte_dpaa2_driver);
 
 extern struct rte_fslmc_bus rte_fslmc_bus;
 
+enum rte_dpaa2_dev_type {
+	/* Devices backed by DPDK driver */
+	DPAA2_ETH,	/**< DPNI type device*/
+	DPAA2_CRYPTO,	/**< DPSECI type device */
+	DPAA2_CON,	/**< DPCONC type device */
+	/* Devices not backed by a DPDK driver: DPIO, DPBP, DPCI, DPMCP */
+	DPAA2_BPOOL,	/**< DPBP type device */
+	DPAA2_IO,	/**< DPIO type device */
+	DPAA2_CI,	/**< DPCI type device */
+	DPAA2_MPORTAL,  /**< DPMCP type device */
+	/* Unknown device placeholder */
+	DPAA2_UNKNOWN
+};
+
 /**
  * A structure describing a DPAA2 device.
  */
@@ -74,11 +90,11 @@ struct rte_dpaa2_device {
 		struct rte_eth_dev *eth_dev;        /**< ethernet device */
 		struct rte_cryptodev *cryptodev;    /**< Crypto Device */
 	};
-	uint16_t dev_type;                  /**< Device Type */
-	uint16_t object_id;             /**< DPAA2 Object ID */
+	enum rte_dpaa2_dev_type dev_type;   /**< Device Type */
+	uint16_t object_id;                 /**< DPAA2 Object ID */
 	struct rte_intr_handle intr_handle; /**< Interrupt handle */
 	struct rte_dpaa2_driver *driver;    /**< Associated driver */
-	char name[32];          /**< DPAA2 Object name*/
+	char name[FSLMC_OBJECT_MAX_LEN];    /**< DPAA2 Object name*/
 };
 
 typedef int (*rte_dpaa2_probe_t)(struct rte_dpaa2_driver *dpaa2_drv,
@@ -93,7 +109,7 @@ struct rte_dpaa2_driver {
 	struct rte_driver driver;           /**< Inherit core driver. */
 	struct rte_fslmc_bus *fslmc_bus;    /**< FSLMC bus reference */
 	uint32_t drv_flags;                 /**< Flags for controlling device.*/
-	uint16_t drv_type;                  /**< Driver Type */
+	enum rte_dpaa2_dev_type drv_type;   /**< Driver Type */
 	rte_dpaa2_probe_t probe;
 	rte_dpaa2_remove_t remove;
 };
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 3/6] net/dpaa2: update driver type field
  2017-08-18 12:51 [PATCH 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
  2017-08-18 12:51 ` [PATCH 1/6] bus/fslmc: support only single group and container Shreyansh Jain
  2017-08-18 12:51 ` [PATCH 2/6] bus/fslmc: introduce new device type enumerator Shreyansh Jain
@ 2017-08-18 12:51 ` Shreyansh Jain
  2017-08-18 12:51 ` [PATCH 4/6] crypto/dpaa2_sec: " Shreyansh Jain
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-18 12:51 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, Shreyansh Jain

Shifting from existing device identifier to driver type field.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/net/dpaa2/dpaa2_ethdev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 429b3a0..360109e 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -1588,7 +1588,7 @@ rte_dpaa2_remove(struct rte_dpaa2_device *dpaa2_dev)
 }
 
 static struct rte_dpaa2_driver rte_dpaa2_pmd = {
-	.drv_type = DPAA2_MC_DPNI_DEVID,
+	.drv_type = DPAA2_ETH,
 	.probe = rte_dpaa2_probe,
 	.remove = rte_dpaa2_remove,
 };
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 4/6] crypto/dpaa2_sec: update driver type field
  2017-08-18 12:51 [PATCH 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
                   ` (2 preceding siblings ...)
  2017-08-18 12:51 ` [PATCH 3/6] net/dpaa2: update driver type field Shreyansh Jain
@ 2017-08-18 12:51 ` Shreyansh Jain
  2017-08-18 12:51 ` [PATCH 5/6] drivers: refactor DPAA2 object definition Shreyansh Jain
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-18 12:51 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, Shreyansh Jain

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c b/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
index e0f6cfc..95c3951 100644
--- a/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
+++ b/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
@@ -2000,7 +2000,7 @@ cryptodev_dpaa2_sec_remove(struct rte_dpaa2_device *dpaa2_dev)
 }
 
 static struct rte_dpaa2_driver rte_dpaa2_sec_driver = {
-	.drv_type = DPAA2_MC_DPSECI_DEVID,
+	.drv_type = DPAA2_CRYPTO,
 	.driver = {
 		.name = "DPAA2 SEC PMD"
 	},
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 5/6] drivers: refactor DPAA2 object definition
  2017-08-18 12:51 [PATCH 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
                   ` (3 preceding siblings ...)
  2017-08-18 12:51 ` [PATCH 4/6] crypto/dpaa2_sec: " Shreyansh Jain
@ 2017-08-18 12:51 ` Shreyansh Jain
  2017-08-18 12:51 ` [PATCH 6/6] bus/fslmc: refactor scan and probe functions Shreyansh Jain
  2017-08-25 10:19 ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
  6 siblings, 0 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-18 12:51 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, Shreyansh Jain

Initially, DPAA2 objects (except ETH and CRYPTO) were defined from VFIO
layer. This patch moves that into Bus definition.
This patch also realigns the object types with the new device types.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/bus/fslmc/fslmc_vfio.c           | 11 +++++-----
 drivers/bus/fslmc/fslmc_vfio.h           | 37 --------------------------------
 drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c |  6 +++---
 drivers/bus/fslmc/portal/dpaa2_hw_dpci.c |  8 +++----
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c |  7 +++---
 drivers/bus/fslmc/rte_fslmc.h            | 36 +++++++++++++++++++++++++++++++
 drivers/event/dpaa2/dpaa2_hw_dpcon.c     |  8 +++----
 7 files changed, 57 insertions(+), 56 deletions(-)

diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
index 3b452e1..f0d69a9 100644
--- a/drivers/bus/fslmc/fslmc_vfio.c
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -76,8 +76,9 @@ static uint32_t *msi_intr_vaddr;
 void *(*rte_mcp_ptr_list);
 static uint32_t mcp_id;
 static int is_dma_done;
-static struct rte_fslmc_object_list fslmc_obj_list =
-	TAILQ_HEAD_INITIALIZER(fslmc_obj_list);
+
+static struct rte_dpaa2_object_list dpaa2_obj_list =
+	TAILQ_HEAD_INITIALIZER(dpaa2_obj_list);
 
 /*register a fslmc bus based dpaa2 driver */
 void
@@ -85,7 +86,7 @@ rte_fslmc_object_register(struct rte_dpaa2_object *object)
 {
 	RTE_VERIFY(object);
 
-	TAILQ_INSERT_TAIL(&fslmc_obj_list, object, next);
+	TAILQ_INSERT_TAIL(&dpaa2_obj_list, object, next);
 }
 
 static int vfio_connect_container(void)
@@ -517,9 +518,9 @@ int fslmc_vfio_process_group(void)
 			/* Parse all other objects */
 			struct rte_dpaa2_object *object;
 
-			TAILQ_FOREACH(object, &fslmc_obj_list, next) {
+			TAILQ_FOREACH(object, &dpaa2_obj_list, next) {
 				if (!strcmp(object_type, object->name))
-					object->create(vdev, &device_info,
+					object->create(dev_fd, &device_info,
 						       object_id);
 				else
 					continue;
diff --git a/drivers/bus/fslmc/fslmc_vfio.h b/drivers/bus/fslmc/fslmc_vfio.h
index 942a33c..60a5743 100644
--- a/drivers/bus/fslmc/fslmc_vfio.h
+++ b/drivers/bus/fslmc/fslmc_vfio.h
@@ -66,24 +66,6 @@ typedef struct fslmc_vfio_container {
 	struct fslmc_vfio_group *group;
 } fslmc_vfio_container;
 
-struct rte_dpaa2_object;
-
-TAILQ_HEAD(rte_fslmc_object_list, rte_dpaa2_object);
-
-typedef int (*rte_fslmc_obj_create_t)(struct fslmc_vfio_device *vdev,
-					 struct vfio_device_info *obj_info,
-					 int object_id);
-
-/**
- * A structure describing a DPAA2 driver.
- */
-struct rte_dpaa2_object {
-	TAILQ_ENTRY(rte_dpaa2_object) next; /**< Next in list. */
-	const char *name;            /**< Name of Object. */
-	uint16_t object_id;             /**< DPAA2 Object ID */
-	rte_fslmc_obj_create_t create;
-};
-
 int rte_dpaa2_intr_enable(struct rte_intr_handle *intr_handle,
 			  uint32_t index);
 
@@ -91,23 +73,4 @@ int fslmc_vfio_setup_group(void);
 int fslmc_vfio_process_group(void);
 int rte_fslmc_vfio_dmamap(void);
 
-/**
- * Register a DPAA2 MC Object driver.
- *
- * @param mc_object
- *   A pointer to a rte_dpaa_object structure describing the mc object
- *   to be registered.
- */
-void rte_fslmc_object_register(struct rte_dpaa2_object *object);
-
-/** Helper for DPAA2 object registration */
-#define RTE_PMD_REGISTER_DPAA2_OBJECT(nm, dpaa2_obj) \
-RTE_INIT(dpaa2objinitfn_ ##nm); \
-static void dpaa2objinitfn_ ##nm(void) \
-{\
-	(dpaa2_obj).name = RTE_STR(nm);\
-	rte_fslmc_object_register(&dpaa2_obj); \
-} \
-RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
-
 #endif /* _FSLMC_VFIO_H_ */
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
index 33f9eed..1ddd280 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
@@ -48,7 +48,7 @@
 #include <rte_ethdev.h>
 
 #include <fslmc_logs.h>
-#include <fslmc_vfio.h>
+#include <rte_fslmc.h>
 #include <mc/fsl_dpbp.h>
 #include "portal/dpaa2_hw_pvt.h"
 #include "portal/dpaa2_hw_dpio.h"
@@ -58,7 +58,7 @@ static struct dpbp_dev_list dpbp_dev_list
 	= TAILQ_HEAD_INITIALIZER(dpbp_dev_list); /*!< DPBP device list */
 
 static int
-dpaa2_create_dpbp_device(struct fslmc_vfio_device *vdev __rte_unused,
+dpaa2_create_dpbp_device(int vdev_fd __rte_unused,
 			 struct vfio_device_info *obj_info __rte_unused,
 			 int dpbp_id)
 {
@@ -130,7 +130,7 @@ void dpaa2_free_dpbp_dev(struct dpaa2_dpbp_dev *dpbp)
 }
 
 static struct rte_dpaa2_object rte_dpaa2_dpbp_obj = {
-	.object_id = DPAA2_MC_DPBP_DEVID,
+	.dev_type = DPAA2_BPOOL,
 	.create = dpaa2_create_dpbp_device,
 };
 
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c
index 478e4f7..b60a745 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c
@@ -47,7 +47,7 @@
 #include <rte_ethdev.h>
 
 #include <fslmc_logs.h>
-#include <fslmc_vfio.h>
+#include <rte_fslmc.h>
 #include <mc/fsl_dpci.h>
 #include "portal/dpaa2_hw_pvt.h"
 #include "portal/dpaa2_hw_dpio.h"
@@ -57,9 +57,9 @@ static struct dpci_dev_list dpci_dev_list
 	= TAILQ_HEAD_INITIALIZER(dpci_dev_list); /*!< DPCI device list */
 
 static int
-rte_dpaa2_create_dpci_device(struct fslmc_vfio_device *vdev __rte_unused,
+rte_dpaa2_create_dpci_device(int vdev_fd __rte_unused,
 			     struct vfio_device_info *obj_info __rte_unused,
-				int dpci_id)
+			     int dpci_id)
 {
 	struct dpaa2_dpci_dev *dpci_node;
 	struct dpci_attr attr;
@@ -172,7 +172,7 @@ void rte_dpaa2_free_dpci_dev(struct dpaa2_dpci_dev *dpci)
 }
 
 static struct rte_dpaa2_object rte_dpaa2_dpci_obj = {
-	.object_id = DPAA2_MC_DPCI_DEVID,
+	.dev_type = DPAA2_CI,
 	.create = rte_dpaa2_create_dpci_device,
 };
 
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
index 283441b..da41849 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
@@ -60,6 +60,7 @@
 
 #include <fslmc_logs.h>
 #include <fslmc_vfio.h>
+#include <rte_fslmc.h>
 #include "dpaa2_hw_pvt.h"
 #include "dpaa2_hw_dpio.h"
 #include <mc/fsl_dpmng.h>
@@ -428,7 +429,7 @@ dpaa2_affine_qbman_swp_sec(void)
 }
 
 static int
-dpaa2_create_dpio_device(struct fslmc_vfio_device *vdev,
+dpaa2_create_dpio_device(int vdev_fd,
 			 struct vfio_device_info *obj_info,
 			 int object_id)
 {
@@ -451,7 +452,7 @@ dpaa2_create_dpio_device(struct fslmc_vfio_device *vdev,
 
 	dpio_dev->dpio = NULL;
 	dpio_dev->hw_id = object_id;
-	dpio_dev->intr_handle.vfio_dev_fd = vdev->fd;
+	dpio_dev->intr_handle.vfio_dev_fd = vdev_fd;
 	rte_atomic16_init(&dpio_dev->ref_count);
 	/* Using single portal  for all devices */
 	dpio_dev->mc_portal = rte_mcp_ptr_list[MC_PORTAL_INDEX];
@@ -529,7 +530,7 @@ dpaa2_alloc_dq_storage(struct queue_storage_info_t *q_storage)
 }
 
 static struct rte_dpaa2_object rte_dpaa2_dpio_obj = {
-	.object_id = DPAA2_MC_DPIO_DEVID,
+	.dev_type = DPAA2_IO,
 	.create = dpaa2_create_dpio_device,
 };
 
diff --git a/drivers/bus/fslmc/rte_fslmc.h b/drivers/bus/fslmc/rte_fslmc.h
index ff7a49e..2f684d9 100644
--- a/drivers/bus/fslmc/rte_fslmc.h
+++ b/drivers/bus/fslmc/rte_fslmc.h
@@ -50,6 +50,7 @@ extern "C" {
 #include <sys/queue.h>
 #include <stdint.h>
 #include <inttypes.h>
+#include <linux/vfio.h>
 
 #include <rte_debug.h>
 #include <rte_interrupts.h>
@@ -80,6 +81,22 @@ enum rte_dpaa2_dev_type {
 	DPAA2_UNKNOWN
 };
 
+TAILQ_HEAD(rte_dpaa2_object_list, rte_dpaa2_object);
+
+typedef int (*rte_dpaa2_obj_create_t)(int vdev_fd,
+				      struct vfio_device_info *obj_info,
+				      int object_id);
+
+/**
+ * A structure describing a DPAA2 object.
+ */
+struct rte_dpaa2_object {
+	TAILQ_ENTRY(rte_dpaa2_object) next; /**< Next in list. */
+	const char *name;                   /**< Name of Object. */
+	enum rte_dpaa2_dev_type dev_type;   /**< Type of device */
+	rte_dpaa2_obj_create_t create;
+};
+
 /**
  * A structure describing a DPAA2 device.
  */
@@ -159,4 +176,23 @@ RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
 }
 #endif
 
+/**
+ * Register a DPAA2 MC Object driver.
+ *
+ * @param mc_object
+ *   A pointer to a rte_dpaa_object structure describing the mc object
+ *   to be registered.
+ */
+void rte_fslmc_object_register(struct rte_dpaa2_object *object);
+
+/** Helper for DPAA2 object registration */
+#define RTE_PMD_REGISTER_DPAA2_OBJECT(nm, dpaa2_obj) \
+RTE_INIT(dpaa2objinitfn_ ##nm); \
+static void dpaa2objinitfn_ ##nm(void) \
+{\
+	(dpaa2_obj).name = RTE_STR(nm);\
+	rte_fslmc_object_register(&dpaa2_obj); \
+} \
+RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
+
 #endif /* _RTE_FSLMC_H_ */
diff --git a/drivers/event/dpaa2/dpaa2_hw_dpcon.c b/drivers/event/dpaa2/dpaa2_hw_dpcon.c
index d3e73f9..2c416b5 100644
--- a/drivers/event/dpaa2/dpaa2_hw_dpcon.c
+++ b/drivers/event/dpaa2/dpaa2_hw_dpcon.c
@@ -46,7 +46,7 @@
 #include <rte_dev.h>
 #include <rte_ethdev.h>
 
-#include <fslmc_vfio.h>
+#include <rte_fslmc.h>
 #include <mc/fsl_dpcon.h>
 #include <portal/dpaa2_hw_pvt.h>
 #include "dpaa2_eventdev.h"
@@ -56,9 +56,9 @@ static struct dpcon_dev_list dpcon_dev_list
 	= TAILQ_HEAD_INITIALIZER(dpcon_dev_list); /*!< DPCON device list */
 
 static int
-rte_dpaa2_create_dpcon_device(struct fslmc_vfio_device *vdev __rte_unused,
+rte_dpaa2_create_dpcon_device(int dev_fd __rte_unused,
 			      struct vfio_device_info *obj_info __rte_unused,
-			 int dpcon_id)
+			      int dpcon_id)
 {
 	struct dpaa2_dpcon_dev *dpcon_node;
 	struct dpcon_attr attr;
@@ -132,7 +132,7 @@ void rte_dpaa2_free_dpcon_dev(struct dpaa2_dpcon_dev *dpcon)
 }
 
 static struct rte_dpaa2_object rte_dpaa2_dpcon_obj = {
-	.object_id = DPAA2_MC_DPCON_DEVID,
+	.dev_type = DPAA2_CON,
 	.create = rte_dpaa2_create_dpcon_device,
 };
 
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 6/6] bus/fslmc: refactor scan and probe functions
  2017-08-18 12:51 [PATCH 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
                   ` (4 preceding siblings ...)
  2017-08-18 12:51 ` [PATCH 5/6] drivers: refactor DPAA2 object definition Shreyansh Jain
@ 2017-08-18 12:51 ` Shreyansh Jain
  2017-08-25 10:19 ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
  6 siblings, 0 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-18 12:51 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, Shreyansh Jain

Scan now searches for devices through sysfs interface and adds them
to a list for later initialization. During probe, each device is
initialized accroding to its property.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/bus/fslmc/fslmc_bus.c            | 185 ++++++++++++-
 drivers/bus/fslmc/fslmc_vfio.c           | 456 ++++++++++++++-----------------
 drivers/bus/fslmc/fslmc_vfio.h           |   4 +-
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c |   1 -
 drivers/bus/fslmc/rte_fslmc.h            |   3 +
 5 files changed, 390 insertions(+), 259 deletions(-)

diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c
index f71598d..0feeba0 100644
--- a/drivers/bus/fslmc/fslmc_bus.c
+++ b/drivers/bus/fslmc/fslmc_bus.c
@@ -42,32 +42,178 @@
 #include <rte_memcpy.h>
 #include <rte_ethdev.h>
 
-#include "rte_fslmc.h"
-#include "fslmc_vfio.h"
+#include <rte_fslmc.h>
+#include <fslmc_vfio.h>
 
 #define FSLMC_BUS_LOG(level, fmt, args...) \
 	RTE_LOG(level, EAL, "%s(): " fmt "\n", __func__, ##args)
 
+#define VFIO_IOMMU_GROUP_PATH "/sys/kernel/iommu_groups"
+
 struct rte_fslmc_bus rte_fslmc_bus;
 
+static void
+cleanup_fslmc_device_list(void)
+{
+	struct rte_dpaa2_device *dev;
+	struct rte_dpaa2_device *t_dev;
+
+	TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, t_dev) {
+		TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+		free(dev);
+		dev = NULL;
+	}
+}
+
+static int
+scan_one_fslmc_device(char *dev_name)
+{
+	char *dup_dev_name, *t_ptr;
+	struct rte_dpaa2_device *dev;
+
+	if (!dev_name)
+		return -1;
+
+	/* Ignore the Container name itself */
+	if (!strncmp("dprc", dev_name, 4))
+		return 0;
+
+	/* Creating a temporary copy to perform cut-parse over string */
+	dup_dev_name = strdup(dev_name);
+	if (!dup_dev_name) {
+		FSLMC_BUS_LOG(ERR, "Out of memory.");
+		return -ENOMEM;
+	}
+
+	/* For all other devices, we allocate rte_dpaa2_device.
+	 * For those devices where there is no driver, probe would release
+	 * the memory associated with the rte_dpaa2_device after necessary
+	 * initialization.
+	 */
+	dev = calloc(1, sizeof(struct rte_dpaa2_device));
+	if (!dev) {
+		FSLMC_BUS_LOG(ERR, "Out of memory.");
+		free(dup_dev_name);
+		return -ENOMEM;
+	}
+
+	/* Parse the device name and ID */
+	t_ptr = strtok(dup_dev_name, ".");
+	if (!t_ptr) {
+		FSLMC_BUS_LOG(ERR, "Incorrect device string observed.");
+		goto cleanup;
+	}
+	if (!strncmp("dpni", t_ptr, 4))
+		dev->dev_type = DPAA2_ETH;
+	else if (!strncmp("dpseci", t_ptr, 6))
+		dev->dev_type = DPAA2_CRYPTO;
+	else if (!strncmp("dpcon", t_ptr, 5))
+		dev->dev_type = DPAA2_CON;
+	else if (!strncmp("dpbp", t_ptr, 4))
+		dev->dev_type = DPAA2_BPOOL;
+	else if (!strncmp("dpio", t_ptr, 4))
+		dev->dev_type = DPAA2_IO;
+	else if (!strncmp("dpci", t_ptr, 5))
+		dev->dev_type = DPAA2_CI;
+	else if (!strncmp("dpmcp", t_ptr, 5))
+		dev->dev_type = DPAA2_MPORTAL;
+	else
+		dev->dev_type = DPAA2_UNKNOWN;
+
+	t_ptr = strtok(NULL, ".");
+	if (!t_ptr) {
+		FSLMC_BUS_LOG(ERR, "Incorrect device string observed (%s).",
+			      t_ptr);
+		goto cleanup;
+	}
+
+	sscanf(t_ptr, "%hu", &dev->object_id);
+	dev->device.name = strdup(dev_name);
+	if (!dev->device.name) {
+		FSLMC_BUS_LOG(ERR, "Out of memory.");
+		goto cleanup;
+	}
+
+	/* Add device in the fslmc device list */
+	TAILQ_INSERT_TAIL(&rte_fslmc_bus.device_list, dev, next);
+	if (dev->dev_type == DPAA2_ETH)
+		RTE_LOG(INFO, EAL, "%s: Eth Device scanned.\n",
+			dev->device.name);
+	if (dev->dev_type == DPAA2_CRYPTO)
+		RTE_LOG(INFO, EAL, "%s: Crypto Device scanned.\n",
+			dev->device.name);
+	RTE_LOG(DEBUG, EAL, "Add device (%s) with object ID: %d, Type = %d\n",
+		dev->device.name, dev->object_id, dev->dev_type);
+
+	/* Don't need the duplicated device filesystem entry anymore */
+	if (dup_dev_name)
+		free(dup_dev_name);
+
+	return 0;
+cleanup:
+	if (dup_dev_name)
+		free(dup_dev_name);
+	if (dev)
+		free(dev);
+	return -1;
+}
+
 static int
 rte_fslmc_scan(void)
 {
 	int ret;
+	int device_count = 0;
+	char fslmc_dirpath[PATH_MAX];
+	DIR *dir;
+	struct dirent *entry;
+	static int process_once;
+	int groupid;
 
-	ret = fslmc_vfio_setup_group();
-	if (ret) {
-		FSLMC_BUS_LOG(ERR, "fslmc: Unable to setup VFIO");
-		return ret;
+	if (process_once) {
+		FSLMC_BUS_LOG(DEBUG,
+			      "Fslmc bus already scanned. Not rescanning");
+		return 0;
 	}
+	process_once = 1;
 
-	ret = fslmc_vfio_process_group();
-	if (ret) {
-		FSLMC_BUS_LOG(ERR, "fslmc: Unable to setup devices");
-		return -1;
+	ret = fslmc_get_container_group(&groupid);
+	if (ret != 0)
+		goto scan_fail;
+
+	/* Scan devices on the group */
+	sprintf(fslmc_dirpath, "%s/%d/devices", VFIO_IOMMU_GROUP_PATH,
+		groupid);
+	dir = opendir(fslmc_dirpath);
+	if (!dir) {
+		FSLMC_BUS_LOG(ERR, "Unable to open VFIO group dir.");
+		goto scan_fail;
+	}
+
+	while ((entry = readdir(dir)) != NULL) {
+		if (entry->d_name[0] == '.' || entry->d_type != DT_LNK)
+			continue;
+
+		ret = scan_one_fslmc_device(entry->d_name);
+		if (ret != 0) {
+			/* Error in parsing directory - exit gracefully */
+			goto scan_fail_cleanup;
+		}
+		device_count += 1;
 	}
 
 	RTE_LOG(INFO, EAL, "fslmc: Bus scan completed\n");
+
+	closedir(dir);
+	return 0;
+
+scan_fail_cleanup:
+	closedir(dir);
+
+	/* Remove all devices in the list */
+	cleanup_fslmc_device_list();
+scan_fail:
+	RTE_LOG(DEBUG, EAL, "Error in scanning FSLMC Bus. Skipping.\n");
+	/* Irrespective of failure, scan only return success */
 	return 0;
 }
 
@@ -88,6 +234,18 @@ rte_fslmc_probe(void)
 	struct rte_dpaa2_device *dev;
 	struct rte_dpaa2_driver *drv;
 
+	ret = fslmc_vfio_setup_group();
+	if (ret) {
+		FSLMC_BUS_LOG(ERR, "Unable to setup VFIO");
+		goto probe_fail;
+	}
+
+	ret = fslmc_vfio_process_group();
+	if (ret) {
+		FSLMC_BUS_LOG(ERR, "Unable to setup devices");
+		goto probe_fail;
+	}
+
 	TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) {
 		TAILQ_FOREACH(drv, &rte_fslmc_bus.driver_list, next) {
 			ret = rte_fslmc_match(drv, dev);
@@ -103,7 +261,12 @@ rte_fslmc_probe(void)
 			break;
 		}
 	}
-	return ret;
+
+	return 0;
+
+probe_fail:
+	RTE_LOG(DEBUG, EAL, "Error in probing FSLMC Bus. Skipping.\n");
+	return 0;
 }
 
 static struct rte_device *
diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
index f0d69a9..a27814e 100644
--- a/drivers/bus/fslmc/fslmc_vfio.c
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -68,13 +68,15 @@
 /** Pathname of FSL-MC devices directory. */
 #define SYSFS_FSL_MC_DEVICES "/sys/bus/fsl-mc/devices"
 
+#define FSLMC_CONTAINER_MAX_LEN 8 /**< Of the format dprc.XX */
+
 /* Number of VFIO containers & groups with in */
 static struct fslmc_vfio_group vfio_group;
 static struct fslmc_vfio_container vfio_container;
 static int container_device_fd;
+static char *g_container;
 static uint32_t *msi_intr_vaddr;
 void *(*rte_mcp_ptr_list);
-static uint32_t mcp_id;
 static int is_dma_done;
 
 static struct rte_dpaa2_object_list dpaa2_obj_list =
@@ -89,10 +91,57 @@ rte_fslmc_object_register(struct rte_dpaa2_object *object)
 	TAILQ_INSERT_TAIL(&dpaa2_obj_list, object, next);
 }
 
-static int vfio_connect_container(void)
+int
+fslmc_get_container_group(int *groupid)
+{
+	int ret;
+	char *container;
+
+	if (!g_container) {
+		container = getenv("DPRC");
+		if (container == NULL) {
+			RTE_LOG(WARNING, EAL,
+				"Environment variable DPRC not set.\n");
+			return -1;
+		}
+
+		if (strlen(container) >= FSLMC_CONTAINER_MAX_LEN) {
+			FSLMC_VFIO_LOG(ERR, "Invalid container name: %s\n",
+				       container);
+			return -1;
+		}
+
+		g_container = strdup(container);
+		if (!g_container) {
+			FSLMC_VFIO_LOG(ERR, "Out of memory.");
+			return -ENOMEM;
+		}
+	}
+
+	/* get group number */
+	ret = vfio_get_group_no(SYSFS_FSL_MC_DEVICES, g_container, groupid);
+	if (ret <= 0) {
+		FSLMC_VFIO_LOG(ERR, "Unable to find %s IOMMU group",
+			       g_container);
+		return -1;
+	}
+
+	FSLMC_VFIO_LOG(DEBUG, "Container: %s has VFIO iommu group id = %d",
+		       g_container, *groupid);
+
+	return 0;
+}
+
+static int
+vfio_connect_container(void)
 {
 	int fd, ret;
 
+	if (vfio_container.used) {
+		FSLMC_VFIO_LOG(DEBUG, "No container available.");
+		return -1;
+	}
+
 	/* Try connecting to vfio container if already created */
 	if (!ioctl(vfio_group.fd, VFIO_GROUP_SET_CONTAINER,
 		&vfio_container.fd)) {
@@ -284,48 +333,6 @@ static int64_t vfio_map_mcp_obj(struct fslmc_vfio_group *group, char *mcp_obj)
 	return v_addr;
 }
 
-static inline int
-dpaa2_compare_dpaa2_dev(const struct rte_dpaa2_device *dev,
-			 const struct rte_dpaa2_device *dev2)
-{
-	/*not the same family device */
-	if (dev->dev_type != DPAA2_ETH ||
-			dev->dev_type != DPAA2_CRYPTO)
-		return -1;
-
-	if (dev->object_id == dev2->object_id)
-		return 0;
-	else
-		return 1;
-}
-
-static void
-fslmc_bus_add_device(struct rte_dpaa2_device *dev)
-{
-	struct rte_fslmc_device_list *dev_l;
-
-	dev_l = &rte_fslmc_bus.device_list;
-
-	/* device is valid, add in list (sorted) */
-	if (TAILQ_EMPTY(dev_l)) {
-		TAILQ_INSERT_TAIL(dev_l, dev, next);
-	} else {
-		struct rte_dpaa2_device *dev2;
-		int ret;
-
-		TAILQ_FOREACH(dev2, dev_l, next) {
-			ret = dpaa2_compare_dpaa2_dev(dev, dev2);
-			if (ret <= 0)
-				continue;
-
-			TAILQ_INSERT_BEFORE(dev2, dev, next);
-			return;
-		}
-
-		TAILQ_INSERT_TAIL(dev_l, dev, next);
-	}
-}
-
 #define IRQ_SET_BUF_LEN  (sizeof(struct vfio_irq_set) + sizeof(int))
 
 int rte_dpaa2_intr_enable(struct rte_intr_handle *intr_handle,
@@ -360,283 +367,242 @@ int rte_dpaa2_intr_enable(struct rte_intr_handle *intr_handle,
 	return 0;
 }
 
-/* Following function shall fetch total available list of MC devices
- * from VFIO container & populate private list of devices and other
- * data structures
+/*
+ * fslmc_process_iodevices for processing only IO (ETH, CRYPTO, and possibly
+ * EVENT) devices.
  */
-int fslmc_vfio_process_group(void)
+static int
+fslmc_process_iodevices(struct rte_dpaa2_device *dev)
 {
-	struct fslmc_vfio_device *vdev;
+	int dev_fd;
 	struct vfio_device_info device_info = { .argsz = sizeof(device_info) };
-	char *temp_obj, *object_type, *mcp_obj, *dev_name;
-	int32_t object_id, i, dev_fd, ret;
-	DIR *d;
-	struct dirent *dir;
-	char path[PATH_MAX];
-	int64_t v_addr;
-	int ndev_count;
-	struct fslmc_vfio_group *group = &vfio_group;
-	static int process_once;
+	struct rte_dpaa2_object *object = NULL;
 
-	/* if already done once */
-	if (process_once) {
-		FSLMC_VFIO_LOG(DEBUG,
-			       "Already scanned once - re-scan not supported");
-		return 0;
+	dev_fd = ioctl(vfio_group.fd, VFIO_GROUP_GET_DEVICE_FD,
+		       dev->device.name);
+	if (dev_fd <= 0) {
+		FSLMC_VFIO_LOG(ERR, "Unable to obtain device FD for device:%s",
+			       dev->device.name);
+		return -1;
 	}
-	process_once = 0;
-
-	sprintf(path, "/sys/kernel/iommu_groups/%d/devices", group->groupid);
 
-	d = opendir(path);
-	if (!d) {
-		FSLMC_VFIO_LOG(ERR, "Unable to open directory %s", path);
+	if (ioctl(dev_fd, VFIO_DEVICE_GET_INFO, &device_info)) {
+		FSLMC_VFIO_LOG(ERR, "DPAA2 VFIO_DEVICE_GET_INFO fail");
 		return -1;
 	}
 
-	/*Counting the number of devices in a group and getting the mcp ID*/
-	ndev_count = 0;
-	mcp_obj = NULL;
-	while ((dir = readdir(d)) != NULL) {
-		if (dir->d_type == DT_LNK) {
-			ndev_count++;
-			if (!strncmp("dpmcp", dir->d_name, 5)) {
-				if (mcp_obj)
-					free(mcp_obj);
-				mcp_obj = malloc(sizeof(dir->d_name));
-				if (!mcp_obj) {
-					FSLMC_VFIO_LOG(ERR,
-						       "mcp obj:alloc failed");
-					closedir(d);
-					return -ENOMEM;
-				}
-				strcpy(mcp_obj, dir->d_name);
-				temp_obj = strtok(dir->d_name, ".");
-				temp_obj = strtok(NULL, ".");
-				sscanf(temp_obj, "%d", &mcp_id);
-			}
+	switch (dev->dev_type) {
+	case DPAA2_CON:
+	case DPAA2_IO:
+	case DPAA2_CI:
+	case DPAA2_BPOOL:
+		TAILQ_FOREACH(object, &dpaa2_obj_list, next) {
+			if (dev->dev_type == object->dev_type)
+				object->create(dev_fd, &device_info,
+					       dev->object_id);
+			else
+				continue;
 		}
+		break;
+	default:
+		break;
 	}
-	closedir(d);
-	d = NULL;
-	if (!mcp_obj) {
-		FSLMC_VFIO_LOG(ERR, "DPAA2 MCP Object not Found");
-		return -ENODEV;
-	}
-	RTE_LOG(INFO, EAL, "fslmc: DPRC contains = %d devices\n", ndev_count);
-
-	/* Allocate the memory depends upon number of objects in a group*/
-	group->vfio_device = (struct fslmc_vfio_device *)malloc(ndev_count *
-			     sizeof(struct fslmc_vfio_device));
-	if (!(group->vfio_device)) {
-		FSLMC_VFIO_LOG(ERR, "vfio device: Unable to allocate memory\n");
-		free(mcp_obj);
-		return -ENOMEM;
-	}
 
-	/* Allocate memory for MC Portal list */
+	FSLMC_VFIO_LOG(DEBUG, "Device (%s) abstracted from VFIO",
+		       dev->device.name);
+	return 0;
+}
+
+static int
+fslmc_process_mcp(struct rte_dpaa2_device *dev)
+{
+	int64_t v_addr;
+	char *dev_name;
+
 	rte_mcp_ptr_list = malloc(sizeof(void *) * 1);
 	if (!rte_mcp_ptr_list) {
-		FSLMC_VFIO_LOG(ERR, "portal list: Unable to allocate memory!");
-		free(mcp_obj);
-		goto FAILURE;
+		FSLMC_VFIO_LOG(ERR, "Out of memory");
+		return -ENOMEM;
 	}
 
-	v_addr = vfio_map_mcp_obj(group, mcp_obj);
-	free(mcp_obj);
-	if (v_addr == (int64_t)MAP_FAILED) {
-		FSLMC_VFIO_LOG(ERR, "Error mapping region (errno = %d)", errno);
-		goto FAILURE;
+	dev_name = strdup(dev->device.name);
+	if (!dev_name) {
+		FSLMC_VFIO_LOG(ERR, "Out of memory.");
+		free(rte_mcp_ptr_list);
+		rte_mcp_ptr_list = NULL;
+		return -ENOMEM;
 	}
 
-	rte_mcp_ptr_list[0] = (void *)v_addr;
-
-	d = opendir(path);
-	if (!d) {
-		FSLMC_VFIO_LOG(ERR, "Unable to open %s Directory", path);
-		goto FAILURE;
+	v_addr = vfio_map_mcp_obj(&vfio_group, dev_name);
+	if (v_addr == (int64_t)MAP_FAILED) {
+		FSLMC_VFIO_LOG(ERR, "Error mapping region  (errno = %d)",
+			       errno);
+		free(rte_mcp_ptr_list);
+		rte_mcp_ptr_list = NULL;
+		return -1;
 	}
 
-	i = 0;
-	/* Parsing each object and initiating them*/
-	while ((dir = readdir(d)) != NULL) {
-		if (dir->d_type != DT_LNK)
-			continue;
-		if (!strncmp("dprc", dir->d_name, 4) ||
-		    !strncmp("dpmcp", dir->d_name, 5))
-			continue;
-		dev_name = malloc(sizeof(dir->d_name));
-		if (!dev_name) {
-			FSLMC_VFIO_LOG(ERR, "name: Unable to allocate memory");
-			goto FAILURE;
-		}
-		strcpy(dev_name, dir->d_name);
-		object_type = strtok(dir->d_name, ".");
-		temp_obj = strtok(NULL, ".");
-		sscanf(temp_obj, "%d", &object_id);
-
-		/* getting the device fd*/
-		dev_fd = ioctl(group->fd, VFIO_GROUP_GET_DEVICE_FD, dev_name);
-		if (dev_fd < 0) {
-			FSLMC_VFIO_LOG(ERR,
-				       "GET_DEVICE_FD error fd: %s, Group: %d",
-				       dev_name, group->fd);
-			free(dev_name);
-			goto FAILURE;
-		}
+	rte_mcp_ptr_list[0] = (void *)v_addr;
 
-		free(dev_name);
-		vdev = &group->vfio_device[group->object_index++];
-		vdev->fd = dev_fd;
-		vdev->index = i;
-		i++;
-		/* Get Device inofrmation */
-		if (ioctl(vdev->fd, VFIO_DEVICE_GET_INFO, &device_info)) {
-			FSLMC_VFIO_LOG(ERR, "DPAA2 VFIO_DEVICE_GET_INFO fail");
-			goto FAILURE;
-		}
-		if (!strcmp(object_type, "dpni") ||
-		    !strcmp(object_type, "dpseci")) {
-			struct rte_dpaa2_device *dev;
+	return 0;
+}
 
-			dev = malloc(sizeof(struct rte_dpaa2_device));
-			if (dev == NULL)
+int
+fslmc_vfio_process_group(void)
+{
+	int ret;
+	int found_mportal = 0;
+	struct rte_dpaa2_device *dev, *dev_temp;
+
+	/* Search the MCP as that should be initialized first. */
+	TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) {
+		if (dev->dev_type == DPAA2_MPORTAL) {
+			ret = fslmc_process_mcp(dev);
+			if (ret) {
+				FSLMC_VFIO_LOG(DEBUG, "Unable to map Portal.");
 				return -1;
-
-			memset(dev, 0, sizeof(*dev));
-			/* store hw_id of dpni/dpseci device */
-			dev->object_id = object_id;
-			dev->dev_type = (strcmp(object_type, "dpseci")) ?
-				DPAA2_ETH : DPAA2_CRYPTO;
-
-			sprintf(dev->name, "%s.%d", object_type, object_id);
-			dev->device.name = dev->name;
-
-			fslmc_bus_add_device(dev);
-			FSLMC_VFIO_LOG(DEBUG, "DPAA2: Added %s", dev->name);
-		} else {
-			/* Parse all other objects */
-			struct rte_dpaa2_object *object;
-
-			TAILQ_FOREACH(object, &dpaa2_obj_list, next) {
-				if (!strcmp(object_type, object->name))
-					object->create(dev_fd, &device_info,
-						       object_id);
-				else
-					continue;
 			}
+			if (!found_mportal)
+				found_mportal = 1;
+
+			TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+			free(dev);
+			dev = NULL;
+			/* Ideally there is only a single dpmcp, but in case
+			 * multiple exists, looping on remaining devices.
+			 */
 		}
 	}
-	closedir(d);
 
-	ret = dpaa2_affine_qbman_swp();
-	if (ret)
-		FSLMC_VFIO_LOG(DEBUG, "Error in affining qbman swp %d", ret);
+	/* Cannot continue if there is not even a single mportal */
+	if (!found_mportal) {
+		FSLMC_VFIO_LOG(DEBUG,
+			       "No MC Portal device found. Not continuing.");
+		return -1;
+	}
+
+	TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) {
+		if (!dev)
+			break;
 
-	return 0;
+		switch (dev->dev_type) {
+		case DPAA2_ETH:
+		case DPAA2_CRYPTO:
+			ret = fslmc_process_iodevices(dev);
+			if (ret) {
+				FSLMC_VFIO_LOG(DEBUG,
+					       "Dev (%s) init failed.",
+					       dev->device.name);
+				return ret;
+			}
+			break;
+		case DPAA2_CON:
+		case DPAA2_IO:
+		case DPAA2_CI:
+		case DPAA2_BPOOL:
+			/* Call the object creation routine and remove the
+			 * device entry from device list
+			 */
+			ret = fslmc_process_iodevices(dev);
+			if (ret) {
+				FSLMC_VFIO_LOG(DEBUG,
+					       "Dev (%s) init failed.",
+					       dev->device.name);
+				return -1;
+			}
 
-FAILURE:
-	if (d)
-		closedir(d);
-	if (rte_mcp_ptr_list) {
-		free(rte_mcp_ptr_list);
-		rte_mcp_ptr_list = NULL;
+			/* This device is not required to be in the DPDK
+			 * exposed device list.
+			 */
+			TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+			free(dev);
+			dev = NULL;
+			break;
+		case DPAA2_UNKNOWN:
+		default:
+			/* Unknown - ignore */
+			FSLMC_VFIO_LOG(DEBUG, "Found unknown device (%s).",
+				       dev->device.name);
+			TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+			free(dev);
+			dev = NULL;
+		}
 	}
 
-	free(group->vfio_device);
-	group->vfio_device = NULL;
-	return -1;
+	return 0;
 }
 
-int fslmc_vfio_setup_group(void)
+int
+fslmc_vfio_setup_group(void)
 {
-	struct fslmc_vfio_group *group = NULL;
 	int groupid;
 	int ret;
-	char *container;
 	struct vfio_group_status status = { .argsz = sizeof(status) };
 
 	/* if already done once */
 	if (container_device_fd)
 		return 0;
 
-	container = getenv("DPRC");
-
-	if (container == NULL) {
-		FSLMC_VFIO_LOG(ERR, "VFIO container not set in env DPRC");
-		return -EOPNOTSUPP;
-	}
-
-	/* get group number */
-	ret = vfio_get_group_no(SYSFS_FSL_MC_DEVICES, container, &groupid);
-	if (ret == 0) {
-		RTE_LOG(WARNING, EAL, "%s not managed by VFIO, skipping\n",
-			container);
-		return -EOPNOTSUPP;
-	}
-
-	/* if negative, something failed */
-	if (ret < 0)
+	ret = fslmc_get_container_group(&groupid);
+	if (ret) {
+		FSLMC_VFIO_LOG(ERR, "Unable to obtain VFIO groupid.");
 		return ret;
+	}
 
-	FSLMC_VFIO_LOG(DEBUG, "VFIO iommu group id = %d", groupid);
-
-	/* Check if group already exists */
-	group = &vfio_group;
-	if (group->groupid == groupid) {
-		FSLMC_VFIO_LOG(ERR, "groupid already exists %d",
-			       groupid);
+	/* In case this group was already opened, continue without any
+	 * processing.
+	 */
+	if (vfio_group.groupid == groupid) {
+		FSLMC_VFIO_LOG(ERR, "groupid already exists %d", groupid);
 		return 0;
 	}
 
-	/* get the actual group fd */
+	/* Get the actual group fd */
 	ret = vfio_get_group_fd(groupid);
 	if (ret < 0)
 		return ret;
-	group->fd = ret;
+	vfio_group.fd = ret;
 
-	/*
-	 * at this point, we know that this group is viable (meaning,
-	 * all devices are either bound to VFIO or not bound to anything)
-	 */
-
-	ret = ioctl(group->fd, VFIO_GROUP_GET_STATUS, &status);
+	/* Check group viability */
+	ret = ioctl(vfio_group.fd, VFIO_GROUP_GET_STATUS, &status);
 	if (ret) {
-		FSLMC_VFIO_LOG(ERR, " VFIO error getting group status");
-		close(group->fd);
+		FSLMC_VFIO_LOG(ERR, "VFIO error getting group status");
+		close(vfio_group.fd);
 		return ret;
 	}
 
 	if (!(status.flags & VFIO_GROUP_FLAGS_VIABLE)) {
 		FSLMC_VFIO_LOG(ERR, "VFIO group not viable");
-		close(group->fd);
+		close(vfio_group.fd);
 		return -EPERM;
 	}
 	/* Since Group is VIABLE, Store the groupid */
-	group->groupid = groupid;
+	vfio_group.groupid = groupid;
 
 	/* check if group does not have a container yet */
 	if (!(status.flags & VFIO_GROUP_FLAGS_CONTAINER_SET)) {
 		/* Now connect this IOMMU group to given container */
 		ret = vfio_connect_container();
 		if (ret) {
-			FSLMC_VFIO_LOG(ERR, "VFIO error connecting container"
-				       " with groupid %d", groupid);
-			close(group->fd);
+			FSLMC_VFIO_LOG(ERR,
+				"Error connecting container with groupid %d",
+				groupid);
+			close(vfio_group.fd);
 			return ret;
 		}
 	}
 
 	/* Get Device information */
-	ret = ioctl(group->fd, VFIO_GROUP_GET_DEVICE_FD, container);
+	ret = ioctl(vfio_group.fd, VFIO_GROUP_GET_DEVICE_FD, g_container);
 	if (ret < 0) {
-		FSLMC_VFIO_LOG(ERR, "VFIO error getting device %s fd from"
-			       " group  %d", container, group->groupid);
+		FSLMC_VFIO_LOG(ERR, "Error getting device %s fd from group %d",
+			       g_container, vfio_group.groupid);
+		close(vfio_group.fd);
 		return ret;
 	}
 	container_device_fd = ret;
 	FSLMC_VFIO_LOG(DEBUG, "VFIO Container FD is [0x%X]",
-		     container_device_fd);
+		       container_device_fd);
 
 	return 0;
 }
diff --git a/drivers/bus/fslmc/fslmc_vfio.h b/drivers/bus/fslmc/fslmc_vfio.h
index 60a5743..edb86d0 100644
--- a/drivers/bus/fslmc/fslmc_vfio.h
+++ b/drivers/bus/fslmc/fslmc_vfio.h
@@ -36,7 +36,6 @@
 
 #include "eal_vfio.h"
 
-#define DPAA2_VENDOR_ID		0x1957
 #define DPAA2_MC_DPNI_DEVID	7
 #define DPAA2_MC_DPSECI_DEVID	3
 #define DPAA2_MC_DPCON_DEVID	5
@@ -44,7 +43,6 @@
 #define DPAA2_MC_DPBP_DEVID	10
 #define DPAA2_MC_DPCI_DEVID	11
 
-
 typedef struct fslmc_vfio_device {
 	int fd; /* fslmc root container device ?? */
 	int index; /*index of child object */
@@ -71,6 +69,8 @@ int rte_dpaa2_intr_enable(struct rte_intr_handle *intr_handle,
 
 int fslmc_vfio_setup_group(void);
 int fslmc_vfio_process_group(void);
+char *fslmc_get_container(void);
+int fslmc_get_container_group(int *gropuid);
 int rte_fslmc_vfio_dmamap(void);
 
 #endif /* _FSLMC_VFIO_H_ */
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
index da41849..7315555 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
@@ -59,7 +59,6 @@
 #include <rte_dev.h>
 
 #include <fslmc_logs.h>
-#include <fslmc_vfio.h>
 #include <rte_fslmc.h>
 #include "dpaa2_hw_pvt.h"
 #include "dpaa2_hw_dpio.h"
diff --git a/drivers/bus/fslmc/rte_fslmc.h b/drivers/bus/fslmc/rte_fslmc.h
index 2f684d9..4c32db6 100644
--- a/drivers/bus/fslmc/rte_fslmc.h
+++ b/drivers/bus/fslmc/rte_fslmc.h
@@ -56,6 +56,9 @@ extern "C" {
 #include <rte_interrupts.h>
 #include <rte_dev.h>
 #include <rte_bus.h>
+#include <rte_tailq.h>
+
+#include <fslmc_vfio.h>
 
 #define FSLMC_OBJECT_MAX_LEN 32   /**< Length of each device on bus */
 
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code
  2017-08-18 12:51 [PATCH 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
                   ` (5 preceding siblings ...)
  2017-08-18 12:51 ` [PATCH 6/6] bus/fslmc: refactor scan and probe functions Shreyansh Jain
@ 2017-08-25 10:19 ` Shreyansh Jain
  2017-08-25 10:19   ` [PATCH v2 1/6] bus/fslmc: support only single group and container Shreyansh Jain
                     ` (6 more replies)
  6 siblings, 7 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-25 10:19 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, ferruh.yigit, Shreyansh Jain

Change Log:
~~~~~~~~~~~
 v2:
   - Minor updates for logging (removed some logs and changed others
     to make it cleaner when application starts)

Brief:
~~~~~~

 -- v1 is at [3] --

In [1], during the IOVA Mapping patch set [2] discussion, it was
observed that DPAA2 scan was actually doing work meant for probing.

This patchset demarcates the roles of FSLMC bus scan and probe
functions much more clearly than before:

1. scan now only add devices into a list
 unlike previously, scan doesn't initialize the devices using the VFIO
 operations. Now, scan would only add the devices onto a local device
 list after marking their type and filling in device name.

2. probe would now perform VFIO operations
 in dpaa2, for the device added in list, an initialization needs
 to be done so as to enable the devices - before actually API calls
 can be served. Probe function now initializes the devices as well
 as links then to the Eth/Crypto drivers.

3. Refactoring some VFIO code
 This patch improves the overall code contained within DPAA2 bus
 for DPAA2 VFIO layer.

[1] http://dpdk.org/ml/archives/dev/2017-July/071270.html
[2] http://dpdk.org/ml/archives/dev/2017-July/070833.html
[3] http://dpdk.org/ml/archives/dev/2017-August/073011.html

Shreyansh Jain (6):
  bus/fslmc: support only single group and container
  bus/fslmc: introduce new device type enumerator
  crypto/dpaa2_sec: update driver type field
  net/dpaa2: update driver type field
  drivers: refactor DPAA2 object definition
  bus/fslmc: refactor scan and probe functions

 drivers/bus/fslmc/fslmc_bus.c               | 180 +++++++++-
 drivers/bus/fslmc/fslmc_vfio.c              | 520 +++++++++++++---------------
 drivers/bus/fslmc/fslmc_vfio.h              |  44 +--
 drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c    |   6 +-
 drivers/bus/fslmc/portal/dpaa2_hw_dpci.c    |   8 +-
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c    |   8 +-
 drivers/bus/fslmc/rte_bus_fslmc_version.map |   7 +
 drivers/bus/fslmc/rte_fslmc.h               |  63 +++-
 drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c |   2 +-
 drivers/event/dpaa2/dpaa2_hw_dpcon.c        |   8 +-
 drivers/net/dpaa2/dpaa2_ethdev.c            |   2 +-
 11 files changed, 485 insertions(+), 363 deletions(-)

-- 
2.9.3

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v2 1/6] bus/fslmc: support only single group and container
  2017-08-25 10:19 ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
@ 2017-08-25 10:19   ` Shreyansh Jain
  2017-09-18 11:15     ` santosh
  2017-08-25 10:19   ` [PATCH v2 2/6] bus/fslmc: introduce new device type enumerator Shreyansh Jain
                     ` (5 subsequent siblings)
  6 siblings, 1 reply; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-25 10:19 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, ferruh.yigit, Shreyansh Jain

Currently DPAA2 code doesn't support multiple groups and containers.
Remove such provision in code to simplify code.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/bus/fslmc/fslmc_vfio.c | 70 +++++++++++++++---------------------------
 drivers/bus/fslmc/fslmc_vfio.h |  3 +-
 2 files changed, 26 insertions(+), 47 deletions(-)

diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
index 45e5927..3423b57 100644
--- a/drivers/bus/fslmc/fslmc_vfio.c
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -62,8 +62,6 @@
 #include "portal/dpaa2_hw_pvt.h"
 #include "portal/dpaa2_hw_dpio.h"
 
-#define VFIO_MAX_CONTAINERS	1
-
 #define FSLMC_VFIO_LOG(level, fmt, args...) \
 	RTE_LOG(level, EAL, "%s(): " fmt "\n", __func__, ##args)
 
@@ -71,8 +69,8 @@
 #define SYSFS_FSL_MC_DEVICES "/sys/bus/fsl-mc/devices"
 
 /* Number of VFIO containers & groups with in */
-static struct fslmc_vfio_group vfio_groups[VFIO_MAX_GRP];
-static struct fslmc_vfio_container vfio_containers[VFIO_MAX_CONTAINERS];
+static struct fslmc_vfio_group vfio_group;
+static struct fslmc_vfio_container vfio_container;
 static int container_device_fd;
 static uint32_t *msi_intr_vaddr;
 void *(*rte_mcp_ptr_list);
@@ -90,22 +88,18 @@ rte_fslmc_object_register(struct rte_dpaa2_object *object)
 	TAILQ_INSERT_TAIL(&fslmc_obj_list, object, next);
 }
 
-static int vfio_connect_container(struct fslmc_vfio_group *vfio_group)
+static int vfio_connect_container(void)
 {
-	struct fslmc_vfio_container *container;
-	int i, fd, ret;
+	int fd, ret;
 
 	/* Try connecting to vfio container if already created */
-	for (i = 0; i < VFIO_MAX_CONTAINERS; i++) {
-		container = &vfio_containers[i];
-		if (!ioctl(vfio_group->fd, VFIO_GROUP_SET_CONTAINER,
-			   &container->fd)) {
-			FSLMC_VFIO_LOG(INFO,
-			    "Container pre-exists with FD[0x%x] for this group",
-			    container->fd);
-			vfio_group->container = container;
-			return 0;
-		}
+	if (!ioctl(vfio_group.fd, VFIO_GROUP_SET_CONTAINER,
+		&vfio_container.fd)) {
+		FSLMC_VFIO_LOG(INFO,
+		    "Container pre-exists with FD[0x%x] for this group",
+		    vfio_container.fd);
+		vfio_group.container = &vfio_container;
+		return 0;
 	}
 
 	/* Opens main vfio file descriptor which represents the "container" */
@@ -118,7 +112,7 @@ static int vfio_connect_container(struct fslmc_vfio_group *vfio_group)
 	/* Check whether support for SMMU type IOMMU present or not */
 	if (ioctl(fd, VFIO_CHECK_EXTENSION, VFIO_TYPE1_IOMMU)) {
 		/* Connect group to container */
-		ret = ioctl(vfio_group->fd, VFIO_GROUP_SET_CONTAINER, &fd);
+		ret = ioctl(vfio_group.fd, VFIO_GROUP_SET_CONTAINER, &fd);
 		if (ret) {
 			FSLMC_VFIO_LOG(ERR, "Failed to setup group container");
 			close(fd);
@@ -137,23 +131,11 @@ static int vfio_connect_container(struct fslmc_vfio_group *vfio_group)
 		return -EINVAL;
 	}
 
-	container = NULL;
-	for (i = 0; i < VFIO_MAX_CONTAINERS; i++) {
-		if (vfio_containers[i].used)
-			continue;
-		container = &vfio_containers[i];
-	}
-	if (!container) {
-		FSLMC_VFIO_LOG(ERR, "No free container found");
-		close(fd);
-		return -ENOMEM;
-	}
+	vfio_container.used = 1;
+	vfio_container.fd = fd;
+	vfio_container.group = &vfio_group;
+	vfio_group.container = &vfio_container;
 
-	container->used = 1;
-	container->fd = fd;
-	container->group_list[container->index] = vfio_group;
-	vfio_group->container = container;
-	container->index++;
 	return 0;
 }
 
@@ -222,7 +204,7 @@ int rte_fslmc_vfio_dmamap(void)
 #endif
 
 		/* SET DMA MAP for IOMMU */
-		group = &vfio_groups[0];
+		group = &vfio_group;
 
 		if (!group->container) {
 			FSLMC_VFIO_LOG(ERR, "Container is not connected ");
@@ -392,7 +374,7 @@ int fslmc_vfio_process_group(void)
 	char path[PATH_MAX];
 	int64_t v_addr;
 	int ndev_count;
-	struct fslmc_vfio_group *group = &vfio_groups[0];
+	struct fslmc_vfio_group *group = &vfio_group;
 	static int process_once;
 
 	/* if already done once */
@@ -569,7 +551,7 @@ int fslmc_vfio_setup_group(void)
 {
 	struct fslmc_vfio_group *group = NULL;
 	int groupid;
-	int ret, i;
+	int ret;
 	char *container;
 	struct vfio_group_status status = { .argsz = sizeof(status) };
 
@@ -599,13 +581,11 @@ int fslmc_vfio_setup_group(void)
 	FSLMC_VFIO_LOG(DEBUG, "VFIO iommu group id = %d", groupid);
 
 	/* Check if group already exists */
-	for (i = 0; i < VFIO_MAX_GRP; i++) {
-		group = &vfio_groups[i];
-		if (group->groupid == groupid) {
-			FSLMC_VFIO_LOG(ERR, "groupid already exists %d",
-				       groupid);
-			return 0;
-		}
+	group = &vfio_group;
+	if (group->groupid == groupid) {
+		FSLMC_VFIO_LOG(ERR, "groupid already exists %d",
+			       groupid);
+		return 0;
 	}
 
 	/* get the actual group fd */
@@ -637,7 +617,7 @@ int fslmc_vfio_setup_group(void)
 	/* check if group does not have a container yet */
 	if (!(status.flags & VFIO_GROUP_FLAGS_CONTAINER_SET)) {
 		/* Now connect this IOMMU group to given container */
-		ret = vfio_connect_container(group);
+		ret = vfio_connect_container();
 		if (ret) {
 			FSLMC_VFIO_LOG(ERR, "VFIO error connecting container"
 				       " with groupid %d", groupid);
diff --git a/drivers/bus/fslmc/fslmc_vfio.h b/drivers/bus/fslmc/fslmc_vfio.h
index 0aff9b1..942a33c 100644
--- a/drivers/bus/fslmc/fslmc_vfio.h
+++ b/drivers/bus/fslmc/fslmc_vfio.h
@@ -44,7 +44,6 @@
 #define DPAA2_MC_DPBP_DEVID	10
 #define DPAA2_MC_DPCI_DEVID	11
 
-#define VFIO_MAX_GRP 1
 
 typedef struct fslmc_vfio_device {
 	int fd; /* fslmc root container device ?? */
@@ -64,7 +63,7 @@ typedef struct fslmc_vfio_container {
 	int fd; /* /dev/vfio/vfio */
 	int used;
 	int index; /* index in group list */
-	struct fslmc_vfio_group *group_list[VFIO_MAX_GRP];
+	struct fslmc_vfio_group *group;
 } fslmc_vfio_container;
 
 struct rte_dpaa2_object;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v2 2/6] bus/fslmc: introduce new device type enumerator
  2017-08-25 10:19 ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
  2017-08-25 10:19   ` [PATCH v2 1/6] bus/fslmc: support only single group and container Shreyansh Jain
@ 2017-08-25 10:19   ` Shreyansh Jain
  2017-08-25 10:19   ` [PATCH v2 3/6] crypto/dpaa2_sec: update driver type field Shreyansh Jain
                     ` (4 subsequent siblings)
  6 siblings, 0 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-25 10:19 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, ferruh.yigit, Shreyansh Jain

Existing devices and drivers depended on device ID rather than type.
A new enumerator for all DPAA2 devices is introduced in this patch.

At this point, the probe would not be able to link DPAA2 devices
with the driver and I/O would not work. Subsequent patches will
fix this.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/bus/fslmc/fslmc_vfio.c              |  6 +++---
 drivers/bus/fslmc/rte_bus_fslmc_version.map |  7 +++++++
 drivers/bus/fslmc/rte_fslmc.h               | 24 ++++++++++++++++++++----
 3 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
index 3423b57..3b452e1 100644
--- a/drivers/bus/fslmc/fslmc_vfio.c
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -288,8 +288,8 @@ dpaa2_compare_dpaa2_dev(const struct rte_dpaa2_device *dev,
 			 const struct rte_dpaa2_device *dev2)
 {
 	/*not the same family device */
-	if (dev->dev_type != DPAA2_MC_DPNI_DEVID ||
-			dev->dev_type != DPAA2_MC_DPSECI_DEVID)
+	if (dev->dev_type != DPAA2_ETH ||
+			dev->dev_type != DPAA2_CRYPTO)
 		return -1;
 
 	if (dev->object_id == dev2->object_id)
@@ -506,7 +506,7 @@ int fslmc_vfio_process_group(void)
 			/* store hw_id of dpni/dpseci device */
 			dev->object_id = object_id;
 			dev->dev_type = (strcmp(object_type, "dpseci")) ?
-				DPAA2_MC_DPNI_DEVID : DPAA2_MC_DPSECI_DEVID;
+				DPAA2_ETH : DPAA2_CRYPTO;
 
 			sprintf(dev->name, "%s.%d", object_type, object_id);
 			dev->device.name = dev->name;
diff --git a/drivers/bus/fslmc/rte_bus_fslmc_version.map b/drivers/bus/fslmc/rte_bus_fslmc_version.map
index 3cdf14e..6ac256d 100644
--- a/drivers/bus/fslmc/rte_bus_fslmc_version.map
+++ b/drivers/bus/fslmc/rte_bus_fslmc_version.map
@@ -77,3 +77,10 @@ DPDK_17.08 {
 	rte_global_active_dqs_list;
 
 } DPDK_17.05;
+
+DPDK_17.11 {
+	global:
+
+	rte_dpaa2_dev_type;
+
+} DPDK_17.08;
diff --git a/drivers/bus/fslmc/rte_fslmc.h b/drivers/bus/fslmc/rte_fslmc.h
index e60d6eb..ff7a49e 100644
--- a/drivers/bus/fslmc/rte_fslmc.h
+++ b/drivers/bus/fslmc/rte_fslmc.h
@@ -56,6 +56,8 @@ extern "C" {
 #include <rte_dev.h>
 #include <rte_bus.h>
 
+#define FSLMC_OBJECT_MAX_LEN 32   /**< Length of each device on bus */
+
 struct rte_dpaa2_driver;
 
 /* DPAA2 Device and Driver lists for FSLMC bus */
@@ -64,6 +66,20 @@ TAILQ_HEAD(rte_fslmc_driver_list, rte_dpaa2_driver);
 
 extern struct rte_fslmc_bus rte_fslmc_bus;
 
+enum rte_dpaa2_dev_type {
+	/* Devices backed by DPDK driver */
+	DPAA2_ETH,	/**< DPNI type device*/
+	DPAA2_CRYPTO,	/**< DPSECI type device */
+	DPAA2_CON,	/**< DPCONC type device */
+	/* Devices not backed by a DPDK driver: DPIO, DPBP, DPCI, DPMCP */
+	DPAA2_BPOOL,	/**< DPBP type device */
+	DPAA2_IO,	/**< DPIO type device */
+	DPAA2_CI,	/**< DPCI type device */
+	DPAA2_MPORTAL,  /**< DPMCP type device */
+	/* Unknown device placeholder */
+	DPAA2_UNKNOWN
+};
+
 /**
  * A structure describing a DPAA2 device.
  */
@@ -74,11 +90,11 @@ struct rte_dpaa2_device {
 		struct rte_eth_dev *eth_dev;        /**< ethernet device */
 		struct rte_cryptodev *cryptodev;    /**< Crypto Device */
 	};
-	uint16_t dev_type;                  /**< Device Type */
-	uint16_t object_id;             /**< DPAA2 Object ID */
+	enum rte_dpaa2_dev_type dev_type;   /**< Device Type */
+	uint16_t object_id;                 /**< DPAA2 Object ID */
 	struct rte_intr_handle intr_handle; /**< Interrupt handle */
 	struct rte_dpaa2_driver *driver;    /**< Associated driver */
-	char name[32];          /**< DPAA2 Object name*/
+	char name[FSLMC_OBJECT_MAX_LEN];    /**< DPAA2 Object name*/
 };
 
 typedef int (*rte_dpaa2_probe_t)(struct rte_dpaa2_driver *dpaa2_drv,
@@ -93,7 +109,7 @@ struct rte_dpaa2_driver {
 	struct rte_driver driver;           /**< Inherit core driver. */
 	struct rte_fslmc_bus *fslmc_bus;    /**< FSLMC bus reference */
 	uint32_t drv_flags;                 /**< Flags for controlling device.*/
-	uint16_t drv_type;                  /**< Driver Type */
+	enum rte_dpaa2_dev_type drv_type;   /**< Driver Type */
 	rte_dpaa2_probe_t probe;
 	rte_dpaa2_remove_t remove;
 };
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v2 3/6] crypto/dpaa2_sec: update driver type field
  2017-08-25 10:19 ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
  2017-08-25 10:19   ` [PATCH v2 1/6] bus/fslmc: support only single group and container Shreyansh Jain
  2017-08-25 10:19   ` [PATCH v2 2/6] bus/fslmc: introduce new device type enumerator Shreyansh Jain
@ 2017-08-25 10:19   ` Shreyansh Jain
  2017-08-25 10:19   ` [PATCH v2 4/6] net/dpaa2: " Shreyansh Jain
                     ` (3 subsequent siblings)
  6 siblings, 0 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-25 10:19 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, ferruh.yigit, Shreyansh Jain

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c b/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
index e0f6cfc..95c3951 100644
--- a/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
+++ b/drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c
@@ -2000,7 +2000,7 @@ cryptodev_dpaa2_sec_remove(struct rte_dpaa2_device *dpaa2_dev)
 }
 
 static struct rte_dpaa2_driver rte_dpaa2_sec_driver = {
-	.drv_type = DPAA2_MC_DPSECI_DEVID,
+	.drv_type = DPAA2_CRYPTO,
 	.driver = {
 		.name = "DPAA2 SEC PMD"
 	},
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v2 4/6] net/dpaa2: update driver type field
  2017-08-25 10:19 ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
                     ` (2 preceding siblings ...)
  2017-08-25 10:19   ` [PATCH v2 3/6] crypto/dpaa2_sec: update driver type field Shreyansh Jain
@ 2017-08-25 10:19   ` Shreyansh Jain
  2017-08-25 10:19   ` [PATCH v2 5/6] drivers: refactor DPAA2 object definition Shreyansh Jain
                     ` (2 subsequent siblings)
  6 siblings, 0 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-25 10:19 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, ferruh.yigit, Shreyansh Jain

Shifting from existing device identifier to driver type field.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/net/dpaa2/dpaa2_ethdev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 429b3a0..360109e 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -1588,7 +1588,7 @@ rte_dpaa2_remove(struct rte_dpaa2_device *dpaa2_dev)
 }
 
 static struct rte_dpaa2_driver rte_dpaa2_pmd = {
-	.drv_type = DPAA2_MC_DPNI_DEVID,
+	.drv_type = DPAA2_ETH,
 	.probe = rte_dpaa2_probe,
 	.remove = rte_dpaa2_remove,
 };
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v2 5/6] drivers: refactor DPAA2 object definition
  2017-08-25 10:19 ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
                     ` (3 preceding siblings ...)
  2017-08-25 10:19   ` [PATCH v2 4/6] net/dpaa2: " Shreyansh Jain
@ 2017-08-25 10:19   ` Shreyansh Jain
  2017-08-25 10:19   ` [PATCH v2 6/6] bus/fslmc: refactor scan and probe functions Shreyansh Jain
  2017-09-11 14:06   ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Ferruh Yigit
  6 siblings, 0 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-25 10:19 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, ferruh.yigit, Shreyansh Jain

Initially, DPAA2 objects (except ETH and CRYPTO) were defined from VFIO
layer. This patch moves that into Bus definition.
This patch also realigns the object types with the new device types.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/bus/fslmc/fslmc_vfio.c           | 11 +++++-----
 drivers/bus/fslmc/fslmc_vfio.h           | 37 --------------------------------
 drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c |  6 +++---
 drivers/bus/fslmc/portal/dpaa2_hw_dpci.c |  8 +++----
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c |  7 +++---
 drivers/bus/fslmc/rte_fslmc.h            | 36 +++++++++++++++++++++++++++++++
 drivers/event/dpaa2/dpaa2_hw_dpcon.c     |  8 +++----
 7 files changed, 57 insertions(+), 56 deletions(-)

diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
index 3b452e1..f0d69a9 100644
--- a/drivers/bus/fslmc/fslmc_vfio.c
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -76,8 +76,9 @@ static uint32_t *msi_intr_vaddr;
 void *(*rte_mcp_ptr_list);
 static uint32_t mcp_id;
 static int is_dma_done;
-static struct rte_fslmc_object_list fslmc_obj_list =
-	TAILQ_HEAD_INITIALIZER(fslmc_obj_list);
+
+static struct rte_dpaa2_object_list dpaa2_obj_list =
+	TAILQ_HEAD_INITIALIZER(dpaa2_obj_list);
 
 /*register a fslmc bus based dpaa2 driver */
 void
@@ -85,7 +86,7 @@ rte_fslmc_object_register(struct rte_dpaa2_object *object)
 {
 	RTE_VERIFY(object);
 
-	TAILQ_INSERT_TAIL(&fslmc_obj_list, object, next);
+	TAILQ_INSERT_TAIL(&dpaa2_obj_list, object, next);
 }
 
 static int vfio_connect_container(void)
@@ -517,9 +518,9 @@ int fslmc_vfio_process_group(void)
 			/* Parse all other objects */
 			struct rte_dpaa2_object *object;
 
-			TAILQ_FOREACH(object, &fslmc_obj_list, next) {
+			TAILQ_FOREACH(object, &dpaa2_obj_list, next) {
 				if (!strcmp(object_type, object->name))
-					object->create(vdev, &device_info,
+					object->create(dev_fd, &device_info,
 						       object_id);
 				else
 					continue;
diff --git a/drivers/bus/fslmc/fslmc_vfio.h b/drivers/bus/fslmc/fslmc_vfio.h
index 942a33c..60a5743 100644
--- a/drivers/bus/fslmc/fslmc_vfio.h
+++ b/drivers/bus/fslmc/fslmc_vfio.h
@@ -66,24 +66,6 @@ typedef struct fslmc_vfio_container {
 	struct fslmc_vfio_group *group;
 } fslmc_vfio_container;
 
-struct rte_dpaa2_object;
-
-TAILQ_HEAD(rte_fslmc_object_list, rte_dpaa2_object);
-
-typedef int (*rte_fslmc_obj_create_t)(struct fslmc_vfio_device *vdev,
-					 struct vfio_device_info *obj_info,
-					 int object_id);
-
-/**
- * A structure describing a DPAA2 driver.
- */
-struct rte_dpaa2_object {
-	TAILQ_ENTRY(rte_dpaa2_object) next; /**< Next in list. */
-	const char *name;            /**< Name of Object. */
-	uint16_t object_id;             /**< DPAA2 Object ID */
-	rte_fslmc_obj_create_t create;
-};
-
 int rte_dpaa2_intr_enable(struct rte_intr_handle *intr_handle,
 			  uint32_t index);
 
@@ -91,23 +73,4 @@ int fslmc_vfio_setup_group(void);
 int fslmc_vfio_process_group(void);
 int rte_fslmc_vfio_dmamap(void);
 
-/**
- * Register a DPAA2 MC Object driver.
- *
- * @param mc_object
- *   A pointer to a rte_dpaa_object structure describing the mc object
- *   to be registered.
- */
-void rte_fslmc_object_register(struct rte_dpaa2_object *object);
-
-/** Helper for DPAA2 object registration */
-#define RTE_PMD_REGISTER_DPAA2_OBJECT(nm, dpaa2_obj) \
-RTE_INIT(dpaa2objinitfn_ ##nm); \
-static void dpaa2objinitfn_ ##nm(void) \
-{\
-	(dpaa2_obj).name = RTE_STR(nm);\
-	rte_fslmc_object_register(&dpaa2_obj); \
-} \
-RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
-
 #endif /* _FSLMC_VFIO_H_ */
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
index 33f9eed..1ddd280 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
@@ -48,7 +48,7 @@
 #include <rte_ethdev.h>
 
 #include <fslmc_logs.h>
-#include <fslmc_vfio.h>
+#include <rte_fslmc.h>
 #include <mc/fsl_dpbp.h>
 #include "portal/dpaa2_hw_pvt.h"
 #include "portal/dpaa2_hw_dpio.h"
@@ -58,7 +58,7 @@ static struct dpbp_dev_list dpbp_dev_list
 	= TAILQ_HEAD_INITIALIZER(dpbp_dev_list); /*!< DPBP device list */
 
 static int
-dpaa2_create_dpbp_device(struct fslmc_vfio_device *vdev __rte_unused,
+dpaa2_create_dpbp_device(int vdev_fd __rte_unused,
 			 struct vfio_device_info *obj_info __rte_unused,
 			 int dpbp_id)
 {
@@ -130,7 +130,7 @@ void dpaa2_free_dpbp_dev(struct dpaa2_dpbp_dev *dpbp)
 }
 
 static struct rte_dpaa2_object rte_dpaa2_dpbp_obj = {
-	.object_id = DPAA2_MC_DPBP_DEVID,
+	.dev_type = DPAA2_BPOOL,
 	.create = dpaa2_create_dpbp_device,
 };
 
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c
index 478e4f7..b60a745 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c
@@ -47,7 +47,7 @@
 #include <rte_ethdev.h>
 
 #include <fslmc_logs.h>
-#include <fslmc_vfio.h>
+#include <rte_fslmc.h>
 #include <mc/fsl_dpci.h>
 #include "portal/dpaa2_hw_pvt.h"
 #include "portal/dpaa2_hw_dpio.h"
@@ -57,9 +57,9 @@ static struct dpci_dev_list dpci_dev_list
 	= TAILQ_HEAD_INITIALIZER(dpci_dev_list); /*!< DPCI device list */
 
 static int
-rte_dpaa2_create_dpci_device(struct fslmc_vfio_device *vdev __rte_unused,
+rte_dpaa2_create_dpci_device(int vdev_fd __rte_unused,
 			     struct vfio_device_info *obj_info __rte_unused,
-				int dpci_id)
+			     int dpci_id)
 {
 	struct dpaa2_dpci_dev *dpci_node;
 	struct dpci_attr attr;
@@ -172,7 +172,7 @@ void rte_dpaa2_free_dpci_dev(struct dpaa2_dpci_dev *dpci)
 }
 
 static struct rte_dpaa2_object rte_dpaa2_dpci_obj = {
-	.object_id = DPAA2_MC_DPCI_DEVID,
+	.dev_type = DPAA2_CI,
 	.create = rte_dpaa2_create_dpci_device,
 };
 
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
index 283441b..da41849 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
@@ -60,6 +60,7 @@
 
 #include <fslmc_logs.h>
 #include <fslmc_vfio.h>
+#include <rte_fslmc.h>
 #include "dpaa2_hw_pvt.h"
 #include "dpaa2_hw_dpio.h"
 #include <mc/fsl_dpmng.h>
@@ -428,7 +429,7 @@ dpaa2_affine_qbman_swp_sec(void)
 }
 
 static int
-dpaa2_create_dpio_device(struct fslmc_vfio_device *vdev,
+dpaa2_create_dpio_device(int vdev_fd,
 			 struct vfio_device_info *obj_info,
 			 int object_id)
 {
@@ -451,7 +452,7 @@ dpaa2_create_dpio_device(struct fslmc_vfio_device *vdev,
 
 	dpio_dev->dpio = NULL;
 	dpio_dev->hw_id = object_id;
-	dpio_dev->intr_handle.vfio_dev_fd = vdev->fd;
+	dpio_dev->intr_handle.vfio_dev_fd = vdev_fd;
 	rte_atomic16_init(&dpio_dev->ref_count);
 	/* Using single portal  for all devices */
 	dpio_dev->mc_portal = rte_mcp_ptr_list[MC_PORTAL_INDEX];
@@ -529,7 +530,7 @@ dpaa2_alloc_dq_storage(struct queue_storage_info_t *q_storage)
 }
 
 static struct rte_dpaa2_object rte_dpaa2_dpio_obj = {
-	.object_id = DPAA2_MC_DPIO_DEVID,
+	.dev_type = DPAA2_IO,
 	.create = dpaa2_create_dpio_device,
 };
 
diff --git a/drivers/bus/fslmc/rte_fslmc.h b/drivers/bus/fslmc/rte_fslmc.h
index ff7a49e..2f684d9 100644
--- a/drivers/bus/fslmc/rte_fslmc.h
+++ b/drivers/bus/fslmc/rte_fslmc.h
@@ -50,6 +50,7 @@ extern "C" {
 #include <sys/queue.h>
 #include <stdint.h>
 #include <inttypes.h>
+#include <linux/vfio.h>
 
 #include <rte_debug.h>
 #include <rte_interrupts.h>
@@ -80,6 +81,22 @@ enum rte_dpaa2_dev_type {
 	DPAA2_UNKNOWN
 };
 
+TAILQ_HEAD(rte_dpaa2_object_list, rte_dpaa2_object);
+
+typedef int (*rte_dpaa2_obj_create_t)(int vdev_fd,
+				      struct vfio_device_info *obj_info,
+				      int object_id);
+
+/**
+ * A structure describing a DPAA2 object.
+ */
+struct rte_dpaa2_object {
+	TAILQ_ENTRY(rte_dpaa2_object) next; /**< Next in list. */
+	const char *name;                   /**< Name of Object. */
+	enum rte_dpaa2_dev_type dev_type;   /**< Type of device */
+	rte_dpaa2_obj_create_t create;
+};
+
 /**
  * A structure describing a DPAA2 device.
  */
@@ -159,4 +176,23 @@ RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
 }
 #endif
 
+/**
+ * Register a DPAA2 MC Object driver.
+ *
+ * @param mc_object
+ *   A pointer to a rte_dpaa_object structure describing the mc object
+ *   to be registered.
+ */
+void rte_fslmc_object_register(struct rte_dpaa2_object *object);
+
+/** Helper for DPAA2 object registration */
+#define RTE_PMD_REGISTER_DPAA2_OBJECT(nm, dpaa2_obj) \
+RTE_INIT(dpaa2objinitfn_ ##nm); \
+static void dpaa2objinitfn_ ##nm(void) \
+{\
+	(dpaa2_obj).name = RTE_STR(nm);\
+	rte_fslmc_object_register(&dpaa2_obj); \
+} \
+RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
+
 #endif /* _RTE_FSLMC_H_ */
diff --git a/drivers/event/dpaa2/dpaa2_hw_dpcon.c b/drivers/event/dpaa2/dpaa2_hw_dpcon.c
index d3e73f9..2c416b5 100644
--- a/drivers/event/dpaa2/dpaa2_hw_dpcon.c
+++ b/drivers/event/dpaa2/dpaa2_hw_dpcon.c
@@ -46,7 +46,7 @@
 #include <rte_dev.h>
 #include <rte_ethdev.h>
 
-#include <fslmc_vfio.h>
+#include <rte_fslmc.h>
 #include <mc/fsl_dpcon.h>
 #include <portal/dpaa2_hw_pvt.h>
 #include "dpaa2_eventdev.h"
@@ -56,9 +56,9 @@ static struct dpcon_dev_list dpcon_dev_list
 	= TAILQ_HEAD_INITIALIZER(dpcon_dev_list); /*!< DPCON device list */
 
 static int
-rte_dpaa2_create_dpcon_device(struct fslmc_vfio_device *vdev __rte_unused,
+rte_dpaa2_create_dpcon_device(int dev_fd __rte_unused,
 			      struct vfio_device_info *obj_info __rte_unused,
-			 int dpcon_id)
+			      int dpcon_id)
 {
 	struct dpaa2_dpcon_dev *dpcon_node;
 	struct dpcon_attr attr;
@@ -132,7 +132,7 @@ void rte_dpaa2_free_dpcon_dev(struct dpaa2_dpcon_dev *dpcon)
 }
 
 static struct rte_dpaa2_object rte_dpaa2_dpcon_obj = {
-	.object_id = DPAA2_MC_DPCON_DEVID,
+	.dev_type = DPAA2_CON,
 	.create = rte_dpaa2_create_dpcon_device,
 };
 
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v2 6/6] bus/fslmc: refactor scan and probe functions
  2017-08-25 10:19 ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
                     ` (4 preceding siblings ...)
  2017-08-25 10:19   ` [PATCH v2 5/6] drivers: refactor DPAA2 object definition Shreyansh Jain
@ 2017-08-25 10:19   ` Shreyansh Jain
  2017-09-11 14:06   ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Ferruh Yigit
  6 siblings, 0 replies; 20+ messages in thread
From: Shreyansh Jain @ 2017-08-25 10:19 UTC (permalink / raw)
  To: dev; +Cc: hemant.agrawal, thomas, ferruh.yigit, Shreyansh Jain

Scan now searches for devices through sysfs interface and adds them
to a list for later initialization. During probe, each device is
initialized accroding to its property.

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 drivers/bus/fslmc/fslmc_bus.c            | 180 +++++++++++-
 drivers/bus/fslmc/fslmc_vfio.c           | 455 ++++++++++++++-----------------
 drivers/bus/fslmc/fslmc_vfio.h           |   4 +-
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c |   1 -
 drivers/bus/fslmc/rte_fslmc.h            |   3 +
 5 files changed, 381 insertions(+), 262 deletions(-)

diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c
index f71598d..d50c303 100644
--- a/drivers/bus/fslmc/fslmc_bus.c
+++ b/drivers/bus/fslmc/fslmc_bus.c
@@ -42,32 +42,170 @@
 #include <rte_memcpy.h>
 #include <rte_ethdev.h>
 
-#include "rte_fslmc.h"
-#include "fslmc_vfio.h"
+#include <rte_fslmc.h>
+#include <fslmc_vfio.h>
 
 #define FSLMC_BUS_LOG(level, fmt, args...) \
-	RTE_LOG(level, EAL, "%s(): " fmt "\n", __func__, ##args)
+	RTE_LOG(level, EAL, fmt "\n", ##args)
+
+#define VFIO_IOMMU_GROUP_PATH "/sys/kernel/iommu_groups"
 
 struct rte_fslmc_bus rte_fslmc_bus;
 
+static void
+cleanup_fslmc_device_list(void)
+{
+	struct rte_dpaa2_device *dev;
+	struct rte_dpaa2_device *t_dev;
+
+	TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, t_dev) {
+		TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+		free(dev);
+		dev = NULL;
+	}
+}
+
+static int
+scan_one_fslmc_device(char *dev_name)
+{
+	char *dup_dev_name, *t_ptr;
+	struct rte_dpaa2_device *dev;
+
+	if (!dev_name)
+		return -1;
+
+	/* Ignore the Container name itself */
+	if (!strncmp("dprc", dev_name, 4))
+		return 0;
+
+	/* Creating a temporary copy to perform cut-parse over string */
+	dup_dev_name = strdup(dev_name);
+	if (!dup_dev_name) {
+		FSLMC_BUS_LOG(ERR, "Out of memory.");
+		return -ENOMEM;
+	}
+
+	/* For all other devices, we allocate rte_dpaa2_device.
+	 * For those devices where there is no driver, probe would release
+	 * the memory associated with the rte_dpaa2_device after necessary
+	 * initialization.
+	 */
+	dev = calloc(1, sizeof(struct rte_dpaa2_device));
+	if (!dev) {
+		FSLMC_BUS_LOG(ERR, "Out of memory.");
+		free(dup_dev_name);
+		return -ENOMEM;
+	}
+
+	/* Parse the device name and ID */
+	t_ptr = strtok(dup_dev_name, ".");
+	if (!t_ptr) {
+		FSLMC_BUS_LOG(ERR, "Incorrect device string observed.");
+		goto cleanup;
+	}
+	if (!strncmp("dpni", t_ptr, 4))
+		dev->dev_type = DPAA2_ETH;
+	else if (!strncmp("dpseci", t_ptr, 6))
+		dev->dev_type = DPAA2_CRYPTO;
+	else if (!strncmp("dpcon", t_ptr, 5))
+		dev->dev_type = DPAA2_CON;
+	else if (!strncmp("dpbp", t_ptr, 4))
+		dev->dev_type = DPAA2_BPOOL;
+	else if (!strncmp("dpio", t_ptr, 4))
+		dev->dev_type = DPAA2_IO;
+	else if (!strncmp("dpci", t_ptr, 5))
+		dev->dev_type = DPAA2_CI;
+	else if (!strncmp("dpmcp", t_ptr, 5))
+		dev->dev_type = DPAA2_MPORTAL;
+	else
+		dev->dev_type = DPAA2_UNKNOWN;
+
+	t_ptr = strtok(NULL, ".");
+	if (!t_ptr) {
+		FSLMC_BUS_LOG(ERR, "Incorrect device string observed (%s).",
+			      t_ptr);
+		goto cleanup;
+	}
+
+	sscanf(t_ptr, "%hu", &dev->object_id);
+	dev->device.name = strdup(dev_name);
+	if (!dev->device.name) {
+		FSLMC_BUS_LOG(ERR, "Out of memory.");
+		goto cleanup;
+	}
+
+	/* Add device in the fslmc device list */
+	TAILQ_INSERT_TAIL(&rte_fslmc_bus.device_list, dev, next);
+
+	/* Don't need the duplicated device filesystem entry anymore */
+	if (dup_dev_name)
+		free(dup_dev_name);
+
+	return 0;
+cleanup:
+	if (dup_dev_name)
+		free(dup_dev_name);
+	if (dev)
+		free(dev);
+	return -1;
+}
+
 static int
 rte_fslmc_scan(void)
 {
 	int ret;
+	int device_count = 0;
+	char fslmc_dirpath[PATH_MAX];
+	DIR *dir;
+	struct dirent *entry;
+	static int process_once;
+	int groupid;
 
-	ret = fslmc_vfio_setup_group();
-	if (ret) {
-		FSLMC_BUS_LOG(ERR, "fslmc: Unable to setup VFIO");
-		return ret;
+	if (process_once) {
+		FSLMC_BUS_LOG(DEBUG,
+			      "Fslmc bus already scanned. Not rescanning");
+		return 0;
 	}
+	process_once = 1;
 
-	ret = fslmc_vfio_process_group();
-	if (ret) {
-		FSLMC_BUS_LOG(ERR, "fslmc: Unable to setup devices");
-		return -1;
+	ret = fslmc_get_container_group(&groupid);
+	if (ret != 0)
+		goto scan_fail;
+
+	/* Scan devices on the group */
+	sprintf(fslmc_dirpath, "%s/%d/devices", VFIO_IOMMU_GROUP_PATH,
+		groupid);
+	dir = opendir(fslmc_dirpath);
+	if (!dir) {
+		FSLMC_BUS_LOG(ERR, "Unable to open VFIO group dir.");
+		goto scan_fail;
 	}
 
-	RTE_LOG(INFO, EAL, "fslmc: Bus scan completed\n");
+	while ((entry = readdir(dir)) != NULL) {
+		if (entry->d_name[0] == '.' || entry->d_type != DT_LNK)
+			continue;
+
+		ret = scan_one_fslmc_device(entry->d_name);
+		if (ret != 0) {
+			/* Error in parsing directory - exit gracefully */
+			goto scan_fail_cleanup;
+		}
+		device_count += 1;
+	}
+
+	FSLMC_BUS_LOG(INFO, "fslmc: Bus scan completed");
+
+	closedir(dir);
+	return 0;
+
+scan_fail_cleanup:
+	closedir(dir);
+
+	/* Remove all devices in the list */
+	cleanup_fslmc_device_list();
+scan_fail:
+	FSLMC_BUS_LOG(DEBUG, "FSLMC Bus Not Available. Skipping.");
+	/* Irrespective of failure, scan only return success */
 	return 0;
 }
 
@@ -88,6 +226,21 @@ rte_fslmc_probe(void)
 	struct rte_dpaa2_device *dev;
 	struct rte_dpaa2_driver *drv;
 
+	if (TAILQ_EMPTY(&rte_fslmc_bus.device_list))
+		return 0;
+
+	ret = fslmc_vfio_setup_group();
+	if (ret) {
+		FSLMC_BUS_LOG(ERR, "Unable to setup VFIO %d", ret);
+		return 0;
+	}
+
+	ret = fslmc_vfio_process_group();
+	if (ret) {
+		FSLMC_BUS_LOG(ERR, "Unable to setup devices %d", ret);
+		return 0;
+	}
+
 	TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) {
 		TAILQ_FOREACH(drv, &rte_fslmc_bus.driver_list, next) {
 			ret = rte_fslmc_match(drv, dev);
@@ -103,7 +256,8 @@ rte_fslmc_probe(void)
 			break;
 		}
 	}
-	return ret;
+
+	return 0;
 }
 
 static struct rte_device *
diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
index f0d69a9..a1309b3 100644
--- a/drivers/bus/fslmc/fslmc_vfio.c
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -63,18 +63,20 @@
 #include "portal/dpaa2_hw_dpio.h"
 
 #define FSLMC_VFIO_LOG(level, fmt, args...) \
-	RTE_LOG(level, EAL, "%s(): " fmt "\n", __func__, ##args)
+	RTE_LOG(level, EAL, fmt "\n", ##args)
 
 /** Pathname of FSL-MC devices directory. */
 #define SYSFS_FSL_MC_DEVICES "/sys/bus/fsl-mc/devices"
 
+#define FSLMC_CONTAINER_MAX_LEN 8 /**< Of the format dprc.XX */
+
 /* Number of VFIO containers & groups with in */
 static struct fslmc_vfio_group vfio_group;
 static struct fslmc_vfio_container vfio_container;
 static int container_device_fd;
+static char *g_container;
 static uint32_t *msi_intr_vaddr;
 void *(*rte_mcp_ptr_list);
-static uint32_t mcp_id;
 static int is_dma_done;
 
 static struct rte_dpaa2_object_list dpaa2_obj_list =
@@ -89,10 +91,56 @@ rte_fslmc_object_register(struct rte_dpaa2_object *object)
 	TAILQ_INSERT_TAIL(&dpaa2_obj_list, object, next);
 }
 
-static int vfio_connect_container(void)
+int
+fslmc_get_container_group(int *groupid)
+{
+	int ret;
+	char *container;
+
+	if (!g_container) {
+		container = getenv("DPRC");
+		if (container == NULL) {
+			RTE_LOG(WARNING, EAL, "DPAA2: DPRC not available\n");
+			return -EINVAL;
+		}
+
+		if (strlen(container) >= FSLMC_CONTAINER_MAX_LEN) {
+			FSLMC_VFIO_LOG(ERR, "Invalid container name: %s\n",
+				       container);
+			return -1;
+		}
+
+		g_container = strdup(container);
+		if (!g_container) {
+			FSLMC_VFIO_LOG(ERR, "Out of memory.");
+			return -ENOMEM;
+		}
+	}
+
+	/* get group number */
+	ret = vfio_get_group_no(SYSFS_FSL_MC_DEVICES, g_container, groupid);
+	if (ret <= 0) {
+		FSLMC_VFIO_LOG(ERR, "Unable to find %s IOMMU group",
+			       g_container);
+		return -1;
+	}
+
+	FSLMC_VFIO_LOG(DEBUG, "Container: %s has VFIO iommu group id = %d",
+		       g_container, *groupid);
+
+	return 0;
+}
+
+static int
+vfio_connect_container(void)
 {
 	int fd, ret;
 
+	if (vfio_container.used) {
+		FSLMC_VFIO_LOG(DEBUG, "No container available.");
+		return -1;
+	}
+
 	/* Try connecting to vfio container if already created */
 	if (!ioctl(vfio_group.fd, VFIO_GROUP_SET_CONTAINER,
 		&vfio_container.fd)) {
@@ -284,48 +332,6 @@ static int64_t vfio_map_mcp_obj(struct fslmc_vfio_group *group, char *mcp_obj)
 	return v_addr;
 }
 
-static inline int
-dpaa2_compare_dpaa2_dev(const struct rte_dpaa2_device *dev,
-			 const struct rte_dpaa2_device *dev2)
-{
-	/*not the same family device */
-	if (dev->dev_type != DPAA2_ETH ||
-			dev->dev_type != DPAA2_CRYPTO)
-		return -1;
-
-	if (dev->object_id == dev2->object_id)
-		return 0;
-	else
-		return 1;
-}
-
-static void
-fslmc_bus_add_device(struct rte_dpaa2_device *dev)
-{
-	struct rte_fslmc_device_list *dev_l;
-
-	dev_l = &rte_fslmc_bus.device_list;
-
-	/* device is valid, add in list (sorted) */
-	if (TAILQ_EMPTY(dev_l)) {
-		TAILQ_INSERT_TAIL(dev_l, dev, next);
-	} else {
-		struct rte_dpaa2_device *dev2;
-		int ret;
-
-		TAILQ_FOREACH(dev2, dev_l, next) {
-			ret = dpaa2_compare_dpaa2_dev(dev, dev2);
-			if (ret <= 0)
-				continue;
-
-			TAILQ_INSERT_BEFORE(dev2, dev, next);
-			return;
-		}
-
-		TAILQ_INSERT_TAIL(dev_l, dev, next);
-	}
-}
-
 #define IRQ_SET_BUF_LEN  (sizeof(struct vfio_irq_set) + sizeof(int))
 
 int rte_dpaa2_intr_enable(struct rte_intr_handle *intr_handle,
@@ -360,283 +366,240 @@ int rte_dpaa2_intr_enable(struct rte_intr_handle *intr_handle,
 	return 0;
 }
 
-/* Following function shall fetch total available list of MC devices
- * from VFIO container & populate private list of devices and other
- * data structures
+/*
+ * fslmc_process_iodevices for processing only IO (ETH, CRYPTO, and possibly
+ * EVENT) devices.
  */
-int fslmc_vfio_process_group(void)
+static int
+fslmc_process_iodevices(struct rte_dpaa2_device *dev)
 {
-	struct fslmc_vfio_device *vdev;
+	int dev_fd;
 	struct vfio_device_info device_info = { .argsz = sizeof(device_info) };
-	char *temp_obj, *object_type, *mcp_obj, *dev_name;
-	int32_t object_id, i, dev_fd, ret;
-	DIR *d;
-	struct dirent *dir;
-	char path[PATH_MAX];
-	int64_t v_addr;
-	int ndev_count;
-	struct fslmc_vfio_group *group = &vfio_group;
-	static int process_once;
+	struct rte_dpaa2_object *object = NULL;
 
-	/* if already done once */
-	if (process_once) {
-		FSLMC_VFIO_LOG(DEBUG,
-			       "Already scanned once - re-scan not supported");
-		return 0;
+	dev_fd = ioctl(vfio_group.fd, VFIO_GROUP_GET_DEVICE_FD,
+		       dev->device.name);
+	if (dev_fd <= 0) {
+		FSLMC_VFIO_LOG(ERR, "Unable to obtain device FD for device:%s",
+			       dev->device.name);
+		return -1;
 	}
-	process_once = 0;
-
-	sprintf(path, "/sys/kernel/iommu_groups/%d/devices", group->groupid);
 
-	d = opendir(path);
-	if (!d) {
-		FSLMC_VFIO_LOG(ERR, "Unable to open directory %s", path);
+	if (ioctl(dev_fd, VFIO_DEVICE_GET_INFO, &device_info)) {
+		FSLMC_VFIO_LOG(ERR, "DPAA2 VFIO_DEVICE_GET_INFO fail");
 		return -1;
 	}
 
-	/*Counting the number of devices in a group and getting the mcp ID*/
-	ndev_count = 0;
-	mcp_obj = NULL;
-	while ((dir = readdir(d)) != NULL) {
-		if (dir->d_type == DT_LNK) {
-			ndev_count++;
-			if (!strncmp("dpmcp", dir->d_name, 5)) {
-				if (mcp_obj)
-					free(mcp_obj);
-				mcp_obj = malloc(sizeof(dir->d_name));
-				if (!mcp_obj) {
-					FSLMC_VFIO_LOG(ERR,
-						       "mcp obj:alloc failed");
-					closedir(d);
-					return -ENOMEM;
-				}
-				strcpy(mcp_obj, dir->d_name);
-				temp_obj = strtok(dir->d_name, ".");
-				temp_obj = strtok(NULL, ".");
-				sscanf(temp_obj, "%d", &mcp_id);
-			}
+	switch (dev->dev_type) {
+	case DPAA2_CON:
+	case DPAA2_IO:
+	case DPAA2_CI:
+	case DPAA2_BPOOL:
+		TAILQ_FOREACH(object, &dpaa2_obj_list, next) {
+			if (dev->dev_type == object->dev_type)
+				object->create(dev_fd, &device_info,
+					       dev->object_id);
+			else
+				continue;
 		}
-	}
-	closedir(d);
-	d = NULL;
-	if (!mcp_obj) {
-		FSLMC_VFIO_LOG(ERR, "DPAA2 MCP Object not Found");
-		return -ENODEV;
-	}
-	RTE_LOG(INFO, EAL, "fslmc: DPRC contains = %d devices\n", ndev_count);
-
-	/* Allocate the memory depends upon number of objects in a group*/
-	group->vfio_device = (struct fslmc_vfio_device *)malloc(ndev_count *
-			     sizeof(struct fslmc_vfio_device));
-	if (!(group->vfio_device)) {
-		FSLMC_VFIO_LOG(ERR, "vfio device: Unable to allocate memory\n");
-		free(mcp_obj);
-		return -ENOMEM;
+		break;
+	default:
+		break;
 	}
 
-	/* Allocate memory for MC Portal list */
+	FSLMC_VFIO_LOG(DEBUG, "Device (%s) abstracted from VFIO",
+		       dev->device.name);
+	return 0;
+}
+
+static int
+fslmc_process_mcp(struct rte_dpaa2_device *dev)
+{
+	int64_t v_addr;
+	char *dev_name;
+
 	rte_mcp_ptr_list = malloc(sizeof(void *) * 1);
 	if (!rte_mcp_ptr_list) {
-		FSLMC_VFIO_LOG(ERR, "portal list: Unable to allocate memory!");
-		free(mcp_obj);
-		goto FAILURE;
+		FSLMC_VFIO_LOG(ERR, "Out of memory");
+		return -ENOMEM;
 	}
 
-	v_addr = vfio_map_mcp_obj(group, mcp_obj);
-	free(mcp_obj);
-	if (v_addr == (int64_t)MAP_FAILED) {
-		FSLMC_VFIO_LOG(ERR, "Error mapping region (errno = %d)", errno);
-		goto FAILURE;
+	dev_name = strdup(dev->device.name);
+	if (!dev_name) {
+		FSLMC_VFIO_LOG(ERR, "Out of memory.");
+		free(rte_mcp_ptr_list);
+		rte_mcp_ptr_list = NULL;
+		return -ENOMEM;
 	}
 
-	rte_mcp_ptr_list[0] = (void *)v_addr;
-
-	d = opendir(path);
-	if (!d) {
-		FSLMC_VFIO_LOG(ERR, "Unable to open %s Directory", path);
-		goto FAILURE;
+	v_addr = vfio_map_mcp_obj(&vfio_group, dev_name);
+	if (v_addr == (int64_t)MAP_FAILED) {
+		FSLMC_VFIO_LOG(ERR, "Error mapping region  (errno = %d)",
+			       errno);
+		free(rte_mcp_ptr_list);
+		rte_mcp_ptr_list = NULL;
+		return -1;
 	}
 
-	i = 0;
-	/* Parsing each object and initiating them*/
-	while ((dir = readdir(d)) != NULL) {
-		if (dir->d_type != DT_LNK)
-			continue;
-		if (!strncmp("dprc", dir->d_name, 4) ||
-		    !strncmp("dpmcp", dir->d_name, 5))
-			continue;
-		dev_name = malloc(sizeof(dir->d_name));
-		if (!dev_name) {
-			FSLMC_VFIO_LOG(ERR, "name: Unable to allocate memory");
-			goto FAILURE;
-		}
-		strcpy(dev_name, dir->d_name);
-		object_type = strtok(dir->d_name, ".");
-		temp_obj = strtok(NULL, ".");
-		sscanf(temp_obj, "%d", &object_id);
-
-		/* getting the device fd*/
-		dev_fd = ioctl(group->fd, VFIO_GROUP_GET_DEVICE_FD, dev_name);
-		if (dev_fd < 0) {
-			FSLMC_VFIO_LOG(ERR,
-				       "GET_DEVICE_FD error fd: %s, Group: %d",
-				       dev_name, group->fd);
-			free(dev_name);
-			goto FAILURE;
-		}
+	rte_mcp_ptr_list[0] = (void *)v_addr;
 
-		free(dev_name);
-		vdev = &group->vfio_device[group->object_index++];
-		vdev->fd = dev_fd;
-		vdev->index = i;
-		i++;
-		/* Get Device inofrmation */
-		if (ioctl(vdev->fd, VFIO_DEVICE_GET_INFO, &device_info)) {
-			FSLMC_VFIO_LOG(ERR, "DPAA2 VFIO_DEVICE_GET_INFO fail");
-			goto FAILURE;
-		}
-		if (!strcmp(object_type, "dpni") ||
-		    !strcmp(object_type, "dpseci")) {
-			struct rte_dpaa2_device *dev;
+	return 0;
+}
 
-			dev = malloc(sizeof(struct rte_dpaa2_device));
-			if (dev == NULL)
+int
+fslmc_vfio_process_group(void)
+{
+	int ret;
+	int found_mportal = 0;
+	struct rte_dpaa2_device *dev, *dev_temp;
+
+	/* Search the MCP as that should be initialized first. */
+	TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) {
+		if (dev->dev_type == DPAA2_MPORTAL) {
+			ret = fslmc_process_mcp(dev);
+			if (ret) {
+				FSLMC_VFIO_LOG(DEBUG, "Unable to map Portal.");
 				return -1;
-
-			memset(dev, 0, sizeof(*dev));
-			/* store hw_id of dpni/dpseci device */
-			dev->object_id = object_id;
-			dev->dev_type = (strcmp(object_type, "dpseci")) ?
-				DPAA2_ETH : DPAA2_CRYPTO;
-
-			sprintf(dev->name, "%s.%d", object_type, object_id);
-			dev->device.name = dev->name;
-
-			fslmc_bus_add_device(dev);
-			FSLMC_VFIO_LOG(DEBUG, "DPAA2: Added %s", dev->name);
-		} else {
-			/* Parse all other objects */
-			struct rte_dpaa2_object *object;
-
-			TAILQ_FOREACH(object, &dpaa2_obj_list, next) {
-				if (!strcmp(object_type, object->name))
-					object->create(dev_fd, &device_info,
-						       object_id);
-				else
-					continue;
 			}
+			if (!found_mportal)
+				found_mportal = 1;
+
+			TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+			free(dev);
+			dev = NULL;
+			/* Ideally there is only a single dpmcp, but in case
+			 * multiple exists, looping on remaining devices.
+			 */
 		}
 	}
-	closedir(d);
 
-	ret = dpaa2_affine_qbman_swp();
-	if (ret)
-		FSLMC_VFIO_LOG(DEBUG, "Error in affining qbman swp %d", ret);
+	/* Cannot continue if there is not even a single mportal */
+	if (!found_mportal) {
+		FSLMC_VFIO_LOG(DEBUG,
+			       "No MC Portal device found. Not continuing.");
+		return -1;
+	}
 
-	return 0;
+	TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) {
+		if (!dev)
+			break;
 
-FAILURE:
-	if (d)
-		closedir(d);
-	if (rte_mcp_ptr_list) {
-		free(rte_mcp_ptr_list);
-		rte_mcp_ptr_list = NULL;
+		switch (dev->dev_type) {
+		case DPAA2_ETH:
+		case DPAA2_CRYPTO:
+			ret = fslmc_process_iodevices(dev);
+			if (ret) {
+				FSLMC_VFIO_LOG(DEBUG,
+					       "Dev (%s) init failed.",
+					       dev->device.name);
+				return ret;
+			}
+			break;
+		case DPAA2_CON:
+		case DPAA2_IO:
+		case DPAA2_CI:
+		case DPAA2_BPOOL:
+			/* Call the object creation routine and remove the
+			 * device entry from device list
+			 */
+			ret = fslmc_process_iodevices(dev);
+			if (ret) {
+				FSLMC_VFIO_LOG(DEBUG,
+					       "Dev (%s) init failed.",
+					       dev->device.name);
+				return -1;
+			}
+
+			/* This device is not required to be in the DPDK
+			 * exposed device list.
+			 */
+			TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+			free(dev);
+			dev = NULL;
+			break;
+		case DPAA2_UNKNOWN:
+		default:
+			/* Unknown - ignore */
+			FSLMC_VFIO_LOG(DEBUG, "Found unknown device (%s).",
+				       dev->device.name);
+			TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+			free(dev);
+			dev = NULL;
+		}
 	}
 
-	free(group->vfio_device);
-	group->vfio_device = NULL;
-	return -1;
+	return 0;
 }
 
-int fslmc_vfio_setup_group(void)
+int
+fslmc_vfio_setup_group(void)
 {
-	struct fslmc_vfio_group *group = NULL;
 	int groupid;
 	int ret;
-	char *container;
 	struct vfio_group_status status = { .argsz = sizeof(status) };
 
 	/* if already done once */
 	if (container_device_fd)
 		return 0;
 
-	container = getenv("DPRC");
-
-	if (container == NULL) {
-		FSLMC_VFIO_LOG(ERR, "VFIO container not set in env DPRC");
-		return -EOPNOTSUPP;
-	}
-
-	/* get group number */
-	ret = vfio_get_group_no(SYSFS_FSL_MC_DEVICES, container, &groupid);
-	if (ret == 0) {
-		RTE_LOG(WARNING, EAL, "%s not managed by VFIO, skipping\n",
-			container);
-		return -EOPNOTSUPP;
-	}
-
-	/* if negative, something failed */
-	if (ret < 0)
+	ret = fslmc_get_container_group(&groupid);
+	if (ret)
 		return ret;
 
-	FSLMC_VFIO_LOG(DEBUG, "VFIO iommu group id = %d", groupid);
-
-	/* Check if group already exists */
-	group = &vfio_group;
-	if (group->groupid == groupid) {
-		FSLMC_VFIO_LOG(ERR, "groupid already exists %d",
-			       groupid);
+	/* In case this group was already opened, continue without any
+	 * processing.
+	 */
+	if (vfio_group.groupid == groupid) {
+		FSLMC_VFIO_LOG(ERR, "groupid already exists %d", groupid);
 		return 0;
 	}
 
-	/* get the actual group fd */
+	/* Get the actual group fd */
 	ret = vfio_get_group_fd(groupid);
 	if (ret < 0)
 		return ret;
-	group->fd = ret;
+	vfio_group.fd = ret;
 
-	/*
-	 * at this point, we know that this group is viable (meaning,
-	 * all devices are either bound to VFIO or not bound to anything)
-	 */
-
-	ret = ioctl(group->fd, VFIO_GROUP_GET_STATUS, &status);
+	/* Check group viability */
+	ret = ioctl(vfio_group.fd, VFIO_GROUP_GET_STATUS, &status);
 	if (ret) {
-		FSLMC_VFIO_LOG(ERR, " VFIO error getting group status");
-		close(group->fd);
+		FSLMC_VFIO_LOG(ERR, "VFIO error getting group status");
+		close(vfio_group.fd);
 		return ret;
 	}
 
 	if (!(status.flags & VFIO_GROUP_FLAGS_VIABLE)) {
 		FSLMC_VFIO_LOG(ERR, "VFIO group not viable");
-		close(group->fd);
+		close(vfio_group.fd);
 		return -EPERM;
 	}
 	/* Since Group is VIABLE, Store the groupid */
-	group->groupid = groupid;
+	vfio_group.groupid = groupid;
 
 	/* check if group does not have a container yet */
 	if (!(status.flags & VFIO_GROUP_FLAGS_CONTAINER_SET)) {
 		/* Now connect this IOMMU group to given container */
 		ret = vfio_connect_container();
 		if (ret) {
-			FSLMC_VFIO_LOG(ERR, "VFIO error connecting container"
-				       " with groupid %d", groupid);
-			close(group->fd);
+			FSLMC_VFIO_LOG(ERR,
+				"Error connecting container with groupid %d",
+				groupid);
+			close(vfio_group.fd);
 			return ret;
 		}
 	}
 
 	/* Get Device information */
-	ret = ioctl(group->fd, VFIO_GROUP_GET_DEVICE_FD, container);
+	ret = ioctl(vfio_group.fd, VFIO_GROUP_GET_DEVICE_FD, g_container);
 	if (ret < 0) {
-		FSLMC_VFIO_LOG(ERR, "VFIO error getting device %s fd from"
-			       " group  %d", container, group->groupid);
+		FSLMC_VFIO_LOG(ERR, "Error getting device %s fd from group %d",
+			       g_container, vfio_group.groupid);
+		close(vfio_group.fd);
 		return ret;
 	}
 	container_device_fd = ret;
 	FSLMC_VFIO_LOG(DEBUG, "VFIO Container FD is [0x%X]",
-		     container_device_fd);
+		       container_device_fd);
 
 	return 0;
 }
diff --git a/drivers/bus/fslmc/fslmc_vfio.h b/drivers/bus/fslmc/fslmc_vfio.h
index 60a5743..edb86d0 100644
--- a/drivers/bus/fslmc/fslmc_vfio.h
+++ b/drivers/bus/fslmc/fslmc_vfio.h
@@ -36,7 +36,6 @@
 
 #include "eal_vfio.h"
 
-#define DPAA2_VENDOR_ID		0x1957
 #define DPAA2_MC_DPNI_DEVID	7
 #define DPAA2_MC_DPSECI_DEVID	3
 #define DPAA2_MC_DPCON_DEVID	5
@@ -44,7 +43,6 @@
 #define DPAA2_MC_DPBP_DEVID	10
 #define DPAA2_MC_DPCI_DEVID	11
 
-
 typedef struct fslmc_vfio_device {
 	int fd; /* fslmc root container device ?? */
 	int index; /*index of child object */
@@ -71,6 +69,8 @@ int rte_dpaa2_intr_enable(struct rte_intr_handle *intr_handle,
 
 int fslmc_vfio_setup_group(void);
 int fslmc_vfio_process_group(void);
+char *fslmc_get_container(void);
+int fslmc_get_container_group(int *gropuid);
 int rte_fslmc_vfio_dmamap(void);
 
 #endif /* _FSLMC_VFIO_H_ */
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
index da41849..7315555 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
@@ -59,7 +59,6 @@
 #include <rte_dev.h>
 
 #include <fslmc_logs.h>
-#include <fslmc_vfio.h>
 #include <rte_fslmc.h>
 #include "dpaa2_hw_pvt.h"
 #include "dpaa2_hw_dpio.h"
diff --git a/drivers/bus/fslmc/rte_fslmc.h b/drivers/bus/fslmc/rte_fslmc.h
index 2f684d9..4c32db6 100644
--- a/drivers/bus/fslmc/rte_fslmc.h
+++ b/drivers/bus/fslmc/rte_fslmc.h
@@ -56,6 +56,9 @@ extern "C" {
 #include <rte_interrupts.h>
 #include <rte_dev.h>
 #include <rte_bus.h>
+#include <rte_tailq.h>
+
+#include <fslmc_vfio.h>
 
 #define FSLMC_OBJECT_MAX_LEN 32   /**< Length of each device on bus */
 
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code
  2017-08-25 10:19 ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
                     ` (5 preceding siblings ...)
  2017-08-25 10:19   ` [PATCH v2 6/6] bus/fslmc: refactor scan and probe functions Shreyansh Jain
@ 2017-09-11 14:06   ` Ferruh Yigit
  2017-09-11 14:25     ` Shreyansh Jain
                       ` (2 more replies)
  6 siblings, 3 replies; 20+ messages in thread
From: Ferruh Yigit @ 2017-09-11 14:06 UTC (permalink / raw)
  To: Shreyansh Jain, dev; +Cc: hemant.agrawal, thomas

On 8/25/2017 11:19 AM, Shreyansh Jain wrote:
> Change Log:
> ~~~~~~~~~~~
>  v2:
>    - Minor updates for logging (removed some logs and changed others
>      to make it cleaner when application starts)
> 
> Brief:
> ~~~~~~
> 
>  -- v1 is at [3] --
> 
> In [1], during the IOVA Mapping patch set [2] discussion, it was
> observed that DPAA2 scan was actually doing work meant for probing.
> 
> This patchset demarcates the roles of FSLMC bus scan and probe
> functions much more clearly than before:
> 
> 1. scan now only add devices into a list
>  unlike previously, scan doesn't initialize the devices using the VFIO
>  operations. Now, scan would only add the devices onto a local device
>  list after marking their type and filling in device name.
> 
> 2. probe would now perform VFIO operations
>  in dpaa2, for the device added in list, an initialization needs
>  to be done so as to enable the devices - before actually API calls
>  can be served. Probe function now initializes the devices as well
>  as links then to the Eth/Crypto drivers.
> 
> 3. Refactoring some VFIO code
>  This patch improves the overall code contained within DPAA2 bus
>  for DPAA2 VFIO layer.
> 
> [1] http://dpdk.org/ml/archives/dev/2017-July/071270.html
> [2] http://dpdk.org/ml/archives/dev/2017-July/070833.html
> [3] http://dpdk.org/ml/archives/dev/2017-August/073011.html
> 
> Shreyansh Jain (6):
>   bus/fslmc: support only single group and container
>   bus/fslmc: introduce new device type enumerator
>   crypto/dpaa2_sec: update driver type field
>   net/dpaa2: update driver type field
>   drivers: refactor DPAA2 object definition
>   bus/fslmc: refactor scan and probe functions

Series Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

I guess this set needs to go in to the main tree, because of both
- as far as I get IOVA patchset breaks dpaa2, so this should go in
before that patchset
- This patchset has both crypto and net patches, hard to get by sub-trees

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code
  2017-09-11 14:06   ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Ferruh Yigit
@ 2017-09-11 14:25     ` Shreyansh Jain
  2017-09-25  7:07       ` Hemant Agrawal
  2017-09-18 14:36     ` santosh
  2017-10-05 23:09     ` Thomas Monjalon
  2 siblings, 1 reply; 20+ messages in thread
From: Shreyansh Jain @ 2017-09-11 14:25 UTC (permalink / raw)
  To: Ferruh Yigit, dev; +Cc: hemant.agrawal, thomas

On Monday 11 September 2017 07:36 PM, Ferruh Yigit wrote:
> On 8/25/2017 11:19 AM, Shreyansh Jain wrote:
>> Change Log:
>> ~~~~~~~~~~~
>>   v2:
>>     - Minor updates for logging (removed some logs and changed others
>>       to make it cleaner when application starts)
>>
>> Brief:
>> ~~~~~~
>>
>>   -- v1 is at [3] --
>>
>> In [1], during the IOVA Mapping patch set [2] discussion, it was
>> observed that DPAA2 scan was actually doing work meant for probing.
>>
>> This patchset demarcates the roles of FSLMC bus scan and probe
>> functions much more clearly than before:
>>
>> 1. scan now only add devices into a list
>>   unlike previously, scan doesn't initialize the devices using the VFIO
>>   operations. Now, scan would only add the devices onto a local device
>>   list after marking their type and filling in device name.
>>
>> 2. probe would now perform VFIO operations
>>   in dpaa2, for the device added in list, an initialization needs
>>   to be done so as to enable the devices - before actually API calls
>>   can be served. Probe function now initializes the devices as well
>>   as links then to the Eth/Crypto drivers.
>>
>> 3. Refactoring some VFIO code
>>   This patch improves the overall code contained within DPAA2 bus
>>   for DPAA2 VFIO layer.
>>
>> [1] http://dpdk.org/ml/archives/dev/2017-July/071270.html
>> [2] http://dpdk.org/ml/archives/dev/2017-July/070833.html
>> [3] http://dpdk.org/ml/archives/dev/2017-August/073011.html
>>
>> Shreyansh Jain (6):
>>    bus/fslmc: support only single group and container
>>    bus/fslmc: introduce new device type enumerator
>>    crypto/dpaa2_sec: update driver type field
>>    net/dpaa2: update driver type field
>>    drivers: refactor DPAA2 object definition
>>    bus/fslmc: refactor scan and probe functions
> 
> Series Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
> 
> I guess this set needs to go in to the main tree, because of both
> - as far as I get IOVA patchset breaks dpaa2, so this should go in
> before that patchset
> - This patchset has both crypto and net patches, hard to get by sub-trees
> 

I agree.
I don't think much patches have come on 17.11 tree yet - still, I can 
send a rebased set again.
Thanks a lot for taking out time for this.

-
Shreyansh

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v2 1/6] bus/fslmc: support only single group and container
  2017-08-25 10:19   ` [PATCH v2 1/6] bus/fslmc: support only single group and container Shreyansh Jain
@ 2017-09-18 11:15     ` santosh
  0 siblings, 0 replies; 20+ messages in thread
From: santosh @ 2017-09-18 11:15 UTC (permalink / raw)
  To: dev


On Friday 25 August 2017 03:49 PM, Shreyansh Jain wrote:
> Currently DPAA2 code doesn't support multiple groups and containers.
> Remove such provision in code to simplify code.
>
> Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
> ---

Reviewed-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>

>  drivers/bus/fslmc/fslmc_vfio.c | 70 +++++++++++++++---------------------------
>  drivers/bus/fslmc/fslmc_vfio.h |  3 +-
>  2 files changed, 26 insertions(+), 47 deletions(-)
>
> diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
> index 45e5927..3423b57 100644
> --- a/drivers/bus/fslmc/fslmc_vfio.c
> +++ b/drivers/bus/fslmc/fslmc_vfio.c
> @@ -62,8 +62,6 @@
>  #include "portal/dpaa2_hw_pvt.h"
>  #include "portal/dpaa2_hw_dpio.h"
>  
> -#define VFIO_MAX_CONTAINERS	1
> -
>  #define FSLMC_VFIO_LOG(level, fmt, args...) \
>  	RTE_LOG(level, EAL, "%s(): " fmt "\n", __func__, ##args)
>  
> @@ -71,8 +69,8 @@
>  #define SYSFS_FSL_MC_DEVICES "/sys/bus/fsl-mc/devices"
>  
>  /* Number of VFIO containers & groups with in */
> -static struct fslmc_vfio_group vfio_groups[VFIO_MAX_GRP];
> -static struct fslmc_vfio_container vfio_containers[VFIO_MAX_CONTAINERS];
> +static struct fslmc_vfio_group vfio_group;
> +static struct fslmc_vfio_container vfio_container;
>  static int container_device_fd;
>  static uint32_t *msi_intr_vaddr;
>  void *(*rte_mcp_ptr_list);
> @@ -90,22 +88,18 @@ rte_fslmc_object_register(struct rte_dpaa2_object *object)
>  	TAILQ_INSERT_TAIL(&fslmc_obj_list, object, next);
>  }
>  
> -static int vfio_connect_container(struct fslmc_vfio_group *vfio_group)
> +static int vfio_connect_container(void)
>  {
> -	struct fslmc_vfio_container *container;
> -	int i, fd, ret;
> +	int fd, ret;
>  
>  	/* Try connecting to vfio container if already created */
> -	for (i = 0; i < VFIO_MAX_CONTAINERS; i++) {
> -		container = &vfio_containers[i];
> -		if (!ioctl(vfio_group->fd, VFIO_GROUP_SET_CONTAINER,
> -			   &container->fd)) {
> -			FSLMC_VFIO_LOG(INFO,
> -			    "Container pre-exists with FD[0x%x] for this group",
> -			    container->fd);
> -			vfio_group->container = container;
> -			return 0;
> -		}
> +	if (!ioctl(vfio_group.fd, VFIO_GROUP_SET_CONTAINER,
> +		&vfio_container.fd)) {
> +		FSLMC_VFIO_LOG(INFO,
> +		    "Container pre-exists with FD[0x%x] for this group",
> +		    vfio_container.fd);
> +		vfio_group.container = &vfio_container;
> +		return 0;
>  	}
>  
>  	/* Opens main vfio file descriptor which represents the "container" */
> @@ -118,7 +112,7 @@ static int vfio_connect_container(struct fslmc_vfio_group *vfio_group)
>  	/* Check whether support for SMMU type IOMMU present or not */
>  	if (ioctl(fd, VFIO_CHECK_EXTENSION, VFIO_TYPE1_IOMMU)) {
>  		/* Connect group to container */
> -		ret = ioctl(vfio_group->fd, VFIO_GROUP_SET_CONTAINER, &fd);
> +		ret = ioctl(vfio_group.fd, VFIO_GROUP_SET_CONTAINER, &fd);
>  		if (ret) {
>  			FSLMC_VFIO_LOG(ERR, "Failed to setup group container");
>  			close(fd);
> @@ -137,23 +131,11 @@ static int vfio_connect_container(struct fslmc_vfio_group *vfio_group)
>  		return -EINVAL;
>  	}
>  
> -	container = NULL;
> -	for (i = 0; i < VFIO_MAX_CONTAINERS; i++) {
> -		if (vfio_containers[i].used)
> -			continue;
> -		container = &vfio_containers[i];
> -	}
> -	if (!container) {
> -		FSLMC_VFIO_LOG(ERR, "No free container found");
> -		close(fd);
> -		return -ENOMEM;
> -	}
> +	vfio_container.used = 1;
> +	vfio_container.fd = fd;
> +	vfio_container.group = &vfio_group;
> +	vfio_group.container = &vfio_container;
>  
> -	container->used = 1;
> -	container->fd = fd;
> -	container->group_list[container->index] = vfio_group;
> -	vfio_group->container = container;
> -	container->index++;
>  	return 0;
>  }
>  
> @@ -222,7 +204,7 @@ int rte_fslmc_vfio_dmamap(void)
>  #endif
>  
>  		/* SET DMA MAP for IOMMU */
> -		group = &vfio_groups[0];
> +		group = &vfio_group;
>  
>  		if (!group->container) {
>  			FSLMC_VFIO_LOG(ERR, "Container is not connected ");
> @@ -392,7 +374,7 @@ int fslmc_vfio_process_group(void)
>  	char path[PATH_MAX];
>  	int64_t v_addr;
>  	int ndev_count;
> -	struct fslmc_vfio_group *group = &vfio_groups[0];
> +	struct fslmc_vfio_group *group = &vfio_group;
>  	static int process_once;
>  
>  	/* if already done once */
> @@ -569,7 +551,7 @@ int fslmc_vfio_setup_group(void)
>  {
>  	struct fslmc_vfio_group *group = NULL;
>  	int groupid;
> -	int ret, i;
> +	int ret;
>  	char *container;
>  	struct vfio_group_status status = { .argsz = sizeof(status) };
>  
> @@ -599,13 +581,11 @@ int fslmc_vfio_setup_group(void)
>  	FSLMC_VFIO_LOG(DEBUG, "VFIO iommu group id = %d", groupid);
>  
>  	/* Check if group already exists */
> -	for (i = 0; i < VFIO_MAX_GRP; i++) {
> -		group = &vfio_groups[i];
> -		if (group->groupid == groupid) {
> -			FSLMC_VFIO_LOG(ERR, "groupid already exists %d",
> -				       groupid);
> -			return 0;
> -		}
> +	group = &vfio_group;
> +	if (group->groupid == groupid) {
> +		FSLMC_VFIO_LOG(ERR, "groupid already exists %d",
> +			       groupid);
> +		return 0;
>  	}
>  
>  	/* get the actual group fd */
> @@ -637,7 +617,7 @@ int fslmc_vfio_setup_group(void)
>  	/* check if group does not have a container yet */
>  	if (!(status.flags & VFIO_GROUP_FLAGS_CONTAINER_SET)) {
>  		/* Now connect this IOMMU group to given container */
> -		ret = vfio_connect_container(group);
> +		ret = vfio_connect_container();
>  		if (ret) {
>  			FSLMC_VFIO_LOG(ERR, "VFIO error connecting container"
>  				       " with groupid %d", groupid);
> diff --git a/drivers/bus/fslmc/fslmc_vfio.h b/drivers/bus/fslmc/fslmc_vfio.h
> index 0aff9b1..942a33c 100644
> --- a/drivers/bus/fslmc/fslmc_vfio.h
> +++ b/drivers/bus/fslmc/fslmc_vfio.h
> @@ -44,7 +44,6 @@
>  #define DPAA2_MC_DPBP_DEVID	10
>  #define DPAA2_MC_DPCI_DEVID	11
>  
> -#define VFIO_MAX_GRP 1
>  
>  typedef struct fslmc_vfio_device {
>  	int fd; /* fslmc root container device ?? */
> @@ -64,7 +63,7 @@ typedef struct fslmc_vfio_container {
>  	int fd; /* /dev/vfio/vfio */
>  	int used;
>  	int index; /* index in group list */
> -	struct fslmc_vfio_group *group_list[VFIO_MAX_GRP];
> +	struct fslmc_vfio_group *group;
>  } fslmc_vfio_container;
>  
>  struct rte_dpaa2_object;

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code
  2017-09-11 14:06   ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Ferruh Yigit
  2017-09-11 14:25     ` Shreyansh Jain
@ 2017-09-18 14:36     ` santosh
  2017-10-05 23:09     ` Thomas Monjalon
  2 siblings, 0 replies; 20+ messages in thread
From: santosh @ 2017-09-18 14:36 UTC (permalink / raw)
  To: dev


On Monday 11 September 2017 07:36 PM, Ferruh Yigit wrote:
> On 8/25/2017 11:19 AM, Shreyansh Jain wrote:
>> Change Log:
>> ~~~~~~~~~~~
>>  v2:
>>    - Minor updates for logging (removed some logs and changed others
>>      to make it cleaner when application starts)
>>
>> Brief:
>> ~~~~~~
>>
>>  -- v1 is at [3] --
>>
>> In [1], during the IOVA Mapping patch set [2] discussion, it was
>> observed that DPAA2 scan was actually doing work meant for probing.
>>
>> This patchset demarcates the roles of FSLMC bus scan and probe
>> functions much more clearly than before:
>>
>> 1. scan now only add devices into a list
>>  unlike previously, scan doesn't initialize the devices using the VFIO
>>  operations. Now, scan would only add the devices onto a local device
>>  list after marking their type and filling in device name.
>>
>> 2. probe would now perform VFIO operations
>>  in dpaa2, for the device added in list, an initialization needs
>>  to be done so as to enable the devices - before actually API calls
>>  can be served. Probe function now initializes the devices as well
>>  as links then to the Eth/Crypto drivers.
>>
>> 3. Refactoring some VFIO code
>>  This patch improves the overall code contained within DPAA2 bus
>>  for DPAA2 VFIO layer.
>>
>> [1] http://dpdk.org/ml/archives/dev/2017-July/071270.html
>> [2] http://dpdk.org/ml/archives/dev/2017-July/070833.html
>> [3] http://dpdk.org/ml/archives/dev/2017-August/073011.html
>>
>> Shreyansh Jain (6):
>>   bus/fslmc: support only single group and container
>>   bus/fslmc: introduce new device type enumerator
>>   crypto/dpaa2_sec: update driver type field
>>   net/dpaa2: update driver type field
>>   drivers: refactor DPAA2 object definition
>>   bus/fslmc: refactor scan and probe functions
> Series Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

Reviewed-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code
  2017-09-11 14:25     ` Shreyansh Jain
@ 2017-09-25  7:07       ` Hemant Agrawal
  0 siblings, 0 replies; 20+ messages in thread
From: Hemant Agrawal @ 2017-09-25  7:07 UTC (permalink / raw)
  To: Shreyansh Jain, Ferruh Yigit, dev; +Cc: thomas

HI Thomas,

	Ferruh has reviewed it. 
	If you don't have any further comments on it, will you please apply this patchset to the main tree, so that other dependent patches can be applied to respective next trees?

Regards,
Hemant


> -----Original Message-----
> From: Shreyansh Jain [mailto:shreyansh.jain@nxp.com]
> Sent: Monday, September 11, 2017 7:56 PM
> To: Ferruh Yigit <ferruh.yigit@intel.com>; dev@dpdk.org
> Cc: Hemant Agrawal <hemant.agrawal@nxp.com>; thomas@monjalon.net
> Subject: Re: [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code
> 
> On Monday 11 September 2017 07:36 PM, Ferruh Yigit wrote:
> > On 8/25/2017 11:19 AM, Shreyansh Jain wrote:
> >> Change Log:
> >> ~~~~~~~~~~~
> >>   v2:
> >>     - Minor updates for logging (removed some logs and changed others
> >>       to make it cleaner when application starts)
> >>
> >> Brief:
> >> ~~~~~~
> >>
> >>   -- v1 is at [3] --
> >>
> >> In [1], during the IOVA Mapping patch set [2] discussion, it was
> >> observed that DPAA2 scan was actually doing work meant for probing.
> >>
> >> This patchset demarcates the roles of FSLMC bus scan and probe
> >> functions much more clearly than before:
> >>
> >> 1. scan now only add devices into a list
> >>   unlike previously, scan doesn't initialize the devices using the VFIO
> >>   operations. Now, scan would only add the devices onto a local device
> >>   list after marking their type and filling in device name.
> >>
> >> 2. probe would now perform VFIO operations
> >>   in dpaa2, for the device added in list, an initialization needs
> >>   to be done so as to enable the devices - before actually API calls
> >>   can be served. Probe function now initializes the devices as well
> >>   as links then to the Eth/Crypto drivers.
> >>
> >> 3. Refactoring some VFIO code
> >>   This patch improves the overall code contained within DPAA2 bus
> >>   for DPAA2 VFIO layer.
> >>
> >> [1] http://dpdk.org/ml/archives/dev/2017-July/071270.html
> >> [2] http://dpdk.org/ml/archives/dev/2017-July/070833.html
> >> [3] http://dpdk.org/ml/archives/dev/2017-August/073011.html
> >>
> >> Shreyansh Jain (6):
> >>    bus/fslmc: support only single group and container
> >>    bus/fslmc: introduce new device type enumerator
> >>    crypto/dpaa2_sec: update driver type field
> >>    net/dpaa2: update driver type field
> >>    drivers: refactor DPAA2 object definition
> >>    bus/fslmc: refactor scan and probe functions
> >
> > Series Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
> >
> > I guess this set needs to go in to the main tree, because of both
> > - as far as I get IOVA patchset breaks dpaa2, so this should go in
> > before that patchset
> > - This patchset has both crypto and net patches, hard to get by
> > sub-trees
> >
> 
> I agree.
> I don't think much patches have come on 17.11 tree yet - still, I can send a
> rebased set again.
> Thanks a lot for taking out time for this.
> 
> -
> Shreyansh

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code
  2017-09-11 14:06   ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Ferruh Yigit
  2017-09-11 14:25     ` Shreyansh Jain
  2017-09-18 14:36     ` santosh
@ 2017-10-05 23:09     ` Thomas Monjalon
  2 siblings, 0 replies; 20+ messages in thread
From: Thomas Monjalon @ 2017-10-05 23:09 UTC (permalink / raw)
  To: Shreyansh Jain, hemant.agrawal; +Cc: dev, Ferruh Yigit

11/09/2017 16:06, Ferruh Yigit:
> On 8/25/2017 11:19 AM, Shreyansh Jain wrote:
> > Change Log:
> > ~~~~~~~~~~~
> >  v2:
> >    - Minor updates for logging (removed some logs and changed others
> >      to make it cleaner when application starts)
> > 
> > Brief:
> > ~~~~~~
> > 
> >  -- v1 is at [3] --
> > 
> > In [1], during the IOVA Mapping patch set [2] discussion, it was
> > observed that DPAA2 scan was actually doing work meant for probing.
> > 
> > This patchset demarcates the roles of FSLMC bus scan and probe
> > functions much more clearly than before:
> > 
> > 1. scan now only add devices into a list
> >  unlike previously, scan doesn't initialize the devices using the VFIO
> >  operations. Now, scan would only add the devices onto a local device
> >  list after marking their type and filling in device name.
> > 
> > 2. probe would now perform VFIO operations
> >  in dpaa2, for the device added in list, an initialization needs
> >  to be done so as to enable the devices - before actually API calls
> >  can be served. Probe function now initializes the devices as well
> >  as links then to the Eth/Crypto drivers.
> > 
> > 3. Refactoring some VFIO code
> >  This patch improves the overall code contained within DPAA2 bus
> >  for DPAA2 VFIO layer.
> > 
> > [1] http://dpdk.org/ml/archives/dev/2017-July/071270.html
> > [2] http://dpdk.org/ml/archives/dev/2017-July/070833.html
> > [3] http://dpdk.org/ml/archives/dev/2017-August/073011.html
> > 
> > Shreyansh Jain (6):
> >   bus/fslmc: support only single group and container
> >   bus/fslmc: introduce new device type enumerator
> >   crypto/dpaa2_sec: update driver type field
> >   net/dpaa2: update driver type field
> >   drivers: refactor DPAA2 object definition
> >   bus/fslmc: refactor scan and probe functions
> 
> Series Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
> 
> I guess this set needs to go in to the main tree, because of both
> - as far as I get IOVA patchset breaks dpaa2, so this should go in
> before that patchset
> - This patchset has both crypto and net patches, hard to get by sub-trees

Applied, thanks

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2017-10-05 23:09 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-18 12:51 [PATCH 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
2017-08-18 12:51 ` [PATCH 1/6] bus/fslmc: support only single group and container Shreyansh Jain
2017-08-18 12:51 ` [PATCH 2/6] bus/fslmc: introduce new device type enumerator Shreyansh Jain
2017-08-18 12:51 ` [PATCH 3/6] net/dpaa2: update driver type field Shreyansh Jain
2017-08-18 12:51 ` [PATCH 4/6] crypto/dpaa2_sec: " Shreyansh Jain
2017-08-18 12:51 ` [PATCH 5/6] drivers: refactor DPAA2 object definition Shreyansh Jain
2017-08-18 12:51 ` [PATCH 6/6] bus/fslmc: refactor scan and probe functions Shreyansh Jain
2017-08-25 10:19 ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Shreyansh Jain
2017-08-25 10:19   ` [PATCH v2 1/6] bus/fslmc: support only single group and container Shreyansh Jain
2017-09-18 11:15     ` santosh
2017-08-25 10:19   ` [PATCH v2 2/6] bus/fslmc: introduce new device type enumerator Shreyansh Jain
2017-08-25 10:19   ` [PATCH v2 3/6] crypto/dpaa2_sec: update driver type field Shreyansh Jain
2017-08-25 10:19   ` [PATCH v2 4/6] net/dpaa2: " Shreyansh Jain
2017-08-25 10:19   ` [PATCH v2 5/6] drivers: refactor DPAA2 object definition Shreyansh Jain
2017-08-25 10:19   ` [PATCH v2 6/6] bus/fslmc: refactor scan and probe functions Shreyansh Jain
2017-09-11 14:06   ` [PATCH v2 0/6] NXP DPAA2: Refactor bus scan/probe code Ferruh Yigit
2017-09-11 14:25     ` Shreyansh Jain
2017-09-25  7:07       ` Hemant Agrawal
2017-09-18 14:36     ` santosh
2017-10-05 23:09     ` Thomas Monjalon

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.