在PCI體系結構中,含有兩類橋片,一個是HOST主橋,另一個是PCI橋。在每一個PCI裝置中(包括PCI橋)都含有一個配置空間。這個配置空間由HOST主橋管理,而PCI橋可以轉發來自HOST主橋的配置訪問。在PCI匯流排中,PCI Agent裝置使用的配置空間與PCI橋使用的配置空間有些差別,但這些配置空間都是由處理器通過HOST主橋管理。

一、儲存器域與PCI匯流排域

HOST主橋的實現因處理器系統而異。PowerPC處理器和x86處理器的HOST主橋除了整合方式不同之外,其實現機制也有較大差異。但是這些HOST主橋所完成的最基本功能依然是分離儲存器域與PCI匯流排域,完成PCI匯流排域到儲存器域,儲存器域到PCI匯流排域之間的資料傳遞,並管理PCI裝置的配置空間。

上文曾經多次提到在一個處理器系統中,存在PCI匯流排域與儲存器域,深入理解這兩個域的區別是理解HOST主橋的關鍵所在。在一個處理器系統中,儲存器域、PCI匯流排域與HOST主橋的關係如圖2‑1所示。

上圖所示的處理器系統由一個CPU,一個DRAM控制器和兩個HOST主橋組成。在這個處理器系統中,包含CPU域、DRAM域、儲存器域和PCI匯流排域地址空間。其中HOST主橋x和HOST主橋y分別管理PCI匯流排x域與PCI匯流排y域。PCI裝置訪問儲存器域時,也需要通過HOST主橋,並由HOST主橋進行PCI匯流排域到儲存器域的地址轉換;CPU訪問PCI裝置時,同樣需要通過HOST主橋進行儲存器域到PCI匯流排域的地址轉換。

如果HOST主橋支援Peer-to-Peer傳送機制,PCI匯流排x域上的裝置可以與PCI匯流排y域上的裝置直接通訊,如PCI裝置x11可以直接與PCI裝置y11通訊。為簡化模型,在本書中,PCI匯流排僅使用32位地址空間。

1、CPU域、DRAM域與儲存器域

CPU域地址空間指CPU所能直接訪問的地址空間集合。在本書中,CPU、處理器與處理器系統的概念不同。如MPC8548處理器的核心是E500 V2[1],本書將這個處理器核心稱為CPU;處理器由一個或者多個CPU、外部Cache、中斷控制器和DRAM控制器組成;而處理器系統由一個或者多個處理器和外部裝置組成。

在CPU域中有一個重要概念,即CPU域邊界,所謂CPU域邊界,即CPU所能控制的資料完整性邊界。CPU域的邊界由Memory Fence指令[2]的作用範圍確定,CPU域邊界的劃分對資料完整性(Data Consistency)非常重要。與CPU域相關的資料完整性知識較為複雜,可以獨立出書,因此本篇對資料完整性不做進一步介紹。筆者有計劃再更新完PCIe匯流排部分的資料後,書體系結構的兩方面內容,一個是Cache層次結構,一個是以Weakly Ordered Memory Modle為基礎書寫資料完整性。

嚴格的講CPU域僅在CPU核心中有效,CPU訪問主儲存器時,首先將讀寫命令放入讀寫指令緩衝中,然後將這個命令傳送到DRAM控制器或者HOST主橋。DRAM控制器或者HOST主橋將CPU地址轉換為DRAM或者PCI匯流排地址,分別進入DRAM域或者PCI匯流排域後,再訪問相應的地址空間。

DRAM域地址空間指DRAM控制器所能訪問的地址空間集合。目前處理器系統的DRAM一般由DDR-SDRAM組成,有的書籍也將這部分記憶體稱為主儲存器。在有些處理器系統中,DRAM控制器能夠訪問的地址空間,並不能被處理器訪問,因此在這類處理器系統中,CPU域與DRAM域地址空間並不等同。

比如有些CPU可以支援36位的實體地址,而有些DRAM控制器僅支援32位的實體地址,此時CPU域包含的地址空間大於DRAM域地址空間。但是這並不意味著DRAM域一定包含在CPU域中,在某些處理器系統中,CPU並不能訪問在DRAM域中的某些資料區域。而CPU域中除了包含DRAM域外,還包含外部裝置空間。

在多數處理器系統中,DRAM域空間是CPU域空間的一部分,但是也有例外。比如顯示卡控制器可能會借用一部分主儲存器空間,這些被借用的空間不能被CPU訪問,而只能被DRAM控制器,更為準確地說是顯示卡通過DRAM控制器訪問,因此這段空間不屬於CPU域,嚴格地講,這段空間屬於外部裝置域。

本書使用儲存器域統稱CPU域與DRAM域。儲存器域包括CPU內部的通用暫存器,儲存器映像定址的暫存器,主儲存器空間和外部裝置空間。在Intel的x86處理器系統中,外部裝置空間與PCI匯流排域地址空間等效,因為在x86處理器系統中,使用PCI匯流排統一管理全部外部裝置。為簡化起見,本書使用PCI匯流排域替代外部裝置域。

