PCIE系統標準體系結構解讀(八):事務順序和中斷

1.9 事務順序

1.9.1 生產者/使用者模型

生產者/使用者模型可能是兩臺有請求能力的設備用來相互通信的常用方法。

1 一個網絡適配器開始通過網絡接收壓縮的視頻數據流,並執行一系列存儲器寫事務,將這些壓縮的視頻數據流存入存儲器的數據緩衝區中。

2 生產者將數據存入存儲器之後,它就執行一次存儲器寫事務,在某一存儲器單元中設置一個標誌,表示數據已經準備好,等待處理。

3 使用者定期對標誌單元執行存儲器讀,以便查看是否有數據要處理。

4 當發現生產者已設置標誌時,它執行一個存儲器寫清除標誌,然後執行一次突發存儲器讀事務,從存儲器的數據緩衝區中讀取壓縮的數據。

5 當使用者使用完數據後,它將完成狀態寫入狀況單元。然後,它重新開始定期地讀取標誌單元,以確定何時需要處理更多的數據。

6 與此同時,生產者也定期地讀取狀況單元,查看其他請求者是否已經完成數據處理、在生產者讀取狀況並發現使用者已經完成數據處理時,生產者接着執行一個存儲器寫來清楚狀況單元。

7只要生產者還有數據要處理,此過程便重複。

1.9.2 真正的PCIe順序規則

真正的PCIe順序規則可以概述爲下面4條簡單的規則:

1. PCIe要求具有相同TC分配的事務按照強順序通過結構。因爲分配了同一TC值的所有事務映射到一個給定的VC,因此這一規則也同樣適用於每個VC內的事務。

2. 不同TC分配的事物之間不存在順序關係。

3. 順序規則同樣適用於所有類型的事務:存儲、IO、配置和消息。

4. 在有限的情況下,設置了“靈活的順序”屬性比特的事務能排在其他具有相同TC值的事務之前。

這些基本規則可以保證事務總是按照軟件計劃的順序完成。然而,這些規則非常保守,並且無法提供最佳的性能。在這種情況下,爲了提高性能,可以應用更冒險的規則。

1.9.3 靈活的順序

PCIe支持PCI-X引入的靈活的順序機制,但PCIe引入了一些變化。PCIe環境下靈活的順序概念允許請求者和完成者之間路徑上的交換器,將剛收到的一些事務重新排在其他先前已入隊的事務之前。

支持生產者/使用者模型的順序規則可能導致事務阻塞,事實上阻塞的事務與任何生產者/使用者事務序列無關。因此在某些情況下,設置了靈活的順序屬性比特的事務能重新排在其他事務之前。

如果設備驅動器允許,設備就可以設置靈活的順序比特。

1.9.4 RO對存儲器寫和消息的影響

存儲器寫和消息事務都被當作報告操作,兩者被接收到同一報告緩衝區,兩者服從相同的順序要求。當設置了RO比特時,交換器處理這些事務的步驟如下:

允許交換器將剛報告的存儲器寫事務重新排在之前的報告存儲器寫事務或消息事務之前。同樣,剛報告的消息事務也可以排在之前的報告存儲器寫或消息事務之前。交換器也必須不修改RO比特的轉發事務。

允許根聯合體將剛報告的寫事務及時地排在早先接收的其他寫事務之前。同樣,在接收寫請求時,要求根聯合體將數據有效載荷寫入系統存儲器內指定的地址單元,但允許以任意地址順序將每個字節寫入存儲器。

1.9.5 RO對存儲器讀事務的影響

設備發出設置了RO比特的存儲器讀請求時,這個請求在到達完成者的路途中可能穿過一個或多個交換器。完成者以一系列一個或多個分離的完成事務返回請求讀取的數據,而且使用與請求相同的RO設置。

1.10 中斷

1.10.1 發送中斷的兩種方法

真正的PCIe中斷髮送機制——PCIe使用消息信號中斷(MSI)消除了對邊帶信號的需要。消息信號中斷不是PCIe消息,而僅僅是存儲器寫事務。與MSI有關的存儲器寫與其他存儲器寫只能通過它們的目標地址單元來區分,與MSI有關的存儲器寫的目標地址單元時系統專爲中斷髮送而保留的。

