jtag: linuxgpiod: drop extra parenthesis
[openocd.git] / src / target / adi_v5_jtag.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2
3 /***************************************************************************
4 * Copyright (C) 2006 by Magnus Lundin
5 * lundin@mlu.mine.nu
6 *
7 * Copyright (C) 2008 by Spencer Oliver
8 * spen@spen-soft.co.uk
9 *
10 * Copyright (C) 2009 by Oyvind Harboe
11 * oyvind.harboe@zylin.com
12 *
13 * Copyright (C) 2009-2010 by David Brownell
14 *
15 * Copyright (C) 2020-2021, Ampere Computing LLC *
16 ***************************************************************************/
17
18 /**
19 * @file
20 * This file implements JTAG transport support for cores implementing
21 the ARM Debug Interface version 5 (ADIv5) and version 6 (ADIv6).
22 */
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include "arm.h"
29 #include "arm_adi_v5.h"
30 #include <helper/time_support.h>
31 #include <helper/list.h>
32 #include <jtag/swd.h>
33
34 /*#define DEBUG_WAIT*/
35
36 /* JTAG instructions/registers for JTAG-DP and SWJ-DP */
37 #define JTAG_DP_ABORT 0xF8
38 #define JTAG_DP_DPACC 0xFA
39 #define JTAG_DP_APACC 0xFB
40 #define JTAG_DP_IDCODE 0xFE
41
42 /* three-bit ACK values for DPACC and APACC reads */
43 #define JTAG_ACK_WAIT 0x1 /* ADIv5 and ADIv6 */
44 #define JTAG_ACK_OK_FAULT 0x2 /* ADIv5 */
45 #define JTAG_ACK_FAULT 0x2 /* ADIv6 */
46 #define JTAG_ACK_OK 0x4 /* ADIV6 */
47
48 static int jtag_ap_q_abort(struct adiv5_dap *dap, uint8_t *ack);
49
50 #ifdef DEBUG_WAIT
51 static const char *dap_reg_name(struct adiv5_dap *dap, uint8_t instr, uint16_t reg_addr)
52 {
53 char *reg_name = "UNK";
54
55 if (instr == JTAG_DP_DPACC) {
56 switch (reg_addr) {
57 case DP_ABORT:
58 reg_name = "ABORT";
59 break;
60 case DP_CTRL_STAT:
61 reg_name = "CTRL/STAT";
62 break;
63 case DP_SELECT:
64 reg_name = "SELECT";
65 break;
66 case DP_RDBUFF:
67 reg_name = "RDBUFF";
68 break;
69 case DP_DLCR:
70 reg_name = "DLCR";
71 break;
72 default:
73 reg_name = "UNK";
74 break;
75 }
76 }
77
78 if (instr == JTAG_DP_APACC) {
79 if (reg_addr == MEM_AP_REG_CSW(dap))
80 reg_name = "CSW";
81 else if (reg_addr == MEM_AP_REG_TAR(dap))
82 reg_name = "TAR";
83 else if (reg_addr == MEM_AP_REG_TAR64(dap))
84 reg_name = "TAR64";
85 else if (reg_addr == MEM_AP_REG_DRW(dap))
86 reg_name = "DRW";
87 else if (reg_addr == MEM_AP_REG_BD0(dap))
88 reg_name = "BD0";
89 else if (reg_addr == MEM_AP_REG_BD1(dap))
90 reg_name = "BD1";
91 else if (reg_addr == MEM_AP_REG_BD2(dap))
92 reg_name = "BD2";
93 else if (reg_addr == MEM_AP_REG_BD3(dap))
94 reg_name = "BD3";
95 else if (reg_addr == MEM_AP_REG_CFG(dap))
96 reg_name = "CFG";
97 else if (reg_addr == MEM_AP_REG_BASE(dap))
98 reg_name = "BASE";
99 else if (reg_addr == MEM_AP_REG_BASE64(dap))
100 reg_name = "BASE64";
101 else if (reg_addr == AP_REG_IDR(dap))
102 reg_name = "IDR";
103 else
104 reg_name = "UNK";
105 }
106
107 return reg_name;
108 }
109 #endif
110
111 struct dap_cmd {
112 struct list_head lh;
113 uint8_t instr;
114 uint16_t reg_addr;
115 uint8_t rnw;
116 uint8_t *invalue;
117 uint8_t ack;
118 uint32_t memaccess_tck;
119 uint64_t dp_select;
120
121 struct scan_field fields[2];
122 uint8_t out_addr_buf;
123 uint8_t invalue_buf[4];
124 uint8_t outvalue_buf[4];
125 };
126
127 #define MAX_DAP_COMMAND_NUM 65536
128
129 struct dap_cmd_pool {
130 struct list_head lh;
131 struct dap_cmd cmd;
132 };
133
134 static void log_dap_cmd(struct adiv5_dap *dap, const char *header, struct dap_cmd *el)
135 {
136 #ifdef DEBUG_WAIT
137 const char *ack;
138 switch (el->ack) {
139 case JTAG_ACK_WAIT: /* ADIv5 and ADIv6 */
140 ack = "WAIT";
141 break;
142 case JTAG_ACK_OK_FAULT: /* ADIv5, same value as JTAG_ACK_FAULT */
143 /* case JTAG_ACK_FAULT: */ /* ADIv6 */
144 if (is_adiv6(dap))
145 ack = "FAULT";
146 else
147 ack = "OK";
148 break;
149 case JTAG_ACK_OK: /* ADIv6 */
150 if (is_adiv6(dap)) {
151 ack = "OK";
152 break;
153 }
154 /* fall-through */
155 default:
156 ack = "INVAL";
157 break;
158 }
159 LOG_DEBUG("%s: %2s %6s %5s 0x%08x 0x%08x %2s", header,
160 el->instr == JTAG_DP_APACC ? "AP" : "DP",
161 dap_reg_name(dap, el->instr, el->reg_addr),
162 el->rnw == DPAP_READ ? "READ" : "WRITE",
163 buf_get_u32(el->outvalue_buf, 0, 32),
164 buf_get_u32(el->invalue, 0, 32),
165 ack);
166 #endif
167 }
168
169 static int jtag_limit_queue_size(struct adiv5_dap *dap)
170 {
171 if (dap->cmd_pool_size < MAX_DAP_COMMAND_NUM)
172 return ERROR_OK;
173
174 return dap_run(dap);
175 }
176
177 static struct dap_cmd *dap_cmd_new(struct adiv5_dap *dap, uint8_t instr,
178 uint16_t reg_addr, uint8_t rnw,
179 uint8_t *outvalue, uint8_t *invalue,
180 uint32_t memaccess_tck)
181 {
182
183 struct dap_cmd_pool *pool = NULL;
184
185 if (list_empty(&dap->cmd_pool)) {
186 pool = calloc(1, sizeof(struct dap_cmd_pool));
187 if (!pool)
188 return NULL;
189 } else {
190 pool = list_first_entry(&dap->cmd_pool, struct dap_cmd_pool, lh);
191 list_del(&pool->lh);
192 }
193
194 INIT_LIST_HEAD(&pool->lh);
195 dap->cmd_pool_size++;
196
197 struct dap_cmd *cmd = &pool->cmd;
198 INIT_LIST_HEAD(&cmd->lh);
199 cmd->instr = instr;
200 cmd->reg_addr = reg_addr;
201 cmd->rnw = rnw;
202 if (outvalue)
203 memcpy(cmd->outvalue_buf, outvalue, 4);
204 cmd->invalue = (invalue) ? invalue : cmd->invalue_buf;
205 cmd->memaccess_tck = memaccess_tck;
206
207 return cmd;
208 }
209
210 static void dap_cmd_release(struct adiv5_dap *dap, struct dap_cmd *cmd)
211 {
212 struct dap_cmd_pool *pool = container_of(cmd, struct dap_cmd_pool, cmd);
213 if (dap->cmd_pool_size > MAX_DAP_COMMAND_NUM)
214 free(pool);
215 else
216 list_add(&pool->lh, &dap->cmd_pool);
217
218 dap->cmd_pool_size--;
219 }
220
221 static void flush_journal(struct adiv5_dap *dap, struct list_head *lh)
222 {
223 struct dap_cmd *el, *tmp;
224
225 list_for_each_entry_safe(el, tmp, lh, lh) {
226 list_del(&el->lh);
227 dap_cmd_release(dap, el);
228 }
229 }
230
231 static void jtag_quit(struct adiv5_dap *dap)
232 {
233 struct dap_cmd_pool *el, *tmp;
234 struct list_head *lh = &dap->cmd_pool;
235
236 list_for_each_entry_safe(el, tmp, lh, lh) {
237 list_del(&el->lh);
238 free(el);
239 }
240 }
241
242 /***************************************************************************
243 *
244 * DPACC and APACC scanchain access through JTAG-DP (or SWJ-DP)
245 *
246 ***************************************************************************/
247
248 static int adi_jtag_dp_scan_cmd(struct adiv5_dap *dap, struct dap_cmd *cmd, uint8_t *ack)
249 {
250 struct jtag_tap *tap = dap->tap;
251 int retval;
252
253 retval = arm_jtag_set_instr(tap, cmd->instr, NULL, TAP_IDLE);
254 if (retval != ERROR_OK)
255 return retval;
256
257 /* Scan out a read or write operation using some DP or AP register.
258 * For APACC access with any sticky error flag set, this is discarded.
259 */
260 cmd->fields[0].num_bits = 3;
261 buf_set_u32(&cmd->out_addr_buf, 0, 3, ((cmd->reg_addr >> 1) & 0x6) | (cmd->rnw & 0x1));
262 cmd->fields[0].out_value = &cmd->out_addr_buf;
263 cmd->fields[0].in_value = (ack) ? ack : &cmd->ack;
264
265 /* NOTE: if we receive JTAG_ACK_WAIT, the previous operation did not
266 * complete; data we write is discarded, data we read is unpredictable.
267 * When overrun detect is active, STICKYORUN is set.
268 */
269
270 cmd->fields[1].num_bits = 32;
271 cmd->fields[1].out_value = cmd->outvalue_buf;
272 cmd->fields[1].in_value = cmd->invalue;
273
274 jtag_add_dr_scan(tap, 2, cmd->fields, TAP_IDLE);
275
276 /* Add specified number of tck clocks after starting AP register
277 * access or memory bus access, giving the hardware time to complete
278 * the access.
279 * They provide more time for the (MEM) AP to complete the read ...
280 * See "Minimum Response Time" for JTAG-DP, in the ADIv5/ADIv6 spec.
281 */
282 if (cmd->instr == JTAG_DP_APACC && cmd->memaccess_tck != 0)
283 jtag_add_runtest(cmd->memaccess_tck, TAP_IDLE);
284
285 return ERROR_OK;
286 }
287
288 static int adi_jtag_dp_scan_cmd_sync(struct adiv5_dap *dap, struct dap_cmd *cmd, uint8_t *ack)
289 {
290 int retval;
291
292 retval = adi_jtag_dp_scan_cmd(dap, cmd, ack);
293 if (retval != ERROR_OK)
294 return retval;
295
296 return jtag_execute_queue();
297 }
298
299 /**
300 * Scan DPACC or APACC using target ordered uint8_t buffers. No endianness
301 * conversions are performed. See section 4.4.3 of the ADIv5/ADIv6 spec, which
302 * discusses operations which access these registers.
303 *
304 * Note that only one scan is performed. If rnw is set, a separate scan
305 * will be needed to collect the data which was read; the "invalue" collects
306 * the posted result of a preceding operation, not the current one.
307 *
308 * @param dap the DAP
309 * @param instr JTAG_DP_APACC (AP access) or JTAG_DP_DPACC (DP access)
310 * @param reg_addr two significant bits; A[3:2]; for APACC access, the
311 * SELECT register has more addressing bits.
312 * @param rnw false iff outvalue will be written to the DP or AP
313 * @param outvalue points to a 32-bit (little-endian) integer
314 * @param invalue NULL, or points to a 32-bit (little-endian) integer
315 * @param ack points to where the three bit JTAG_ACK_* code will be stored
316 * @param memaccess_tck number of idle cycles to add after AP access
317 */
318
319 static int adi_jtag_dp_scan(struct adiv5_dap *dap,
320 uint8_t instr, uint16_t reg_addr, uint8_t rnw,
321 uint8_t *outvalue, uint8_t *invalue,
322 uint32_t memaccess_tck, uint8_t *ack)
323 {
324 struct dap_cmd *cmd;
325 int retval;
326
327 cmd = dap_cmd_new(dap, instr, reg_addr, rnw, outvalue, invalue, memaccess_tck);
328 if (cmd)
329 cmd->dp_select = dap->select;
330 else
331 return ERROR_JTAG_DEVICE_ERROR;
332
333 retval = adi_jtag_dp_scan_cmd(dap, cmd, ack);
334 if (retval == ERROR_OK)
335 list_add_tail(&cmd->lh, &dap->cmd_journal);
336
337 return retval;
338 }
339
340 /**
341 * Scan DPACC or APACC out and in from host ordered uint32_t buffers.
342 * This is exactly like adi_jtag_dp_scan(), except that endianness
343 * conversions are performed (so the types of invalue and outvalue
344 * must be different).
345 */
346 static int adi_jtag_dp_scan_u32(struct adiv5_dap *dap,
347 uint8_t instr, uint16_t reg_addr, uint8_t rnw,
348 uint32_t outvalue, uint32_t *invalue,
349 uint32_t memaccess_tck, uint8_t *ack)
350 {
351 uint8_t out_value_buf[4];
352 int retval;
353 uint64_t sel = (reg_addr >> 4) & 0xf;
354
355 /* No need to change SELECT or RDBUFF as they are not banked */
356 if (instr == JTAG_DP_DPACC && reg_addr != DP_SELECT && reg_addr != DP_RDBUFF &&
357 sel != (dap->select & 0xf)) {
358 if (dap->select != DP_SELECT_INVALID)
359 sel |= dap->select & ~0xfull;
360 dap->select = sel;
361 LOG_DEBUG("DP BANKSEL: %x", (uint32_t)sel);
362 buf_set_u32(out_value_buf, 0, 32, (uint32_t)sel);
363 retval = adi_jtag_dp_scan(dap, JTAG_DP_DPACC,
364 DP_SELECT, DPAP_WRITE, out_value_buf, NULL, 0, NULL);
365 if (retval != ERROR_OK)
366 return retval;
367 }
368 buf_set_u32(out_value_buf, 0, 32, outvalue);
369
370 retval = adi_jtag_dp_scan(dap, instr, reg_addr, rnw,
371 out_value_buf, (uint8_t *)invalue, memaccess_tck, ack);
372 if (retval != ERROR_OK)
373 return retval;
374
375 if (invalue)
376 jtag_add_callback(arm_le_to_h_u32,
377 (jtag_callback_data_t) invalue);
378
379 return retval;
380 }
381
382 static int adi_jtag_finish_read(struct adiv5_dap *dap)
383 {
384 int retval = ERROR_OK;
385
386 if (dap->last_read) {
387 retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC,
388 DP_RDBUFF, DPAP_READ, 0, dap->last_read, 0, NULL);
389 dap->last_read = NULL;
390 }
391
392 return retval;
393 }
394
395 static int adi_jtag_scan_inout_check_u32(struct adiv5_dap *dap,
396 uint8_t instr, uint16_t reg_addr, uint8_t rnw,
397 uint32_t outvalue, uint32_t *invalue, uint32_t memaccess_tck)
398 {
399 int retval;
400
401 /* Issue the read or write */
402 retval = adi_jtag_dp_scan_u32(dap, instr, reg_addr,
403 rnw, outvalue, NULL, memaccess_tck, NULL);
404 if (retval != ERROR_OK)
405 return retval;
406
407 /* For reads, collect posted value; RDBUFF has no other effect.
408 * Assumes read gets acked with OK/FAULT, and CTRL_STAT says "OK".
409 */
410 if ((rnw == DPAP_READ) && (invalue)) {
411 retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC,
412 DP_RDBUFF, DPAP_READ, 0, invalue, 0, NULL);
413 if (retval != ERROR_OK)
414 return retval;
415 }
416
417 return jtag_execute_queue();
418 }
419
420 static int jtagdp_overrun_check(struct adiv5_dap *dap)
421 {
422 int retval;
423 struct dap_cmd *el, *tmp, *prev = NULL;
424 int found_wait = 0;
425 int64_t time_now;
426 LIST_HEAD(replay_list);
427
428 /* make sure all queued transactions are complete */
429 retval = jtag_execute_queue();
430 if (retval != ERROR_OK)
431 goto done;
432
433 /* skip all completed transactions up to the first WAIT */
434 list_for_each_entry(el, &dap->cmd_journal, lh) {
435 /*
436 * JTAG_ACK_OK_FAULT (ADIv5) and JTAG_ACK_FAULT (ADIv6) are equal so
437 * the following statement is checking to see if an acknowledgment of
438 * OK or FAULT is generated for ADIv5 or ADIv6
439 */
440 if (el->ack == JTAG_ACK_OK_FAULT || (is_adiv6(dap) && el->ack == JTAG_ACK_OK)) {
441 log_dap_cmd(dap, "LOG", el);
442 } else if (el->ack == JTAG_ACK_WAIT) {
443 found_wait = 1;
444 break;
445 } else {
446 LOG_ERROR("Invalid ACK (%1x) in DAP response", el->ack);
447 log_dap_cmd(dap, "ERR", el);
448 retval = ERROR_JTAG_DEVICE_ERROR;
449 goto done;
450 }
451 }
452
453 /*
454 * If we found a stalled transaction and a previous transaction
455 * exists, check if it's a READ access.
456 */
457 if (found_wait && el != list_first_entry(&dap->cmd_journal, struct dap_cmd, lh)) {
458 prev = list_entry(el->lh.prev, struct dap_cmd, lh);
459 if (prev->rnw == DPAP_READ) {
460 log_dap_cmd(dap, "PND", prev);
461 /* search for the next OK transaction, it contains
462 * the result of the previous READ */
463 tmp = el;
464 list_for_each_entry_from(tmp, &dap->cmd_journal, lh) {
465 /* The following check covers OK and FAULT ACKs for both ADIv5 and ADIv6 */
466 if (tmp->ack == JTAG_ACK_OK_FAULT || (is_adiv6(dap) && tmp->ack == JTAG_ACK_OK)) {
467 /* recover the read value */
468 log_dap_cmd(dap, "FND", tmp);
469 if (el->invalue != el->invalue_buf) {
470 uint32_t invalue = le_to_h_u32(tmp->invalue);
471 memcpy(el->invalue, &invalue, sizeof(uint32_t));
472 }
473 prev = NULL;
474 break;
475 }
476 }
477
478 if (prev) {
479 log_dap_cmd(dap, "LST", el);
480
481 /*
482 * At this point we're sure that no previous
483 * transaction completed and the DAP/AP is still
484 * in busy state. We know that the next "OK" scan
485 * will return the READ result we need to recover.
486 * To complete the READ, we just keep polling RDBUFF
487 * until the WAIT condition clears
488 */
489 tmp = dap_cmd_new(dap, JTAG_DP_DPACC,
490 DP_RDBUFF, DPAP_READ, NULL, NULL, 0);
491 if (!tmp) {
492 retval = ERROR_JTAG_DEVICE_ERROR;
493 goto done;
494 }
495 /* synchronously retry the command until it succeeds */
496 time_now = timeval_ms();
497 do {
498 retval = adi_jtag_dp_scan_cmd_sync(dap, tmp, NULL);
499 if (retval != ERROR_OK)
500 break;
501 /* The following check covers OK and FAULT ACKs for both ADIv5 and ADIv6 */
502 if (tmp->ack == JTAG_ACK_OK_FAULT || (is_adiv6(dap) && tmp->ack == JTAG_ACK_OK)) {
503 log_dap_cmd(dap, "FND", tmp);
504 if (el->invalue != el->invalue_buf) {
505 uint32_t invalue = le_to_h_u32(tmp->invalue);
506 memcpy(el->invalue, &invalue, sizeof(uint32_t));
507 }
508 break;
509 }
510 if (tmp->ack != JTAG_ACK_WAIT) {
511 LOG_ERROR("Invalid ACK (%1x) in DAP response", tmp->ack);
512 log_dap_cmd(dap, "ERR", tmp);
513 retval = ERROR_JTAG_DEVICE_ERROR;
514 break;
515 }
516
517 } while (timeval_ms() - time_now < 1000);
518
519 if (retval == ERROR_OK) {
520 /* timeout happened */
521 if (tmp->ack == JTAG_ACK_WAIT) {
522 LOG_ERROR("Timeout during WAIT recovery");
523 dap->select = DP_SELECT_INVALID;
524 jtag_ap_q_abort(dap, NULL);
525 /* clear the sticky overrun condition */
526 adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
527 DP_CTRL_STAT, DPAP_WRITE,
528 dap->dp_ctrl_stat | SSTICKYORUN, NULL, 0);
529 retval = ERROR_JTAG_DEVICE_ERROR;
530 }
531 }
532
533 /* we're done with this command, release it */
534 dap_cmd_release(dap, tmp);
535
536 if (retval != ERROR_OK)
537 goto done;
538
539 }
540 /* make el->invalue point to the default invalue
541 * so that we can safely retry it without clobbering
542 * the result we just recovered */
543 el->invalue = el->invalue_buf;
544 }
545 }
546
547 /* move all remaining transactions over to the replay list */
548 list_for_each_entry_safe_from(el, tmp, &dap->cmd_journal, lh) {
549 log_dap_cmd(dap, "REP", el);
550 list_move_tail(&el->lh, &replay_list);
551 }
552
553 /* we're done with the journal, flush it */
554 flush_journal(dap, &dap->cmd_journal);
555
556 /* check for overrun condition in the last batch of transactions */
557 if (found_wait) {
558 LOG_INFO("DAP transaction stalled (WAIT) - slowing down and resending");
559 /* clear the sticky overrun condition */
560 retval = adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
561 DP_CTRL_STAT, DPAP_WRITE,
562 dap->dp_ctrl_stat | SSTICKYORUN, NULL, 0);
563 if (retval != ERROR_OK)
564 goto done;
565
566 /* restore SELECT register first */
567 if (!list_empty(&replay_list)) {
568 el = list_first_entry(&replay_list, struct dap_cmd, lh);
569 tmp = dap_cmd_new(dap, JTAG_DP_DPACC,
570 DP_SELECT, DPAP_WRITE, (uint8_t *)&el->dp_select, NULL, 0);
571 if (!tmp) {
572 retval = ERROR_JTAG_DEVICE_ERROR;
573 goto done;
574 }
575 list_add(&tmp->lh, &replay_list);
576
577 dap->select = DP_SELECT_INVALID;
578 }
579
580 list_for_each_entry_safe(el, tmp, &replay_list, lh) {
581 time_now = timeval_ms();
582 do {
583 retval = adi_jtag_dp_scan_cmd_sync(dap, el, NULL);
584 if (retval != ERROR_OK)
585 break;
586 log_dap_cmd(dap, "REC", el);
587 if (el->ack == JTAG_ACK_OK_FAULT || (is_adiv6(dap) && el->ack == JTAG_ACK_OK)) {
588 if (el->invalue != el->invalue_buf) {
589 uint32_t invalue = le_to_h_u32(el->invalue);
590 memcpy(el->invalue, &invalue, sizeof(uint32_t));
591 }
592 break;
593 }
594 if (el->ack != JTAG_ACK_WAIT) {
595 LOG_ERROR("Invalid ACK (%1x) in DAP response", el->ack);
596 log_dap_cmd(dap, "ERR", el);
597 retval = ERROR_JTAG_DEVICE_ERROR;
598 break;
599 }
600 LOG_DEBUG("DAP transaction stalled during replay (WAIT) - resending");
601 /* clear the sticky overrun condition */
602 retval = adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
603 DP_CTRL_STAT, DPAP_WRITE,
604 dap->dp_ctrl_stat | SSTICKYORUN, NULL, 0);
605 if (retval != ERROR_OK)
606 break;
607 } while (timeval_ms() - time_now < 1000);
608
609 if (retval == ERROR_OK) {
610 if (el->ack == JTAG_ACK_WAIT) {
611 LOG_ERROR("Timeout during WAIT recovery");
612 dap->select = DP_SELECT_INVALID;
613 jtag_ap_q_abort(dap, NULL);
614 /* clear the sticky overrun condition */
615 adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
616 DP_CTRL_STAT, DPAP_WRITE,
617 dap->dp_ctrl_stat | SSTICKYORUN, NULL, 0);
618 retval = ERROR_JTAG_DEVICE_ERROR;
619 break;
620 }
621 } else
622 break;
623 }
624 }
625
626 done:
627 flush_journal(dap, &replay_list);
628 flush_journal(dap, &dap->cmd_journal);
629 return retval;
630 }
631
632 static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)
633 {
634 int retval;
635 uint32_t ctrlstat, pwrmask;
636
637 /* too expensive to call keep_alive() here */
638
639 /* Post CTRL/STAT read; discard any previous posted read value
640 * but collect its ACK status.
641 */
642 retval = adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
643 DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat, 0);
644 if (retval != ERROR_OK)
645 goto done;
646
647 /* REVISIT also STICKYCMP, for pushed comparisons (nyet used) */
648
649 /* Check for STICKYERR */
650 if (ctrlstat & SSTICKYERR) {
651 LOG_DEBUG("jtag-dp: CTRL/STAT 0x%" PRIx32, ctrlstat);
652 /* Check power to debug regions */
653 pwrmask = CDBGPWRUPREQ | CDBGPWRUPACK | CSYSPWRUPREQ;
654 if (!dap->ignore_syspwrupack)
655 pwrmask |= CSYSPWRUPACK;
656 if ((ctrlstat & pwrmask) != pwrmask) {
657 LOG_ERROR("Debug regions are unpowered, an unexpected reset might have happened");
658 dap->do_reconnect = true;
659 }
660
661 if (ctrlstat & SSTICKYERR)
662 LOG_ERROR("JTAG-DP STICKY ERROR");
663 if (ctrlstat & SSTICKYORUN)
664 LOG_DEBUG("JTAG-DP STICKY OVERRUN");
665
666 /* Clear Sticky Error and Sticky Overrun Bits */
667 retval = adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
668 DP_CTRL_STAT, DPAP_WRITE,
669 dap->dp_ctrl_stat | SSTICKYERR | SSTICKYORUN, NULL, 0);
670 if (retval != ERROR_OK)
671 goto done;
672
673 retval = ERROR_JTAG_DEVICE_ERROR;
674 }
675
676 done:
677 flush_journal(dap, &dap->cmd_journal);
678 return retval;
679 }
680
681 /*--------------------------------------------------------------------------*/
682
683 static int jtag_connect(struct adiv5_dap *dap)
684 {
685 dap->do_reconnect = false;
686 return dap_dp_init(dap);
687 }
688
689 static int jtag_check_reconnect(struct adiv5_dap *dap)
690 {
691 if (dap->do_reconnect)
692 return jtag_connect(dap);
693
694 return ERROR_OK;
695 }
696
697 static int jtag_send_sequence(struct adiv5_dap *dap, enum swd_special_seq seq)
698 {
699 int retval;
700
701 switch (seq) {
702 case JTAG_TO_SWD:
703 retval = jtag_add_tms_seq(swd_seq_jtag_to_swd_len,
704 swd_seq_jtag_to_swd, TAP_INVALID);
705 break;
706 case SWD_TO_JTAG:
707 retval = jtag_add_tms_seq(swd_seq_swd_to_jtag_len,
708 swd_seq_swd_to_jtag, TAP_RESET);
709 break;
710 default:
711 LOG_ERROR("Sequence %d not supported", seq);
712 return ERROR_FAIL;
713 }
714 if (retval == ERROR_OK)
715 retval = jtag_execute_queue();
716 return retval;
717 }
718
719 static int jtag_dp_q_read(struct adiv5_dap *dap, unsigned reg,
720 uint32_t *data)
721 {
722 int retval = jtag_limit_queue_size(dap);
723 if (retval != ERROR_OK)
724 return retval;
725
726 retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC, reg,
727 DPAP_READ, 0, dap->last_read, 0, NULL);
728 dap->last_read = data;
729 return retval;
730 }
731
732 static int jtag_dp_q_write(struct adiv5_dap *dap, unsigned reg,
733 uint32_t data)
734 {
735 int retval = jtag_limit_queue_size(dap);
736 if (retval != ERROR_OK)
737 return retval;
738
739 retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC,
740 reg, DPAP_WRITE, data, dap->last_read, 0, NULL);
741 dap->last_read = NULL;
742 return retval;
743 }
744
745 /** Select the AP register bank matching bits 7:4 of reg. */
746 static int jtag_ap_q_bankselect(struct adiv5_ap *ap, unsigned reg)
747 {
748 int retval;
749 struct adiv5_dap *dap = ap->dap;
750 uint64_t sel;
751
752 if (is_adiv6(dap)) {
753 sel = ap->ap_num | (reg & 0x00000FF0);
754 if (sel == (dap->select & ~0xfull))
755 return ERROR_OK;
756
757 if (dap->select != DP_SELECT_INVALID)
758 sel |= dap->select & 0xf;
759 dap->select = sel;
760 LOG_DEBUG("AP BANKSEL: %" PRIx64, sel);
761
762 retval = jtag_dp_q_write(dap, DP_SELECT, (uint32_t)sel);
763 if (retval != ERROR_OK)
764 return retval;
765
766 if (dap->asize > 32)
767 return jtag_dp_q_write(dap, DP_SELECT1, (uint32_t)(sel >> 32));
768 return ERROR_OK;
769 }
770
771 /* ADIv5 */
772 sel = (ap->ap_num << 24) | (reg & 0x000000F0);
773
774 if (sel == dap->select)
775 return ERROR_OK;
776
777 dap->select = sel;
778
779 return jtag_dp_q_write(dap, DP_SELECT, (uint32_t)sel);
780 }
781
782 static int jtag_ap_q_read(struct adiv5_ap *ap, unsigned reg,
783 uint32_t *data)
784 {
785 int retval = jtag_limit_queue_size(ap->dap);
786 if (retval != ERROR_OK)
787 return retval;
788
789 retval = jtag_check_reconnect(ap->dap);
790 if (retval != ERROR_OK)
791 return retval;
792
793 retval = jtag_ap_q_bankselect(ap, reg);
794 if (retval != ERROR_OK)
795 return retval;
796
797 retval = adi_jtag_dp_scan_u32(ap->dap, JTAG_DP_APACC, reg,
798 DPAP_READ, 0, ap->dap->last_read, ap->memaccess_tck, NULL);
799 ap->dap->last_read = data;
800
801 return retval;
802 }
803
804 static int jtag_ap_q_write(struct adiv5_ap *ap, unsigned reg,
805 uint32_t data)
806 {
807 int retval = jtag_limit_queue_size(ap->dap);
808 if (retval != ERROR_OK)
809 return retval;
810
811 retval = jtag_check_reconnect(ap->dap);
812 if (retval != ERROR_OK)
813 return retval;
814
815 retval = jtag_ap_q_bankselect(ap, reg);
816 if (retval != ERROR_OK)
817 return retval;
818
819 retval = adi_jtag_dp_scan_u32(ap->dap, JTAG_DP_APACC, reg,
820 DPAP_WRITE, data, ap->dap->last_read, ap->memaccess_tck, NULL);
821 ap->dap->last_read = NULL;
822 return retval;
823 }
824
825 static int jtag_ap_q_abort(struct adiv5_dap *dap, uint8_t *ack)
826 {
827 /* for JTAG, this is the only valid ABORT register operation */
828 int retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_ABORT,
829 0, DPAP_WRITE, 1, NULL, 0, NULL);
830 if (retval != ERROR_OK)
831 return retval;
832
833 return jtag_execute_queue();
834 }
835
836 static int jtag_dp_run(struct adiv5_dap *dap)
837 {
838 int retval;
839 int retval2 = ERROR_OK;
840
841 retval = adi_jtag_finish_read(dap);
842 if (retval != ERROR_OK)
843 goto done;
844 retval2 = jtagdp_overrun_check(dap);
845 retval = jtagdp_transaction_endcheck(dap);
846
847 done:
848 return (retval2 != ERROR_OK) ? retval2 : retval;
849 }
850
851 static int jtag_dp_sync(struct adiv5_dap *dap)
852 {
853 return jtagdp_overrun_check(dap);
854 }
855
856 /* FIXME don't export ... just initialize as
857 * part of DAP setup
858 */
859 const struct dap_ops jtag_dp_ops = {
860 .connect = jtag_connect,
861 .send_sequence = jtag_send_sequence,
862 .queue_dp_read = jtag_dp_q_read,
863 .queue_dp_write = jtag_dp_q_write,
864 .queue_ap_read = jtag_ap_q_read,
865 .queue_ap_write = jtag_ap_q_write,
866 .queue_ap_abort = jtag_ap_q_abort,
867 .run = jtag_dp_run,
868 .sync = jtag_dp_sync,
869 .quit = jtag_quit,
870 };

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)