- 論壇徽章:
- 0
|
原理:tilepro36外接pcie接口的fpga板卡,通過(guò)中斷的方式通知系統(tǒng)數(shù)據(jù)接收完畢 現(xiàn)象:由于是高速數(shù)據(jù)采集,pcie中斷次數(shù)較多,正常情況下每秒7000次左右,不知道網(wǎng)卡中斷次數(shù)能達(dá)到多少,但是有時(shí)上電啟動(dòng)發(fā)現(xiàn)pcie次數(shù)遠(yuǎn)遠(yuǎn)多于預(yù)想值,造成linux沒(méi)有時(shí)間去執(zhí)行中斷處理程序,fpga端顯示死機(jī)。此現(xiàn)象隨機(jī)出現(xiàn)。 分析原因: 通過(guò)認(rèn)真分析hv/drivers/pcie/rootcomplex_default.c和pcie.c文件的得出pcie中斷的原理如下是: 1.rc_init中注冊(cè)pcie device model,同時(shí)注冊(cè)中斷回調(diào)函數(shù)intcall; 2.rc_service中一直都有一個(gè)mailloop函數(shù)在pcie dedicated tile上運(yùn)行,作用是接收pcie接口的message,分析后調(diào)用回調(diào)函數(shù)intcall,根據(jù)分析后的參數(shù)不同,該回調(diào)函數(shù)發(fā)送ibound內(nèi)部消息到linux驅(qū)動(dòng)運(yùn)行的tile,該tile再解析該內(nèi)部消息并產(chǎn)生linux中斷給OS。
問(wèn)題是回調(diào)函數(shù)intcall中發(fā)送的ibound內(nèi)部消息應(yīng)該分為INTx assert和deassert兩種,但在錯(cuò)誤發(fā)生的情況下我一直收到assert消息,沒(méi)有收到deassert消息,所以認(rèn)為fpga根本沒(méi)有發(fā)送對(duì)本次中斷無(wú)效的消息,造成hv一直認(rèn)為中斷有效,次數(shù)比預(yù)想要多。
解決方法: fpga之前在pc機(jī)上使用的是MSI中斷,沒(méi)有使用fpga內(nèi)部的assert線,但在tilepro36系統(tǒng)中通過(guò)觀察msi_enable線發(fā)現(xiàn)給line一直為低,說(shuō)明tilepro36硬件部分不支持MSI中斷。所以需要使用fpga的assert線來(lái)發(fā)送INTx的中斷消息。
疑點(diǎn)是在hv/drivers/pcie/shim_config.c中ibound init時(shí)對(duì)pcie寄存器的配置中使能了assert INTA-INTD 4根中斷,但沒(méi)有使能deassert的4根中斷。這樣配置為什么deassert消息接收后仍然能正確識(shí)別呢?
|
|