先在圖上分清元件、Port 與 Link,再把每個 Function 放回它所共用的連接介面。本章沿同一個 Switch 拓撲,追蹤一筆 Read 的往返,最後示範如何從設定欄位核對角色與連線能力。

先沿實線配對 Port,再找到共用 Link 的 Function

選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。

這是讀圖順序:先配對相鄰 Port,再看 Switch 內部關係,接著選 A 分支,最後分清同一連線上的兩個 Function;不是 Link 建立或列舉的時間線。

沿拓樸找到 03:00.1所有BDF皆在Segment 0000;實線是外部Link,虛線是內部邏輯連接;Endpoint A的兩個Function共用一條Link。Root Port00:01.0 · 01–04Switch Upstream Port01:00.0 · 02–04Downstream Port A02:01.0 · 03–03Downstream Port B02:02.0 · 04–04Endpoint A03:00.0 / 03:00.1Endpoint B04:00.0LR內部 Bus 02(邏輯連接)LALB
作者建立的已配置拓撲。LR、LA、LB 是三條外部 Link;虛線是 Switch 內部邏輯連接。框內第二行的 BDF 與 Bus 範圍可先略過,後半部再帶讀編碼。
BDF
Bus/Device/Function,匯流排、裝置與功能識別

先用三條外部 Link 建立觀察範圍,再把 Function 與設定資料放回拓撲。軟體看見多個 Function,不代表外部 Link 的數量也增加。

  1. 先配對 LR 的兩端

    圖中只展開一個 Root Port 與其下游;其餘 CPU、記憶體與路徑省略。

    Root Port 是 Root Complex 的對外 Port;沿第一條實線 LR,另一端是 Switch Upstream Port。先把這兩個相鄰介面配成一對,之後查 LR 的狀態就有明確範圍。

    Base 6.0 §1.2 PCI Express Link、§1.3/Figure 1-2,文件頁/PDF 頁 100–103。

  2. 展開 Switch 的三個 Port

    這是一般 Switch 的配置模型;本例不使用 FPB Routing ID 機制。

    FPB
    Flattening Portal Bridge,扁平化入口橋接器

    Switch Upstream Port 面向根部;Downstream Port A 與 B 分別面向兩條下游 Link。虛線只描述內部邏輯 Bus,這裡沒有第四條外部 Link。

    Base 6.0 §1.3.3/Figure 1-3、§7.1/Figure 7-2,文件頁/PDF 頁 106–107、903–904。

  3. 選 LA,配對 A 分支

    圖中外部 Link 已建立;每條 Link 分別記錄能力、目前結果與事件。

    沿 Downstream Port A 的實線 LA 到 Endpoint A Port。B 分支則是 Downstream Port B 與 Endpoint B Port,使用另一條 Link LB。觀察 A 時,先讀 LA 兩端,再沿需要追查上游 LR。

    Base 6.0 §1.2–§1.3/Figures 1-1–1-3,文件頁/PDF 頁 100–107。

  4. 在 A 的同一 Port 下區分 Function

    兩個 Function 都已確認存在;數量不是從 Header Type 的多功能位元推得。

    卡 A 的 Device 有 Function 0 與 Function 1,圖中兩者共用一個 Endpoint Port 與 LA。BDF(Bus、Device、Function 識別號)選的是設定對象;卡片的實體組裝則是本例另行給定的資訊。

    Base 6.0 Terms and Acronyms:Device、Function、Port,文件頁/PDF 頁 84–85、89;Header Type 的限制見 pp.924–925。

圖中元件

Root Port:根部的對外介面

本例 LR 的靠近根部一端;它的直接對端是 Switch Upstream Port。

基本責任

本章 Root Port 在設定模型中呈現為 Type 1 橋接功能。

Downstream Port A:通往 Bus 03

本例 LA 的靠近根部一端;直接對端是 Endpoint A Port。

基本責任

Downstream 表示遠離 Root Complex、朝階層下游的方向。

Endpoint A:選出 Function 1

Function 0 與 1 分別提供設定空間;兩者共用圖中的 Port 與 LA。

基本責任

實體卡是組裝單位;Function 是軟體可個別辨識與設定的對象。

沿用 Chapter 0 的系統角色:主機經根部連接介面和交換器到達裝置。本章把交換器內部的橋接功能展開,讓你看見軟體如何選到其中一個 Function,而不必先知道卡片的實體組裝方式。

一張卡、多個 Function,究竟共用了什麼?

Function 是軟體可在 Configuration Space(設定空間)中個別定址的功能。一個 Device 是一組具有共同 Bus Number 與 Device Number 的 Function;實體卡則是組裝單位,可能裝有一個或多個 component。這三種對象的數量各有意義,需要分開記錄。

