1.9 事務(wù)順序
1.9.1 生產(chǎn)者/使用者模型
生產(chǎn)者/使用者模型可能是兩臺有請求能力的設(shè)備用來相互通信的常用方法。
1 一個網(wǎng)絡(luò)適配器開始通過網(wǎng)絡(luò)接收壓縮的視頻數(shù)據(jù)流泞边,并執(zhí)行一系列存儲器寫事務(wù)锐借,將這些壓縮的視頻數(shù)據(jù)流存入存儲器的數(shù)據(jù)緩沖區(qū)中问麸。
2 生產(chǎn)者將數(shù)據(jù)存入存儲器之后,它就執(zhí)行一次存儲器寫事務(wù)钞翔,在某一存儲器單元中設(shè)置一個標(biāo)志严卖,表示數(shù)據(jù)已經(jīng)準(zhǔn)備好,等待處理布轿。
3 使用者定期對標(biāo)志單元執(zhí)行存儲器讀哮笆,以便查看是否有數(shù)據(jù)要處理俺亮。
4 當(dāng)發(fā)現(xiàn)生產(chǎn)者已設(shè)置標(biāo)志時,它執(zhí)行一個存儲器寫清除標(biāo)志疟呐,然后執(zhí)行一次突發(fā)存儲器讀事務(wù),從存儲器的數(shù)據(jù)緩沖區(qū)中讀取壓縮的數(shù)據(jù)东且。
5 當(dāng)使用者使用完數(shù)據(jù)后启具,它將完成狀態(tài)寫入狀況單元。然后珊泳,它重新開始定期地讀取標(biāo)志單元鲁冯,以確定何時需要處理更多的數(shù)據(jù)。
6 與此同時色查,生產(chǎn)者也定期地讀取狀況單元薯演,查看其他請求者是否已經(jīng)完成數(shù)據(jù)處理、在生產(chǎn)者讀取狀況并發(fā)現(xiàn)使用者已經(jīng)完成數(shù)據(jù)處理時秧了,生產(chǎn)者接著執(zhí)行一個存儲器寫來清楚狀況單元跨扮。
7只要生產(chǎn)者還有數(shù)據(jù)要處理,此過程便重復(fù)验毡。
1.9.2 真正的PCIe順序規(guī)則
真正的PCIe順序規(guī)則可以概述為下面4條簡單的規(guī)則:
1. PCIe要求具有相同TC分配的事務(wù)按照強(qiáng)順序通過結(jié)構(gòu)衡创。因為分配了同一TC值的所有事務(wù)映射到一個給定的VC,因此這一規(guī)則也同樣適用于每個VC內(nèi)的事務(wù)晶通。
2. 不同TC分配的事物之間不存在順序關(guān)系璃氢。
3. 順序規(guī)則同樣適用于所有類型的事務(wù):存儲、IO狮辽、配置和消息一也。
4. 在有限的情況下,設(shè)置了“靈活的順序”屬性比特的事務(wù)能排在其他具有相同TC值的事務(wù)之前喉脖。
這些基本規(guī)則可以保證事務(wù)總是按照軟件計劃的順序完成椰苟。然而,這些規(guī)則非常保守动看,并且無法提供最佳的性能尊剔。在這種情況下,為了提高性能菱皆,可以應(yīng)用更冒險的規(guī)則须误。
1.9.3 靈活的順序
PCIe支持PCI-X引入的靈活的順序機(jī)制,但PCIe引入了一些變化仇轻。PCIe環(huán)境下靈活的順序概念允許請求者和完成者之間路徑上的交換器京痢,將剛收到的一些事務(wù)重新排在其他先前已入隊的事務(wù)之前。
支持生產(chǎn)者/使用者模型的順序規(guī)則可能導(dǎo)致事務(wù)阻塞篷店,事實上阻塞的事務(wù)與任何生產(chǎn)者/使用者事務(wù)序列無關(guān)祭椰。因此在某些情況下臭家,設(shè)置了靈活的順序?qū)傩员忍氐氖聞?wù)能重新排在其他事務(wù)之前。
如果設(shè)備驅(qū)動器允許方淤,設(shè)備就可以設(shè)置靈活的順序比特钉赁。
1.9.4 RO對存儲器寫和消息的影響
存儲器寫和消息事務(wù)都被當(dāng)作報告操作,兩者被接收到同一報告緩沖區(qū)携茂,兩者服從相同的順序要求你踩。當(dāng)設(shè)置了RO比特時,交換器處理這些事務(wù)的步驟如下:
允許交換器將剛報告的存儲器寫事務(wù)重新排在之前的報告存儲器寫事務(wù)或消息事務(wù)之前讳苦。同樣带膜,剛報告的消息事務(wù)也可以排在之前的報告存儲器寫或消息事務(wù)之前。交換器也必須不修改RO比特的轉(zhuǎn)發(fā)事務(wù)鸳谜。
允許根聯(lián)合體將剛報告的寫事務(wù)及時地排在早先接收的其他寫事務(wù)之前膝藕。同樣,在接收寫請求時咐扭,要求根聯(lián)合體將數(shù)據(jù)有效載荷寫入系統(tǒng)存儲器內(nèi)指定的地址單元芭挽,但允許以任意地址順序?qū)⒚總€字節(jié)寫入存儲器。
1.9.5 RO對存儲器讀事務(wù)的影響
設(shè)備發(fā)出設(shè)置了RO比特的存儲器讀請求時蝗肪,這個請求在到達(dá)完成者的路途中可能穿過一個或多個交換器览绿。完成者以一系列一個或多個分離的完成事務(wù)返回請求讀取的數(shù)據(jù),而且使用與請求相同的RO設(shè)置穗慕。
1.10 中斷
1.10.1 發(fā)送中斷的兩種方法
真正的PCIe中斷發(fā)送機(jī)制——PCIe使用消息信號中斷(MSI)消除了對邊帶信號的需要饿敲。消息信號中斷不是PCIe消息,而僅僅是存儲器寫事務(wù)逛绵。與MSI有關(guān)的存儲器寫與其他存儲器寫只能通過它們的目標(biāo)地址單元來區(qū)分怀各,與MSI有關(guān)的存儲器寫的目標(biāo)地址單元時系統(tǒng)專為中斷發(fā)送而保留的。
傳統(tǒng)的PCI中斷發(fā)送機(jī)制——這一機(jī)制必須使用為PCI總線定義的PCI兼容中斷信號(INITA#术浪、INITB#瓢对、INITC#、INITD#)的設(shè)備胰苏。傳統(tǒng)中斷設(shè)備使用這些中斷線之一發(fā)出中斷信號硕蛹。首先聲明INITx#信號請求中斷服務(wù),接下來當(dāng)服務(wù)中斷服務(wù)程序訪問設(shè)備專用寄存器時硕并,再取消聲明INITx#信號法焰,表示該中斷正在被服務(wù)。PCIe定義了其作用相當(dāng)于虛擬INITx#線的帶內(nèi)消息倔毙。這些消息以位于根聯(lián)合體內(nèi)的中斷控制器為目標(biāo)埃仪。
1.10.2 消息信號中斷
消息信號中斷(MSI)通過存儲器寫事務(wù)被發(fā)送到根聯(lián)合體。MSI功能寄存器提供設(shè)備發(fā)送MSI信號需要的所有信息陕赃。該寄存器由配置軟件設(shè)置卵蛉,包括如下信息:
目標(biāo)存儲器地址颁股;
要寫入指定單元的數(shù)值;
可以編碼成數(shù)據(jù)的消息樹傻丝。
1.10.2.1 MSI功能寄存器組
真正的PCIe功能必須在其自己的配置空間內(nèi)實現(xiàn)單獨的MSI寄存器組甘有。PCIe規(guī)范定義了兩種寄存器格式:
64位存儲器尋址格式;
32位存儲器尋址格式葡缰。
下面介紹MSI寄存器中的每個字段梧疲。
功能ID:標(biāo)志MSI寄存器組的功能ID是05h。這是一個硬連線运准、只讀的值。
下一新功能寄存器的指針:寄存器組的第二個字節(jié)若不是指向下一新功能寄存器組缭受,就是包含00h胁澳,如果這是新功能列表的結(jié)尾。它是一個硬連線米者、只讀的值韭畸。如果是非0值,則必須是一個雙字對齊的值蔓搞。
消息控制寄存器:
比特字段名描述
15:8保留只讀胰丁,總為0
764位地址能力只讀
0=功能未實現(xiàn)消息地址寄存器的高32位,不能產(chǎn)生64位寄存器地址
1=功能實現(xiàn)消息地址寄存器的高32位喂分,能產(chǎn)生64位存儲器地址
6:4多消息允許讀/寫锦庸。系統(tǒng)軟件讀取多消息能力字段,從而確定設(shè)備請求多少消息之后蒲祈,對這個字段編程甘萧,賦一個3位的值,表明分配給設(shè)備的消息實際數(shù)目梆掸。所分配的消息數(shù)目可以等于或小于實際請求的數(shù)目扬卷。這個字段的狀態(tài)在復(fù)位時為000b
3:1多消息能力只讀。系統(tǒng)軟件讀取這個字段確定設(shè)備分配了多少消息
0MSI允許讀/寫酸钦。復(fù)位后的狀態(tài)為0怪得,表明設(shè)備的MSI功能是禁用的。0=禁止功能使用MSI卑硫,必須使用INTx消息發(fā)送中斷徒恋;1=允許使用MSI請求服務(wù),禁止使用其中斷引腳
消息地址寄存器:低兩位硬連線到0欢伏。消息控制寄存器的bit7是1時因谎,高32位才出現(xiàn)。
消息數(shù)據(jù)寄存器:系統(tǒng)軟件通過將基消息數(shù)據(jù)寫入該16位讀/寫寄存器颜懊,從而分配設(shè)備一個基消息數(shù)據(jù)模式财岔。當(dāng)設(shè)備必須產(chǎn)生中斷請求時风皿,它將32位值寫入消息地址寄存器指定的寄存器地址。寫入的數(shù)據(jù)具有如下格式:
高16位總為0匠璧;
低16位由消息數(shù)據(jù)寄存器提供桐款。如果分配給設(shè)備的消息多于一個,則設(shè)備修改消息數(shù)據(jù)寄存器的低位夷恍,為它希望報告給驅(qū)動程序的事件形成適當(dāng)?shù)南ⅰ?/p>
1.10.2.2 MSI配置基礎(chǔ)
軟件配置PCIe設(shè)備的MSI中斷采取的步驟如下:
1. 啟動時魔眨,配置軟件掃描PCI總線并發(fā)現(xiàn)設(shè)備(執(zhí)行配置讀,讀取有效的供應(yīng)商ID)酿雪。在發(fā)現(xiàn)PCIe功能時遏暴,配置軟件讀取功能列表指針(Capabilities List Pointer),獲得寄存器鏈中第一個功能寄存器的地址指黎。
2. 然后軟件搜索功能寄存器組朋凉,知道發(fā)現(xiàn)MSI功能寄存器組(功能ID位05h)。
3. 軟件將一個雙字對齊的存儲器地址分配給設(shè)備的消息地址寄存器醋安。這是發(fā)送中斷請求時使用的存儲器寫的目的地址杂彭。
4. 軟件檢查設(shè)備消息控制寄存器的多消息能力字段,以確定設(shè)備將分配多少事件特定的消息給它吓揪。
5. 然后軟件向設(shè)備分配等于或小于設(shè)備請求設(shè)備數(shù)的消息亲怠。最少分配一條消息給設(shè)備。
6. 軟件將基消息數(shù)據(jù)模式寫入設(shè)備的消息數(shù)據(jù)寄存器柠辞。
7. 最后团秽,軟件設(shè)置設(shè)備的消息控制寄存器中的MSI允許比特,從而允許它使用MSI存儲器寫來生成中斷叭首。
當(dāng)設(shè)備必須生成中斷請求時徙垫,它將消息數(shù)據(jù)寄存器內(nèi)容寫入消息地址寄存器所指定的存儲器格式。下圖顯示了存儲器寫事務(wù)頭和數(shù)據(jù)字段中的內(nèi)容放棒。關(guān)鍵點包括:
格式字段必須是11b姻报,表明是帶數(shù)據(jù)的4DW頭,傳統(tǒng)端點的格式字段可以是10b间螟。
頭屬性比特(不偵測和靈活的順序)必須是零吴旋。
長度字段必須是01h,表明最大1DW的數(shù)據(jù)有效載荷厢破。
第一個BE字段必須是0011b荣瑟,表明有效數(shù)據(jù)在低16位中。
最后一個BE字段必須是0000b摩泪,表明是單個DW的事務(wù)笆焰。
頭中的地址字段直接來自于MSI功能寄存器的地址字段。
如果系統(tǒng)軟件向設(shè)備分配多個消息见坑,就允許它修改所分配的消息數(shù)據(jù)值的低位嚷掠,為每個設(shè)備特定的事件類型發(fā)送不同的消息捏检,通過設(shè)備驅(qū)動程序要求服務(wù)。
例如不皆,4個消息已分配給設(shè)備贯城,數(shù)據(jù)值0500h以復(fù)制給設(shè)備的消息數(shù)據(jù)寄存器,存儲器地址0A000000h已寫入設(shè)備的消息地址寄存器霹娄。當(dāng)4個不同的設(shè)備特定事件之一發(fā)生時能犯,設(shè)備生成一個請求,通過執(zhí)行雙字寫將數(shù)據(jù)值00000500h犬耻、00000501h踩晶、00000502h或00000503h寫入存儲器地址0A000000h。
1.10.3 傳統(tǒng)的PCI中斷發(fā)送機(jī)制
1.10.3.1 設(shè)備的INTx#引腳
每個物理PCI組件可以實現(xiàn)最多4個INTx#信號(INITA#枕磁、INITB#渡蜻、INITC#、INITD#)透典。由于PCI設(shè)備最多能支持8個功能,如果實現(xiàn)最多8個功能并且所有功能都要求中斷顿苇,則必須共享INTx#信號峭咒。不允許一個功能使用多于一個的INTx#信號。
每一PCI功能通過標(biāo)準(zhǔn)配置頭來表明支持INTx#信號纪岁。下圖展示了只讀中斷引腳寄存器凑队,它含有配置軟件用于確定是佛支持INTx#信號,并且如果支持幔翰,這個功能使用哪個INTx#信號所必需的信息漩氨。
1.10.3.2 中斷路由
需要系統(tǒng)設(shè)計者確定來自設(shè)備的INTx#引腳的路由∫旁觯可以用多種方式路由每臺設(shè)備使用的INTx#信號叫惊,以便每個INTx#引腳最終到達(dá)中斷控制器的一個輸入。下例中做修,所有PCI INTx信號被路由到4個輸入之一霍狰。所有路由到給定輸入的INTx信號將定向到中斷控制器的特定輸入,因此每個路由到共同輸入端的INTx也將具有平臺軟件分配給它的同一種中斷線編號饰及。IRQ15有3個來自不同設(shè)備的PCI INTx輸入——INTB#蔗坯、INTA#、INTA#燎含。因此宾濒,使用這些INTx#線的功能將共享IRQ15以及與之相關(guān)的中斷向量。
根據(jù)與每一功能相關(guān)的INTx#引腳的路由情況屏箍,配置軟件報告中斷線號绘梦。當(dāng)來自這一功能的中斷出現(xiàn)時橘忱,這個值最終告訴功能的設(shè)備驅(qū)動程序報告哪個中斷向量。因此谚咬,當(dāng)這個功能產(chǎn)生中斷時鹦付,CPU將收到與中斷線寄存器指定的IRQ有關(guān)的向量號。CPU使用這個向量號索引中斷服務(wù)表择卦,以讀取該功能的相關(guān)設(shè)備驅(qū)動程序的中斷服務(wù)入口指針敲长。傳遞該信息所使用的方法是操作系統(tǒng)特有的。
1.10.3.3 INTx#信令
當(dāng)設(shè)備發(fā)送中斷信號時秉继,它也在設(shè)備專用寄存器中設(shè)置某個比特來表明有一個中斷等待處理祈噪。可將該寄存器映射在存儲器或I/O地址空間中尚辑,由設(shè)備專用軟件讀取辑鲤,以便驗證有一個中斷待完成。當(dāng)此比特被清除時杠茬,取消聲明INTx信號月褥。
設(shè)備也必須設(shè)置位于配置寄存器的中斷狀況比特。系統(tǒng)軟件可以讀取這一比特瓢喉,以便得知目前是否有一個中斷待完成宁赤。
禁用中斷:PCI2.3規(guī)范在配置命令寄存器中增加了禁用中斷比特(比特10),如下圖所示栓票。復(fù)位時决左,該比特被清除,允許產(chǎn)生INTx信號走贪。軟件可以設(shè)置該比特佛猛,從而禁止生成INTx信號。
中斷狀況:PCI2.3規(guī)范在配置狀態(tài)寄存器中增加了中斷狀態(tài)比特坠狡,如下圖所示继找。當(dāng)中斷待處理時,功能必須設(shè)置該狀況比特逃沿。另外码荔,如果配置命令寄存器中的禁用中斷比特被清除(即允許中斷),則僅在中斷狀況比特置1后感挥,才能聲明該功能的INTx#信號缩搅。該比特不受禁用中斷比特狀態(tài)的影響。同時是只讀的触幼。
1.10.3.4 INTx消息的格式
設(shè)備可以同時支持兩種中斷硼瓣,但任何給定的時刻只允許使用一種機(jī)制。設(shè)置MSI允許比特可以禁止設(shè)備使用INTx消息,并允許發(fā)送MSI堂鲤。