【摘要】:填写RD_DMA_SIZE寄存器,以字节为单位。填写DCSR2寄存器的mrd_start位,启动DMA读。等待DMA读完成中断产生后,结束DMA读。从硬件设计的角度来看,DMA读过程比DMA写过程复杂。Capric卡的1次DMA读操作使用两种TLP报文,并通过发送部件和接收部件协调完成。如果一次DMA读请求的数据大于512B[84]时,DMA控制逻辑需要发送多个存储器读请求TLP给RC,而且在DMA读操作中需要进行数据对界。DMA读操作的详细实现过程见第12.2.2节。
Capric卡使用DMA读过程将主存储器中的数据读到Capric卡片内SRAM中。在设备驱动程序中,DMA读过程如下所示。
(1)填写RD_DMA_ADR寄存器,注意此处填写的是PCI总线域的地址。
(2)填写RD_DMA_SIZE寄存器,以字节为单位。
(3)填写DCSR2寄存器的mrd_start位,启动DMA读。
(4)等待DMA读完成中断产生后,结束DMA读。如果系统软件屏蔽了DMA读完成中断,则系统软件可以通过查询INT_REG寄存器的rd_done_clr位判断是否DMA读已经完成。在Capric卡中,上一次DMA读操作没有完成之前,不能启动下一次DMA读操作。
(5)最后将rd_done_clr位清零。(www.chuimin.cn)
从硬件设计的角度来看,DMA读过程比DMA写过程复杂。PCIe总线使用Split方式实现存储器读。Capric卡的1次DMA读操作使用两种TLP报文,并通过发送部件和接收部件协调完成。
(1)首先DMA控制逻辑组织一个或者多个存储器读请求TLP,然后由发送部件将存储器读请求TLP传递给RC。
(2)RC正确接收到这个请求报文后,使用一个或者多个存储器读完成TLP将数据传递给Capric卡。
(3)Capric卡接收逻辑从RC中获得这些存储器读完成TLP时,需要首先处理乱序,之后完成一个DMA读操作,并向RC提交中断请求。
如果一次DMA读请求的数据大于512B[84]时,DMA控制逻辑需要发送多个存储器读请求TLP给RC,而且在DMA读操作中需要进行数据对界。尤其值得注意的是这几个TLP的Tag字段不能相同,为此硬件逻辑必须正确维护存储器读请求使用的Tag字段。DMA读操作的详细实现过程见第12.2.2节。
相关推荐