当前位置:   article > 正文

XDMA的学习笔记1

xdma

主要为PG195的翻译,以及自己的理解

一、概述:

Features:

  1. 7A15T and 7A25T 不支持XDMA,这是由于资源问题,A25T只放得下一个lane的XDMA,且放了XDMA之后,资源极少。
  2. 支持4通道 H2C,4通道C2H
  3. 用户接口可配              1)、AXI4-MM    2)、AXIS
  4. AXI4 Master and AXI4-Lite bypass DMA

                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内存空间之间的桥接器。

  1. DMA数据传输器:作为DMA,该IP可配置为带有AXI(内存映射)接口或AXI流接口,以实现与RTL逻辑的直接连接。任何接口都可用于使用 提供的驱动程序 在PCIe地址空间和AXI地址空间之间进行高性能块数据传输。除基本DMA功能外,DMA还支持高达四个上游和下游通道,允许PCIe流量绕过DMA引擎(主机DMA绕过),以及可选的描述符绕过,用于管理来自FPGA内部的描述符,以满足对最高性能和最低延迟的应用需求。需要确认 desc bypass 的作用
  2. PCIe和AXI内存之间的桥接器:当配置为PCIe桥接器时,接收到的PCIe数据包被转换为AXI流量,接收到的AXI流量被转换为PCIe流量。桥接功能非常适合需要快速简便方式访问PCI Express子系统的AXI外设。桥接功能可用作终端或根端口。PCIe桥接功能仅支持UltraScale+™器件。对于仅限于桥接功能的选项和7系列非-XT设备,应使用AXI Memory Mapped to PCI Express(PCIe)Gen2。有关详细信息,请参阅AXI Memory Mapped to PCI Express(PCIe)Gen2 LogiCORE IP产品指南(PG055)。对于7系列XT和UltraScale设备,应使用AXI Bridge for PCI Express Gen3。有关详细信息,请参阅AXI Bridge for PCI Express Gen3 Subsystem产品指南(PG194)。

本文档仅涵盖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。

IP不支持的以下标准功能:

  1. 对于Virtex®-7 XT和7系列Gen2设备不支持串联配置解决方案(Tandem PROM、Tandem PCIe、Tandem with Field Updates、PR over PCIe)。
  2. UltraScale+设备的桥接模式尚不支持Tandem配置。
  3. SR-IOV
  4. ECRC
  5. 不是所有配置都支持示例设计
  6. 窄突发(在主接口上不支持)
  7. DMA地址到AXI4内存映射接口的BAR转换。

使用注意点:

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.

三、IP的规格

        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”

  1. 从红框对比,可以看出,不同的用户接口(AXI-MM和AXIS)逻辑资源的对比,AXIS相对AXI-MM资源更节省;
  2. 从绿色对比,可以看出X16和X1通道数对资源的影响,X1比X16使用资源更少
  3. 蓝色对比的PCIe的速率,GEN2与GEN1在x1(通道数为1)时变化不大,但在x16时还是有影响的,没有标注出来

使用A7时,规律和以上一致。

最低器件速率要求:

不同的PCIe速率对FPGA速度等级要求不一样

XDMA可配组件

        在内部,该子系统可以配置为实现高达八个独立的物理DMA引擎(最多四个H2C和四个C2H,不同器件支持的数量不一样)。这些DMA引擎可以映射到单独的AXI4-Stream接口或共享的AXI4-MM接口,供用户应用程序使用。在AXI4 MM接口上,DMA/Bridge子系统为PCI Express®生成请求和预期的完成,DMA会完成用户侧的数据搬运。而AXI4-Stream接口仅用于数据传输。

配置的通道类型决定了总线上的事务:

  1. 主机到板卡(H2C)通道生成对PCIe的读请求,并提供数据(AXIS)或生成对用户应用程序的写请求(AXI-MM)。
  2. 板卡到主机(C2H)通道在用户侧等待数据(AXIS),或在用户侧生成读请求(AXI-MM),然后生成包含接收到的数据的写请求发送到PCIe。

        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)、页面大小和其他主机设置。

