PCIe Chapter 8:Link 建立與可靠傳遞

沿相鄰兩端追蹤一次傳送時間向下。先完成訓練與空間檢查,再傳送封包。確認收到與回報釋出的空間是不同資訊;圖中兩者先後是本例安排。裝置 03:00.0Switch 連接埠 02:01.0連線訓練與初始化發送端檢查接收空間額度傳送封包;保留重送副本接收端檢查後回覆確認本例稍後釋出空間,再回報額度
依 Base 6.0 整理的正常傳送範例,使用 Non-Flit Mode(以個別交易封包進行可靠傳遞)。確認接收與更新額度各有用途;圖中的相對先後是案例安排。

封包送出前,兩端先建立 Link(連線),發送端再檢查接收空間;送出後,由相鄰兩端完成確認與必要的重送。本章沿同一條連線帶讀訓練、速率欄位、credit(接收緩衝額度)與 replay(重送)。

完整中文教學 · English · 課程路線

規格閱讀路線: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 看傳送與確認。

訓練 Link 與準備 Function 是不同階段

Physical Layer(實體層)的 Link Training and Status State Machine(LTSSM,連線訓練狀態機)負責建立接收同步、Lane(通道)關係與 Link 寬度。初次建立的主要路徑為 Detect、Polling、Configuration、L0;這裡的 Configuration 是訓練狀態,不是配置 BAR(Base Address Register,基底位址暫存器)。Recovery 可恢復同步或變更速率,須連同進入原因與後續狀態閱讀。

初次建立連線時,Physical Layer(實體層)可運作後,Data Link Layer(資料連結層)還需完成適用的 Feature Exchange(功能交換)與 VC0(預設虛擬通道)的 Flow Control(流量控制)初始化,進入 DL_Active(資料連結可用)。Function 能否接受設定、BAR(裝置資源的基底位址)與 DMA(Direct Memory Access,直接記憶體存取)是否準備完成,是後續不同的條件。DLLP(Data Link Layer Packet,資料連結層封包)在相鄰 Link(連線)兩端交換;TLP(Transaction Layer Packet,交易層封包)則可穿越 Switch(交換器)到另一個元件。

BAR
Base Address Register,基底位址暫存器
狀態機閱讀位置

§3.1–§3.4、Figures 3-1/3-2(pp.263–276);§4.2.6.1–§4.2.6.5(pp.444–445)、Figure 4-48(p.454)、Table 4-48(p.453);§6.6.1(p.721)。

依序查看支援速率、設定上限與目前速率

同一條 Link 的兩端資料
欄位Downstream PortEndpoint
Link Capabilities 2,0x9C0x0180001E0x0180001E
Maximum Link Width,解碼值8 lanes4 lanes
Link Control 2,0xA00x0003本例不採其 Target 作正常速率控制
Link Status,0x820x20430x0043

Figure 7-38/Table 7-35:(0x0180001E & 0xFE) >> 1 = 0x0F,兩端均支援 2.5、5、8、16 GT/s。Figure 7-39/Table 7-36:Downstream Port 的 Target=3,將正常速率限制在 8 GT/s。Figure 7-29/Table 7-26:Current=3、Width=4,結果為 8 GT/s ×4,符合本例上限與 Endpoint 寬度能力。Port 宣告的最大寬度也不保證實際佈線寬度。

本例 Downstream Port 支援 Link Active 回報,Status bit 13=1 表示 DL_Active;Endpoint 未實作該回報,不能把它的零當成斷線。Link 未 up 時,Current Speed/Width 未定義。Retrain Link 寫 1 觸發、讀值永遠為零;需要觀察適用的 Training/Active 與最終 Speed/Width,不能靠該 bit 的讀值確認完成。Link Training 在 Endpoint 為 Reserved。

欄位與限制

Figure 7-27/Table 7-23(p.967);Figure 7-29/Table 7-26(pp.978–979);Figures 7-38/7-39、Tables 7-35/7-36(pp.998–1002);Retrain Link:Table 7-24(pp.972–973)。

Recovery 後,沿 LinkUp 判斷是否重新初始化

已在 DL_Active 的連線可以經過 Recovery,保留資料連結狀態後回到 L0。先在 Figure 4-48 找實際路徑,再看 Table 4-48:Recovery 與 L0 的 LinkUp 都是 1。LinkUp 是 Physical Layer 提供給 Data Link Layer 的指示;§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案例 B
LTSSM 主狀態路徑L0 → Recovery → L0L0 → Recovery → Detect → Polling → Configuration → L0
Table 4-48 的 LinkUp沿途保持 1。Detect 與 Polling 為 0;從 Polling 進入 Configuration 時仍為 0,建立 Link 後才為 1。
Figure 3-2/§3.2.1維持 DL_Active;實體層暫時無法接受封包時,傳送仍可能暫停。進入 DL_Inactive,重設資料連結狀態並丟棄 Retry Buffer(保存重送副本的緩衝區)內容。恢復後經適用的 DL_Feature、DL_Init,再到 DL_Active。
接著查 §3.4/§3.4.1這條路徑沒有觸發重新執行 InitFC。進入 DL_Init 後,VC0 重新執行 Flow Control 初始化。
LTSSM
Link Training and Status State Machine,鏈結訓練與狀態機