傳統的PCI中斷髮送機制——這一機制必須使用爲PCI總線定義的PCI兼容中斷信號(INITA#、INITB#、INITC#、INITD#)的設備。傳統中斷設備使用這些中斷線之一發出中斷信號。首先聲明INITx#信號請求中斷服務,接下來當服務中斷服務程序訪問設備專用寄存器時,再取消聲明INITx#信號,表示該中斷正在被服務。PCIe定義了其作用相當於虛擬INITx#線的帶內消息。這些消息以位於根聯合體內的中斷控制器爲目標。

1.10.2 消息信號中斷

消息信號中斷(MSI)通過存儲器寫事務被髮送到根聯合體。MSI功能寄存器提供設備發送MSI信號需要的所有信息。該寄存器由配置軟件設置,包括如下信息:

目標存儲器地址;

要寫入指定單元的數值;

可以編碼成數據的消息樹。

1.10.2.1 MSI功能寄存器組

真正的PCIe功能必須在其自己的配置空間內實現單獨的MSI寄存器組。PCIe規範定義了兩種寄存器格式:

64位存儲器尋址格式;

32位存儲器尋址格式。

 

 

下面介紹MSI寄存器中的每個字段。

功能ID:標誌MSI寄存器組的功能ID是05h。這是一個硬連線、只讀的值。

下一新功能寄存器的指針:寄存器組的第二個字節若不是指向下一新功能寄存器組,就是包含00h,如果這是新功能列表的結尾。它是一個硬連線、只讀的值。如果是非0值,則必須是一個雙字對齊的值。

消息控制寄存器:

比特

字段名

描述

15:8

保留

只讀,總爲0

7

64位地址能力

只讀

0=功能未實現消息地址寄存器的高32位,不能產生64位寄存器地址

1=功能實現消息地址寄存器的高32位,能產生64位存儲器地址

6:4

多消息允許

讀/寫。系統軟件讀取多消息能力字段,從而確定設備請求多少消息之後,對這個字段編程,賦一個3位的值,表明分配給設備的消息實際數目。所分配的消息數目可以等於或小於實際請求的數目。這個字段的狀態在復位時爲000b

3:1

多消息能力

只讀。系統軟件讀取這個字段確定設備分配了多少消息

0

MSI允許

讀/寫。復位後的狀態爲0,表明設備的MSI功能是禁用的。0=禁止功能使用MSI,必須使用INTx消息發送中斷;1=允許使用MSI請求服務,禁止使用其中斷引腳

消息地址寄存器:低兩位硬連線到0。消息控制寄存器的bit7是1時,高32位纔出現。

消息數據寄存器:系統軟件通過將基消息數據寫入該16位讀/寫寄存器,從而分配設備一個基消息數據模式。當設備必須產生中斷請求時,它將32位值寫入消息地址寄存器指定的寄存器地址。寫入的數據具有如下格式:

高16位總爲0;

低16位由消息數據寄存器提供。如果分配給設備的消息多於一個,則設備修改消息數據寄存器的低位,爲它希望報告給驅動程序的事件形成適當的消息。

1.10.2.2 MSI配置基礎

軟件配置PCIe設備的MSI中斷採取的步驟如下:

1. 啓動時,配置軟件掃描PCI總線並發現設備(執行配置讀,讀取有效的供應商ID)。在發現PCIe功能時,配置軟件讀取功能列表指針(Capabilities List Pointer),獲得寄存器鏈中第一個功能寄存器的地址。

2. 然後軟件搜索功能寄存器組,知道發現MSI功能寄存器組(功能ID位05h)。

3. 軟件將一個雙字對齊的存儲器地址分配給設備的消息地址寄存器。這是發送中斷請求時使用的存儲器寫的目的地址。

4. 軟件檢查設備消息控制寄存器的多消息能力字段,以確定設備將分配多少事件特定的消息給它。

5. 然後軟件向設備分配等於或小於設備請求設備數的消息。最少分配一條消息給設備。

6. 軟件將基消息數據模式寫入設備的消息數據寄存器。

7. 最後,軟件設置設備的消息控制寄存器中的MSI允許比特,從而允許它使用MSI存儲器寫來生成中斷。

 

當設備必鬚生成中斷請求時,它將消息數據寄存器內容寫入消息地址寄存器所指定的存儲器格式。下圖顯示了存儲器寫事務頭和數據字段中的內容。關鍵點包括:

格式字段必須是11b,表明是帶數據的4DW頭,傳統端點的格式字段可以是10b。

頭屬性比特(不偵測和靈活的順序)必須是零。

長度字段必須是01h,表明最大1DW的數據有效載荷。

第一個BE字段必須是0011b,表明有效數據在低16位中。

最後一個BE字段必須是0000b,表明是單個DW的事務。

頭中的地址字段直接來自於MSI功能寄存器的地址字段。

 

如果系統軟件向設備分配多個消息,就允許它修改所分配的消息數據值的低位,爲每個設備特定的事件類型發送不同的消息,通過設備驅動程序要求服務。

例如,4個消息已分配給設備,數據值0500h以複製給設備的消息數據寄存器,存儲器地址0A000000h已寫入設備的消息地址寄存器。當4個不同的設備特定事件之一發生時,設備生成一個請求,通過執行雙字寫將數據值00000500h、00000501h、00000502h或00000503h寫入存儲器地址0A000000h。

1.10.3 傳統的PCI中斷髮送機制

1.10.3.1 設備的INTx#引腳

每個物理PCI組件可以實現最多4個INTx#信號(INITA#、INITB#、INITC#、INITD#)。由於PCI設備最多能支持8個功能,如果實現最多8個功能並且所有功能都要求中斷,則必須共享INTx#信號。不允許一個功能使用多於一個的INTx#信號。

每一PCI功能通過標準配置頭來表明支持INTx#信號。下圖展示了只讀中斷引腳寄存器,它含有配置軟件用於確定是佛支持INTx#信號,並且如果支持,這個功能使用哪個INTx#信號所必需的信息。

 

1.10.3.2 中斷路由

需要系統設計者確定來自設備的INTx#引腳的路由。可以用多種方式路由每臺設備使用的INTx#信號,以便每個INTx#引腳最終到達中斷控制器的一個輸入。下例中,所有PCI INTx信號被路由到4個輸入之一。所有路由到給定輸入的INTx信號將定向到中斷控制器的特定輸入,因此每個路由到共同輸入端的INTx也將具有平臺軟件分配給它的同一種中斷線編號。IRQ15有3個來自不同設備的PCI INTx輸入——INTB#、INTA#、INTA#。因此,使用這些INTx#線的功能將共享IRQ15以及與之相關的中斷向量。

根據與每一功能相關的INTx#引腳的路由情況,配置軟件報告中斷線號。當來自這一功能的中斷出現時,這個值最終告訴功能的設備驅動程序報告哪個中斷向量。因此,當這個功能產生中斷時,CPU將收到與中斷線寄存器指定的IRQ有關的向量號。CPU使用這個向量號索引中斷服務表,以讀取該功能的相關設備驅動程序的中斷服務入口指針。傳遞該信息所使用的方法是操作系統特有的。

 

1.10.3.3 INTx#信令

當設備發送中斷信號時,它也在設備專用寄存器中設置某個比特來表明有一箇中斷等待處理。可將該寄存器映射在存儲器或I/O地址空間中,由設備專用軟件讀取,以便驗證有一箇中斷待完成。當此比特被清除時,取消聲明INTx信號。

設備也必須設置位於配置寄存器的中斷狀況比特。系統軟件可以讀取這一比特,以便得知目前是否有一箇中斷待完成。

禁用中斷:PCI2.3規範在配置命令寄存器中增加了禁用中斷比特(比特10),如下圖所示。復位時,該比特被清除,允許產生INTx信號。軟件可以設置該比特,從而禁止生成INTx信號。

 

中斷狀況:PCI2.3規範在配置狀態寄存器中增加了中斷狀態比特,如下圖所示。當中斷待處理時,功能必須設置該狀況比特。另外,如果配置命令寄存器中的禁用中斷比特被清除(即允許中斷),則僅在中斷狀況比特置1後,才能聲明該功能的INTx#信號。該比特不受禁用中斷比特狀態的影響。同時是隻讀的。

 

1.10.3.4 INTx消息的格式

 

 

設備可以同時支持兩種中斷,但任何給定的時刻只允許使用一種機制。設置MSI允許比特可以禁止設備使用INTx消息,並允許發送MSI。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章