[dpdk-dev,v4,01/17] net/axgbe: add minimal dev init and uninit support

Message ID 1522910389-35530-1-git-send-email-Ravi1.kumar@amd.com (mailing list archive)
State Changes Requested, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation fail Compilation issues

Commit Message

Kumar, Ravi1 April 5, 2018, 6:39 a.m. UTC
  add ethernet poll mode driver for AMD 10G devices embedded in
AMD EPYC™ EMBEDDED 3000 family processors

Signed-off-by: Ravi Kumar <Ravi1.kumar@amd.com>
---
 MAINTAINERS                                 |  6 ++
 config/common_base                          |  6 ++
 doc/guides/rel_notes/release_18_05.rst      |  5 ++
 drivers/net/Makefile                        |  1 +
 drivers/net/axgbe/Makefile                  | 23 +++++++
 drivers/net/axgbe/axgbe_common.h            | 50 +++++++++++++++
 drivers/net/axgbe/axgbe_ethdev.c            | 97 +++++++++++++++++++++++++++++
 drivers/net/axgbe/axgbe_ethdev.h            | 23 +++++++
 drivers/net/axgbe/axgbe_logs.h              | 26 ++++++++
 drivers/net/axgbe/rte_pmd_axgbe_version.map |  4 ++
 mk/rte.app.mk                               |  1 +
 11 files changed, 242 insertions(+)
 create mode 100644 drivers/net/axgbe/Makefile
 create mode 100644 drivers/net/axgbe/axgbe_common.h
 create mode 100644 drivers/net/axgbe/axgbe_ethdev.c
 create mode 100644 drivers/net/axgbe/axgbe_ethdev.h
 create mode 100644 drivers/net/axgbe/axgbe_logs.h
 create mode 100644 drivers/net/axgbe/rte_pmd_axgbe_version.map
  

Comments

Ferruh Yigit April 5, 2018, 11:34 a.m. UTC | #1
On 4/5/2018 7:39 AM, Ravi Kumar wrote:
> add ethernet poll mode driver for AMD 10G devices embedded in
> AMD EPYC™ EMBEDDED 3000 family processors
> 
> Signed-off-by: Ravi Kumar <Ravi1.kumar@amd.com>
<...>

> @@ -410,6 +410,12 @@ CONFIG_RTE_PMD_RING_MAX_TX_RINGS=16
>  CONFIG_RTE_LIBRTE_PMD_SOFTNIC=y
>  
>  #
> +# Compile AMD PMD
> +#
> +CONFIG_RTE_LIBRTE_AXGBE_DEBUG_INIT=n
> +CONFIG_RTE_LIBRTE_AXGBE_PMD=y


Please add alphabetically.

RTE_LIBRTE_AXGBE_DEBUG_INIT is used for data path logs, otherwise it should be
dynamic logging. So the name is wrong for the purpose, it is no more "init"
debug log, you have dynamic log for init already.
And in documentation this has been documented as "Toggle display of
initialization related messages" which seems wrong as well.

<...>

> @@ -12,6 +12,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += af_packet
>  DIRS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark
>  DIRS-$(CONFIG_RTE_LIBRTE_AVF_PMD) += avf
>  DIRS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += avp
> +DIRS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe

Please consider adding meson support too. Perhaps with a separate patch to this set.

<...>

> +
> +#
> +# all source are stored in SRCS-y
> +#
> +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_ethdev.c

Shared build causing build error, you need to add dependent libraries [1], and
please test shared library builds:

[1] something like:
 +LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
 +LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs
 +LDLIBS += -lrte_bus_pci

<...>

> +RTE_PMD_REGISTER_PCI(net_axgbe, rte_axgbe_pmd);
> +RTE_PMD_REGISTER_PCI_TABLE(net_axgbe, pci_id_axgbe_map);
> +RTE_PMD_REGISTER_KMOD_DEP(net_axgbe, "* igb_uio | uio_pci_generic | vfio-pci");

Is vfio-pci supported?

Documentation says:
"
AXGBE PMD works only with legacy interrupts. Load ``igb_uio`` module in legacy
interrupt mode using module params.

Bind the intended AMD device to igb_uio module
"
<...>
  
Kumar, Ravi1 April 6, 2018, 12:39 p.m. UTC | #2
>On 4/5/2018 7:39 AM, Ravi Kumar wrote:

>> add ethernet poll mode driver for AMD 10G devices embedded in AMD 

>> EPYC™ EMBEDDED 3000 family processors

>> 

>> Signed-off-by: Ravi Kumar <Ravi1.kumar@amd.com>

><...>

>


Hi Ferruh,

Please check my comments inline.

>> @@ -410,6 +410,12 @@ CONFIG_RTE_PMD_RING_MAX_TX_RINGS=16

