PCIE兼容了大部分PCI總線的特性,區別在於使用串行差分總線代替了並行總線,並實現了協議分層。PCIE的帶寬與LANE數量和時鍾頻率相關,時鍾頻率支持2.5G和5G,Lane支持x1/x2/x4/x8/x12/x16/x32,每個Lane由一對差分信號組成。
1、PCIE總線拓撲結構
PCIE總線拓撲結構主要由RC(Root Complex)、SW(Switch)和EP(Endpoint)組成,通過總線號、設備號唯一標識每個PCIE設備,每個設備擁有1~8個功能號。根據PCIE協議規范定義,一個PCIE總線拓撲結構中,最多支持256級總線,每條總線上最多掛載32個PCIE設備,SW可以理解為一種特殊的PCIE設備。每個SW代表一級Bus,掛載在該SW下的所有PCIE設備(包括SW和EP)都屬於這一級Bus。這樣,通過總線號、設備號、功能號就可以匹配到指定的功能設備。
1.1、Root Complex(RC)
CPU連接到根聚合體(Root Complex),RC負責完成CPU地址域和PCIE總線域的轉換,並且實現各種總線的聚合。將一部分CPU地址映射到內存,一部分地址映射到相應的相應的PCIE設備。
1)Root Complex是I/O層次結構的根節點,用來連接CPU/Memory子系統到I/O子系統,相當於PCI總線結構中的主橋(北橋)。
2)一個Root Complex可以支持一個或者多個PCI Express Ports,每個端口表示一個獨立的I/O層次結構域,每個I/O層次結構域由一個單獨的Endpoint組成或者由一個或者多個Switch組件和Endpoints組成。
3)I/O層次結構域通過Root Complex進行P2P對等網絡傳輸是可選功能,實現方式也是獨立的。
4)Root Complex作為Requester時,支持組包configuration request、I/O request和locked request
1.2、Endpoint
Endpoint是PCIE體系結構的根節點,可以作為傳輸的請求方(Requester)或者結束方(Completer)。Endpoint可以分為Legacy Endpoint、PCIE Endpoint和Root Complex Integrated Endpoint三種。傳統端點設備支持I/O傳輸、鎖定傳輸,不需要支持64位尋址;PCIE端點不需要支持I/O或者鎖定傳輸,必須支持64位尋址。
Endpoint是指只具有上游端口(即指向Root Complex或者Switch的端口)的一個具體的PCIE設備。
1.3、Switch
Switch由多個虛擬PCI-to-PCI Bridge設備組成,用於多設備互連,實現路由尋址轉發、仲裁等功能。它包含以下特性:
1)一個Switch由至少兩個PCI-to-PCI Bridges組成
2)Switch使用PCI橋的機制實現數據傳輸,如基於地址的路由機制
3)Swtich必須支持在任意端口之間傳輸任意類型的TLP(Transaction Layer Packet)
4)Swtich必須支持Locked Request,但是下游端口作為發起方時,發起的Locked Request不需要支持
5)每一個使能的Swtich Port必須遵循流控協議(Flow Control)
6)Swtich不可以將TLP數據包分割成多個小數據包進行傳輸
7)當同一個VC(Virtual Channel)發生競態時,Swtich的Ingress Ports(inbound Link)之間的仲裁機制通過round robin或者weighted round robin算法實現
1.4、PCIE設備枚舉
由前述可知,PCIE總線系統中,通過Bus號和Device號唯一標識PCIE設備,通過Function號唯一標識PCIE設備的功能。
Bus號和Device號是PCIE初始化時進行PCIE設備枚舉產生的,而Function號是通過硬件編碼設置的,這是因為不同的拓撲結構下,PCIE設備在拓撲網絡中的位置不是固定的,而每個PCIE設備支持的功能是可以確定的。
PCIE設備枚舉就是在PCIE總線初始化的過程中,使用深度優先算法動態檢測PCIE總線拓撲網絡結構,為每一個PCIE設備(包括SW和EP)確定Bus號和Device號。
PCIE設備枚舉主要基於以下幾點因素實現:
1)每個PCIE設備至少支持一個Function(最多支持8個Function),而且第一個Function號必須為0,其他Function號可以不連續編址。每一個Function均包含一組PCIE配置空間,PCIE配置空間的前64字節為PCIE配置空間頭部信息,EP支持Type 0格式的頭部信息,RC和SW支持Type 1格式的頭部信息。
可以看到,Device ID和Vendor ID的字段是一致的,用來標識廠家ID和設備ID。PCIE協議規定Device ID和Vendor ID的取值不能為0xFFFF,當RC發起configure read操作時,如果總線上不存在對應的PCIE設備(Bus/Dev/Fun號不匹配)時,就會返回0xFFFF,由此確定PCIE設備是否存在。
2)RC的Bus號通過硬件編碼為0,因此PCIE設備枚舉從Bus 0, Device 0, Function 0開始,首先掃描RC下掛載的PCIE設備(每個PCIE設備必須支持Fun 0,所以只有Dev號是不確定的),由此確定Device號(每個Bus下最多可以掛載32個PCIE設備,由此確定了Device號邊界)。
3)當確定某個PCIE設備存在時,則通過PCIE配置空間頭的Header Type字段確定該PCIE設備是SW還是EP,如果是EP,是一個多功能設備還是單功能設備(支持多少個Function)
4)如果步驟3檢測到SW,則掃描下一級總線(Bus號遞增,Bus號取值范圍為0~255,由此確定的Bus號的邊界),根據遞歸的深度設置0x18字段的Primary Bus Number(上級Bus號)、Secondary Bus Number(下游Bus號,同一層次)、Subordinate Bus Number(當前Bus下最遠的Bus號);如果為多功能EP,則繼續枚舉Function(Function號遞增)
根據上述步驟,完成PCIE設備枚舉,為每個PCIE設備確定Bus號和Device號,並檢測到每一個PCIE設備支持的Function號。
2、PCIE分層協議
PCIE分層協議分為三層——傳輸層、數據鏈路層和物理層,每一個協議層根據傳輸方向分為inbound和outbound兩部分。
PCIE使用packet的形式傳輸數據,packet在傳輸層和數據鏈路層組包。類似於網絡協議,每一層均添加額外的信息標識。
2.1、傳輸層
傳輸層負責組包和解包TLPs(Transaction Layer Packets),TLP可以是讀數據包、寫數據包或者特定事件。傳輸層也負責TLP流控。
TLP就是用戶和PCIE IP核交互的接口。
TLP分為應答型和非應答型,每個TLP必須有一個特定的標識(Transaction ID)。
PCIE設備有四種地址空間——Memory,I/O,Configuration,Message地址空間,對應四種傳輸類型,傳輸層支持不同傳輸類型TLP的尋址——TLP路由。
2.1.1、TLP routing (TLP路由)
首先,我們知道ARM是統一編址,即ARM的物理地址空間是內存地址空間和I/O地址空間統一編制形成的。PCIE總線拓撲網絡中使用Bus號和Device號給PCIE設備編址,進一步通過Function號給每個PCIE設備的具體功能編址,每個PCIE功能設備有四種地址空間(配置空間是確定的,其他地址空間是獨立的還是共享待商榷)。
RC負責CPU域的物理地址空間和PCIE總線域的地址轉換。
某種意義上講,PCIE總線的核心就是實現CPU對PCIE設備的四種地址空間進行直接讀寫,即實現地址映射機制。CPU通過RC發起讀寫請求,RC負責產生TLP,傳輸層(RC+SW)負責TLP路由。
有三種TLP路由機制——基於地址路由、基於ID路由和隱式路由。
2.1.2、ATU(Address Translation Unit)
TLP的FMT和Type字段定義了四種傳輸類型,TLP路由就是基於這兩個字段識別請求類型,從而采用不同的TLP路由機制。
ATU(地址轉換單元)負責實現TLP路由,即進行CPU域的物理地址和PCIE域的總線地址(Bus/Device/Function或者BAR)之間的轉換。
如果PCIE總線上發起訪問對應CPU域物理地址的請求,將通過ATU生成TLP,TLP中的地址就是ATU轉換后的地址。ATU中必須配置TLP類型,如上所述,不同的TLP類型的TLP路由策略是不一樣的,而路由策略直接影響到地址轉換。
Configuration請求,基於ID的路由,地址被解析成“總線號+設備號+功能號+偏移”,訪問的是PCIE設備4KB配置空間。
I/O請求或者Memory請求,基於地址的路由,通過和PCIE總線上各個PCIE設備的BAR地址空間范圍比較來確認所請求的物理地址落在哪個PCIE設備的BAR空間上,然后進行相應的讀寫操作。
Message請求,基於ID或者Implicit路由。
2.1.3、BAR(Base Address Register)
每個PCIE設備的內存地址空間都是從0開始編址,當一個PCIE控制器同時接入多個PCIE設備時,需要確保PCIE總線上每一個PCIE設備的內存地址空間彼此獨立,所以需要分別配置BAR(Base Address Register),從而避免PCIE設備發生物理地址沖突。
BAR在PCIE設備配置地址空間特定字段設置。
2.2、數據鏈路層
數據鏈路層負責鏈路管理、數據完整性校驗和糾正。
下行方向,數據鏈路層接收傳輸層TLP數據包,添加TLP序列號和CRC校驗碼,然后發送給物理層;上行方向校驗TLP數據包完整性,然后發送給傳輸層。
一旦檢測到TLP數據包錯誤,數據鏈路層負責請求TLP重傳直到接收到完整的TLP數據包,或者檢測到鏈路異常。
數據鏈路層自己也會產生和處理鏈路管理數據包,稱為DLLP(Data Link Layer Packet)。
2.3、物理層
物理層負責端口管理,包括驅動能力和數據緩沖區、串並轉換、PLL和阻抗匹配電路。它負責把數據鏈路層下發的數據包轉換成串行數據、並在PCI Express Link(每個Link包含至少1個Lane)之間以一定的速率和帶寬進行傳輸。
3、PCIE地址空間
3.1、PCIE內存地址空間
PCIE設備內存地址空間位於PCIE設備上,用於進行大塊數據存放和交換,如內存、顯存、擴展ROM、設備緩沖區等。
PCIE設備內存地址空間設置好BAR(Base Address Register)后,物理地址就能在Linux內核中通過ioremap映射到內核虛擬地址空間,通過readb/writeb/readl/writel等IO訪問接口讀寫。
3.2、PCIE I/O地址空間
為了訪問I/O設備而設立,一般用於查詢和控制設備的工作狀態以及少量數據交換。
訪問外部設備寄存器的地址空間?
3.3、PCIE配置地址空間
PCIE設備通過配置地址空間向系統提供設備自身的基本信息,每個PCIE設備都有自己的配置地址空間,由PCIE規范定義統一的格式。
PCIE設備配置地址空間實質上是一段特殊的I/O地址空間,可以為PCIE內存地址空間和PCIE I/O地址空間分配物理地址基地址,即BAR(Base Address Register)。
參考文獻