最後用 Table 7-26 對照軟體讀值:Data Link Layer Link Active 在 DL_Active 才為 1,而且只在支援回報時有意義。本例從支援回報的 Downstream Port 觀察;若前後兩次都讀到 1,仍看不出中途是否曾退出。Figure 3-2 的 DL_Up 是另一個狀態輸出,例如 DL_Init 的 FC_INIT2 階段已輸出 DL_Up,但該 VC 的 TLP 發送仍須等初始化完成。

VC
Virtual Channel,虛擬通道
TLP
Transaction Layer Packet,交易層封包

先串起 Figure 4-48、Table 4-48 與 Figure 3-2,就能查清楚重新初始化的條件。Recovery 的觸發原因及各筆 Transaction 的結果,則接著從控制寫入、錯誤與封包紀錄追蹤。

來源與適用範圍

Base 6.0 §4.2.6.4 Recovery Overview(PDF/印刷 p.445);Table 4-48 Link Status Mapped to the LTSSM(p.453,含註腳 72);Figure 4-48 Main State Diagram for Link Training and Status State Machine(p.454);Figure 3-2 Data Link Control and Management State Machine、§3.2.1 Data Link Control and Management State Machine Rules(pp.265–268);§3.4 Flow Control Initialization Protocol/§3.4.1 Flow Control Initialization State Machine Rules(pp.270–273);Table 7-26 Link Status Register(p.979)。本段各頁的 PDF 頁碼與印刷頁碼相同。

接收空間與這一跳的可靠傳遞

Non-Flit Mode 中,每個 Virtual Channel(虛擬通道)分別追蹤 Posted、Non-Posted、Completion 的 Header 與 Data,共六類 credits。Data 一單位為 16 bytes,Header 另計。作者假設 VC0 (預設虛擬通道)目前有有限、未縮放的 PH(Posted 標頭額度)=2、PD(Posted 資料額度)=5,沒有其他競爭:64-byte Memory Write(MWr,記憶體寫入)消耗 1 PH(Posted 標頭額度)、4 PD(Posted 資料額度),剩 1/1;隨後 32-byte MWr(記憶體寫入)需要 1/2,必須等待。若可用 PD 增加 1,才通過這項檢查。這是可用額度帳本,不是標準可讀 Register 或最低初始宣告。

256-byte Memory Read(MRd,記憶體讀取)請求本身沒有資料 Payload(承載資料),只需 1 NPH(Non-Posted 標頭額度);回覆在反方向消耗 Completion credits。credit 足夠仍不保證立即排到傳送,排序與仲裁也要成立。

Non-Flit 的 sequence number(序號)、LCRC(Link Cyclic Redundancy Check,連線檢查碼)、ACK/NAK(正向/負向確認)與 replay(重送),保障相鄰兩端傳輸。發送端保留副本,NAK(負向確認)或確認逾時可引發重送;接收端辨識重複副本,Transaction Layer 不再為同一 TLP(交易層封包)扣一輪新 credit。某一跳收到 ACK(正向確認),代表這一跳已取得相應的接收確認;最終交易的 Completion(完成回覆)與裝置工作完成則由各自介面處理。Posted MWr 沒有一般 Completion,仍有 Link 層可靠傳遞。

FC 與重送

§2.6.1、Tables 2-44/2-45(pp.236–237);Figures 3-9–3-11(pp.283–284);§3.1(p.264)、Figure 3-17(p.288)、Figures 3-21/3-22(pp.299、303)。

Flit Mode 另有固定傳輸單位

64 GT/s 使用 Flit Mode(固定區塊傳遞模式),較低速率也可能使用。每個 Flit 為 256 bytes:236 bytes TLP 區、6 bytes DLP(Data Link Layer Payload,資料連結層內容)、8 bytes CRC(Cyclic Redundancy Check,錯誤檢查碼)、6 bytes ECC(Error Correction Code,錯誤修正碼)。TLP 可跨 Flit,也可多筆共用一個 Flit;236 bytes 不能全部當成使用者資料。可靠傳遞改以 Flit 為 replay 單位,FEC(Forward Error Correction,前向錯誤更正)不代表取消重送或能修正所有錯誤。

查模式先確認 PCI Express Capabilities 的 Flit Mode Supported,再看 Downstream Port 的 Link Status 2。只擷取 Presence 與 Flit bit 得到 0x4400,表示 Presence=100b、Flit=1,Link up 但尚未收到 DRS(Device Readiness Status,裝置就緒通知);0x3400 則是協商已完成、Data Link Layer 尚未 active。這是欄位投影,非完整 dump;Flit bit 只在 Presence=011b、100b、101b 有意義。

Flit 來源

§4.2.3(p.340)、§4.2.3.3–§4.2.3.4(pp.351–390)、Figure 4-33(p.383);Table 7-19(p.955)、Figure 7-40/Table 7-37(pp.1004–1007)。僅採 Base 6.0,未自動納入後續 ECN(規格變更通知)。

沿同一連線換看另一種封包

讀取請求使用哪種接收額度?

MRd(記憶體讀取)檢查 NPH(Non-Posted 標頭額度),仍須滿足其他傳送條件。(Table 2-45,p.237。)

一條連線的確認,位於完整路徑的哪裡?

確認涵蓋相鄰連線的傳輸;最終資料可見性、所有權與工作完成仍須依各自介面判斷。

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...