PCIe Chapter 28:ACS、Peer-to-Peer 與 Multicast

兩張卡在同一顆 Switch 下,路徑仍由入口控制決定。本章先以 ACS 帶讀直送、導引與阻擋,再用四個視窗、兩個出口的 Multicast 案例,連到成員設定、Overlay 與 ECRC。

ACS
Access Control Services,存取控制服務
ECRC
End-to-End CRC,端到端循環冗餘檢查
入口 DP1 判讀控制,再選擇適用路徑A 的要求從 DP1 進入,依 ACS 控制直送 B 或經 UP0 往 RC 導引。C 是後段多播案例的另一個接收端。Switch: UP0 + DP1 / DP2 / DP3Root Complex / Root PortUP0: Port 0DP1: Port 1 / ACSDP2: Port 2 / ACSDP3: Port 3 / ACSEndpoint A: 03:00.0Endpoint B: 04:00.0Endpoint C: 05:00.0Request直送經 UP0 往 RC 導引
作者建立的拓撲。UP0 是 Switch Upstream Port;DP1–DP3 是 Downstream Ports。A 的要求在 DP1 判讀,B 的回覆改在 DP2 判讀。實線與虛線是條件選路,RC 的驗證另須追蹤。
ACS
Access Control Services,存取控制服務

先追 A 到 B:在哪一個 Port 讀 ACS?

本例先處理單播。A 的要求從 DP1 進入 Switch,再由地址選出通往 B 的 DP2。DP1 是這次的 Ingress Port(封包進入的埠),DP2 是候選 Egress Port(封包離開的埠);判斷 P2P(Peer-to-Peer,同儕間交易)時,先讀入口 DP1 的 ACS(Access Control Services,存取控制服務),不能拿 DP2 的設定代替。

【模擬資料】以下資料為教學用途建立,不代表特定硬體或平台。UP0 的 Port Number 為 0,DP1/DP2/DP3 分別為 1/2/3;A、B、C 的 Requester ID 分別是 0300h/0400h/0500h。DP1 的 Secondary/Subordinate Bus Number 均為 03h,未啟用 FPB。B 的 BAR 範圍為 90000000h–90000FFFh,C 為 A0000000h–A0000FFFh。必要資源、Window、Memory Space Enable、Bus Master Enable 與 Link 傳輸均已就緒。封包案例採 Non-Flit Mode,沒有 Reset 或 Replay 事件。

FPB
Flattening Portal Bridge,扁平化入口橋接器
BAR
Base Address Register,基底位址暫存器

A 發出四個位元組的 Memory Write,目標 90000500h、AT=00b。AT(Address Type,位址類型)沿用 Chapter 27 的定義。這裡先追路由選擇;Posted Write 沒有一般 Completion,目的裝置的內部寫入結果仍需另有觀察。

Base 6.0 §§6.12–6.12.1.1,pp.751–755;基本地址與 Window 路由見 Chapter 5。

從 Capability 到 vector bit,如何把設定接起來?

先走 Capability 鏈結找到 ID=000Dh、Version=1,再依 Figure 7-131 定位結構,不能假設固定起點。把 DP1 的結構起點記作 A:A+04h 是 ACS Capability,A+06h 是 ACS Control,A+08h 起才是 Egress Control Vector。

假設 Capability=087Fh。依 Figure 7-133/Table 7-117,bits6:0 表示前七項控制均支援,bit7=0 表示未支援 ACS Enhanced Capability,bits15:8=08h 表示 vector 有八個有效 bits。這只是能力;本次 Control=001Dh,啟用 Source Validation、P2P Request Redirect、P2P Completion Redirect 及 Upstream Forwarding,Translation Blocking、P2P Egress Control、Direct Translated P2P 均未啟用。

若接下來要針對 B 選擇性控制,就依 §7.7.11.4 找Port Number=2 對應的 bit2。Equation 7-4 給出相對位移 08h+(2 div 32)×4=08h、DW 內 bit=2;mask 為 00000004h。這個索引用 Port Number,不是 B 的 Bus Number、Function Number 或 Analyzer 通道號碼。vector 是否參與判斷,還要看 Egress Control Enable。

DW
Double Word,4 bytes的資料單位