值得注意的是,儲存器域的外部裝置空間,在PCI匯流排域中還有一個地址對映。當處理器訪問PCI裝置時,首先訪問的是這個裝置在儲存器域上的PCI裝置空間,之後HOST主橋將這個儲存器域的PCI匯流排地址轉換為PCI匯流排域的實體地址[3],然後再通過PCI匯流排事務訪問PCI匯流排域的地址空間。

2、PCI匯流排域

在x86處理器系統中,PCI匯流排域是外部裝置域的重要組成部分。實際上在Intel的x86處理器系統中,所有的外部裝置都使用PCI匯流排管理。而AMD的x86處理器系統中還存在一條HT(HyperTransport)匯流排,在AMD的x86處理器系統中還存在HT匯流排域。本書對HT匯流排不做進一步介紹。

PCI匯流排域(PCI Segment)由PCI裝置所能直接訪問的地址空間組成。在一個處理器系統中,可能存在多個HOST主橋,因此也存在多個PCI匯流排域。如在圖2‑1所示的處理器系統中,具有兩個HOST主橋,因而在這個處理器系統中存在PCI匯流排x和y域。

在多數處理器系統中,分屬於兩個PCI匯流排域的PCI裝置並不能直接進行資料交換,而需要通過FSB進行資料交換。值得注意的是,如果某些處理器的HOST主橋支援Peer-to-Peer資料傳送,那麼這個HOST主橋可以支援不同PCI匯流排域間的資料傳送。

PowerPC處理器使用了OCeaN技術連線兩個HOST主橋,OCeaN可以將屬於x域的PCI資料請求轉發到y域,OCeaN支援PCI匯流排的Peer-to-Peer資料傳送。有關OCeaN技術的詳細說明見第2.2節。

3、處理器域

處理器域是指一個處理器系統能夠訪問的地址空間集合。處理器系統能夠訪問的地址空間由儲存器域和外部裝置域組成。其中儲存器域地址空間較為簡單,而在不同的處理器系統中,外部裝置域的組成結構並不相同。如在x86處理器系統中,外部裝置域主要由PCI匯流排域組成,因為大多數外部裝置都是掛接在PCI匯流排[4]上的,而在PowerPC處理器和其他處理器系統中,有相當多的裝置與FSB直接相連,而不與PCI匯流排相連。

本書僅介紹PCI匯流排域而不對其他外部裝置域進行說明。其中儲存器域與PCI匯流排域之間由HOST主橋聯絡在一起。深入理解這些域的關係是深入理解PCI體系結構的關鍵所在,實際上這也是理解處理器體系結構的基礎。

通過HOST主橋,處理器系統可以將處理器域劃分為儲存器域與PCI匯流排域。其中儲存器域與PCI匯流排域,彼此獨立,並通過HOST主橋進行資料交換。HOST主橋是聯絡儲存器域與PCI匯流排域的橋樑,是PCI匯流排域實際的管理者。

有些書籍認為HOST處理器是PCI匯流排域的管理者,這種說法並不精確。假設在一個SMP(symmetric multiprocessing)處理器系統中,存在4個CPU而只有一個HOST主橋,這4個CPU將無法判斷究竟誰是HOST處理器。不過究竟是哪個處理器作為HOST處理器並不重要,因為在一個處理器系統中,是HOST主橋管理PCI匯流排域,而不是HOST處理器。當一個處理器系統中含有多個CPU時,如果這些CPU都可以訪問HOST主橋,那麼這些CPU都可以作為這個HOST主橋所管理PCI匯流排樹的HOST處理器。

在一個處理器系統中,CPU所能訪問的PCI匯流排地址一定在儲存器域中具有地址對映;而PCI裝置能訪問的儲存器域的地址也一定在PCI匯流排域中具有地址對映。當CPU訪問PCI域地址空間時,首先訪問儲存器域的地址空間,然後經過HOST主橋轉換為PCI匯流排域的地址,再通過PCI匯流排事務進行資料訪問。而當PCI裝置訪問主儲存器時,首先通過PCI匯流排事務訪問PCI匯流排域的地址空間,然後經過HOST主橋轉換為儲存器域的地址後,再對這些空間進行資料訪問。

由此可見,儲存器域與PCI匯流排域的轉換關係由HOST主橋統一進行管理。有些處理器提供了一些暫存器進行這種地址對映,如PowerPC處理器使用Inbound和Outbound暫存器組儲存儲存器域與PCI匯流排域的地址對映關係;而有些處理器並沒有提供這些暫存器,但是儲存器域到PCI匯流排域的轉換關係依然存在。

HOST主橋進行不同地址域間的資料交換時,需要遵循以下規則。為區別儲存器域到PCI匯流排域的地址對映,下文將PCI匯流排域到儲存器域的地址對映稱為反向對映。

(1) 處理器訪問PCI匯流排域地址空間時,首先需要訪問儲存器域的地址空間,之後通過HOST主橋將儲存器地址轉換為PCI匯流排地址,之後才能進入PCI匯流排域進行資料交換。PCI裝置使用的地址空間儲存在各自的PCI配置暫存器中,即BAR暫存器中。這些PCI匯流排地址空間需要在初始化時對映成為儲存器域的儲存器地址空間,之後處理器才能訪問這些地址空間。在有些處理器的HOST主橋中,具有獨立的暫存器儲存這個地址對映規則,如PowerPC處理器的Outbound暫存器組;而有些處理器,如在x86處理器中,雖然沒有這樣的暫存器組,但是在HOST主橋的硬體邏輯中仍然存在這個地址轉換的概念。

