cortex_a: fix fast-mode memory reads
authorMatthias Welwarsky <matthias@welwarsky.de>
Wed, 25 Nov 2015 11:02:32 +0000 (12:02 +0100)
committerPaul Fertser <fercerpav@gmail.com>
Tue, 1 Dec 2015 06:52:01 +0000 (06:52 +0000)
commit332023fb23aefb30d20b0d7f48d12ed9facdba40
treee221db4dca7ee0a7611946bc5013cd172643399e
parent893de2fe95d77aad598ceaa8149e50f9253da0d9
cortex_a: fix fast-mode memory reads

cortex_a_read_apb_ab_memory_fast() uses the wrong order of ITR and DSCR
writes when setting up the transfer. ARM DDI0406C says in C8.2 regarding
"Fast mode" operation to first switch to fast mode and then latch the
instruction in ITR. Current implementation first wrote ITR, causing
the instruction to be executed immediately, then switched to fast mode
without an instruction latched. Repeated reading of DTRTX didn't
execute LDC and thus replicated its current content into the whole buffer.

This patch uses the following, revised algorithm:
1) switch to non-blocking mode and issue the LDC for the first word
2) if more than one word is to be read:
 - switch to fast mode
 - latch the LDC instruction into ITR (it is _not_ executed)
 - issue (count-1) reads of DTRTX register, each read returns the current
   content of DTRTX and re-issues the latched instruction
 -> now the second-to-last word is in the buffer and the LDC for the last
    word has been issued.
3) wait for the last instruction to complete
4) switch back to non-blocking mode
5) Read DTRTX for the last (or: only) word and put it into the buffer

Change-Id: I44f5c585962ffa5af257c3d5a2a802c122b6b1e4
Signed-off-by: Matthias Welwarsky <matthias@welwarsky.de>
Reviewed-on: http://openocd.zylin.com/3122
Tested-by: jenkins
Reviewed-by: Christopher Head <chead@zaber.com>
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
src/target/cortex_a.c