>>  CONFIG_RTE_LIBRTE_PMD_SOFTNIC=y

>>  

>>  #

>> +# Compile AMD PMD

>> +#

>> +CONFIG_RTE_LIBRTE_AXGBE_DEBUG_INIT=n

>> +CONFIG_RTE_LIBRTE_AXGBE_PMD=y

>

>

>Please add alphabetically.

>

>RTE_LIBRTE_AXGBE_DEBUG_INIT is used for data path logs, otherwise it should be dynamic logging. So the name is wrong for the purpose, it is no more "init"

>debug log, you have dynamic log for init already.

>And in documentation this has been documented as "Toggle display of initialization related messages" which seems wrong as well.


[Ravi] Done. Corrected document as well.

>

><...>

>

>> @@ -12,6 +12,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += af_packet

>>  DIRS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark

>>  DIRS-$(CONFIG_RTE_LIBRTE_AVF_PMD) += avf

>>  DIRS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += avp

>> +DIRS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe

>

>Please consider adding meson support too. Perhaps with a separate patch to this set.


[Ravi] Added meson build support in a separate patch.

>

><...>

>

>> +

>> +#

>> +# all source are stored in SRCS-y

>> +#

>> +SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_ethdev.c

>

>Shared build causing build error, you need to add dependent libraries [1], and please test shared library builds:

>

>[1] something like:

> +LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring  +LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs  +LDLIBS += -lrte_bus_pci

>

><...>

>


[Ravi] Supported shared builds. Thanks.

>> +RTE_PMD_REGISTER_PCI(net_axgbe, rte_axgbe_pmd); 

>> +RTE_PMD_REGISTER_PCI_TABLE(net_axgbe, pci_id_axgbe_map); 

>> +RTE_PMD_REGISTER_KMOD_DEP(net_axgbe, "* igb_uio | uio_pci_generic | 

>> +vfio-pci");

>

>Is vfio-pci supported?

>

>Documentation says:

>"

>AXGBE PMD works only with legacy interrupts. Load ``igb_uio`` module in legacy interrupt mode using module params.

>

>Bind the intended AMD device to igb_uio module "

><...>


[Ravi] PMD supports vfio-pci. Corrected old document.
  

Patch

diff --git a/MAINTAINERS b/MAINTAINERS
index ed3251d..1bf7c03 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -349,6 +349,12 @@  M: Ferruh Yigit <ferruh.yigit@intel.com>
 T: git://dpdk.org/next/dpdk-next-net
 F: doc/guides/nics/features/default.ini
 
+AMD AXGBE PMD
+M: Ravi Kumar <ravi1.kumar@amd.com>
+F: drivers/net/axgbe/
+F: doc/guides/nics/axgbe.rst
+F: doc/guides/nics/features/axgbe.ini
+
 Link bonding
 M: Declan Doherty <declan.doherty@intel.com>
 F: drivers/net/bonding/
diff --git a/config/common_base b/config/common_base
index c09c7cf..5da265b 100644
--- a/config/common_base
+++ b/config/common_base
@@ -410,6 +410,12 @@  CONFIG_RTE_PMD_RING_MAX_TX_RINGS=16
 CONFIG_RTE_LIBRTE_PMD_SOFTNIC=y
 
 #
+# Compile AMD PMD
+#
+CONFIG_RTE_LIBRTE_AXGBE_DEBUG_INIT=n
+CONFIG_RTE_LIBRTE_AXGBE_PMD=y
+
+#
 # Compile the TAP PMD
 # It is enabled by default for Linux only.
 #
diff --git a/doc/guides/rel_notes/release_18_05.rst b/doc/guides/rel_notes/release_18_05.rst
index e5fac1c..dddd2db 100644
--- a/doc/guides/rel_notes/release_18_05.rst
+++ b/doc/guides/rel_notes/release_18_05.rst
@@ -58,6 +58,11 @@  New Features
   * Added support for NVGRE, VXLAN and GENEVE filters in flow API.
   * Added support for DROP action in flow API.
 
+* **Added Ethernet poll mode driver for AMD XGBE devices.**
+
+  Added the new ``axgbe`` ethernet poll mode driver for AMD XGBE devices.
+  See the :doc:`../nics/axgbe` nic driver guide for more details on this
+  new driver.
 
 API Changes
 -----------
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 37ca19a..dc5047e 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -12,6 +12,7 @@  DIRS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += af_packet
 DIRS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark
 DIRS-$(CONFIG_RTE_LIBRTE_AVF_PMD) += avf
 DIRS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += avp
+DIRS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe
 DIRS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD) += bnx2x
 DIRS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += bonding
 DIRS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += cxgbe
