net/atlantic: add PMD driver skeleton

Makefile/meson build infrastructure, atl_ethdev minimal skeleton,
header with aquantia aQtion NIC device and vendor IDs.

Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com>
Signed-off-by: Pavel Belous <pavel.belous@aquantia.com>
This commit is contained in:
Pavel Belous 2018-10-12 11:09:03 +00:00 committed by Ferruh Yigit
parent 1b4ce87dc5
commit 5bcf164961
15 changed files with 382 additions and 0 deletions

View File

@ -487,6 +487,13 @@ F: drivers/net/axgbe/
F: doc/guides/nics/axgbe.rst
F: doc/guides/nics/features/axgbe.ini
Aquantia atlantic
M: Igor Russkikh <igor.russkikh@aquantia.com>
M: Pavel Belous <pavel.belous@aquantia.com>
F: drivers/net/atlantic/
F: doc/guides/nics/atlantic.rst
F: doc/guides/nics/features/atlantic.ini
Atomic Rules ARK
M: Shepard Siegel <shepard.siegel@atomicrules.com>
M: Ed Czeck <ed.czeck@atomicrules.com>

View File

@ -169,6 +169,11 @@ CONFIG_RTE_LIBRTE_ARK_DEBUG_TX=n
CONFIG_RTE_LIBRTE_ARK_DEBUG_STATS=n
CONFIG_RTE_LIBRTE_ARK_DEBUG_TRACE=n
#
# Compile Aquantia Atlantic PMD driver
#
CONFIG_RTE_LIBRTE_ATLANTIC_PMD=y
#
# Compile AMD PMD
#

View File

@ -48,6 +48,7 @@ CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=n
# Note: Initially, all of the PMD drivers compilation are turned off on Power
# Will turn on them only after the successful testing on Power
CONFIG_RTE_LIBRTE_ATLANTIC_PMD=n
CONFIG_RTE_LIBRTE_IXGBE_PMD=n
CONFIG_RTE_LIBRTE_VIRTIO_PMD=y
CONFIG_RTE_LIBRTE_VMXNET3_PMD=n

View File

@ -0,0 +1,37 @@
.. SPDX-License-Identifier: BSD-3-Clause
Copyright(c) 2018 Aquantia Corporation.
Aquantia Atlantic DPDK Driver
=============================
Atlantic DPDK driver provides DPDK support for Aquantia's AQtion family of chipsets: AQC107/AQC108/AQC109
More information can be found at `Aquantia Official Website
<https://www.aquantia.com/products/client-connectivity/>`_.
Supported features
^^^^^^^^^^^^^^^^^^
Configuration Information
^^^^^^^^^^^^^^^^^^^^^^^^^
- ``CONFIG_RTE_LIBRTE_ATLANTIC_PMD`` (default ``y``)
Application Programming Interface
---------------------------------
Limitations or Known issues
---------------------------
Statistics
~~~~~~~~~~
MTU setting
~~~~~~~~~~~
Supported Chipsets and NICs
---------------------------
- Aquantia AQtion AQC107 10 Gigabit Ethernet Controller
- Aquantia AQtion AQC108 5 Gigabit Ethernet Controller
- Aquantia AQtion AQC109 2.5 Gigabit Ethernet Controller

View File

@ -0,0 +1,10 @@
;
; Supported features of the 'atlantic' network poll mode driver.
;
; Refer to default.ini for the full list of available PMD features.
;
[Features]
Linux UIO = Y
ARMv8 = Y
x86-32 = Y
x86-64 = Y

View File

@ -12,6 +12,7 @@ Network Interface Controller Drivers
features
build_and_test
ark
atlantic
avp
axgbe
bnx2x

View File

@ -10,6 +10,7 @@ endif
DIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += af_packet
DIRS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark
DIRS-$(CONFIG_RTE_LIBRTE_ATLANTIC_PMD) += atlantic
DIRS-$(CONFIG_RTE_LIBRTE_AVF_PMD) += avf
DIRS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += avp
DIRS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe

View File

@ -0,0 +1,27 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2018 Aquantia Corporation
include $(RTE_SDK)/mk/rte.vars.mk
#
# library name
#
LIB = librte_pmd_atlantic.a
CFLAGS += -O3
CFLAGS += $(WERROR_FLAGS)
EXPORT_MAP := rte_pmd_atlantic_version.map
LIBABIVER := 1
LDLIBS += -lrte_eal
LDLIBS += -lrte_ethdev -lrte_net
LDLIBS += -lrte_bus_pci
#
# all source are stored in SRCS-y
#
SRCS-$(CONFIG_RTE_LIBRTE_ATLANTIC_PMD) += atl_ethdev.c
include $(RTE_SDK)/mk/rte.lib.mk

View File

