X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fbus%2Ffslmc%2Ffslmc_bus.c;h=beb3dd008fbc6d8747560b60f35a9b1276a5d746;hb=465f7e5804fa2ddc50a8d5239b78e2cb2e8fbd6a;hp=35103d224203ccb63bf770bd75278ad0927a2a84;hpb=e67a61614d0b23fa4c3d044c3dd652a4abe6a3b6;p=dpdk.git diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c index 35103d2242..beb3dd008f 100644 --- a/drivers/bus/fslmc/fslmc_bus.c +++ b/drivers/bus/fslmc/fslmc_bus.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * - * Copyright 2016,2018 NXP + * Copyright 2016,2018-2019 NXP * */ @@ -10,7 +10,6 @@ #include #include -#include #include #include #include @@ -22,8 +21,6 @@ #include -int dpaa2_logtype_bus; - #define VFIO_IOMMU_GROUP_PATH "/sys/kernel/iommu_groups" #define FSLMC_BUS_NAME fslmc @@ -33,13 +30,11 @@ uint8_t dpaa2_virt_mode; uint32_t rte_fslmc_get_device_count(enum rte_dpaa2_dev_type device_type) { - if (device_type > DPAA2_DEVTYPE_MAX) + if (device_type >= DPAA2_DEVTYPE_MAX) return 0; return rte_fslmc_bus.device_count[device_type]; } -RTE_DEFINE_PER_LCORE(struct dpaa2_portal_dqrr, dpaa2_held_bufs); - static void cleanup_fslmc_device_list(void) { @@ -116,14 +111,9 @@ static void dump_device_list(void) { struct rte_dpaa2_device *dev; - uint32_t global_log_level; - int local_log_level; /* Only if the log level has been set to Debugging, print list */ - global_log_level = rte_log_get_global_level(); - local_log_level = rte_log_get_level(dpaa2_logtype_bus); - if (global_log_level == RTE_LOG_DEBUG || - local_log_level == RTE_LOG_DEBUG) { + if (rte_log_can_log(dpaa2_logtype_bus, RTE_LOG_DEBUG)) { DPAA2_BUS_LOG(DEBUG, "List of devices scanned on bus:"); TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) { DPAA2_BUS_LOG(DEBUG, "\t\t%s", dev->device.name); @@ -135,10 +125,11 @@ static int scan_one_fslmc_device(char *dev_name) { char *dup_dev_name, *t_ptr; - struct rte_dpaa2_device *dev; + struct rte_dpaa2_device *dev = NULL; + int ret = -1; if (!dev_name) - return -1; + return ret; /* Ignore the Container name itself */ if (!strncmp("dprc", dev_name, 4)) @@ -168,7 +159,8 @@ scan_one_fslmc_device(char *dev_name) /* Parse the device name and ID */ t_ptr = strtok(dup_dev_name, "."); if (!t_ptr) { - DPAA2_BUS_ERR("Incorrect device name observed"); + DPAA2_BUS_ERR("Invalid device found: (%s)", dup_dev_name); + ret = -EINVAL; goto cleanup; } if (!strncmp("dpni", t_ptr, 4)) @@ -189,15 +181,15 @@ scan_one_fslmc_device(char *dev_name) dev->dev_type = DPAA2_QDMA; else if (!strncmp("dpdmux", t_ptr, 6)) dev->dev_type = DPAA2_MUX; + else if (!strncmp("dprtc", t_ptr, 5)) + dev->dev_type = DPAA2_DPRTC; else dev->dev_type = DPAA2_UNKNOWN; - /* Update the device found into the device_count table */ - rte_fslmc_bus.device_count[dev->dev_type]++; - t_ptr = strtok(NULL, "."); if (!t_ptr) { - DPAA2_BUS_ERR("Incorrect device string observed (null)"); + DPAA2_BUS_ERR("Skipping invalid device (%s)", dup_dev_name); + ret = 0; goto cleanup; } @@ -205,10 +197,14 @@ scan_one_fslmc_device(char *dev_name) dev->device.name = strdup(dev_name); if (!dev->device.name) { DPAA2_BUS_ERR("Unable to clone device name. Out of memory"); + ret = -ENOMEM; goto cleanup; } dev->device.devargs = fslmc_devargs_lookup(dev); + /* Update the device found into the device_count table */ + rte_fslmc_bus.device_count[dev->dev_type]++; + /* Add device in the fslmc device list */ insert_in_device_list(dev); @@ -222,7 +218,7 @@ cleanup: free(dup_dev_name); if (dev) free(dev); - return -1; + return ret; } static int @@ -230,8 +226,9 @@ rte_fslmc_parse(const char *name, void *addr) { 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); @@ -261,10 +258,11 @@ rte_fslmc_parse(const char *name, void *addr) } 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 */ @@ -278,23 +276,23 @@ jump_out: 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) - free(sep); - return -EINVAL; + return ret; } static int @@ -319,8 +317,7 @@ rte_fslmc_scan(void) 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"); @@ -328,7 +325,7 @@ rte_fslmc_scan(void) } 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); @@ -353,7 +350,7 @@ scan_fail_cleanup: /* Remove all devices in the list */ cleanup_fslmc_device_list(); scan_fail: - DPAA2_BUS_DEBUG("FSLMC Bus Not Available. Skipping"); + DPAA2_BUS_DEBUG("FSLMC Bus Not Available. Skipping (%d)", ret); /* Irrespective of failure, scan only return success */ return 0; } @@ -389,12 +386,15 @@ rte_fslmc_probe(void) /* 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(); @@ -415,8 +415,11 @@ rte_fslmc_probe(void) * * Error is ignored as relevant logs are handled within dpaax and * handling for unavailable dpaax table too is transparent to caller. + * + * And, the IOVA table is only applicable in case of PA mode. */ - dpaax_iova_table_populate(); + if (rte_eal_iova_mode() == RTE_IOVA_PA) + dpaax_iova_table_populate(); TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) { TAILQ_FOREACH(drv, &rte_fslmc_bus.driver_list, next) { @@ -513,7 +516,8 @@ rte_fslmc_driver_unregister(struct rte_dpaa2_driver *driver) /* Cleanup the PA->VA Translation table; From whereever this function * is called from. */ - dpaax_iova_table_depopulate(); + if (rte_eal_iova_mode() == RTE_IOVA_PA) + dpaax_iova_table_depopulate(); TAILQ_REMOVE(&fslmc_bus->driver_list, driver, next); /* Update Bus references */ @@ -595,9 +599,14 @@ fslmc_bus_dev_iterate(const void *start, const char *str, struct rte_dpaa2_device *dev; char *dup, *dev_name = NULL; + if (str == NULL) { + DPAA2_BUS_DEBUG("No device string"); + return NULL; + } + /* Expectation is that device would be name=device_name */ if (strncmp(str, "name=", 5) != 0) { - DPAA2_BUS_ERR("Invalid device string (%s)\n", str); + DPAA2_BUS_DEBUG("Invalid device string (%s)\n", str); return NULL; } @@ -641,11 +650,4 @@ struct rte_fslmc_bus rte_fslmc_bus = { }; RTE_REGISTER_BUS(FSLMC_BUS_NAME, rte_fslmc_bus.bus); - -RTE_INIT(fslmc_init_log) -{ - /* Bus level logs */ - dpaa2_logtype_bus = rte_log_register("bus.fslmc"); - if (dpaa2_logtype_bus >= 0) - rte_log_set_level(dpaa2_logtype_bus, RTE_LOG_NOTICE); -} +RTE_LOG_REGISTER(dpaa2_logtype_bus, bus.fslmc, NOTICE);