HI3531由DMA 发起PCIe 事务

Hi3531 PCIe 控制器内含DMA 控制器,DMA 控制器包含有两个DMA 通道(一个

DMA 读通道和一个DMA 写通道)。PCIe 控制器内包含的DMA 控制器用于大数据量

的存储器读写事务,以提高数据传输的速率。

DMA 控制器可以实现如下的存储器读写事务:

DMA 控制寄存器

软件可通过DMA 控制寄存器来配置DMA 传输,也可以通过DMA 控制寄存器启动和

停止DMA 传输。DMA 控制寄存器位于PCIe 控制器的配置寄存器空间内,DMA 控制

寄存器的定义请参考本章的PCIe 寄存器描述。

注意中提到的部分DMA 控制寄存器包含:

DMA_CH_CTRL 寄存器;

DMA_TRANS_SIZE 寄存器;

DMA_SAR_LOW 和DMA_SAR_HIGH 寄存器;

DMA_DAR_LOW 和DMA_DAR_HIGH 寄存器;

DMA_LINK_PT_LOW 和DMA_LINK_PT_HIGH 寄存器。

1. 软件设置DMA_CH_INDEX[ch_dir]=1,表明后续操作目标寄存器为读通道控制寄存

器。

2. 软件设置DMA_TRANS_SIZE=0x400,表明传输长度为1024Byte。

DMA 读/写通道使能

DMA 通道在系统复位后默认是没有使能的,要使用PCIe 的DMA 通道,需使能DMA

的读写通道。

通过设置DMA_RD_ENGINE_EN[dma_rd_engine_en]为1,使能DMA 读通道。

通过设置DMA_WR_ENGINE_EN[dma_wr_engine_en]为1,使能DMA 写通道。

DMA 源地址和目标地址

DMA 写:源地址(SAR)为本地内存空间,目标地址(DAR)为对端设备内存空间。

DMA 读:源地址(SAR)为对端设备内存空间,目标地址(DAR)为本地内存空间。

配置DMA 读或写通道的DMA_SAR_LOW 和DMA_SAR_HIGH 寄存器可以指定DMA

传输的源地址,配置DMA 读或写通道的DMA_DAR_LOW 和DMA_DAR_HIGH 寄存

器可以指定DMA 传输的目的地址。DMA 源地址和目的地址寄存器请参看PCIe DMA

控制寄存器定义。

DMA 传输过程中,源地址和目的地址寄存器随着传输过程而递增。可以通过读取源地

址和目的地址寄存器的值来确定DMA 当前传输所获取数据的源地址和当前所写数据

的目标地址。

DMA 源地址和DMA 目的地址都是双字节对齐的,因此最低两比特都必须设置为0。

在传输过程中此最低两比特也一直为0。

DMA 传输长度

DMA 读或写操作的传输长度由DMA 读或写通道的DMA_TRANS_SIZE 寄存器来指

定。该寄存器的值表示DMA 请求传输的数据的字节数。在DMA 传输过程,此寄存器

的值会随着传输过程递减,可以通过读取此寄存器确定当前还有多少字节未传输。传

输成功结束后此寄存器值应该为0。

DMA 传输长度取值范围为:最小为1 个字节,最大为4G 字节。

启动DMA 传输

在配置好DMA 读通道的控制寄存器之后,通过向

DMA_RD_DOORBELL[rd_doorbell_num]写入0 来启动DMA 读传输。

在配置好DMA 写通道的控制寄存器之后,通过向

DMA_WR_DOORBELL[wr_doorbell_num]写入0 来启动DMA 写传输。

停止DMA 传输

在DMA 传输过程中如果需要停止DMA 传输,可以通过如下寄存器控制来手动停止

DMA 读或者DMA 写传输:

通过向DMA_RD_DOORBELL[dma_rd_stop]写入1 来停止DMA 读传输。

通过向DMA_RD_DOORBELL[dma_wr_stop]写入1 来停止DMA 读传输。

如果DMA 传输过程中没有发生错误,DMA 传输将在所有的数据传输完成后自动停

止。

HI_MPI_SYS_SetReg(0x20800A6C,0x00000000);//bit31 0 WRITE  DMA_CH_INDEX

HI_MPI_SYS_SetReg(0x20800A78,0x00000010);//DMA_TRANS_SIZE 10

HI_MPI_SYS_SetReg(0x2080097c,0x00000001);//使能写操作

HI_MPI_SYS_SetReg(0x20800A7c,0xc0000000);// 源地址—低位

