Marvell OcteonTx2 RVU 核心驅動程式

版權所有 (c) 2020 Marvell International Ltd.

目錄

概述

Marvell OcteonTX2 SOC 上的資源虛擬化單元 (RVU) 將網路、加密和其他功能塊中的硬體資源對映到 PCI 相容的物理和虛擬功能中。 每個功能塊又具有多個本地功能 (LF),用於配置到 PCI 裝置。 RVU 支援多個 PCIe SRIOV 物理功能 (PF) 和虛擬功能 (VF)。 PF0 稱為管理/管理功能 (AF),並具有將 RVU 功能塊的 LF 配置到每個 PF/VF 的許可權。

RVU 管理的網路功能塊
  • 網路池或緩衝區分配器 (NPA)

  • 網路介面控制器 (NIX)

  • 網路解析器 CAM (NPC)

  • 計劃/同步/排序單元 (SSO)

  • 環回介面 (LBK)

RVU 管理的非網路功能塊
  • 加密加速器 (CPT)

  • 計劃定時器單元 (TIM)

  • 計劃/同步/排序單元 (SSO) 用於網路和非網路用例

資源配置示例
  • 具有 NIX-LF 和 NPA-LF 資源的 PF/VF 用作純網路裝置

  • 具有 CPT-LF 資源的 PF/VF 用作純加密解除安裝裝置。

RVU 功能塊可以根據軟體要求進行高度配置。

韌體在核心啟動之前執行以下設定
  • 根據物理鏈路的數量啟用所需數量的 RVU PF。

  • 每個 PF 的 VF 數量是靜態的或可在編譯時配置。 根據配置,韌體會將 VF 分配給每個 PF。

  • 還將 MSIX 向量分配給每個 PF 和 VF。

  • 這些在核心啟動後不會更改。

驅動程式

Linux 核心將有多個驅動程式註冊到 RVU 的不同 PF 和 VF。 對於網路,將有 3 種類型的驅動程式。

管理功能驅動程式

如上所述,RVU PF0 稱為管理功能 (AF),此驅動程式支援功能塊的資源配置和配置。 不處理任何 I/O。 它設定了一些基本的東西,但大多數功能是透過來自 PF 和 VF 的配置請求來實現的。

PF/VF 透過共享記憶體區域(郵箱)與 AF 通訊。 收到請求後,AF 會進行資源配置和其他硬體配置。 AF 始終連線到主機核心,但 PF 及其 VF 可以由主機核心本身使用,也可以連線到 VM 或使用者空間應用程式(如 DPDK 等)。 因此,AF 必須處理來自任何域的任何裝置傳送的配置/配置請求。

AF 驅動程式還與底層韌體互動以
  • 管理物理乙太網鏈路,即 CGX LMAC。

  • 檢索速度、雙工、自動協商等資訊

  • 檢索 PHY EEPROM 和統計資訊。

  • 配置 FEC、PAM 模式

從純網路方面來看,AF 驅動程式支援以下功能。
  • 將物理鏈路對映到已註冊 netdev 的 RVU PF。

  • 將 NIX 和 NPA 塊 LF 連線到 RVU PF/VF,後者為常規網路功能提供緩衝區池、RQ、SQ。

  • 流控制(暫停幀)啟用/停用/配置。

  • HW PTP 時間戳相關配置。

  • NPC 解析器配置檔案,基本上是如何解析 pkt 以及要提取什麼資訊。

  • NPC 提取配置檔案,從 pkt 中提取什麼以匹配 MCAM 條目中的資料。

  • 管理 NPC MCAM 條目,根據請求可以構建和安裝請求的資料包轉發規則。

  • 定義接收端縮放 (RSS) 演算法。

  • 定義分段解除安裝演算法(例如 TSO)

  • VLAN 剝離、捕獲和插入配置。

  • SSO 和 TIM 塊配置,提供資料包排程支援。

  • Debugfs 支援,用於檢查當前的資源配置、NPA 池的當前狀態、NIX RQ、SQ 和 CQ、各種統計資訊等,這有助於除錯問題。

  • 還有更多。

物理功能驅動程式

此 RVU PF 處理 IO,對映到物理乙太網鏈路,並且此驅動程式註冊 netdev。 這支援 SR-IOV。 如上所述,此驅動程式透過郵箱與 AF 通訊。 為了從物理鏈路檢索資訊,此驅動程式與 AF 通訊,AF 從韌體獲取該資訊並響應,即無法直接與韌體通訊。

