X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fbus%2Fdpaa%2Fdpaa_bus.c;h=f39d6e20923952ba1ea18d095dbcefcb54c01101;hb=a86cb7e259ca5efc5fee4895619d4dbd0fbc6ac2;hp=591e28c1e70987274be075a885f8c52fe8b94481;hpb=be2ee360fe86cf041d1a07577919160e6557c679;p=dpdk.git diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c index 591e28c1e7..f39d6e2092 100644 --- a/drivers/bus/dpaa/dpaa_bus.c +++ b/drivers/bus/dpaa/dpaa_bus.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * - * Copyright 2017-2019 NXP + * Copyright 2017-2020 NXP * */ /* System headers */ @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,7 @@ #include #include #include +#include #include #include @@ -42,8 +44,6 @@ #include #include -int dpaa_logtype_bus; - static struct rte_dpaa_bus rte_dpaa_bus; struct netcfg_info *dpaa_netcfg; @@ -54,8 +54,10 @@ unsigned int dpaa_svr_family; #define FSL_DPAA_BUS_NAME dpaa_bus -RTE_DEFINE_PER_LCORE(bool, dpaa_io); -RTE_DEFINE_PER_LCORE(struct dpaa_portal_dqrr, held_bufs); +RTE_DEFINE_PER_LCORE(struct dpaa_portal *, dpaa_io); + +#define DPAA_SEQN_DYNFIELD_NAME "dpaa_seqn_dynfield" +int dpaa_seqn_dynfield_offset = -1; struct fm_eth_port_cfg * dpaa_get_eth_port_cfg(int dev_id) @@ -253,20 +255,31 @@ dpaa_clean_device_list(void) int rte_dpaa_portal_init(void *arg) { + static const struct rte_mbuf_dynfield dpaa_seqn_dynfield_desc = { + .name = DPAA_SEQN_DYNFIELD_NAME, + .size = sizeof(dpaa_seqn_t), + .align = __alignof__(dpaa_seqn_t), + }; unsigned int cpu, lcore = rte_lcore_id(); int ret; - struct dpaa_portal *dpaa_io_portal; BUS_INIT_FUNC_TRACE(); if ((size_t)arg == 1 || lcore == LCORE_ID_ANY) - lcore = rte_get_master_lcore(); + lcore = rte_get_main_lcore(); else if (lcore >= RTE_MAX_LCORE) return -1; cpu = rte_lcore_to_cpu_id(lcore); + dpaa_seqn_dynfield_offset = + rte_mbuf_dynfield_register(&dpaa_seqn_dynfield_desc); + if (dpaa_seqn_dynfield_offset < 0) { + DPAA_BUS_LOG(ERR, "Failed to register mbuf field for dpaa sequence number\n"); + return -rte_errno; + } + /* Initialise bman thread portals */ ret = bman_thread_init(); if (ret) { @@ -290,20 +303,21 @@ int rte_dpaa_portal_init(void *arg) DPAA_BUS_LOG(DEBUG, "QMAN thread initialized - CPU=%d lcore=%d", cpu, lcore); - dpaa_io_portal = rte_malloc(NULL, sizeof(struct dpaa_portal), + DPAA_PER_LCORE_PORTAL = rte_malloc(NULL, sizeof(struct dpaa_portal), RTE_CACHE_LINE_SIZE); - if (!dpaa_io_portal) { + if (!DPAA_PER_LCORE_PORTAL) { DPAA_BUS_LOG(ERR, "Unable to allocate memory"); bman_thread_finish(); qman_thread_finish(); return -ENOMEM; } - dpaa_io_portal->qman_idx = qman_get_portal_index(); - dpaa_io_portal->bman_idx = bman_get_portal_index(); - dpaa_io_portal->tid = syscall(SYS_gettid); + DPAA_PER_LCORE_PORTAL->qman_idx = qman_get_portal_index(); + DPAA_PER_LCORE_PORTAL->bman_idx = bman_get_portal_index(); + DPAA_PER_LCORE_PORTAL->tid = syscall(SYS_gettid); - ret = pthread_setspecific(dpaa_portal_key, (void *)dpaa_io_portal); + ret = pthread_setspecific(dpaa_portal_key, + (void *)DPAA_PER_LCORE_PORTAL); if (ret) { DPAA_BUS_LOG(ERR, "pthread_setspecific failed on core %u" " (lcore=%u) with ret: %d", cpu, lcore, ret); @@ -312,8 +326,6 @@ int rte_dpaa_portal_init(void *arg) return ret; } - RTE_PER_LCORE(dpaa_io) = true; - DPAA_BUS_LOG(DEBUG, "QMAN thread initialized"); return 0; @@ -326,7 +338,7 @@ rte_dpaa_portal_fq_init(void *arg, struct qman_fq *fq) u32 sdqcr; int ret; - if (unlikely(!RTE_PER_LCORE(dpaa_io))) { + if (unlikely(!DPAA_PER_LCORE_PORTAL)) { ret = rte_dpaa_portal_init(arg); if (ret < 0) { DPAA_BUS_LOG(ERR, "portal initialization failure"); @@ -369,17 +381,14 @@ dpaa_portal_finish(void *arg) rte_free(dpaa_io_portal); dpaa_io_portal = NULL; - - RTE_PER_LCORE(dpaa_io) = false; + DPAA_PER_LCORE_PORTAL = NULL; } static int -rte_dpaa_bus_parse(const char *name, void *out_name) +rte_dpaa_bus_parse(const char *name, void *out) { - int i, j; - int max_fman = 2, max_macs = 16; - char *dup_name; - char *sep = NULL; + unsigned int i, j; + size_t delta; /* There are two ways of passing device name, with and without * separator. "dpaa_bus:fm1-mac3" with separator, and "fm1-mac3" @@ -388,46 +397,36 @@ rte_dpaa_bus_parse(const char *name, void *out_name) */ DPAA_BUS_DEBUG("Parse device name (%s)", name); - /* Check for dpaa_bus:fm1-mac3 style */ - dup_name = strdup(name); - sep = strchr(dup_name, ':'); - if (!sep) - /* If not, check for name=fm1-mac3 style */ - sep = strchr(dup_name, '='); + delta = 0; + if (strncmp(name, "dpaa_bus:", 9) == 0) { + delta = 9; + } else if (strncmp(name, "name=", 5) == 0) { + delta = 5; + } - if (sep) - /* jump over the seprator */ - sep = (char *) (sep + 1); - else - sep = dup_name; - - for (i = 0; i < max_fman; i++) { - for (j = 0; j < max_macs; j++) { - char fm_name[16]; - snprintf(fm_name, 16, "fm%d-mac%d", i, j); - if (strcmp(fm_name, sep) == 0) { - if (out_name) - strcpy(out_name, sep); - free(dup_name); - return 0; - } - } + if (sscanf(&name[delta], "fm%u-mac%u", &i, &j) != 2 || + i >= 2 || j >= 16) { + return -EINVAL; } - for (i = 0; i < RTE_LIBRTE_DPAA_MAX_CRYPTODEV; i++) { - char sec_name[16]; - - snprintf(sec_name, 16, "dpaa_sec-%d", i+1); - if (strcmp(sec_name, sep) == 0) { - if (out_name) - strcpy(out_name, sep); - free(dup_name); - return 0; - } + if (out != NULL) { + char *out_name = out; + const size_t max_name_len = sizeof("fm.-mac..") - 1; + + /* Do not check for truncation, either name ends with + * '\0' or the device name is followed by parameters and there + * will be a ',' instead. Not copying past this comma is not an + * error. + */ + strlcpy(out_name, &name[delta], max_name_len + 1); + + /* Second digit of mac%u could instead be ','. */ + if ((strlen(out_name) == max_name_len) && + out_name[max_name_len] == ',') + out_name[max_name_len] = '\0'; } - free(dup_name); - return -EINVAL; + return 0; } #define DPAA_DEV_PATH1 "/sys/devices/platform/soc/soc:fsl,dpaa" @@ -548,6 +547,23 @@ rte_dpaa_bus_dev_build(void) return 0; } +static int rte_dpaa_setup_intr(struct rte_intr_handle *intr_handle) +{ + int fd; + + fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); + if (fd < 0) { + DPAA_BUS_ERR("Cannot set up eventfd, error %i (%s)", + errno, strerror(errno)); + return errno; + } + + intr_handle->fd = fd; + intr_handle->type = RTE_INTR_HANDLE_EXT; + + return 0; +} + static int rte_dpaa_bus_probe(void) { @@ -556,7 +572,7 @@ rte_dpaa_bus_probe(void) struct rte_dpaa_driver *drv; FILE *svr_file = NULL; unsigned int svr_ver; - int probe_all = rte_dpaa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_WHITELIST; + int probe_all = rte_dpaa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_ALLOWLIST; static int process_once; /* If DPAA bus is not present nothing needs to be done */ @@ -595,6 +611,14 @@ rte_dpaa_bus_probe(void) fclose(svr_file); } + TAILQ_FOREACH(dev, &rte_dpaa_bus.device_list, next) { + if (dev->device_type == FSL_DPAA_ETH) { + ret = rte_dpaa_setup_intr(&dev->intr_handle); + if (ret) + DPAA_BUS_ERR("Error setting up interrupt.\n"); + } + } + /* And initialize the PA->VA translation table */ dpaax_iova_table_populate(); @@ -610,13 +634,12 @@ rte_dpaa_bus_probe(void) if (!drv->probe || (dev->device.devargs && - dev->device.devargs->policy == RTE_DEV_BLACKLISTED)) + dev->device.devargs->policy == RTE_DEV_BLOCKED)) continue; if (probe_all || (dev->device.devargs && - dev->device.devargs->policy == - RTE_DEV_WHITELISTED)) { + dev->device.devargs->policy == RTE_DEV_ALLOWED)) { ret = drv->probe(drv, dev); if (ret) { DPAA_BUS_ERR("unable to probe:%s", @@ -754,10 +777,4 @@ static struct rte_dpaa_bus rte_dpaa_bus = { }; RTE_REGISTER_BUS(FSL_DPAA_BUS_NAME, rte_dpaa_bus.bus); - -RTE_INIT(dpaa_init_log) -{ - dpaa_logtype_bus = rte_log_register("bus.dpaa"); - if (dpaa_logtype_bus >= 0) - rte_log_set_level(dpaa_logtype_bus, RTE_LOG_NOTICE); -} +RTE_LOG_REGISTER(dpaa_logtype_bus, bus.dpaa, NOTICE);