看到同一件硬體時,我們可能在談不同的對象
用語這一層在回答什麼問題?不能直接推得什麼?
實體卡板上裝了哪些元件,透過哪個介面接到系統?卡片數量不足以推算 Function 或 component 數量。
component哪一個實體元件或封裝?規格名詞表以單一 package 定義。一個封裝可能有多個 Port,也可能提供多個 Function。
Device同一階層中,共同 Bus Number 與 Device Number 的 Function 集合。這個設定模型中的集合不直接指定卡片或封裝邊界。
Function這個 Device 中,要讀取哪一個軟體可辨識對象的設定空間?一個 Function 不一定對應一張卡或一個獨立封裝。
Port元件透過哪個介面連接相鄰的 PCIe Link?Port 的實體編號不能當成 BDF 裡的 Device Number。
Link哪兩個相鄰 Port,透過哪些 Lane 連接?跨越 Switch 的整條路徑,需要逐條 Link 分別觀察。
LaneLink 裡的一組傳送差動對與一組接收差動對。x4 是四條 Lane,不是四個 Function 或四條獨立 Link。

回到卡 A:作者假設同一個 Device 有 Function 0 與 Function 1,兩者共用圖中的 Endpoint Port。軟體分別讀兩個 Function 的設定空間,並沒有因此多出第二條實體 Link。讀某個 Link 欄位前,先確認它描述個別 Function,還是這個共用 Port。

Lane(單一組雙向傳輸路徑)內的傳送與接收各用一組差動對。四條 Lane 組成 x4 Link 時,兩個方向都有四組差動對;它們屬於同一條 Link。圖中的 Endpoint A 是提供端點功能的元件簡稱;規格的 Endpoint 則是 Function 類型。這裡先理解連接單位,Lane Number、Lane Reversal 與寬度訓練留到對應章節。

Base 6.0 Terms and Acronyms:component、Device、Function、Link、Lane、Port,文件頁/PDF 頁 83–85、87、89;§1.2 PCI Express Link,pp.100–102。

規格依據:設定對象與實體連接

Base 6.0 Terms and Acronyms 的 Device、Function、Port 條目,pp.84–85、89;§1.3.2–§1.3.3,pp.105–107;§7.1,pp.903–904,Figures 7-1、7-2。卡內配置是教學背景,不是規格要求每張卡採用同一種組裝方式。Port Number 欄位見 §7.5.3.6、Table 7-23,p.969;它不參與下文的 BDF 位元編碼。

資料往回傳時,Requester 和 Port 的名稱會改變嗎?

先以 Root Complex(連接主機與 I/O 階層的根部)為方向基準。Switch 的 Upstream Port 朝向根部,Downstream Port 朝向下游;封包改變方向時,Port 的名稱仍由拓撲決定。

接著追蹤卡 A 的 Function 1 發出的 Memory Read(讀取 Memory Space 的要求)。Requester 是發起這筆交易的 Function;Completer 負責處理 Request,並在需要時產生 Completion。Transmitter 與 Receiver 則描述某一次 Link 傳輸的傳送端與接收端。下面沿往返路徑逐段對照。

同一筆 Read,逐段看誰在傳、誰在收

選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。

先沿 Request 從 A 走到主機,再沿 Completion 返回;每條實線都重新指定傳送端與接收端。LA、LR 是本章用來追蹤連線的代號。

同一筆 Memory Read 的角色與傳輸方向由上往下追蹤 Endpoint A Function 1 的 Request,再追蹤 Root Complex 返回的 Completion。Link LA 連接 Endpoint Port 與 Switch Downstream Port A;Link LR 連接 Switch Upstream Port 與 Root Port。Switch 內部轉送以虛線表示。Endpoint A PortFunction 1Switch DP ADownstream PortSwitch UPUpstream PortRoot PortRoot ComplexLA: Memory ReadSwitch forwardingLR: Memory ReadLR: CompletionSwitch forwardingLA: CompletionRequest: Upstream → Root Complex · Completion: Downstream → Endpoint
作者依規格建立的角色時序圖。由上往下讀事件,不表示實際延遲;實線是 LA/LR 上的傳送,虛線是 Switch 內部轉送。圖中 DP/UP 分別表示 Downstream Port/Upstream Port。

Upstream/Downstream Port 的名稱由拓撲決定。Transmitter/Receiver 隨當次傳送改變;同一筆 Read 的 Requester 不會因開始接收 Completion 而改名。

  1. A 發出 Request:先通過 LA

    本例由 Function 1 讀取主機記憶體;只追蹤一筆可用一個 Completion 回覆的 Read,省略仲裁、重送與其他流量。

    Endpoint A 的 Function 1 是 Requester(發起這筆交易的功能)。在 LA 上,A 的 Port 是 Transmitter(傳送端),Switch Downstream Port A 是 Receiver(接收端)。Request 朝 Root Complex 前進,所以方向是 Upstream。

    Base 6.0 Terms and Acronyms:Requester、Receiver、Transmitter、Upstream,文件頁/PDF 頁 90、93–94;Figure 1-3,p.107。

  2. Switch 轉送 Request:再通過 LR

    觀察點已從 LA 改到 LR;Switch 轉送同一筆 Request,不在此例另行發起交易。

    Switch 將 Request 轉到自己的 Upstream Port,再送給 Root Port。這一段由 Switch 的 Upstream Port 傳送、Root Port 接收。原始 Requester 仍是 A 的 Function 1;Switch 內部的虛線只表示轉送,不是另一條外部 Link。

    Base 6.0 §1.3.3/Figure 1-3,p.107;§2.2.6.2,p.157:Switch 轉送時保留 Transaction ID。

  3. 主機一端回傳 Completion:通過 LR

    假設 Read 已被正確處理,Completer 正在回覆資料。本圖不由單一 Link 的傳送推定所有交易成功。

    Root Complex 一端的 Completer(處理原 Request 並產生回覆的功能)返回 Completion。LR 上改成 Root Port 傳送、Switch Upstream Port 接收。資料方向變成 Downstream;Upstream Port 的名稱保持不變。

    Base 6.0 Terms and Acronyms:Completer、Completion、Downstream、Receiving/Transmitting Port,文件頁/PDF 頁 82–84、90、93。

  4. Switch 轉送 Completion:經 LA 回到 A

    這是同一筆 Read 的返回路徑;Completion 欄位與完整性檢查會在交易章繼續帶讀。

    Switch 從 Downstream Port A 將 Completion 送回 A。LA 上改成 Downstream Port A 傳送、A 的 Port 接收。A 的 Function 1 仍是原始 Requester,現在是在接收回覆;Requester 不是「此刻正在傳送的那一端」。

    Base 6.0 Terms and Acronyms:Requester、Completer、Completion;§1.3.3/Figure 1-3,文件頁/PDF 頁 82–83、90、107。

