Linux Ethernet Offload Engine driver
Ethernet Offload Engine solution is used with Linux AXI Ethernet driver for XXV Ethernet IP on Zynq Ultrascale+ MPSoC
Table of Contents
Introduction
This page gives an overview of Ethernet Offload Engine Linux driver which is available as part of the AMD Linux distribution.
The EOE driver is included in the AXI Ethernet Linux driver and is currently supported with XXV Ethernet subsystem on Zynq Ultrascale+ MPSoC
Paths, files, links and documentation on this page are given relative to the Linux kernel source tree.
HW IP features
For 10G Ethernet Subsystem (XXV)
Supported at 10G speed only
Checksum offload for TX and RX packets
UDP GSO
UDP GRO for multiple channels
UDP packets support ONLY
Built in Memory option up to 4K Bytes for GRO
Auto/ User based Selection for GRO port list
Halt of GRO Merge upon reception of CSUM Error Packets
Statistic Counters for Dropped, CSUM Error Packets
Zero Padding removal for IPv4 packets
Features supported in the driver
Support Checksum Offload
Support Generic Segmentation Offload for UDP packets
Support Generic Receive Offload for multiple channels for UDP packets
Configuring GRO Ports using Ethtool
Missing Features and Known Issues/Limitations in Driver
EOE is not support with MCDMA driver in the dmaengine framework at the moment.
Missing Features and Known Issues/Limitations in SDT
Automatic Devicetree property generation is not available for EOE subsystem. This will be added in a future release.
Kernel Configuration
The following config options should be enabled in order to build the Axi Ethernet driver
CONFIG_ETHERNET
CONFIG_NET_VENDOR_XILINX
CONFIG_XILINX_AXI_EMAC
CONFIG_AXIENET_HAS_MCDMA (Select this option In the design if Axi Ethernet is configured with Axi MCDMA)
CONFIG_XILINX_AXI_EOE=y
Device-tree
For mor details on EOE bindings, please refer to Documentation/devicetree/bindings/net/xlnx,axi-ethernet.yaml
axi_ethernet_eoe: ethernet@80020000 {
compatible = "xlnx,axi-ethernet-1.00.a";
interrupts = <0>;
clock-names = "s_axi_lite_clk", "axis_clk", "ref_clk", "mgt_clk";
clocks = <&axi_clk>, <&axi_clk>, <&pl_enet_ref_clk>, <&mgt_clk>;
phy-mode = "mii";
reg = <0x80020000 0x10000>,<0x80008000 0x8000>;
reg-names = "mac", "eoe";
phy-handle = <&phy2>;
xlnx,rxmem = <0x800>;
}
EOE Configured with MCDMA
When Axi EOE is configured with MCDMA, an example devicetree node is as follows: (used with MCDMA driver that is internal to Axi Ethernet driver)
ethernet@80020000 {
axistream-connected = <0x42>;
clock-frequency = <0x5f5e100>;
clock-names = "rx_core_clk\0dclk\0s_axi_aclk\0m_axi_mm2s_aclk\0m_axi_s2mm_aclk\0m_axi_sg_aclk\0s_axi_lite_aclk";
clocks = <0x41 0x04 0x48 0x04 0x47 0x40 0x40 0x04 0x47 0x04 0x47>;
compatible = "xlnx,xxv-ethernet-4.1\0xlnx,xxv-ethernet-1.0";
device_type = "network";
local-mac-address = [00 0a 35 00 00 01];
managed = "in-band-status";
phy-mode = "10gbase-r";
reg = <0x00 0x80020000 0x00 0x10000 0x00 0x80008000 0x00 0x8000>;
reg-names = "mac\0eoe";
xlnx,rxmem = <0x40000>;
interrupt-names = "mm2s_ch10_introut\0mm2s_ch11_introut\0mm2s_ch12_introut\0mm2s_ch13_introut\0mm2s_ch14_introut\0mm2s_ch15_introut\0mm2s_ch16_introut\0mm2s_ch1_introut\0mm2s_ch2_introut\0mm2s_ch3_introut\0mm2s_ch4_introut\0mm2s_ch5_introut\0mm2s_ch6_introut\0mm2s_ch7_introut\0mm2s_ch8_introut\0mm2s_ch9_introut\0s2mm_ch10_introut\0s2mm_ch11_introut\0s2mm_ch12_introut\0s2mm_ch13_introut\0s2mm_ch14_introut\0s2mm_ch15_introut\0s2mm_ch16_introut\0s2mm_ch1_introut\0s2mm_ch2_introut\0s2mm_ch3_introut\0s2mm_ch4_introut\0s2mm_ch5_introut\0s2mm_ch6_introut\0s2mm_ch7_introut\0s2mm_ch8_introut\0s2mm_ch9_introut";
interrupt-parent = <0x05>;
interrupts = <0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x59 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04 0x00 0x5a 0x04>;
xlnx,channel-ids = "1\02\03\04\05\06\07\08\09\0a\0b\0c\0d\0e\0f\010";
xlnx,include-dre;
xlnx,has-hw-offload;
xlnx,rx-hw-offload = <0x02>;
xlnx,tx-hw-offload = <0x02>;
phandle = <0xab>;
mdio {
#address-cells = <0x01>;
#size-cells = <0x00>;
phandle = <0xac>;
};
}; |
Performance
These benchmark performance numbers were obtained by connecting AMD boards to thirdparty NIC cards over Linux PCs/server machines (Ubuntu/Red Hat Enterprise).
The tools used are aperf (Refer to tool information below).
Performance benchmark numbers mentioned in below tables are for reference and dependent on multiple factors i.e setup , vivado design configuration etc.
NOTE: CPU utilization reported in below performance tables is an aggregate of all CPU's. i.e on ZynqMP platform, it reports combined utilization of all four A53 cores.
10G Ethernet with AXIMCDMA
Kernel version: 6.6
AXI 10G Ethernet Subsystem : TX and RX checksum offload enabled.
ZynqMP
Board: ZCU102 board (production silicon) + SFP Module
For 1 GRO Port
| UDP (Gbps) | |||
MTU | TX | CPU(%) | RX | CPU(%) |
1500 | 9.56 | 20.82 | 9.56 | 31.03 |
NOTE- EOE Supports 15 Ports for GRO.
Setup Details
Host setup: SuperMicro (H12SSL-NT)
aperf: iperf 3.9 (cJSON 1.7.13)
OS : Ubuntu 20.04.1 LTS (Linux kernel 5.15.0-107-generic)
NIC (Solarflare XtremeScale X2522 10/25GbE Ultra-Low Latency Network Adapter) : Default
Performance Test
How to Run
Server:
aperf -s -p <Port Number>
Client:
aperf -p <Port Number> -c <SERVER_IP> -b <bandwidth> -u -l <Buffer Length> -G <Packet length>
Mainline status
The EOE driver is currently NOT in mainline
Change Log
2024.1
First release adds Support for Ethernet Offload Engine. Generic Segmentation Offload, and multi-port Generic Receive Offload
Commits
History for drivers/net/ethernet/xilinx/xilinx_axienet_eoe.c - Xilinx/linux-xlnx
Related Links
Related content
© Copyright 2019 - 2022 Xilinx Inc. Privacy Policy