HI_MPI_SYS_SetReg(0x20800A80,0x00000000);// 源地址—高位

HI_MPI_SYS_SetReg(0x20800A84,0x0544f000);// 目标地址—低位 PC机申请的物理地址

HI_MPI_SYS_SetReg(0x20800A88,0x00000000);// 目标地址—高位

HI_MPI_SYS_SetReg(0x20800980,0x00000000);//启动写操作

HI3531由DMA 发起PCIe 事务

时间: 2024-07-31 12:26:49

HI3531由DMA 发起PCIe 事务的相关文章

多功能PCIE交换机之五: 基于NTB的DMA

如果说PCIE多功能桥中的NTB为跨节点的数据传输铺好路.架好桥的话,那么PCIE多功能桥中的DMA就是多个节点之间的高铁和航班.没有NTB打通数据通道,DMA也不可能跨越节点.但没有DMA的话,NTB还是可以依赖CPU来在多个节点之间搬运数据.因此DMA对NTB而言是如虎添翼.锦上添花. 和NTB的单NT和双NTB配置相比,DMA可配置的选项比较多,但不管是中断模式.查询模式,也无论描述符是在DMA控制器片上还是片外,亦或配置成单个还是多个DMA channel,都有现成的代码可供参考或寄存器

多功能PCIE交换机之六:基于NTB夸节点的读写

多功能PCIE交换机之六:基于NTB夸节点的读写优化 1.基于NTB跨节点读写的应用的特点 NTB常常用在要求高性能和高可靠性的场合,用来实现跨节点数据的传输.比如用作虚拟网卡.跨节点数据同步通道等,这些场合都期望充分发挥NTB基于PCIE的高速传输特性,最大限度地提高系统性能. 2.基于NTB跨节点读写的两种实现方式 实现地址转换.建立NTB通道之后,有两种实现NTB跨节点传输数据的方式: 基于CPU实现数据传输 基于NTB DMA实现数据传输 前者依赖CPU去搬运数据,会占用CPU周期,但非

图解PCIE原理(从软件角度)

1  PCIE基本概念 1.1   PCIE拓扑架构图 1.2 PCIE Switch内部结构图 1.3  PCIE协议结构图 2 PCIE枚举原理 2.1 Type0&Type1配置头空间 2.2 拓扑示例 连接Device0的端口设为Port0,连接Device1的端口设为Port1 (Port可以看作PCI Bridge) 2.3 枚举过程 Port0.Port1的相关Bus Register变化过程如下图 2.4 资源分配 2.4.1 非桥设备资源分配 以Device0的资源分配为例:需

Redis事务的应用

redis对事务的支持目前还比较简单.redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令. 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的.一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中.当从此连接受到exec命令后,redis会顺序的执行

消息中间件 RocketMQ源码解析:事务消息

关注微信公众号:[芋艿的后端小屋]有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码的疑问每条留言都将得到认真回复.甚至不知道如何读源码也可以请教噢. 新的源码解析文章实时收到通知.每周更新一篇左右. 1. 概述 2. 事务消息发送 2.1 Producer 发送事务消息 2.2 Broker 处理结束事务请求 2.3 Broker 生成

redis事务(Transactions)

redis的事务很简单,他主要目的是保障,一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令. 看下面例子: @Test public void test2Trans() {     Jedis jedis = new Jedis("localhost");     long start = System.currentTimeMillis();     Transaction tx = jedis.multi();     for (int i =

(6)redis 事务

redis对事务的支持目前还比较简单.redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令. 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的.一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中.当从此连接受到exec命令后,redis会顺序的执行

Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式的调用方式做一个简单的介绍和对比: 一.普通同步方式 最简单和基础的调用方式: 1 @Test 2 public void test1Normal() { 3 Jedis jedis = new Jedis("localhost"); 4 long start = System.curre

连接SQLServer时,因启用连接池导致孤立事务的原因分析和解决办法

本文出处:http://www.cnblogs.com/wy123/p/6110349.html 之前遇到过这么一种情况: 连接数据库的部分Session会出现不定时的阻塞,这种阻塞时长时短,有时候持续较长时间,有时间持续时间较短,没有什么规律.  之后分析相关存储过程和代码写法,发现是存储过程中开启了事务,而应用程序在调用存储过程发生异常之后没有进行特别的处理(提交或者回滚),  那么在执行方法发生异常之后,连接关闭了,但是数据库中遗留有活动事务(dbcc opentran对应的Session