(2) PCI裝置訪問儲存器域時,首先需要訪問PCI匯流排域的地址空間,之後通過HOST主橋將PCI匯流排地址轉換為儲存器地址,之後才能穿越HOST主橋進行資料交換。為此處理器需要通過HOST主橋將這個PCI匯流排地址反向對映為儲存器地址。PCI裝置不能訪問在PCI匯流排域中沒有進行這種反向對映的儲存器域地址空間。PowerPC處理器使用Inbound暫存器組存放PCI裝置所能訪問的儲存器空間,而在x86處理器中並沒有這樣的暫存器組,但是依然存在這個地址轉換的概念。

(3) 如果HOST主橋不支援Peer-to-Peer傳送方式,那麼分屬不同PCI匯流排域的PCI裝置間不能直接進行資料交換。在32位的PCI匯流排中,每一個PCI匯流排域的地址範圍都是0x0000-0000~0xFFFF-FFFF,但是這些地址沒有直接聯絡。PCI匯流排x域上的PCI匯流排地址0x0000-0000與PCI匯流排y域上的PCI匯流排地址0x0000-0000並不相同,而且這兩個PCI匯流排地址經過HOST主橋反向對映後,得到的儲存器地址也不相同。

本篇在第2.2節中,主要以PowerPC處理器為例說明HOST主橋的實現機制,並在第2.2.4節簡要說明了x86處理器中的南北橋構架。儘管部分讀者對PowerPC處理器並不感興趣,筆者仍然強烈建議讀者仔細閱讀第2.2節的全部內容。

在PowerPC處理器中,HOST主橋的實現比較完整,尤其是PCI匯流排域與儲存器域的對映關係比較明晰,便於讀者準確掌握這個重要的概念。而x86處理器由於考慮向前相容,設計中包含了太多的不得已,x86處理器有時不得不保留原設計中的不完美,向前相容是Intel的重要成就,也是一個沉重的十字架。

二、HOST主橋

MPC8548處理器是Freescale基於E500 V2核心的一個PowerPC處理器,該處理器中集成了DDR控制器、多個eTSEC(Enhanced Three-Speed Ethernet Controller)、PCI/PCI-X和PCIe匯流排控制器等一系列介面。MPC8548處理器的拓撲結構如圖2‑2所示。本節以MPC8548處理器為例說明HOST主橋在PowerPC處理器中的實現機制,並簡要介紹x86處理器系統使用的HOST主橋。

如上圖所示,MPC8548處理器的L1 Cache在E500 V2核心中,而L2 Cache與FSB[1]直接相連,不屬於E500核心。值得注意的是有些高階PowerPC處理器的L2 Cache也在CPU中,而L3 Cache與CCB匯流排直接相連。

在MPC8548處理器中,所有外部裝置,如乙太網控制器、DDR控制器和OCeaN連線的匯流排控制器都與SoC平臺匯流排[2]直接連線。而SoC平臺匯流排通過Cache共享一致性模組與FSB連線。

在MPC8548處理器中,具有一個32位的PCI匯流排控制器、一個64位的PCI/PCI-X匯流排控制器,還有多個PCIe匯流排控制器。MPC8548處理器使用OCeaN連線這些PCI、PCI-X和PCIe匯流排控制器。在MPC8548處理器系統中,PCI裝置進行DMA操作時,首先通過OCeaN,之後經過SoC平臺匯流排到達DDR控制器。

OCeaN是MPC8548處理器中連線快速外設使用的交叉互連匯流排,OCeaN不僅可以連線PCI、PCI-X和PCIe匯流排控制器,而且可以連線RapidIO[3]匯流排控制器。使用OCeaN進行互連的匯流排控制器可以直接通訊,而不需要通過SoC平臺匯流排。

如來自HOST主橋1的資料報文可以通過OCeaN直接發向HOST主橋2,而不需要將資料通過SoC平臺匯流排,再進行轉發,從而減輕了SoC平臺匯流排的負擔。OCeaN部件的拓撲結構如圖2‑3所示。

在MPC8548處理器中,有兩個HOST主橋,分別是HOST主橋1和HOST主橋2,其中HOST主橋1可以支援PCI-X匯流排,而HOST主橋2只能支援PCI匯流排。此外該處理器還含有多個PCIe匯流排控制器。

本節僅介紹HOST主橋,即MPC8548處理器中的PCI匯流排控制器,而不介紹該處理器的PCIe匯流排控制器。因為從軟體層面上看,MPC8548處理器的PCIe匯流排控制器與PCI/PCI-X匯流排控制器功能類似。

MPC8548處理器即可以作為PCI匯流排的HOST處理器,也可以作為PCI匯流排的從裝置,本節僅講述MPC8548處理器如何作為PCI匯流排的HOST處理器管理PCI匯流排樹,而並不關心MPC8548處理器作為從裝置的情況。

在MPC8548處理器的HOST主橋中,定義了一系列與系統軟體相關的暫存器。本節將通過介紹這些暫存器,說明這個HOST主橋的功能。為節約篇幅,本節僅介紹與HOST主橋1相關的暫存器,HOST主橋2使用的暫存器與HOST主橋1使用的暫存器類似。

