PCIE手札


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

 

參考文獻

1、DWC_pcie_reference

2、PCI_Express_Base_Rev_2.0_20Dec06a

3、Xilinx PCI Express

4、PCI Express System Architecture


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM