2009年4月3日星期五

ARM紧致内存TCM的L1DMA

L1 DMA用于后台大数据量访问TCM时。通过CP15寄存器来设置读写方向,以及源和目标的起始地址和结束地址。

DMA设置用到的地址都是虚地址,所以DMA要做虚地址到物理地址的翻译,以及权限检查。具体实现可以利用TLB以提高性能,但要保证TLB和页表的一致性。权限错误可以配置成通过中断来报告给处理器。DMA操作的完成也可以通过此中断报告给处理器。

DMA进行状态也在CP15的相关寄存器中得到反应。

L1 DMA限制:
  • DMA通道最多2个
  • 只能有一个处于活动状态
  • DMA只限于TCM和外部RAM之间
  • 如果是应用级DMA,外部RAM必须是共享的
使用CP15寄存器11操作L1 DMA:
ARM指令
MCR p15, 0, Rd, c11, CRm, Opcode2
MRC p15, 0, Rd, c11, CRm, Opcode2


CP15寄存器11是个接口,它还有相关的辅助寄存器,如下表所示:
Register                            CRm      Opcode 2                       Function
Identification/Status 0 Present/Queued/
Privileged only: RO
Running/Interrupting
User Accessibility 1 0 Privileged only: RW
Channel Number 2 0 Read/Write
Enable 3 Stop/Start/Clear Write-only
Control 4 0 Read/Write
Internal Start Address 5 0 Read/Write
External Start Address 6 0 Read/Write
Internal End Address 7 0 Read/Write
Channel Status 8 0 Read-only
RESERVED SBZ/UNP 9-14 0 Read/Write
Context ID 15 0 Privileged only: R/W
其中,4、5、6、7、8、15号辅助寄存器都是每个DMA通道有一个,由2号通道编号寄存器来决定当前使用的是哪一个。

下面是对每个寄存器的解释:

标识/状态寄存器(0)
这是一组寄存器,由opcode2来标识:
0:present寄存器
1:queued寄存器
2:Running寄存器
3:interrupting寄存器

这几个寄存器的结构一样,从最低位起,每一位表示每个DMA通道的相应状况,即:
  • 是否实现
  • 是否有排队
  • 是否有DMA操作正在运行
  • 是否正在给处理器发中断
ARM指令:
MRC p15, 0, Rd, c11, c0, n ; where n is 0, 1, 2, or 3

用户可访问寄存器(1)
每一通道有一位(U位),表明该通道是否允许用户态访问其寄存器。

通道编号寄存器(2)
此寄存器的内容决定当前的DMA通道。

使能寄存器(3)
操作此辅助寄存器可以开始、停止或清楚当前的DMA通道。具体操作由opcode2决定:
Opcode2 Operation
0 Stop
1 Start
2 Clear
3-7 Reserved


ARM指令:
MCR p15, 0, Rd, c11, c3, n ; where n is 0, 1, or 2

START命令开始DMA传输,如果当前没有进行中的DMA传输,那么DMA传输开始,状态进入到运行状态,否则进入到队列等待状态。DMA通道处于进行中是指该通道要么正在传输、正在等待、或发生了错误号大于0b01000的错误,并且传输已停止。
STOP命令将尽快终止DMA传输,并使DMA进入空闲状态,开始地址寄存器被设置为DMA传输终止时的值,可用于继续此次传输。对于无副作用的传输,STOP发出后,DMA可以扔掉手中的数据,立即停止;但如果源或目标地址的读写具有副作用,比如读写的是标记为外设的存储区域,那么DMA必须处理完手中的数据后,才停止。STOP命令可以用于在调试器命令处理器停止运行的情况下,因为L1 DMA开始传输后,不受处理器的其它部分影响,处理器其它部分停止,L1 DMA可以继续运行。
CLEAR命令把DMA从错误状态转置于空闲状态,并清除可能的中断标记(在控制寄存器中设置的)。开始地址寄存器的内容不改变。

控制寄存器
TR[31] RT[30] IC[29] IE[28] FT[27] UM[26] UNP/SBZ[25-20] ST[19-8] UNP/SBZ[7-2] TS[1-0]
ARM指令:
MCR p15, 0, Rd, c11, c4, 0
MRC p15, 0, Rd, c11, c4, 0


TS:Transaction Size,传输的单位长度,00:字节,01:半字,10:字,11:双字
ST:Stride,跨度,正整数或0,以字节为单位。是指每单位传输外部地址的增量,内部地址不受影响。为0时,每次传输后外部地址不增加,这可用于对FIFO传输。
UM:User Mode,置1时表明用户态传输。
FT:Full Transfer,完全传输。传输方向是从TCM到外部存储时,FT=0,只传输那些自上次FT=0的DMA或复位后TCM中改变的内容,即执行增量式传输,把传输量降为最低。;FT=1,传输所有DMA范围中的数据。 在FT=0的DMA后,TCM需要记录那些内容改变了,而对FT=1的DMA则不必记录变化。
IE:Interrupt on Error,传输发生错误时产生中断。受U位制约,如果U=0,IE=0,那么DMA发生错误时不产生中断;如果U=1,或者IE=1,那么发生错误时,产生中断。中断由启动操作或清除操作清楚。
IC:Interrupt on Completion,DMA完成时产生中断。中断的清楚需要清除操作。0:不产生完成中断;1:反之。
DT:Direction of Transfer,传输方向。0:从L2存储到TCM,1:反方向
TR:Target TCM,目标TCM。0代表数据TCM,1代表指令TCM

内部起始地址寄存器
地址是虚拟地址,并随传输过程而变化,当传输结束时,该寄存器内容是结束地址。起始地址必须根据传输单位大小对齐。因为是虚拟地址,所以MMU会根据页表进行地址翻译,并应用页表中的权限位。也许会产生权限不足引发的中断。
ARM指令:
MCR p15, 0, Rd, c11, c5, 0
MRC p15, 0, Rd, c11, c5, 0


外部起始地址寄存器
与内部起始地址寄存器的描述基本相同。
ARM指令:
MCR p15, 0, Rd, c11, c6, 0
MRC p15, 0, Rd, c11, c6, 0

内部结束地址寄存器
这个寄存器的内容是DMA结束传输的位置,即DMA不传输这个地址,
ARM指令:
MCR p15, 0, Rd, c11, c7, 0
MRC p15, 0, Rd, c11, c7, 0


通道状态寄存器
包含最新DMA的状态,格式:
UNP/SBZ[31-12] ES[11-7] IS[6-2] Status[1-0]
ARM指令:
MCR p15, 0, Rd, c11, c8, 0

Status:状态。00:空闲,01:排队,10:运行,11:错误/完成
IS:内部地址错误状态。编码如下:
0b00xxx = No Error (reset value)
0b01000 = TCM out of range
0b11100 =External Abort on Translation of 1st Level Page Table
0b11110 = External Abort on Translation of 2nd Level Page Table
0b10101 = Translation fault (Section)
0b10111 = Translation fault (Page)
0b11001 = Domain fault (Section)
0b11011 = Domain fault (Page)
0b11101 = Permission fault (Section)
0b11111 = Permission fault (Page).


ES:外部地址错误。编码如下:
0b00xxx = No Error (reset value)
0b01001 = Unshared Data Error
0b11010 = External Abort (can be imprecise)
0b11100 = External Abort on Translation of 1st Level Page Table
0b11110 = External Abort on Translation of 2nd Level Page Table
0b10101 = Translation fault (Section)
0b10111 = Translation fault (Page)
0b11001 = Domain fault (Section)
0b11011 = Domain fault (Page)
0b11101 = Permission fault (Section).
0b11111 = Permission fault (Page).


这些错误基本上是MMU做地址转换时动态产生的。

发生错误时,出错的地址反映在相应的起始地址寄存器中,除非是外部错误(0b11010)。非共享数据错发生在用户态程序访问非共享存储区时。

当一个DMA无错误完成时,如果有排队的DMA,则由排队状态转为运行状态。

上下文标识寄存器
该寄存器包含使用此DMA通道的进程标识。一般在初始化DMA通道时写此寄存器。此寄存器的低8位在地址翻译时也要用到,以允许不同的虚拟地址映射共存。此寄存器只能被特权模式程序读写。
ARM指令:
MCR p15, 0, Rd, c11, c15, 0
MRC p15, 0, Rd, c11, c15, 0

没有评论:

发表评论