Size=00h 在支援 Egress Control 時表示 256 bits;若 Capability 的 P2P Egress Control=0,Size 為 undefined,vector 也不一定存在。查找結構和支援能力仍須先做。

Base 6.0 §§7.7.11–7.7.11.4,Figures 7-131–7-135、Tables 7-116–7-119、Equation 7-4,pp.1083–1089。

同一個目的位址,哪些設定會改變路徑?

先做兩項入口檢查。Source Validation 啟用時,A 的 Requester ID 內 Bus=03h 落在 DP1 的 03h–03h 範圍,符合本例條件;若改成 0600h,就會形成 ACS Violation。這只驗證規格定義的來源範圍,不等於驗證了程序身分或每個資料位址的授權。

Translation Blocking 啟用時,入口收到 AT 不是預設 00b 的上游 Memory Request,須先按 ACS Violation 處理;這項檢查優先於 Upstream Forwarding 及 P2P 控制。通過入口檢查後,再讀 Table 6-11。

下表各列是獨立的設定比較,不是軟體必須依序寫入的操作。E 是 P2P Egress Control Enable,R 是 P2P Request Redirect Enable,V 是 DP1 vector 中對應 DP2 的 bit2;D 是 Direct Translated P2P Enable,TB 是 Translation Blocking Enable。比較 Translated Request 的列,另假設 A 已合法取得相應轉譯及寫入權限;Direct 與 Redirect 共同啟用時,也已符合 §6.12.6.2 的排序前提。

ACS ControlATERVDTBResult
001Dh00b01100Redirect
003Dh00b11000Direct
003Dh00b11100Redirect
0039h00b10100ACS Violation
007Dh10b11110Direct
007Fh10b11111ACS Violation

從第一列走正常案例:E=0、R=1,因此要求往 RC 導引。第二列改為 E=1、R=1、V=0,Table 6-11 指定直送 B;V=1 才導引。若 E=1、R=0、V=1,則在 DP1 形成 ACS Violation。表中的 R=1 因此仍須配合 E 與 V 閱讀。

AT=10b 且 D=1 時,Direct Translated P2P 會覆蓋 Request Redirect 與 Egress Control,讓適用的 Memory Request 正常直送。但最後一列 TB=1,較早的 Translation Blocking 已要求報錯,D 不會解除這個阻擋。這裡的 Direct 仍以合法路由、能力與授權為前提。

Base 6.0 §6.12.1.1,pp.752–754;§6.12.3、Table 6-11,pp.757–758;Table 7-118,pp.1087–1088;排序條件 §6.12.6.2,p.761。

要求已往上送,回覆與錯誤要從哪裡接著看?

回到 Control=001Dh 的案例。從導引點到 Root Port 的必要 ACS Upstream Forwarding 必須有效,RC 也須具有 Redirected Request Validation。遇到原本會沿同一個下游出口折回的封包,這項控制讓封包繼續往上;未啟用時的相應處理是 undefined。一般單 Function Switch Upstream Port 不因此需要 ACS Capability,不能要求每個 Port 都出現相同結構。

RC 的驗證邏輯決定要求可反射回下游,還是按 ACS Violation 阻擋;演算法和特定控制由平台定義。Root Port 宣告 Redirect 能力,不保證 RC 支援任何程度的 P2P。本例另假設 RC 驗證通過,要求經 Root Port、Switch UP0、DP2 反射到 B。這段往下游傳送的要求不再由 Downstream Port 的 Request Redirect 往上導引;B 是否完成內部寫入,仍須接著觀察。

再另看 A 先前 Memory Read 所對應、由 B 返回的 Completion。回覆從 DP2 進入 Switch,因此讀 DP2 的 Completion Redirect 設定。假設該控制已啟用:RO(Relaxed Ordering,放寬排序屬性)=0 的同儕 Completion 須往上導引;RO=1 則正常路由。Request Redirect、Egress Control 及 Translation Blocking 都不作用於 Completion。

這段安排是為了避免直達的 non-RO Completion 越過被導引的 Posted Request。若同時使用直達和導引路徑,須依 §6.12.6 的條件分析;速度或跳數較少並非設定合法性的判準。完整 Passing 規則連回 Chapter 15。