圖中 Switch 的 Downstream Port A,接收 Request 時是 Receiver,送回 Completion 時是 Transmitter。它一直是朝下游的那個 Port。原始 Requester(這筆 Read 的發起者)也一直是 A 的 Function 1,即使 Function 1 正在接收回覆。

本例只沿同一條 Root Port 路徑往返,不經過 Root Complex 跨 Root Port 的轉送。後者有另外的規則,不能把本例的 Switch 轉送方式直接套用。

先看拓撲,再讀角色定義

Figure 1-2 Example PCI Express Topology(§1.3,文件頁/PDF 頁 103)先定位 Root Complex 與 Switch;Figure 1-3 Logical Block Diagram of a Switch(§1.3.3,p.107)再展開 Switch 的 Port。Requester、Completer、Transmitter、Receiver 與 Upstream/Downstream 的正式定義見 Terms and Acronyms,pp.82、84、90、93–94。同一筆 Request 經 Switch 轉送時的 Transaction ID 規則見 §2.2.6.2,p.157;Root Complex 跨階層轉送的例外見 §1.3.1,pp.103–104。

Switch 為什麼會在設定空間裡變成多個 Bridge?

回到開頭的圖。Root Port 在本章的設定模型中呈現為一個 PCI-to-PCI Bridge,也就是連接上、下游匯流排的橋接功能。Switch 則呈現為多個邏輯 Bridge:Upstream Port 接到內部邏輯 Bus,各個 Downstream Port 再接出外部 Link。軟體可以沿這些關係找到下游。

PCI-to-PCI Bridge 是設定模型裡連接上、下游匯流排的橋接功能。Upstream 指朝向 Root Complex 的方向;Downstream 指離開 Root Complex、朝階層下游的方向。Switch 的 internal bus 是邏輯表示,不是把外部 PCIe Link 改成共享的平行匯流排。

先從上方一路往下讀:Root Port 的下一層是 Bus 01;到了 Switch Upstream Port,下一層才是內部 Bus 02;兩個 Downstream Port 再分別接到 Bus 03 和 Bus 04。所以 02:01.0 是橋接功能本身的位置,03:00.1 才是它下游的目標 Function。

依 Base 6.0 §7.1,本模型的 Switch 內部 Bus 只能出現代表 Downstream Port 的 Bridge,不能把一般 Type 0 Endpoint 畫在 Bus 02,與這些 Bridge 並列。圖上的卡 A、卡 B 因而放在各 Downstream Port 的下一層。

讀原圖時,依序看哪幾張?

先看 Base 6.0 Figure 1-3(§1.3.3,p.107),建立 Switch 裡有多個 virtual PCI-to-PCI Bridge 的觀念;再看 Figure 7-2(§7.1,p.904),確認這些 Bridge 如何映射到設定拓樸。Root Port 的對應關係看同頁 Figure 7-1。§7.1 p.903 說明 internal bus 與 Endpoint 限制,並限定這段 Switch 描述不使用 FPB Routing ID 機制。本圖沿用這個範圍。

拓撲上的 PCI/PCI-X Bridge 與 Switch 是同一種元件嗎?

不是。PCI Express to PCI/PCI-X Bridge 的用途,是連接 PCI Express fabric 與另一側的 PCI/PCI-X hierarchy。Switch 則以多個虛擬 PCI-to-PCI Bridge 的組合呈現,讓多個 PCIe Port 之間轉送交易。兩者的設定空間可能都呈現 Bridge 結構,因此看到 Bridge Header 時,仍要確認它的 Device/Port Type 與實際下游連線。

【模擬資料】若工具的拓撲圖在 PCIe Port 後面畫出 PCI Express to PCI/PCI-X Bridge,先辨認 Bridge 的 PCIe 側和 PCI/PCI-X 側,再選擇各自適用的協定與設定規則。不能把 PCI/PCI-X 的下游匯流排畫成另一條 PCIe Link,也不能只憑 Header Type 判定它是 Switch Downstream Port。此處只建立識別入口;Bridge 的完整轉換與例外需查對應規格。

