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.j...@nxp.com> > ---
Reviewed-by: Santosh Shukla <santosh.shu...@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;