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 驅動程式適用於兩種型別的裝置。
基本資料包流¶
入口¶
CGX LMAC 接收資料包。
將資料包轉發到 NIX 塊。
然後提交到 NPC 塊進行解析,然後進行 MCAM 查詢以獲取目標 RVU 裝置。
連線到目標 RVU 裝置的 NIX LF 從 NPA 塊 LF 的 RQ 對映緩衝區池中分配一個緩衝區。
RQ 可以透過 RSS 選擇,也可以透過使用 RQ 編號配置 MCAM 規則來選擇。
資料包已 DMA,並且驅動程式已收到通知。
出口¶
驅動程式準備傳送描述符並提交到 SQ 以進行傳輸。
SQ 已經過配置(由 AF)以在特定鏈路/通道上傳輸。
SQ 描述符環儲存在從 NPA 塊 LF 的 SQ 對映池中分配的緩衝區中。
NIX 塊在指定的通道上傳輸 pkt。
可以安裝 NPC MCAM 條目以將 pkt 分流到不同的通道上。
Devlink 健康報告器¶
NPA 報告器¶
NPA 報告器負責報告和恢復以下錯誤組
GENERAL 事件
由於未對映 PF 的操作而導致的錯誤。
由於停用了其他硬體塊(NIX、SSO、TIM、DPI 和 AURA)的分配/釋放而導致的錯誤。
ERROR 事件
由於讀取 NPA_AQ_INST_S 或寫入 NPA_AQ_RES_S 而導致的故障。
AQ 門鈴錯誤。
RAS 事件
NPA_AQ_INST_S/NPA_AQ_RES_S 的 RAS 錯誤報告。
RVU 事件
由於未對映插槽而導致的錯誤。
示例輸出
~# devlink health
pci/0002:01:00.0:
reporter hw_npa_intr
state healthy error 2872 recover 2872 last_dump_date 2020-12-10 last_dump_time 09:39:09 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_gen
state healthy error 2872 recover 2872 last_dump_date 2020-12-11 last_dump_time 04:43:04 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_err
state healthy error 2871 recover 2871 last_dump_date 2020-12-10 last_dump_time 09:39:17 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_ras
state healthy error 0 recover 0 last_dump_date 2020-12-10 last_dump_time 09:32:40 grace_period 0 auto_recover true auto_dump true
每個報告器都會轉儲
錯誤型別
錯誤暫存器值
詞語中的原因
例如
~# devlink health dump show pci/0002:01:00.0 reporter hw_npa_gen
NPA_AF_GENERAL:
NPA General Interrupt Reg : 1
NIX0: free disabled RX
~# devlink health dump show pci/0002:01:00.0 reporter hw_npa_intr
NPA_AF_RVU:
NPA RVU Interrupt Reg : 1
Unmap Slot Error
~# devlink health dump show pci/0002:01:00.0 reporter hw_npa_err
NPA_AF_ERR:
NPA Error Interrupt Reg : 4096
AQ Doorbell Error
NIX 報告器¶
NIX 報告器負責報告和恢復以下錯誤組
GENERAL 事件
由於緩衝區不足而導致接收映象/多播資料包丟棄。
SMQ 重新整理操作。
ERROR 事件
由於從多播/映象緩衝區讀取/寫入 WQE 而導致的記憶體故障。
接收多播/映象複製列表錯誤。
在未對映的 PF 上接收資料包。
由於讀取 NIX_AQ_INST_S 或寫入 NIX_AQ_RES_S 而導致的故障。
AQ 門鈴錯誤。
RAS 事件
用於 NIX 接收多播/映象條目結構的 RAS 錯誤報告。
用於從多播/映象緩衝區讀取的 WQE/資料包資料的 RAS 錯誤報告。
NIX_AQ_INST_S/NIX_AQ_RES_S 的 RAS 錯誤報告。
RVU 事件
由於未對映插槽而導致的錯誤。
示例輸出
~# ./devlink health
pci/0002:01:00.0:
reporter hw_npa_intr
state healthy error 0 recover 0 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_gen
state healthy error 0 recover 0 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_err
state healthy error 0 recover 0 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_ras
state healthy error 0 recover 0 grace_period 0 auto_recover true auto_dump true
reporter hw_nix_intr
state healthy error 1121 recover 1121 last_dump_date 2021-01-19 last_dump_time 05:42:26 grace_period 0 auto_recover true auto_dump true
reporter hw_nix_gen
state healthy error 949 recover 949 last_dump_date 2021-01-19 last_dump_time 05:42:43 grace_period 0 auto_recover true auto_dump true
reporter hw_nix_err
state healthy error 1147 recover 1147 last_dump_date 2021-01-19 last_dump_time 05:42:59 grace_period 0 auto_recover true auto_dump true
reporter hw_nix_ras
state healthy error 409 recover 409 last_dump_date 2021-01-19 last_dump_time 05:43:16 grace_period 0 auto_recover true auto_dump true
每個報告器都會轉儲
錯誤型別
錯誤暫存器值
詞語中的原因
例如
~# devlink health dump show pci/0002:01:00.0 reporter hw_nix_intr
NIX_AF_RVU:
NIX RVU Interrupt Reg : 1
Unmap Slot Error
~# devlink health dump show pci/0002:01:00.0 reporter hw_nix_gen
NIX_AF_GENERAL:
NIX General Interrupt Reg : 1
Rx multicast pkt drop
~# devlink health dump show pci/0002:01:00.0 reporter hw_nix_err
NIX_AF_ERR:
NIX Error Interrupt Reg : 64
Rx on unmapped PF_FUNC
服務質量¶
排程中使用的硬體演算法¶
octeontx2 晶片和 CN10K 傳輸介面由五個傳輸級別組成,從 SMQ/MDQ、TL4 到 TL1 開始。 每個資料包將遍歷 MDQ、TL4 到 TL1 級別。 每個級別都包含一個佇列陣列,以支援排程和整形。 硬體使用以下演算法,具體取決於排程程式佇列的優先順序。 一旦使用者建立具有不同優先順序的 tc 類,驅動程式就會配置分配給該類別的具有指定優先順序的排程程式以及速率限制配置。
嚴格優先順序
一旦資料包提交到 MDQ,硬體就會使用嚴格優先順序選擇所有具有不同優先順序的活動 MDQ。
輪循
使用輪循選擇具有相同優先順序級別的活動 MDQ。
設定 HTB 解除安裝¶
在介面上啟用 HW TC 解除安裝
# ethtool -K <interface> hw-tc-offload on
建立 htb 根
# tc qdisc add dev <interface> clsact # tc qdisc replace dev <interface> root handle 1: htb offload
建立具有不同優先順序的 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
建立具有相同優先順序和不同量子的 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