支援 ethtool 用於配置鏈路、RSS、佇列計數、佇列大小、流控制、ntuple 過濾器、轉儲 PHY EEPROM、配置 FEC 等。

虛擬功能驅動程式

有兩種型別的 VF:VF 與其父 SR-IOV PF 共享物理鏈路,以及使用內部 HW 環回通道 (LBK) 成對工作的 VF。

型別 1
  • 這些 VF 及其父 PF 共享物理鏈路,用於外部通訊。

  • VF 無法直接與 AF 通訊,它們將 mbox 訊息傳送到 PF,PF 將其轉發到 AF。 AF 處理後,響應 PF,PF 將回復轉發到 VF。

  • 從功能角度來看,PF 和 VF 之間沒有區別,因為相同型別的硬體資源都附加到兩者。 但是使用者只能從 PF 配置一些東西,因為 PF 被視為鏈路的所有者/管理員。

型別 2
  • RVU PF0(即管理功能)建立這些 VF 並將其對映到環回塊的通道。

  • 一組兩個 VF(VF0 和 VF1、VF2 和 VF3 等)作為一對工作,即從 VF0 傳送的資料包將由 VF1 接收,反之亦然。

  • 應用程式或虛擬機器可以使用這些 VF 在它們之間進行通訊,而無需將流量傳送到外部。 HW 中沒有交換機,因此支援環回 VF。

  • 這些透過 mbox 直接與 AF (PF0) 通訊。

除了用於資料包接收和傳輸的 IO 通道或鏈路之外,這些 VF 型別之間沒有其他區別。 AF 驅動程式負責 IO 通道對映,因此相同的 VF 驅動程式適用於兩種型別的裝置。

基本資料包流

入口

  1. CGX LMAC 接收資料包。

  2. 將資料包轉發到 NIX 塊。

  3. 然後提交到 NPC 塊進行解析,然後進行 MCAM 查詢以獲取目標 RVU 裝置。

  4. 連線到目標 RVU 裝置的 NIX LF 從 NPA 塊 LF 的 RQ 對映緩衝區池中分配一個緩衝區。

  5. RQ 可以透過 RSS 選擇,也可以透過使用 RQ 編號配置 MCAM 規則來選擇。

  6. 資料包已 DMA,並且驅動程式已收到通知。

出口

  1. 驅動程式準備傳送描述符並提交到 SQ 以進行傳輸。

  2. SQ 已經過配置(由 AF)以在特定鏈路/通道上傳輸。

  3. SQ 描述符環儲存在從 NPA 塊 LF 的 SQ 對映池中分配的緩衝區中。

  4. NIX 塊在指定的通道上傳輸 pkt。

  5. 可以安裝 NPC MCAM 條目以將 pkt 分流到不同的通道上。

服務質量

排程中使用的硬體演算法

octeontx2 晶片和 CN10K 傳輸介面由五個傳輸級別組成,從 SMQ/MDQ、TL4 到 TL1 開始。 每個資料包將遍歷 MDQ、TL4 到 TL1 級別。 每個級別都包含一個佇列陣列,以支援排程和整形。 硬體使用以下演算法,具體取決於排程程式佇列的優先順序。 一旦使用者建立具有不同優先順序的 tc 類,驅動程式就會配置分配給該類別的具有指定優先順序的排程程式以及速率限制配置。

  1. 嚴格優先順序

    • 一旦資料包提交到 MDQ,硬體就會使用嚴格優先順序選擇所有具有不同優先順序的活動 MDQ。

  2. 輪循

    • 使用輪循選擇具有相同優先順序級別的活動 MDQ。

設定 HTB 解除安裝

  1. 在介面上啟用 HW TC 解除安裝

    # ethtool -K <interface> hw-tc-offload on
    
  2. 建立 htb 根

    # tc qdisc add dev <interface> clsact
    # tc qdisc replace dev <interface> root handle 1: htb offload
    
  3. 建立具有不同優先順序的 tc 類

    # tc class add dev <interface> parent 1: classid 1:1 htb rate 10Gbit prio 1
    
    # tc class add dev <interface> parent 1: classid 1:2 htb rate 10Gbit prio 7
    
  4. 建立具有相同優先順序和不同量子的 tc 類

    # tc class add dev <interface> parent 1: classid 1:1 htb rate 10Gbit prio 2 quantum 409600
    
    # tc class add dev <interface> parent 1: classid 1:2 htb rate 10Gbit prio 2 quantum 188416
    
    # tc class add dev <interface> parent 1: classid 1:3 htb rate 10Gbit prio 2 quantum 32768
    

