xilinx PCIe 启动DMA传输死机问题
时间:10-02
整理:3721RD
点击:
求助各位大神,本人使用K7 开发了一块PCIe板卡,DMA是自己开发的,目前出现的问题是:
如果只启动DMA写操作,PC机驱动不查询板卡BAR空间寄存器(即板卡不需要回复CPLD包),PC机不会死机(其中DMA所写到内存的数据也是正确的),但是一旦PC机定时查询BAR,那么PC机就会死机,此时发现板卡PCIe core的tx_buf_av已经为0(即发送buffer已经耗尽),用户构建的TLP包就无法发送出去了(此时也无法回复CPLD包),不知道什么原因造成了tx_buf_av突然就将为0了呢,有人说过没有进行流控,但是不知道如何进行流控呢?
如果只启动DMA写操作,PC机驱动不查询板卡BAR空间寄存器(即板卡不需要回复CPLD包),PC机不会死机(其中DMA所写到内存的数据也是正确的),但是一旦PC机定时查询BAR,那么PC机就会死机,此时发现板卡PCIe core的tx_buf_av已经为0(即发送buffer已经耗尽),用户构建的TLP包就无法发送出去了(此时也无法回复CPLD包),不知道什么原因造成了tx_buf_av突然就将为0了呢,有人说过没有进行流控,但是不知道如何进行流控呢?
软件问题VERILOG
1,检查lnk_up是否一直为高
2,在发送数据时加入tx_buf_av进行判断
3,我觉得可能是的DMA机制的问题:我们的方法是发Memory Write TLP和CPLD采用的是轮流的方式,也就是说你只有一个发送接口,但是你要控制这个发送接口轮流为这两个事务服务
4,我不知道你为什么定期查询BAR空间,我们都是用中断的方式来触发一次DMA读写的完成
首先谢谢三楼的回复,针对你提出的问题,我解释一下:
1、在问题出现前后,lnk_up信号一直为高;
2、目前DMA写操作也是采用中断形式,不过驱动响应中断后首先查询BAR其中一个寄存器(查询内存是否新的数据),如果存在新的数据,就取走数据,否则不进行操作(目前的DMA为Block DMA形式,而非SG DMA)
看描述第3点出问题的概率极大
补充一点,出口检测有没有发错误格式的包
目前的实现机制也是DMA写和回复CPLD包轮训的形式进行的,抓取的发送TLP包,未发现异常包,但是在出现异常的时候,PCIe core 在接收到发送TLP后,tx_buf_av会一直减少,不会增加,直至为零,导致无法再发送TLP包。
刚遇到这个问题,检查后发现是max_payload_size超过对端的接受能力了
