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