先定位入口,再分辨單播控制與多播群組
先定位入口,再分辨單播控制與多播群組
選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。
ACS(Access Control Services,存取控制服務)以收到封包的 Port 為控制點。有箭頭的實線表示直送 B,虛線表示經 UP0 往 RC 導引;要求依設定選擇其中一條路徑。
作者建立的拓撲。UP0 是 Switch Upstream Port;DP1–DP3 是 Downstream Ports。DP1 是 A 要求的入口,B 的回覆則從 DP2 進入。Port Number 與 Bus Number 是兩套資訊。
- ACS
- Access Control Services,存取控制服務
同一顆 Switch 內的裝置交易仍有路由和存取條件。普通同儕要求依 ACS 設定選路;命中多播後,改依群組阻擋與成員設定產生副本。
定位來源與入口
入口與出口隨封包方向改變;同一組設定不能代替所有 Port。
先辨認 A 的要求從 DP1 進入,再讀 DP1 的 Source Validation 與 Translation Blocking。Requester ID 的 Bus Number 要和入口 Port 的 Secondary/Subordinate 範圍一起讀。
Base 6.0 §6.12.1.1,pp.752–754。
串起 Redirect 與 vector
Translation Blocking 的優先序、完整路徑的 Upstream Forwarding,以及 Completion 的控制要分別核對。
將 Request Redirect、Egress Control、目的 Port 的 vector bit 與 Direct Translated P2P 一起帶進 Table 6-11,再追 RC 的驗證結果。
Base 6.0 §§6.12.2–6.12.3,pp.757–758;§6.12.6,pp.760–761。
多播改讀群組與各出口
同組接收不等於同時執行;多播也不把一般 Memory Read 變成多份讀取。
命中多播視窗後,先做入口的群組阻擋檢查,再依 MC_Receive 產生副本。B、C 可經各出口的地址改寫功能(MC_Overlay) 接收同一筆資料。
Base 6.0 §§6.14.1–6.14.5,pp.766–770。
先追 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 Control | AT | E | R | V | D | TB | Result |
|---|---|---|---|---|---|---|---|
| 001Dh | 00b | 0 | 1 | 1 | 0 | 0 | Redirect |
| 003Dh | 00b | 1 | 1 | 0 | 0 | 0 | Direct |
| 003Dh | 00b | 1 | 1 | 1 | 0 | 0 | Redirect |
| 0039h | 00b | 1 | 0 | 1 | 0 | 0 | ACS Violation |
| 007Dh | 10b | 1 | 1 | 1 | 1 | 0 | Direct |
| 007Fh | 10b | 1 | 1 | 1 | 1 | 1 | ACS 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,進階錯誤回報
| Register | Offset | Value | Fields |
|---|---|---|---|
| Multicast Capability | M+04h | 8003h | MC_Max_Group=3; MC_ECRC_Regeneration_Supported=1 |
| Multicast Control | M+06h | 8003h | MC_Enable=1; MC_Num_Group=3 |
| MC_Base_Address | M+08h | 000000008000000Ch | MC_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,多播群組)標示各視窗,先定位地址落在哪一格。
現在讓 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,交易層封包
| TLP | Address | AT | Block_All | Block_Untranslated | Result |
|---|---|---|---|---|---|
| Memory Write | 80002500h | 10b | 0000000000000000h | 0000000000000004h | DP2 + DP3 |
| Memory Write | 80002500h | 00b | 0000000000000000h | 0000000000000004h | MC Blocked TLP |
| Memory Write | 80002500h | 10b | 0000000000000004h | 0000000000000000h | MC Blocked TLP |
| Memory Read | 80002500h | 00b | 0000000000000004h | 0000000000000004h | Unicast |
| Memory Write | 80004000h | 10b | 0000000000000000h | 0000000000000000h | Unicast |
- TLP
- Transaction Layer Packet,交易層封包
通過入口檢查後,用各 Port 的 MC_Receive[2] 選出口。MCG 的 bit2 的 mask 是 0000000000000004h。DP2 和 DP3 都設為一,因此各取得一份;UP0 沒設,所以沒有預設往上游送的副本。DP1 即使自己的 bit2 也為一,仍不得送回這次的入口。
| Port | MC_Receive | Ingress? | MC_Overlay_BAR | Result |
|---|---|---|---|---|
| UP0 | 0000000000000000h | No | 0000000000000000h | No copy |
| DP1 | 0000000000000004h | Yes | 0000000000000000h | No return |
| DP2 | 0000000000000004h | No | 000000009000000Ch | 90000500h |
| DP3 | 0000000000000004h | No | 00000000A000000Ch | A0000500h |
若所有可用出口的 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 能力處理:
| Overlay | Incoming ECRC | Regeneration | Forwarding |
|---|---|---|---|
| Off | Any | Any | Unmodified |
| On | Absent | Any | Modified address |
| On | Present | Unsupported | Drop ECRC; TD=0 |
| On | Pass | Supported | Regenerated ECRC |
| On | Fail | Supported | Inverted 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 或多播設定本身不足以證明完整安全隔離或應用工作完成。