From patchwork Tue Sep 1 11:50:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiawen Wu X-Patchwork-Id: 76205 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9AADBA04AC; Tue, 1 Sep 2020 13:51:21 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 80C561C05C; Tue, 1 Sep 2020 13:51:13 +0200 (CEST) Received: from smtpproxy21.qq.com (smtpbg704.qq.com [203.205.195.105]) by dpdk.org (Postfix) with ESMTP id 84A431DBD for ; Tue, 1 Sep 2020 13:51:10 +0200 (CEST) X-QQ-mid: bizesmtp5t1598961063toji6xgk0 Received: from localhost.localdomain.com (unknown [183.129.236.74]) by esmtp6.qq.com (ESMTP) with id ; Tue, 01 Sep 2020 19:51:03 +0800 (CST) X-QQ-SSF: 01400000000000B0C000000A0000000 X-QQ-FEAT: FTF3ZRDyHF/UfbttL4jYhUjscQvhl+u7dN5/9ArVlLQa3OKT9KfcHnqrRWcBh LiBod2WjnYRj2CHRpnM9lXNjupkMAOYvBZftoRGhM0M3ahXUz43xGYdDQl2mcs0nvoDhOu/ hY4fjtm9WWdd8BTnAtNu0RtqjjPe1OPSZb3eMsXzFfW63Wox42z2dQ3086yWa0mYAEj/0mQ +eaenMi6ZLpJjHZ5swATUXjsVpDAkdppIy89FyutnjKlESY1XYJTGJjVG6pjqD+eqy5arxw LxB0ca87patIUrijyGXSwUb6XVl8DosIVqlkBEwo5az7kAukXpQS8GWEiBN9znmVMjQ5fcd TaURvIczLU/RLG590uR9JX3FhaT0w== X-QQ-GoodBg: 2 From: Jiawen Wu To: dev@dpdk.org Cc: Jiawen Wu Date: Tue, 1 Sep 2020 19:50:33 +0800 Message-Id: <20200901115113.1529675-2-jiawenwu@trustnetic.com> X-Mailer: git-send-email 2.18.4 In-Reply-To: <20200901115113.1529675-1-jiawenwu@trustnetic.com> References: <20200901115113.1529675-1-jiawenwu@trustnetic.com> X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:trustnetic.com:qybgforeign:qybgforeign5 X-QQ-Bgrelay: 1 Subject: [dpdk-dev] [PATCH v1 02/42] net/txgbe: add ethdev probe and remove 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" add basic PCIe ethdev probe and remove. Signed-off-by: Jiawen Wu --- drivers/net/txgbe/base/meson.build | 21 +++ drivers/net/txgbe/base/txgbe.h | 10 ++ drivers/net/txgbe/base/txgbe_devids.h | 40 ++++++ drivers/net/txgbe/base/txgbe_type.h | 14 ++ drivers/net/txgbe/meson.build | 5 + drivers/net/txgbe/txgbe_ethdev.c | 161 +++++++++++++++++++++++ drivers/net/txgbe/txgbe_ethdev.h | 37 ++++++ drivers/net/txgbe/txgbe_logs.h | 123 +++++++++++++++++ drivers/net/txgbe/txgbe_vf_representor.c | 27 ++++ 9 files changed, 438 insertions(+) create mode 100644 drivers/net/txgbe/base/meson.build create mode 100644 drivers/net/txgbe/base/txgbe.h create mode 100644 drivers/net/txgbe/base/txgbe_devids.h create mode 100644 drivers/net/txgbe/base/txgbe_type.h create mode 100644 drivers/net/txgbe/txgbe_logs.h create mode 100644 drivers/net/txgbe/txgbe_vf_representor.c diff --git a/drivers/net/txgbe/base/meson.build b/drivers/net/txgbe/base/meson.build new file mode 100644 index 000000000..8cc8395d1 --- /dev/null +++ b/drivers/net/txgbe/base/meson.build @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2015-2020 + +sources = [ + +] + +error_cflags = ['-Wno-unused-value', + '-Wno-unused-parameter', + '-Wno-unused-but-set-variable'] +c_args = cflags +foreach flag: error_cflags + if cc.has_argument(flag) + c_args += flag + endif +endforeach + +base_lib = static_library('txgbe_base', sources, + dependencies: static_rte_eal, + c_args: c_args) +base_objs = base_lib.extract_all_objects() diff --git a/drivers/net/txgbe/base/txgbe.h b/drivers/net/txgbe/base/txgbe.h new file mode 100644 index 000000000..9aee9738a --- /dev/null +++ b/drivers/net/txgbe/base/txgbe.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2015-2020 + */ + +#ifndef _TXGBE_H_ +#define _TXGBE_H_ + +#include "txgbe_type.h" + +#endif /* _TXGBE_H_ */ diff --git a/drivers/net/txgbe/base/txgbe_devids.h b/drivers/net/txgbe/base/txgbe_devids.h new file mode 100644 index 000000000..744f2f3b5 --- /dev/null +++ b/drivers/net/txgbe/base/txgbe_devids.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2015-2020 + */ + +#ifndef _TXGBE_DEVIDS_H_ +#define _TXGBE_DEVIDS_H_ + +/* + * Vendor ID + */ +#ifndef PCI_VENDOR_ID_WANGXUN +#define PCI_VENDOR_ID_WANGXUN 0x8088 +#endif + +/* + * Device IDs + */ +#define TXGBE_DEV_ID_RAPTOR_VF 0x1000 +#define TXGBE_DEV_ID_RAPTOR_SFP 0x1001 /* fiber */ +#define TXGBE_DEV_ID_RAPTOR_KR_KX_KX4 0x1002 /* backplane */ +#define TXGBE_DEV_ID_RAPTOR_XAUI 0x1003 /* copper */ +#define TXGBE_DEV_ID_RAPTOR_SGMII 0x1004 /* copper */ +#define TXGBE_DEV_ID_RAPTOR_QSFP 0x1011 /* fiber */ +#define TXGBE_DEV_ID_RAPTOR_VF_HV 0x2000 +#define TXGBE_DEV_ID_RAPTOR_T3_LOM 0x2001 + +#define TXGBE_DEV_ID_WX1820_SFP 0x2001 + +/* + * Subdevice IDs + */ +#define TXGBE_SUBDEV_ID_RAPTOR 0x0000 +#define TXGBE_SUBDEV_ID_MPW 0x0001 + +#define TXGBE_ETHERTYPE_FLOW_CTRL 0x8808 +#define TXGBE_ETHERTYPE_IEEE_VLAN 0x8100 /* 802.1q protocol */ + +#define TXGBE_VXLAN_PORT 4789 + +#endif /* _TXGBE_DEVIDS_H_ */ diff --git a/drivers/net/txgbe/base/txgbe_type.h b/drivers/net/txgbe/base/txgbe_type.h new file mode 100644 index 000000000..8ed324a1b --- /dev/null +++ b/drivers/net/txgbe/base/txgbe_type.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2015-2020 + */ + +#ifndef _TXGBE_TYPE_H_ +#define _TXGBE_TYPE_H_ + +#include "txgbe_devids.h" + +struct txgbe_hw { + void *back; +}; + +#endif /* _TXGBE_TYPE_H_ */ diff --git a/drivers/net/txgbe/meson.build b/drivers/net/txgbe/meson.build index 605fcba78..f45b04b1c 100644 --- a/drivers/net/txgbe/meson.build +++ b/drivers/net/txgbe/meson.build @@ -3,7 +3,12 @@ cflags += ['-DRTE_LIBRTE_TXGBE_BYPASS'] +subdir('base') +objs = [base_objs] + sources = files( 'txgbe_ethdev.c', + 'txgbe_vf_representor.c', ) +includes += include_directories('base') diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c index cb758762d..86d2b9064 100644 --- a/drivers/net/txgbe/txgbe_ethdev.c +++ b/drivers/net/txgbe/txgbe_ethdev.c @@ -2,3 +2,164 @@ * Copyright(c) 2015-2020 */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "txgbe_logs.h" +#include "base/txgbe.h" +#include "txgbe_ethdev.h" + +/* + * The set of PCI devices this driver supports + */ +static const struct rte_pci_id pci_id_txgbe_map[] = { + { RTE_PCI_DEVICE(PCI_VENDOR_ID_WANGXUN, TXGBE_DEV_ID_RAPTOR_SFP) }, + { RTE_PCI_DEVICE(PCI_VENDOR_ID_WANGXUN, TXGBE_DEV_ID_WX1820_SFP) }, + { .vendor_id = 0, /* sentinel */ }, +}; + +static int +eth_txgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused) +{ + + RTE_SET_USED(eth_dev); + + return 0; +} + +static int +eth_txgbe_dev_uninit(struct rte_eth_dev *eth_dev) +{ + + RTE_SET_USED(eth_dev); + + return 0; +} + +static int +eth_txgbe_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, + struct rte_pci_device *pci_dev) +{ + char name[RTE_ETH_NAME_MAX_LEN]; + struct rte_eth_dev *pf_ethdev; + struct rte_eth_devargs eth_da; + int i, retval; + + if (pci_dev->device.devargs) { + retval = rte_eth_devargs_parse(pci_dev->device.devargs->args, + ð_da); + if (retval) + return retval; + } else + memset(ð_da, 0, sizeof(eth_da)); + + retval = rte_eth_dev_create(&pci_dev->device, pci_dev->device.name, + sizeof(struct txgbe_adapter), + eth_dev_pci_specific_init, pci_dev, + eth_txgbe_dev_init, NULL); + + if (retval || eth_da.nb_representor_ports < 1) + return retval; + + pf_ethdev = rte_eth_dev_allocated(pci_dev->device.name); + if (pf_ethdev == NULL) + return -ENODEV; + + /* probe VF representor ports */ + for (i = 0; i < eth_da.nb_representor_ports; i++) { + struct txgbe_vf_info *vfinfo; + struct txgbe_vf_representor representor; + + vfinfo = *TXGBE_DEV_VFDATA(pf_ethdev); + if (vfinfo == NULL) { + PMD_DRV_LOG(ERR, + "no virtual functions supported by PF"); + break; + } + + representor.vf_id = eth_da.representor_ports[i]; + representor.switch_domain_id = vfinfo->switch_domain_id; + representor.pf_ethdev = pf_ethdev; + + /* representor port net_bdf_port */ + snprintf(name, sizeof(name), "net_%s_representor_%d", + pci_dev->device.name, + eth_da.representor_ports[i]); + + retval = rte_eth_dev_create(&pci_dev->device, name, + sizeof(struct txgbe_vf_representor), NULL, NULL, + txgbe_vf_representor_init, &representor); + + if (retval) + PMD_DRV_LOG(ERR, "failed to create txgbe vf " + "representor %s.", name); + } + + return 0; +} + +static int eth_txgbe_pci_remove(struct rte_pci_device *pci_dev) +{ + struct rte_eth_dev *ethdev; + + ethdev = rte_eth_dev_allocated(pci_dev->device.name); + if (!ethdev) + return -ENODEV; + + if (ethdev->data->dev_flags & RTE_ETH_DEV_REPRESENTOR) + return rte_eth_dev_destroy(ethdev, txgbe_vf_representor_uninit); + else + return rte_eth_dev_destroy(ethdev, eth_txgbe_dev_uninit); +} + +static struct rte_pci_driver rte_txgbe_pmd = { + .id_table = pci_id_txgbe_map, + .drv_flags = RTE_PCI_DRV_NEED_MAPPING | + RTE_PCI_DRV_INTR_LSC, + .probe = eth_txgbe_pci_probe, + .remove = eth_txgbe_pci_remove, +}; + + +RTE_PMD_REGISTER_PCI(net_txgbe, rte_txgbe_pmd); +RTE_PMD_REGISTER_PCI_TABLE(net_txgbe, pci_id_txgbe_map); +RTE_PMD_REGISTER_KMOD_DEP(net_txgbe, "* igb_uio | uio_pci_generic | vfio-pci"); + +RTE_LOG_REGISTER(txgbe_logtype_init, pmd.net.txgbe.init, NOTICE); +RTE_LOG_REGISTER(txgbe_logtype_driver, pmd.net.txgbe.driver, NOTICE); + +#ifdef RTE_LIBRTE_TXGBE_DEBUG_RX + RTE_LOG_REGISTER(txgbe_logtype_rx, pmd.net.txgbe.rx, DEBUG); +#endif +#ifdef RTE_LIBRTE_TXGBE_DEBUG_TX + RTE_LOG_REGISTER(txgbe_logtype_tx, pmd.net.txgbe.tx, DEBUG); +#endif + +#ifdef RTE_LIBRTE_TXGBE_DEBUG_TX_FREE + RTE_LOG_REGISTER(txgbe_logtype_tx_free, pmd.net.txgbe.tx_free, DEBUG); +#endif diff --git a/drivers/net/txgbe/txgbe_ethdev.h b/drivers/net/txgbe/txgbe_ethdev.h index cb758762d..8dbc4a64a 100644 --- a/drivers/net/txgbe/txgbe_ethdev.h +++ b/drivers/net/txgbe/txgbe_ethdev.h @@ -2,3 +2,40 @@ * Copyright(c) 2015-2020 */ +#ifndef _TXGBE_ETHDEV_H_ +#define _TXGBE_ETHDEV_H_ + +#include + +#include "base/txgbe.h" +#include +#include +#include + + +struct txgbe_vf_info { + uint8_t api_version; + uint16_t switch_domain_id; +}; + +/* + * Structure to store private data for each driver instance (for each port). + */ +struct txgbe_adapter { + struct txgbe_hw hw; + struct txgbe_vf_info *vfdata; +}; + +struct txgbe_vf_representor { + uint16_t vf_id; + uint16_t switch_domain_id; + struct rte_eth_dev *pf_ethdev; +}; + +int txgbe_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params); +int txgbe_vf_representor_uninit(struct rte_eth_dev *ethdev); + +#define TXGBE_DEV_VFDATA(dev) \ + (&((struct txgbe_adapter *)(dev)->data->dev_private)->vfdata) + +#endif /* _TXGBE_ETHDEV_H_ */ diff --git a/drivers/net/txgbe/txgbe_logs.h b/drivers/net/txgbe/txgbe_logs.h new file mode 100644 index 000000000..ba17a128a --- /dev/null +++ b/drivers/net/txgbe/txgbe_logs.h @@ -0,0 +1,123 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2015-2020 + */ + +#ifndef _TXGBE_LOGS_H_ +#define _TXGBE_LOGS_H_ + +/* + * PMD_USER_LOG: for user + */ +extern int txgbe_logtype_init; +#define PMD_INIT_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, txgbe_logtype_init, \ + "%s(): " fmt "\n", __func__, ##args) + +extern int txgbe_logtype_driver; +#define PMD_DRV_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, txgbe_logtype_driver, \ + "%s(): " fmt "\n", __func__, ##args) + +#ifdef RTE_LIBRTE_TXGBE_DEBUG_RX +extern int txgbe_logtype_rx; +#define PMD_RX_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, txgbe_logtype_rx, \ + "%s(): " fmt "\n", __func__, ##args) +#else +#define PMD_RX_LOG(level, fmt, args...) do { } while (0) +#endif + +#ifdef RTE_LIBRTE_TXGBE_DEBUG_TX +extern int txgbe_logtype_tx; +#define PMD_TX_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, txgbe_logtype_tx, \ + "%s(): " fmt "\n", __func__, ##args) +#else +#define PMD_TX_LOG(level, fmt, args...) do { } while (0) +#endif + +#ifdef RTE_LIBRTE_TXGBE_DEBUG_TX_FREE +extern int txgbe_logtype_tx_free; +#define PMD_TX_FREE_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, txgbe_logtype_tx_free, \ + "%s(): " fmt "\n", __func__, ##args) +#else +#define PMD_TX_FREE_LOG(level, fmt, args...) do { } while (0) +#endif + +#ifdef RTE_LIBRTE_TXGBE_DEBUG_INIT +#define PMD_TLOG_INIT(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, txgbe_logtype_init, \ + "%s(): " fmt, __func__, ##args) +#else +#define PMD_TLOG_INIT(level, fmt, args...) do { } while (0) +#endif + +#ifdef RTE_LIBRTE_TXGBE_DEBUG_DRIVER +#define PMD_TLOG_DRIVER(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, txgbe_logtype_driver, \ + "%s(): " fmt, __func__, ##args) +#else +#define PMD_TLOG_DRIVER(level, fmt, args...) do { } while (0) +#endif + +/* + * PMD_DEBUG_LOG: for debugger + */ +#define TLOG_EMERG(fmt, args...) PMD_TLOG_DRIVER(EMERG, fmt, ##args) +#define TLOG_ALERT(fmt, args...) PMD_TLOG_DRIVER(ALERT, fmt, ##args) +#define TLOG_CRIT(fmt, args...) PMD_TLOG_DRIVER(CRIT, fmt, ##args) +#define TLOG_ERR(fmt, args...) PMD_TLOG_DRIVER(ERR, fmt, ##args) +#define TLOG_WARN(fmt, args...) PMD_TLOG_DRIVER(WARNING, fmt, ##args) +#define TLOG_NOTICE(fmt, args...) PMD_TLOG_DRIVER(NOTICE, fmt, ##args) +#define TLOG_INFO(fmt, args...) PMD_TLOG_DRIVER(INFO, fmt, ##args) +#define TLOG_DEBUG(fmt, args...) PMD_TLOG_DRIVER(DEBUG, fmt, ##args) + +/* to be deleted */ +#define DEBUGOUT(fmt, args...) TLOG_DEBUG(fmt, ##args) +#define PMD_INIT_FUNC_TRACE() TLOG_DEBUG(" >>") +#define DEBUGFUNC(fmt) TLOG_DEBUG(fmt) + +/* + * PMD_TEMP_LOG: for tester + */ +#ifdef RTE_LIBRTE_TXGBE_DEBUG +#define wjmsg_line(fmt, ...) \ + do { \ + RTE_LOG(CRIT, PMD, "%s(%d): " fmt, \ + __FUNCTION__, __LINE__, ## __VA_ARGS__); \ + } while (0) +#define wjmsg_stack(fmt, ...) \ + do { \ + wjmsg_line(fmt, ## __VA_ARGS__); \ + rte_dump_stack(); \ + } while (0) +#define wjmsg wjmsg_line + +#define wjdump(mb) { \ + int j; char buf[128] = ""; \ + wjmsg("data_len=%d pkt_len=%d vlan_tci=%d " \ + "packet_type=0x%08x ol_flags=0x%016lx " \ + "hash.rss=0x%08x hash.fdir.hash=0x%04x hash.fdir.id=%d\n", \ + mb->data_len, mb->pkt_len, mb->vlan_tci, \ + mb->packet_type, mb->ol_flags, \ + mb->hash.rss, mb->hash.fdir.hash, mb->hash.fdir.id); \ + for (j = 0; j < mb->data_len; j++) { \ + sprintf(buf + strlen(buf), "%02x ", \ + ((uint8_t *)(mb->buf_addr) + mb->data_off)[j]); \ + if (j % 8 == 7) {\ + wjmsg("%s\n", buf); \ + buf[0] = '\0'; \ + } \ + } \ + wjmsg("%s\n", buf); \ +} +#else /* RTE_LIBRTE_TXGBE_DEBUG */ +#define wjmsg_line(fmt, args...) do {} while (0) +#define wjmsg_limit(fmt, args...) do {} while (0) +#define wjmsg_stack(fmt, args...) do {} while (0) +#define wjmsg(fmt, args...) do {} while (0) +#define wjdump(fmt, args...) do {} while (0) +#endif /* RTE_LIBRTE_TXGBE_DEBUG */ + +#endif /* _TXGBE_LOGS_H_ */ diff --git a/drivers/net/txgbe/txgbe_vf_representor.c b/drivers/net/txgbe/txgbe_vf_representor.c new file mode 100644 index 000000000..df9ae8cc7 --- /dev/null +++ b/drivers/net/txgbe/txgbe_vf_representor.c @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2015-2020 + */ + +#include +#include +#include + +#include "txgbe_ethdev.h" + +int +txgbe_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params) +{ + + RTE_SET_USED(ethdev); + RTE_SET_USED(init_params); + + return 0; +} + +int +txgbe_vf_representor_uninit(struct rte_eth_dev *ethdev) +{ + RTE_SET_USED(ethdev); + + return 0; +} \ No newline at end of file