Target Bridge

接器接收来自主机的请求。基于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 Channel

        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

        该模块实现了AXI4-Lite master控制总线协议。主机可以使用此接口向用户逻辑生成32位读取和32位写入请求。读取或写入请求通过PCIe到AXI4-Lite主控制器BAR接收。读取完成数据通过目标桥接器通过PCIe IP的CC总线返回给主机。

AXI4-Lite Slave

该模块实现了AXI4-Lite Slave总线协议。用户逻辑可以在此接口上主控制32位读取或写入,仅用于DMA内部寄存器。不能通过此接口访问PCIe集成块寄存器。此接口不会向主机生成请求。

        注:只能访问DMA的状态和控制寄存器。PCIe 内部寄存器不能访问。

Host to Card Bypass Master

        主机的请求到达PCIe到DMA Bypass的BAR将被发送到该模块。 Bypass主控制端口是一个AXI4 MM接口,支持读取和写入访问。通过该接口,主机可以直接访问用户逻辑,并执行读取和写入操作。

IRQ Module

        IRQ模块从用户逻辑接收可配置数量的中断线和每个DMA通道一个中断线。该模块负责通过PCIe生成中断。在IP配置期间可以指定对MSI-X、MSI和传统中断的支持。

        注意:主机可以在IP配置期间从支持的中断列表中启用一个或多个中断类型。即使启用了多个中断类型,IP在给定时间只生成一种中断类型。MSI-X中断优先于MSI中断,MSI中断优先于传统中断。当存在已经断开或待处理的中断时,主机软件不能切换(启用或禁用)中断类型。

Legacy Interrupts

        当启用传统中断时,断言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 and MSI-X Interrupts

        当启用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被断言。

Config Block

        配置模块是配置块的一部分,它包含PCIe®解决方案IP的配置信息和DMA控制寄存器,并存储与DMA/Bridge Subsystem for PCIe相关的PCIe IP配置信息。这些配置信息可以通过对配置模块内适当寄存器偏移进行寄存器读取来访问。

DMA的操作

Quick Start

        在最基本的层面上,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的传输

下图显示了H2C和C2H传输的初始设置。

         

        具体的地址分配在Register space章节上有讲,还是比较清晰的。

        0x0090和0x1090分别设置了H2C 和C2H 通道何种异常触发中断,两个寄存器是相似的,只是由于方向不一致,地址不一样而已。

以H2C为例

另外这是一个enable寄存器,并不是mask,即1表示相应的事件发生,会触发中断。

0x2010是H2C和C2H哪个DMA通道

 

H2C AXI-MM传输

下图显示了解释H2C数据传输的基本流程图。流程图颜色编码如下:绿色为应用程序,橙色为驱动程序,蓝色为硬件。

C2H AXI-MM传输

下图显示了解释C2H的数据传输的基本流程图。流程图颜色编码如下:绿色为应用程序,橙色为驱动程序,蓝色为硬件。