若確實發生 ACS Violation,Non-Posted Request 須收到 CA(Completer Abort,完成端中止)Completion;Posted Write 則沒有這種一般回覆。負責處理的元件記錄的是 ACS Violation,不是因回覆 CA 就改記 Completer Abort Error;還須依 §6.12.5 處理目標中止狀態及錯誤上報。AER 的記錄與通知流程見 Chapter 12。

AER
Advanced Error Reporting,進階錯誤回報

Base 6.0 §6.12.1.1,pp.753–754;§6.12.1.3,p.756;§6.12.2,p.757;§§6.12.5–6.12.6.2,pp.759–761。

要把同一筆寫入送給 B 和 C,先找哪一個群組?

接著加入 Multicast(多播):讓一筆 Posted Request 依群組複製到多個出口。先讀 Figure 6-14 的視窗,再讀 §6.14.1 的命中條件,最後才選成員。Memory Write 或 Address Routed Message 才可能命中;Memory Read 屬 Non-Posted Request,即使位址在相同視窗內,仍按一般單播處理。

本段的設定另為教學建立。Switch 的所有相關結構均已一致設定 MC_Enable、MC_Num_Group、MC_Base_Address、MC_Index_Position;A、B、C 都不實作 Multicast Capability,B、C 透過後面的 Overlay 接收。兩個出口均支援 ECRC regeneration,所需 AER 與 ECRC Check Capable 已具備。以 Multicast ID=0012h、Version=1 的結構起點 M 為例:

ECRC
End-to-End CRC,端到端循環冗餘檢查
AER
Advanced Error Reporting,進階錯誤回報
RegisterOffsetValueFields
Multicast CapabilityM+04h8003hMC_Max_Group=3; MC_ECRC_Regeneration_Supported=1
Multicast ControlM+06h8003hMC_Enable=1; MC_Num_Group=3
MC_Base_AddressM+08h000000008000000ChMC_Base_Address=80000000h; MC_Index_Position=12

從 Figure 7-272 找到 Register,再看 Tables 7-244–7-246。MC_Max_Group=3 是最多四群,MC_Num_Group=3 是目前用四群,兩者都以數量減一編碼。MC_Index_Position=12 表示每窗 212=4 KiB。MC_Base_Address Register 的低六 bits 是 Index Position,所以原始 64-bit 值末尾的 0Ch 不是基址的一部分。MC_Enable=1 時,Index Position 小於 12 或 Num_Group 大於 Max_Group 都是 undefined;基址中低於 Index Position 及承載群組編號的地址 bits 也必須為零。

以下以 MCG(Multicast Group,多播群組)標示各視窗,先定位地址落在哪一格。

四個視窗決定群組,再由成員設定選出口80002500h 落在群組 2,再由接收位元選 DP2 與 DP3。UP0 不接收,DP1 不送回入口。MC_Base_Address=80000000h; MC_Index_Position=12MCG 080000000h–80000FFFhMCG 180001000h–80001FFFhMCG 280002000h–80002FFFhMCG 380003000h–80003FFFh80002500h → MCG 2; offset=500hMC_Receive[2]=1:DP2 → B;DP3 → CUP0 的 bit2=0;DP1 不送回入口
作者依 Figure 6-14 繪製。位址先選群組,再讀各 Port 的接收位元;MCG(群組編號)=2 並不等於 Port 2。

現在讓 A 送四個位元組的 Memory Write,位址 80002500h、AT=10b,且已合法取得轉譯與權限。以 §6.14.1 的公式計算:MCG=((80002500h−80000000h)>>12)&3Fh=2,頁內 offset=500h。整體命中範圍為 80000000h–80003FFFh;上限 80004000h 不包含在內。

MC_Enable=1、封包類型及位址範圍都符合,才成立 Multicast Hit。此後普通地址解碼由多播處理取代,ACS 只有 Source Validation 仍可能適用;前面的 P2P Request Redirect、Egress Control 甚至 Translation Blocking 都不決定這次多播的出口。

Base 6.0 §§6.14–6.14.1、Figure 6-14,pp.765–768;§§7.9.11–7.9.11.4,Figures 7-272–7-276、Tables 7-243–7-246,pp.1230–1234。

