/* SPDX-License-Identifier: BSD-3-Clause
*
- * Copyright 2016,2018 NXP
+ * Copyright 2016,2018-2019 NXP
*
*/
{
uint16_t dev_id;
char *t_ptr;
- char *sep = NULL;
+ const char *sep;
uint8_t sep_exists = 0;
+ int ret = -1;
DPAA2_BUS_DEBUG("Parsing dev=(%s)", name);
} else {
DPAA2_BUS_DEBUG("Invalid device for matching (%s).",
name);
+ ret = -EINVAL;
goto err_out;
}
} else
- sep = strdup(name);
+ sep = name;
jump_out:
/* Validate device name */
strncmp("dpdmai", sep, 6) &&
strncmp("dpdmux", sep, 6)) {
DPAA2_BUS_DEBUG("Unknown or unsupported device (%s)", sep);
+ ret = -EINVAL;
goto err_out;
}
t_ptr = strchr(sep, '.');
if (!t_ptr || sscanf(t_ptr + 1, "%hu", &dev_id) != 1) {
DPAA2_BUS_ERR("Missing device id in device name (%s)", sep);
+ ret = -EINVAL;
goto err_out;
}
if (addr)
strcpy(addr, sep);
- return 0;
+ ret = 0;
err_out:
- if (!sep_exists && sep)
- free(sep);
- return -EINVAL;
+ return ret;
}
static int
goto scan_fail;
/* Scan devices on the group */
- snprintf(fslmc_dirpath, sizeof(fslmc_dirpath), "%s/%d/devices",
- VFIO_IOMMU_GROUP_PATH, groupid);
+ sprintf(fslmc_dirpath, "%s/%s", SYSFS_FSL_MC_DEVICES, fslmc_container);
dir = opendir(fslmc_dirpath);
if (!dir) {
DPAA2_BUS_ERR("Unable to open VFIO group directory");
}
while ((entry = readdir(dir)) != NULL) {
- if (entry->d_name[0] == '.' || entry->d_type != DT_LNK)
+ if (entry->d_name[0] == '.' || entry->d_type != DT_DIR)
continue;
ret = scan_one_fslmc_device(entry->d_name);
/* Map existing segments as well as, in case of hotpluggable memory,
* install callback handler.
*/
- ret = rte_fslmc_vfio_dmamap();
- if (ret) {
- DPAA2_BUS_ERR("Unable to DMA map existing VAs: (%d)", ret);
- /* Not continuing ahead */
- DPAA2_BUS_ERR("FSLMC VFIO Mapping failed");
- return 0;
+ if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+ ret = rte_fslmc_vfio_dmamap();
+ if (ret) {
+ DPAA2_BUS_ERR("Unable to DMA map existing VAs: (%d)",
+ ret);
+ /* Not continuing ahead */
+ DPAA2_BUS_ERR("FSLMC VFIO Mapping failed");
+ return 0;
+ }
}
ret = fslmc_vfio_process_group();