1、 PCI裝置配置空間的訪問機制

PCI匯流排規定訪問配置空間的匯流排事務,即配置讀寫匯流排事務,使用ID號進行定址。PCI裝置的ID號由匯流排號(Bus Number)、裝置號(Device Number)和功能號(Function Number)組成。

其中匯流排號在HOST主橋遍歷PCI匯流排樹時確定。PCI匯流排可以使用PCI橋擴充套件PCI匯流排,並形成一顆PCI匯流排樹。在一顆PCI匯流排樹上,有幾個PCI橋(包括HOST主橋),就有幾條PCI匯流排。在一顆PCI匯流排樹中,匯流排號由系統軟體決定,通常與HOST主橋直接相連的PCI匯流排編號為0,系統軟體使用DFS(Depth-First Search)演算法掃描PCI匯流排樹上的所有PCI匯流排,並依次進行編號。

一條PCI匯流排的裝置號由PCI裝置的IDSEL訊號與PCI匯流排地址線的連線關係確定,而功能號與PCI裝置的具體設計相關。在一個PCI裝置中最多有8個功能裝置,而且每一個功能裝置都有各自的PCI配置空間,而在絕大多數PCI裝置中只有一個功能裝置。HOST主橋使用暫存器號,訪問PCI裝置配置空間的某個暫存器。

在MPC8548處理器的HOST主橋中,與PCI裝置配置空間相關的暫存器由CFG_ADDR、CFG_DATA和INT_ACK暫存器組成。系統軟體使用CFG_ADDR和CFG_DATA暫存器訪問PCI裝置的配置空間,而使用INT_ACK暫存器訪問掛接在PCI總線上的中斷控制器的中斷向量,這3個暫存器的地址偏移和屬性如表2‑1所示。

表2‑1 PCI匯流排配置暫存器

Offset

暫存器

屬性

復位值

0x0_8000

CFG_ADDR

可讀寫

0x0000-0000

0x0_8004

CFG_DATA

可讀寫

0x0000-0000

0x0_8008

INT_ACK

只讀

0x0000-0000

在MPC8548處理器中,所有內部暫存器都使用儲存器對映方式進行定址,並存放在以BASE_ADDR[4]變數為起始地址的“1MB連續的實體地址空間”中。PowerPC處理器可以通過BASE_ADDR+Offset的方式訪問表2‑1中的暫存器。

MPC8548處理器使用CFG_ADDR暫存器和CFG_DATA暫存器訪問PCI裝置的配置空間,其中用CFG_ADDR暫存器儲存PCI裝置的ID號和暫存器號,該暫存器的各個欄位的詳細說明如下所示。

Enable位。當該位為1時,HOST主橋使能對PCI裝置配置空間的訪問,當HOST處理器對CFG_DATA暫存器進行訪問時,HOST主橋將對這個暫存器的訪問轉換為PCI配置讀寫匯流排事務併發送到PCI總線上。Bus Number欄位記錄PCI裝置所在的匯流排號。Device Number欄位記錄PCI裝置的裝置號。Function Number欄位記錄PCI裝置的功能號。Register Number欄位記錄PCI裝置的配置暫存器號。

MPC8548處理器訪問PCI裝置的配置空間時,首先需要在CFG_ADDR暫存器中設定這個PCI裝置對應的匯流排號、裝置號、功能號和暫存器號,然後使能Enable位。之後當MPC8548處理器對CFG_DATA暫存器進行讀寫訪問時, HOST主橋將這個儲存器讀寫訪問轉換為PCI配置讀寫請求,併發送到PCI總線上。如果Enable位沒有使能,處理器對CFG_DATA的訪問不過是一個普通的I/O訪問,HOST主橋並不能將其轉換為PCI配置讀寫請求。

HOST主橋根據CFG_ADDR暫存器中的ID號,生成PCI配置讀寫匯流排事務,並將這個讀寫匯流排事務,通過ID譯碼方式傳送到指定的PCI裝置。PCI裝置將接收來自配置寫匯流排事務的資料,或者為配置讀匯流排事務提供資料。

值得注意的是,在PowerPC處理器中,在CFG_DATA暫存器中儲存的資料採用大端方式進行編址,而PCI裝置的配置暫存器採用小端編址,因此HOST主橋需要進行端模式轉換。我們以原始碼2‑1為例說明PowerPC處理器如何訪問PCI配置空間。

原始碼2‑1 PowerPC處理器訪問PCI配置空間

stw r0, 0(r1)

ld r3, 0(r2)

這段原始碼的執行步驟如下。我們首先假設暫存器r1的初始值為BASE_ADDR+0x0_8000(即CFG_ADDR暫存器的地址) ,暫存器r0的初始值為0x8000-0008,暫存器r2的初始值為BASE_ADDR+0x0_8004 (即CFG_DATA暫存器的地址),而指定PCI裝置(匯流排號、裝置號、功能號都為0)的配置暫存器的0x0B~0x08中的值為0x9988-7766。

(1) 將r0暫存器賦值到r1暫存器所指向的地址空間中,即初始化CFG_ADDR暫存器為0x8000-0008。

(2) 從r2暫存器所指向的地址空間中讀取資料到r3暫存器中,即從CFG_DATA暫存器中讀取資料到r3暫存器。