算出 MCG=2 後,如何決定複製、阻擋或丟棄?

先在入口 DP1 查看 MC_Block_All[2] 和 MC_Block_Untranslated[2]。本例前者為 0、後者為 1;AT=10b 的要求通過這項多播權限檢查。若換成 AT=00b,就按 MC Blocked TLP 處理,不會改走 ACS Redirect。以下把單筆條件改變後的結果放在同一張表:

TLP
Transaction Layer Packet,交易層封包
TLPAddressATBlock_AllBlock_UntranslatedResult
Memory Write80002500h10b0000000000000000h0000000000000004hDP2 + DP3
Memory Write80002500h00b0000000000000000h0000000000000004hMC Blocked TLP
Memory Write80002500h10b0000000000000004h0000000000000000hMC Blocked TLP
Memory Read80002500h00b0000000000000004h0000000000000004hUnicast
Memory Write80004000h10b0000000000000000h0000000000000000hUnicast
TLP
Transaction Layer Packet,交易層封包

通過入口檢查後,用各 Port 的 MC_Receive[2] 選出口。MCG 的 bit2 的 mask 是 0000000000000004h。DP2 和 DP3 都設為一,因此各取得一份;UP0 沒設,所以沒有預設往上游送的副本。DP1 即使自己的 bit2 也為一,仍不得送回這次的入口。

PortMC_ReceiveIngress?MC_Overlay_BARResult
UP00000000000000000hNo0000000000000000hNo copy
DP10000000000000004hYes0000000000000000hNo return
DP20000000000000004hNo000000009000000Ch90000500h
DP30000000000000004hNo00000000A000000ChA0000500h

若所有可用出口的 MC_Receive[2] 都為零,封包會無聲丟棄。這和命中 MC_Block_All/MC_Block_Untranslated 不同:後者丟棄封包並依 §6.14.4 記錄及上報 MC Blocked TLP,由阻擋入口負責處理。兩種情況都不是替 Posted Write 回一筆一般 Completion。

多播沿複製前的 ingress stream 與複製後各自的 egress stream 遵守既有 Posted Ordering;規格沒有因此提供所有接收裝置同時執行或全有全無完成的保證。

Base 6.0 §6.14.1,pp.766–768;§6.14.2,p.768;§6.14.4,p.769;§§7.9.11.5–7.9.11.7,Figures 7-277–7-279、Tables 7-247–7-249,pp.1234–1235。

B 和 C 只有一般 BAR,多播地址如何送進去?

BAR
Base Address Register,基底位址暫存器

上表的 DP2/DP3 啟用 MC_Overlay(出口地址改寫),所以 B 和 C 可用一般 BAR 接收。依 Figure 7-280/Table 7-250,DP2 的原始值 000000009000000Ch 表示 MC_Overlay_BAR 基底 90000000h、MC_Overlay_Size=12;DP3 則對應 A0000000h。Overlay Size 小於 6 代表停用,不能把零解成一個 byte 的視窗。

依 Equation 6-1,保留入口地址的 bits 11:0,其他 bits 取自各出口 Overlay 基底。因此 80002500h 經 DP2 變成 90000500h,經 DP3 變成 A0000500h,各落在先前配置的 BAR 範圍。Overlay 只在封包離開 Port 時作用,不在入口先改地址;它也沒有替端點建立 BAR 或資源配置。

如果封包含 ECRC(End-to-End CRC,TLP 的端到端完整性檢查碼),地址改變也會影響檢查結果。先讀 Table 6-12,再依每個出口的 regeneration 能力處理:

依 Table 6-12,逐份處理各出口的副本。
OverlayIncoming ECRCRegenerationForwarding
OffAnyAnyUnmodified
OnAbsentAnyModified address
OnPresentUnsupportedDrop ECRC; TD=0
OnPassSupportedRegenerated ECRC
OnFailSupportedInverted regenerated ECRC