@ -0,0 +1,96 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2018 Aquantia Corporation
*/
#ifndef AQ_COMMON_H
#define AQ_COMMON_H
#define ATL_PMD_DRIVER_VERSION "0.4.1"
#define PCI_VENDOR_ID_AQUANTIA 0x1D6A
#define AQ_DEVICE_ID_0001 0x0001
#define AQ_DEVICE_ID_D100 0xD100
#define AQ_DEVICE_ID_D107 0xD107
#define AQ_DEVICE_ID_D108 0xD108
#define AQ_DEVICE_ID_D109 0xD109
#define AQ_DEVICE_ID_AQC100 0x00B1
#define AQ_DEVICE_ID_AQC107 0x07B1
#define AQ_DEVICE_ID_AQC108 0x08B1
#define AQ_DEVICE_ID_AQC109 0x09B1
#define AQ_DEVICE_ID_AQC111 0x11B1
#define AQ_DEVICE_ID_AQC112 0x12B1
#define AQ_DEVICE_ID_AQC100S 0x80B1
#define AQ_DEVICE_ID_AQC107S 0x87B1
#define AQ_DEVICE_ID_AQC108S 0x88B1
#define AQ_DEVICE_ID_AQC109S 0x89B1
#define AQ_DEVICE_ID_AQC111S 0x91B1
#define AQ_DEVICE_ID_AQC112S 0x92B1
#define AQ_DEVICE_ID_AQC111E 0x51B1
#define AQ_DEVICE_ID_AQC112E 0x52B1
#define HW_ATL_NIC_NAME "aQuantia AQtion 10Gbit Network Adapter"
#define AQ_HWREV_ANY 0
#define AQ_HWREV_1 1
#define AQ_HWREV_2 2
#define AQ_NIC_RATE_10G BIT(0)
#define AQ_NIC_RATE_5G BIT(1)
#define AQ_NIC_RATE_5G5R BIT(2)
#define AQ_NIC_RATE_2G5 BIT(3)
#define AQ_NIC_RATE_1G BIT(4)
#define AQ_NIC_RATE_100M BIT(5)
#define AQ_NIC_RATE_EEE_10G BIT(6)
#define AQ_NIC_RATE_EEE_5G BIT(7)
#define AQ_NIC_RATE_EEE_2G5 BIT(8)
#define AQ_NIC_RATE_EEE_1G BIT(9)
#define ATL_MAX_RING_DESC (8 * 1024 - 8)
#define ATL_MIN_RING_DESC 32
#define ATL_RXD_ALIGN 8
#define ATL_TXD_ALIGN 8
#define ATL_TX_MAX_SEG 16
#define ATL_MAX_INTR_QUEUE_NUM 15
#define ATL_MISC_VEC_ID 10
#define ATL_RX_VEC_START 0
#define AQ_NIC_WOL_ENABLED BIT(0)
#define AQ_NIC_FC_OFF 0U
#define AQ_NIC_FC_TX 1U
#define AQ_NIC_FC_RX 2U
#define AQ_NIC_FC_FULL 3U
#define AQ_NIC_FC_AUTO 4U
#define AQ_CFG_TX_FRAME_MAX (16U * 1024U)
#define AQ_CFG_RX_FRAME_MAX (2U * 1024U)
#define AQ_HW_MULTICAST_ADDRESS_MAX 32
#define AQ_HW_MAX_SEGS_SIZE 40
#define AQ_HW_MAX_RX_QUEUES 8
#define AQ_HW_MAX_TX_QUEUES 8
#define AQ_HW_MIN_RX_RING_SIZE 512
#define AQ_HW_MAX_RX_RING_SIZE 8192
#define AQ_HW_MIN_TX_RING_SIZE 512
#define AQ_HW_MAX_TX_RING_SIZE 8192
#define ATL_DEFAULT_RX_FREE_THRESH 64
#define ATL_DEFAULT_TX_FREE_THRESH 64
#define ATL_IRQ_CAUSE_LINK 0x8
#define AQ_HW_LED_BLINK 0x2U
#define AQ_HW_LED_DEFAULT 0x0U
#endif /* AQ_COMMON_H */

View File