Base 6.0 §§1.3.3、1.3.5,Figure 1-3,pp.106–108;Device/Port Type 見 §7.5.3.2。

兩個 Endpoint 在不同 Root Port 下,一定能互相存取嗎?

【模擬資料】假設 Endpoint A、B 分別位於同一個 Root Complex(RC)的不同 Root Port 下。先沿 Figure 1-2 找出兩個 hierarchy domain:若 A 要存取 B,路徑需要經過 RC。Base 6.0 §1.3.1 把跨 domain 的 peer-to-peer 路由列為可選且取決於實作;兩個 Endpoint 都能被列舉,仍不足以證明 RC 提供這條路徑。

RC 支援這種路由時,可以採不同設計:例如接手 Request、重新形成必要的封包並處理返回的 Completion,也可以在內部採用實體或虛擬 Switch。§1.3.1 一般允許 RC 在跨 domain 轉送時拆分封包;相對地,§1.3.3 不允許 Switch 把一個封包拆成更小的封包。兩者都須遵守各自適用的封包規則,不能把某一種實作當成所有平台的路徑。

拆分也有例外:RC 轉送 Deferrable Memory Write Request 時不得拆分;Vendor-Defined Message 若要拆分,受 128-byte 邊界條件限制。實際分析還須確認平台路由、各 Bridge Window、目標 BAR 與存取政策;本題只由拓撲確認需要經過 RC,無法保證 Request 會到達 B。

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

Base 6.0 §1.3、Figure 1-2,pp.102–103;§§1.3.1、1.3.3,pp.103–104、106–107;Deferrable Memory Write 的細節見 §6.32。

找到 Endpoint,為什麼有時沒有可配對的 Link?

前面案例的插卡是接在 Port 外部的 Endpoint。Figure 1-2 還有另一種位置:Root Complex Integrated Endpoint(RCiEP,整合在 Root Complex 內的 Endpoint)。它仍是一個 Function,支援 Configuration Request,但它位於 Root Complex 內部,不出現在 Root Port 對外的 hierarchy domain 或 Switch 中。

【模擬資料】假設某個可讀取設定空間的 Function,Device/Port Type 識別為 RCiEP。此時應查 RCiEP 適用的欄位;規格要求它不實作 Link Capabilities、Link Control、Link Status 及其 2 版 Register。不能只因讀不到這些 Register,就判斷有一條 Link 斷線。若 Function 是另一種 Device/Port Type,仍須依該類型查它的適用規則。

RCiEP 也可能與可選的 Root Complex Event Collector(RCEC,Root Complex 事件收集器)關聯。RCEC 處理相關 RCiEP 的錯誤與 PME(Power Management Event,電源管理事件)訊息;要確認關聯,查 RCEC 的 Endpoint Association Extended Capability。RCEC 是可選的,不能假設每個 RCiEP 都有一個。若某個 RCiEP 已關聯 RCEC,規格要求其 PME 和錯誤經由該 RCEC,且它最多只關聯一個 RCEC。

三種 Endpoint 都使用 Type 0 Configuration Header,但限制並不相同。讀 §1.3.2.1–§1.3.2.3 時,可先比對下表,再按實際欄位回到對應規則。

手機閱讀時,可左右滑動表格查看完整內容。

Function 類型與 I/O Request 有關的規則Memory Requester 位址能力
Legacy Endpoint可選擇產生 I/O Request,也可選擇作為 I/O Request 的 Completer不要求能產生 4 GB 以上的位址
PCI Express Endpoint不得產生 I/O Request,也不得依賴作業系統配置 BAR 所宣告的 I/O 資源須能產生大於 4 GB 的位址
RCiEP不得產生 I/O Request,也不得要求 BAR 所宣告的 I/O 資源須能產生 Host 作為 Completer 可處理的位址範圍
BAR
Base Address Register,基底位址暫存器

這些條件各自針對 Function 的角色與能力;不能把「某次 Request 使用的位址」當成該 Function 的完整位址能力,也不能把三種 Endpoint 的限制混成同一條。

Base 6.0 §1.3、Figure 1-2,pp.102–103;§§1.3.2.1–1.3.2.3、1.3.4,pp.104–106、108;Device/Port Type 的欄位見 §7.5.3.2。

只知道 BDF,怎麼查它是 Endpoint 還是 Port?

Device/Port Type 是 Function 類型欄位。先以 Figure 1-2 的系統圖認識角色,再依 Figure 7-23/Table 7-19 核對軟體讀到的類型,才知道後續哪些欄位適用。Type 0 Header 也可能是 Root Complex Integrated Endpoint(整合在根部內的端點)或 Root Complex Event Collector(收集整合端點事件的功能),不能把 Type 0 一律解讀成外部插卡。