在MPC8548處理器中,原始碼2‑1執行完畢後,暫存器r3儲存的值為0x6677-8899,而不是0x9988-6677。系統程式設計師在使用這個返回值時,一定要注意大小端模式的轉換。值得注意的是,原始碼2‑1可以使用lwbrx指令進行優化,該指令可以在讀取資料的同時,進行大小端模式的轉換。

處理器讀取INT_ACK暫存器時,HOST主橋將這個讀操作轉換為PCI匯流排中斷響應事務。PCI匯流排中斷響應事務的作用是通過PCI匯流排讀取中斷控制器的中斷向量號,這樣做的前提是中斷控制器需要連線在PCI總線上。

PowerPC處理器使用的MPIC中斷控制器不是掛接在PCI總線上,而是掛接在SoC平臺總線上的,因此PCI匯流排提供的中斷應答事務在這個處理器系統中並沒有太大用途。但是並不排除某些PowerPC處理器系統使用了掛接在PCI總線上的中斷控制器,比如PCI南橋晶片,此時PowerPC處理器系統需要使用中斷應答事務讀取PCI南橋中的中斷控制器,以獲取中斷向量號。

2、 儲存器域地址空間到PCI匯流排域地址空間的轉換

MPC8548處理器使用ATMU (Address Translation and Mapping Unit)暫存器組進行儲存器域到PCI匯流排域,以及PCI匯流排域到儲存器域的地址對映。ATMU暫存器組由兩大組暫存器組成,分別為Outbound和Inbound暫存器組。其中Outbound暫存器組將儲存器域的地址轉換為PCI匯流排域的地址,而Inbound暫存器組將PCI匯流排域的地址轉換為儲存器域的地址。

在MPC8548處理器中,只有當CPU讀寫訪問的地址範圍在Outbound暫存器組管理的地址空間之內時,HOST主橋才能接收CPU的讀寫訪問,並將CPU在儲存器域上的讀寫訪問轉換為PCI匯流排域上的讀寫訪問,然後才能對PCI裝置進行讀寫操作。

如圖2‑2所示,CPU對儲存器域的地址訪問,首先使用CCB匯流排事務,如果所訪問的地址在Cache中命中時,則從Cache中直接獲得資料,否則將從儲存器域中獲取資料。而在絕大多數情況下,外部裝置使用的地址空間是不可Cache[5]的,所以在絕大多數情況之下,發向PCI裝置的CCB匯流排事務並不會與Cache進行資料交換。

如果CCB匯流排事務使用的地址在HOST主橋的Outbound暫存器視窗中命中時,HOST主橋將接收這個CCB匯流排事務,並將其轉換為PCI匯流排事務之後,再發送到PCI總線上。MPC8548處理器的每一個HOST主橋都提供了5個Outbound暫存器視窗來實現儲存器域地址到PCI匯流排域地址的對映,其對映過程如圖2‑4所示。

在介紹MPC8548處理器如何使用Outbound暫存器組進行儲存器域地址空間到PCI匯流排域地址空間的轉換之前,本節將首先介紹Outbound暫存器組中的相應暫存器。Outbound暫存器組的地址偏移、屬性和復位值如表2‑2所示。

表2‑2 PCI/X ATMU Outbound暫存器組

地址偏移

暫存器名

屬性

復位值

0x0_8C00/20/40/60/80

POTARn

可讀寫

0x0000-0000

0x0_8C04/24/44/64/84

POTEARn

可讀寫

0x0000-0000

0x0_8C28/48/68/88

POWBARn

可讀寫

0x0000-0000

0x0_8C30/50/70/90

POWARn

可讀寫

0x0000-0000

2.1、POTARn和POTEARn暫存器

在POTARn和POTEARn暫存器中儲存當前Outbound視窗在PCI匯流排域中的64位地址空間的基地址。這兩個暫存器的主要欄位如下。

POTARn暫存器的TEA欄位,第0~11位,儲存PCI匯流排地址空間的43~32位。

POTARn暫存器的TA欄位,第12~31位,儲存PCI匯流排地址空間的31~12位[6] 。

POTEARn暫存器的TEA欄位,第12~31位,儲存PCI匯流排地址空間的63~44位。

2.2、POWBARn暫存器和POWARn暫存器

而POWBARn暫存器儲存當前Outbound視窗在儲存器域中的36位地址空間的基地址[7] ,其主要欄位如下。

WBEA欄位儲存儲存器域地址的第0~3位。

WBA欄位儲存儲存器域地址的第4~23 [8]位。

POWARn暫存器描述Outbound視窗的屬性,其主要欄位如下。

EN位,第0位。該位是Outbound視窗的使能位,為1表示當前Outbound暫存器組描述的儲存器地址空間到PCI匯流排地址空間的對映關係有效;為0表示無效。

RTT欄位,第12~15位,該欄位描述當前視窗的讀傳送型別,為0b0100表示儲存器讀,為0b1000表示I/O讀。

WTT欄位,第16~19位,該欄位描述當前視窗的寫傳送型別,為0b0100表示儲存器寫,為0b1000表示I/O寫。在PCIe匯流排控制器中,RTT欄位和WTT欄位還可以支援對配置空間的讀寫操作。