@ -0,0 +1,170 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2018 Aquantia Corporation
*/
#include <rte_ethdev_pci.h>
#include "atl_ethdev.h"
#include "atl_common.h"
static int eth_atl_dev_init(struct rte_eth_dev *eth_dev);
static int eth_atl_dev_uninit(struct rte_eth_dev *eth_dev);
static int atl_dev_configure(struct rte_eth_dev *dev);
static int atl_dev_start(struct rte_eth_dev *dev);
static void atl_dev_stop(struct rte_eth_dev *dev);
static void atl_dev_close(struct rte_eth_dev *dev);
static int atl_dev_reset(struct rte_eth_dev *dev);
static int eth_atl_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
struct rte_pci_device *pci_dev);
static int eth_atl_pci_remove(struct rte_pci_device *pci_dev);
static void atl_dev_info_get(struct rte_eth_dev *dev,
struct rte_eth_dev_info *dev_info);
/*
* The set of PCI devices this driver supports
*/
static const struct rte_pci_id pci_id_atl_map[] = {
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_0001) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_D100) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_D107) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_D108) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_D109) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC100) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC107) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC108) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC109) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC111) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC112) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC100S) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC107S) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC108S) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC109S) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC111S) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC112S) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC111E) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_AQUANTIA, AQ_DEVICE_ID_AQC112E) },
{ .vendor_id = 0, /* sentinel */ },
};
static struct rte_pci_driver rte_atl_pmd = {
.id_table = pci_id_atl_map,
.drv_flags = RTE_PCI_DRV_NEED_MAPPING |
RTE_PCI_DRV_IOVA_AS_VA,
.probe = eth_atl_pci_probe,
.remove = eth_atl_pci_remove,
};
static const struct eth_dev_ops atl_eth_dev_ops = {
.dev_configure = atl_dev_configure,
.dev_start = atl_dev_start,
.dev_stop = atl_dev_stop,
.dev_close = atl_dev_close,
.dev_reset = atl_dev_reset,
.dev_infos_get = atl_dev_info_get,
};
static int
eth_atl_dev_init(struct rte_eth_dev *eth_dev)
{
eth_dev->dev_ops = &atl_eth_dev_ops;
/* Allocate memory for storing MAC addresses */
eth_dev->data->mac_addrs = rte_zmalloc("atlantic", ETHER_ADDR_LEN, 0);
if (eth_dev->data->mac_addrs == NULL)
return -ENOMEM;
return 0;
}
static int
eth_atl_dev_uninit(struct rte_eth_dev *eth_dev)
{
rte_free(eth_dev->data->mac_addrs);
return 0;
}
static int
eth_atl_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 atl_adapter), eth_atl_dev_init);
}
static int
eth_atl_pci_remove(struct rte_pci_device *pci_dev)
{
return rte_eth_dev_pci_generic_remove(pci_dev, eth_atl_dev_uninit);
}
static int
atl_dev_configure(struct rte_eth_dev *dev __rte_unused)
{
return 0;
}
/*
* Configure device link speed and setup link.
* It returns 0 on success.
*/
static int
atl_dev_start(struct rte_eth_dev *dev __rte_unused)
{
return 0;
}
/*
* Stop device: disable rx and tx functions to allow for reconfiguring.
*/
static void
atl_dev_stop(struct rte_eth_dev *dev __rte_unused)
{
}
/*
* Reset and stop device.
*/
static void
atl_dev_close(struct rte_eth_dev *dev __rte_unused)
{
}
static int
atl_dev_reset(struct rte_eth_dev *dev)
{
int ret;
ret = eth_atl_dev_uninit(dev);
if (ret)
return ret;
ret = eth_atl_dev_init(dev);
return ret;
}
static void
atl_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
{
struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
dev_info->max_rx_queues = 0;
dev_info->max_rx_queues = 0;
dev_info->max_vfs = pci_dev->max_vfs;
dev_info->max_hash_mac_addrs = 0;
dev_info->max_vmdq_pools = 0;
dev_info->vmdq_queue_num = 0;
}
RTE_PMD_REGISTER_PCI(net_atlantic, rte_atl_pmd);
RTE_PMD_REGISTER_PCI_TABLE(net_atlantic, pci_id_atl_map);
RTE_PMD_REGISTER_KMOD_DEP(net_atlantic, "* igb_uio | uio_pci_generic");

View File

@ -0,0 +1,15 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2018 Aquantia Corporation
*/
#ifndef _ATLANTIC_ETHDEV_H_
#define _ATLANTIC_ETHDEV_H_
#include <rte_errno.h>
#include "rte_ethdev.h"
/*
* Structure to store private data for each driver instance (for each port).
*/
struct atl_adapter {
};
#endif /* _ATLANTIC_ETHDEV_H_ */

View File

@ -0,0 +1,6 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2018 Aquantia Corporation
sources = files(
'atl_ethdev.c',
)

View File

@ -0,0 +1,4 @@
DPDK_18.11 {
local: *;
};

View File

@ -3,6 +3,7 @@
drivers = ['af_packet',
'ark',
'atlantic',
'avf',
'avp',
'axgbe', 'bonding',

View File

@ -137,6 +137,7 @@ endif
_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += -lrte_pmd_af_packet
_LDLIBS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += -lrte_pmd_ark
_LDLIBS-$(CONFIG_RTE_LIBRTE_ATLANTIC_PMD) += -lrte_pmd_atlantic
_LDLIBS-$(CONFIG_RTE_LIBRTE_AVF_PMD) += -lrte_pmd_avf
_LDLIBS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += -lrte_pmd_avp
_LDLIBS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += -lrte_pmd_axgbe