Description

        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是所有选定通道共享的。

  1. 对于具有2个H2C和2个C2H通道的Gen3x8设计,AXI位宽为256位。FIFO深度为256位 * 512 = 32 B * 512 = 16 KB(512个描述符)。这个FIFO被4个DMA引擎共享。(描述符在Host中位置是分通道存储的,FPGA取描述符时,是4个通道分别去取,但描述符的存储位置是共享的。
Description Bypass

        通过Vivado® IDE参数,可以在每个通道上绕过描述符获取引擎(居然分通道实现)。启用了描述符旁路的通道接受来自其各自的c2h_dsc_byp或h2c_dsc_byp总线的描述符。在通道接受描述符之前,必须设置控制寄存器的Run位。在绕过描述符时,NextDescriptorAddress、NextAdjacentCount和Magic描述符字段将不会被使用。控制寄存器中的ie_descriptor_stopped位不会阻止用户逻辑写入额外的描述符。在通道缓冲区已满时,所有写入通道的描述符都会被处理,除了写入新描述符的情况。

Poll Mode

        每个引擎都能将已完成的描述符计数写回主机内存。这使得驱动程序可以轮询主机内存,以确定DMA何时完成,而不必等待中断。 对于给定的DMA引擎,当DMA完成一个描述符的传输,并且ie_descriptor_completed和Pollmode_wb_enable被设置时,已完成的描述符计数写回将发生。报告的已完成的描述符计数是自DMA启动以来已完成的描述符的总数(而不仅仅是已设置Completed标志的描述符)。写回地址由Pollmode_hi_wb_addr和Pollmode_lo_wb_addr寄存器定义。

 

DMA H2C Stream

        对于从主机到板卡的传输,数据从主机的源地址读取,但描述符中的目标地址未使用。数据包可以跨越多个描述符。数据包的终止由EOP控制位指示。带有EOP位的描述符会在数据的最后一个beat上在AXI4-Stream用户接口上断言tlast。

        传递到AXI4-Stream接口的数据将根据每个描述符进行打包。除非描述符的数据传输长度不是数据通路宽度的倍数,否则tkeep都是全部为1。DMA不会跨多个描述符进行数据打包。

        是否指AXI-Stream模式不支持SG?

DMA C2H Stream

        对于从板卡到主机的传输,数据从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读完清除,不过应该是驱动完成,可能上层不感知。

Address Alignment

 

        备注: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。

  1. 在AXI4-Stream(AXI_ST)模式下,奇偶校验信息通过_tuser端口发送和接收。
  2. 在AXI4 Memory Mapped(AXI-MM)模式下,奇偶校验信息通过_ruser和*_wuser端口发送和接收。

        默认情况下,不启用奇偶校验检查。

端口描述

        待补充

寄存器空间

        注意:本文档仅涵盖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桥接主控制器地址映射

        命中PCIe到AXI Bridge Master控制器的事务被路由到AXI4-MM用户接口。

        这个一般用作FPGA内部寄存器(32bit或者更高位宽,支持Burst操作)的操作

PCIe到DMA地址映射

        命中PCIe到DMA空间的事务被路由到DMA子系统,用于PCIe DMA/Bridge Subsystem for PCI Express®内部配置寄存器总线。该总线支持32位地址空间和32位读写请求。

        DMA/Bridge Subsystem for PCIe寄存器可从主机或AXI Slave接口访问。这些寄存器应用于编程DMA和检查状态。

PCIe to DMA Address Format

 

        Target对应基地址。

PCIe to DMA Configuration Registers

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 Channel Registers (0x0)

        在本节中描述了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
1: AXI4-Stream Interface
0: AXI4 Memory Mapped Interface

14:12

0

RO

Reserved

11:08

Varies

RO

Channel ID Target [3:0]

7:00

8'h04

RO

Version
8'h01: 2015.3 and 2015.4
8'h02: 2016.1
8'h03: 2016.2
8'h04: 2016.3
8'h05: 2016.4
8'h06: 2017.1 to current release

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
Poll mode writeback enable.
When this bit is set the DMA writes back the completed descriptor count when a descriptor with the Completed bit set, is completed.

25

1’b0

RW

non_inc_mode
Non-incrementing address mode. Applies to m_axi_araddr interface only.

24

Reserved

23:19

5’h0

RW

ie_desc_error
Set to all 1s (0x1F) to enable logging of Status.Desc_error and to stop the engine if the error is detected.

18:14

5’h0

RW

ie_write_error
Set to all 1s (0x1F) to enable logging of Status.Write_error and to stop the engine if the error is detected.

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
Set to 1 to enable logging of Status.Idle_stopped

5

1’b0

RW

ie_invalid_length
Set to 1 to enable logging of Status.Invalid_length

4

1’b0

RW

ie_magic_stopped
Set to 1 to enable logging of Status.Magic_stopped

3

1’b0

RW

ie_align_mismatch
Set to 1 to enable logging of Status.Align_mismatch

2

1’b0

RW

ie_descriptor_completed
Set to 1 to enable logging of Status.Descriptor_completed

1

1’b0

RW

ie_descriptor_stopped
Set to 1 to enable logging of Status.Descriptor_stopped

0

1’b0

RW

Run
Set to 1 to start the SGDMA engine. Reset to 0 to stop
transfer; if the engine is busy it completes the current
descript

备注:

  1. ie_*寄存器位已启用中断。当设置了这些位元并满足相应的条件时,状态将被记录在H2C通道状态(0x40)中。当设置适当的中断掩码时(根据H2C通道中断启用掩码(0x90))时,将产生中断。

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]
Reset (0) on setting the Control register Run bit.
4: Unexpected completion
3: Header EP
2: Parity error
1: Completer abort
0: Unsupported request

