945
技術社區[雲棲]
3.2 PCI設備的數據傳遞
PCI設備的數據傳遞使用地址譯碼方式,當一個存儲器讀寫總線事務到達PCI總線時,在這條總線上的所有PCI設備將進行地址譯碼,如果當前總線事務使用的地址在某個PCI設備的BAR空間中時,該PCI設備將使能DEVSEL#信號,認領這個總線事務。
如果PCI總線上的所有設備都不能通過地址譯碼,認領這個總線事務時,這條總線的“負向譯碼”設備將認領這個總線事務,如果在這條PCI總線上沒有“負向譯碼”設備,該總線事務的發起者將使用Master Abort總線周期結束當前PCI總線事務。
3.2.1 PCI設備的正向譯碼與負向譯碼
如上文所示PCI設備使用“地址譯碼”方式接收存儲器讀寫總線請求。在PCI總線中定義了兩種“地址譯碼”方式,一個是正向譯碼,一個是負向譯碼。
我們仍以圖3?2所示的處理器係統為例,說明數據傳送使用的尋址方法。當HOST主橋通過存儲器或者I/O讀寫總線事務訪問其下所有PCI設備時,PCI總線0下的所有PCI設備都將對出現在地址周期中的PCI總線地址進行譯碼。如果這個地址在某個PCI設備的BAR空間中命中時,這個PCI設備將接收這個PCI總線請求。這個過程也被稱為PCI總線的正向譯碼,這種方式也是大多數PCI設備所采用的譯碼方式。
但是在PCI總線上的某些設備,如PCI-to-(E)ISA橋並不使用正向譯碼接收來自PCI總線的請求,PCI-to-ISA橋在處理器係統中的位置如圖1?1所示。PCI總線0上的總線事務在三個時鍾周期後,沒有得到任何PCI設備響應時(即總線請求的PCI總線地址不在這些設備的BAR空間中),PCI-to-ISA橋將被動地接收這個數據請求。這個過程被稱為PCI總線的負向譯碼。可以進行負向譯碼的設備也被稱為負向譯碼設備。
在PCI總線中,除了PCI-to-(E)ISA橋可以作為負向譯碼設備,PCI橋也可以作為負向譯碼設備,但是PCI橋並不是在任何時候都可以作為負向譯碼設備。在絕大多數情況下,PCI橋無論是處理“來自上遊總線”,還是處理“來自下遊總線”的總線事務時,都使用正向譯碼方式,但是在某些特殊應用中,PCI橋也可以作為負向譯碼設備。
如筆記本在連接Dock插座時,也使用了PCI橋。因為在大多數情況下,筆記本與Dock插座是分離使用的,而且Dock插座上連接的設備多為慢速設備,此時用於連接Dock插座的PCI橋使用負向譯碼。Dock插座在筆記本係統中的位置如圖3?3所示。
當筆記本與Dock建立連接之後,如果處理器需要訪問Dock中的外部設備時,Dock中的PCI橋將首先使用負向譯碼方式接收PCI總線事務,之後將這個PCI總線事務轉發到Dock的PCI總線中,然後再訪問相應的PCI設備。
在Dock中使用負向譯碼PCI橋的優點是,該橋管理的設備並不參與處理器係統對PCI總線的枚舉過程。當筆記本插入到Dock之後,係統軟件並不需要重新枚舉Dock中的設備並為這些設備分配係統資源,而僅需要使用負向譯碼PCI橋管理好其下的設備即可,從而極大降低了Dock對係統軟件的影響。
當HOST處理器訪問Dock中的設備時,負向譯碼PCI橋,將首先接管這些存儲器讀寫總線事務,然後發送到Dock設備中。值得注意的是,在許多筆記本的Dock實現中,並沒有使用負向譯碼PCI橋,而使用PCI-to-ISA橋。
PCI總線規定使用負向譯碼的PCI橋,其Base Class Code寄存器為0x06,Sub Class Code寄存器為0x04,而Interface寄存器為0x01;使用正向譯碼方式的PCI橋的Interface寄存器為0x00。係統軟件(E2PROM)在初始化Interface寄存器時務必注意這個細節。
綜上所述,在PCI總線中有兩種負向譯碼設備,PCI-to-E(ISA)橋和PCI橋。但是PCI橋並不是在任何時候都是負向譯碼設備,隻有PCI橋連接Dock插座時,PCI橋的Primary Bus才使用負向譯碼方式。而這個PCI橋的Secondary Bus在接收Dock設備的請求時仍然使用正向譯碼方式。
PCI橋使用的正向譯碼方式與PCI設備使用的正向譯碼方式有所不同。如圖3?4所示,當一個總線事務是從PCI橋的Primary Bus到Secondary Bus時,PCI橋使用的正向譯碼方式與PCI設備使用的方式類似。如果該總線事務使用的地址在PCI橋任意一個Memory Base窗口命中時,該PCI橋將使用正向譯碼方式接收該總線事務,並根據實際情況決定是否將這個總線事務轉發到Secondary Bus。
當一個總線事務是從PCI橋的Secondary Bus到Primary Bus時,如果該總線事務使用的地址沒有在PCI橋所有的Memory Base窗口命中時,表明當前總線事務不是訪問該PCI橋管理的PCI子樹中的設備,因此PCI橋將接收當前總線事務,並根據實際情況決定是否將這個總線事務轉發到Primary Bus。
以圖3?2為例,當PCI設備11訪問主存儲器空間時,首先將存儲器讀寫總線事務發送到PCI總線1上,而這個存儲器地址顯然不會在PCI總線1的任何PCI設備的BAR空間中,此時PCI橋1將認領這個PCI總線的數據請求,並將這個總線事務轉發到PCI總線0上。最後HOST主橋將接收這個總線事務,並將PCI總線地址轉換為存儲器域的地址,與主存儲器進行讀寫操作。
值得注意的是,PCI總線並沒有規定HOST主橋使用正向還是負向譯碼方式接收這個存儲器讀寫總線事務,但是絕大多數HOST主橋使用正向譯碼方式接收來自下遊的存儲器讀寫總線事務。在PowerPC處理器中,如果當前存儲器讀寫總線事務使用的地址在Inbound窗口內時,HOST主橋將接收這個總線事務,並將其轉換為存儲器域的讀寫總線事務,與主存儲器進行數據交換。
3.3.2 處理器到PCI設備的數據傳送
下文以圖3?2所示的處理器係統為例,說明處理器向PCI設備11進行存儲器寫的數據傳送過程。處理器向PCI設備進行讀過程與寫過程略有區別,因為存儲器寫使用Posted方式,而存儲器讀使用Non-Posted方式,但是存儲器讀使用的地址譯碼方式與存儲器寫類似,因此本節對處理器向PCI設備進行存儲器讀的過程不做進一步介紹。
PCI設備11在PCI總線域的地址範圍是0x7300-0000~0x73FF-FFFF。這段空間在存儲器域中對應的地址範圍是0xF300-0000~0xF3FF-FFFF。下文我們假設處理器使用存儲器寫指令,訪問0xF300-0008這個存儲器地址,其步驟如下。
(1) 存儲器域將0xF300-0008這個地址發向HOST主橋,0xF000-0000~0xF7FF-FFFF這段地址已經由HOST主橋映射到PCI總線域地址空間,所以HOST主橋認為這是一個對PCI設備的訪問。因此HOST主橋將首先接管這個存儲器寫請求。
(2) HOST主橋將存儲器域的地址0xF300-0008轉換為PCI總線域的地址0x7300-0008,並通過總線仲裁獲得PCI總線0的使用權,啟動PCI存儲器寫周期,並將這個存儲器寫總線事務發送到PCI總線0上。值得注意的是,這個存儲器讀寫總線事務使用的地址為0x7300-0008,而不是0xF300-0008。
(3) PCI總線0的PCI橋1發現0x7300-0008在自己管理的地址範圍內,於是接管這個存儲器寫請求,並通過總線仲裁邏輯獲得PCI總線1的使用權,並將這個請求轉發到PCI總線1上。
(4) PCI總線1的PCI設備11發現0x7300-0008在自己的BAR0寄存器中命中,於是接收這個PCI寫請求,並完成存儲器寫總線事務。
3.2.3 PCI設備的DMA操作
下文以圖3?2所示的處理器係統為例,說明PCI設備11向存儲器進行DMA寫的數據傳送過程。PCI設備的DMA寫使用Posted方式而DMA讀使用Non-Posted方式。本節不介紹PCI設備進行DMA讀的過程,而將這部分內容留給讀者分析。
假定PCI設備11需要將一組數據,發送到0x1000-0000~0x1000-FFFF這段存儲器域的地址空間中。由上文所述,存儲器域的0x0000-0000~0x7FFF-FFFF這段存儲器空間與PCI總線域的0x8000-0000~0xFFFF-FFFF這段PCI總線地址空間對應。
PCI設備11並不能直接操作0x1000-0000~0x1000-FFFF這段存儲器域的地址空間,PCI設備11需要對PCI總線域的地址空間0x9000-0000~0x9000-FFFF進行寫操作,因為PCI總線地址空間0x9000-0000~0x9000-FFFF已經被HOST主橋映射到0x1000-0000~0x1000-FFFF這段存儲器域。這個DMA寫具體的操作流程如下。
(1) 首先PCI設備11通過總線仲裁邏輯獲得PCI總線1的使用權,之後將存儲器寫總線事務發送到PCI總線1上。值得注意的是,這個存儲器寫總線事務的目的地址是PCI總線域的地址空間0x9000-0000~0x9000-FFFF,這個地址是主存儲器在PCI總線域的地址映像。
(2) PCI總線1上的設備將進行地址譯碼,確定這個寫請求是不是發送到自己的BAR空間,在PCI總線1上的設備除了PCI設備11之外,還有PCI橋2和PCI橋1。
(3) 首先PCI橋1、2和PCI設備11對這個地址同時進行正向譯碼。PCI橋1發現這個PCI地址並不在自己管理的PCI總線地址範圍之內,因為PCI橋片1所管理的PCI總線地址空間為0x7000-0000~0x73FF-FFFF。此時PCI橋1將接收這個存儲器寫總線事務,因為PCI橋1所管理的PCI總線地址範圍並不包含當前存儲器寫總線事務的地址,所以其下所有PCI設備都不可能接收這個存儲器寫總線事務。
(4) PCI橋1發現自己並不能處理當前這個存儲器寫總線事務,則將這個存儲器寫總線事務轉發到上遊總線。PCI橋1首先通過總線仲裁邏輯獲得PCI總線0的使用權後,然後將這個總線事務轉發到PCI總線0。
(5) HOST主橋發現0x9000-0000~0x9000-FFFF這段PCI總線地址空間與存儲器域的存儲器地址空間0x1000-0000~0x1000-FFFF對應,於是將這段PCI總線地址空間轉換成為存儲器域的存儲器地址空間,並完成對這段存儲器的寫操作。
(6) 存儲器控製器將從HOST主橋接收數據,並將其寫入到主存儲器。
PCI設備間的數據傳遞與PCI設備到存儲器的數據傳送大體類似。我們以PCI設備11將數據傳遞到PCI設備42為例說明這個轉遞過程。我們假定PCI設備11將一組數據發送到PCI設備42的PCI總線地址0x7500-0000~0x7500-FFFF這段地址空間中。這個過程與PCI設備11將數據發送到存儲器的第1~5步基本類似,隻是第5、6步不同。PCI設備11將數據發送到PCI設備42的第5、6步如下所示。
(1) PCI總線0發現其下的設備PCI橋4能夠處理來自PCI總線0的數據請求,則PCI橋4將接管這個PCI寫請求,並通過總線仲裁邏輯獲得PCI總線4的使用權,之後將這個存儲器寫請求發向PCI總線4。此時HOST主橋不會接收當前存儲器寫總線事務,因為0x7500-0000~0x7500-FFFF這段地址空間並不是HOST主橋管理的地址範圍。
(2) PCI總線4的PCI設備42將接收這個存儲器寫請求,並完成這個PCI存儲器寫請求總線事務。
PCI總線樹內的數據傳送始終都在PCI總線域中進行,因此不存在不同域之間的地址轉換,因此PCI設備11向PCI設備42進行數據傳遞時,並不會進行PCI總線地址空間到存儲器地址空間的轉換。
3.2.4 PCI橋的Combining、Merging和Collapsing
由上文所述,PCI設備間的數據傳遞有時將通過PCI橋。在某些情況下,PCI橋可以合並一些數據傳遞,以提高數據傳遞的效率。PCI橋可以采用Combining、Merging和Collapsing三種方式,優化數據通過PCI橋的效率。
1 Combining
PCI橋可以將接收到的多個存儲器寫總線事務合並為一個突發存儲器寫總線事務。PCI橋進行這種Combining操作時需要注意數據傳送的“順序”。當PCI橋接收到一組物理地址連續的存儲器寫訪問時,如對PCI設備的某段空間的DW1、2和4進行存儲器寫訪問時,PCI橋可以將這組訪問轉化為一個對DW1~4的突發存儲器寫訪問,並使用字節使能信號C/BE[3:0]#進行控製,其過程如下所示。
PCI橋將在數據周期1中,置C/BE[3:0]#信號為有效表示傳遞數據DW1;在數據周期2中,置C/BE[3:0]#信號為有效表示傳遞數據DW2;在數據周期3中,置C/BE[3:0]#信號為無效表示在這個周期中所傳遞的數據無效,從而跳過DW3;並在數據周期4中,置C/BE[3:0]#信號為有效表示傳遞數據DW4。
目標設備將最終按照發送端的順序,接收DW1、DW2和DW4,采用這種方法在不改變傳送序的前提下,提高了數據的傳送效率。值得注意的是,有些HOST主橋也提供這種Combining方式,合並多次數據訪問。如果目標設備不支持突發傳送方式,該設備可以使用Disconnect周期,終止突發傳送,此時PCI橋/HOST主橋可以使用多個存儲器寫總線事務分別傳送DW1、DW2和DW4,而不會影響數據傳送。
如果PCI橋收到“亂序”的存儲器寫訪問,如對PCI設備的某段空間的DW4、3和1進行存儲器寫訪問時,PCI橋不能將這組訪問轉化為一個對DW1~4的突發存儲器寫訪問,此時PCI橋必須使用三個存儲器寫總線事務轉發這些存儲器寫訪問。
2 Merge
PCI橋可以將收到的多個對同一個DW地址的Byte、Word進行的存儲器寫總線事務,合並為一個對這個DW地址的存儲器寫總線事務。PCI規範並沒有要求這些對Byte、Word進行的存儲器寫在一個DW的邊界之內,但是建議PCI橋僅處理這種情況。本節也僅介紹在這種情況下,PCI橋的處理過程。
PCI規範允許PCI橋進行Merge操作的存儲器區域必須是可預讀的,而可預讀的存儲器區域必須支持這種Merge操作。Merge操作可以不考慮訪問順序,可以將對Byte0、Byte1、Byte3的存儲器訪問合並為一個DW,也可以將對Byte3、Byte1、Byte0的存儲器訪問合並為一個DW。在這種情況下,PCI總線事務僅需屏蔽與Byte2相關的字節使能信號C/BE2#即可。
如果PCI設備對Byte1進行存儲器寫、然後再對Byte1、Byte2、Byte3進行存儲器寫時,PCI橋不能將這兩組存儲器寫合並為一次對DW進行存儲器寫操作。但是PCI橋可以合並後一組存儲器寫,即首先對Byte1進行存儲器寫,然後合並後一組存儲器寫(Byte1、Byte2和Byte3)為一個DW寫,並屏蔽相應的C/BE0#信號。Combining與Merge操作之間沒有直接聯係,PCI橋可以同時支持這兩種方式,也可以支持任何一種方式。
3 Collapsing
Collapsing指PCI橋可以將對同一個地址進行的Byte、Word和DW存儲器寫總線事務合並為一個存儲器寫操作。使用PCI橋的Collapsing方式是,具有某些條件限製,在多數情況下,PCI橋不能使用Collapsing方式合並多個存儲器寫總線事務。
當PCI橋收到一個對“DW地址X”的Byte3進行的存儲器寫總線事務,之後又收到一個對“DW地址X”的Byte、Word或者DW存儲器寫總線事務時,而且後一個對DW地址X進行的存儲器寫仍然包含Byte3時,如果PCI橋支持Collapsing方式,就可以將這兩個存儲器寫合並為一個存儲器寫。
PCI橋在絕大多數情況下不能支持這種方式,因為很少有PCI設備支持這種數據合並方式。通常情況下,對PCI設備的同一地址的兩次寫操作代表不同的含義,因此PCI橋不能使用Collapsing方式將這兩次寫操作合並。PCI規範僅是提出了Collapsing方式的概念,幾乎沒有PCI橋支持這種數據合並方式。
最後更新:2017-04-03 16:48:37