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 在此負責組成連線。完整狀態機還包含逾時、重試、測試及省電分支。

初次訓練與後續 Recovery 的不同目的初次連線依序經過 Detect、Polling、Configuration 到 L0。L0 可進入 Recovery 調整速率或恢復同步,再回 L0;這不是完整 LTSSM。Detect偵測遠端終端Polling取得同步Configuration組成 LinkL0正常傳輸Recovery變更速率/重新取得同步
作者依 §4.2.6 繪製的閱讀導圖,只保留本節需要的路徑;完整分支與條件請對照 Figure 4-48。

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 Port03:00.0 Endpoint
Link Capabilities 2,0x9C,32 bits0x0180001E0x0180001E
Maximum Link Width,Link Capabilities bits 9:48 lanes4 lanes
Link Control 2,0xA0,16 bits0x0003本次不以 Endpoint 的 Target 值控制正常速率
Link Status,0x82,16 bits0x20430x0043

依 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。

螢幕較窄時,可左右滑動表格查看完整內容。

相同的 Recovery 起點,後續路徑決定是否重新初始化
觀察項目案例 A:直接回到 L0案例 B:落回 Detect 後重建
完整主狀態路徑L0 → Recovery → L0L0 → 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 的標頭/資料額度。

有限 credit 的發送判斷
候選封包所需 credits判斷
64-byte MWr(記憶體寫入)1 PH、4 PD可送;發送後剩 PH=1、PD=1。
接著送 32-byte MWr1 PH、2 PDPD 不足;此封包等待額度更新。
其後可用 PD 增加 1,再送同一個 32-byte MWr1 PH、2 PD可送;發送後 PH=0、PD=0。
另一個 256-byte MRd(記憶體讀取),假設 NPH=11 NPH、0 NPDRequest 本身沒有 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。

一個 Flit 的 256 bytes 分配
Byte 範圍大小用途
0–235236 bytesTLP 區,包含 TLP Header 等內容,不能全算成應用資料。
236–2416 bytesDLP(Data Link Layer Payload,資料連結層承載內容)。
242–2498 bytesCRC(Cyclic Redundancy Check,循環冗餘檢查碼),供錯誤檢查。
250–2556 bytesECC(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、連線與未完成交易的處理。