/
Linux Ethernet Offload Engine driver

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

 

 

CONFIG_EOE_Image.PNG

 

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