OWS欄位,第26~31位,該欄位描述當前視窗的大小,Outbound視窗的大小在4KB~64GB之間,其值為2OWS+1。

2.3、使用Outbound暫存器訪問PCI匯流排地址空間

MPC8548處理器使用Outbound暫存器組訪問PCI匯流排地址空間的步驟如下。

(1) 首先MPC8548處理器需要將程式使用的32位有效地址EA (Effective Address)轉換為41位的虛擬地址VA (Virtual Address)。E500 V2核心不能關閉MMU(Memory Management Unit),因此不能直接訪問實體地址。

(2) MPC8548處理器通過MMU將41位的虛擬地址轉換為36位的實體地址。在E500 V2核心中,實體地址是36位(預設是32位,需要使能)。

(3) 檢查LAWBAR和LAWAR暫存器,判斷當前36位的實體地址是否屬於PCI匯流排空間。在MPC8548中定義了一組LAWBAR和LAWAR暫存器對,每一對暫存器描述當前物理空間是與PCI匯流排、PCIe匯流排、DDR還是RapidIO空間對應。該組暫存器的詳細說明見MPC8548 PowerQUICC III Integrated Host Processor Family Reference Manual。如果CPU訪問的空間為PCI匯流排空間,則執行第(4)步,否則處理器將不會訪問PCI地址空間。

(4) 判斷當前36位實體地址是否在POWBARn暫存器1~4描述的視窗中,如果在則將36位的處理器實體地址通過暫存器POTARn和POTEARn轉換為64位的PCI匯流排地址,然後HOST主橋將來自處理器的讀寫請求傳送到PCI總線上;如果不在POWBARn暫存器1~4描述的視窗中,POWBAR0暫存器作為預設視窗,接管這個儲存器訪問,並使用暫存器POTAR0和POTEAR0,將處理器實體地址轉換為PCI匯流排地址,當然在正常設計中很少出現這種情況。

許多系統軟體,將Outbound視窗兩邊的暫存器使用“直接相等”的方法進行對映,將儲存器域的地址與PCI匯流排地址設為相同的值。但是系統軟體程式設計師務必注意這個儲存器地址與PCI匯流排地址是分屬於儲存器域與PCI匯流排域的,這兩個值雖然相等,但是所代表的地址並不相同,一個屬於儲存器域,而另一個屬於PCI匯流排域。

3、 PCI匯流排域地址空間到儲存器域地址空間的轉換

MPC8548處理器使用Inbound暫存器組將PCI匯流排域地址轉換為儲存器域的地址。PCI裝置進行DMA讀寫時,只有訪問的地址在Inbound視窗中時,HOST主橋才能接收這些讀寫請求,並將其轉發到儲存器控制器。MPC8548處理器提供了3組Inbound暫存器,即提供3個Inbound暫存器視窗,實現PCI匯流排地址到儲存器地址的反向對映。

從PCI裝置的角度上看,PCI裝置訪問儲存器域的地址空間時,首先需要通過Inbound視窗將PCI匯流排地址轉換為儲存器域的地址;而從處理器的角度上看,處理器必須要將儲存器地址通過Inbound暫存器組反向對映為PCI匯流排地址空間,才能被PCI裝置訪問。

PCI裝置只能使用PCI匯流排地址訪問PCI匯流排域的地址空間。HOST主橋將這段地址空間通過Inbound視窗轉換為儲存器域的地址之後,PCI裝置才能訪問儲存器域地址空間。這個地址轉換過程如圖2‑5所示。

在介紹MPC8548處理器如何使用Inbound暫存器組進行PCI匯流排域地址空間到儲存器域地址空間的轉換之前,我們首先簡要介紹Inbound暫存器組中的相應暫存器。該組暫存器的地址偏移、屬性和復位值如表2‑3所示。

表2‑3 PCI/X ATMU Inbound暫存器組

Offset

暫存器名

屬性

復位值

0x0_8DA0/C0/E0

PITARn

可讀寫

0x0000-0000

0x0_8DA8/C8/E8

PIWBARn

可讀寫

0x0000-0000

0x0_8DAC/CC

PIWBEARn

可讀寫

0x0000-0000

0x0_8DB0/D0/F0

PIWARn

可讀寫

0x0000-0000

值得注意的是,Inbound暫存器組除了可以進行PCI匯流排地址空間到儲存器域地址空間的轉換之外,還可以轉換分屬不同PCI匯流排域的地址空間,以支援PCI匯流排的Peer-to-Peer資料傳送方式。

3.1、PITARn暫存器

PITARn暫存器儲存當前Inbound視窗在儲存器域中的36位地址空間的基地址,其地址視窗的大小至少為4KB,因此在該暫存器中僅存放儲存器域地址的第0~23位,該暫存器的其主要欄位如下所示。

TEA欄位存放儲存器地址空間的第0~3位。TA欄位存放儲存器地址空間的第4~23位。

3.2、PIWBARn和PIWBEARn暫存器

PIWBARn和PIWBEARn暫存器儲存當前Inbound視窗在PCI匯流排域中的64位地址空間的基地址的第63~12位,Inbound視窗使用的最小地址空間為4KB,因此在這兩個暫存器中不含有PCI匯流排地址空間的第11~0位。這兩個暫存器的主要欄位如下所示。

