MSI中斷簡介
Xilinx PCIE IP中MSI中斷相關(guān)的地址如下圖1所示,如果想要成功產(chǎn)生中斷,MSI Control, Message Address (Lower), Message Address (Upper)和Message Data這四個(gè)字段是必須要進(jìn)行配置的,此四個(gè)字段均可通過主機(jī)的軟件或者Xilinx的RP(root port)IP進(jìn)行配置。
圖1
PCIE的協(xié)議對(duì)MSI Control字段的定義如圖2所示,其中的MSI Enable必須使能,否則EP(endpoint)無法發(fā)送中斷。Message Address (Lower), Message Address(Upper)和Message Data分別指的是memory write的TLP包的地址和數(shù)據(jù)。
圖2
MSI中斷的生成
在生成MSI中斷時(shí),首先需要打開IP的MSI功能,以AXI Bridege IP為例,如圖3所示勾選Enable MSI Capability Structure。
圖3
用于產(chǎn)生中斷的信號(hào)如下圖4所示,要發(fā)送MSI中斷之前需要確定msi_enable是否被拉高,如果msi_enable沒有被拉高,IP是無法發(fā)送中斷的。Usr_irq_req需要一直保持為高直到確認(rèn)中斷已被成功處理,這里需要設(shè)置一個(gè)·機(jī)制,需要軟件配合進(jìn)行實(shí)現(xiàn),如軟件在處理完中斷后要向FPGA內(nèi)與邏輯約定好的寄存器寫1,邏輯在檢查到此寄存器被寫1后,再將usr_irq_req置低。
圖4
通常邏輯在發(fā)送MSI中斷時(shí)不會(huì)檢測(cè)msi_enable信號(hào),此信號(hào)一般不會(huì)由EP端進(jìn)行控制,使能MSI功能通常在軟件側(cè)進(jìn)行操作,在linux系統(tǒng)中使用lspci -vvvs 指令即可查看MSI功能是否被使能,若打印信息如下圖5所示,顯示MSI:Enable-,則表示MSI功能未被使能,此時(shí)邏輯即使拉高usr_irq_req信號(hào),主機(jī)也不會(huì)接收到中斷。用戶可以通過使用setpci指令來使能MSI功能。從圖1和圖2可得,Xilinx Pcie EP的MSI Enable在4a的第一位,可以使用setpci –s 24:00.0 4a.w=1 指令來使能MSI功能。使用上述指令寫完4a寄存器后,圖5的MSI:Enable-會(huì)變至MSI:Enable+,表示MSI功能使能成功。
圖5
在Pcie鏈路穩(wěn)定后,RP端將會(huì)發(fā)送配置寫對(duì)EP端進(jìn)行配置,圖6為RP側(cè)對(duì)EP側(cè)中Pcie MSI的message address和message data字段的配置,RP首先對(duì)EP的4C寄存器全寫0,表示Message Address(Lower)為全0,隨后RP對(duì)EP的50寄存器寫32‘h800,即Message Address(Upper)的值為32’h800,寫完這兩個(gè)寄存器后,RP也需要寫對(duì)應(yīng)的寄存器來進(jìn)行記錄,當(dāng)隨后接收到地址為64’h800_0000_0000 memory write TLP包后,會(huì)將此包解析為中斷請(qǐng)求。RP在配置EP的message字段時(shí),只需要將所要的message data寫入到54寄存器,如圖6所示,RP將32’h54寫入到了EP的message data字段中,完成了EP側(cè)的message address和message data的配置。
圖6
圖7
RP對(duì)EP的MSI功能的使能,可通過對(duì)EP的48寄存器寫32’h10000即可,本篇文章參考的是PG213中Register(Type0:Enpoint)表格,不同廠商的MSI寄存器所在的位置通常不同,在配置時(shí)需要參考對(duì)應(yīng)廠商的IP手冊(cè)。如圖7所示,RP側(cè)在配置完EP的MSI control寄存器后,EP的msi_enable會(huì)變?yōu)楦?,至此RP完成了EP側(cè) MSI功能的必要配置。
在完成上述配置后,用戶邏輯在拉高usr_irq_req后,會(huì)發(fā)現(xiàn)usr_irq_ack隨后被拉高,這表示IP已完成中斷的發(fā)送,如果在拉高usr_irq_req后,usr_irq_ack沒有被拉高,又或者usr_irq_fail拉高,這種情況大概率是EP msi_enable沒有被成功使能。在EP端拉高usr_irq_req信號(hào)一段時(shí)間后,會(huì)發(fā)現(xiàn)RP側(cè)的interrupt_out信號(hào)拉高,如圖8所示,表RP側(cè)接收并識(shí)別了EP發(fā)送的中斷信號(hào)。
圖8
圖9為在Pcie RP IP接口截取的TLP包,EP發(fā)送MSI中斷即為發(fā)送memory write的TLP包到RP,RP在接收到此特定地址和數(shù)據(jù)的TLP包后,會(huì)將其解析為中斷,Pcie的CQ接口接收到的包為對(duì)端發(fā)送的request 包,即EP側(cè)發(fā)送的memory write TLP包可在此接口截取到。
圖9
在EP發(fā)送中斷后,RP的m_axis_cq_tvalid會(huì)拉高,此時(shí)會(huì)收到TLP包,經(jīng)過解析后發(fā)現(xiàn)此包的Request_Type為4’h1,在圖10中查找,可發(fā)現(xiàn)此包為memory write類型的包,此包的地址在m_axis_cq_tdata的前64bit,地址為64’h800_0000_0000,與PR寫入至EP配置空間的4C(Message Address (Lower))和50(Message Address (Upper))寄存器的數(shù)值一致。RP收到的第一拍數(shù)據(jù)byte_en為0,表示第一拍中不存在數(shù)據(jù)載荷,在第二拍中可以看到byte_en的數(shù)值為32’hf,表示此拍存在數(shù)據(jù),m_axis_cq_tdata的前64bit即圖中addr字段的顯示的數(shù)值為64’h54,表示memory write的數(shù)據(jù)為54,與RP寫入到EP配置空間的54(Message Data)寄存器的內(nèi)容一致。
圖10
MSI和MSI-X中斷都是EP端向RP端發(fā)送memory write的TLP包,所以bus master的功能也需要打開,在bus master打開后EP才可以主動(dòng)發(fā)送request到RP端。
圖11
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1630文章
21769瀏覽量
604638 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41588 -
msi
+關(guān)注
關(guān)注
0文章
26瀏覽量
29881 -
AXI
+關(guān)注
關(guān)注
1文章
128瀏覽量
16667
原文標(biāo)題:如何使用AXI Bridge IP 發(fā)送MSI中斷
文章出處:【微信號(hào):Hack電子,微信公眾號(hào):Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論