先用 BDF 選定 02:01.0 的設定空間,再讀兩組欄位。Header Type(決定標頭布局並指示多功能的欄位) 的低位元決定要採用哪一種標頭布局;PCI Express Capability 內的 Device/Port Type 才區分 Root Port、Switch Port 與 Endpoint。下面依這個順序讀取。

  1. 先分清 Header 的兩個欄位
    Figure 7-8 與 Table 7-7:低 7 bits 是 Header Layout,bit 7 是 Multi-Function Device。
  2. 找到 PCIe 類型欄位
    Figure 7-21:從已找到的 Capability 起點加 0x02,定位 16-bit PCI Express Capabilities Register。
  3. 解碼角色
    Figure 7-23 定位 bits 7:4,Table 7-19 查 Device/Port Type 編碼與適用 Header。
本例的角色辨識資料
Segment 0000 中的 BDF0x0E 的 8-bit 讀值0x72 的 16-bit 讀值之低 byte查表後的角色
00:01.00x010x42Type 1 Header;PCIe Type 4,Root Port。
01:00.00x010x52Type 1 Header;PCIe Type 5,Switch Upstream Port。
02:01.00x010x62Type 1 Header;PCIe Type 6,Switch Downstream Port。
02:02.00x010x62Type 1 Header;PCIe Type 6,另一個 Switch Downstream Port。
03:00.00x800x02Type 0 Header,可能有其他 Function;PCIe Type 0,Endpoint。

以 Downstream A 為例,0x01 & 0x7F = 1 先選出 Type 1 Header。設讀到的 16-bit Capabilities Register 為 cap,則 (cap & 0x00F0) >> 4 = 6,才得到 Switch Downstream Port。cap & 0x000F = 2 則表示 Capability Version 2,與 Type 6 是不同欄位,也不是連線的 PCIe 世代。

Header Type 為 0x80,就代表有 8 個 Function 嗎?

不是。先做 0x80 & 0x7F = 0,可知 Header Layout 仍是 Type 0;bit 7 為 1,只表示這個 Device 可能含有多個 Function,允許軟體探查其他 Function,並未回報數量。卡 A 的 Function 1 存在,是題目已確認的另一筆資料,不能只從 0x80 推出。

Table 7-7 也規定,若此 bit 為 0,軟體不得探查 Function 0 以外的 Function,除非 ARI、SR-IOV 等其他機制另有指示。本章已排除這些機制;不能為了練習,就把「一律掃完 0–7」當成通用規則。

ARI
Alternative Routing-ID Interpretation,替代路由識別碼解讀
SR-IOV
Single Root I/O Virtualization,單根I/O虛擬化

確認類型後,為什麼還要看欄位適用性?

以 Data Link Layer Link Active(回報 Data Link 是否處於 DL_Active 的位元)為例:先讀 Link Capabilities 的 Data Link Layer Link Active Reporting Capable,確認這個 Port 是否提供回報。未實作回報時,Link Status 的對應位元固定讀為零;這個零值不能拿來判定 Link 失效。對端點所在的 LA,應先查看 Downstream Port A 的有效回報,再依需要補上端點與協定紀錄。

若讀到的是 Root Complex Integrated Endpoint,就先回到 §1.3.2.3:這種 Function 沒有外部 Link,規格禁止它實作 Link Capabilities、Link Control、Link Status 及其對應的 2 Registers。同一份解碼表用在不同 Function 上,必須先選出實際適用的欄位。

Base 6.0 §7.5.3.2/Figure 7-23/Table 7-19,文件頁/PDF 頁 953–954;§7.5.3.6/Table 7-23,p.969;§7.5.3.8/Table 7-26,p.979;§1.3.2.3 Root Complex Integrated Endpoint Rules,pp.105–106。

欄位位置與查表順序的來源

Base 6.0 §7.5.1.1.9,Figure 7-8/Table 7-7,pp.924–925;§7.5.3 Figure 7-21,p.952;§7.5.3.2 Figure 7-23/Table 7-19,pp.953–954。Table 7-19 的名稱雖是 Device/Port Type,實際描述的是這個 Function 的類型。Type 1 Header 不只適用於 Switch Downstream Port,不能跳過第二次查詢。

卡 A 支援 64.0 GT/s,主機到卡 A 的路徑也一樣嗎?

先逐條 Link 比較兩端支援能力,再另外記錄目前速率與寬度。下面沿用同一拓撲;數值是假設兩端同步取得、且 Link 已建立的解碼結果,尚未提供 Target、訓練歷史或板上 Lane 接線資料。

教學快照:能力、共同上限與目前結果
Link兩端各自的最高速率/最大寬度共同支援的最高速率與寬度上限兩端一致回報的目前結果
LRRoot Port:32.0 GT/s、x8
Switch Upstream Port:32.0 GT/s、x8
32.0 GT/s、x832.0 GT/s、x8
LADownstream Port A:64.0 GT/s、x8
Endpoint A Port:64.0 GT/s、x8
64.0 GT/s、x816.0 GT/s、x4
LBDownstream Port B:16.0 GT/s、x4
Endpoint B Port:16.0 GT/s、x4
16.0 GT/s、x48.0 GT/s、x4

