From patchwork Wed Aug 9 15:51:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 130018 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A79AC43016; Wed, 9 Aug 2023 09:33:49 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4AE3843254; Wed, 9 Aug 2023 09:33:21 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by mails.dpdk.org (Postfix) with ESMTP id 20B934326E for ; Wed, 9 Aug 2023 09:33:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1691566399; x=1723102399; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=qBhwf/Z7BE5/hRhSn1Omb3prm0C2bKw6iqtFtBkTgDM=; b=JjxlX070fR8yUyIHpLIm5AqsyN2Cwqxq3OhReZCtNny2fGfeAwMxU+rJ af92O9NfYZCUDr8M1tqH75L3rx7yfAXMpQNh+RDQVqyLjefW/GV4sNfUV 1ksAzAKIw3yWO0/+8rvCJ1/GqKAC0LMK+b1+WB2wJ765zdhLoHyhoZO1S /CKduDFqFnVp8p7MHGd+ljKjvxeMHbjprQ38KWuZU2iCtdq2ePlGi1Ayg pJ+kGl7AOK6yPNUoKpogtci8e9asl/2A8suoAlTnTXmQirSJ955vslGCc hoWiU/x6bN+8NRQfPGZTsnzeRP1Acyq3dWEzjjgTpdjowufX2mubXwJhL Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10795"; a="356014485" X-IronPort-AV: E=Sophos;i="6.01,158,1684825200"; d="scan'208";a="356014485" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Aug 2023 00:33:18 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10795"; a="1062337402" X-IronPort-AV: E=Sophos;i="6.01,158,1684825200"; d="scan'208";a="1062337402" Received: from dpdk-beileix-icelake.sh.intel.com ([10.67.116.252]) by fmsmga005.fm.intel.com with ESMTP; 09 Aug 2023 00:33:15 -0700 From: beilei.xing@intel.com To: jingjing.wu@intel.com, mingxia.liu@intel.com Cc: dev@dpdk.org, Beilei Xing , Qi Zhang Subject: [PATCH 05/19] net/cpfl: parse representor devargs Date: Wed, 9 Aug 2023 15:51:20 +0000 Message-Id: <20230809155134.539287-6-beilei.xing@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230809155134.539287-1-beilei.xing@intel.com> References: <20230809155134.539287-1-beilei.xing@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Beilei Xing Format: [[c]pf]vf control_id: 0 : xeon (default) 1: acc pf_id: 0 : apf (default) 1 : cpf Example: representor=c0pf0vf[0-3] -- xeon > apf > vf 0,1,2,3 same as pf0vf[0-3] and vf[0-3] if omit default value. representor=c0pf0 -- xeon> apf same as pf0 if omit default value. representor=c1pf0 -- acc > apf multiple representor devargs are supported. e.g.: create 4 representors for 4 vfs on xeon APF and one representor for acc APF. -- representor=vf[0-3],representor=c1pf0 Signed-off-by: Qi Zhang Signed-off-by: Beilei Xing --- drivers/net/cpfl/cpfl_ethdev.c | 179 +++++++++++++++++++++++++++++++++ drivers/net/cpfl/cpfl_ethdev.h | 8 ++ 2 files changed, 187 insertions(+) diff --git a/drivers/net/cpfl/cpfl_ethdev.c b/drivers/net/cpfl/cpfl_ethdev.c index 17a69c16fe..a820528a0d 100644 --- a/drivers/net/cpfl/cpfl_ethdev.c +++ b/drivers/net/cpfl/cpfl_ethdev.c @@ -13,8 +13,10 @@ #include #include "cpfl_ethdev.h" +#include #include "cpfl_rxtx.h" +#define CPFL_REPRESENTOR "representor" #define CPFL_TX_SINGLE_Q "tx_single" #define CPFL_RX_SINGLE_Q "rx_single" #define CPFL_VPORT "vport" @@ -25,6 +27,7 @@ struct cpfl_adapter_list cpfl_adapter_list; bool cpfl_adapter_list_init; static const char * const cpfl_valid_args[] = { + CPFL_REPRESENTOR, CPFL_TX_SINGLE_Q, CPFL_RX_SINGLE_Q, CPFL_VPORT, @@ -1407,6 +1410,128 @@ parse_bool(const char *key, const char *value, void *args) return 0; } +static int +enlist(uint16_t *list, uint16_t *len_list, const uint16_t max_list, uint16_t val) +{ + uint16_t i; + + for (i = 0; i < *len_list; i++) { + if (list[i] == val) + return 0; + } + if (*len_list >= max_list) + return -1; + list[(*len_list)++] = val; + return 0; +} + +static const char * +process_range(const char *str, uint16_t *list, uint16_t *len_list, + const uint16_t max_list) +{ + uint16_t lo, hi, val; + int result, n = 0; + const char *pos = str; + + result = sscanf(str, "%hu%n-%hu%n", &lo, &n, &hi, &n); + if (result == 1) { + if (enlist(list, len_list, max_list, lo) != 0) + return NULL; + } else if (result == 2) { + if (lo > hi) + return NULL; + for (val = lo; val <= hi; val++) { + if (enlist(list, len_list, max_list, val) != 0) + return NULL; + } + } else { + return NULL; + } + return pos + n; +} + +static const char * +process_list(const char *str, uint16_t *list, uint16_t *len_list, const uint16_t max_list) +{ + const char *pos = str; + + if (*pos == '[') + pos++; + while (1) { + pos = process_range(pos, list, len_list, max_list); + if (pos == NULL) + return NULL; + if (*pos != ',') /* end of list */ + break; + pos++; + } + if (*str == '[' && *pos != ']') + return NULL; + if (*pos == ']') + pos++; + return pos; +} + +static int +parse_repr(const char *key __rte_unused, const char *value, void *args) +{ + struct cpfl_devargs *devargs = args; + struct rte_eth_devargs *eth_da; + const char *str = value; + + if (devargs->repr_args_num == CPFL_REPR_ARG_NUM_MAX) + return -EINVAL; + + eth_da = &devargs->repr_args[devargs->repr_args_num]; + + if (str[0] == 'c') { + str += 1; + str = process_list(str, eth_da->mh_controllers, + ð_da->nb_mh_controllers, + RTE_DIM(eth_da->mh_controllers)); + if (str == NULL) + goto done; + } + if (str[0] == 'p' && str[1] == 'f') { + eth_da->type = RTE_ETH_REPRESENTOR_PF; + str += 2; + str = process_list(str, eth_da->ports, + ð_da->nb_ports, RTE_DIM(eth_da->ports)); + if (str == NULL || str[0] == '\0') + goto done; + } else if (eth_da->nb_mh_controllers > 0) { + /* 'c' must followed by 'pf'. */ + str = NULL; + goto done; + } + if (str[0] == 'v' && str[1] == 'f') { + eth_da->type = RTE_ETH_REPRESENTOR_VF; + str += 2; + } else if (str[0] == 's' && str[1] == 'f') { + eth_da->type = RTE_ETH_REPRESENTOR_SF; + str += 2; + } else { + /* 'pf' must followed by 'vf' or 'sf'. */ + if (eth_da->type == RTE_ETH_REPRESENTOR_PF) { + str = NULL; + goto done; + } + eth_da->type = RTE_ETH_REPRESENTOR_VF; + } + str = process_list(str, eth_da->representor_ports, + ð_da->nb_representor_ports, + RTE_DIM(eth_da->representor_ports)); +done: + if (str == NULL) { + RTE_LOG(ERR, EAL, "wrong representor format: %s\n", str); + return -1; + } + + devargs->repr_args_num++; + + return 0; +} + static int cpfl_parse_devargs(struct rte_pci_device *pci_dev, struct cpfl_adapter_ext *adapter) { @@ -1431,6 +1556,12 @@ cpfl_parse_devargs(struct rte_pci_device *pci_dev, struct cpfl_adapter_ext *adap return -EINVAL; } + cpfl_args->repr_args_num = 0; + ret = rte_kvargs_process(kvlist, CPFL_REPRESENTOR, &parse_repr, cpfl_args); + + if (ret != 0) + goto fail; + ret = rte_kvargs_process(kvlist, CPFL_VPORT, &parse_vport, cpfl_args); if (ret != 0) @@ -2087,6 +2218,48 @@ cpfl_vport_devargs_process(struct cpfl_adapter_ext *adapter) return 0; } +static int +cpfl_repr_devargs_process(struct cpfl_adapter_ext *adapter) +{ + struct cpfl_devargs *devargs = &adapter->devargs; + int i, j; + + /* check and refine repr args */ + for (i = 0; i < devargs->repr_args_num; i++) { + struct rte_eth_devargs *eth_da = &devargs->repr_args[i]; + + /* set default host_id to xeon host */ + if (eth_da->nb_mh_controllers == 0) { + eth_da->nb_mh_controllers = 1; + eth_da->mh_controllers[0] = CPFL_HOST_ID_HOST; + } else { + for (j = 0; j < eth_da->nb_mh_controllers; j++) { + if (eth_da->mh_controllers[j] > CPFL_HOST_ID_ACC) { + PMD_INIT_LOG(ERR, "Invalid Host ID %d", + eth_da->mh_controllers[j]); + return -EINVAL; + } + } + } + + /* set default pf to APF */ + if (eth_da->nb_ports == 0) { + eth_da->nb_ports = 1; + eth_da->ports[0] = CPFL_PF_TYPE_APF; + } else { + for (j = 0; j < eth_da->nb_ports; j++) { + if (eth_da->ports[j] > CPFL_PF_TYPE_CPF) { + PMD_INIT_LOG(ERR, "Invalid Host ID %d", + eth_da->ports[j]); + return -EINVAL; + } + } + } + } + + return 0; +} + static int cpfl_vport_create(struct rte_pci_device *pci_dev, struct cpfl_adapter_ext *adapter) { @@ -2165,6 +2338,12 @@ cpfl_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, goto err; } + retval = cpfl_repr_devargs_process(adapter); + if (retval != 0) { + PMD_INIT_LOG(ERR, "Failed to process repr devargs"); + goto err; + } + return 0; err: diff --git a/drivers/net/cpfl/cpfl_ethdev.h b/drivers/net/cpfl/cpfl_ethdev.h index 3515fec4f7..9c4d8d3ea1 100644 --- a/drivers/net/cpfl/cpfl_ethdev.h +++ b/drivers/net/cpfl/cpfl_ethdev.h @@ -60,16 +60,24 @@ #define IDPF_DEV_ID_CPF 0x1453 #define VIRTCHNL2_QUEUE_GROUP_P2P 0x100 +#define CPFL_HOST_ID_HOST 0 +#define CPFL_HOST_ID_ACC 1 +#define CPFL_PF_TYPE_APF 0 +#define CPFL_PF_TYPE_CPF 1 + struct cpfl_vport_param { struct cpfl_adapter_ext *adapter; uint16_t devarg_id; /* arg id from user */ uint16_t idx; /* index in adapter->vports[]*/ }; +#define CPFL_REPR_ARG_NUM_MAX 4 /* Struct used when parse driver specific devargs */ struct cpfl_devargs { uint16_t req_vports[CPFL_MAX_VPORT_NUM]; uint16_t req_vport_nb; + uint8_t repr_args_num; + struct rte_eth_devargs repr_args[CPFL_REPR_ARG_NUM_MAX]; }; struct p2p_queue_chunks_info {