18:14

5’h0

RW1C

write_error[4:0]
Reset (0) on setting the Control register Run bit.
Bit position:
4-2: Reserved
1: Slave error
0: Decode error

13:09

5’h0

RW1C

read_error[4:0]
Reset (0) on setting the Control register Run bit.
Bit position
4: Unexpected completion
3: Header EP
2: Parity error
1: Completer abort
0: Unsupported request

8:07

Reserved

6

1’b0

RW1C

idle_stopped
Reset (0) on setting the Control register Run bit. Set when
the engine is idle after resetting the Control register Run bit
if the Control register ie_idle_stopped bit is set.

5

1’b0

RW1C

invalid_length
Reset on setting the Control register Run bit. Set when the
descriptor length is not a multiple of the data width of an
AXI4-Stream channel and the Control register
ie_invalid_length bit is set.

4

1’b0

RW1C

magic_stopped
Reset on setting the Control register Run bit. Set when the
engine encounters a descriptor with invalid magic and
stopped if the Control register ie_magic_stopped bit is set.

3

1’b0

RW1C

align_mismatch
Source and destination address on descriptor are not
properly aligned to each other.

2

1’b0

RW1C

descriptor_completed
Reset on setting the Control register Run bit. Set after the
engine has completed a descriptor with the COMPLETE bit
set if the Control register ie_descriptor_stopped bit is set.

1

1’b0

RW1C

descriptor_stopped
Reset on setting Control register Run bit. Set after the
engine completed a descriptor with the STOP bit set if the
Control register ie_descriptor_stopped bit is set.

0

1’b0

RO

Busy
Set if the SGDMA engine is busy. Zero when it is idle.

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).
Bit 0 cannot be cleared.

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
The number of competed descriptors update by the engine
after completing each descriptor in the list.
Reset to 0 on rising edge of Control register Run bit (H2C
Channel Control (0x04)).

每次“run”还会清除!完成计数,类似Cidx,这个寄存器居然没有多个地址。

H2C Channel Alignments (0x4C)

Table 48: H2C Channel Alignments (0x4C)

Bit Index

Default

Access Type

Description

23:16

Configuration
based

RO

addr_alignment
The byte alignment that the source and destination
addresses must align to. This value is dependent on
configuration parameters.

15:08

Configuration
based

RO

len_granularity
The minimum granularity of DMA transfers in bytes.

7:00

Configuration
based

RO

address_bits
The number of address bits configured.

        地址对齐和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]
Lower 32 bits of the poll mode writeback address

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]
Upper 32 bits of the poll mode writeback address.

要向主机回写什么数据呢

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]
Set to 1 to interrupt when corresponding status register
read_error bit is logged.

18:14

5’h0

RW

im_write_error[4:0]
set to 1 to interrupt when corresponding status register
write_error bit is logged.

13:09

5’h0

RW

im_read_error[4:0]
set to 1 to interrupt when corresponding status register
read_error bit is logged.