先讀 LA:A 的 Port 與 Downstream Port A 都支援 64.0 GT/s,但目前共同運作於 16.0 GT/s、x4。這是能力與目前結果的比較;要解釋為什麼採用這個結果,還需要有效的控制設定、實際接線與訓練紀錄。

再沿路讀 LR:卡 A 與主機之間還經過 LR,其兩端最高支援 32.0 GT/s。資料經 Switch 在不同 Link 之間轉送,各條 Link 分別訓練與運作;整條路徑不會共同協商成一個速率。因此,Endpoint 的 64.0 GT/s 能力描述的是自己的 Port,不能代替上游 Link 的資料。

這張表也不能直接推算應用效能。資料量、其他分支流量、封包與傳輸開銷都會影響實際進度。這裡只先建立逐 Link 比較的方法。

  1. 先定位能力欄位
    Figure 7-27/Table 7-23:讀 Max Link Speed 與 Maximum Link Width;Figure 7-38/Table 7-35:讀 Supported Link Speeds Vector。
  2. 再定位目前結果
    Figure 7-29/Table 7-26:讀 Current Link Speed 與 Negotiated Link Width;Link 未建立時,這兩個值的定義有條件。
  3. 把讀值放回同一條 Link
    先比相鄰兩端,再沿拓撲換到下一條 Link;設定、目前狀態與事件紀錄分欄保留。

以上是規格查閱順序,不是 Link Training 的執行時序。欄位位移與速率編碼的完整讀法可接回 Chapter 0 的查詢案例;本節將重點放在讀值描述哪一個 Port 與哪一條 Link。

能力與狀態欄位的正式位置

Base 6.0 §7.5.3.6 Link Capabilities Register (Offset 0Ch),Figure 7-27/Table 7-23,文件頁/PDF 頁 966–969;Maximum Link Width 可大於實際接線寬度的規則在 p.967。§7.5.3.18 Link Capabilities 2 Register (Offset 2Ch),Figure 7-38/Table 7-35,p.998,定義 Supported Link Speeds Vector;本例各 Port 支援從 2.5 GT/s 到其最高速率之間的全部速率。§7.5.3.8 Link Status Register (Offset 12h),Figure 7-29/Table 7-26,pp.977–979,定義 Current Link Speed、Negotiated Link Width 及欄位適用性。逐 Link 初始化見 §1.2,p.102。

03:00.1 的每一段究竟選了誰?

Bus、Device、Function 合稱 BDF。在傳統編址下,Bus Number 有 8 bits,Device Number 有 5 bits,Function Number 有 3 bits。先選定 PCI Segment Group(本章簡稱 Segment),再選其中的 Bus,接著選 Device 與 Function,才能定位本章的設定對象。

把 0000:03:00.1 拆開;本章位址各段均採十六進位
部分案例值意義與範圍
Segment0000先選哪個 PCI Segment。Firmware 3.3 定義 Segment 為一組 Bus;每組最多 256 個 Bus,系統可有多個 Segment。
Bus03該 Segment 中的 Bus 03;8-bit 範圍為 00–FF。
Device00Bus 03 上的 Device 00;5-bit 範圍為 00–1F。
Function1Device 00 的 Function 1;3-bit 範圍為 0–7。可編碼 8 個位置,不表示 8 個都存在。

可編碼的位置也不能當成實體連接數量。依本章未使用 ARI/FPB 的普通 Link 規則,對端使用 Device 0;Switch 的 Downstream Port 則可在內部 Bus 上使用其他 Device Number。因此圖中的 Endpoint 與 Switch Upstream Port 都是 Device 00,而兩個 Downstream Port 分別是 Device 01、02。(Base 6.0 §7.3.1,p.911。)

ARI
Alternative Routing-ID Interpretation,替代路由識別碼解讀
FPB
Flattening Portal Bridge,扁平化入口橋接器

前綴 0000: 是本章用來標出 Segment 的寫法。它提供查詢所需的範圍,並不是一個額外的 Bridge,也不能拿來推算 CPU 插槽數量。

另一個 Segment 也有 03:00.0,會衝突嗎?

新增教學假設:系統另有 Segment 0001,其中一條 Root Port 路徑接到 0001:03:00.0。這與圖中的 0000:03:00.0 是兩個不同的設定對象;只有省略 Segment,才會看起來相同。紀錄資料時,應把 Segment 與 BDF 一起保留。

反過來,同一份穩定快照、同一個 Segment 裡,03:00.0 和 03:00.1 具有相同的 Bus 與 Device,指向同一個 Device 的兩個 Function。至於它們在實體上裝在哪張卡,還需要實體配置的資訊;本例是題目另行給定卡 A 的組裝方式。

規格依據:編碼範圍與 Segment

Base 6.0 §2.2.4.2、Table 2-8(p.147),Figures 2-20、2-22(p.148),說明傳統 ID 編碼;Requester ID(封包要求來源的識別號) 的條件另見下節。設定拓樸見 §7.1 pp.903–904。PCI Firmware 3.3 §1.3,pp.8–9 定義 PCI Segment Group:每組最多 256 個 PCI Bus,系統最多 65536 個 Segment。這是位址範圍,不是每個平台都實作最大數量的保證。

要找 Bus 03,為什麼沿著 Downstream A?

