QorIQ DPAA 以太网驱动程序

作者: - Madalin Bucur <madalin.bucur@nxp.com> - Camelia Groza <camelia.groza@nxp.com>

DPAA 以太网概述

DPAA 是数据路径加速架构(Data Path Acceleration Architecture)的缩写,它是一组可在多代 SoC(包括 PowerPC 和 ARM64)上使用的网络加速 IP。

飞思卡尔 DPAA 架构由一系列支持以太网连接的硬件模块组成。该以太网驱动程序依赖于 Linux 内核中的以下驱动程序:

  • 外设访问存储单元 (PAMU) (* 仅适用于 PPC 平台)

    drivers/iommu/fsl_*

  • 帧管理器 (FMan)

    drivers/net/ethernet/freescale/fman

  • 队列管理器 (QMan),缓冲区管理器 (BMan)

    drivers/soc/fsl/qbman

dpaa_eth 接口映射到 FMan MAC 的简化视图

dpaa_eth       /eth0\     ...       /ethN\
driver        |      |             |      |
-------------   ----   -----------   ----   -------------
     -Ports  / Tx  Rx \    ...    / Tx  Rx \
FMan        |          |         |          |
     -MACs  |   MAC0   |         |   MACN   |
           /   dtsec0   \  ...  /   dtsecN   \ (or tgec)
          /              \     /              \(or memac)
---------  --------------  ---  --------------  ---------
    FMan, FMan Port, FMan SP, FMan MURAM drivers
---------------------------------------------------------
    FMan HW blocks: MURAM, MACs, Ports, SP
---------------------------------------------------------

dpaa_eth 与 QMan、BMan 和 FMan 的关系

            ________________________________
dpaa_eth   /            eth0                \
driver    /                                  \
---------   -^-   -^-   -^-   ---    ---------
QMan driver / \   / \   / \  \   /  | BMan    |
           |Rx | |Rx | |Tx | |Tx |  | driver  |
---------  |Dfl| |Err| |Cnf| |FQs|  |         |
QMan HW    |FQ | |FQ | |FQs| |   |  |         |
           /   \ /   \ /   \  \ /   |         |
---------   ---   ---   ---   -v-    ---------
          |        FMan QMI         |         |
          | FMan HW       FMan BMI  | BMan HW |
            -----------------------   --------

以上(和代码中)使用的缩略语为:

DPAA

数据路径加速架构

FMan

DPAA 帧管理器

QMan

DPAA 队列管理器

BMan

DPAA 缓冲区管理器

QMI

FMan 中的 QMan 接口

BMI

FMan 中的 BMan 接口

FMan SP

FMan 存储配置文件

MURAM

FMan 中的多用户 RAM

FQ

QMan 帧队列

Rx Dfl FQ

默认接收 FQ

Rx Err FQ

Rx 错误帧 FQ

Tx Cnf FQ

Tx 确认 FQ

Tx FQs

传输帧队列

dtsec

数据通路三速以太网控制器 (10/100/1000 Mbps)

tgec

万兆以太网控制器 (10 Gbps)

memac

多速率以太网 MAC (10/100/1000/10000)

DPAA 以太网支持的 SoC

DPAA 驱动程序支持以下 SoC 上存在的以太网控制器:

PPC - P1023 - P2041 - P3041 - P4080 - P5020 - P5040 - T1023 - T1024 - T1040 - T1042 - T2080 - T4240 - B4860

ARM - LS1043A - LS1046A

在内核中配置 DPAA 以太网

要启用 DPAA 以太网驱动程序,需要以下 Kconfig 选项:

# common for arch/arm64 and arch/powerpc platforms
CONFIG_FSL_DPAA=y
CONFIG_FSL_FMAN=y
CONFIG_FSL_DPAA_ETH=y
CONFIG_FSL_XGMAC_MDIO=y

# for arch/powerpc only
CONFIG_FSL_PAMU=y

# common options needed for the PHYs used on the RDBs
CONFIG_VITESSE_PHY=y
CONFIG_REALTEK_PHY=y
CONFIG_AQUANTIA_PHY=y

DPAA 以太网帧处理

在接收端 (Rx),传入帧的缓冲区从专用接口缓冲区池中获取。驱动程序初始化并用单页缓冲区填充这些缓冲区。

在传输端 (Tx),所有传输的帧都通过 Tx 确认帧队列返回给驱动程序。然后驱动程序负责释放缓冲区。为了正确地做到这一点,在传输之前会向缓冲区添加一个指回 skb 的反向指针。当缓冲区通过确认 FQ 返回到驱动程序时,skb 可以被正确消耗。

DPAA 以太网功能

目前,DPAA 以太网驱动程序支持 Linux 以太网驱动程序所需的基本功能。对高级功能的支持将逐步添加。

该驱动程序支持 UDP 和 TCP 的接收 (Rx) 和发送 (Tx) 校验和卸载。目前,Rx 校验和卸载功能默认启用,无法通过 ethtool 控制。此外,还添加了 rx-flow-hash 和 rx-hashing。RSS 的加入为转发场景提供了巨大的性能提升,允许一个接口接收到的不同流量流由不同的 CPU 并行处理。

