[v11,12/19] net/ipn3ke: remove configuration for i40e port bonding
Checks
Commit Message
From: Rosen Xu <rosen.xu@intel.com>
The ipn3ke board FPGA and i40e BDF scan has added in ifpga_rawdev,
so it doesn't need to provide configuration for i40e port bonding.
Signed-off-by: Rosen Xu <rosen.xu@intel.com>
Signed-off-by: Andy Pei <andy.pei@intel.com>
---
drivers/meson.build | 7 +-
drivers/net/ipn3ke/Makefile | 2 +
drivers/net/ipn3ke/ipn3ke_ethdev.c | 289 +++----------------------
drivers/net/ipn3ke/ipn3ke_representor.c | 8 +-
drivers/net/ipn3ke/meson.build | 2 +-
drivers/raw/ifpga/meson.build | 6 +
drivers/raw/ifpga/rte_rawdev_ifpga_version.map | 6 +
7 files changed, 62 insertions(+), 258 deletions(-)
Comments
+Bruce for the meson change.
Thanks,
Xiaolong
On 10/21, Andy Pei wrote:
>From: Rosen Xu <rosen.xu@intel.com>
>
>The ipn3ke board FPGA and i40e BDF scan has added in ifpga_rawdev,
>so it doesn't need to provide configuration for i40e port bonding.
>
>Signed-off-by: Rosen Xu <rosen.xu@intel.com>
>Signed-off-by: Andy Pei <andy.pei@intel.com>
>---
> drivers/meson.build | 7 +-
> drivers/net/ipn3ke/Makefile | 2 +
> drivers/net/ipn3ke/ipn3ke_ethdev.c | 289 +++----------------------
> drivers/net/ipn3ke/ipn3ke_representor.c | 8 +-
> drivers/net/ipn3ke/meson.build | 2 +-
> drivers/raw/ifpga/meson.build | 6 +
> drivers/raw/ifpga/rte_rawdev_ifpga_version.map | 6 +
> 7 files changed, 62 insertions(+), 258 deletions(-)
>
>diff --git a/drivers/meson.build b/drivers/meson.build
>index 2ed2e95..afdbb3b 100644
>--- a/drivers/meson.build
>+++ b/drivers/meson.build
>@@ -9,12 +9,12 @@ endif
> dpdk_driver_classes = ['common',
> 'bus',
> 'mempool', # depends on common and bus.
>+ 'raw',
> 'net', # depends on common, bus and mempool.
> 'crypto', # depends on common, bus and mempool (net in future).
> 'compress', # depends on common, bus, mempool.
> 'event', # depends on common, bus, mempool and net.
>- 'baseband', # depends on common and bus.
>- 'raw'] # depends on common, bus, mempool, net and event.
>+ 'baseband']
>
> default_cflags = machine_args
> if cc.has_argument('-Wno-format-truncation')
>@@ -157,6 +157,9 @@ foreach class:dpdk_driver_classes
>
> set_variable('shared_@0@'.format(lib_name), shared_dep)
> set_variable('static_@0@'.format(lib_name), static_dep)
>+ dependency_name = ''.join(lib_name.split('rte_'))
>+ message('drivers/@0@: Defining dependency "@1@"'.format(
>+ drv_path, dependency_name))
> endif # build
> endforeach
>
>diff --git a/drivers/net/ipn3ke/Makefile b/drivers/net/ipn3ke/Makefile
>index 8c3ae37..2c65e49 100644
>--- a/drivers/net/ipn3ke/Makefile
>+++ b/drivers/net/ipn3ke/Makefile
>@@ -19,6 +19,8 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
> CFLAGS += -O3
> CFLAGS += $(WERROR_FLAGS)
> CFLAGS += -I$(RTE_SDK)/drivers/bus/ifpga
>+CFLAGS += -I$(RTE_SDK)/drivers/raw/ifpga
>+CFLAGS += -I$(RTE_SDK)/drivers/net/i40e
> LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
> LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs
> LDLIBS += -lrte_bus_ifpga
>diff --git a/drivers/net/ipn3ke/ipn3ke_ethdev.c b/drivers/net/ipn3ke/ipn3ke_ethdev.c
>index 28d8aaf..3051cdf 100644
>--- a/drivers/net/ipn3ke/ipn3ke_ethdev.c
>+++ b/drivers/net/ipn3ke/ipn3ke_ethdev.c
>@@ -19,6 +19,7 @@
> #include <rte_bus_ifpga.h>
> #include <ifpga_common.h>
> #include <ifpga_logs.h>
>+#include <ifpga_rawdev.h>
>
> #include "ipn3ke_rawdev_api.h"
> #include "ipn3ke_flow.h"
>@@ -324,7 +325,8 @@
> "LineSideMACType", &mac_type);
> hw->retimer.mac_type = (int)mac_type;
>
>- IPN3KE_AFU_PMD_DEBUG("UPL_version is 0x%x\n", IPN3KE_READ_REG(hw, 0));
>+ hw->acc_tm = 0;
>+ hw->acc_flow = 0;
>
> if (afu_dev->id.uuid.uuid_low == IPN3KE_UUID_VBNG_LOW &&
> afu_dev->id.uuid.uuid_high == IPN3KE_UUID_VBNG_HIGH) {
>@@ -342,6 +344,12 @@
> /* After reset, wait until init done */
> if (ipn3ke_vbng_init_done(hw))
> return -1;
>+
>+ hw->acc_tm = 1;
>+ hw->acc_flow = 1;
>+
>+ IPN3KE_AFU_PMD_DEBUG("UPL_version is 0x%x\n",
>+ IPN3KE_READ_REG(hw, 0));
> }
>
> if (hw->retimer.mac_type == IFPGA_RAWDEV_RETIMER_MAC_TYPE_10GE_XFI) {
>@@ -409,9 +417,6 @@
> hw->flow_hw_enable = 1;
> }
>
>- hw->acc_tm = 0;
>- hw->acc_flow = 0;
>-
> return 0;
> }
>
>@@ -462,7 +467,11 @@ static int ipn3ke_vswitch_probe(struct rte_afu_device *afu_dev)
> {
> char name[RTE_ETH_NAME_MAX_LEN];
> struct ipn3ke_hw *hw;
>- int i, retval;
>+ struct rte_eth_dev *i40e_eth;
>+ struct ifpga_rawdev *ifpga_dev;
>+ uint16_t port_id;
>+ int i, j, retval;
>+ char *fvl_bdf;
>
> /* check if the AFU device has been probed already */
> /* allocate shared mcp_vswitch structure */
>@@ -489,7 +498,12 @@ static int ipn3ke_vswitch_probe(struct rte_afu_device *afu_dev)
> if (retval)
> return retval;
>
>+ ifpga_dev = ifpga_rawdev_get(hw->rawdev);
>+ if (!ifpga_dev)
>+ IPN3KE_AFU_PMD_ERR("failed to find ifpga_device.");
>+
> /* probe representor ports */
>+ j = 0;
> for (i = 0; i < hw->port_num; i++) {
> struct ipn3ke_rpst rpst = {
> .port_id = i,
>@@ -501,6 +515,22 @@ static int ipn3ke_vswitch_probe(struct rte_afu_device *afu_dev)
> snprintf(name, sizeof(name), "net_%s_representor_%d",
> afu_dev->device.name, i);
>
>+ for (; j < 8; j++) {
>+ fvl_bdf = ifpga_dev->fvl_bdf[j];
>+ retval = rte_eth_dev_get_port_by_name(fvl_bdf,
>+ &port_id);
>+ if (retval) {
>+ continue;
>+ } else {
>+ i40e_eth = &rte_eth_devices[port_id];
>+ rpst.i40e_pf_eth = i40e_eth;
>+ rpst.i40e_pf_eth_port_id = port_id;
>+
>+ j++;
>+ break;
>+ }
>+ }
>+
> retval = rte_eth_dev_create(&afu_dev->device, name,
> sizeof(struct ipn3ke_rpst), NULL, NULL,
> ipn3ke_rpst_init, &rpst);
>@@ -508,6 +538,7 @@ static int ipn3ke_vswitch_probe(struct rte_afu_device *afu_dev)
> if (retval)
> IPN3KE_AFU_PMD_ERR("failed to create ipn3ke representor %s.",
> name);
>+
> }
>
> return 0;
>@@ -553,254 +584,6 @@ static int ipn3ke_vswitch_remove(struct rte_afu_device *afu_dev)
>
> RTE_PMD_REGISTER_AFU(net_ipn3ke_afu, afu_ipn3ke_driver);
>
>-static const char * const valid_args[] = {
>-#define IPN3KE_AFU_NAME "afu"
>- IPN3KE_AFU_NAME,
>-#define IPN3KE_FPGA_ACCELERATION_LIST "fpga_acc"
>- IPN3KE_FPGA_ACCELERATION_LIST,
>-#define IPN3KE_I40E_PF_LIST "i40e_pf"
>- IPN3KE_I40E_PF_LIST,
>- NULL
>-};
>-
>-static int
>-ipn3ke_cfg_parse_acc_list(const char *afu_name,
>- const char *acc_list_name)
>-{
>- struct rte_afu_device *afu_dev;
>- struct ipn3ke_hw *hw;
>- const char *p_source;
>- char *p_start;
>- char name[RTE_ETH_NAME_MAX_LEN];
>-
>- afu_dev = rte_ifpga_find_afu_by_name(afu_name);
>- if (!afu_dev)
>- return -1;
>- hw = afu_dev->shared.data;
>- if (!hw)
>- return -1;
>-
>- p_source = acc_list_name;
>- while (*p_source) {
>- while ((*p_source == '{') || (*p_source == '|'))
>- p_source++;
>- p_start = name;
>- while ((*p_source != '|') && (*p_source != '}'))
>- *p_start++ = *p_source++;
>- *p_start = 0;
>- if (!strcmp(name, "tm") && hw->tm_hw_enable)
>- hw->acc_tm = 1;
>-
>- if (!strcmp(name, "flow") && hw->flow_hw_enable)
>- hw->acc_flow = 1;
>-
>- if (*p_source == '}')
>- return 0;
>- }
>-
>- return 0;
>-}
>-
>-static int
>-ipn3ke_cfg_parse_i40e_pf_ethdev(const char *afu_name,
>- const char *pf_name)
>-{
>- struct rte_eth_dev *i40e_eth, *rpst_eth;
>- struct rte_afu_device *afu_dev;
>- struct ipn3ke_rpst *rpst;
>- struct ipn3ke_hw *hw;
>- const char *p_source;
>- char *p_start;
>- char name[RTE_ETH_NAME_MAX_LEN];
>- uint16_t port_id;
>- int i;
>- int ret = -1;
>-
>- afu_dev = rte_ifpga_find_afu_by_name(afu_name);
>- if (!afu_dev)
>- return -1;
>- hw = afu_dev->shared.data;
>- if (!hw)
>- return -1;
>-
>- p_source = pf_name;
>- for (i = 0; i < hw->port_num; i++) {
>- snprintf(name, sizeof(name), "net_%s_representor_%d",
>- afu_name, i);
>- ret = rte_eth_dev_get_port_by_name(name, &port_id);
>- if (ret)
>- return -1;
>- rpst_eth = &rte_eth_devices[port_id];
>- rpst = IPN3KE_DEV_PRIVATE_TO_RPST(rpst_eth);
>-
>- while ((*p_source == '{') || (*p_source == '|'))
>- p_source++;
>- p_start = name;
>- while ((*p_source != '|') && (*p_source != '}'))
>- *p_start++ = *p_source++;
>- *p_start = 0;
>-
>- ret = rte_eth_dev_get_port_by_name(name, &port_id);
>- if (ret)
>- return -1;
>- i40e_eth = &rte_eth_devices[port_id];
>-
>- rpst->i40e_pf_eth = i40e_eth;
>- rpst->i40e_pf_eth_port_id = port_id;
>-
>- if ((*p_source == '}') || !(*p_source))
>- break;
>- }
>-
>- return 0;
>-}
>-
>-static int
>-ipn3ke_cfg_probe(struct rte_vdev_device *dev)
>-{
>- struct rte_devargs *devargs;
>- struct rte_kvargs *kvlist = NULL;
>- char *afu_name = NULL;
>- char *acc_name = NULL;
>- char *pf_name = NULL;
>- int afu_name_en = 0;
>- int acc_list_en = 0;
>- int pf_list_en = 0;
>- int ret = -1;
>-
>- devargs = dev->device.devargs;
>-
>- kvlist = rte_kvargs_parse(devargs->args, valid_args);
>- if (!kvlist) {
>- IPN3KE_AFU_PMD_ERR("error when parsing param");
>- goto end;
>- }
>-
>- if (rte_kvargs_count(kvlist, IPN3KE_AFU_NAME) == 1) {
>- if (rte_kvargs_process(kvlist, IPN3KE_AFU_NAME,
>- &rte_ifpga_get_string_arg,
>- &afu_name) < 0) {
>- IPN3KE_AFU_PMD_ERR("error to parse %s",
>- IPN3KE_AFU_NAME);
>- goto end;
>- } else {
>- afu_name_en = 1;
>- }
>- }
>-
>- if (rte_kvargs_count(kvlist, IPN3KE_FPGA_ACCELERATION_LIST) == 1) {
>- if (rte_kvargs_process(kvlist, IPN3KE_FPGA_ACCELERATION_LIST,
>- &rte_ifpga_get_string_arg,
>- &acc_name) < 0) {
>- IPN3KE_AFU_PMD_ERR("error to parse %s",
>- IPN3KE_FPGA_ACCELERATION_LIST);
>- goto end;
>- } else {
>- acc_list_en = 1;
>- }
>- }
>-
>- if (rte_kvargs_count(kvlist, IPN3KE_I40E_PF_LIST) == 1) {
>- if (rte_kvargs_process(kvlist, IPN3KE_I40E_PF_LIST,
>- &rte_ifpga_get_string_arg,
>- &pf_name) < 0) {
>- IPN3KE_AFU_PMD_ERR("error to parse %s",
>- IPN3KE_I40E_PF_LIST);
>- goto end;
>- } else {
>- pf_list_en = 1;
>- }
>- }
>-
>- if (!afu_name_en) {
>- IPN3KE_AFU_PMD_ERR("arg %s is mandatory for ipn3ke",
>- IPN3KE_AFU_NAME);
>- goto end;
>- }
>-
>- if (!pf_list_en) {
>- IPN3KE_AFU_PMD_ERR("arg %s is mandatory for ipn3ke",
>- IPN3KE_I40E_PF_LIST);
>- goto end;
>- }
>-
>- if (acc_list_en) {
>- ret = ipn3ke_cfg_parse_acc_list(afu_name, acc_name);
>- if (ret) {
>- IPN3KE_AFU_PMD_ERR("arg %s parse error for ipn3ke",
>- IPN3KE_FPGA_ACCELERATION_LIST);
>- goto end;
>- }
>- } else {
>- IPN3KE_AFU_PMD_INFO("arg %s is optional for ipn3ke, using i40e acc",
>- IPN3KE_FPGA_ACCELERATION_LIST);
>- }
>-
>- ret = ipn3ke_cfg_parse_i40e_pf_ethdev(afu_name, pf_name);
>- if (ret)
>- goto end;
>-end:
>- if (kvlist)
>- rte_kvargs_free(kvlist);
>- if (afu_name)
>- free(afu_name);
>- if (acc_name)
>- free(acc_name);
>-
>- return ret;
>-}
>-
>-static int
>-ipn3ke_cfg_remove(struct rte_vdev_device *dev)
>-{
>- struct rte_devargs *devargs;
>- struct rte_kvargs *kvlist = NULL;
>- char *afu_name = NULL;
>- struct rte_afu_device *afu_dev;
>- int ret = -1;
>-
>- devargs = dev->device.devargs;
>-
>- kvlist = rte_kvargs_parse(devargs->args, valid_args);
>- if (!kvlist) {
>- IPN3KE_AFU_PMD_ERR("error when parsing param");
>- goto end;
>- }
>-
>- if (rte_kvargs_count(kvlist, IPN3KE_AFU_NAME) == 1) {
>- if (rte_kvargs_process(kvlist, IPN3KE_AFU_NAME,
>- &rte_ifpga_get_string_arg,
>- &afu_name) < 0) {
>- IPN3KE_AFU_PMD_ERR("error to parse %s",
>- IPN3KE_AFU_NAME);
>- } else {
>- afu_dev = rte_ifpga_find_afu_by_name(afu_name);
>- if (!afu_dev)
>- goto end;
>- ret = ipn3ke_vswitch_remove(afu_dev);
>- }
>- } else {
>- IPN3KE_AFU_PMD_ERR("Remove ipn3ke_cfg %p error", dev);
>- }
>-
>-end:
>- if (kvlist)
>- rte_kvargs_free(kvlist);
>-
>- return ret;
>-}
>-
>-static struct rte_vdev_driver ipn3ke_cfg_driver = {
>- .probe = ipn3ke_cfg_probe,
>- .remove = ipn3ke_cfg_remove,
>-};
>-
>-RTE_PMD_REGISTER_VDEV(ipn3ke_cfg, ipn3ke_cfg_driver);
>-RTE_PMD_REGISTER_PARAM_STRING(ipn3ke_cfg,
>- "afu=<string> "
>- "fpga_acc=<string>"
>- "i40e_pf=<string>");
>-
> RTE_INIT(ipn3ke_afu_init_log)
> {
> ipn3ke_afu_logtype = rte_log_register("pmd.afu.ipn3ke");
>diff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c
>index d37f5e2..7e5d29d 100644
>--- a/drivers/net/ipn3ke/ipn3ke_representor.c
>+++ b/drivers/net/ipn3ke/ipn3ke_representor.c
>@@ -20,6 +20,7 @@
> #include <rte_rawdev_pmd.h>
> #include <rte_bus_ifpga.h>
> #include <ifpga_logs.h>
>+#include <rte_pmd_i40e.h>
>
> #include "ipn3ke_rawdev_api.h"
> #include "ipn3ke_flow.h"
>@@ -2918,8 +2919,11 @@ static uint16_t ipn3ke_rpst_recv_pkts(__rte_unused void *rx_q,
> rpst->switch_domain_id = representor_param->switch_domain_id;
> rpst->port_id = representor_param->port_id;
> rpst->hw = representor_param->hw;
>- rpst->i40e_pf_eth = NULL;
>- rpst->i40e_pf_eth_port_id = 0xFFFF;
>+ rpst->i40e_pf_eth = representor_param->i40e_pf_eth;
>+ rpst->i40e_pf_eth_port_id = representor_param->i40e_pf_eth_port_id;
>+ if (rpst->i40e_pf_eth)
>+ rte_pmd_i40e_set_switch_dev(rpst->i40e_pf_eth_port_id,
>+ rpst->ethdev);
>
> ethdev->data->mac_addrs = rte_zmalloc("ipn3ke", RTE_ETHER_ADDR_LEN, 0);
> if (!ethdev->data->mac_addrs) {
>diff --git a/drivers/net/ipn3ke/meson.build b/drivers/net/ipn3ke/meson.build
>index 74b4d7c..4ea57b9 100644
>--- a/drivers/net/ipn3ke/meson.build
>+++ b/drivers/net/ipn3ke/meson.build
>@@ -14,4 +14,4 @@ sources += files('ipn3ke_ethdev.c',
> 'ipn3ke_representor.c',
> 'ipn3ke_tm.c',
> 'ipn3ke_flow.c')
>-deps += ['bus_ifpga', 'sched']
>+deps += ['bus_ifpga', 'sched', 'pmd_i40e', 'rawdev', 'rawdev_ifpga']
>diff --git a/drivers/raw/ifpga/meson.build b/drivers/raw/ifpga/meson.build
>index 0ab6fd7..dbd74b9 100644
>--- a/drivers/raw/ifpga/meson.build
>+++ b/drivers/raw/ifpga/meson.build
>@@ -8,13 +8,19 @@ objs = [base_objs]
>
> dep = dependency('libfdt', required: false)
> if not dep.found()
>+ dep = cc.find_library('libfdt', required: false)
>+endif
>+if not dep.found()
> build = false
> reason = 'missing dependency, "libfdt"'
> endif
> deps += ['rawdev', 'pci', 'bus_pci', 'kvargs',
> 'bus_vdev', 'bus_ifpga', 'net']
>+ext_deps += dep
>+
> sources = files('ifpga_rawdev.c')
>
> includes += include_directories('base')
>+includes += include_directories('../../net/ipn3ke')
>
> allow_experimental_apis = true
>diff --git a/drivers/raw/ifpga/rte_rawdev_ifpga_version.map b/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
>index 9b9ab1a..acea4d7 100644
>--- a/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
>+++ b/drivers/raw/ifpga/rte_rawdev_ifpga_version.map
>@@ -2,3 +2,9 @@ DPDK_18.05 {
>
> local: *;
> };
>+
>+EXPERIMENTAL {
>+ global:
>+
>+ ifpga_rawdev_get;
>+} DPDK_18.05;
>\ No newline at end of file
>--
>1.8.3.1
>
On Mon, Oct 21, 2019 at 03:23:09PM +0800, Ye Xiaolong wrote:
> +Bruce for the meson change.
>
> Thanks,
> Xiaolong
>
> On 10/21, Andy Pei wrote:
> >From: Rosen Xu <rosen.xu@intel.com>
> >
> >The ipn3ke board FPGA and i40e BDF scan has added in ifpga_rawdev,
> >so it doesn't need to provide configuration for i40e port bonding.
> >
> >Signed-off-by: Rosen Xu <rosen.xu@intel.com>
> >Signed-off-by: Andy Pei <andy.pei@intel.com>
> >---
> > drivers/meson.build | 7 +-
> > drivers/net/ipn3ke/Makefile | 2 +
> > drivers/net/ipn3ke/ipn3ke_ethdev.c | 289 +++----------------------
> > drivers/net/ipn3ke/ipn3ke_representor.c | 8 +-
> > drivers/net/ipn3ke/meson.build | 2 +-
> > drivers/raw/ifpga/meson.build | 6 +
> > drivers/raw/ifpga/rte_rawdev_ifpga_version.map | 6 +
> > 7 files changed, 62 insertions(+), 258 deletions(-)
> >
> >diff --git a/drivers/meson.build b/drivers/meson.build
> >index 2ed2e95..afdbb3b 100644
> >--- a/drivers/meson.build
> >+++ b/drivers/meson.build
> >@@ -9,12 +9,12 @@ endif
> > dpdk_driver_classes = ['common',
> > 'bus',
> > 'mempool', # depends on common and bus.
> >+ 'raw',
> > 'net', # depends on common, bus and mempool.
> > 'crypto', # depends on common, bus and mempool (net in future).
> > 'compress', # depends on common, bus, mempool.
> > 'event', # depends on common, bus, mempool and net.
> >- 'baseband', # depends on common and bus.
> >- 'raw'] # depends on common, bus, mempool, net and event.
> >+ 'baseband']
> >
This needs an explanation in the commit log, and possibly should be a
separate patch. The comment on "net" need to be updated explaining why it
comes after raw.
> > default_cflags = machine_args
> > if cc.has_argument('-Wno-format-truncation')
> >@@ -157,6 +157,9 @@ foreach class:dpdk_driver_classes
> >
> > set_variable('shared_@0@'.format(lib_name), shared_dep)
> > set_variable('static_@0@'.format(lib_name), static_dep)
> >+ dependency_name = ''.join(lib_name.split('rte_'))
> >+ message('drivers/@0@: Defining dependency "@1@"'.format(
> >+ drv_path, dependency_name))
> > endif # build
> > endforeach
> >
This doesn't belong in this patch. It's covered by:
http://patches.dpdk.org/patch/59470/, so feel free to ack that patch
instead.
> >diff --git a/drivers/net/ipn3ke/Makefile b/drivers/net/ipn3ke/Makefile
> >index 8c3ae37..2c65e49 100644
<snip>
> >diff --git a/drivers/net/ipn3ke/meson.build b/drivers/net/ipn3ke/meson.build
> >index 74b4d7c..4ea57b9 100644
> >--- a/drivers/net/ipn3ke/meson.build
> >+++ b/drivers/net/ipn3ke/meson.build
> >@@ -14,4 +14,4 @@ sources += files('ipn3ke_ethdev.c',
> > 'ipn3ke_representor.c',
> > 'ipn3ke_tm.c',
> > 'ipn3ke_flow.c')
> >-deps += ['bus_ifpga', 'sched']
> >+deps += ['bus_ifpga', 'sched', 'pmd_i40e', 'rawdev', 'rawdev_ifpga']
Minor nit: rawdev_ifpga already depends on rawdev and buf_ifpga, so you can
drop them to shorten the list if you like.
deps += ['sched', 'pmd_i40e', 'rawdev_ifpga']
> >diff --git a/drivers/raw/ifpga/meson.build b/drivers/raw/ifpga/meson.build
> >index 0ab6fd7..dbd74b9 100644
> >--- a/drivers/raw/ifpga/meson.build
> >+++ b/drivers/raw/ifpga/meson.build
> >@@ -8,13 +8,19 @@ objs = [base_objs]
> >
> > dep = dependency('libfdt', required: false)
> > if not dep.found()
> >+ dep = cc.find_library('libfdt', required: false)
> >+endif
> >+if not dep.found()
> > build = false
> > reason = 'missing dependency, "libfdt"'
> > endif
> > deps += ['rawdev', 'pci', 'bus_pci', 'kvargs',
> > 'bus_vdev', 'bus_ifpga', 'net']
Similarly, if you want to cut this list down: 'kvargs' is always depended
upon by everything since its a dependency of eal, every rawdev already
depends upon the rawdev library and bus_pci depends upon pci.
deps += ['bus_pci', 'bus_vdev', 'bus_ifpga', 'net']
should work on it's own.
Cutting the dependency list can help speed up configuration a little as fewer
dependency chains need to be iterated.
@@ -9,12 +9,12 @@ endif
dpdk_driver_classes = ['common',
'bus',
'mempool', # depends on common and bus.
+ 'raw',
'net', # depends on common, bus and mempool.
'crypto', # depends on common, bus and mempool (net in future).
'compress', # depends on common, bus, mempool.
'event', # depends on common, bus, mempool and net.
- 'baseband', # depends on common and bus.
- 'raw'] # depends on common, bus, mempool, net and event.
+ 'baseband']
default_cflags = machine_args
if cc.has_argument('-Wno-format-truncation')
@@ -157,6 +157,9 @@ foreach class:dpdk_driver_classes
set_variable('shared_@0@'.format(lib_name), shared_dep)
set_variable('static_@0@'.format(lib_name), static_dep)
+ dependency_name = ''.join(lib_name.split('rte_'))
+ message('drivers/@0@: Defining dependency "@1@"'.format(
+ drv_path, dependency_name))
endif # build
endforeach
@@ -19,6 +19,8 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
CFLAGS += -O3
CFLAGS += $(WERROR_FLAGS)
CFLAGS += -I$(RTE_SDK)/drivers/bus/ifpga
+CFLAGS += -I$(RTE_SDK)/drivers/raw/ifpga
+CFLAGS += -I$(RTE_SDK)/drivers/net/i40e
LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs
LDLIBS += -lrte_bus_ifpga
@@ -19,6 +19,7 @@
#include <rte_bus_ifpga.h>
#include <ifpga_common.h>
#include <ifpga_logs.h>
+#include <ifpga_rawdev.h>
#include "ipn3ke_rawdev_api.h"
#include "ipn3ke_flow.h"
@@ -324,7 +325,8 @@
"LineSideMACType", &mac_type);
hw->retimer.mac_type = (int)mac_type;
- IPN3KE_AFU_PMD_DEBUG("UPL_version is 0x%x\n", IPN3KE_READ_REG(hw, 0));
+ hw->acc_tm = 0;
+ hw->acc_flow = 0;
if (afu_dev->id.uuid.uuid_low == IPN3KE_UUID_VBNG_LOW &&
afu_dev->id.uuid.uuid_high == IPN3KE_UUID_VBNG_HIGH) {
@@ -342,6 +344,12 @@
/* After reset, wait until init done */
if (ipn3ke_vbng_init_done(hw))
return -1;
+
+ hw->acc_tm = 1;
+ hw->acc_flow = 1;
+
+ IPN3KE_AFU_PMD_DEBUG("UPL_version is 0x%x\n",
+ IPN3KE_READ_REG(hw, 0));
}
if (hw->retimer.mac_type == IFPGA_RAWDEV_RETIMER_MAC_TYPE_10GE_XFI) {
@@ -409,9 +417,6 @@
hw->flow_hw_enable = 1;
}
- hw->acc_tm = 0;
- hw->acc_flow = 0;
-
return 0;
}
@@ -462,7 +467,11 @@ static int ipn3ke_vswitch_probe(struct rte_afu_device *afu_dev)
{
char name[RTE_ETH_NAME_MAX_LEN];
struct ipn3ke_hw *hw;
- int i, retval;
+ struct rte_eth_dev *i40e_eth;
+ struct ifpga_rawdev *ifpga_dev;
+ uint16_t port_id;
+ int i, j, retval;
+ char *fvl_bdf;
/* check if the AFU device has been probed already */
/* allocate shared mcp_vswitch structure */
@@ -489,7 +498,12 @@ static int ipn3ke_vswitch_probe(struct rte_afu_device *afu_dev)
if (retval)
return retval;
+ ifpga_dev = ifpga_rawdev_get(hw->rawdev);
+ if (!ifpga_dev)
+ IPN3KE_AFU_PMD_ERR("failed to find ifpga_device.");
+
/* probe representor ports */
+ j = 0;
for (i = 0; i < hw->port_num; i++) {
struct ipn3ke_rpst rpst = {
.port_id = i,
@@ -501,6 +515,22 @@ static int ipn3ke_vswitch_probe(struct rte_afu_device *afu_dev)
snprintf(name, sizeof(name), "net_%s_representor_%d",
afu_dev->device.name, i);
+ for (; j < 8; j++) {
+ fvl_bdf = ifpga_dev->fvl_bdf[j];
+ retval = rte_eth_dev_get_port_by_name(fvl_bdf,
+ &port_id);
+ if (retval) {
+ continue;
+ } else {
+ i40e_eth = &rte_eth_devices[port_id];
+ rpst.i40e_pf_eth = i40e_eth;
+ rpst.i40e_pf_eth_port_id = port_id;
+
+ j++;
+ break;
+ }
+ }
+
retval = rte_eth_dev_create(&afu_dev->device, name,
sizeof(struct ipn3ke_rpst), NULL, NULL,
ipn3ke_rpst_init, &rpst);
@@ -508,6 +538,7 @@ static int ipn3ke_vswitch_probe(struct rte_afu_device *afu_dev)
if (retval)
IPN3KE_AFU_PMD_ERR("failed to create ipn3ke representor %s.",
name);
+
}
return 0;
@@ -553,254 +584,6 @@ static int ipn3ke_vswitch_remove(struct rte_afu_device *afu_dev)
RTE_PMD_REGISTER_AFU(net_ipn3ke_afu, afu_ipn3ke_driver);
-static const char * const valid_args[] = {
-#define IPN3KE_AFU_NAME "afu"
- IPN3KE_AFU_NAME,
-#define IPN3KE_FPGA_ACCELERATION_LIST "fpga_acc"
- IPN3KE_FPGA_ACCELERATION_LIST,
-#define IPN3KE_I40E_PF_LIST "i40e_pf"
- IPN3KE_I40E_PF_LIST,
- NULL
-};
-
-static int
-ipn3ke_cfg_parse_acc_list(const char *afu_name,
- const char *acc_list_name)
-{
- struct rte_afu_device *afu_dev;
- struct ipn3ke_hw *hw;
- const char *p_source;
- char *p_start;
- char name[RTE_ETH_NAME_MAX_LEN];
-
- afu_dev = rte_ifpga_find_afu_by_name(afu_name);
- if (!afu_dev)
- return -1;
- hw = afu_dev->shared.data;
- if (!hw)
- return -1;
-
- p_source = acc_list_name;
- while (*p_source) {
- while ((*p_source == '{') || (*p_source == '|'))
- p_source++;
- p_start = name;
- while ((*p_source != '|') && (*p_source != '}'))
- *p_start++ = *p_source++;
- *p_start = 0;
- if (!strcmp(name, "tm") && hw->tm_hw_enable)
- hw->acc_tm = 1;
-
- if (!strcmp(name, "flow") && hw->flow_hw_enable)
- hw->acc_flow = 1;
-
- if (*p_source == '}')
- return 0;
- }
-
- return 0;
-}
-
-static int
-ipn3ke_cfg_parse_i40e_pf_ethdev(const char *afu_name,
- const char *pf_name)
-{
- struct rte_eth_dev *i40e_eth, *rpst_eth;
- struct rte_afu_device *afu_dev;
- struct ipn3ke_rpst *rpst;
- struct ipn3ke_hw *hw;
- const char *p_source;
- char *p_start;
- char name[RTE_ETH_NAME_MAX_LEN];
- uint16_t port_id;
- int i;
- int ret = -1;
-
- afu_dev = rte_ifpga_find_afu_by_name(afu_name);
- if (!afu_dev)
- return -1;
- hw = afu_dev->shared.data;
- if (!hw)
- return -1;
-
- p_source = pf_name;
- for (i = 0; i < hw->port_num; i++) {
- snprintf(name, sizeof(name), "net_%s_representor_%d",
- afu_name, i);
- ret = rte_eth_dev_get_port_by_name(name, &port_id);
- if (ret)
- return -1;
- rpst_eth = &rte_eth_devices[port_id];
- rpst = IPN3KE_DEV_PRIVATE_TO_RPST(rpst_eth);
-
- while ((*p_source == '{') || (*p_source == '|'))
- p_source++;
- p_start = name;
- while ((*p_source != '|') && (*p_source != '}'))
- *p_start++ = *p_source++;
- *p_start = 0;
-
- ret = rte_eth_dev_get_port_by_name(name, &port_id);
- if (ret)
- return -1;
- i40e_eth = &rte_eth_devices[port_id];
-
- rpst->i40e_pf_eth = i40e_eth;
- rpst->i40e_pf_eth_port_id = port_id;
-
- if ((*p_source == '}') || !(*p_source))
- break;
- }
-
- return 0;
-}
-
-static int
-ipn3ke_cfg_probe(struct rte_vdev_device *dev)
-{
- struct rte_devargs *devargs;
- struct rte_kvargs *kvlist = NULL;
- char *afu_name = NULL;
- char *acc_name = NULL;
- char *pf_name = NULL;
- int afu_name_en = 0;
- int acc_list_en = 0;
- int pf_list_en = 0;
- int ret = -1;
-
- devargs = dev->device.devargs;
-
- kvlist = rte_kvargs_parse(devargs->args, valid_args);
- if (!kvlist) {
- IPN3KE_AFU_PMD_ERR("error when parsing param");
- goto end;
- }
-
- if (rte_kvargs_count(kvlist, IPN3KE_AFU_NAME) == 1) {
- if (rte_kvargs_process(kvlist, IPN3KE_AFU_NAME,
- &rte_ifpga_get_string_arg,
- &afu_name) < 0) {
- IPN3KE_AFU_PMD_ERR("error to parse %s",
- IPN3KE_AFU_NAME);
- goto end;
- } else {
- afu_name_en = 1;
- }
- }
-
- if (rte_kvargs_count(kvlist, IPN3KE_FPGA_ACCELERATION_LIST) == 1) {
- if (rte_kvargs_process(kvlist, IPN3KE_FPGA_ACCELERATION_LIST,
- &rte_ifpga_get_string_arg,
- &acc_name) < 0) {
- IPN3KE_AFU_PMD_ERR("error to parse %s",
- IPN3KE_FPGA_ACCELERATION_LIST);
- goto end;
- } else {
- acc_list_en = 1;
- }
- }
-
- if (rte_kvargs_count(kvlist, IPN3KE_I40E_PF_LIST) == 1) {
- if (rte_kvargs_process(kvlist, IPN3KE_I40E_PF_LIST,
- &rte_ifpga_get_string_arg,
- &pf_name) < 0) {
- IPN3KE_AFU_PMD_ERR("error to parse %s",
- IPN3KE_I40E_PF_LIST);
- goto end;
- } else {
- pf_list_en = 1;
- }
- }
-
- if (!afu_name_en) {
- IPN3KE_AFU_PMD_ERR("arg %s is mandatory for ipn3ke",
- IPN3KE_AFU_NAME);
- goto end;
- }
-
- if (!pf_list_en) {
- IPN3KE_AFU_PMD_ERR("arg %s is mandatory for ipn3ke",
- IPN3KE_I40E_PF_LIST);
- goto end;
- }
-
- if (acc_list_en) {
- ret = ipn3ke_cfg_parse_acc_list(afu_name, acc_name);
- if (ret) {
- IPN3KE_AFU_PMD_ERR("arg %s parse error for ipn3ke",
- IPN3KE_FPGA_ACCELERATION_LIST);
- goto end;
- }
- } else {
- IPN3KE_AFU_PMD_INFO("arg %s is optional for ipn3ke, using i40e acc",
- IPN3KE_FPGA_ACCELERATION_LIST);
- }
-
- ret = ipn3ke_cfg_parse_i40e_pf_ethdev(afu_name, pf_name);
- if (ret)
- goto end;
-end:
- if (kvlist)
- rte_kvargs_free(kvlist);
- if (afu_name)
- free(afu_name);
- if (acc_name)
- free(acc_name);
-
- return ret;
-}
-
-static int
-ipn3ke_cfg_remove(struct rte_vdev_device *dev)
-{
- struct rte_devargs *devargs;
- struct rte_kvargs *kvlist = NULL;
- char *afu_name = NULL;
- struct rte_afu_device *afu_dev;
- int ret = -1;
-
- devargs = dev->device.devargs;
-
- kvlist = rte_kvargs_parse(devargs->args, valid_args);
- if (!kvlist) {
- IPN3KE_AFU_PMD_ERR("error when parsing param");
- goto end;
- }
-
- if (rte_kvargs_count(kvlist, IPN3KE_AFU_NAME) == 1) {
- if (rte_kvargs_process(kvlist, IPN3KE_AFU_NAME,
- &rte_ifpga_get_string_arg,
- &afu_name) < 0) {
- IPN3KE_AFU_PMD_ERR("error to parse %s",
- IPN3KE_AFU_NAME);
- } else {
- afu_dev = rte_ifpga_find_afu_by_name(afu_name);
- if (!afu_dev)
- goto end;
- ret = ipn3ke_vswitch_remove(afu_dev);
- }
- } else {
- IPN3KE_AFU_PMD_ERR("Remove ipn3ke_cfg %p error", dev);
- }
-
-end:
- if (kvlist)
- rte_kvargs_free(kvlist);
-
- return ret;
-}
-
-static struct rte_vdev_driver ipn3ke_cfg_driver = {
- .probe = ipn3ke_cfg_probe,
- .remove = ipn3ke_cfg_remove,
-};
-
-RTE_PMD_REGISTER_VDEV(ipn3ke_cfg, ipn3ke_cfg_driver);
-RTE_PMD_REGISTER_PARAM_STRING(ipn3ke_cfg,
- "afu=<string> "
- "fpga_acc=<string>"
- "i40e_pf=<string>");
-
RTE_INIT(ipn3ke_afu_init_log)
{
ipn3ke_afu_logtype = rte_log_register("pmd.afu.ipn3ke");
@@ -20,6 +20,7 @@
#include <rte_rawdev_pmd.h>
#include <rte_bus_ifpga.h>
#include <ifpga_logs.h>
+#include <rte_pmd_i40e.h>
#include "ipn3ke_rawdev_api.h"
#include "ipn3ke_flow.h"
@@ -2918,8 +2919,11 @@ static uint16_t ipn3ke_rpst_recv_pkts(__rte_unused void *rx_q,
rpst->switch_domain_id = representor_param->switch_domain_id;
rpst->port_id = representor_param->port_id;
rpst->hw = representor_param->hw;
- rpst->i40e_pf_eth = NULL;
- rpst->i40e_pf_eth_port_id = 0xFFFF;
+ rpst->i40e_pf_eth = representor_param->i40e_pf_eth;
+ rpst->i40e_pf_eth_port_id = representor_param->i40e_pf_eth_port_id;
+ if (rpst->i40e_pf_eth)
+ rte_pmd_i40e_set_switch_dev(rpst->i40e_pf_eth_port_id,
+ rpst->ethdev);
ethdev->data->mac_addrs = rte_zmalloc("ipn3ke", RTE_ETHER_ADDR_LEN, 0);
if (!ethdev->data->mac_addrs) {
@@ -14,4 +14,4 @@ sources += files('ipn3ke_ethdev.c',
'ipn3ke_representor.c',
'ipn3ke_tm.c',
'ipn3ke_flow.c')
-deps += ['bus_ifpga', 'sched']
+deps += ['bus_ifpga', 'sched', 'pmd_i40e', 'rawdev', 'rawdev_ifpga']
@@ -8,13 +8,19 @@ objs = [base_objs]
dep = dependency('libfdt', required: false)
if not dep.found()
+ dep = cc.find_library('libfdt', required: false)
+endif
+if not dep.found()
build = false
reason = 'missing dependency, "libfdt"'
endif
deps += ['rawdev', 'pci', 'bus_pci', 'kvargs',
'bus_vdev', 'bus_ifpga', 'net']
+ext_deps += dep
+
sources = files('ifpga_rawdev.c')
includes += include_directories('base')
+includes += include_directories('../../net/ipn3ke')
allow_experimental_apis = true
@@ -2,3 +2,9 @@ DPDK_18.05 {
local: *;
};
+
+EXPERIMENTAL {
+ global:
+
+ ifpga_rawdev_get;
+} DPDK_18.05;
\ No newline at end of file