PIWBARn暫存器的BEA欄位存放PCI匯流排地址空間的第43~32位。PIWBARn暫存器的BA欄位存放PCI匯流排地址空間的第31~12位。PIWBEARn暫存器的BEA欄位存放PCI匯流排地址空間的第63~44位。

3.3、PIWARn暫存器

PIWARn暫存器描述當前Inbound視窗的屬性,該暫存器由以下位和欄位組成。

EN位,第0位。該位是Inbound視窗的使能位,為1表示當前Inbound暫存器組描述的儲存器地址空間到PCI匯流排地址空間的對映關係有效;為0表示無效。

PF位,第2位。該位為1表示當前Inbound視窗描述的儲存區域支援預讀;為0表示不支援預讀。

TGI欄位,第8~11位。該欄位為0b0010表示當前Inbound視窗描述的儲存區域屬於PCIe匯流排域地址空間;為0b1100表示當前Inbound視窗描述的儲存區域屬於RapidIO匯流排域地址空間。該欄位對於OCeaN實現不同域間的報文轉發非常重要,如果當前Inbound視窗的TGI欄位為0b0010,此時PCI總線上的裝置可以使用該Inbound視窗,通過OCeaN直接讀取PCIe匯流排的地址空間,而不需要經過SoC平臺匯流排。如果TGI欄位為0b1111表示Inbound視窗描述的儲存器區域屬於主儲存器地址空間,這也是最常用的方式。使用該欄位可以實現HOST主橋的Peer-to-Peer資料傳送方式。

RTT欄位和WTT欄位,分別為該暫存器的第12~15位和第16~19位。Inbound視窗的RTT/WTT欄位的含義與Outbound視窗的RTT/WTT欄位基本類似。只是在Inbound視窗中可以規定PCI裝置訪問主儲存器時,是否需要進行Cache一致性操作(Cache Lock and Allocate),在進行DMA寫操作時,資料是否可以直接進入到Cache中。該欄位是PowerPC處理器對PCI匯流排規範的有效補充,由於該欄位的存在,PowerPC處理器的PCI裝置可以將資料直接寫入Cache,也可以視情況決定DMA操作是否需要進行Cache共享一致性操作。

IWS欄位,第26~31位。該欄位描述當前視窗的大小,Inbound視窗的大小在4KB~16GB之間,其值為2IWS+1。

3.4、使用Inbound暫存器組進行DMA操作

PCI裝置使用DMA操作訪問主儲存器空間,或者訪問其他PCI匯流排域地址空間時,需要通過Inbound視窗,其步驟如下。

(1) PCI裝置在訪問主儲存器空間時,將首先檢查當前PCI匯流排地址是否在PIWBARn和PIWBEARn暫存器描述的視窗中。如果在這個視窗中,則將這個PCI匯流排地址通過PITARn暫存器轉換為儲存器域的地址或者其他PCI匯流排域的地址;如果不在將禁止本次訪問。

(2) 如果PCI裝置訪問的是儲存器地址空間,HOST主橋將來自PCI匯流排的讀寫請求傳送到儲存器空間,進行儲存器讀寫操作,並根據Inbound暫存器組的RTT/WTT位決定是否需要進行Cache一致性操作,或者將資料直接寫入到Cache中。

結合Outbound暫存器組,可以發現PCI匯流排地址空間與儲存器地址空間是有一定聯絡的。如果儲存器域地址空間被Inbound暫存器組反向對映到PCI空間,這個儲存器地址具有兩個地址,一個是在儲存器域的地址,一個是在PCI匯流排域的地址;同理PCI匯流排空間的地址如果使用Outbound暫存器對映到暫存器地址空間,這個PCI匯流排地址也具有兩個地址,一個是在PCI匯流排域的地址,一個是在儲存器域的地址。

能夠被處理器和PCI匯流排同時訪問的地址空間,一定在PCI匯流排域和儲存器域中都存在地址對映。再次強調,絕大多數作業系統將同一個空間的PCI匯流排域地址和儲存器地址設為相同的值,但是這兩個相同的值所代表的含義不同。

由此可以看出,如果MPC8548處理器的某段儲存器區域沒有在Inbound視窗中定義時,PCI裝置將不能使用DMA機制訪問這段儲存器空間;同理如果PCI裝置的空間不在Outbound視窗,HOST處理器也不能訪問這段PCI地址空間。

在絕大多數PowerPC處理器系統中,PCI裝置地址空間都在HOST主橋的Outbound視窗中建立了對映;而MPC8548處理器可以選擇將哪些主儲存器空間共享給PCI裝置,從而對主儲存器空間進行保護。

4、 x86處理器的HOST主橋

x86處理器使用南北橋結構連線CPU和PCI裝置。其中北橋(North Bridge)連線快速裝置,如顯示卡、和記憶體條,並推出PCI匯流排,HOST主橋包含在北橋中。而南橋(South Bridge)連線慢速裝置。x86處理器使用的南北橋結構如圖2‑6所示。

Intel使用南北橋概念統一PC架構。但是從體系結構的角度上看,南北橋架構並不重要,北橋中存放的主要部件不過是儲存器控制器、顯示卡控制器和HOST主橋而已,而南橋存放的是一些慢速裝置,如ISA匯流排和中斷控制器等。

