原理:tilepro36外接pcie接口的fpga板卡,通过中断的方式通知系统数据接收完毕
现象:由于是高速数据采集,pcie中断次数较多,正常情况下每秒7000次左右,不知道网卡中断次数能达到多少,但是有时上电启动发现pcie次数远远多于预想值,造成linux没有时间去执行中断处理程序,fpga端显示死机。此现象随机出现。
分析原因:
通过认真分析hv/drivers/pcie/rootcomplex_default.c和pcie.c文件的得出pcie中断的原理如下是:
1.rc_init中注册pcie device model,同时注册中断回调函数intcall;
2.rc_service中一直都有一个mailloop函数在pcie dedicated tile上运行,作用是接收pcie接口的message,分析后调用回调函数intcall,根据分析后的参数不同,该回调函数发送ibound内部消息到linux驱动运行的tile,该tile再解析该内部消息并产生linux中断给OS。
问题是回调函数intcall中发送的ibound内部消息应该分为INTx assert和deassert两种,但在错误发生的情况下我一直收到assert消息,没有收到deassert消息,所以认为fpga根本没有发送对本次中断无效的消息,造成hv一直认为中断有效,次数比预想要多。
解决方法:
fpga之前在pc机上使用的是MSI中断,没有使用fpga内部的assert线,但在tilepro36系统中通过观察msi_enable线发现给line一直为低,说明tilepro36硬件部分不支持MSI中断。所以需要使用fpga的assert线来发送INTx的中断消息。
疑点是在hv/drivers/pcie/shim_config.c中ibound init时对pcie寄存器的配置中使能了assert INTA-INTD 4根中断,但没有使能deassert的4根中断。这样配置为什么deassert消息接收后仍然能正确识别呢?
阅读(5293) | 评论(1) | 转发(1) |