赞
踩
主要为PG195的翻译,以及自己的理解
Host:request
FPGA:Complter
5、AXI4-Lite Slave to access DMA status register
6、支持SG Desc list
7、每个描述符支持最大256MB的长度传输。 为啥要限制256MB
8、Block fetches of contiguous descriptors ???
9、轮询模式,如何理解
10、Desc bypass 模式,即将host中描述符吐出到FPGA,fpga又如何使用
11、任意的源、目的地址
12、在AXI总线上校验或传播校验(7系列Gen2 IP)
DMA/Bridge子系统可配置为高性能直接存储器访问(DMA)数据传输器,也可配置为PCI Express和AXI内存空间之间的桥接器。
本文档仅涵盖DMA模式操作。
该图表涉及请求方请求(RQ)/请求方完成(RC)接口和完成方请求(CQ)/完成方完成(CC)接口。
RQ:DMA向Host发起请求;
RC:DMA向Host发起请求的回应;
CQ:Host向FPGA发起的请求;
CC:Host向FPGA发起的请求的回应;
Cfg master(AXI4-Lite Master):为主机的小数据的申请,通常为32bit的寄存器访问;
Host DMA Bypass(AXI MM Master):主机主动发起的请求,一般用在大数据量的通讯上;
Cfg master(AXI4-Lite Slave):FPGA使用axi-lite接口控制xdma的寄存器,具体可以控制哪些寄存器暂时不知道。
DMA/Bridge子系统允许在主机内存和DMA子系统之间传输数据。它通过对包含有关要传输的源、目标和数据量的信息的“描述符”进行操作来实现。这些直接内存传输可以是主机到板卡(H2C)和板卡到主机(C2H)之间的传输。DMA可以配置为具有单个AXI4主接口,该接口由所有通道共享,或为每个启用的通道配置一个AXI4-Stream接口。内存传输在描述符链表中按通道指定,DMA从主机内存获取并处理这些链表。完成描述符和错误等事件使用中断进行信号传递。该IP还提供高达16个用户中断线,用于生成主机中断。
主机可以通过两个接口直接访问用户逻辑:
1)、AXI4-Lite主配置端口:该端口是一个固定的32位端口,用于非性能关键的用户配置和状态寄存器访问。
2)、AXI内存映射主CQ bypass端口:该端口的宽度与DMA通道数据通路相同,用于高带宽访问用户内存,这在P2P传输等应用中可能是必需的。
用户逻辑可以通过AXI4-Lite从属配置接口访问DMA/Bridge子系统的PCIe内部配置和状态寄存器。在此接口上发起的请求不会转发到PCI Express。
For 7 series Gen2 IP, PCIe access from the Host system must be limited to 1DW (4 Bytes)
transaction only.
Note: Both AXI Bypass and Register access are limited by this restriction.
XDMA既集成了PCIe,又集成了DMA.
此IP用到的标准:
PCIe的DMA/桥接子系统符合以下规范:
1)、AMBAAXI4-流协议规范(ARM IHI0051A)
2)、PCIExpress基础规范v2.1和v3.0
性能和资源利用率
DMA的性能
68049 - DMA Subsystem for PCI Express (Vivado 2016.3) - Performance Numbers (xilinx.com)
使用多通道,以及MSIX,性能会更佳
MSIX比MSI好:WHY,Host应该没有感觉的啊
“Users can try using MSI-X interrupt Instead of MSI or legacy interrupts. With MSI-X interrupt, the data rate is better than with an MSI or legacy interrupt based design”
使用A7时,规律和以上一致。
最低器件速率要求:
不同的PCIe速率对FPGA速度等级要求不一样
在内部,该子系统可以配置为实现高达八个独立的物理DMA引擎(最多四个H2C和四个C2H,不同器件支持的数量不一样)。这些DMA引擎可以映射到单独的AXI4-Stream接口或共享的AXI4-MM接口,供用户应用程序使用。在AXI4 MM接口上,DMA/Bridge子系统为PCI Express®生成请求和预期的完成,DMA会完成用户侧的数据搬运。而AXI4-Stream接口仅用于数据传输。
配置的通道类型决定了总线上的事务:
DMA/Bridge子系统还允许主机访问用户逻辑。到达“PCIe to DMA bypass Base Address Register (BAR)”的写请求将由DMA处理。写请求中的数据通过M_AXI接口转发到用户应用程序。有疑惑,这不是DMA处理的。
主机对用户逻辑中的配置和状态寄存器的访问是通过AXI master控制端口提供的。这些请求是32位读取或写入。包含axi master bypass接口和axi-lite master接口。
用户应用程序还可以通过AXI slave端口访问内部DMA配置和状态寄存器。
当启用了多个H2C和C2H通道时,AXI4主控制端口上的事务在所有选定的通道之间交错访问。简单的轮询协议用于为所有通道提供服务。事务的粒度取决于主机的最大有效载荷大小(MPS)、页面大小和其他主机设置。
接器接收来自主机的请求。基于BAR,请求被定向到内部目标用户,通过AXI4-Lite主控制端口或CQ Bypass端口。在下游用户逻辑为非post请求返回数据后,目标桥接器生成读完成TLP,并通过CC总线将其发送到PCIe IP。
在以下表格中,PCIe BARs的选择对应于在IP配置GUI中设置的PCIe BARs选项。
看上表可以看出不同的端口选择,应对不同的BAR设置(IP自动分配)。统一以32bit或者64bit为单位进行配置。
顺序:AXI4-Lite,DMA(内部的状态控制寄存器),DMA-Bypass;当某个端口没有选择的时候,后面一个会自动前移。
H2C Channel
前面的表格表示32位和64位BAR选择的PCIe到AXI4-Lite主控制器、DMA和PCIe到DMA Bypass接口。每个空间可以单独选择32位或64位的BAR。H2C通道的数量在Vivado®集成设计环境(IDE)中进行配置。H2C通道处理从主机到板卡的DMA传输。它负责基于最大读取请求大小(MRRS)和可用的内部资源(指的是最后一包?)来分割读取请求。DMA通道根据RNUM_RIDS(即outstanding H2C通道请求ID 参数)维护最大数量的未完成请求(支持的飞行请求)。如果读取请求被拆分成多个,每个拆分将消耗一个额外的读取请求条目。请求在DMA通道将读取传递给PCIe RQ块并在按顺序接收到用户接口的写入完成确认(Completion)后仍然未完成。传输完成后,DMA通道发出回写或中断来通知主机。
注:大概描述了一个读请求,飞行命令数量的限制,读请求的拆分原则:MRRS和剩余字节数;读完成是通过回写或者中断完成。
H2C通道还在其读取和写入接口上拆分事务。对于发送到主机的读取接口,事务被拆分以满足配置的最大读取请求大小,并基于可用的数据FIFO空间。数据FIFO空间在读取请求时分配,以确保为读取完成留出空间。PCIe RC块将完成数据返回到分配的数据缓冲区位置。为了最小化延迟,一旦收到任何完成数据,H2C通道就开始向用户接口发出写入请求。它还将写入请求拆分为最大有效载荷大小。在AXI4-Stream用户接口上,此拆分是透明的。如何理解“透明”?
当启用多个通道时,AXI4主控制接口上的事务在所有选定的通道之间交错进行。简单的轮询协议用于为所有通道提供服务。事务的粒度取决于主机的最大有效载荷大小(MPS)、页面大小和其他主机设置。这样的交错和轮询协议确保在多通道环境下公平地为每个通道提供服务,并优化数据传输的效率。
注:当时用多通道时,会进行仲裁。
C2H通道处理从板卡到主机的DMA传输。在Vivado® IDE中控制实例化的C2H通道数量。同样,未完成传输的数量是通过WNUM_RIDS(对应H2C中的RNUM_RIDS)配置的,该参数是C2H通道请求ID 数量。在AXI4-Stream配置中,DMA传输的细节在接收AXI4-Stream接口上的数据之前预先设置。通常通过接收DMA描述符来完成。准备好请求ID并启用通道后,通道的AXI4-Stream接口可以接收数据并执行传输到主机。在AXI4 MM接口配置中,请求ID是作为向AXI4 MM接口发出读请求时分配的。与H2C通道类似,给定请求ID在写入请求完成之前保持未完成状态。对于C2H通道,写入请求完成是指已经发出写入请求,并由PCIe IP指示。
当启用多个通道时,AXI4主控制接口上的事务在所有选定的通道之间交错进行。简单的轮询协议用于为所有通道提供服务。事务的粒度取决于主机的最大有效载荷大小(MPS)、页面大小和其他主机设置。这样的交错和轮询协议确保在多通道环境下公平地为每个通道提供服务,并优化数据传输的效率。
该模块实现了AXI4-Lite master控制总线协议。主机可以使用此接口向用户逻辑生成32位读取和32位写入请求。读取或写入请求通过PCIe到AXI4-Lite主控制器BAR接收。读取完成数据通过目标桥接器通过PCIe IP的CC总线返回给主机。
该模块实现了AXI4-Lite Slave总线协议。用户逻辑可以在此接口上主控制32位读取或写入,仅用于DMA内部寄存器。不能通过此接口访问PCIe集成块寄存器。此接口不会向主机生成请求。
注:只能访问DMA的状态和控制寄存器。PCIe 内部寄存器不能访问。
主机的请求到达PCIe到DMA Bypass的BAR将被发送到该模块。 Bypass主控制端口是一个AXI4 MM接口,支持读取和写入访问。通过该接口,主机可以直接访问用户逻辑,并执行读取和写入操作。
IRQ模块从用户逻辑接收可配置数量的中断线和每个DMA通道一个中断线。该模块负责通过PCIe生成中断。在IP配置期间可以指定对MSI-X、MSI和传统中断的支持。
注意:主机可以在IP配置期间从支持的中断列表中启用一个或多个中断类型。即使启用了多个中断类型,IP在给定时间只生成一种中断类型。MSI-X中断优先于MSI中断,MSI中断优先于传统中断。当存在已经断开或待处理的中断时,主机软件不能切换(启用或禁用)中断类型。
当启用传统中断时,断言usr_irq_req的一个或多个位会导致DMA通过PCIe发出传统中断。多个位可以同时断言,但每个位必须在相应的usr_irq_ack位被断言之前保持断言。
在断言usr_irq_req位后,必须保持断言,直到相应的usr_irq_ack位和中断已由主机处理并清除。这确保了在主机的中断服务例程(ISR)查询中断源时,IP内的中断挂起寄存器保持断言状态。usr_irq_ack断言表示请求的中断已被发送到PCIe IP。必须在用户应用程序中实现机制,以知道何时已经服务了中断例程。这种检测可以根据您的应用程序和对中断引脚的使用以多种不同的方式完成。通常涉及在用户应用程序中实现一个由主机软件在服务中断时清除、读取或修改的寄存器(或寄存器数组)。
在断言usr_irq_req位之后,只有在相应的usr_irq_ack位被断言第二次后,才能重新断言它。这表示传统中断的去断言消息已经通过PCIe发送。在第二次usr_irq_ack发生后,xdma0_usr_irq_req线可以重新断言以生成另一个传统中断。
xdma0_usr_irq_req位和DMA中断可以通过配置寄存器映射到传统中断INTA、INTB、INTC和INTD。以下图显示了传统中断。
注意:此图仅显示xdma0_usr_irq_req和usr_irq_ack之间的握手。您的应用程序可能不会立即清除或服务中断,在这种情况下,您必须保持usr_irq_req在usr_irq_ack之后保持断言。下面的图显示了一种可能的情况,其中usr_irq_ack在相同周期对于两个请求[1:0]都被去断言,这可能在其他情况下并非如此。
当启用MSI或MSI-X时,断言usr_irq_req的一个或多个位会导致生成MSI或MSI-X中断。如果同时启用了MSI和MSI-X功能,则会生成MSI-X中断。
在断言usr_irq_req位后,必须保持断言,直到相应的usr_irq_ack位被断言,并且中断已由主机处理并清除。usr_irq_ack的断言表示请求的中断已被发送到PCIe块。这将确保在主机的中断服务例程(ISR)查询中断源时,IP内的中断挂起寄存器保持断言状态。您必须在用户应用程序中实现机制,以知道何时已经服务了中断例程。这种检测可以根据您的应用程序和对中断引脚的使用以多种不同的方式完成。通常涉及在用户应用程序中实现一个由主机软件在服务中断时清除、读取或修改的寄存器(或寄存器数组)。
配置寄存器可用于将usr_irq_req和DMA中断映射到MSI或MSI-X向量。对于MSI-X支持,还有向量表和PBA表。以下图显示了MSI中断。
注意:此图仅显示usr_irq_req和usr_irq_ack之间的握手。您的应用程序可能不会立即清除或服务中断,在这种情况下,您必须保持usr_irq_req在usr_irq_ack之后保持断言。
以下图示显示了MSI-X中断。
注意:该图示仅显示usr_irq_req和usr_irq_ack之间的握手过程。您的应用程序可能不会立即清除或处理中断,在这种情况下,您必须保持usr_irq_req处于断言状态,直到usr_irq_ack被断言。
配置模块是配置块的一部分,它包含PCIe®解决方案IP的配置信息和DMA控制寄存器,并存储与DMA/Bridge Subsystem for PCIe相关的PCIe IP配置信息。这些配置信息可以通过对配置模块内适当寄存器偏移进行寄存器读取来访问。
在最基本的层面上,PCIe® DMA引擎通常在主机内存和FPGA内存之间传输数据,这些数据通常位于一个插卡上。当数据从主机内存传输到FPGA内存时,称为主机到板卡(H2C)传输或系统到板卡(S2C)传输。相反,当数据从FPGA内存传输到主机内存时,称为板卡到主机(C2H)或板卡到系统(C2S)传输。
这些术语有助于区分数据流动的方向(而不是使用读写这样的术语,这可能会很快令人困惑)。PCIe DMA引擎简单地在PCIe地址位置之间传输数据。
在典型的操作中,主机上的应用程序必须在FPGA和主机内存之间传输数据。为了完成这种传输,主机在系统内存中设置缓冲区空间,并创建描述符,DMA引擎使用这些描述符来移动数据。
注:DMA是通过描述符的方式进行数据搬运,描述符放置在主机内存,DMA需要先去主机内存取到这些数据。
描述符的内容取决于许多因素,包括为DMA引擎选择的用户接口。如果选择了AXI4-Stream接口,C2H传输不使用源地址字段,而H2C传输不使用目标地址。这是因为AXI4-Stream接口是一种不使用地址的FIFO类型接口。
如果选择了AXI Memory Mapped接口,则C2H传输的源地址是AXI地址,目标地址是PCIe地址。对于H2C传输,源地址是PCIe地址,目标地址是AXI地址。
以下流程图展示了在选择AXI Memory Mapped接口的数据接口进行IP配置时,H2C和C2H传输的典型传输过程。
下图显示了H2C和C2H传输的初始设置。
具体的地址分配在Register space章节上有讲,还是比较清晰的。
0x0090和0x1090分别设置了H2C 和C2H 通道何种异常触发中断,两个寄存器是相似的,只是由于方向不一致,地址不一样而已。
以H2C为例
另外这是一个enable寄存器,并不是mask,即1表示相应的事件发生,会触发中断。
0x2010是H2C和C2H哪个DMA通道
下图显示了解释H2C数据传输的基本流程图。流程图颜色编码如下:绿色为应用程序,橙色为驱动程序,蓝色为硬件。
下图显示了解释C2H的数据传输的基本流程图。流程图颜色编码如下:绿色为应用程序,橙色为驱动程序,蓝色为硬件。
PCI Express®中的DMA/Bridge子系统使用描述符的链表来指定DMA传输的源地址、目的地址和长度。驱动程序创建并将描述符列表存储在主机内存中。DMA通道由驱动程序初始化,初始化时会设置一些控制寄存器,以开始获取描述符列表并执行DMA操作。
当Host操作这些寄存器时,可以认为是通知XDMA开始DMA的搬运,称为“Doorbell”。
描述符描述了XDMA应执行的内存传输。每个通道都有自己的描述符列表。每个通道的描述符列表的起始地址在硬件寄存器中由驱动程序初始化。通道启用后,描述符通道开始从初始地址获取描述符。然后,它从最后一个获取的描述符的Nxt_adr[63:0]字段继续获取。描述符必须对齐到32字节边界。
没有使用pidx和cidx,这样效率会稍低一些,毕竟要取到描述符的最后一个 且解析出“Nxt_adr[63:0]字段”,才知道是否取完毕。
初始相邻描述符块的大小由Dsc_Adj寄存器指定(这是使用SG描述符方式,SG:当主机无法获取连续内存位置时,会申请连续的小的内存,通过链表的方式 拼接成一个大数据量的搬运)。在初始获取后,描述符通道使用最后一个获取的描述符的Nxt_adj字段来确定下一个描述符地址处的描述符数。相邻描述符块不能跨越4K地址边界。描述符通道在单个请求中获取尽可能多的描述符,受MRRS、相邻描述符的数量和通道描述符缓冲区中的可用空间限制。
注意:由于大多数主机系统中的MRRS为512字节或1024字节,因此单个请求上不允许有超过32个相邻描述符。但是,如果需要,设计允许在单个相邻描述符块中有最多64个描述符。
描述符列表中的每个描述符必须准确描述其后跟的描述符或描述符块。在相邻描述符块中,Nxt_adj值从第一个描述符递减到倒数第二个描述符,其值为零。同样,块中的每个描述符指向块中的下一个描述符,除了最后一个描述符,它可能指向一个新块,或者可能终止列表。
描述符列表的终止由Stop控制位指示。如果观察到带有Stop控制位的描述符,则不会为该列表发出进一步的描述符获取请求。Stop控制位只能设置在块的最后一个描述符上。
当使用AXI4内存映射接口时,将不会将DMA地址转换为卡上的地址。如果主机不知道卡的地址映射,则必须在用户逻辑中组装描述符,并通过描述符旁路接口将其提交给DMA。
网络包处理常采用这种方式。封闭小系统中,数据是确定的,因此会开机时就去申请固定大小的内存空间,因此SG和desc bypass模式都不会使用。
Table 5: Descriptor Format
Offset | Fields | |||
0x0 | Magic[15:0] | Rsv[1:0] | Nxt_adj[5:0] | Control[7:0] |
0x04 | 4’d0,Len[27:0] | |||
0x08 | Src_adr[31:0] | |||
0x0C | Src_adr[63:32] | |||
0x10 | Dst_adr[31:0] | |||
0x14 | Dst_adr[63:32] | |||
0x18 | Nxt_adr[31:0] | |||
0x1C | Nxt_adr[63:32] |
Table 6: Descriptor Fields
DMA具有Bit_width * 512深度的FIFO,用于容纳描述符引擎中的所有描述符。这个描述符FIFO是所有选定通道共享的。
通过Vivado® IDE参数,可以在每个通道上绕过描述符获取引擎(居然分通道实现)。启用了描述符旁路的通道接受来自其各自的c2h_dsc_byp或h2c_dsc_byp总线的描述符。在通道接受描述符之前,必须设置控制寄存器的Run位。在绕过描述符时,NextDescriptorAddress、NextAdjacentCount和Magic描述符字段将不会被使用。控制寄存器中的ie_descriptor_stopped位不会阻止用户逻辑写入额外的描述符。在通道缓冲区已满时,所有写入通道的描述符都会被处理,除了写入新描述符的情况。
每个引擎都能将已完成的描述符计数写回主机内存。这使得驱动程序可以轮询主机内存,以确定DMA何时完成,而不必等待中断。 对于给定的DMA引擎,当DMA完成一个描述符的传输,并且ie_descriptor_completed和Pollmode_wb_enable被设置时,已完成的描述符计数写回将发生。报告的已完成的描述符计数是自DMA启动以来已完成的描述符的总数(而不仅仅是已设置Completed标志的描述符)。写回地址由Pollmode_hi_wb_addr和Pollmode_lo_wb_addr寄存器定义。
对于从主机到板卡的传输,数据从主机的源地址读取,但描述符中的目标地址未使用。数据包可以跨越多个描述符。数据包的终止由EOP控制位指示。带有EOP位的描述符会在数据的最后一个beat上在AXI4-Stream用户接口上断言tlast。
传递到AXI4-Stream接口的数据将根据每个描述符进行打包。除非描述符的数据传输长度不是数据通路宽度的倍数,否则tkeep都是全部为1。DMA不会跨多个描述符进行数据打包。
是否指AXI-Stream模式不支持SG?
对于从板卡到主机的传输,数据从AXI4-Stream接口接收并写入目标地址。数据包可以跨越多个描述符(H2C不支持,C2H支持?)。C2H通道在启用且具有有效描述符时接受数据。当数据被接收时,它按顺序填充描述符。当一个描述符完全填满或由于接口上的数据包结束而关闭时,C2H通道使用预定义的WB Magic值16'h52b4(表10:C2H Stream写回字段)并相应更新EOP和Length将信息写回主机的写回地址。对于C2H AXI4-Stream接口上的有效数据周期,与给定数据包相关的所有数据必须是连续的。
注意:C2H通道写回信息与轮询模式更新不同。C2H通道写回信息向驱动程序提供特定描述符当前长度状态。这与轮询模式中描述的Pollmode_*不同。
除了数据包的最后一个数据传输外,所有其他传输的tkeep位都必须为1。对于数据包的最后一个传输,当tlast被断言时,可以指定不全部为1的tkeep,以指定不是完整数据通路宽度的数据周期。断言的tkeep位需要按照LSB进行打包,表示连续数据。当tlast被断言且全部为零时,tkeep不是DMA正确工作的有效组合。
最后一包必须有有效数据。
C2H Stream描述符的长度(目标缓冲区的大小)必须始终是64字节的倍数。
Magic data应该有生产和消费的过程,FPGA去写,Host读完清除,不过应该是驱动完成,可能上层不感知。
备注:1。对于固定地址模式,必须在控制寄存器(0x4,C2H Channel Control/H2C Channel Control (0x04))中设置位[25]。
固定地址 对应的是非固定地址,还提供递增方式,固定地址可能类似FIFO的方式访问。
备注:
1。每个C2H描述符的大小必须为64字节的倍数。但是,在实际的C2H传输中,字节总数没有任何限制.
奇偶校验
奇偶校验检查有两种方式。在Vivado® IDE的PCIe DMA选项卡中进行核心定制时,设置Parity Checking选项:
当启用Check Parity时,PCIe DMA/Subsystem会检查从PCIe读取的数据的奇偶校验,并为写入PCIe的数据生成奇偶校验(PCIe TLP包有CRC校验,不是同一个。CPU做校验,是否影响CPU效率)。
当启用Propagate Parity时,PCIe DMA/Subsystem会将奇偶校验传播到用户的AXI接口。需要负责在AXI接口中检查和生成奇偶校验。
奇偶校验在每个时钟周期时都是有效的,当数据有效信号被断言时,奇偶校验位仅对有效数据字节有效。每个字节都计算奇偶校验;总奇偶校验位数为DATA_WIDTH/8。
默认情况下,不启用奇偶校验检查。
待补充
注意:本文档仅涵盖DMA模式的寄存器空间。有关AXI桥接模式,请参阅AXI Bridge for PCI Express Gen3 Subsystem Product Guide (PG194)。
DMA/Bridge Subsystem for PCI Express®内部的配置和状态寄存器以及用户逻辑中的寄存器可以通过将读或写请求映射到基址寄存器(BAR)来从主机访问。根据BAR命中,请求会被路由到相应的位置。有关PCIe的BAR分配,请参阅Target Bridge。
命中PCIe到AXI Bridge Master控制器的事务被路由到AXI4-MM用户接口。
这个一般用作FPGA内部寄存器(32bit或者更高位宽,支持Burst操作)的操作。
命中PCIe到DMA空间的事务被路由到DMA子系统,用于PCIe DMA/Bridge Subsystem for PCI Express®内部配置寄存器总线。该总线支持32位地址空间和32位读写请求。
DMA/Bridge Subsystem for PCIe寄存器可从主机或AXI Slave接口访问。这些寄存器应用于编程DMA和检查状态。
Target对应基地址。
Table 39: Configuration Register Attribute Definitions
Attribute | Description |
RV | Reserved |
RW | Read/Write |
RC | Clear on Read. |
W1C | Write 1 to Clear |
W1S | Write 1 to Set |
RO | Read Only |
WO | Write Only |
有些寄存器可以以不同的属性进行访问。在这种情况下,为每个属性提供了不同的寄存器偏移量。未定义的位和地址空间保留。在某些寄存器中,矢量中的各个位可能代表特定的DMA引擎。在这种情况下,矢量的最低有效位对应于H2C通道(如果有的话)。通道ID 0位于LSB位置。代表C2H通道的位紧密地排列在其上方。
在本节中描述了H2C 通道寄存器空间。
寄存器列表。
H2C Channel Identifier (0x00)
Table 41: H2C Channel Identifier (0x00)
Bit Index | Default Value | Access Type | Description |
31:20 | 12’h1fc | RO | Subsystem identifier |
19:16 | 4’h0 | RO | H2C Channel Target |
15 | 1’b0 | RO | Stream |
14:12 | 0 | RO | Reserved |
11:08 | Varies | RO | Channel ID Target [3:0] |
7:00 | 8'h04 | RO | Version |
H2C Channel Control (0x04)
Table 42: H2C Channel Control (0x04)
Bit Index | Default | Access Type | Description |
31:28 | Reserved | ||
27 | 1’b0 | RW | When set write back information for C2H in AXI-Stream mode is disabled, default write back is enabled. |
26 | 0x0 | RW | pollmode_wb_enable |
25 | 1’b0 | RW | non_inc_mode |
24 | Reserved | ||
23:19 | 5’h0 | RW | ie_desc_error |
18:14 | 5’h0 | RW | ie_write_error |
13:09 | 5’h0 | RW | ie_read_error Set to all 1s (0x1F) to enable logging of Status.Read_error and to stop the engine if the error is detected. |
8:07 | Reserved | ||
6 | 1’b0 | RW | ie_idle_stopped |
5 | 1’b0 | RW | ie_invalid_length |
4 | 1’b0 | RW | ie_magic_stopped |
3 | 1’b0 | RW | ie_align_mismatch |
2 | 1’b0 | RW | ie_descriptor_completed |
1 | 1’b0 | RW | ie_descriptor_stopped |
0 | 1’b0 | RW | Run |
备注:
H2C Channel Control (0x08)
H2C Channel Control (0x0C)
!!!0x4,0x8,0xC三个寄存器完成相同的功能,好奇怪,为啥要这样实现?只是读写方式不一样。
H2C Channel Status (0x40)
Table 45: H2C Channel Status (0x40)
Bit Index | Default | Access Type | Description |
31:24 | Reserved | ||
23:19 | 5’h0 | RW1C | descr_error[4:0] |
18:14 | 5’h0 | RW1C | write_error[4:0] |
13:09 | 5’h0 | RW1C | read_error[4:0] |
8:07 | Reserved | ||
6 | 1’b0 | RW1C | idle_stopped |
5 | 1’b0 | RW1C | invalid_length |
4 | 1’b0 | RW1C | magic_stopped |
3 | 1’b0 | RW1C | align_mismatch |
2 | 1’b0 | RW1C | descriptor_completed |
1 | 1’b0 | RW1C | descriptor_stopped |
0 | 1’b0 | RO | Busy |
H2C Channel Status (0x44)
Table 46: H2C Channel Status (0x44)
Bit Index | Default | Access Type | Description |
23:01 | RC | Status Clear on Read. Bit description is the same as in H2C Channel Status (0x40). |
H2C Channel Completed Descriptor Count (0x48)
Table 47: H2C Channel Completed Descriptor Count (0x48)
Bit Index | Default | Access Type | Description |
31:00 | 32’h0 | RO | compl_descriptor_count |
每次“run”还会清除!完成计数,类似Cidx,这个寄存器居然没有多个地址。
H2C Channel Alignments (0x4C)
Table 48: H2C Channel Alignments (0x4C)
Bit Index | Default | Access Type | Description |
23:16 | Configuration | RO | addr_alignment |
15:08 | Configuration | RO | len_granularity |
7:00 | Configuration | RO | address_bits |
地址对齐和DMA传输的最小单位,AXIS传输需要以数据位宽的整数倍,axi-mm没有要求。Address_bit指的是32还是64;
H2C Poll Mode Low Write Back Address (0x88)
Table 49: H2C Poll Mode Low Write Back Address (0x88)
Bit Index | Default | Access Type | Description |
31:00 | 0x0 | RW | Pollmode_lo_wb_addr[31:0] |
H2C Poll Mode High Write Back Address (0x8C)
Table 50: H2C Poll Mode High Write Back Address (0x8C)
Bit Index | Default | Access Type | Description |
31:00 | 0x0 | RW | Pollmode_hi_wb_addr[63:32] |
要向主机回写什么数据呢
H2C Channel Interrupt Enable Mask (0x90)
Table 51: H2C Channel Interrupt Enable Mask (0x90)
Bit Index | Default | Access Type | Description |
23:19 | 5’h0 | RW | im_desc_error[4:0] |
18:14 | 5’h0 | RW | im_write_error[4:0] |
13:09 | 5’h0 | RW | im_read_error[4:0] |
8:07 | Reserved | ||
6 | 1’b0 | RW | im_idle_stopped |
5 | 1’b0 | RW | im_invalid_length |
4 | 1’b0 | RW | im_magic_stopped |
3 | 1’b0 | RW | im_align_mismatch |
2 | 1’b0 | RW | im_descriptor_completd |
1 | 1’b0 | RW | im_descriptor_stopped |
H2C Channel Interrupt Enable Mask (0x94)
Table 52: H2C Channel Interrupt Enable Mask (0x94)
Bit Index | Default | Access Type | Description |
W1S | Interrupt Enable Mask |
H2C Channel Interrupt Enable Mask (0x98)
Table 53: H2C Channel Interrupt Enable Mask (0x98)
Bit Index | Default | Access Type | Description |
W1C | Interrupt Enable Mask |
中断提供三个寄存器,有三种使用方式?这是设置寄存器,需要回读的啊,为啥使用W1C,W1S属性呢
H2C Channel Performance Monitor Control (0xC0)
Table 54: H2C Channel Performance Monitor Control (0xC0)
Bit Index | Default | Access Type | Description |
2 | 1’b0 | RW | Run |
1 | 1’b0 | WO | Clear |
0 | 1’b0 | RW | Auto |
H2C Channel Performance Cycle Count (0xC4)
Table 55: H2C Channel Performance Cycle Count (0xC4)
Bit Index | Default | Access Type | Description |
31:00 | 32’h0 | RO | pmon_cyc_count[31:0] |
H2C Channel Performance Cycle Count (0xC8)
Table 56: H2C Channel Performance Cycle Count (0xC8)
Bit Index | Default | Access Type | Description |
16 | 1’b0 | RO | pmon_cyc_count_maxed |
9:00 | 10’h0 | RO | pmon_cyc_count [41:32] |
H2C Channel Performance Data Count (0xCC)
Table 57: H2C Channel Performance Data Count (0xCC)
Bit Index | Default | Access Type | Description |
31:00:00 | 32’h0 | RO | pmon_dat_count[31:0] |
H2C Channel Performance Data Count (0xD0)
Table 58: H2C Channel Performance Data Count (0xD0)
Bit Index | Default | Access Type | Description |
16 | 1’b0 | RO | pmon_dat_count_maxed |
15:10 | Reserved | ||
9:00 | 10’h0 | RO | pmon_dat_count [41:32] |
C2H通道寄存器空间在本节中描述。
Table 59: C2H Channel Register Space
Address (hex) | Register Name |
0x00 | C2H Channel Identifier (0x00) |
0x04 | C2H Channel Control (0x04) |
0x08 | C2H Channel Control (0x08) |
0x0C | C2H Channel Control (0x0C) |
0x40 | C2H Channel Status (0x40) |
0x44 | C2H Channel Status (0x44) |
0x48 | C2H Channel Completed Descriptor Count (0x48) |
0x4C | C2H Channel Alignments (0x4C) |
0x88 | C2H Poll Mode Low Write Back Address (0x88) |
0x8C | C2H Poll Mode High Write Back Address (0x8C) |
0x90 | C2H Channel Interrupt Enable Mask (0x90) |
0x94 | C2H Channel Interrupt Enable Mask (0x94) |
0x98 | C2H Channel Interrupt Enable Mask (0x98) |
0xC0 | C2H Channel Performance Monitor Control (0xC0) |
0xC4 | C2H Channel Performance Cycle Count (0xC4) |
0xC8 | C2H Channel Performance Cycle Count (0xC8) |
0xCC | C2H Channel Performance Data Count (0xCC) |
0xD0 | C2H Channel Performance Data Count (0xD0) |
与H2C没有差异。
IRQ块寄存器在本节中进行描述。
Table 78: IRQ Block Register Space
Address (hex) | Register Name |
0x00 | IRQ Block Identifier (0x00) |
0x04 | IRQ Block User Interrupt Enable Mask (0x04) |
0x08 | IRQ Block User Interrupt Enable Mask (0x08) |
0x0C | IRQ Block User Interrupt Enable Mask (0x0C) |
0x10 | IRQ Block Channel Interrupt Enable Mask (0x10) |
0x14 | IRQ Block Channel Interrupt Enable Mask (0x14) |
0x18 | IRQ Block Channel Interrupt Enable Mask (0x18) |
0x40 | IRQ Block User Interrupt Request (0x40) |
0x44 | IRQ Block Channel Interrupt Request (0x44) |
0x48 | IRQ Block User Interrupt Pending (0x48) |
0x4C | IRQ Block Channel Interrupt Pending (0x4C) |
0x80 | IRQ Block User Vector Number (0x80) |
0x84 | IRQ Block User Vector Number (0x84) |
0x88 | IRQ Block User Vector Number (0x88) |
0x8C | IRQ Block User Vector Number (0x8C) |
0xA0 | IRQ Block Channel Vector Number (0xA0) |
0xA4 | IRQ Block Channel Vector Number (0xA4) |
中断处理寄存器在AXI Bridge和AXI DMA之间共享。在AXI Bridge模式下,当选择了MSI-X功能时,来自BAR0的64 KB地址空间将保留用于MSI-X表。默认情况下,寄存器空间分配在BAR0中。通过使用CONFIG.bar_indicator {BAR0} Tcl命令,可以选择将寄存器空间分配在不同的BAR中,从BAR1到BAR5。此选项仅在选择了MSI-X功能时有效。其他中断选项没有分配的空间。(INTx使用消息模式,MSI使用capbility的模式,因此不需要额外的bar空间去做)
IRQ Block Identifier (0x00)
Table 79: IRQ Block Identifier (0x00)
Bit Index | Default | Access Type | Description |
31:20 | 12’h1fc | RO | Subsystem identifier |
19:16 | 4’h2 | RO | IRQ Identifier |
15:08 | 8’h0 | RO | Reserved |
7:00 | 8'h04 | RO | Version |
IRQ Block User Interrupt Enable Mask (0x04)
Table 80: IRQ Block User Interrupt Enable Mask (0x04)
Bit Index | Default | Access Type | Description |
[NUM_USR_INT-1:0] | 'h0 | RW | user_int_enmask |
IRQ Block User Interrupt Enable Mask (0x08)
Table 81: IRQ Block User Interrupt Enable Mask (0x08)
Bit Index | Default | Access Type | Description |
W1S | user_int_enmask |
IRQ Block User Interrupt Enable Mask (0x0C)
Table 82: IRQ Block User Interrupt Enable Mask (0x0C)
Bit Index | Default | Access Type | Description |
W1C | user_int_enmask |
IRQ Block Channel Interrupt Enable Mask (0x10)
Table 83: IRQ Block Channel Interrupt Enable Mask (0x10)
Bit Index | Default | Access Type | Description |
[NUM_CHNL-1:0] | ‘h0 | RW | channel_int_enmask |
这是DMA使用的中断,用来通知Host操作的完成或者错误
IRQ Block Channel Interrupt Enable Mask (0x14)
Bit Index | Default | Access Type | Description |
W1S | channel_int_enmask |
IRQ Block Channel Interrupt Enable Mask (0x18)
Table 85: IRQ Block Channel Interrupt Enable Mask (0x18)
Bit Index | Default | Access Type | Description |
W1C | channel_int_enmask |
The following figure shows the packing of H2C and C2H bits.
Figure 9: Packing H2C and C2H
IRQ Block User Interrupt Request (0x40)
Table 86: IRQ Block User Interrupt Request (0x40)
Bit Index | Default | Access Type | Description |
NUM_USR_INT-1:0] | ‘h0 | RO | user_int_req |
IRQ Block Channel Interrupt Request (0x44)
Table 87: IRQ Block Channel Interrupt Request (0x44)
Bit Index | Default | Access Type | Description |
[NUM_CHNL-1:0] | ‘h0 | RO | engine_int_req |
IRQ Block User Interrupt Pending (0x48)
Table 88: IRQ Block User Interrupt Pending (0x48)
Bit Index | Default | Access Type | Description |
[NUM_USR_INT-1:0] | ‘h0 | RO | user_int_pend |
IRQ Block Channel Interrupt Pending (0x4C)
Table 89: IRQ Block Channel Interrupt Pending (0x4C)
Bit Index | Default | Access Type | Description |
[NUM_CHNL-1:0] | ‘h0 | RO | engine_int_pend |
IRQ Block User Vector Number (0x80)
如果启用了MSI,则该寄存器指定MSI或MSI-X中断的向量号。在传统的中断中,每个字段的最低两位应该用于映射到INTA、INTB、INTC或INTD。
Table 90: IRQ Block User Vector Number (0x80)
Bit Index | Default | Access Type | Description |
28:24 | 5’h0 | RW | vector 3 |
20:16 | 5’h0 | RW | vector 2 |
12:08 | 5’h0 | RW | vector 1 |
4:00 | 5’h0 | RW | vector 0 |
IRQ Block User Vector Number (0x84)
如果启用了MSI,则该寄存器指定MSI或MSI-X中断的向量号。在传统的中断中,每个字段的最低两位应该用于映射到INTA、INTB、INTC或INTD。
Table 91: IRQ Block User Vector Number (0x84)
Bit Index | Default | Access Type | Description |
28:24 | 5’h0 | RW | vector 7 |
20:16 | 5’h0 | RW | vector 6 |
12:08 | 5’h0 | RW | vector 5 |
4:00 | 5’h0 | RW | vector 4 |
IRQ Block User Vector Number (0x88)
如果启用了MSI,则该寄存器指定MSI或MSI-X中断的向量号。在传统的中断中,每个字段的最低两位应该用于映射到INTA、INTB、INTC或INTD。
Table 92: IRQ Block User Vector Number (0x88)
Bit Index | Default | Access Type | Description |
28:24 | 5’h0 | RW | vector 11 |
20:16 | 5’h0 | RW | vector 10 |
12:08 | 5’h0 | RW | vector 9 |
4:00 | 5’h0 | RW | vector 8 |
IRQ Block User Vector Number (0x8C)
如果启用了MSI,则该寄存器指定MSI或MSI-X中断的向量号。在传统的中断中,每个字段的最低两位应该用于映射到INTA、INTB、INTC或INTD。Table 93: IRQ Block User Vector Number (0x8C)
Bit Index | Default | Access Type | Description |
28:24 | 5’h0 | RW | vector 15 |
20:16 | 5’h0 | RW | vector 14 |
12:08 | 5’h0 | RW | vector 13 |
4:00 | 5’h0 | RW | vector 12 |
IRQ Block Channel Vector Number (0xA0)
如果启用了MSI,则此寄存器指定MSI中断的向量号。对于传统中断,每个字段的最低2位应用于映射到INTA、INTB、INTC或INTD。
类似于C2H/H2C位打包的解释,请参见上图。第一个C2H向量位于最后一个H2C向量之后。例如,如果NUM_H2C_Channel = 1,则H2C0向量位于0xA0,位[4:0],而C2H通道0向量位于0xA0,位[12:8]。如果NUM_H2C_Channel = 4,则H2C3向量位于0xA0 28:24,而C2H通道0向量位于0xA4,位[4:0]。
Table 94: IRQ Block Channel Vector Number (0xA0)
Bit Index | Default | Access Type | Description |
28:24 | 5’h0 | RW | vector3 |
20:16 | 5’h0 | RW | vector2 |
12:08 | 5’h0 | RW | vector1 |
4:00 | 5’h0 | RW | vector0 |
IRQ Block Channel Vector Number (0xA4)
如果启用了MSI,此寄存器指定MSI中断的向量号。对于传统中断,每个字段的最低2位应该用于映射到INTA、INTB、INTC或INTD。
类似于其他C2H/H2C位打包的澄清,请参见上图。第一个C2H向量位于最后一个H2C向量之后。例如,如果NUM_H2C_Channel = 1,则H2C0向量位于0xA0,位[4:0],而C2H通道0向量位于0xA0,位[12:8]。如果NUM_H2C_Channel = 4,则H2C3向量位于0xA0 28:24,而C2H通道0向量位于0xA4,位[4:0]。
Table 95: IRQ Block Channel Vector Number (0xA4)
Bit Index | Default | Access Type | Description |
28:24 | 5’h0 | RW | vector7 |
20:16 | 5’h0 | RW | vector6 |
12:08 | 5’h0 | RW | vector5 |
4:00 | 5’h0 | RW | vector4 |
下表描述了MSI-X向量表和PBA(Pending Bit Array)。MSI-X表的偏移从0x8000开始。下表显示了两个MSI-X向量条目(MSI-X表共有32个向量条目)。PBA地址偏移从0x8FE0开始。地址偏移是固定的值。
注意:在写入MSI-X表之前,应该设置配置控制寄存器中的MSI-X使能位。如果没有设置,MSI-X表将无法按预期工作。
Table 128: MSI-X Vector Table and PBA (0x00–0xFE0)
Byte Offset | Default | Access Type | Description |
0x00 | 32’h0 | RW | MSIX_Vector0_Address[31:0] |
0x04 | 32’h0 | RW | MSIX_Vector0_Address[63:32] |
0x08 | 32’h0 | RW | MSIX_Vector0_Data[31:0] |
0x0C | 32'hFFFFFFFF | RW | MSIX_Vector0_Control[31:0] |
0x1F0 | 32’h0 | RW | MSIX_Vector31_Address[31:0] |
0x1F4 | 32’h0 | RW | MSIX_Vector31_Address[63:32] |
0x1F8 | 32’h0 | RW | MSIX_Vector31_Data[31:0] |
0x1FC | 32'hFFFFFFFF | RW | MSIX_Vector31_Control[31:0] |
0xFE0 | 32’h0 | RW | Pending_Bit_Array[31:0] |
使用的是直接映射。只用了32个vector。比MSI向量多了么?
这篇够长的了,下面一篇是XDMA的应用学习了
应该还有一篇是自己的理解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。