不同的處理器系統整合這些組成部件的方式並不相同,如PowerPC、MIPS和ARM處理器系統通常將CPU和主要外部裝置都整合到一顆晶片中,組成一顆基於SoC架構的處理器系統。這些整合方式並不重要,每一個處理器系統都有其針對的應用領域,不同應用領域的需求對處理器系統的整合方式有較大的影響。Intel採用的南北橋架構針對x86處理器的應用領域而設計,並不能說採用這種結構一定比MPC8548處理器中即含有HOST-to-PCI主橋也含有HOST-to-PCIe主橋更為合理。

在許多嵌入式處理器系統中,即含有PCI裝置也含有PCIe裝置,為此MPC8548處理器同時提供了PCI匯流排和PCIe匯流排介面,在這個處理器系統中,PCI裝置可以與PCI匯流排直接相連,而PCIe裝置可以與PCIe匯流排直接相連,因此並不需要使用PCIe橋擴充套件PCI匯流排,從而在一定程度上簡化了嵌入式系統的設計。

嵌入式系統所面對的應用千姿百態,進行晶片設計時所要考慮的因素相對較多,因而在某種程度上為設計帶來了一些難度。而x86處理器系統所面對的應用領域針對個人PC**務器,向前相容和通用性顯得更加重要。在多數情況下,一個通用處理器系統的設計難過專用處理器系統的設計,Intel為此付出了極大的代價。

在一些相對較老的北橋中,如Intel 440系列晶片組中包含了HOST主橋,從系統軟體的角度上看HOST-to-PCI主橋實現的功能與HOST-to-PCIe主橋實現的功能相近。本節僅簡單介紹Intel的HOST-to-PCI主橋如何產生PCI的配置週期,有關Intel HOST-to-PCIe主橋[9]的詳細資訊參見第5章。

x86處理器定義了兩個I/O埠暫存器,分別為CONFIG_ADDRESS和CONFIG_DATA暫存器,其地址為0xCF8和0xCFC。x86處理器使用這兩個I/O埠訪問PCI裝置的配置空間。PCI匯流排規範也以這個兩個暫存器為例,說明處理器如何訪問PCI裝置的配置空間。其中CONFIG_ADDRESS暫存器存放PCI裝置的ID號,而CONFIG_DATA暫存器存放進行配置讀寫的資料。

CONFIG_ADDRESS暫存器與PowerPC處理器中的CFG_ADDR暫存器的使用方法類似,而CONFIG_DATA暫存器與PowerPC處理器中的CFG_DATA暫存器的使用方法類似。CONFIG_ADDRESS暫存器的結構如圖2‑7所示。

CONFIG_ADDRESS暫存器的各個欄位和位的說明如下所示,

Enable位,第31位。該位為1時,對CONFIG_DATA暫存器進行讀寫時將引發PCI匯流排的配置週期。Bus Number欄位,第23~16位,記錄PCI裝置的匯流排號。Device Number欄位,第15~11位,記錄PCI裝置的裝置號。Function Number欄位,第10~8位,記錄PCI裝置的功能號。Register Number欄位,第7~2位,記錄PCI裝置的暫存器號。

當x86處理器對CONFIG_DATA暫存器進行I/O讀寫訪問,且CONFIG_ADDR暫存器的Enable位為1時,HOST主橋將這個I/O讀寫訪問轉換為PCI配置讀寫匯流排事務,然後傳送到PCI總線上,PCI匯流排根據儲存在CONFIG_ADDR暫存器中的ID號,將PCI配置讀寫請求傳送到指定PCI裝置的指定配置暫存器中。

x86處理器使用小端地址模式,因此從CONFIG_DATA暫存器中讀出的資料不需要進行模式轉換,這點和PowerPC處理器不同,此外x86處理器的HOST主橋也實現了儲存器域到PCI匯流排域的地址轉換,但是這個概念在x86處理器中並不明晰。

本書將在第5章以HOST-to-PCIe主橋為例,詳細介紹Intel處理器的儲存器地址與PCI匯流排地址的轉換關係,而在本節不對x86處理器的HOST主橋做進一步說明。x86處理器系統的升級速度較快,目前在x86的處理器體系結構中,已很難發現HOST主橋的身影。

目前Intel對南北橋架構進行了升級,其中北橋被升級為MCH(Memory Controller Hub),而南橋被升級為ICH(I/O Controller Hub)。x86處理器系統在MCH中集成了儲存器控制器、顯示卡晶片和HOST-to-PCIe主橋,並通過Hub Link與ICH相連;而在ICH中集成了一些相對低速匯流排介面,如AC’97、LPC(Low Pin Count)、IDE和USB匯流排,當然也包括一些低頻寬的PCIe匯流排介面。

在Intel最新的Nehelem[10]處理器系統中,MCH被一份為二,儲存器控制器和圖形控制器已經與CPU核心整合在一個Die中,而MCH剩餘的部分與ICH合併成為PCH(Peripheral Controller Hub)。但是從體系結構的角度上看,這些升級與整合並不重要。

目前Intel在Menlow平臺基礎上,計劃推出基於SoC架構的x86處理器,以進軍手持裝置市場。在基於SoC構架的x86處理器中將逐漸淡化Chipset的概念,其拓撲結構與典型的SoC處理器,如ARM和PowerPC處理器,較為類似。