8:07

Reserved

6

1’b0

RW

im_idle_stopped
Set to 1 to interrupt when the status register idle_stopped
bit is logged.

5

1’b0

RW

im_invalid_length
Set to 1 to interrupt when status register invalid_length bit is
logged.

4

1’b0

RW

im_magic_stopped
set to 1 to interrupt when status register magic_stopped bit
is logged.

3

1’b0

RW

im_align_mismatch
set to 1 to interrupt when status register align_mismatch bit
is logged.

2

1’b0

RW

im_descriptor_completd
set to 1 to interrupt when status register
descriptor_completed bit is logged.

1

1’b0

RW

im_descriptor_stopped
set to 1 to interrupt when status register descriptor_stopped
bit is logged.

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
Set to 1 to arm performance counters. Counter starts after
the Control register Run bit is set.
Set to 0 to halt performance counters.

1

1’b0

WO

Clear
Write 1 to clear performance counters.

0

1’b0

RW

Auto
Automatically stop performance counters when a descriptor
with the stop bit is completed. Automatically clear
performance counters when the Control register Run bit is
set. Writing 1 to the Performance Monitor Control register
Run bit is still required to start the counters.

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]
Increments once per clock while running. See the
Performance Monitor Control register (0xC0) bits Clear and
Auto for clearing.

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
Cycle count maximum was hit.

9:00

10’h0

RO

pmon_cyc_count [41:32]
Increments once per clock while running. See the
Performance Monitor Control register (0xC0) bits Clear and
Auto for clearing.

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]
Increments for each valid read data beat while running. See
the Performance Monitor Control register (0xC0) bits Clear
and Auto for clearing.

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
Data count maximum was hit

15:10

Reserved

9:00

10’h0

RO

pmon_dat_count [41:32]
Increments for each valid read data beat while running. See
the Performance Monitor Control register (0xC0) bits Clear
and Auto for clearing.

C2H Channel Registers (0x1)

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 Block Registers (0x2)

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
8'h01: 2015.3 and 2015.4
8'h02: 2016.1
8'h03: 2016.2
8'h04: 2016.3
8'h05: 2016.4
8'h06: 2017.1 to current release

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
User Interrupt Enable Mask
0: Prevents an interrupt from being generated when the
user interrupt source is asserted.
1: Generates an interrupt on the rising edge of the user
interrupt source. If the Enable Mask is set and the source
is already set, a user interrupt will be generated also.

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
Bit descriptions are the same as in IRQ Block User Interrupt
Enable Mask (0x04)

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
Bit descriptions are the same as in IRQ Block User Interrupt
Enable Mask (0x04)

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
Engine Interrupt Enable Mask. One bit per read or write
engine.
0: Prevents an interrupt from being generated when
interrupt source is asserted. The position of the H2C bits
always starts at bit 0. The position of the C2H bits is the
index above the last H2C index, and therefore depends on
the NUM_H2C_CHNL parameter.
1: Generates an interrupt on the rising edge of the interrupt
source. If the enmask bit is set and the source is already set,
an interrupt is also be generated.

这是DMA使用的中断,用来通知Host操作的完成或者错误

IRQ Block Channel Interrupt Enable Mask (0x14)

Bit Index

Default

Access Type

Description

W1S

channel_int_enmask
Bit descriptions are the same as in IRQ Block Channel
Interrupt Enable Mask (0x10).

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
Bit descriptions are the same as in IRQ Block Channel
Interrupt Enable Mask (0x10).

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
User Interrupt Request
This register reflects the interrupt source AND’d with the
enable mask register.

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
Engine Interrupt Request. One bit per read or write engine.
This register reflects the interrupt source AND with the
enable mask register. The position of the H2C bits always
starts at bit 0. The position of the C2H bits is the index above
the last H2C index, and therefore depends on the
NUM_H2C_CHNL parameter. The previous figure shows the
packing of H2C and C2H bits.

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
User Interrupt Pending.
This register indicates pending events. The pending
events are cleared by removing the event cause condition
at the source component.

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
Engine Interrupt Pending.
One bit per read or write engine. This register indicates
pending events. The pending events are cleared by
removing the event cause condition at the source
component. The position of the H2C bits always starts at bit
0. The position of the C2H bits is the index above the last
H2C index, and therefore depends on the NUM_H2C_CHNL
parameter.
The previous figure shows the packing of H2C and C2H bits.

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
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[3].

