以下文章來源于AdriftCoreFPGA芯研社,作者CNL中子
前言
如果把整個 PCIe 系統比作一個龐大的社會,那么每一個 EP 設備都需要在入職時向系統提交一份詳細的個人檔案。這份檔案不僅記錄了它是誰(Vendor/Device ID)、由誰代工(Subsystem ID),還聲明了它的職業能力(Class Code)以及它需要占用的辦公資源(BAR 空間)。我們將深入剖析 PCIe 配置空間中Type 0 Header的核心成員,探討這些寄存器背后的意義。
配置空間
在 PCIe 協議中,Endpoint (EP)具有獨立的配置空間。其中,EP 的配置空間首部(Header)被定義為Type 0,主要用于存放 EP 設備的各種配置寄存器(例如上一章提到的 BAR 寄存器),軟件通過修改這些寄存器的值來完成對設備的初始化。與之對應,Type 1主要用于Root Complex (RC)以及Switch的配置空間首部。

image

image
在整個配置空間結構中,前64 DW (256B)是 PCI 與 PCIe 共同擁有的標準配置空間,而后續的960 DW (3840B)則是 PCIe 特有的擴展配置空間(Extended Capability)。

image
ID
在 PCIe 配置空間(Configuration Space)的頭部(Header)中,Vendor ID(廠商標識)和Device ID(設備標識)是兩個最基礎、最重要的只讀寄存器。
它們位于配置空間的起始位置(Offset 00h ~ 03h),相當于 PCIe 設備的身份證。操作系統和 BIOS 正是通過這兩個 ID 來識別設備,并為其加載正確的驅動程序。
Vendor ID (廠商 ID)
定義:代表生產該 PCIe 芯片的廠商。
分配權:由PCI-SIG統一分配,不能隨意填寫。
典型值:
?0x8086:Intel (因 x86 架構得名)
?0x10DE:NVIDIA
?0x1002:AMD (ATI)
?0x10EE:AMD (XILINX)
注意:如果 CPU 讀取某個設備的 Vendor ID 返回0xFFFF,通常表示該位置不存在設備(Device Not Present),或者鏈路訓練失敗導致無法讀取。
Device ID (設備 ID)
定義:代表廠商生產的具體某一款芯片或產品。
分配權:由廠商自己定義。只要保證在該 Vendor ID 下唯一即可。
作用:用于區分同一廠商的不同產品。例如 NVIDIA 的不同顯卡芯片(RTX 3060 vs RTX 4090)會有相同的 Vendor ID,但 Device ID 不同。
Sub ID
在 PC 產業中,芯片廠商(如 NVIDIA, Intel, Realtek)通常只賣芯片,而板卡廠商(如 華碩, 戴爾, 聯想)會將這些芯片買回去,做成顯卡、網卡或集成在主板上。
如果說 Vendor ID/Device ID 識別的是這顆PCIe芯片是誰造的、是什么型號,那么 Subsystem Vendor ID/Subsystem ID 識別的就是這塊板卡(或成品設備)是誰造的、是什么型號。
例如顯卡,NVIDIA生產了RTX 3070芯片。華碩 (ASUS)和微星 (MSI)都買了這款芯片,分別做成了華碩 RTX 3070猛禽和微星 RTX 3070魔龍 。
對于操作系統來說,這兩張卡的核心芯片是一模一樣的(Vendor ID 都是 NVIDIA,Device ID 都是 3070)。如果沒有 Subsystem ID,系統就無法區分這兩張卡。
這就導致了兩個問題:
1. 華碩可能有專門的 RGB 燈光控制軟件或風扇策略,不能用在微星的卡上。 2. OEM 廠商(如聯想)可能希望系統里顯示Lenovo Graphics而不是公版的NVIDIA Graphics。
Subsystem Vendor ID (SVID, 子系統廠商 ID)
定義:代表板卡制造廠商(Add-in Card Manufacturer)或系統集成商。
分配:由PCI-SIG組織分配。通常,華碩、戴爾、惠普都有自己獨立的 PCI-SIG 廠商代碼。
?0x1043:ASUS (華碩)
?0x1028:Dell (戴爾)
?0x10EE:XILINX
Subsystem ID (SID, 子系統 ID)
含義:代表該廠商生產的具體板卡型號。
分配:由SVID 的持有者(即板卡廠商自己)定義。
FPGA ID
對于FPGA來說電腦會認為插了一個Xilinx 的設備。你可以直接使用 Xilinx 提供的官方驅動(如 XDMA 驅動或 QDMA 驅動),因為這些驅動默認識別
Vendor ID 保持默認的0x10EE(Xilinx 的 ID)。Device ID 保持默認取決于具體的 FPGA 型號,或者改成你為了區分不同工程而自定義的數字(比如0x7020)。Subsystem ID 通常不關心,保持默認。
如果你要把這個 FPGA 板卡作為一個獨立產品出售(比如做了一個 FPGA 加速卡),有兩種方法
正式途徑
你的公司向 PCI-SIG 組織交錢(年費約 4000 美元),申請一個屬于你們公司的Vendor ID(比如0xABCD)。
在 Vivado 里,把 Vendor ID 改成0xABCD。優點是顯得非常專業,擁有獨立的驅動簽名。缺點是費錢。
常規做法
Vendor ID 繼續填0x10EE(Xilinx)。Device ID 填一個你自定義的數(例如0x8888)。Subsystem Vendor ID 填 Xilinx 的 ID。Subsystem ID 填你定義的產品型號。這種情況下,你需要在你的驅動程序(Driver)的.inf文件里添加這個特定的 Device ID,否則系統不知道這個 Xilinx 設備該用什么驅動。
Class Code
Class Code(類代碼)是 PCIe 配置空間中一個非常巧妙且關鍵的字段。
如果說 Vendor ID 和 Device ID 是設備的品牌和型號例如:我是 NVIDIA 生產的 RTX 3080;那么 Class Code 就是設備的職業資格證例如:我是做圖形顯示的,或者是做網絡通信的。
它位于配置空間頭部的Offset 08h位置,總共占用24 bits (3 字節)。
它由三個獨立的 8-bit 寄存器組成,層級非常分明,從左到右(高位到低位)依次是:
| 字節位置 | 名稱 | 含義 (Role) | 舉例 |
|---|---|---|---|
| 高字節 (Offset 0Bh) | Base Class (主類) | 大行業 這設備屬于哪個大類 | 存儲控制器 (01h)、網絡控制器 (02h)、顯示控制器 (03h) |
| 中字節 (Offset 0Ah) | Sub-Class (子類) | 具體工種 在大類里具體干啥 | 存儲里的 Flash (08h)、網絡里的 Ethernet (00h) |
| 低字節 (Offset 09h) | Prog IF (編程接口) | 工作語言 用什么標準協議溝通 | 符合 NVMe 標準 (02h)、符合 AHCI 標準 (01h) |
對于FPGA的意義
對于FPGA來說Class Code的意義主要是實現免驅。
所謂的免驅(Driver-free),并不是說操作系統不需要驅動程序,而是指直接使用操作系統內置的通用驅動程序(In-box Driver),用戶不需要手動下載安裝特定的.exe或編譯內核模塊。
例如,操作系統(Windows 10/11, Linux, macOS)都內置了NVMe 驅動。如果你的 FPGA 宣稱自己是一個 NVMe SSD,系統就會自動加載內置的stornvme(Windows) 或nvme(Linux) 驅動。但是你不能只改Class Code為NVMe設備,如果你的 FPGA 被識別為 NVMe,操作系統會立刻發出一堆標準的 NVMe 命令(如Identify Controller,Create IO Queue)。你的 FPGA 邏輯必須能夠嚴格遵循 NVMe 協議來響應這些命令。又或者我們更改Class code將 FPGA 偽裝成一個 PCI 串口卡。Windows 會自動將其識別為 COM 口。但同樣,你的 FPGA 必須在 BAR 空間里模擬 16550 UART 的寄存器行為。
寫在最后
Type 0 Header 看似只是一些靜態寄存器的集合,但它決定了操作系統如何看待你:你是誰、你從哪來、你能干什么、以及系統該用什么方式與你對話。
無論是做 ASIC 還是 FPGA,理解這些字段背后的規則,才能避免“設備能枚舉卻用不了”“驅動始終加載不上”這類看似玄學、實則配置層就已埋雷的問題。
當你真正把 Vendor / Device / Subsystem / Class Code 這些信息設計清楚,PCIe 設備才算完成了從能被看到到能被正確使用的關鍵一步。后面的 BAR、Capability、MSI/MSI-X,才有發揮空間。
-
寄存器
+關注
關注
31文章
5612瀏覽量
130198 -
操作系統
+關注
關注
37文章
7416瀏覽量
129455 -
PCIe
+關注
關注
16文章
1464瀏覽量
88696
原文標題:漫談PCIe——如何通過配置空間定義一個硬件的職業與身份
文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
NVMe高速傳輸之擺脫XDMA設計之八:PCIe初始化狀態機設計
從哪個文檔中我能夠理解PCI配置空間中每個寄存器的含義
PCIE基本概念與拓撲架構圖
CCIX 1.1設備必須支持PCIe 5.0 PHY或CCIX EDR PHY這兩種物理層嗎
體驗紫光PCIE之DMA讀寫/PIO內存讀寫TLP解析
PCI總線配置周期產生和配置寄存器
瑞薩電子宣布成為AVCC聯盟核心成員,共同助力自動駕駛汽車發展
圖解PCIE原理(從軟件角度)
深入剖析PCIe配置空間中Type 0 Header的核心成員
評論