diff --git a/drivers/net/axgbe/Makefile b/drivers/net/axgbe/Makefile
new file mode 100644
index 0000000..277ef2d
--- /dev/null
+++ b/drivers/net/axgbe/Makefile
@@ -0,0 +1,23 @@ 
+#   SPDX-License-Identifier: BSD-3-Clause
+#   Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+#
+# library name
+#
+LIB = librte_pmd_axgbe.a
+
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+EXPORT_MAP := rte_pmd_axgbe_version.map
+
+LIBABIVER := 1
+
+#
+# all source are stored in SRCS-y
+#
+SRCS-$(CONFIG_RTE_LIBRTE_AXGBE_PMD) += axgbe_ethdev.c
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/net/axgbe/axgbe_common.h b/drivers/net/axgbe/axgbe_common.h
new file mode 100644
index 0000000..3591d77
--- /dev/null
+++ b/drivers/net/axgbe/axgbe_common.h
@@ -0,0 +1,50 @@ 
+/*   SPDX-License-Identifier: BSD-3-Clause
+ *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
+ *   Copyright(c) 2018 Synopsys, Inc. All rights reserved.
+ */
+
+#ifndef __AXGBE_COMMON_H__
+#define __AXGBE_COMMON_H__
+
+#include "axgbe_logs.h"
+
+#include <stdbool.h>
+#include <limits.h>
+#include <sys/queue.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <inttypes.h>
+#include <pthread.h>
+
+#include <rte_byteorder.h>
+#include <rte_memory.h>
+#include <rte_malloc.h>
+#include <rte_hexdump.h>
+#include <rte_log.h>
+#include <rte_debug.h>
+#include <rte_branch_prediction.h>
+#include <rte_eal.h>
+#include <rte_memzone.h>
+#include <rte_ether.h>
+#include <rte_ethdev.h>
+#include <rte_dev.h>
+#include <rte_errno.h>
+#include <rte_dev.h>
+#include <rte_ethdev_pci.h>
+#include <rte_common.h>
+#include <rte_cycles.h>
+#include <rte_io.h>
+
+#define BIT(nr)	                       (1 << (nr))
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#endif
+
+#define AXGBE_HZ				250
+
+#endif /* __AXGBE_COMMON_H__ */
diff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c
new file mode 100644
index 0000000..8d7ff28
--- /dev/null
+++ b/drivers/net/axgbe/axgbe_ethdev.c
@@ -0,0 +1,97 @@ 
+/*   SPDX-License-Identifier: BSD-3-Clause
+ *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
+ *   Copyright(c) 2018 Synopsys, Inc. All rights reserved.
+ */
+
+#include "axgbe_ethdev.h"
+
+static int eth_axgbe_dev_init(struct rte_eth_dev *eth_dev);
+static int eth_axgbe_dev_uninit(struct rte_eth_dev *eth_dev);
+
+/* The set of PCI devices this driver supports */
+#define AMD_PCI_VENDOR_ID       0x1022
+#define AMD_PCI_AXGBE_DEVICE_V2A 0x1458
+#define AMD_PCI_AXGBE_DEVICE_V2B 0x1459
+
+int axgbe_logtype_init;
+int axgbe_logtype_driver;
+
+static const struct rte_pci_id pci_id_axgbe_map[] = {
+	{RTE_PCI_DEVICE(AMD_PCI_VENDOR_ID, AMD_PCI_AXGBE_DEVICE_V2A)},
+	{RTE_PCI_DEVICE(AMD_PCI_VENDOR_ID, AMD_PCI_AXGBE_DEVICE_V2B)},
+	{ .vendor_id = 0, },
+};
+
+/*
+ * It returns 0 on success.
+ */
+static int
+eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)
+{
+	PMD_INIT_FUNC_TRACE();
+	struct axgbe_port *pdata;
+	struct rte_pci_device *pci_dev;
+
+	/*
+	 * For secondary processes, we don't initialise any further as primary
+	 * has already done this work.
+	 */
+	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+		return 0;
+
+	pdata = (struct axgbe_port *)eth_dev->data->dev_private;
+	pdata->eth_dev = eth_dev;
+
+	pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
+	pdata->pci_dev = pci_dev;
+
+	PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x",
+		     eth_dev->data->port_id, pci_dev->id.vendor_id,
+		     pci_dev->id.device_id);
+
+	return 0;
+}
+
+static int
+eth_axgbe_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
+{
+	/* stub function */
+	PMD_INIT_FUNC_TRACE();
+
+	return 0;
+}
+
+static int eth_axgbe_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 axgbe_port), eth_axgbe_dev_init);
+}
+
+static int eth_axgbe_pci_remove(struct rte_pci_device *pci_dev)
+{
+	return rte_eth_dev_pci_generic_remove(pci_dev, eth_axgbe_dev_uninit);
+}
+
+static struct rte_pci_driver rte_axgbe_pmd = {
+	.id_table = pci_id_axgbe_map,
+	.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
+	.probe = eth_axgbe_pci_probe,
+	.remove = eth_axgbe_pci_remove,
+};
+
+RTE_PMD_REGISTER_PCI(net_axgbe, rte_axgbe_pmd);
+RTE_PMD_REGISTER_PCI_TABLE(net_axgbe, pci_id_axgbe_map);
+RTE_PMD_REGISTER_KMOD_DEP(net_axgbe, "* igb_uio | uio_pci_generic | vfio-pci");
+
+RTE_INIT(axgbe_init_log);
+static void
+axgbe_init_log(void)
+{
+	axgbe_logtype_init = rte_log_register("pmd.net.axgbe.init");
+	if (axgbe_logtype_init >= 0)
+		rte_log_set_level(axgbe_logtype_init, RTE_LOG_NOTICE);
+	axgbe_logtype_driver = rte_log_register("pmd.net.axgbe.driver");
+	if (axgbe_logtype_driver >= 0)
+		rte_log_set_level(axgbe_logtype_driver, RTE_LOG_NOTICE);
+}
diff --git a/drivers/net/axgbe/axgbe_ethdev.h b/drivers/net/axgbe/axgbe_ethdev.h
new file mode 100644
index 0000000..fc20169
--- /dev/null
+++ b/drivers/net/axgbe/axgbe_ethdev.h
@@ -0,0 +1,23 @@ 
+/*   SPDX-License-Identifier: BSD-3-Clause
+ *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
+ *   Copyright(c) 2018 Synopsys, Inc. All rights reserved.
+ */
+
+#ifndef RTE_ETH_AXGBE_H_
+#define RTE_ETH_AXGBE_H_
+
+#include <rte_mempool.h>
+#include <rte_lcore.h>
+#include "axgbe_common.h"
+
+/*
+ * Structure to store private data for each port.
+ */
+struct axgbe_port {
+	/*  Ethdev where port belongs*/
+	struct rte_eth_dev *eth_dev;
+	/* Pci dev info */
+	const struct rte_pci_device *pci_dev;
+};
+
+#endif /* RTE_ETH_AXGBE_H_ */
diff --git a/drivers/net/axgbe/axgbe_logs.h b/drivers/net/axgbe/axgbe_logs.h
new file mode 100644
index 0000000..020bcef
--- /dev/null
+++ b/drivers/net/axgbe/axgbe_logs.h
@@ -0,0 +1,26 @@ 
+/*   SPDX-License-Identifier: BSD-3-Clause
+ *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
+ */
+
+#ifndef _AXGBE_LOGS_H_
+#define _AXGBE_LOGS_H_
+
+#include <stdio.h>
+
+extern int axgbe_logtype_init;
+#define PMD_INIT_LOG(level, fmt, args...) \
+	rte_log(RTE_LOG_ ## level, axgbe_logtype_init, "%s(): " fmt "\n", \
+		__func__, ##args)
+
+#ifdef RTE_LIBRTE_AXGBE_DEBUG_INIT
+#define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>")
+#else
+#define PMD_INIT_FUNC_TRACE() do { } while (0)
+#endif
+
+extern int axgbe_logtype_driver;
+#define PMD_DRV_LOG(level, fmt, args...) \
+	rte_log(RTE_LOG_ ## level, axgbe_logtype_driver, "%s(): " fmt, \
+		__func__, ## args)
+
+#endif /* _AXGBE_LOGS_H_ */
diff --git a/drivers/net/axgbe/rte_pmd_axgbe_version.map b/drivers/net/axgbe/rte_pmd_axgbe_version.map
new file mode 100644
index 0000000..b26efa6
--- /dev/null
+++ b/drivers/net/axgbe/rte_pmd_axgbe_version.map
@@ -0,0 +1,4 @@ 
+DPDK_18.05 {
+
+        local: *;
+};
diff --git a/mk/rte.app.mk b/mk/rte.app.mk
index 2585908..005803a 100644
--- a/mk/rte.app.mk
+++ b/mk/rte.app.mk
@@ -137,6 +137,7 @@  _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET)  += -lrte_pmd_af_packet
 _LDLIBS-$(CONFIG_RTE_LIBRTE_ARK_PMD)        += -lrte_pmd_ark
 _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
 _LDLIBS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD)      += -lrte_pmd_bnx2x -lz
 _LDLIBS-$(CONFIG_RTE_LIBRTE_BNXT_PMD)       += -lrte_pmd_bnxt
 _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BOND)       += -lrte_pmd_bond