adi_v5_jtag: implement DAP WAIT support

ADIv5 specifies that DP and AP accesses may generate a WAIT
response when the hardware is not able to complete a request for various
reasons in time before the next request is sent. Currently, the software
treats a WAIT response as a fatal error and aborts operation on the DAP.

This patch implements WAIT handling by keeping a journal of all
outstanding and completed accesses, including their response status.
At certain times (when dap_run() is called), the journal is inspected
for WAIT responses and all discarded accesses are replayed to complete
them. Special care is taken to not re-execute already successfully
completed operations.

Change-Id: I2790070388cf1ab2e8c9a042d74eb3ef776aa583
Signed-off-by: Matthias Welwarsky <matthias@welwarsky.de>
Reviewed-on: http://openocd.zylin.com/3166
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
This commit is contained in:
Matthias Welwarsky
2015-12-11 15:12:56 +01:00
committed by Paul Fertser
parent ae8cdc139e
commit a185eaad9d
3 changed files with 457 additions and 157 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -76,6 +76,7 @@
#include "arm.h"
#include "arm_adi_v5.h"
#include <helper/time_support.h>
#include <helper/list.h>
/* ARM ADI Specification requires at least 10 bits used for TAR autoincrement */
@@ -586,6 +587,7 @@ struct adiv5_dap *dap_init(void)
/* Number of bits for tar autoincrement, impl. dep. at least 10 */
dap->ap[i].tar_autoincr_block = (1<<10);
}
INIT_LIST_HEAD(&dap->cmd_journal);
return dap;
}

View File

@@ -31,6 +31,7 @@
* resources accessed through a MEM-AP.
*/
#include <helper/list.h>
#include "arm_jtag.h"
/* FIXME remove these JTAG-specific decls when mem_ap_read_buf_u32()
@@ -206,6 +207,9 @@ struct adiv5_ap {
struct adiv5_dap {
const struct dap_ops *ops;
/* dap transaction list for WAIT support */
struct list_head cmd_journal;
struct jtag_tap *tap;
/* Control config */
uint32_t dp_ctrl_stat;