20:16

5’h0

RW

vector 2
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[2].

12:08

5’h0

RW

vector 1
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[1].

4:00

5’h0

RW

vector 0
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[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
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[7].

20:16

5’h0

RW

vector 6
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[6].

12:08

5’h0

RW

vector 5
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[5].

4:00

5’h0

RW

vector 4
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[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
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[11].

20:16

5’h0

RW

vector 10
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[10].

12:08

5’h0

RW

vector 9
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[9].

4:00

5’h0

RW

vector 8
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[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
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[15].

20:16

5’h0

RW

vector 14
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[14].

12:08

5’h0

RW

vector 13
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[13].

4:00

5’h0

RW

vector 12
The vector number that is used when an interrupt is
generated by the user IRQ usr_irq_req[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
The vector number that is used when an interrupt is
generated by channel 3.

20:16

5’h0

RW

vector2
The vector number that is used when an interrupt is
generated by channel 2.

12:08

5’h0

RW

vector1
The vector number that is used when an interrupt is
generated by channel 1.

4:00

5’h0

RW

vector0
The vector number that is used when an interrupt is
generated by channel 0.

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
The vector number that is used when an interrupt is
generated by channel 7.

20:16

5’h0

RW

vector6
The vector number that is used when an interrupt is
generated by channel 6.

12:08

5’h0

RW

vector5
The vector number that is used when an interrupt is
generated by channel 5.

4:00

5’h0

RW

vector4
The vector number that is used when an interrupt is
generated by channel 4.

Config Block Registers (0x3)

H2C SGDMA Registers (0x4)

C2H SGDMA Registers (0x5)

SGDMA Common Registers (0x6)

MSI-X Vector Table and PBA (0x8)

下表描述了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]
MSI-X vector0 message lower address.

0x04

32’h0

RW

MSIX_Vector0_Address[63:32]
MSI-X vector0 message upper address.

0x08

32’h0

RW

MSIX_Vector0_Data[31:0]
MSI-X vector0 message data.

0x0C

32'hFFFFFFFF

RW

MSIX_Vector0_Control[31:0]
MSI-X vector0 control.
Bit Position:
31:1: Reserved.
0: Mask. When set to 1, this MSI-X vector is not
used to generate a message. When reset to 0, this
MSI-X Vector is used to generate a message.

0x1F0

32’h0

RW

MSIX_Vector31_Address[31:0]
MSI-X vector31 message lower address.

0x1F4

32’h0

RW

MSIX_Vector31_Address[63:32]
MSI-X vector31 message upper address.

0x1F8

32’h0

RW

MSIX_Vector31_Data[31:0]
MSI-X vector31 message data.

0x1FC

32'hFFFFFFFF

RW

MSIX_Vector31_Control[31:0]
MSI-X vector31 control.
Bit Position:
31:1: Reserved.
0: Mask. When set to one, this MSI-X vector is not
used to generate a message. When reset to 0, this
MSI-X Vector is used to generate a message.

0xFE0

32’h0

RW

Pending_Bit_Array[31:0]
MSI-X Pending Bit Array. There is one bit per
vector. Bit 0 corresponds to vector0, etc.

使用的是直接映射。只用了32个vector。比MSI向量多了么?

 

 这篇够长的了,下面一篇是XDMA的应用学习了

应该还有一篇是自己的理解。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/701972
推荐阅读
  

闽ICP备14008679号