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