blob: bcf122e6bed7f5da90a8f463a182e2888ca451cb [file] [log] [blame]
purpose: Test code to determine the speed of MMP2 memory to memory DMA
\ Copy from cache to cache - 1.3 GB/sec
\ Copy from memory to memory - 323 MB/sec
\ DMA from memory to memory - 425 MB/sec
\ Read from cache (address constant) 4.2 GB/sec
\ Read from memory (advancing address) 390 MB/sec
: mdma! ( n offset -- ) h# 2a0a00 + io! ;
: mdma@ ( offset -- n ) h# 2a0a00 + io@ ;
h# 0010.0000 constant mdma-ram
h# ffc0 constant /mdma-buf
mdma-ram constant mdma-desc0
h# 10 constant /dma-desc
\ Descriptor format:
\ Byte count
\ Source
\ Destination
\ link
: set-descriptor ( next dest source length adr -- )
>r r@ l! r@ la1+ l! r@ 2 la+ l! r> 3 la+ l!
;
code cmake-test-ring ( src-adr dst-adr len desc -- )
\ tos: desc
pop r4,sp \ r4: Total length
pop r2,sp \ r2: dst
pop r1,sp \ r1: src
set r0,#0xffc0
begin
add r3,tos,#0x10
stmia tos!,{r0,r1,r2,r3}
inc r1,r0
inc r2,r0
decs r4,r0
0<= until
\ Go back to last descriptor
dec tos,#0x10
mov r3,#0
str r3,[tos,#0x0c] \ Last link is 0
inc r4,r0
str r4,[tos] \ Fixup last length
pop tos,sp
c;
0 value dst-adr
0 value src-adr
0 value desc-adr
: make-test-ring ( src-adr dst-adr len -- )
swap to dst-adr swap to src-adr
mdma-desc0 to desc-adr
0 ?do
desc-adr /dma-desc + dst-adr i + src-adr i + /mdma-buf desc-adr set-descriptor
desc-adr /dma-desc + to desc-adr
/mdma-buf +loop
desc-adr /dma-desc - to desc-adr
0 desc-adr 3 la+ l! \ Put null in last link
mdma-desc0 h# 30 mdma! \ Link to first descriptor
;
: start-test-ring ( -- )
\ 8 h# 28.2864 io! \ Enable DMA clock
1 h# 80 mdma! \ Enable DMA completion interrupts
h# 0000.3d80 h# 40 mdma! \ fetch next, enable, chain, 32 bytes, inc dest, inc src
;
: abort-test-ring ( -- ) h# 10.0000 h# 40 mdma! ;