From patchwork Tue Jun 25 10:44:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hemant Agrawal X-Patchwork-Id: 167693 Delivered-To: patch@linaro.org Received: by 2002:ac9:6410:0:0:0:0:0 with SMTP id r16csp4829463ock; Tue, 25 Jun 2019 03:45:56 -0700 (PDT) X-Google-Smtp-Source: APXvYqy4aFEqB7IIHes7Vh0kF/5w5QN7sE7uFfjSSm2z4KYLHYWGWxNKNaShtA5KnI0Ys/Ece2hP X-Received: by 2002:a5d:40ca:: with SMTP id b10mr56006105wrq.171.1561459556509; Tue, 25 Jun 2019 03:45:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561459556; cv=none; d=google.com; s=arc-20160816; b=ayrGZdCKegyuOyjo3Ae43ajhGYjmPv/hmvNYih6X3qmBAPYXi/DI23W5AYTcayjVlV MJWH8cPFrTtZH9Cghs97fwy+tXgCobxYHX05AcC3Nelg5mB3ZFZeghkehxz+snm5kID0 jPiwb+FhNUdJbI78+MWhwgOyEayFC7p5D3HikNiwV0zy6MKvqcfUO1lZhdVySWBb+erV ZS14oLL8Qczes+NqUG01CbORo/uGyxq0anV5VIvtioNSoiC9QPZJDizVWpER5uXrO9X+ 96ua8vrhYznJ+1NskAndyR9wbvzuFz2oDZmzVSQasaMF8fdzjBgVtwlSTbZ44Sm0cbbR MIsQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:message-id:date:cc:to :from; bh=G6NNsa/+EZcKOVbOp6oeWdN938v0Ejiv+cgGrc7gwtw=; b=tzPJy2zbfAYcfZnKMFPcn6OsegYyDUorUguQa4MPABh/11COM7BRPE/r+O2N5esPs3 Sj4rcQm5+gnClQxgz0ztJEgBkjaIOEWYZBOfc6x3dZo3tOyxTWDXQGm6dejJXxMu3l/G YBdrW7f+Ftr7zgbgH4kW8T/nAqNC5K03e5f5wfTVuwRZzXfZ6O+E43pBezqalohHBhTh JgzZWGK4eBjTMbh8P7iP7+l7EUXj7QCNhl1GuW5K4OLzXq9KxiRjVa0DoR4hDY+h6/tn LUqTBMAi2mKl8lMrWr42LSzUld/eobKAPSgteCsr+B9tuyYFF096itd6wiuW4aZ1O1Hy u4tw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) smtp.mailfrom=dev-bounces@dpdk.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Return-Path: Received: from dpdk.org (dpdk.org. [92.243.14.124]) by mx.google.com with ESMTP id k6si1631362wmj.201.2019.06.25.03.45.56; Tue, 25 Jun 2019 03:45:56 -0700 (PDT) Received-SPF: pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) client-ip=92.243.14.124; Authentication-Results: mx.google.com; spf=pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) smtp.mailfrom=dev-bounces@dpdk.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id F18344F94; Tue, 25 Jun 2019 12:45:55 +0200 (CEST) Received: from inva021.nxp.com (inva021.nxp.com [92.121.34.21]) by dpdk.org (Postfix) with ESMTP id 6721F4C8E for ; Tue, 25 Jun 2019 12:45:55 +0200 (CEST) Received: from inva021.nxp.com (localhost [127.0.0.1]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 21E5120074D; Tue, 25 Jun 2019 12:45:55 +0200 (CEST) Received: from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com [165.114.16.14]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id 40F2620073A; Tue, 25 Jun 2019 12:45:53 +0200 (CEST) Received: from bf-netperf1.ap.freescale.net (bf-netperf1.ap.freescale.net [10.232.133.63]) by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id BA563402FB; Tue, 25 Jun 2019 18:45:50 +0800 (SGT) From: Hemant Agrawal To: dev@dpdk.org Cc: ferruh.yigit@intel.com Date: Tue, 25 Jun 2019 16:14:07 +0530 Message-Id: <20190625104411.19565-1-hemant.agrawal@nxp.com> X-Mailer: git-send-email 2.17.1 X-Virus-Scanned: ClamAV using ClamSMTP Subject: [dpdk-dev] [PATCH 1/5] bus/fslmc: support device iteration X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Shreyansh Jain Recent (18.11+), devargs structure was changed and so was DPDK port usage in applications like OVS. Applications are now allowed to plug/unplug ports (eth) using APIs (hotplug) based on device arguments. This patch enables the plug/unplug function (which are dummy for FSLMC) and the iterator function for rte_dev_probe() and similar API support. Signed-off-by: Shreyansh Jain --- drivers/bus/fslmc/fslmc_bus.c | 132 +++++++++++++++++++++++++++++----- 1 file changed, 116 insertions(+), 16 deletions(-) -- 2.17.1 diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c index f6e66d22c..35103d224 100644 --- a/drivers/bus/fslmc/fslmc_bus.c +++ b/drivers/bus/fslmc/fslmc_bus.c @@ -230,34 +230,70 @@ rte_fslmc_parse(const char *name, void *addr) { uint16_t dev_id; char *t_ptr; + char *sep = NULL; + uint8_t sep_exists = 0; - /* 'name' is expected to contain name of device, for example, dpio.1, - * dpni.2, etc. + DPAA2_BUS_DEBUG("Parsing dev=(%s)", name); + + /* There are multiple ways this can be called, with bus:dev, name=dev + * or just dev. In all cases, the 'addr' is actually a string. + */ + sep = strchr(name, ':'); + if (!sep) { + /* check for '=' */ + sep = strchr(name, '='); + if (!sep) + sep_exists = 0; + else + sep_exists = 1; + } else + sep_exists = 1; + + /* Check if starting part if either of 'fslmc:' or 'name=', separator + * exists. */ - if (strncmp("dpni", name, 4) && - strncmp("dpseci", name, 6) && - strncmp("dpcon", name, 5) && - strncmp("dpbp", name, 4) && - strncmp("dpio", name, 4) && - strncmp("dpci", name, 4) && - strncmp("dpmcp", name, 5) && - strncmp("dpdmai", name, 6) && - strncmp("dpdmux", name, 6)) { - DPAA2_BUS_DEBUG("Unknown or unsupported device (%s)", name); + if (sep_exists) { + /* If either of "fslmc" or "name" are starting part */ + if (!strncmp(name, RTE_STR(FSLMC_BUS_NAME), + strlen(RTE_STR(FSLMC_BUS_NAME))) || + (!strncmp(name, "name", strlen("name")))) { + goto jump_out; + } else { + DPAA2_BUS_DEBUG("Invalid device for matching (%s).", + name); + goto err_out; + } + } else + sep = strdup(name); + +jump_out: + /* Validate device name */ + if (strncmp("dpni", sep, 4) && + strncmp("dpseci", sep, 6) && + strncmp("dpcon", sep, 5) && + strncmp("dpbp", sep, 4) && + strncmp("dpio", sep, 4) && + strncmp("dpci", sep, 4) && + strncmp("dpmcp", sep, 5) && + strncmp("dpdmai", sep, 6) && + strncmp("dpdmux", sep, 6)) { + DPAA2_BUS_DEBUG("Unknown or unsupported device (%s)", sep); goto err_out; } - t_ptr = strchr(name, '.'); + 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)", name); + DPAA2_BUS_ERR("Missing device id in device name (%s)", sep); goto err_out; } if (addr) - strcpy(addr, name); + strcpy(addr, sep); return 0; err_out: + if (sep) + free(sep); return -EINVAL; } @@ -430,6 +466,13 @@ rte_fslmc_find_device(const struct rte_device *start, rte_dev_cmp_t cmp, const struct rte_dpaa2_device *dstart; struct rte_dpaa2_device *dev; + DPAA2_BUS_DEBUG("Finding a device named %s\n", (const char *)data); + + /* find_device is always called with an opaque object which should be + * passed along to the 'cmp' function iterating over all device obj + * on the bus. + */ + if (start != NULL) { dstart = RTE_DEV_TO_FSLMC_CONST(start); dev = TAILQ_NEXT(dstart, next); @@ -437,8 +480,11 @@ rte_fslmc_find_device(const struct rte_device *start, rte_dev_cmp_t cmp, dev = TAILQ_FIRST(&rte_fslmc_bus.device_list); } while (dev != NULL) { - if (cmp(&dev->device, data) == 0) + if (cmp(&dev->device, data) == 0) { + DPAA2_BUS_DEBUG("Found device (%s)\n", + dev->device.name); return &dev->device; + } dev = TAILQ_NEXT(dev, next); } @@ -527,6 +573,57 @@ rte_dpaa2_get_iommu_class(void) return RTE_IOVA_PA; } +static int +fslmc_bus_plug(struct rte_device *dev __rte_unused) +{ + /* No operation is performed while plugging the device */ + return 0; +} + +static int +fslmc_bus_unplug(struct rte_device *dev __rte_unused) +{ + /* No operation is performed while unplugging the device */ + return 0; +} + +static void * +fslmc_bus_dev_iterate(const void *start, const char *str, + const struct rte_dev_iterator *it __rte_unused) +{ + const struct rte_dpaa2_device *dstart; + struct rte_dpaa2_device *dev; + char *dup, *dev_name = 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); + return NULL; + } + + /* Now that name=device_name format is available, split */ + dup = strdup(str); + dev_name = dup + strlen("name="); + + if (start != NULL) { + dstart = RTE_DEV_TO_FSLMC_CONST(start); + dev = TAILQ_NEXT(dstart, next); + } else { + dev = TAILQ_FIRST(&rte_fslmc_bus.device_list); + } + + while (dev != NULL) { + if (strcmp(dev->device.name, dev_name) == 0) { + free(dup); + return &dev->device; + } + dev = TAILQ_NEXT(dev, next); + } + + free(dup); + return NULL; +} + struct rte_fslmc_bus rte_fslmc_bus = { .bus = { .scan = rte_fslmc_scan, @@ -534,6 +631,9 @@ struct rte_fslmc_bus rte_fslmc_bus = { .parse = rte_fslmc_parse, .find_device = rte_fslmc_find_device, .get_iommu_class = rte_dpaa2_get_iommu_class, + .plug = fslmc_bus_plug, + .unplug = fslmc_bus_unplug, + .dev_iterate = fslmc_bus_dev_iterate, }, .device_list = TAILQ_HEAD_INITIALIZER(rte_fslmc_bus.device_list), .driver_list = TAILQ_HEAD_INITIALIZER(rte_fslmc_bus.driver_list),