本例原始 ECRC 通過檢查,DP2、DP3 各以改寫後內容重算。若原始檢查失敗,支援 regeneration 的出口須送出反相的重算 ECRC,保留錯誤可被偵測的結果;不能靠重新計算把舊錯誤掩蓋掉。若出口不支援 regeneration,則移除 ECRC 並清 TD。本例的輸出地址、ECRC 與裝置實際消費資料是接續的觀察項目,不由「已複製」一次確認。

Base 6.0 §6.14.5,Equation 6-1、Table 6-12,pp.769–770;§7.9.11.8,Figure 7-280/Table 7-250,p.1236;ECRC regeneration 支援條件 Table 7-244,p.1232。

下次卡在 P2P 或多播,如何串起查閱順序?

先把來源、目標、Ingress/Egress Port 和封包方向畫清楚,再確認能力與設定。普通同儕要求沿 Source Validation、Translation Blocking、Direct Translated P2P 及 Table 6-11 查路徑,接著追 RC 驗證、Completion 和錯誤;多播則先核對命中,再追入口阻擋、MC_Receive、副本出口及 Overlay。不要用接收端沒看到資料,直接跳到唯一故障元件。

要更改多播基址或 Index Position,先依 §6.14.3 在整個 Component 的各 Function 清除 MC_Enable;一致性欄位不一致時結果為 indeterminate。其他允許隨時更新的欄位也有更新順序要求,不能把上述靜態比較表當成運作中的安全重配置程序。Linux P2P 政策、IOMMU 佈署和驅動協調另依實際平台文件。

Base 6.0 §6.14.3,p.769;§7.9.11,p.1230。

版本與完整來源路線

本章以 PCI Express Base Specification Revision 6.0(6.0-1.0-PUB)為準;下列印刷頁與 PDF 檢視器頁碼相同。拓撲、Register 值、封包與分支均為作者建立,沒有操作硬體。本章不以外部網站作 PCIe 技術依據。

依查閱目的展開完整來源
  • 控制點與適用範圍:§6.12 Access Control Services (ACS)、§6.12.1 ACS Component Capability Requirements、§§6.12.1.1–6.12.1.3,pp.751–756;Source Validation、Translation Blocking、Redirect、Upstream Forwarding 與不同 Function 類型。
  • 導引交互作用:§6.12.2 Interoperability、§6.12.3 ACS Peer-to-Peer Control Interactions,Table 6-11 ACS P2P Request Redirect and ACS P2P Egress Control Interactions,pp.757–758;§6.12.5 ACS Violation Error Handling,pp.759–760;§6.12.6 ACS Redirection Impacts on Ordering Rules、§§6.12.6.1–6.12.6.2,pp.760–761。
  • ACS 欄位:§7.7.11 ACS Extended Capability、§§7.7.11.1–7.7.11.4,pp.1083–1089;Figures 7-131–7-135,依序為 ACS Extended Capability、ACS Extended Capability Header、ACS Capability Register、ACS Control Register、Egress Control Vector Register;Tables 7-116–7-119;Equation 7-4 Egress Control Vector Access,p.1088。
  • 多播命中與成員:§6.14 Multicast Operations、§6.14.1 Multicast TLP Processing,pp.765–768;Figure 6-14 Segmentation of the Multicast Address Range,p.766;§6.14.2 Multicast Ordering,p.768;§6.14.3 Multicast Capability Structure Field Updates、§6.14.4 MC Blocked TLP Processing,p.769。
  • 地址改寫與保護:§6.14.5 MC_Overlay Mechanism,pp.769–770;Equation 6-1 MC_Overlay Transform rules、Table 6-12 ECRC Rules for MC_Overlay,p.770。
  • 多播配置:§7.9.11 Multicast Extended Capability、§§7.9.11.1–7.9.11.8,pp.1230–1236;Figure 7-272 Multicast Extended Capability Structure,p.1231;Figures 7-273–7-280、Tables 7-243–7-250 依序定位 Header、Capability、Control、MC_Base_Address、MC_Receive、MC_Block_All、MC_Block_Untranslated、MC_Overlay_BAR。
  • 平台邊界:Root Complex 的驗證演算法、IOMMU 部署、作業系統是否允許 P2P、驅動如何協調及裝置內部資料持久性,需實際平台、作業系統與裝置文件。ACS 或多播設定本身不足以證明完整安全隔離或應用工作完成。
Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...