角色已經查清楚,接著要確認橋接關係。對本章採用的一般 Type 1 Bridge 而言,Secondary Bus Number 指出緊接在下游的 Bus;Subordinate Bus Number 則標出其下游階層涵蓋的最高 Bus Number。兩個值一起讀,才分得清「下一層是哪個 Bus」與「整個下游範圍到哪裡」。

閱讀順序是:先由 Header Layout 確認 Type 1,再看 Type 1 Configuration Space Header 的 Figure 7-14,找到 0x19 與 0x1A,最後讀 §7.5.1.3.3 與 §7.5.1.3.4 的欄位定義。兩個 offset 都從該 Function 的設定空間起點計算,各讀 8 bits;它們不以 PCIe Capability 為起點。

教學快照中的 Bridge 下游範圍
Bridge BDF0x19:Secondary0x1A:Subordinate本例如何使用
00:01.00x010x04Root Port 下一層為 Bus 01,下游範圍涵蓋 Bus 01–04。
01:00.00x020x04Switch Upstream Port 下一層為內部 Bus 02,下游範圍涵蓋 Bus 02–04。
02:01.00x030x03Downstream A 的下游範圍只有 Bus 03。
02:02.00x040x04Downstream B 的下游範圍只有 Bus 04。

案例推演:目標 0000:03:00.1 位於 Segment 0000 的 Bus 03。Bus 03 落在 Root Port 的 01–04 範圍,也落在 Upstream Port 的 02–04 範圍;到了兩個 Downstream Port,只有 A 的 03–03 範圍符合。因此圖中的分支是 A,最後仍須以 Device 00、Function 1 選定對象。

這裡練習的是把已知快照與欄位對上,沒有執行 Configuration Write。Bus Number 怎麼分配、尚未配置時如何搜尋,以及 Configuration Request 如何轉送,分別留到枚舉與交易章。也不要把這張 Bus 範圍表當成 Memory BAR 的位址窗口;它們處理的識別與資源不同。

規格依據與這個方法的範圍

Base 6.0 §7.5.1.3,Figure 7-14(p.936);§7.5.1.3.3–§7.5.1.3.4(p.937)。本章不使用 FPB Routing ID 機制。Primary Bus Number 位於 0x18,但 §7.5.1.3.2(p.937)說明此欄位通常不供 PCIe Function 使用,主要為相容性保留;本例沒有用它來推出 Bridge 自己的 BDF。

封包裡的 Requester ID 和 BDF 有什麼關係?

當某個 Function 發出交易要求時,Requester ID 用來識別要求者。本章的傳統格式把 Bus、Device、Function 放進 16 bits;因此,先理解 BDF,後面閱讀交易封包才知道這個欄位在指誰。封包如何配對要求與回覆,會在 Chapter 5 再談。

傳統 16-bit Requester ID 的位元配置bits 15 至 8 是 8-bit Bus Number,bits 7 至 3 是 5-bit Device Number,bits 2 至 0 是 3-bit Function Number。範例 Bus03、Device00、Function1 編碼為 0x0301。 1587320 Bus Number0x03Device Number0x00Function1Requester ID = 0x0301
自製欄位示意,適用於本章的非 ARI 傳統格式。Segment 不在這 16 bits 之內。
Requester ID = (Bus << 8) | (Device << 3) | Function
03:00.1 → (0x03 << 8) | (0x00 << 3) | 1 = 0x0301
02:02.0 → (0x02 << 8) | (0x02 << 3) | 0 = 0x0210

案例推演:要把 0x0210 還原,先取 (id >> 8) & 0xFF = 0x02 得到 Bus,再取 (id >> 3) & 0x1F = 0x02 得到 Device,最後取 id & 0x07 = 0 得到 Function。它對應圖中的 Downstream B,而不是 Bus 02 上的 Function 0x10。

這個算式把要求來源的 BDF 編成識別號。封包經過 Downstream B 時,要求者仍是原先發出要求的 Function;Switch 轉送時必須保留 Transaction ID。因此要分別記錄「誰發出要求」與「要求經過哪些 Bridge」。

此外,0000:03:00.0 與 0001:03:00.0 的傳統 16-bit 編碼都會是 0x0300。因此只拿到這 16 bits,仍缺少判定 Segment 的情境。這不等於宣稱封包完全沒有 Segment 資訊:PCIe 6.0 的部分 Flit Mode 格式另有 Segment 欄位,不能與這個 16-bit 欄位混為一談。

規格依據:Requester ID 與 Segment 的邊界

先看 Base 6.0 §2.2.4.2 的 Table 2-8(p.147)、Figures 2-20/2-22(p.148)辨認非 ARI 的位元分配,再讀 §2.2.6.2(pp.156–157)的 Requester ID 規則。前幾張圖展示的是目的地 ID routing,不能把圖上的封包 byte offset 套到所有 Requester ID;本章只取 BDF 的編碼關係。p.157 也明定 Switch 轉送要求時不得修改 Transaction ID,並把 Segment 定義為獨立欄位。Flit Mode 的獨立 Segment 資訊見 §2.2.1.2,pp.134–139。本章只做欄位識別與編碼,沒有把傳統 BDF 的拆法延伸到 ARI。