RVU 代表器

RVU 代表器驅動程式增加了對在系統中為 RVU PF 的 VF 建立代表器裝置的支援。 當用戶啟用 switchdev 模式時,將建立代表器裝置。 可以在設定 SRIOV numVFs 之前或之後啟用 Switchdev 模式。 所有代表器裝置共享一個 NIXLF,但每個裝置都有專用的 Rx/Tx 佇列。 RVU PF 代表器驅動程式為每個 Rx/Tx 佇列對註冊一個單獨的 netdev。

當前 HW 不支援內建交換機,該交換機可以執行 L2 學習並在被代表者和代表器之間轉發資料包。 因此,透過設定適當的 NPC MCAM 過濾器來實現被代表者和其代表器之間的資料包路徑。 匹配這些過濾器的傳輸資料包將透過硬體環回通道/介面(即,而不是將它們傳送到 MAC 介面之外)進行環回。 這將再次匹配已安裝的過濾器並將被轉發。 這樣就可以實現被代表者 => 代表器和代表器 => 被代表者資料包路徑。 當建立代表器時會安裝這些規則,並根據代表器/被代表者介面狀態啟用/停用。

使用示例

  • 將裝置更改為 switchdev 模式

    # devlink dev eswitch set pci/0002:1c:00.0 mode switchdev
    
  • 系統上代表器裝置列表

    # ip link show
    Rpf1vf0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether f6:43:83:ee:26:21 brd ff:ff:ff:ff:ff:ff
    Rpf1vf1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 12:b2:54:0e:24:54 brd ff:ff:ff:ff:ff:ff
    Rpf1vf2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 4a:12:c4:4c:32:62 brd ff:ff:ff:ff:ff:ff
    Rpf1vf3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether ca:cb:68:0e:e2:6e brd ff:ff:ff:ff:ff:ff
    Rpf2vf0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 06:cc:ad:b4:f0:93 brd ff:ff:ff:ff:ff:ff
    

要從系統中刪除代表器裝置。 將裝置更改為舊模式。

  • 將裝置更改為舊模式

    # devlink dev eswitch set pci/0002:1c:00.0 mode legacy
    

可以使用 devlink 埠管理 RVU 代表器(請參閱Documentation/networking/devlink/devlink-port.rst)介面。

  • 顯示代表器的 devlink 埠

    # devlink port
    pci/0002:1c:00.0/0: type eth netdev Rpf1vf0 flavour physical port 0 splittable false
    pci/0002:1c:00.0/1: type eth netdev Rpf1vf1 flavour pcivf controller 0 pfnum 1 vfnum 1 external false splittable false
    pci/0002:1c:00.0/2: type eth netdev Rpf1vf2 flavour pcivf controller 0 pfnum 1 vfnum 2 external false splittable false
    pci/0002:1c:00.0/3: type eth netdev Rpf1vf3 flavour pcivf controller 0 pfnum 1 vfnum 3 external false splittable false
    

功能屬性

RVU 代表器支援代表器的功能屬性。 代表器的埠功能配置透過 devlink eswitch 埠支援。

MAC 地址設定

RVU 代表器驅動程式支援 devlink 埠功能屬性機制來設定 MAC 地址。 (請參閱Devlink 埠

  • 要為埠 2 設定 MAC 地址

    # devlink port function set pci/0002:1c:00.0/2 hw_addr 5c:a1:1b:5e:43:11
    # devlink port show pci/0002:1c:00.0/2
    pci/0002:1c:00.0/2: type eth netdev Rpf1vf2 flavour pcivf controller 0 pfnum 1 vfnum 2 external false splittable false
    function:
            hw_addr 5c:a1:1b:5e:43:11
    

TC 解除安裝

rvu 代表器驅動程式實現了對使用埠代表器解除安裝 tc 規則的支援。

  • 丟棄 vlan id 為 3 的資料包

    # tc filter add dev Rpf1vf0 protocol 802.1Q parent ffff: flower vlan_id 3 vlan_ethtype ipv4 skip_sw action drop
    
  • 將 vlan id 為 5 的資料包和 IPv4 資料包重定向到 eth1,剝離 vlan 標頭後。

    # tc filter add dev Rpf1vf0 ingress protocol 802.1Q flower vlan_id 5 vlan_ethtype ipv4 skip_sw action vlan pop action mirred ingress redirect dev eth1