先看一個封包如何通過相鄰兩端
選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。
主案例把 Chapter 7 的通知路徑放大到裝置與 Switch(交換器)之間。時間由上往下;本圖只畫一條連線上的正常傳送。
一個封包送出前,兩端要先建立連線,發送端也要確認接收空間。封包送出後,資料連結層負責這一跳的檢查與重送。本章依這條主線帶讀訓練狀態、速率欄位、流量控制與可靠傳遞。
必要前情:前幾章已建立裝置與記憶體之間的交易路徑。本章只觀察 Switch(交換器)的 Downstream Port(下游連接埠)02:01.0 與 Endpoint(階層末端裝置)03:00.0 之間的 Link(連線)。
規格閱讀路線:Figure 4-48 的訓練 → Figure 3-2 的資料連結狀態 → Figures 7-38、7-39、7-29 的支援/設定/現況 → Tables 2-44/2-45 的額度 → Figures 3-17、3-21、3-22 的可靠傳遞。
建立可用連線
本例使用 Non-Flit Mode(以個別交易封包進行可靠傳遞的模式)。
先沿 Figure 4-48 讀連線訓練,再接到 Figure 3-2 的資料連結初始化。兩端完成適用的初始化工作,才進入可用的資料連結狀態。
Base 6.0 Figure 4-48(p.454)、Figure 3-2(p.265)。
先檢查接收空間
本圖假設所需額度已足夠;本章稍後再看空間不足時的等待。
發送端依 Table 2-45 找到這種封包所需的 credit(接收緩衝額度)。接收端公布的額度足夠,並滿足排序與仲裁等條件後,封包才可送出。
Base 6.0 §2.6.1、Tables 2-44/2-45(pp.236–237)。
傳送並保留副本
這裡沿用 Non-Flit Mode 的個別封包傳遞;後面的固定區塊模式比較另行說明。
發送端為交易封包加入序號與檢查碼,保留需要重送時使用的副本。Figure 3-17 顯示交易封包外增加的這些資訊。
Base 6.0 Figure 3-17(p.288)、§3.1(p.264)。
接收端回覆確認
本步示範正常收到的情況;需要重送時,仍由這條連線的兩端協調。
接收端檢查封包後回傳確認,發送端依適當的正向確認釋放副本。讀 Figure 3-22 的接收規則,再接到 Figure 3-21 的確認處理,即可把兩端的動作接起來。
Base 6.0 Figures 3-21/3-22(pp.299、303)。
回報重新可用的空間
credit 是空間額度;更新採規格的累積計數方式,本圖僅表示資訊方向。
接收端釋出緩衝資源後,透過流量控制資訊更新額度。發送端之後使用更新結果,檢查下一個新封包所需的空間。
Base 6.0 §2.6.1(pp.236–237)、Figures 3-9–3-11(pp.283–284)。
圖中元件
裝置:本次發送端
檢查接收空間、送出交易封包,並保存重送所需的副本。
基本責任
Endpoint 是階層末端裝置。本例從裝置往 Switch 傳送;反方向的傳輸有自己的發送與接收責任。
Switch:本次接收端
接收並檢查封包,回覆確認,也回報可供後續封包使用的空間。
基本責任
Switch 的 Downstream Port(下游連接埠)是面向下游裝置的連接埠。交換器再向上游轉送時,會使用另一條連線的傳遞機制。
1. 建立連線,再準備交易
一條 Lane(通道)提供兩個方向各自的傳輸路徑;多條通道可以組成一條 Link(連線)。×4 表示四條通道,GT/s 則是每秒十億次傳輸的速率單位。Physical Layer(實體層)先辨識兩端、取得接收同步,再將各通道組成連線。這個過程由 Link Training and Status State Machine(LTSSM,連線訓練與狀態機)管理。
接著,Data Link Layer(資料連結層)管理相鄰兩端的連線狀態與可靠傳遞;Transaction Layer(交易層)處理 TLP(Transaction Layer Packet,交易層封包)、路由及交易。DLLP(Data Link Layer Packet,資料連結層封包)在相鄰兩端交換;交易封包則可穿越交換器到達另一個元件。下表將實體層、資料連結層與軟體準備工作分開列出。
| 觀察對象 | 此時解決的問題 | 後續另需處理 |
|---|---|---|
| Physical Layer(實體層) | 建立接收同步,協商 Lane(通道)、寬度與速率。 | Function(可獨立設定的功能單位)的內部初始化。 |
| Data Link Layer(資料連結層) | 完成適用的 Feature Exchange(功能交換)與 VC0(預設虛擬通道)的 Flow Control(流量控制)初始化,進入 DL_Active(資料連結可用)。 | BAR(Base Address Register,基底位址暫存器)、中斷與 DMA(Direct Memory Access,直接記憶體存取)映射的配置。 |
| Function(功能單位)/系統軟體 | 裝置能接受設定,系統完成資源與工作介面的初始化。 | 啟動工作後,依裝置介面查看完成結果。 |
Virtual Channel(VC,虛擬通道)用來區分相關傳輸資源;本章只使用預設的通道 0。Flow Control(FC,流量控制)依接收端公布的緩衝空間,控制後續 TLP(交易層封包)的發送。這些資訊透過 DLLP(資料連結層封包)在相鄰兩端交換。
- TLP
- Transaction Layer Packet,交易層封包
- DLLP
- Data Link Layer Packet,資料鏈結層封包
分層與初始化來源
Base 6.0 §3.1–§3.2,Figure 3-1/3-2(pp.263–265);§3.4(pp.270–276);§6.6.1(p.721)。FC 記帳由 Transaction Layer 負責,Data Link Layer 協助傳遞 FC 資訊,見 §2.6.1(p.236)。
2. 沿 LTSSM 訓練狀態建立連線
- LTSSM
- Link Training and Status State Machine,鏈結訓練與狀態機
LTSSM(連線訓練狀態機)先找出可用通道,再建立同步與通道編號。下面保留初次建立連線的主要路徑;Configuration 在此負責組成連線。完整狀態機還包含逾時、重試、測試及省電分支。
Detect 先檢查遠端終端是否存在;Polling 交換訓練 Ordered Sets(有固定用途的符號序列),建立位元/符號同步並處理通道極性;Configuration 把 Lane 組成 Link,處理寬度與 Lane 間對齊。L0 是正常傳輸狀態。Recovery 用來重新取得同步,也支援速率變更。閱讀這段路徑時,要連同進入原因與後續狀態一起觀察。
讀 Figure 4-48 時,先找「從哪個狀態出發、要完成什麼」,再進入 §4.2.7 查對應子狀態,不必第一次就背下所有箭頭。初次建立連線時,接著看 Figure 3-2:Physical Layer 可運作後,Data Link Layer 完成適用的 DL_Feature/DL_Init 工作,才到 DL_Active。已建立連線後的 Recovery,稍後會以兩段紀錄另外帶讀。
訓練狀態的閱讀位置
§4.2.6.1–§4.2.6.5(pp.444–445);完整 Figure 4-48(p.454);Table 4-48(p.453)對照 LTSSM 與 Link 狀態輸出。Figure 3-2(p.265)是另一個層次的狀態機,不能把 DL_Active 當成 LTSSM 狀態名稱。
3. 兩端支援 16 GT/s,為什麼現在只有 8 GT/s ×4?
查詢對象是同一條連線兩端的 Downstream Port(下游連接埠)與 Endpoint(階層末端裝置)。以下假設兩端 PCI Express Capability(PCIe 能力與控制結構)都已定位於 0x70、版本為 2。表中先只列相關欄位;Maximum Link Width 的值是解碼後的 Lane 數,其餘標成十六進位者是完整 Register 讀值。
| 位置/欄位 | 02:01.0 Downstream Port | 03:00.0 Endpoint |
|---|---|---|
| Link Capabilities 2,0x9C,32 bits | 0x0180001E | 0x0180001E |
| Maximum Link Width,Link Capabilities bits 9:4 | 8 lanes | 4 lanes |
| Link Control 2,0xA0,16 bits | 0x0003 | 本次不以 Endpoint 的 Target 值控制正常速率 |
| Link Status,0x82,16 bits | 0x2043 | 0x0043 |
依 Figure 7-38/Table 7-35,先計算 (0x0180001E & 0xFE) >> 1 = 0x0F,得到 2.5、5、8、16 GT/s 都支援。速率 vector(支援速率位元向量)只取 bits 7:1;高位兩個 Retimer(重新定時器)偵測能力位元另有用途。
再看 Downstream Port 的 Figure 7-39/Table 7-36:0x0003 & 0xF = 3,Target Link Speed(目標速率)對應 8 GT/s,設定下游連接埠正常運作速率的上限。實際訓練結果接著由狀態欄位確認。最後依 Figure 7-29/Table 7-26,0x2043 & 0xF = 3、(0x2043 >> 4) & 0x3F = 4,目前確實為 8 GT/s ×4。
本例另外假設 Downstream Port 的 Data Link Layer Link Active Reporting Capable=1,因此 Status bit 13=1 可用來確認 DL_Active;Endpoint 未實作該回報,因此 bit 13 固定為零;本例使用連接埠的回報確認狀態。Link 不在 up 狀態時,Current Link Speed 與 Negotiated Link Width 的值未定義。
因此,本例的 8 GT/s 符合設定的上限,×4 也符合 Endpoint 的能力。Downstream Port 宣告 ×8,並不保證實際連線布了八條 Lane。依這組讀值,實際結果與設定和能力相符。
調整目標速率後,接著查看哪些狀態?
先確認速率支援、控制對象與正常操作前提,再依 Link Control 的 Retrain Link(重新訓練控制)觸發訓練;此 bit 寫 1 觸發,讀取永遠為零。應觀察適用的 Link Training/Link Active,再讀 Current Link Speed 與寬度。Link Training 只涵蓋 Configuration/Recovery 及等待 Retrain 開始的情況,且在 Endpoint 為 Reserved,不能當成通用 LTSSM 編碼。(Tables 7-24、7-26,pp.972–973、978–979。)
從 Figure 到結論
Maximum Link Width:Figure 7-27/Table 7-23(p.967);Current 與狀態適用性:Figure 7-29/Table 7-26(pp.978–979);Supported:Figure 7-38/Table 7-35(pp.998–1000);Target:Figure 7-39/Table 7-36(pp.1001–1002)。這是一組作者假設的有效讀值,不是規格指定的預設設定。
4. 經過 Recovery,哪些狀態需要重新建立?
已在 DL_Active 的連線進入 Recovery 後,可以保留資料連結狀態,再回到 L0。若後續路徑使 Physical LinkUp 降為零,資料連結層才會轉到 DL_Inactive,清除舊狀態並在連線恢復後重新初始化。判讀時要把實體層與資料連結層的紀錄放在同一條時間線上。
先回到 Figure 4-48,確認本次經過的 LTSSM 路徑,再用 Table 4-48 對照每個狀態的 LinkUp。這是 Physical Layer 提供給 Data Link Layer 的連線指示,不是 Configuration Space 裡另一個同名 bit。Recovery 與 L0 的 LinkUp 都是 1;Detect 則是 0。接著讀 Figure 3-2 及 §3.2.1:DL_Active 在 Physical LinkUp=0 時轉到 DL_Inactive。這個條件把兩張狀態圖接了起來。
【模擬資料】以下兩段紀錄為教學用途建立,不代表特定硬體或平台。兩例都觀察 02:01.0 與 03:00.0 之間的同一條 Non-Flit Mode 連線,開始時已在 DL_Active,並假設紀錄完整涵蓋本次轉換、沒有另外執行 Reset 或 Link Disable。下表是狀態紀錄摘要,不是標準軟體可讀 Register dump。
螢幕較窄時,可左右滑動表格查看完整內容。
| 觀察項目 | 案例 A:直接回到 L0 | 案例 B:落回 Detect 後重建 |
|---|---|---|
| 完整主狀態路徑 | L0 → Recovery → L0 | L0 → Recovery → Detect → Polling → Configuration → L0 |
| 依 Table 4-48 讀 LinkUp | 沿途保持 1。 | 進入 Detect 時為 0;之後從 Polling 進入 Configuration 時仍為 0,至建立 Link 才變為 1。 |
| 依 Figure 3-2 查資料連結狀態 | 維持 DL_Active。Physical Layer 暫時不能接受封包時,資料連結層仍需配合暫停傳送。 | 轉到 DL_Inactive,重設資料連結狀態並丟棄 Retry Buffer(保存重送副本的緩衝區)內容。恢復後完成適用的 DL_Feature 與 DL_Init,再到 DL_Active。 |
| VC0 的額度與重送副本 | 這條路徑沒有觸發 DL_Inactive,不會因為進入 Recovery 就全部清除,再做一次 InitFC。 | 舊的重送副本已丟棄;進入 DL_Init 後,VC0 要重新執行 Flow Control 初始化。 |
回到兩端讀值時,仍須先確認欄位適用性。Table 7-26 的 Data Link Layer Link Active 在 DL_Active 才回傳 1;本例只有支援回報的 Downstream Port 可用這個 bit 觀察。案例 A 的狀態維持可用,實際封包仍可能暫停;案例 B 則有退出及重新進入 DL_Active 的過程。若只在前後各讀一次得到 1,中間的差異就會遺失,因此需要狀態歷史或同步的協定紀錄。
另外,Figure 3-2 的 DL_Up 是資料連結層對其他邏輯輸出的狀態,和 Register 的 Link Active bit 有不同的定義。例如 DL_Init 進行到 FC_INIT2 時已輸出 DL_Up,但該 VC 的 TLP 發送仍須等初始化完成。閱讀時應沿用各欄位與狀態的完整名稱。
- VC
- Virtual Channel,虛擬通道
Recovery、LinkUp 與重新初始化的來源
PCI Express Base Specification Revision 6.0:§4.2.6.4 Recovery Overview(PDF/印刷 p.445);Table 4-48 Link Status Mapped to the LTSSM(PDF/印刷 p.453,含 Configuration 的註腳 72);Figure 4-48 Main State Diagram for Link Training and Status State Machine(PDF/印刷 p.454)。Figure 3-2 Data Link Control and Management State Machine 與 §3.2.1 Data Link Control and Management State Machine Rules(PDF/印刷 pp.265–268)定義轉換、狀態重設與 Physical Layer 暫停傳送時的配合。§3.4 Flow Control Initialization Protocol/§3.4.1 Flow Control Initialization State Machine Rules(PDF/印刷 pp.270–273)定義 VC0 初始化;Table 7-26 Link Status Register(PDF/印刷 p.979)定義 Link Active。兩段紀錄及對照方式由作者依這些規則建立。
5. 依封包種類檢查接收空間
接收端透過 FC(流量控制)資訊告知可用額度,發送端依交易種類檢查 credit(接收緩衝額度)。Non-Flit Mode 下,每個 VC 分開記錄 Posted、Non-Posted、Completion 的 Header 與 Data,合計六類:PH/PD 是 Posted 的標頭/資料額度,NPH/NPD 是 Non-Posted 的標頭/資料額度,CplH/CplD 是完成回覆的標頭/資料額度。Data credit 的單位是 4 DW(每個 Doubleword 為 4 bytes),也就是 16 bytes;Header(標頭)額度則依封包標頭另計。
- FC
- Flow Control,流量控制
- DW
- Double Word,4 bytes的資料單位
以下是作者建立的概念帳本:VC0(預設虛擬通道)、Non-Flit Mode、有限且未縮放的可用 credits,沒有其他封包競爭。數字不是軟體可直接讀到的標準 Register,也不是 InitFC 的最低宣告值。假設現在只剩 PH(Posted 標頭額度)=2、PD(Posted 資料額度)=5。先由 Table 2-44 辨認類別,再依 Table 2-45 讀每種封包的需求。表中 MWr 是 Memory Write(記憶體寫入),MRd 是 Memory Read(記憶體讀取);NPH/NPD 是 Non-Posted 的標頭/資料額度。
| 候選封包 | 所需 credits | 判斷 |
|---|---|---|
| 64-byte MWr(記憶體寫入) | 1 PH、4 PD | 可送;發送後剩 PH=1、PD=1。 |
| 接著送 32-byte MWr | 1 PH、2 PD | PD 不足;此封包等待額度更新。 |
| 其後可用 PD 增加 1,再送同一個 32-byte MWr | 1 PH、2 PD | 可送;發送後 PH=0、PD=0。 |
| 另一個 256-byte MRd(記憶體讀取),假設 NPH=1 | 1 NPH、0 NPD | Request 本身沒有 256-byte Payload;FC 這一項條件通過。 |
PD 用量以 Payload bytes 除以 16 後向上取整。MRd(記憶體讀取)的 Length 指定要求回傳的資料量,Request(請求)本身沒有這段資料;Completion(完成回覆)在反方向消耗 CplH/CplD(回覆標頭/資料額度)。通過 credit 檢查也只代表 FC 條件成立,仍受排序、仲裁等規則約束。
資料連結層重送同一個封包時,交易層保留原本的額度記帳,不再扣一輪新封包的額度。流量控制管理接收緩衝資源;replay(重送)負責把同一封包可靠地交到相鄰接收端。
credit 單位與用量
§2.6.1(pp.236–237);Table 2-44 的六類 credit、Table 2-45 的各種 TLP 用量(p.237)。DLLP 的交換格式可從 Figures 3-9–3-11(pp.283–284)查 InitFC1、InitFC2 與 UpdateFC。本例只計算已知可用額度,不把累積計數協定簡化成每次更新都是增量。
6. 確認接收與必要時的重送
在本例模式中,資料連結層為封包加入 sequence number(序號)與 LCRC(Link Cyclic Redundancy Check,連線錯誤檢查碼)。接收端檢查後,以 ACK(正向確認)/NAK(要求重送的負向確認)等機制回覆發送端。發送端保留 replay(重送)所需的副本;收到適當的正向確認後才釋放。NAK(負向確認)或確認逾時可以引發 replay。先看 Figure 3-17 的序號與 LCRC(連線檢查碼),再看 Figure 3-22 的接收流程與 Figure 3-21 的確認處理。
假設 Endpoint 的 MWr(記憶體寫入)要穿越 Switch。第一條連線收到 ACK(正向確認),發送端便可按規則處理這一跳的副本。CPU 存取資料與裝置工作的完成,仍由後續的記憶體及裝置介面處理。Switch 再往上游傳送時,使用的是另一條 Link 的確認與重送機制。ACK 也不是 Chapter 5 的 Completion:Posted MWr 沒有一般 Completion,仍然有 Link 層的可靠傳遞。
接收端的 sequence 檢查也處理 replay 可能帶來的重複封包,避免把已接受的副本再次交給 Transaction Layer。這些動作由相鄰兩端的硬體執行;驅動程式仍在處理原先提交的工作。
可靠傳遞的圖表路徑
先看 Figure 3-17(p.288),辨識 TLP 外的 sequence/LCRC;再讀 §3.6.2 的傳送端規則與 §3.6.3(pp.300–303)的接收規則。Figure 3-21(p.299)處理 ACK/NAK,Figure 3-22(p.303)處理接收 TLP。分層與副本保存概述見 §3.1(p.264)。
7. PCIe 6.0 的 Flit 改變了什麼?
在 64 GT/s 運作時使用 Flit Mode(固定區塊傳遞模式),較低速率也可使用。當前模式需由本節稍後的模式欄位確認。Flit 是固定 256 bytes 的傳輸單位,TLP 可以跨越多個 Flit,一個 Flit 也不必只容納一個 TLP。
| Byte 範圍 | 大小 | 用途 |
|---|---|---|
| 0–235 | 236 bytes | TLP 區,包含 TLP Header 等內容,不能全算成應用資料。 |
| 236–241 | 6 bytes | DLP(Data Link Layer Payload,資料連結層承載內容)。 |
| 242–249 | 8 bytes | CRC(Cyclic Redundancy Check,循環冗餘檢查碼),供錯誤檢查。 |
| 250–255 | 6 bytes | ECC(Error Correction Code,錯誤修正碼),支援 Forward Error Correction(FEC,前向錯誤更正)。 |
Flit Mode 的可靠傳遞以 Flit 為 replay 單位,配合 CRC(錯誤檢查碼)、FEC(前向錯誤更正)與序號機制。可更正的錯誤由更正機制處理,其餘情況仍可能需要重送;格式與前面的個別封包模式不同。
- FEC
- Forward Error Correction,前向錯誤更正
要查目前模式,先確認 PCI Express Capabilities 的 Flit Mode Supported(Figure 7-23/Table 7-19 bit 15),再查 Downstream Port 的 Link Status 2。Flit Mode Status 在 bit 10,但只有 Downstream Component Presence 為 011b、100b 或 101b 時才有意義。若只擷取這兩個欄位得到 0x4400,則 Presence=100b、Flit=1:Link 已 up、尚未收到 DRS(Device Readiness Status,裝置就緒通知),模式為 Flit。若是 0x3400,Presence=011b,雖已協商 Flit,Data Link Layer 尚未 active。這兩個數字是欄位投影,不是完整 Register dump。
Flit 的版本邊界
§4.2.3(p.340);§4.2.3.3、Tables 4-10–4-14(pp.351–355);§4.2.3.4.1(p.357);重送見 §4.2.3.4.2.1/Figure 4-33(p.383),CRC/ECC 見 §4.2.3.4.3–§4.2.3.4.4(pp.384–390)。模式欄位見 Table 7-19(p.955)與 Figure 7-40/Table 7-37(pp.1004–1007)。本章採 Base 6.0 原版;後續 ECN(規格變更通知)不在本次引用範圍。
8. 從一個待送封包串起整條路線
裝置準備送出寫入時,依序看哪些機制?
先沿 Figure 4-48 與 Figure 3-2 確認連線及資料連結初始化,再依 Tables 2-44/2-45 檢查 Posted 的標頭與資料額度。封包送出後,Figure 3-17 顯示序號與檢查碼,Figures 3-21/3-22 則串起兩端的接收與確認。本文的數字帳本只示範額度;實際排程仍受排序與仲裁規則約束。
接著換成讀取請求,沿哪一部分重新檢查?
從 Table 2-45 更換交易種類即可:沒有資料 Payload 的讀取請求檢查 NPH。回覆則在反方向使用 Completion credits,接收端與發送端的角色也隨方向對調。
如果改用 Flit,哪部分要換讀另一組圖表?
先依 Table 7-37 的 Presence 條件解讀模式,再讀 Tables 4-10–4-14 的區塊格式與 Figure 4-33 的重送。236 bytes 的交易區包含標頭,也可能有 NOP(空操作內容);有效資料量要依實際封包配置計算。(§4.2.3.4.1,p.357。)
下一章接著處理 Reset 的範圍與恢復條件,沿同一拓樸查看 Function、連線與未完成交易的處理。