記住 BDF,下一次開機就能認出同一張卡嗎?

跨次開機比對硬體時,先保留每筆紀錄所屬的配置快照。BDF 描述目前設定拓樸中的位置;Bus Number 由配置流程建立,同一硬體可能因拓樸或分配方式改變而取得不同位置。若要追蹤實體個體,還要取得可信的裝置身分或平台位置資訊。

若要跨開機追蹤實體裝置,就需要另外取得可信的裝置身分或平台位置資訊。Vendor ID、Device ID 描述廠商與裝置類型,不能單獨充當每一件產品的唯一序號。這類長期識別需求與本章的「選定目前哪個 Function」不同,不能用一組 BDF 同時回答。

規格依據與推論範圍

Base 6.0 §2.2.6.2(pp.156–157)說明 Bus/Device Number 的設定、捕獲與執行期間可改變的性質;另外, §7.5.1.1.1–§7.5.1.1.2(p.917)的 Vendor ID/Device ID 定義,也支持上述區分。換成 Bus 05 是教學推演;規格不要求每次開機更改 BDF,也未由這些 ID 保證實體個體的唯一性。

資料還不齊時,先把觀察位置補完整

讀者收到的報告未必同時包含拓撲、對端與完整欄位。先保留原始讀值與時間,再補上它所描述的對象,下一個人才能沿同一條路徑繼續分析。

先整理觀察資料,再接下一步查閱
手上只有的資料先補什麼接回本章哪裡
一筆「32.0 GT/s、x8」哪個 Port、其直接對端、讀取時間,以及讀的是能力還是 Link Status。逐 Link 配對,再看能力與目前結果。
工具標出「Endpoint」目標 Function 與實際的 Header Type、Device/Port Type 讀值。從正式欄位確認類型與適用性。
一個來自卡 A 的 Request擷取的是 LA 還是 LR、哪個方向,以及 Request 的來源 Function。沿同一筆 Read 指定傳送端與接收端。

本章沒有提供完整訓練歷史、錯誤時間線或裝置內部處理紀錄。這些資料要在對應情境中另外取得,不能從一張拓撲或一次設定快照補成既定事實。

知道查誰之後,下一步看什麼?

現在可以先用 Segment 與 BDF 選定 Function,再用 Header Layout 與 Device/Port Type 判斷該怎麼讀它。Chapter 2 將整理設定空間的完整查詢方法:傳統與 Extended Capability 從哪裡開始、指標怎麼走,以及欄位寬度、版本與存取屬性如何影響解讀。

Chapter 2 接續處理設定查詢,再走到枚舉與資源配置。需要深入同一條 Link 的訓練與狀態,可讀 Link 建立與可靠傳遞;Request 與 Completion 的詳細關係則接到 交易章。完整主題與各章狀態見 課程閱讀路線。

版本與來源

主要依據是讀者提供的 PCI Express Base Specification Revision 6.0(6.0-1.0-PUB)與 PCI Firmware Specification Revision 3.3。Firmware 3.3 的參考文件列的是 Base 5.0(§1.2,p.7),本章沒有把它當成 Base 6.0 的配套版本;實際欄位均以 Base 6.0 為準。

本章先使用 Base 6.0 的架構、角色與 Register 規則;Firmware 3.3 僅用於後半部 Segment 的補充,不是架構主線的依據。各節來源中的頁碼同時表示文件印刷頁與 PDF 檢視器頁,這份文件的兩者相同。

從系統圖接到欄位的主要閱讀位置
來源正式名稱文件頁/PDF 頁本章怎麼使用
§1.2/Figure 1-1PCI Express Link100–102/100–102讀兩端、傳送/接收方向與多 Lane 關係。
§1.3/Figure 1-2PCI Express Fabric Topology/Example PCI Express Topology102–103/102–103先定位 Root Complex,再辨認每一條獨立 Link;圖中階層邊界不是實體卡片邊界。
§1.3.3/Figure 1-3Switch/Logical Block Diagram of a Switch106–107/106–107放大 Switch,分清 Port、virtual Bridge 與內部連接;內部線不當成外部 Link。
§7.5.3.2/Figure 7-23/Table 7-19PCI Express Capabilities Register953–954/953–954依 Device/Port Type 核對 Function 類型與 Header 適用性。
§7.5.3.6/Figure 7-27/Table 7-23Link Capabilities Register966–969/966–969辨認最大能力、共用 Port 欄位及狀態回報能力。
§7.5.3.18/Figure 7-38/Table 7-35Link Capabilities 2 Register998/998以 Supported Link Speeds Vector 比較同一 Link 的兩端。
§7.5.3.8/Figure 7-29/Table 7-26Link Status Register977–979/977–979在 Link 建立的前提下,讀目前速率、寬度與有效的狀態回報。

各節另列 BDF、Bridge Bus 與識別號所用的必要條文。自製圖表與假設讀值均為教學設計;沒有用這些資料宣稱實機發生了特定故障。原始 PDF 不隨教材公開。架構、角色與逐 Link 比較的查核日期:2026-10-24。