X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fbus%2Fdpaa%2Fdpaa_bus.c;h=08c822781d9df4448a7a053857500c7bedd3d968;hb=c3a954eb74a4dbdd8fa8c27b26a292bf0c091b97;hp=4e0fca328ec78e8cb780a83720b7b14fddc7b05a;hpb=28aca20e98d3c83ac7525924213c7871738bb803;p=dpdk.git diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c index 4e0fca328e..08c822781d 100644 --- a/drivers/bus/dpaa/dpaa_bus.c +++ b/drivers/bus/dpaa/dpaa_bus.c @@ -34,6 +34,7 @@ #include #include +#include #include #include @@ -46,11 +47,11 @@ int dpaa_logtype_mempool; int dpaa_logtype_pmd; int dpaa_logtype_eventdev; -struct rte_dpaa_bus rte_dpaa_bus; +static struct rte_dpaa_bus rte_dpaa_bus; struct netcfg_info *dpaa_netcfg; /* define a variable to hold the portal_key, once created.*/ -pthread_key_t dpaa_portal_key; +static pthread_key_t dpaa_portal_key; unsigned int dpaa_svr_family; @@ -165,6 +166,8 @@ dpaa_create_device_list(void) goto cleanup; } + dev->device.bus = &rte_dpaa_bus.bus; + cfg = &dpaa_netcfg->port_cfg[i]; fman_intf = cfg->fman_if; @@ -247,52 +250,55 @@ dpaa_clean_device_list(void) int rte_dpaa_portal_init(void *arg) { - cpu_set_t cpuset; pthread_t id; - uint32_t cpu = rte_lcore_id(); + unsigned int cpu, lcore = rte_lcore_id(); int ret; struct dpaa_portal *dpaa_io_portal; + rte_cpuset_t cpuset; BUS_INIT_FUNC_TRACE(); - if ((size_t)arg == 1 || cpu == LCORE_ID_ANY) - cpu = rte_get_master_lcore(); - /* if the core id is not supported */ + if ((size_t)arg == 1 || lcore == LCORE_ID_ANY) + lcore = rte_get_master_lcore(); else - if (cpu >= RTE_MAX_LCORE) + if (lcore >= RTE_MAX_LCORE) return -1; - /* Set CPU affinity for this thread */ - CPU_ZERO(&cpuset); - CPU_SET(cpu, &cpuset); + cpu = rte_lcore_to_cpu_id(lcore); + + /* Set CPU affinity for this thread.*/ id = pthread_self(); - ret = pthread_setaffinity_np(id, sizeof(cpu_set_t), &cpuset); + cpuset = rte_lcore_cpuset(lcore); + ret = pthread_setaffinity_np(id, sizeof(cpu_set_t), + &cpuset); if (ret) { - DPAA_BUS_LOG(ERR, "pthread_setaffinity_np failed on " - "core :%d with ret: %d", cpu, ret); + DPAA_BUS_LOG(ERR, "pthread_setaffinity_np failed on core :%u" + " (lcore=%u) with ret: %d", cpu, lcore, ret); return ret; } /* Initialise bman thread portals */ ret = bman_thread_init(); if (ret) { - DPAA_BUS_LOG(ERR, "bman_thread_init failed on " - "core %d with ret: %d", cpu, ret); + DPAA_BUS_LOG(ERR, "bman_thread_init failed on core %u" + " (lcore=%u) with ret: %d", cpu, lcore, ret); return ret; } - DPAA_BUS_LOG(DEBUG, "BMAN thread initialized"); + DPAA_BUS_LOG(DEBUG, "BMAN thread initialized - CPU=%d lcore=%d", + cpu, lcore); /* Initialise qman thread portals */ ret = qman_thread_init(); if (ret) { - DPAA_BUS_LOG(ERR, "bman_thread_init failed on " - "core %d with ret: %d", cpu, ret); + DPAA_BUS_LOG(ERR, "qman_thread_init failed on core %u" + " (lcore=%u) with ret: %d", cpu, lcore, ret); bman_thread_finish(); return ret; } - DPAA_BUS_LOG(DEBUG, "QMAN thread initialized"); + DPAA_BUS_LOG(DEBUG, "QMAN thread initialized - CPU=%d lcore=%d", + cpu, lcore); dpaa_io_portal = rte_malloc(NULL, sizeof(struct dpaa_portal), RTE_CACHE_LINE_SIZE); @@ -309,8 +315,8 @@ int rte_dpaa_portal_init(void *arg) ret = pthread_setspecific(dpaa_portal_key, (void *)dpaa_io_portal); if (ret) { - DPAA_BUS_LOG(ERR, "pthread_setspecific failed on " - "core %d with ret: %d", cpu, ret); + DPAA_BUS_LOG(ERR, "pthread_setspecific failed on core %u" + " (lcore=%u) with ret: %d", cpu, lcore, ret); dpaa_portal_finish(NULL); return ret; @@ -438,40 +444,8 @@ rte_dpaa_bus_scan(void) RTE_LOG(DEBUG, EAL, "DPAA Bus not present. Skipping.\n"); return 0; } - - /* Load the device-tree driver */ - ret = of_init(); - if (ret) { - DPAA_BUS_LOG(ERR, "of_init failed with ret: %d", ret); - return -1; - } - - /* Get the interface configurations from device-tree */ - dpaa_netcfg = netcfg_acquire(); - if (!dpaa_netcfg) { - DPAA_BUS_LOG(ERR, "netcfg_acquire failed"); - return -EINVAL; - } - - RTE_LOG(NOTICE, EAL, "DPAA Bus Detected\n"); - - if (!dpaa_netcfg->num_ethports) { - DPAA_BUS_LOG(INFO, "no network interfaces available"); - /* This is not an error */ - return 0; - } - -#ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER - dump_netcfg(dpaa_netcfg); -#endif - - DPAA_BUS_LOG(DEBUG, "Number of ethernet devices = %d", - dpaa_netcfg->num_ethports); - ret = dpaa_create_device_list(); - if (ret) { - DPAA_BUS_LOG(ERR, "Unable to create device list. (%d)", ret); - return ret; - } + /* detected DPAA devices */ + rte_dpaa_bus.detected = 1; /* create the key, supplying a function that'll be invoked * when a portal affined thread will be deleted. @@ -529,6 +503,47 @@ rte_dpaa_device_match(struct rte_dpaa_driver *drv, return -1; } +static int +rte_dpaa_bus_dev_build(void) +{ + int ret; + + /* Load the device-tree driver */ + ret = of_init(); + if (ret) { + DPAA_BUS_LOG(ERR, "of_init failed with ret: %d", ret); + return -1; + } + + /* Get the interface configurations from device-tree */ + dpaa_netcfg = netcfg_acquire(); + if (!dpaa_netcfg) { + DPAA_BUS_LOG(ERR, "netcfg_acquire failed"); + return -EINVAL; + } + + RTE_LOG(NOTICE, EAL, "DPAA Bus Detected\n"); + + if (!dpaa_netcfg->num_ethports) { + DPAA_BUS_LOG(INFO, "no network interfaces available"); + /* This is not an error */ + return 0; + } + +#ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER + dump_netcfg(dpaa_netcfg); +#endif + + DPAA_BUS_LOG(DEBUG, "Number of ethernet devices = %d", + dpaa_netcfg->num_ethports); + ret = dpaa_create_device_list(); + if (ret) { + DPAA_BUS_LOG(ERR, "Unable to create device list. (%d)", ret); + return ret; + } + return 0; +} + static int rte_dpaa_bus_probe(void) { @@ -539,6 +554,16 @@ rte_dpaa_bus_probe(void) unsigned int svr_ver; int probe_all = rte_dpaa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_WHITELIST; + /* If DPAA bus is not present nothing needs to be done */ + if (!rte_dpaa_bus.detected) + return 0; + + rte_dpaa_bus_dev_build(); + + /* If no device present on DPAA bus nothing needs to be done */ + if (TAILQ_EMPTY(&rte_dpaa_bus.device_list)) + return 0; + svr_file = fopen(DPAA_SOC_ID_FILE, "r"); if (svr_file) { if (fscanf(svr_file, "svr:%x", &svr_ver) > 0) @@ -546,6 +571,9 @@ rte_dpaa_bus_probe(void) fclose(svr_file); } + /* And initialize the PA->VA translation table */ + dpaax_iova_table_populate(); + /* For each registered driver, and device, call the driver->probe */ TAILQ_FOREACH(dev, &rte_dpaa_bus.device_list, next) { TAILQ_FOREACH(drv, &rte_dpaa_bus.driver_list, next) { @@ -553,6 +581,9 @@ rte_dpaa_bus_probe(void) if (ret) continue; + if (rte_dev_is_probed(&dev->device)) + continue; + if (!drv->probe || (dev->device.devargs && dev->device.devargs->policy == RTE_DEV_BLACKLISTED)) @@ -563,8 +594,12 @@ rte_dpaa_bus_probe(void) dev->device.devargs->policy == RTE_DEV_WHITELISTED)) { ret = drv->probe(drv, dev); - if (ret) + if (ret) { DPAA_BUS_ERR("Unable to probe.\n"); + } else { + dev->driver = drv; + dev->device.driver = &drv->driver; + } } break; } @@ -573,8 +608,7 @@ rte_dpaa_bus_probe(void) /* Register DPAA mempool ops only if any DPAA device has * been detected. */ - if (!TAILQ_EMPTY(&rte_dpaa_bus.device_list)) - rte_mbuf_set_platform_mempool_ops(DPAA_MEMPOOL_OPS_NAME); + rte_mbuf_set_platform_mempool_ops(DPAA_MEMPOOL_OPS_NAME); return 0; } @@ -611,7 +645,7 @@ rte_dpaa_get_iommu_class(void) return RTE_IOVA_PA; } -struct rte_dpaa_bus rte_dpaa_bus = { +static struct rte_dpaa_bus rte_dpaa_bus = { .bus = { .scan = rte_dpaa_bus_scan, .probe = rte_dpaa_bus_probe,