net/ipn3ke: remove configuration for i40e port bonding
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>
This commit is contained in:
parent
9c006c45d0
commit
8418c92811
@ -19,6 +19,7 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API
|
||||
CFLAGS += -O3
|
||||
CFLAGS += $(WERROR_FLAGS)
|
||||
CFLAGS += -I$(RTE_SDK)/drivers/bus/ifpga
|
||||
CFLAGS += -I$(RTE_SDK)/drivers/raw/ifpga
|
||||
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"
|
||||
@ -35,6 +36,8 @@ static const struct rte_afu_uuid afu_uuid_ipn3ke_map[] = {
|
||||
{ 0, 0 /* sentinel */ },
|
||||
};
|
||||
|
||||
struct ipn3ke_pub_func ipn3ke_bridge_func;
|
||||
|
||||
static int
|
||||
ipn3ke_indirect_read(struct ipn3ke_hw *hw, uint32_t *rd_data,
|
||||
uint32_t addr, uint32_t dev_sel, uint32_t eth_group_sel)
|
||||
@ -324,7 +327,8 @@ ipn3ke_hw_init(struct rte_afu_device *afu_dev,
|
||||
"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 +346,12 @@ ipn3ke_hw_init(struct rte_afu_device *afu_dev,
|
||||
/* 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 +419,6 @@ ipn3ke_hw_init(struct rte_afu_device *afu_dev,
|
||||
hw->flow_hw_enable = 1;
|
||||
}
|
||||
|
||||
hw->acc_tm = 0;
|
||||
hw->acc_flow = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -462,7 +469,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 +500,14 @@ static int ipn3ke_vswitch_probe(struct rte_afu_device *afu_dev)
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
if (ipn3ke_bridge_func.get_ifpga_rawdev == NULL)
|
||||
return -ENOMEM;
|
||||
ifpga_dev = ipn3ke_bridge_func.get_ifpga_rawdev(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 +519,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 +542,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,253 +588,6 @@ static struct rte_afu_driver afu_ipn3ke_driver = {
|
||||
|
||||
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);
|
||||
|
||||
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");
|
||||
|
@ -18,6 +18,12 @@
|
||||
#include <rte_malloc.h>
|
||||
#include <rte_eth_ctrl.h>
|
||||
#include <rte_tailq.h>
|
||||
#include <rte_rawdev.h>
|
||||
#include <rte_rawdev_pmd.h>
|
||||
#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"
|
||||
|
@ -59,4 +59,16 @@ struct ifpga_rawdevg_link_info {
|
||||
enum ifpga_rawdev_link_speed link_speed;
|
||||
};
|
||||
|
||||
struct ipn3ke_pub_func {
|
||||
struct ifpga_rawdev *(*get_ifpga_rawdev)(const struct rte_rawdev *rdv);
|
||||
int (*set_i40e_sw_dev)(uint16_t port_id, struct rte_eth_dev *sw_dev);
|
||||
};
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* The publid functions of bridge PAC N3000 FPGA and I40e.
|
||||
*/
|
||||
extern struct ipn3ke_pub_func ipn3ke_bridge_func;
|
||||
|
||||
|
||||
#endif /* _IFPGA_RAWDEV_H_ */
|
||||
|
@ -2914,12 +2914,18 @@ ipn3ke_rpst_init(struct rte_eth_dev *ethdev, void *init_params)
|
||||
if (representor_param->port_id >= representor_param->hw->port_num)
|
||||
return -ENODEV;
|
||||
|
||||
if (ipn3ke_bridge_func.set_i40e_sw_dev == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
rpst->ethdev = ethdev;
|
||||
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)
|
||||
ipn3ke_bridge_func.set_i40e_sw_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) {
|
||||
|
@ -2,3 +2,9 @@ DPDK_19.05 {
|
||||
|
||||
local: *;
|
||||
};
|
||||
|
||||
EXPERIMENTAL {
|
||||
global:
|
||||
|
||||
ipn3ke_bridge_func;
|
||||
} DPDK_19.05;
|
||||
|
@ -13,6 +13,7 @@ CFLAGS += -O3
|
||||
CFLAGS += $(WERROR_FLAGS)
|
||||
CFLAGS += -I$(RTE_SDK)/drivers/bus/ifpga
|
||||
CFLAGS += -I$(RTE_SDK)/drivers/raw/ifpga_rawdev
|
||||
CFLAGS += -I$(RTE_SDK)/drivers/net/i40e
|
||||
CFLAGS += -I$(RTE_SDK)/drivers/net/ipn3ke
|
||||
LDLIBS += -lrte_eal
|
||||
LDLIBS += -lrte_rawdev
|
||||
@ -20,6 +21,10 @@ LDLIBS += -lrte_bus_vdev
|
||||
LDLIBS += -lrte_kvargs
|
||||
LDLIBS += -lrte_bus_pci
|
||||
LDLIBS += -lrte_bus_ifpga
|
||||
LDLIBS += -lpthread
|
||||
LDLIBS += -lfdt
|
||||
LDLIBS += -lrte_pmd_i40e
|
||||
LDLIBS += -lrte_pmd_ipn3ke
|
||||
|
||||
EXPORT_MAP := rte_rawdev_ifpga_version.map
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <rte_common.h>
|
||||
#include <rte_bus_vdev.h>
|
||||
#include <rte_string_fns.h>
|
||||
#include <rte_pmd_i40e.h>
|
||||
|
||||
#include "base/opae_hw_api.h"
|
||||
#include "base/opae_ifpga_hw_api.h"
|
||||
@ -1364,6 +1365,9 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ipn3ke_bridge_func.get_ifpga_rawdev = ifpga_rawdev_get;
|
||||
ipn3ke_bridge_func.set_i40e_sw_dev = rte_pmd_i40e_set_switch_dev;
|
||||
|
||||
dev = ifpga_rawdev_allocate(rawdev);
|
||||
if (dev == NULL) {
|
||||
IFPGA_RAWDEV_PMD_ERR("Unable to allocate ifpga_rawdevice");
|
||||
|
@ -16,14 +16,15 @@ if build
|
||||
subdir('base')
|
||||
objs = [base_objs]
|
||||
|
||||
deps += ['rawdev', 'pci', 'bus_pci', 'kvargs',
|
||||
'bus_vdev', 'bus_ifpga', 'net']
|
||||
deps += ['ethdev', 'rawdev', 'pci', 'bus_pci', 'kvargs',
|
||||
'bus_vdev', 'bus_ifpga', 'net', 'i40e', 'ipn3ke']
|
||||
ext_deps += dep
|
||||
|
||||
sources = files('ifpga_rawdev.c')
|
||||
|
||||
includes += include_directories('base')
|
||||
includes += include_directories('../../net/ipn3ke')
|
||||
includes += include_directories('../../net/i40e')
|
||||
|
||||
allow_experimental_apis = true
|
||||
endif
|
||||
|
Loading…
Reference in New Issue
Block a user