该驱动程序支持多个优先级 Tx 流量类别。优先级范围从 0(最低)到 3(最高)。这些被映射到具有严格优先级级别的硬件工作队列。每个流量类别包含 NR_CPU TX 队列。默认情况下,只启用一个流量类别并使用最低优先级的 Tx 队列。可以使用 mqprio qdisc 启用更高优先级的流量类别。例如,使用以下命令在接口上启用所有四个流量类别。此外,skb 优先级级别映射到流量类别如下:

  • 优先级 0 到 3 - 流量类别 0 (低优先级)

  • 优先级 4 到 7 - 流量类别 1 (中低优先级)

  • 优先级 8 到 11 - 流量类别 2 (中高优先级)

  • 优先级 12 到 15 - 流量类别 3 (高优先级)

tc qdisc add dev <int> root handle 1: \
       mqprio num_tc 4 map 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 hw 1

DPAA IRQ 亲和性与接收侧扩展

DPAA Rx 队列或 DPAA Tx 确认队列上的流量被 CPU 视为某个端口上的入站流量。DPAA QMan 端口中断各自绑定到一个特定的 CPU。同一个端口中断服务于所有 QMan 端口消费者。

默认情况下,DPAA 以太网驱动程序启用 RSS,利用 DPAA FMan 解析器和 Keygen 模块,通过对接收帧中存在的 IPv4/v6 源和目标以及 L4 源和目标端口进行哈希,将流量分发到 128 个硬件帧队列。当 RSS 被禁用时,特定接口接收到的所有流量都将通过默认的 Rx 帧队列接收。默认的 DPAA Rx 帧队列配置为将接收到的流量放入一个池通道,允许任何可用的 CPU 端口出队入站流量。默认帧队列设置了 HOLDACTIVE 选项,确保来自特定队列的流量突发由同一 CPU 处理。这确保了非常低的帧乱序率。缺点是,当 RSS 未启用时,每次只有一个 CPU 可以处理特定接口接收到的流量。

为了实现 RSS,DPAA 以太网驱动程序额外分配了一组 128 个 Rx 帧队列,这些队列以循环方式配置到专用通道。帧队列到 CPU 的映射现在是硬编码的,没有间接表来将特定 FQ(哈希结果)的流量移动到另一个 CPU。到达这些帧队列之一的入站流量将到达相同的端口,并且将始终由相同的 CPU 处理。这确保了流内顺序的保持和多个流量流的工作负载分布。

可以使用 ethtool 关闭特定接口的 RSS,例如:

# ethtool -N fm1-mac9 rx-flow-hash tcp4 ""

要重新开启它,需要为 tcp4/6 或 udp4/6 设置 rx-flow-hash

# ethtool -N fm1-mac9 rx-flow-hash udp4 sfdn

对于单个协议没有独立的控制,为 tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 之一运行的任何命令都将控制该接口上所有协议的 rx-flow-hashing。

除了使用 FMan Keygen 计算的哈希值将流量分散到 128 个 Rx FQ 上之外,当 NETIF_F_RXHASH 功能开启时(默认活动),DPAA 以太网驱动程序还会设置 skb 哈希值。这可以通过 ethtool 开启或关闭,例如:

# ethtool -K fm1-mac9 rx-hashing off
# ethtool -k fm1-mac9 | grep hash
receive-hashing: off
# ethtool -K fm1-mac9 rx-hashing on
Actual changes:
receive-hashing: on
# ethtool -k fm1-mac9 | grep hash
receive-hashing: on

请注意,Rx 哈希依赖于该接口的 rx-flow-hashing 是否开启——关闭 rx-flow-hashing 也会禁用 rx-hashing(ethtool 不会报告其已关闭,因为这取决于 NETIF_F_RXHASH 功能标志)。

调试

通过 ethtool 为每个接口导出以下统计信息:

  • 每个 CPU 的中断计数

  • 每个 CPU 的接收包计数

  • 每个 CPU 的发送包计数

  • 每个 CPU 的 Tx 确认包计数

  • 每个 CPU 的 Tx S/G 帧计数

  • 每个 CPU 的 Tx 错误计数

  • 每个 CPU 的 Rx 错误计数

  • 每种类型的 Rx 错误计数

  • 拥塞相关统计信息

    • 拥塞状态

    • 处于拥塞状态的时间

    • 设备进入拥塞状态的次数

    • 每种原因的丢包计数

驱动程序还在 sysfs 中导出以下信息:

  • 每种 FQ 类型的 FQ ID:/sys/devices/platform/soc/<addr>.fman/<addr>.ethernet/dpaa-ethernet.<id>/net/fm<nr>-mac<nr>/fqids

  • 正在使用的缓冲区池 ID:/sys/devices/platform/soc/<addr>.fman/<addr>.ethernet/dpaa-ethernet.<id>/net/fm<nr>-mac<nr>/bpids