From 5373085b4d7ab600d0325634f3adc846f92169af Mon Sep 17 00:00:00 2001 From: Matthias Welwarsky Date: Mon, 28 Dec 2015 22:33:51 +0100 Subject: [PATCH] adiv5: introduce optional dap_sync() function dap_sync() executes all commands in the JTAG queue and then checks if a WAIT condition happened inside the last batch. If yes, a recovery is invoked. If not, processing continues without checking for errors. This function should be called in long AP read or writes, e.g. while uploading a new application binary, at intermediate points within the transfer where the cost of flushing the JTAG queue and checking the journal doesn't affect performance too much. Change-Id: I99eeaf47cdf951e15e589a04e74b90b5ce911386 Signed-off-by: Matthias Welwarsky Reviewed-on: http://openocd.zylin.com/3181 Tested-by: jenkins Reviewed-by: Paul Fertser --- src/target/adi_v5_jtag.c | 6 ++++++ src/target/arm_adi_v5.h | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/target/adi_v5_jtag.c b/src/target/adi_v5_jtag.c index ff1680b0..201ed90a 100644 --- a/src/target/adi_v5_jtag.c +++ b/src/target/adi_v5_jtag.c @@ -679,6 +679,11 @@ static int jtag_dp_run(struct adiv5_dap *dap) return (retval2 != ERROR_OK) ? retval2 : retval; } +static int jtag_dp_sync(struct adiv5_dap *dap) +{ + return jtagdp_overrun_check(dap); +} + /* FIXME don't export ... just initialize as * part of DAP setup */ @@ -689,6 +694,7 @@ const struct dap_ops jtag_dp_ops = { .queue_ap_write = jtag_ap_q_write, .queue_ap_abort = jtag_ap_q_abort, .run = jtag_dp_run, + .sync = jtag_dp_sync, }; diff --git a/src/target/arm_adi_v5.h b/src/target/arm_adi_v5.h index 44d3962c..f001d6a2 100644 --- a/src/target/arm_adi_v5.h +++ b/src/target/arm_adi_v5.h @@ -274,6 +274,10 @@ struct dap_ops { /** Executes all queued DAP operations. */ int (*run)(struct adiv5_dap *dap); + + /** Executes all queued DAP operations but doesn't check + * sticky error conditions */ + int (*sync)(struct adiv5_dap *dap); }; /* @@ -397,6 +401,14 @@ static inline int dap_run(struct adiv5_dap *dap) return dap->ops->run(dap); } +static inline int dap_sync(struct adiv5_dap *dap) +{ + assert(dap->ops != NULL); + if (dap->ops->sync) + return dap->ops->sync(dap); + return ERROR_OK; +} + static inline int dap_dp_read_atomic(struct adiv5_dap *dap, unsigned reg, uint32_t *value) { -- 2.39.5