net/cxgbe: add skeleton VF driver
Add minimal VF driver. Declare functions common to both PF and VF functionality in separate header file and import the header file. Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com> Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
This commit is contained in:
parent
50da8b0de8
commit
011ebc236d
28
doc/guides/nics/features/cxgbevf.ini
Normal file
28
doc/guides/nics/features/cxgbevf.ini
Normal file
@ -0,0 +1,28 @@
|
||||
;
|
||||
; Supported features of the 'cxgbevf' network poll mode driver.
|
||||
;
|
||||
; Refer to default.ini for the full list of available PMD features.
|
||||
;
|
||||
[Features]
|
||||
Speed capabilities = Y
|
||||
Link status = Y
|
||||
Queue start/stop = Y
|
||||
MTU update = Y
|
||||
Jumbo frame = Y
|
||||
Scattered Rx = Y
|
||||
TSO = Y
|
||||
Promiscuous mode = Y
|
||||
Allmulticast mode = Y
|
||||
RSS hash = Y
|
||||
CRC offload = Y
|
||||
VLAN offload = Y
|
||||
L3 checksum offload = Y
|
||||
L4 checksum offload = Y
|
||||
Packet type parsing = Y
|
||||
Basic stats = Y
|
||||
Stats per queue = Y
|
||||
Multiprocess aware = Y
|
||||
Linux UIO = Y
|
||||
Linux VFIO = Y
|
||||
x86-32 = Y
|
||||
x86-64 = Y
|
@ -45,6 +45,11 @@ New Features
|
||||
|
||||
Support to update RSS hash and key has been added to CXGBE PMD.
|
||||
|
||||
* **Added CXGBE VF PMD.**
|
||||
|
||||
CXGBE VF Poll Mode Driver has been added to run DPDK over Chelsio
|
||||
T5/T6 NIC VF instances.
|
||||
|
||||
* **Updated Solarflare network PMD.**
|
||||
|
||||
Updated the sfc_efx driver including the following changes:
|
||||
|
@ -80,6 +80,7 @@ VPATH += $(SRCDIR)/base
|
||||
# all source are stored in SRCS-y
|
||||
#
|
||||
SRCS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += cxgbe_ethdev.c
|
||||
SRCS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += cxgbevf_ethdev.c
|
||||
SRCS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += cxgbe_main.c
|
||||
SRCS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += sge.c
|
||||
SRCS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += t4_hw.c
|
||||
|
@ -63,6 +63,7 @@
|
||||
#include <rte_dev.h>
|
||||
|
||||
#include "cxgbe.h"
|
||||
#include "cxgbe_pfvf.h"
|
||||
|
||||
/*
|
||||
* Macros needed to support the PCI Device ID Table ...
|
||||
@ -135,8 +136,8 @@ static uint16_t cxgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
|
||||
return work_done;
|
||||
}
|
||||
|
||||
static void cxgbe_dev_info_get(struct rte_eth_dev *eth_dev,
|
||||
struct rte_eth_dev_info *device_info)
|
||||
void cxgbe_dev_info_get(struct rte_eth_dev *eth_dev,
|
||||
struct rte_eth_dev_info *device_info)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -179,7 +180,7 @@ static void cxgbe_dev_info_get(struct rte_eth_dev *eth_dev,
|
||||
cxgbe_get_speed_caps(pi, &device_info->speed_capa);
|
||||
}
|
||||
|
||||
static void cxgbe_dev_promiscuous_enable(struct rte_eth_dev *eth_dev)
|
||||
void cxgbe_dev_promiscuous_enable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -188,7 +189,7 @@ static void cxgbe_dev_promiscuous_enable(struct rte_eth_dev *eth_dev)
|
||||
1, -1, 1, -1, false);
|
||||
}
|
||||
|
||||
static void cxgbe_dev_promiscuous_disable(struct rte_eth_dev *eth_dev)
|
||||
void cxgbe_dev_promiscuous_disable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -197,7 +198,7 @@ static void cxgbe_dev_promiscuous_disable(struct rte_eth_dev *eth_dev)
|
||||
0, -1, 1, -1, false);
|
||||
}
|
||||
|
||||
static void cxgbe_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
void cxgbe_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -208,7 +209,7 @@ static void cxgbe_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
|
||||
-1, 1, 1, -1, false);
|
||||
}
|
||||
|
||||
static void cxgbe_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
void cxgbe_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -219,8 +220,8 @@ static void cxgbe_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
|
||||
-1, 0, 1, -1, false);
|
||||
}
|
||||
|
||||
static int cxgbe_dev_link_update(struct rte_eth_dev *eth_dev,
|
||||
__rte_unused int wait_to_complete)
|
||||
int cxgbe_dev_link_update(struct rte_eth_dev *eth_dev,
|
||||
__rte_unused int wait_to_complete)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -240,7 +241,7 @@ static int cxgbe_dev_link_update(struct rte_eth_dev *eth_dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cxgbe_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
|
||||
int cxgbe_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -268,17 +269,10 @@ static int cxgbe_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int cxgbe_dev_tx_queue_start(struct rte_eth_dev *eth_dev,
|
||||
uint16_t tx_queue_id);
|
||||
static int cxgbe_dev_rx_queue_start(struct rte_eth_dev *eth_dev,
|
||||
uint16_t tx_queue_id);
|
||||
static void cxgbe_dev_tx_queue_release(void *q);
|
||||
static void cxgbe_dev_rx_queue_release(void *q);
|
||||
|
||||
/*
|
||||
* Stop device.
|
||||
*/
|
||||
static void cxgbe_dev_close(struct rte_eth_dev *eth_dev)
|
||||
void cxgbe_dev_close(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -317,7 +311,7 @@ static void cxgbe_dev_close(struct rte_eth_dev *eth_dev)
|
||||
/* Start the device.
|
||||
* It returns 0 on success.
|
||||
*/
|
||||
static int cxgbe_dev_start(struct rte_eth_dev *eth_dev)
|
||||
int cxgbe_dev_start(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -369,7 +363,7 @@ static int cxgbe_dev_start(struct rte_eth_dev *eth_dev)
|
||||
/*
|
||||
* Stop device: disable rx and tx functions to allow for reconfiguring.
|
||||
*/
|
||||
static void cxgbe_dev_stop(struct rte_eth_dev *eth_dev)
|
||||
void cxgbe_dev_stop(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -388,7 +382,7 @@ static void cxgbe_dev_stop(struct rte_eth_dev *eth_dev)
|
||||
t4_sge_eth_clear_queues(pi);
|
||||
}
|
||||
|
||||
static int cxgbe_dev_configure(struct rte_eth_dev *eth_dev)
|
||||
int cxgbe_dev_configure(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -410,8 +404,7 @@ static int cxgbe_dev_configure(struct rte_eth_dev *eth_dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cxgbe_dev_tx_queue_start(struct rte_eth_dev *eth_dev,
|
||||
uint16_t tx_queue_id)
|
||||
int cxgbe_dev_tx_queue_start(struct rte_eth_dev *eth_dev, uint16_t tx_queue_id)
|
||||
{
|
||||
int ret;
|
||||
struct sge_eth_txq *txq = (struct sge_eth_txq *)
|
||||
@ -426,8 +419,7 @@ static int cxgbe_dev_tx_queue_start(struct rte_eth_dev *eth_dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cxgbe_dev_tx_queue_stop(struct rte_eth_dev *eth_dev,
|
||||
uint16_t tx_queue_id)
|
||||
int cxgbe_dev_tx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t tx_queue_id)
|
||||
{
|
||||
int ret;
|
||||
struct sge_eth_txq *txq = (struct sge_eth_txq *)
|
||||
@ -442,10 +434,10 @@ static int cxgbe_dev_tx_queue_stop(struct rte_eth_dev *eth_dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cxgbe_dev_tx_queue_setup(struct rte_eth_dev *eth_dev,
|
||||
uint16_t queue_idx, uint16_t nb_desc,
|
||||
unsigned int socket_id,
|
||||
const struct rte_eth_txconf *tx_conf)
|
||||
int cxgbe_dev_tx_queue_setup(struct rte_eth_dev *eth_dev,
|
||||
uint16_t queue_idx, uint16_t nb_desc,
|
||||
unsigned int socket_id,
|
||||
const struct rte_eth_txconf *tx_conf)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -496,7 +488,7 @@ static int cxgbe_dev_tx_queue_setup(struct rte_eth_dev *eth_dev,
|
||||
return err;
|
||||
}
|
||||
|
||||
static void cxgbe_dev_tx_queue_release(void *q)
|
||||
void cxgbe_dev_tx_queue_release(void *q)
|
||||
{
|
||||
struct sge_eth_txq *txq = (struct sge_eth_txq *)q;
|
||||
|
||||
@ -512,8 +504,7 @@ static void cxgbe_dev_tx_queue_release(void *q)
|
||||
}
|
||||
}
|
||||
|
||||
static int cxgbe_dev_rx_queue_start(struct rte_eth_dev *eth_dev,
|
||||
uint16_t rx_queue_id)
|
||||
int cxgbe_dev_rx_queue_start(struct rte_eth_dev *eth_dev, uint16_t rx_queue_id)
|
||||
{
|
||||
int ret;
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
@ -532,8 +523,7 @@ static int cxgbe_dev_rx_queue_start(struct rte_eth_dev *eth_dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cxgbe_dev_rx_queue_stop(struct rte_eth_dev *eth_dev,
|
||||
uint16_t rx_queue_id)
|
||||
int cxgbe_dev_rx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t rx_queue_id)
|
||||
{
|
||||
int ret;
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
@ -551,11 +541,11 @@ static int cxgbe_dev_rx_queue_stop(struct rte_eth_dev *eth_dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cxgbe_dev_rx_queue_setup(struct rte_eth_dev *eth_dev,
|
||||
uint16_t queue_idx, uint16_t nb_desc,
|
||||
unsigned int socket_id,
|
||||
const struct rte_eth_rxconf *rx_conf,
|
||||
struct rte_mempool *mp)
|
||||
int cxgbe_dev_rx_queue_setup(struct rte_eth_dev *eth_dev,
|
||||
uint16_t queue_idx, uint16_t nb_desc,
|
||||
unsigned int socket_id,
|
||||
const struct rte_eth_rxconf *rx_conf,
|
||||
struct rte_mempool *mp)
|
||||
{
|
||||
struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
@ -629,7 +619,7 @@ static int cxgbe_dev_rx_queue_setup(struct rte_eth_dev *eth_dev,
|
||||
return err;
|
||||
}
|
||||
|
||||
static void cxgbe_dev_rx_queue_release(void *q)
|
||||
void cxgbe_dev_rx_queue_release(void *q)
|
||||
{
|
||||
struct sge_eth_rxq *rxq = (struct sge_eth_rxq *)q;
|
||||
struct sge_rspq *rq = &rxq->rspq;
|
||||
@ -775,7 +765,7 @@ static int cxgbe_flow_ctrl_set(struct rte_eth_dev *eth_dev,
|
||||
&pi->link_cfg);
|
||||
}
|
||||
|
||||
static const uint32_t *
|
||||
const uint32_t *
|
||||
cxgbe_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
static const uint32_t ptypes[] = {
|
||||
|
38
drivers/net/cxgbe/cxgbe_pfvf.h
Normal file
38
drivers/net/cxgbe/cxgbe_pfvf.h
Normal file
@ -0,0 +1,38 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause
|
||||
* Copyright(c) 2018 Chelsio Communications.
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _CXGBE_PFVF_H_
|
||||
#define _CXGBE_PFVF_H_
|
||||
|
||||
void cxgbe_dev_rx_queue_release(void *q);
|
||||
void cxgbe_dev_tx_queue_release(void *q);
|
||||
void cxgbe_dev_stop(struct rte_eth_dev *eth_dev);
|
||||
void cxgbe_dev_close(struct rte_eth_dev *eth_dev);
|
||||
void cxgbe_dev_info_get(struct rte_eth_dev *eth_dev,
|
||||
struct rte_eth_dev_info *device_info);
|
||||
void cxgbe_dev_promiscuous_enable(struct rte_eth_dev *eth_dev);
|
||||
void cxgbe_dev_promiscuous_disable(struct rte_eth_dev *eth_dev);
|
||||
void cxgbe_dev_allmulticast_enable(struct rte_eth_dev *eth_dev);
|
||||
void cxgbe_dev_allmulticast_disable(struct rte_eth_dev *eth_dev);
|
||||
int cxgbe_dev_configure(struct rte_eth_dev *eth_dev);
|
||||
int cxgbe_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t queue_idx,
|
||||
uint16_t nb_desc, unsigned int socket_id,
|
||||
const struct rte_eth_txconf *tx_conf);
|
||||
int cxgbe_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t queue_idx,
|
||||
uint16_t nb_desc, unsigned int socket_id,
|
||||
const struct rte_eth_rxconf *rx_conf,
|
||||
struct rte_mempool *mp);
|
||||
int cxgbe_dev_tx_queue_start(struct rte_eth_dev *eth_dev,
|
||||
uint16_t tx_queue_id);
|
||||
int cxgbe_dev_rx_queue_start(struct rte_eth_dev *eth_dev,
|
||||
uint16_t tx_queue_id);
|
||||
int cxgbe_dev_tx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t tx_queue_id);
|
||||
int cxgbe_dev_rx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t rx_queue_id);
|
||||
int cxgbe_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu);
|
||||
int cxgbe_dev_start(struct rte_eth_dev *eth_dev);
|
||||
int cxgbe_dev_link_update(struct rte_eth_dev *eth_dev,
|
||||
int wait_to_complete);
|
||||
const uint32_t *cxgbe_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev);
|
||||
#endif /* _CXGBE_PFVF_H_ */
|
91
drivers/net/cxgbe/cxgbevf_ethdev.c
Normal file
91
drivers/net/cxgbe/cxgbevf_ethdev.c
Normal file
@ -0,0 +1,91 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause
|
||||
* Copyright(c) 2018 Chelsio Communications.
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
#include <rte_ethdev_driver.h>
|
||||
#include <rte_ethdev_pci.h>
|
||||
|
||||
#include "cxgbe.h"
|
||||
#include "cxgbe_pfvf.h"
|
||||
|
||||
/*
|
||||
* Macros needed to support the PCI Device ID Table ...
|
||||
*/
|
||||
#define CH_PCI_DEVICE_ID_TABLE_DEFINE_BEGIN \
|
||||
static const struct rte_pci_id cxgb4vf_pci_tbl[] = {
|
||||
#define CH_PCI_DEVICE_ID_FUNCTION 0x8
|
||||
|
||||
#define PCI_VENDOR_ID_CHELSIO 0x1425
|
||||
|
||||
#define CH_PCI_ID_TABLE_ENTRY(devid) \
|
||||
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_CHELSIO, (devid)) }
|
||||
|
||||
#define CH_PCI_DEVICE_ID_TABLE_DEFINE_END \
|
||||
{ .vendor_id = 0, } \
|
||||
}
|
||||
|
||||
/*
|
||||
*... and the PCI ID Table itself ...
|
||||
*/
|
||||
#include "t4_pci_id_tbl.h"
|
||||
|
||||
static const struct eth_dev_ops cxgbevf_eth_dev_ops = {
|
||||
.dev_start = cxgbe_dev_start,
|
||||
.dev_stop = cxgbe_dev_stop,
|
||||
.dev_close = cxgbe_dev_close,
|
||||
.promiscuous_enable = cxgbe_dev_promiscuous_enable,
|
||||
.promiscuous_disable = cxgbe_dev_promiscuous_disable,
|
||||
.allmulticast_enable = cxgbe_dev_allmulticast_enable,
|
||||
.allmulticast_disable = cxgbe_dev_allmulticast_disable,
|
||||
.dev_configure = cxgbe_dev_configure,
|
||||
.dev_infos_get = cxgbe_dev_info_get,
|
||||
.dev_supported_ptypes_get = cxgbe_dev_supported_ptypes_get,
|
||||
.link_update = cxgbe_dev_link_update,
|
||||
.mtu_set = cxgbe_dev_mtu_set,
|
||||
.tx_queue_setup = cxgbe_dev_tx_queue_setup,
|
||||
.tx_queue_start = cxgbe_dev_tx_queue_start,
|
||||
.tx_queue_stop = cxgbe_dev_tx_queue_stop,
|
||||
.tx_queue_release = cxgbe_dev_tx_queue_release,
|
||||
.rx_queue_setup = cxgbe_dev_rx_queue_setup,
|
||||
.rx_queue_start = cxgbe_dev_rx_queue_start,
|
||||
.rx_queue_stop = cxgbe_dev_rx_queue_stop,
|
||||
.rx_queue_release = cxgbe_dev_rx_queue_release,
|
||||
};
|
||||
|
||||
/*
|
||||
* Initialize driver
|
||||
* It returns 0 on success.
|
||||
*/
|
||||
static int eth_cxgbevf_dev_init(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
CXGBE_FUNC_TRACE();
|
||||
|
||||
eth_dev->dev_ops = &cxgbevf_eth_dev_ops;
|
||||
|
||||
/* XXX: Do probe */
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static int eth_cxgbevf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
|
||||
struct rte_pci_device *pci_dev)
|
||||
{
|
||||
return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct port_info),
|
||||
eth_cxgbevf_dev_init);
|
||||
}
|
||||
|
||||
static int eth_cxgbevf_pci_remove(struct rte_pci_device *pci_dev)
|
||||
{
|
||||
return rte_eth_dev_pci_generic_remove(pci_dev, NULL);
|
||||
}
|
||||
|
||||
static struct rte_pci_driver rte_cxgbevf_pmd = {
|
||||
.id_table = cxgb4vf_pci_tbl,
|
||||
.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
|
||||
.probe = eth_cxgbevf_pci_probe,
|
||||
.remove = eth_cxgbevf_pci_remove,
|
||||
};
|
||||
|
||||
RTE_PMD_REGISTER_PCI(net_cxgbevf, rte_cxgbevf_pmd);
|
||||
RTE_PMD_REGISTER_PCI_TABLE(net_cxgbevf, cxgb4vf_pci_tbl);
|
||||
RTE_PMD_REGISTER_KMOD_DEP(net_cxgbevf, "* igb_uio | vfio-pci");
|
Loading…
Reference in New Issue
Block a user