QorIQ DPAA 以太网驱动程序

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

DPAA 以太网概述

DPAA 代表数据路径加速架构,它是在 PowerPC 和 ARM64 上几代 SoC 上可用的一组网络加速 IP。

Freescale 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 FQ

传输帧队列

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(最高)。 这些被映射到具有严格优先级级别的 HW 工作队列。 每个流量类别包含 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 亲和性和接收端缩放

CPU 将 DPAA Rx 队列或 DPAA Tx 确认队列上的流量视为特定门户上的入口流量。 DPAA QMan 门户中断每个都与特定的 CPU 相关。 同一个门户中断服务于所有 QMan 门户使用者。

默认情况下,DPAA 以太网驱动程序启用 RSS,利用 DPAA FMan 解析器和密钥生成块,使用 IP v4/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 的 Rx 数据包计数

  • 每个 CPU 的 Tx 数据包计数

  • 每个 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