jtag/aice/aice_usb: remove unused constants
[fw/openocd] / src / jtag / aice / aice_usb.c
1 /***************************************************************************
2  *   Copyright (C) 2013 by Andes Technology                                *
3  *   Hsiangkai Wang <hkwang@andestech.com>                                 *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
19  ***************************************************************************/
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include <jtag/drivers/libusb_common.h>
25 #include <helper/log.h>
26 #include <helper/time_support.h>
27 #include <target/target.h>
28 #include <jtag/jtag.h>
29 #include <target/nds32_insn.h>
30 #include <target/nds32_reg.h>
31 #include "aice_usb.h"
32
33
34 /* Global USB buffers */
35 static uint8_t usb_in_buffer[AICE_IN_BUFFER_SIZE];
36 static uint8_t usb_out_buffer[AICE_OUT_BUFFER_SIZE];
37 static uint32_t jtag_clock;
38 static struct aice_usb_handler_s aice_handler;
39 /* AICE max retry times. If AICE command timeout, retry it. */
40 static int aice_max_retry_times = 50;
41 /* Default endian is little endian. */
42 static enum aice_target_endian data_endian;
43
44 /* Constants for AICE command format length */
45 static const int32_t AICE_FORMAT_HTDA = 3;
46 static const int32_t AICE_FORMAT_HTDC   = 7;
47 static const int32_t AICE_FORMAT_HTDMA = 4;
48 static const int32_t AICE_FORMAT_HTDMB = 8;
49 static const int32_t AICE_FORMAT_HTDMC = 8;
50 static const int32_t AICE_FORMAT_HTDMD = 12;
51 static const int32_t AICE_FORMAT_DTHA   = 6;
52 static const int32_t AICE_FORMAT_DTHB   = 2;
53 static const int32_t AICE_FORMAT_DTHMA = 8;
54 static const int32_t AICE_FORMAT_DTHMB = 4;
55
56 /* Constants for AICE command */
57 static const uint8_t AICE_CMD_SCAN_CHAIN = 0x00;
58 static const uint8_t AICE_CMD_T_READ_MISC = 0x20;
59 static const uint8_t AICE_CMD_T_READ_EDMSR = 0x21;
60 static const uint8_t AICE_CMD_T_READ_DTR = 0x22;
61 static const uint8_t AICE_CMD_T_READ_MEM_B = 0x24;
62 static const uint8_t AICE_CMD_T_READ_MEM_H = 0x25;
63 static const uint8_t AICE_CMD_T_READ_MEM = 0x26;
64 static const uint8_t AICE_CMD_T_FASTREAD_MEM = 0x27;
65 static const uint8_t AICE_CMD_T_WRITE_MISC = 0x28;
66 static const uint8_t AICE_CMD_T_WRITE_EDMSR     = 0x29;
67 static const uint8_t AICE_CMD_T_WRITE_DTR = 0x2A;
68 static const uint8_t AICE_CMD_T_WRITE_DIM = 0x2B;
69 static const uint8_t AICE_CMD_T_WRITE_MEM_B = 0x2C;
70 static const uint8_t AICE_CMD_T_WRITE_MEM_H = 0x2D;
71 static const uint8_t AICE_CMD_T_WRITE_MEM = 0x2E;
72 static const uint8_t AICE_CMD_T_FASTWRITE_MEM = 0x2F;
73 static const uint8_t AICE_CMD_T_EXECUTE = 0x3E;
74 static const uint8_t AICE_CMD_READ_CTRL = 0x50;
75 static const uint8_t AICE_CMD_WRITE_CTRL = 0x51;
76 static const uint8_t AICE_CMD_BATCH_BUFFER_READ = 0x60;
77 static const uint8_t AICE_CMD_READ_DTR_TO_BUFFER = 0x61;
78 static const uint8_t AICE_CMD_BATCH_BUFFER_WRITE = 0x68;
79 static const uint8_t AICE_CMD_WRITE_DTR_FROM_BUFFER = 0x69;
80
81 /***************************************************************************/
82 /* AICE commands' pack/unpack functions */
83 static void aice_pack_htda(uint8_t cmd_code, uint8_t extra_word_length,
84                 uint32_t address)
85 {
86         usb_out_buffer[0] = cmd_code;
87         usb_out_buffer[1] = extra_word_length;
88         usb_out_buffer[2] = (uint8_t)(address & 0xFF);
89 }
90
91 static void aice_pack_htdc(uint8_t cmd_code, uint8_t extra_word_length,
92                 uint32_t address, uint32_t word, enum aice_target_endian access_endian)
93 {
94         usb_out_buffer[0] = cmd_code;
95         usb_out_buffer[1] = extra_word_length;
96         usb_out_buffer[2] = (uint8_t)(address & 0xFF);
97         if (access_endian == AICE_BIG_ENDIAN) {
98                 usb_out_buffer[6] = (uint8_t)((word >> 24) & 0xFF);
99                 usb_out_buffer[5] = (uint8_t)((word >> 16) & 0xFF);
100                 usb_out_buffer[4] = (uint8_t)((word >> 8) & 0xFF);
101                 usb_out_buffer[3] = (uint8_t)(word & 0xFF);
102         } else {
103                 usb_out_buffer[3] = (uint8_t)((word >> 24) & 0xFF);
104                 usb_out_buffer[4] = (uint8_t)((word >> 16) & 0xFF);
105                 usb_out_buffer[5] = (uint8_t)((word >> 8) & 0xFF);
106                 usb_out_buffer[6] = (uint8_t)(word & 0xFF);
107         }
108 }
109
110 static void aice_pack_htdma(uint8_t cmd_code, uint8_t target_id,
111                 uint8_t extra_word_length, uint32_t address)
112 {
113         usb_out_buffer[0] = cmd_code;
114         usb_out_buffer[1] = target_id;
115         usb_out_buffer[2] = extra_word_length;
116         usb_out_buffer[3] = (uint8_t)(address & 0xFF);
117 }
118
119 static void aice_pack_htdmb(uint8_t cmd_code, uint8_t target_id,
120                 uint8_t extra_word_length, uint32_t address)
121 {
122         usb_out_buffer[0] = cmd_code;
123         usb_out_buffer[1] = target_id;
124         usb_out_buffer[2] = extra_word_length;
125         usb_out_buffer[3] = 0;
126         usb_out_buffer[4] = (uint8_t)((address >> 24) & 0xFF);
127         usb_out_buffer[5] = (uint8_t)((address >> 16) & 0xFF);
128         usb_out_buffer[6] = (uint8_t)((address >> 8) & 0xFF);
129         usb_out_buffer[7] = (uint8_t)(address & 0xFF);
130 }
131
132 static void aice_pack_htdmc(uint8_t cmd_code, uint8_t target_id,
133                 uint8_t extra_word_length, uint32_t address, uint32_t word,
134                 enum aice_target_endian access_endian)
135 {
136         usb_out_buffer[0] = cmd_code;
137         usb_out_buffer[1] = target_id;
138         usb_out_buffer[2] = extra_word_length;
139         usb_out_buffer[3] = (uint8_t)(address & 0xFF);
140         if (access_endian == AICE_BIG_ENDIAN) {
141                 usb_out_buffer[7] = (uint8_t)((word >> 24) & 0xFF);
142                 usb_out_buffer[6] = (uint8_t)((word >> 16) & 0xFF);
143                 usb_out_buffer[5] = (uint8_t)((word >> 8) & 0xFF);
144                 usb_out_buffer[4] = (uint8_t)(word & 0xFF);
145         } else {
146                 usb_out_buffer[4] = (uint8_t)((word >> 24) & 0xFF);
147                 usb_out_buffer[5] = (uint8_t)((word >> 16) & 0xFF);
148                 usb_out_buffer[6] = (uint8_t)((word >> 8) & 0xFF);
149                 usb_out_buffer[7] = (uint8_t)(word & 0xFF);
150         }
151 }
152
153 static void aice_pack_htdmc_multiple_data(uint8_t cmd_code, uint8_t target_id,
154                 uint8_t extra_word_length, uint32_t address, uint32_t *word,
155                 uint8_t num_of_words, enum aice_target_endian access_endian)
156 {
157         usb_out_buffer[0] = cmd_code;
158         usb_out_buffer[1] = target_id;
159         usb_out_buffer[2] = extra_word_length;
160         usb_out_buffer[3] = (uint8_t)(address & 0xFF);
161
162         uint8_t i;
163         for (i = 0 ; i < num_of_words ; i++, word++) {
164                 if (access_endian == AICE_BIG_ENDIAN) {
165                         usb_out_buffer[7 + i * 4] = (uint8_t)((*word >> 24) & 0xFF);
166                         usb_out_buffer[6 + i * 4] = (uint8_t)((*word >> 16) & 0xFF);
167                         usb_out_buffer[5 + i * 4] = (uint8_t)((*word >> 8) & 0xFF);
168                         usb_out_buffer[4 + i * 4] = (uint8_t)(*word & 0xFF);
169                 } else {
170                         usb_out_buffer[4 + i * 4] = (uint8_t)((*word >> 24) & 0xFF);
171                         usb_out_buffer[5 + i * 4] = (uint8_t)((*word >> 16) & 0xFF);
172                         usb_out_buffer[6 + i * 4] = (uint8_t)((*word >> 8) & 0xFF);
173                         usb_out_buffer[7 + i * 4] = (uint8_t)(*word & 0xFF);
174                 }
175         }
176 }
177
178 static void aice_pack_htdmd(uint8_t cmd_code, uint8_t target_id,
179                 uint8_t extra_word_length, uint32_t address, uint32_t word,
180                 enum aice_target_endian access_endian)
181 {
182         usb_out_buffer[0] = cmd_code;
183         usb_out_buffer[1] = target_id;
184         usb_out_buffer[2] = extra_word_length;
185         usb_out_buffer[3] = 0;
186         usb_out_buffer[4] = (uint8_t)((address >> 24) & 0xFF);
187         usb_out_buffer[5] = (uint8_t)((address >> 16) & 0xFF);
188         usb_out_buffer[6] = (uint8_t)((address >> 8) & 0xFF);
189         usb_out_buffer[7] = (uint8_t)(address & 0xFF);
190         if (access_endian == AICE_BIG_ENDIAN) {
191                 usb_out_buffer[11] = (uint8_t)((word >> 24) & 0xFF);
192                 usb_out_buffer[10] = (uint8_t)((word >> 16) & 0xFF);
193                 usb_out_buffer[9] = (uint8_t)((word >> 8) & 0xFF);
194                 usb_out_buffer[8] = (uint8_t)(word & 0xFF);
195         } else {
196                 usb_out_buffer[8] = (uint8_t)((word >> 24) & 0xFF);
197                 usb_out_buffer[9] = (uint8_t)((word >> 16) & 0xFF);
198                 usb_out_buffer[10] = (uint8_t)((word >> 8) & 0xFF);
199                 usb_out_buffer[11] = (uint8_t)(word & 0xFF);
200         }
201 }
202
203 static void aice_pack_htdmd_multiple_data(uint8_t cmd_code, uint8_t target_id,
204                 uint8_t extra_word_length, uint32_t address, const uint8_t *word,
205                 enum aice_target_endian access_endian)
206 {
207         usb_out_buffer[0] = cmd_code;
208         usb_out_buffer[1] = target_id;
209         usb_out_buffer[2] = extra_word_length;
210         usb_out_buffer[3] = 0;
211         usb_out_buffer[4] = (uint8_t)((address >> 24) & 0xFF);
212         usb_out_buffer[5] = (uint8_t)((address >> 16) & 0xFF);
213         usb_out_buffer[6] = (uint8_t)((address >> 8) & 0xFF);
214         usb_out_buffer[7] = (uint8_t)(address & 0xFF);
215
216         uint32_t i;
217         /* num_of_words may be over 0xFF, so use uint32_t */
218         uint32_t num_of_words = extra_word_length + 1;
219
220         for (i = 0 ; i < num_of_words ; i++, word += 4) {
221                 if (access_endian == AICE_BIG_ENDIAN) {
222                         usb_out_buffer[11 + i * 4] = word[3];
223                         usb_out_buffer[10 + i * 4] = word[2];
224                         usb_out_buffer[9 + i * 4] = word[1];
225                         usb_out_buffer[8 + i * 4] = word[0];
226                 } else {
227                         usb_out_buffer[8 + i * 4] = word[3];
228                         usb_out_buffer[9 + i * 4] = word[2];
229                         usb_out_buffer[10 + i * 4] = word[1];
230                         usb_out_buffer[11 + i * 4] = word[0];
231                 }
232         }
233 }
234
235 static void aice_unpack_dtha(uint8_t *cmd_ack_code, uint8_t *extra_word_length,
236                 uint32_t *word, enum aice_target_endian access_endian)
237 {
238         *cmd_ack_code = usb_in_buffer[0];
239         *extra_word_length = usb_in_buffer[1];
240
241         if (access_endian == AICE_BIG_ENDIAN) {
242                 *word = (usb_in_buffer[5] << 24) |
243                         (usb_in_buffer[4] << 16) |
244                         (usb_in_buffer[3] << 8) |
245                         (usb_in_buffer[2]);
246         } else {
247                 *word = (usb_in_buffer[2] << 24) |
248                         (usb_in_buffer[3] << 16) |
249                         (usb_in_buffer[4] << 8) |
250                         (usb_in_buffer[5]);
251         }
252 }
253
254 static void aice_unpack_dtha_multiple_data(uint8_t *cmd_ack_code,
255                 uint8_t *extra_word_length, uint32_t *word, uint8_t num_of_words,
256                 enum aice_target_endian access_endian)
257 {
258         *cmd_ack_code = usb_in_buffer[0];
259         *extra_word_length = usb_in_buffer[1];
260
261         uint8_t i;
262         for (i = 0 ; i < num_of_words ; i++, word++) {
263                 if (access_endian == AICE_BIG_ENDIAN) {
264                         *word = (usb_in_buffer[5 + i * 4] << 24) |
265                                 (usb_in_buffer[4 + i * 4] << 16) |
266                                 (usb_in_buffer[3 + i * 4] << 8) |
267                                 (usb_in_buffer[2 + i * 4]);
268                 } else {
269                         *word = (usb_in_buffer[2 + i * 4] << 24) |
270                                 (usb_in_buffer[3 + i * 4] << 16) |
271                                 (usb_in_buffer[4 + i * 4] << 8) |
272                                 (usb_in_buffer[5 + i * 4]);
273                 }
274         }
275 }
276
277 static void aice_unpack_dthb(uint8_t *cmd_ack_code, uint8_t *extra_word_length)
278 {
279         *cmd_ack_code = usb_in_buffer[0];
280         *extra_word_length = usb_in_buffer[1];
281 }
282
283 static void aice_unpack_dthma(uint8_t *cmd_ack_code, uint8_t *target_id,
284                 uint8_t *extra_word_length, uint32_t *word,
285                 enum aice_target_endian access_endian)
286 {
287         *cmd_ack_code = usb_in_buffer[0];
288         *target_id = usb_in_buffer[1];
289         *extra_word_length = usb_in_buffer[2];
290         if (access_endian == AICE_BIG_ENDIAN) {
291                 *word = (usb_in_buffer[7] << 24) |
292                         (usb_in_buffer[6] << 16) |
293                         (usb_in_buffer[5] << 8) |
294                         (usb_in_buffer[4]);
295         } else {
296                 *word = (usb_in_buffer[4] << 24) |
297                         (usb_in_buffer[5] << 16) |
298                         (usb_in_buffer[6] << 8) |
299                         (usb_in_buffer[7]);
300         }
301 }
302
303 static void aice_unpack_dthma_multiple_data(uint8_t *cmd_ack_code,
304                 uint8_t *target_id, uint8_t *extra_word_length, uint8_t *word,
305                 enum aice_target_endian access_endian)
306 {
307         *cmd_ack_code = usb_in_buffer[0];
308         *target_id = usb_in_buffer[1];
309         *extra_word_length = usb_in_buffer[2];
310         if (access_endian == AICE_BIG_ENDIAN) {
311                 word[0] = usb_in_buffer[4];
312                 word[1] = usb_in_buffer[5];
313                 word[2] = usb_in_buffer[6];
314                 word[3] = usb_in_buffer[7];
315         } else {
316                 word[0] = usb_in_buffer[7];
317                 word[1] = usb_in_buffer[6];
318                 word[2] = usb_in_buffer[5];
319                 word[3] = usb_in_buffer[4];
320         }
321         word += 4;
322
323         uint8_t i;
324         for (i = 0; i < *extra_word_length; i++) {
325                 if (access_endian == AICE_BIG_ENDIAN) {
326                         word[0] = usb_in_buffer[8 + i * 4];
327                         word[1] = usb_in_buffer[9 + i * 4];
328                         word[2] = usb_in_buffer[10 + i * 4];
329                         word[3] = usb_in_buffer[11 + i * 4];
330                 } else {
331                         word[0] = usb_in_buffer[11 + i * 4];
332                         word[1] = usb_in_buffer[10 + i * 4];
333                         word[2] = usb_in_buffer[9 + i * 4];
334                         word[3] = usb_in_buffer[8 + i * 4];
335                 }
336                 word += 4;
337         }
338 }
339
340 static void aice_unpack_dthmb(uint8_t *cmd_ack_code, uint8_t *target_id,
341                 uint8_t *extra_word_length)
342 {
343         *cmd_ack_code = usb_in_buffer[0];
344         *target_id = usb_in_buffer[1];
345         *extra_word_length = usb_in_buffer[2];
346 }
347
348 /***************************************************************************/
349 /* End of AICE commands' pack/unpack functions */
350
351 /* calls the given usb_bulk_* function, allowing for the data to
352  * trickle in with some timeouts  */
353 static int usb_bulk_with_retries(
354                         int (*f)(jtag_libusb_device_handle *, int, char *, int, int),
355                         jtag_libusb_device_handle *dev, int ep,
356                         char *bytes, int size, int timeout)
357 {
358         int tries = 3, count = 0;
359
360         while (tries && (count < size)) {
361                 int result = f(dev, ep, bytes + count, size - count, timeout);
362                 if (result > 0)
363                         count += result;
364                 else if ((-ETIMEDOUT != result) || !--tries)
365                         return result;
366         }
367         return count;
368 }
369
370 static int wrap_usb_bulk_write(jtag_libusb_device_handle *dev, int ep,
371                 char *buff, int size, int timeout)
372 {
373         /* usb_bulk_write() takes const char *buff */
374         return jtag_libusb_bulk_write(dev, ep, buff, size, timeout);
375 }
376
377 static inline int usb_bulk_write_ex(jtag_libusb_device_handle *dev, int ep,
378                 char *bytes, int size, int timeout)
379 {
380         return usb_bulk_with_retries(&wrap_usb_bulk_write,
381                         dev, ep, bytes, size, timeout);
382 }
383
384 static inline int usb_bulk_read_ex(jtag_libusb_device_handle *dev, int ep,
385                 char *bytes, int size, int timeout)
386 {
387         return usb_bulk_with_retries(&jtag_libusb_bulk_read,
388                         dev, ep, bytes, size, timeout);
389 }
390
391 /* Write data from out_buffer to USB. */
392 static int aice_usb_write(uint8_t *out_buffer, int out_length)
393 {
394         int result;
395
396         if (out_length > AICE_OUT_BUFFER_SIZE) {
397                 LOG_ERROR("aice_write illegal out_length=%i (max=%i)",
398                                 out_length, AICE_OUT_BUFFER_SIZE);
399                 return -1;
400         }
401
402         result = usb_bulk_write_ex(aice_handler.usb_handle, aice_handler.usb_write_ep,
403                         (char *)out_buffer, out_length, AICE_USB_TIMEOUT);
404
405         DEBUG_JTAG_IO("aice_usb_write, out_length = %i, result = %i",
406                         out_length, result);
407
408         return result;
409 }
410
411 /* Read data from USB into in_buffer. */
412 static int aice_usb_read(uint8_t *in_buffer, int expected_size)
413 {
414         int32_t result = usb_bulk_read_ex(aice_handler.usb_handle, aice_handler.usb_read_ep,
415                         (char *)in_buffer, expected_size, AICE_USB_TIMEOUT);
416
417         DEBUG_JTAG_IO("aice_usb_read, result = %" PRId32, result);
418
419         return result;
420 }
421
422 static uint8_t usb_out_packets_buffer[AICE_OUT_PACKETS_BUFFER_SIZE];
423 static uint8_t usb_in_packets_buffer[AICE_IN_PACKETS_BUFFER_SIZE];
424 static uint32_t usb_out_packets_buffer_length;
425 static uint32_t usb_in_packets_buffer_length;
426 static enum aice_command_mode aice_command_mode;
427
428 static int aice_batch_buffer_write(uint8_t buf_index, const uint8_t *word,
429                 uint32_t num_of_words);
430
431 static int aice_usb_packet_flush(void)
432 {
433         if (usb_out_packets_buffer_length == 0)
434                 return 0;
435
436         if (AICE_COMMAND_MODE_PACK == aice_command_mode) {
437                 LOG_DEBUG("Flush usb packets (AICE_COMMAND_MODE_PACK)");
438
439                 if (aice_usb_write(usb_out_packets_buffer,
440                                         usb_out_packets_buffer_length) < 0)
441                         return ERROR_FAIL;
442
443                 if (aice_usb_read(usb_in_packets_buffer,
444                                         usb_in_packets_buffer_length) < 0)
445                         return ERROR_FAIL;
446
447                 usb_out_packets_buffer_length = 0;
448                 usb_in_packets_buffer_length = 0;
449
450         } else if (AICE_COMMAND_MODE_BATCH == aice_command_mode) {
451                 LOG_DEBUG("Flush usb packets (AICE_COMMAND_MODE_BATCH)");
452
453                 /* use BATCH_BUFFER_WRITE to fill command-batch-buffer */
454                 if (aice_batch_buffer_write(AICE_BATCH_COMMAND_BUFFER_0,
455                                 usb_out_packets_buffer,
456                                 (usb_out_packets_buffer_length + 3) / 4) != ERROR_OK)
457                         return ERROR_FAIL;
458
459                 usb_out_packets_buffer_length = 0;
460                 usb_in_packets_buffer_length = 0;
461
462                 /* enable BATCH command */
463                 aice_command_mode = AICE_COMMAND_MODE_NORMAL;
464                 if (aice_write_ctrl(AICE_WRITE_CTRL_BATCH_CTRL, 0x80000000) != ERROR_OK)
465                         return ERROR_FAIL;
466                 aice_command_mode = AICE_COMMAND_MODE_BATCH;
467
468                 /* wait 1 second (AICE bug, workaround) */
469                 alive_sleep(1000);
470
471                 /* check status */
472                 uint32_t i;
473                 uint32_t batch_status;
474
475                 i = 0;
476                 while (1) {
477                         aice_read_ctrl(AICE_READ_CTRL_BATCH_STATUS, &batch_status);
478
479                         if (batch_status & 0x1)
480                                 return ERROR_OK;
481                         else if (batch_status & 0xE)
482                                 return ERROR_FAIL;
483
484                         if ((i % 30) == 0)
485                                 keep_alive();
486
487                         i++;
488                 }
489         }
490
491         return ERROR_OK;
492 }
493
494 static int aice_usb_packet_append(uint8_t *out_buffer, int out_length, int in_length)
495 {
496         uint32_t max_packet_size = AICE_OUT_PACKETS_BUFFER_SIZE;
497
498         if (AICE_COMMAND_MODE_PACK == aice_command_mode) {
499                 max_packet_size = AICE_OUT_PACK_COMMAND_SIZE;
500         } else if (AICE_COMMAND_MODE_BATCH == aice_command_mode) {
501                 max_packet_size = AICE_OUT_BATCH_COMMAND_SIZE;
502         } else {
503                 /* AICE_COMMAND_MODE_NORMAL */
504                 if (aice_usb_packet_flush() != ERROR_OK)
505                         return ERROR_FAIL;
506         }
507
508         if (usb_out_packets_buffer_length + out_length > max_packet_size)
509                 if (aice_usb_packet_flush() != ERROR_OK) {
510                         LOG_DEBUG("Flush usb packets failed");
511                         return ERROR_FAIL;
512                 }
513
514         LOG_DEBUG("Append usb packets 0x%02x", out_buffer[0]);
515
516         memcpy(usb_out_packets_buffer + usb_out_packets_buffer_length, out_buffer, out_length);
517         usb_out_packets_buffer_length += out_length;
518         usb_in_packets_buffer_length += in_length;
519
520         return ERROR_OK;
521 }
522
523 /***************************************************************************/
524 /* AICE commands */
525 static int aice_reset_box(void)
526 {
527         if (aice_write_ctrl(AICE_WRITE_CTRL_CLEAR_TIMEOUT_STATUS, 0x1) != ERROR_OK)
528                 return ERROR_FAIL;
529
530         /* turn off FASTMODE */
531         uint32_t pin_status;
532         if (aice_read_ctrl(AICE_READ_CTRL_GET_JTAG_PIN_STATUS, &pin_status)
533                         != ERROR_OK)
534                 return ERROR_FAIL;
535
536         if (aice_write_ctrl(AICE_WRITE_CTRL_JTAG_PIN_STATUS, pin_status & (~0x2))
537                         != ERROR_OK)
538                 return ERROR_FAIL;
539
540         return ERROR_OK;
541 }
542
543 static int aice_scan_chain(uint32_t *id_codes, uint8_t *num_of_ids)
544 {
545         int32_t result;
546         int retry_times = 0;
547
548         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
549                 (AICE_COMMAND_MODE_BATCH == aice_command_mode))
550                 aice_usb_packet_flush();
551
552         do {
553                 aice_pack_htda(AICE_CMD_SCAN_CHAIN, 0x0F, 0x0);
554
555                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDA);
556
557                 LOG_DEBUG("SCAN_CHAIN, length: 0x0F");
558
559                 /** TODO: modify receive length */
560                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHA);
561                 if (AICE_FORMAT_DTHA != result) {
562                         LOG_ERROR("aice_usb_read failed (requested=%" PRIu32 ", result=%" PRId32 ")",
563                                         AICE_FORMAT_DTHA, result);
564                         return ERROR_FAIL;
565                 }
566
567                 uint8_t cmd_ack_code;
568                 aice_unpack_dtha_multiple_data(&cmd_ack_code, num_of_ids, id_codes,
569                                 0x10, AICE_LITTLE_ENDIAN);
570
571                 if (cmd_ack_code != AICE_CMD_SCAN_CHAIN) {
572
573                         if (retry_times > aice_max_retry_times) {
574                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
575                                                 AICE_CMD_SCAN_CHAIN, cmd_ack_code);
576                                 return ERROR_FAIL;
577                         }
578
579                         /* clear timeout and retry */
580                         if (aice_reset_box() != ERROR_OK)
581                                 return ERROR_FAIL;
582
583                         retry_times++;
584                         continue;
585                 }
586
587                 LOG_DEBUG("SCAN_CHAIN response, # of IDs: %" PRIu8, *num_of_ids);
588
589                 if (*num_of_ids == 0xFF) {
590                         LOG_ERROR("No target connected");
591                         return ERROR_FAIL;
592                 } else if (*num_of_ids == AICE_MAX_NUM_CORE) {
593                         LOG_INFO("The ice chain over 16 targets");
594                 } else {
595                         (*num_of_ids)++;
596                 }
597                 break;
598         } while (1);
599
600         return ERROR_OK;
601 }
602
603 int aice_read_ctrl(uint32_t address, uint32_t *data)
604 {
605         int32_t result;
606
607         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
608                 (AICE_COMMAND_MODE_BATCH == aice_command_mode))
609                 aice_usb_packet_flush();
610
611         aice_pack_htda(AICE_CMD_READ_CTRL, 0, address);
612
613         aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDA);
614
615         LOG_DEBUG("READ_CTRL, address: 0x%" PRIx32, address);
616
617         result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHA);
618         if (AICE_FORMAT_DTHA != result) {
619                 LOG_ERROR("aice_usb_read failed (requested=%" PRIu32 ", result=%" PRId32 ")",
620                                 AICE_FORMAT_DTHA, result);
621                 return ERROR_FAIL;
622         }
623
624         uint8_t cmd_ack_code;
625         uint8_t extra_length;
626         aice_unpack_dtha(&cmd_ack_code, &extra_length, data, AICE_LITTLE_ENDIAN);
627
628         LOG_DEBUG("READ_CTRL response, data: 0x%" PRIx32, *data);
629
630         if (cmd_ack_code != AICE_CMD_READ_CTRL) {
631                 LOG_ERROR("aice command error (command=0x%" PRIx32 ", response=0x%" PRIx8 ")",
632                                 (uint32_t)AICE_CMD_READ_CTRL, cmd_ack_code);
633                 return ERROR_FAIL;
634         }
635
636         return ERROR_OK;
637 }
638
639 int aice_write_ctrl(uint32_t address, uint32_t data)
640 {
641         int32_t result;
642
643         if (AICE_COMMAND_MODE_PACK == aice_command_mode) {
644                 aice_usb_packet_flush();
645         } else if (AICE_COMMAND_MODE_BATCH == aice_command_mode) {
646                 aice_pack_htdc(AICE_CMD_WRITE_CTRL, 0, address, data, AICE_LITTLE_ENDIAN);
647                 return aice_usb_packet_append(usb_out_buffer, AICE_FORMAT_HTDC,
648                                 AICE_FORMAT_DTHB);
649         }
650
651         aice_pack_htdc(AICE_CMD_WRITE_CTRL, 0, address, data, AICE_LITTLE_ENDIAN);
652
653         aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDC);
654
655         LOG_DEBUG("WRITE_CTRL, address: 0x%" PRIx32 ", data: 0x%" PRIx32, address, data);
656
657         result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHB);
658         if (AICE_FORMAT_DTHB != result) {
659                 LOG_ERROR("aice_usb_read failed (requested=%" PRIu32 ", result=%" PRId32 ")",
660                                 AICE_FORMAT_DTHB, result);
661                 return ERROR_FAIL;
662         }
663
664         uint8_t cmd_ack_code;
665         uint8_t extra_length;
666         aice_unpack_dthb(&cmd_ack_code, &extra_length);
667
668         LOG_DEBUG("WRITE_CTRL response");
669
670         if (cmd_ack_code != AICE_CMD_WRITE_CTRL) {
671                 LOG_ERROR("aice command error (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
672                                 AICE_CMD_WRITE_CTRL, cmd_ack_code);
673                 return ERROR_FAIL;
674         }
675
676         return ERROR_OK;
677 }
678
679 int aice_read_dtr(uint8_t target_id, uint32_t *data)
680 {
681         int32_t result;
682         int retry_times = 0;
683
684         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
685                 (AICE_COMMAND_MODE_BATCH == aice_command_mode))
686                 aice_usb_packet_flush();
687
688         do {
689                 aice_pack_htdma(AICE_CMD_T_READ_DTR, target_id, 0, 0);
690
691                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMA);
692
693                 LOG_DEBUG("READ_DTR, COREID: %" PRIu8, target_id);
694
695                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMA);
696                 if (AICE_FORMAT_DTHMA != result) {
697                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
698                                         AICE_FORMAT_DTHMA, result);
699                         return ERROR_FAIL;
700                 }
701
702                 uint8_t cmd_ack_code;
703                 uint8_t extra_length;
704                 uint8_t res_target_id;
705                 aice_unpack_dthma(&cmd_ack_code, &res_target_id, &extra_length,
706                                 data, AICE_LITTLE_ENDIAN);
707
708                 if (cmd_ack_code == AICE_CMD_T_READ_DTR) {
709                         LOG_DEBUG("READ_DTR response, data: 0x%" PRIx32, *data);
710                         break;
711                 } else {
712
713                         if (retry_times > aice_max_retry_times) {
714                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
715                                                 AICE_CMD_T_READ_DTR, cmd_ack_code);
716                                 return ERROR_FAIL;
717                         }
718
719                         /* clear timeout and retry */
720                         if (aice_reset_box() != ERROR_OK)
721                                 return ERROR_FAIL;
722
723                         retry_times++;
724                 }
725         } while (1);
726
727         return ERROR_OK;
728 }
729
730 int aice_read_dtr_to_buffer(uint8_t target_id, uint32_t buffer_idx)
731 {
732         int32_t result;
733         int retry_times = 0;
734
735         if (AICE_COMMAND_MODE_PACK == aice_command_mode) {
736                 aice_usb_packet_flush();
737         } else if (AICE_COMMAND_MODE_BATCH == aice_command_mode) {
738                 aice_pack_htdma(AICE_CMD_READ_DTR_TO_BUFFER, target_id, 0, buffer_idx);
739                 return aice_usb_packet_append(usb_out_buffer, AICE_FORMAT_HTDMA,
740                                 AICE_FORMAT_DTHMB);
741         }
742
743         do {
744                 aice_pack_htdma(AICE_CMD_READ_DTR_TO_BUFFER, target_id, 0, buffer_idx);
745
746                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMA);
747
748                 LOG_DEBUG("READ_DTR_TO_BUFFER, COREID: %" PRIu8, target_id);
749
750                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
751                 if (AICE_FORMAT_DTHMB != result) {
752                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")", AICE_FORMAT_DTHMB, result);
753                         return ERROR_FAIL;
754                 }
755
756                 uint8_t cmd_ack_code;
757                 uint8_t extra_length;
758                 uint8_t res_target_id;
759                 aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
760
761                 if (cmd_ack_code == AICE_CMD_READ_DTR_TO_BUFFER) {
762                         break;
763                 } else {
764                         if (retry_times > aice_max_retry_times) {
765                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
766                                                 AICE_CMD_READ_DTR_TO_BUFFER, cmd_ack_code);
767
768                                 return ERROR_FAIL;
769                         }
770
771                         /* clear timeout and retry */
772                         if (aice_reset_box() != ERROR_OK)
773                                 return ERROR_FAIL;
774
775                         retry_times++;
776                 }
777         } while (1);
778
779         return ERROR_OK;
780 }
781
782 int aice_write_dtr(uint8_t target_id, uint32_t data)
783 {
784         int32_t result;
785         int retry_times = 0;
786
787         if (AICE_COMMAND_MODE_PACK == aice_command_mode) {
788                 aice_usb_packet_flush();
789         } else if (AICE_COMMAND_MODE_BATCH == aice_command_mode) {
790                 aice_pack_htdmc(AICE_CMD_T_WRITE_DTR, target_id, 0, 0, data, AICE_LITTLE_ENDIAN);
791                 return aice_usb_packet_append(usb_out_buffer, AICE_FORMAT_HTDMC,
792                                 AICE_FORMAT_DTHMB);
793         }
794
795         do {
796                 aice_pack_htdmc(AICE_CMD_T_WRITE_DTR, target_id, 0, 0, data, AICE_LITTLE_ENDIAN);
797
798                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMC);
799
800                 LOG_DEBUG("WRITE_DTR, COREID: %" PRIu8 ", data: 0x%" PRIx32, target_id, data);
801
802                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
803                 if (AICE_FORMAT_DTHMB != result) {
804                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")", AICE_FORMAT_DTHMB, result);
805                         return ERROR_FAIL;
806                 }
807
808                 uint8_t cmd_ack_code;
809                 uint8_t extra_length;
810                 uint8_t res_target_id;
811                 aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
812
813                 if (cmd_ack_code == AICE_CMD_T_WRITE_DTR) {
814                         LOG_DEBUG("WRITE_DTR response");
815                         break;
816                 } else {
817                         if (retry_times > aice_max_retry_times) {
818                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
819                                                 AICE_CMD_T_WRITE_DTR, cmd_ack_code);
820
821                                 return ERROR_FAIL;
822                         }
823
824                         /* clear timeout and retry */
825                         if (aice_reset_box() != ERROR_OK)
826                                 return ERROR_FAIL;
827
828                         retry_times++;
829                 }
830         } while (1);
831
832         return ERROR_OK;
833 }
834
835 int aice_write_dtr_from_buffer(uint8_t target_id, uint32_t buffer_idx)
836 {
837         int32_t result;
838         int retry_times = 0;
839
840         if (AICE_COMMAND_MODE_PACK == aice_command_mode) {
841                 aice_usb_packet_flush();
842         } else if (AICE_COMMAND_MODE_BATCH == aice_command_mode) {
843                 aice_pack_htdma(AICE_CMD_WRITE_DTR_FROM_BUFFER, target_id, 0, buffer_idx);
844                 return aice_usb_packet_append(usb_out_buffer, AICE_FORMAT_HTDMA,
845                                 AICE_FORMAT_DTHMB);
846         }
847
848         do {
849                 aice_pack_htdma(AICE_CMD_WRITE_DTR_FROM_BUFFER, target_id, 0, buffer_idx);
850
851                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMA);
852
853                 LOG_DEBUG("WRITE_DTR_FROM_BUFFER, COREID: %" PRIu8 "", target_id);
854
855                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
856                 if (AICE_FORMAT_DTHMB != result) {
857                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")", AICE_FORMAT_DTHMB, result);
858                         return ERROR_FAIL;
859                 }
860
861                 uint8_t cmd_ack_code;
862                 uint8_t extra_length;
863                 uint8_t res_target_id;
864                 aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
865
866                 if (cmd_ack_code == AICE_CMD_WRITE_DTR_FROM_BUFFER) {
867                         break;
868                 } else {
869                         if (retry_times > aice_max_retry_times) {
870                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
871                                                 AICE_CMD_WRITE_DTR_FROM_BUFFER, cmd_ack_code);
872
873                                 return ERROR_FAIL;
874                         }
875
876                         /* clear timeout and retry */
877                         if (aice_reset_box() != ERROR_OK)
878                                 return ERROR_FAIL;
879
880                         retry_times++;
881                 }
882         } while (1);
883
884         return ERROR_OK;
885 }
886
887 int aice_read_misc(uint8_t target_id, uint32_t address, uint32_t *data)
888 {
889         int32_t result;
890         int retry_times = 0;
891
892         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
893                 (AICE_COMMAND_MODE_BATCH == aice_command_mode))
894                 aice_usb_packet_flush();
895
896         do {
897                 aice_pack_htdma(AICE_CMD_T_READ_MISC, target_id, 0, address);
898
899                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMA);
900
901                 LOG_DEBUG("READ_MISC, COREID: %" PRIu8 ", address: 0x%" PRIx32, target_id, address);
902
903                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMA);
904                 if (AICE_FORMAT_DTHMA != result) {
905                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
906                                         AICE_FORMAT_DTHMA, result);
907                         return ERROR_AICE_DISCONNECT;
908                 }
909
910                 uint8_t cmd_ack_code;
911                 uint8_t extra_length;
912                 uint8_t res_target_id;
913                 aice_unpack_dthma(&cmd_ack_code, &res_target_id, &extra_length,
914                                 data, AICE_LITTLE_ENDIAN);
915
916                 if (cmd_ack_code == AICE_CMD_T_READ_MISC) {
917                         LOG_DEBUG("READ_MISC response, data: 0x%" PRIx32, *data);
918                         break;
919                 } else {
920                         if (retry_times > aice_max_retry_times) {
921                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
922                                                 AICE_CMD_T_READ_MISC, cmd_ack_code);
923                                 return ERROR_FAIL;
924                         }
925
926                         /* clear timeout and retry */
927                         if (aice_reset_box() != ERROR_OK)
928                                 return ERROR_FAIL;
929
930                         retry_times++;
931                 }
932         } while (1);
933
934         return ERROR_OK;
935 }
936
937 int aice_write_misc(uint8_t target_id, uint32_t address, uint32_t data)
938 {
939         int32_t result;
940         int retry_times = 0;
941
942         if (AICE_COMMAND_MODE_PACK == aice_command_mode) {
943                 aice_usb_packet_flush();
944         } else if (AICE_COMMAND_MODE_BATCH == aice_command_mode) {
945                 aice_pack_htdmc(AICE_CMD_T_WRITE_MISC, target_id, 0, address, data,
946                                 AICE_LITTLE_ENDIAN);
947                 return aice_usb_packet_append(usb_out_buffer, AICE_FORMAT_HTDMC,
948                                 AICE_FORMAT_DTHMB);
949         }
950
951         do {
952                 aice_pack_htdmc(AICE_CMD_T_WRITE_MISC, target_id, 0, address,
953                                 data, AICE_LITTLE_ENDIAN);
954
955                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMC);
956
957                 LOG_DEBUG("WRITE_MISC, COREID: %" PRIu8 ", address: 0x%" PRIx32 ", data: 0x%" PRIx32,
958                                 target_id, address, data);
959
960                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
961                 if (AICE_FORMAT_DTHMB != result) {
962                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
963                                         AICE_FORMAT_DTHMB, result);
964                         return ERROR_FAIL;
965                 }
966
967                 uint8_t cmd_ack_code;
968                 uint8_t extra_length;
969                 uint8_t res_target_id;
970                 aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
971
972                 if (cmd_ack_code == AICE_CMD_T_WRITE_MISC) {
973                         LOG_DEBUG("WRITE_MISC response");
974                         break;
975                 } else {
976                         if (retry_times > aice_max_retry_times) {
977                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
978                                                 AICE_CMD_T_WRITE_MISC, cmd_ack_code);
979
980                                 return ERROR_FAIL;
981                         }
982
983                         /* clear timeout and retry */
984                         if (aice_reset_box() != ERROR_OK)
985                                 return ERROR_FAIL;
986
987                         retry_times++;
988                 }
989         } while (1);
990
991         return ERROR_OK;
992 }
993
994 int aice_read_edmsr(uint8_t target_id, uint32_t address, uint32_t *data)
995 {
996         int32_t result;
997         int retry_times = 0;
998
999         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
1000                 (AICE_COMMAND_MODE_BATCH == aice_command_mode))
1001                 aice_usb_packet_flush();
1002
1003         do {
1004                 aice_pack_htdma(AICE_CMD_T_READ_EDMSR, target_id, 0, address);
1005
1006                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMA);
1007
1008                 LOG_DEBUG("READ_EDMSR, COREID: %" PRIu8 ", address: 0x%" PRIx32, target_id, address);
1009
1010                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMA);
1011                 if (AICE_FORMAT_DTHMA != result) {
1012                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1013                                         AICE_FORMAT_DTHMA, result);
1014                         return ERROR_FAIL;
1015                 }
1016
1017                 uint8_t cmd_ack_code;
1018                 uint8_t extra_length;
1019                 uint8_t res_target_id;
1020                 aice_unpack_dthma(&cmd_ack_code, &res_target_id, &extra_length,
1021                                 data, AICE_LITTLE_ENDIAN);
1022
1023                 if (cmd_ack_code == AICE_CMD_T_READ_EDMSR) {
1024                         LOG_DEBUG("READ_EDMSR response, data: 0x%" PRIx32, *data);
1025                         break;
1026                 } else {
1027                         if (retry_times > aice_max_retry_times) {
1028                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1029                                                 AICE_CMD_T_READ_EDMSR, cmd_ack_code);
1030
1031                                 return ERROR_FAIL;
1032                         }
1033
1034                         /* clear timeout and retry */
1035                         if (aice_reset_box() != ERROR_OK)
1036                                 return ERROR_FAIL;
1037
1038                         retry_times++;
1039                 }
1040         } while (1);
1041
1042         return ERROR_OK;
1043 }
1044
1045 int aice_write_edmsr(uint8_t target_id, uint32_t address, uint32_t data)
1046 {
1047         int32_t result;
1048         int retry_times = 0;
1049
1050         if (AICE_COMMAND_MODE_PACK == aice_command_mode) {
1051                 aice_usb_packet_flush();
1052         } else if (AICE_COMMAND_MODE_BATCH == aice_command_mode) {
1053                 aice_pack_htdmc(AICE_CMD_T_WRITE_EDMSR, target_id, 0, address, data,
1054                                 AICE_LITTLE_ENDIAN);
1055                 return aice_usb_packet_append(usb_out_buffer, AICE_FORMAT_HTDMC,
1056                                 AICE_FORMAT_DTHMB);
1057         }
1058
1059         do {
1060                 aice_pack_htdmc(AICE_CMD_T_WRITE_EDMSR, target_id, 0, address,
1061                                 data, AICE_LITTLE_ENDIAN);
1062
1063                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMC);
1064
1065                 LOG_DEBUG("WRITE_EDMSR, COREID: %" PRIu8 ", address: 0x%" PRIx32 ", data: 0x%" PRIx32,
1066                                 target_id, address, data);
1067
1068                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
1069                 if (AICE_FORMAT_DTHMB != result) {
1070                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1071                                         AICE_FORMAT_DTHMB, result);
1072                         return ERROR_FAIL;
1073                 }
1074
1075                 uint8_t cmd_ack_code;
1076                 uint8_t extra_length;
1077                 uint8_t res_target_id;
1078                 aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
1079
1080                 if (cmd_ack_code == AICE_CMD_T_WRITE_EDMSR) {
1081                         LOG_DEBUG("WRITE_EDMSR response");
1082                         break;
1083                 } else {
1084                         if (retry_times > aice_max_retry_times) {
1085                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1086                                                 AICE_CMD_T_WRITE_EDMSR, cmd_ack_code);
1087
1088                                 return ERROR_FAIL;
1089                         }
1090
1091                         /* clear timeout and retry */
1092                         if (aice_reset_box() != ERROR_OK)
1093                                 return ERROR_FAIL;
1094
1095                         retry_times++;
1096                 }
1097         } while (1);
1098
1099         return ERROR_OK;
1100 }
1101
1102 static int aice_switch_to_big_endian(uint32_t *word, uint8_t num_of_words)
1103 {
1104         uint32_t tmp;
1105
1106         for (uint8_t i = 0 ; i < num_of_words ; i++) {
1107                 tmp = ((word[i] >> 24) & 0x000000FF) |
1108                         ((word[i] >>  8) & 0x0000FF00) |
1109                         ((word[i] <<  8) & 0x00FF0000) |
1110                         ((word[i] << 24) & 0xFF000000);
1111                 word[i] = tmp;
1112         }
1113
1114         return ERROR_OK;
1115 }
1116
1117 static int aice_write_dim(uint8_t target_id, uint32_t *word, uint8_t num_of_words)
1118 {
1119         int32_t result;
1120         uint32_t big_endian_word[4];
1121         int retry_times = 0;
1122
1123         /** instruction is big-endian */
1124         memcpy(big_endian_word, word, sizeof(big_endian_word));
1125         aice_switch_to_big_endian(big_endian_word, num_of_words);
1126
1127         if (AICE_COMMAND_MODE_PACK == aice_command_mode) {
1128                 aice_usb_packet_flush();
1129         } else if (AICE_COMMAND_MODE_BATCH == aice_command_mode) {
1130                 aice_pack_htdmc_multiple_data(AICE_CMD_T_WRITE_DIM, target_id,
1131                                 num_of_words - 1, 0, big_endian_word, num_of_words,
1132                                 AICE_LITTLE_ENDIAN);
1133                 return aice_usb_packet_append(usb_out_buffer,
1134                                 AICE_FORMAT_HTDMC + (num_of_words - 1) * 4,
1135                                 AICE_FORMAT_DTHMB);
1136         }
1137
1138         do {
1139                 aice_pack_htdmc_multiple_data(AICE_CMD_T_WRITE_DIM, target_id, num_of_words - 1, 0,
1140                                 big_endian_word, num_of_words, AICE_LITTLE_ENDIAN);
1141
1142                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMC + (num_of_words - 1) * 4);
1143
1144                 LOG_DEBUG("WRITE_DIM, COREID: %" PRIu8
1145                                 ", data: 0x%08" PRIx32 ", 0x%08" PRIx32 ", 0x%08" PRIx32 ", 0x%08" PRIx32,
1146                                 target_id,
1147                                 big_endian_word[0],
1148                                 big_endian_word[1],
1149                                 big_endian_word[2],
1150                                 big_endian_word[3]);
1151
1152                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
1153                 if (AICE_FORMAT_DTHMB != result) {
1154                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")", AICE_FORMAT_DTHMB, result);
1155                         return ERROR_FAIL;
1156                 }
1157
1158                 uint8_t cmd_ack_code;
1159                 uint8_t extra_length;
1160                 uint8_t res_target_id;
1161                 aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
1162
1163
1164                 if (cmd_ack_code == AICE_CMD_T_WRITE_DIM) {
1165                         LOG_DEBUG("WRITE_DIM response");
1166                         break;
1167                 } else {
1168                         if (retry_times > aice_max_retry_times) {
1169                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8
1170                                                 ", response=0x%" PRIx8 ")",
1171                                                 AICE_CMD_T_WRITE_DIM, cmd_ack_code);
1172
1173                                 return ERROR_FAIL;
1174                         }
1175
1176                         /* clear timeout and retry */
1177                         if (aice_reset_box() != ERROR_OK)
1178                                 return ERROR_FAIL;
1179
1180                         retry_times++;
1181                 }
1182         } while (1);
1183
1184         return ERROR_OK;
1185 }
1186
1187 static int aice_do_execute(uint8_t target_id)
1188 {
1189         int32_t result;
1190         int retry_times = 0;
1191
1192         if (AICE_COMMAND_MODE_PACK == aice_command_mode) {
1193                 aice_usb_packet_flush();
1194         } else if (AICE_COMMAND_MODE_BATCH == aice_command_mode) {
1195                 aice_pack_htdmc(AICE_CMD_T_EXECUTE, target_id, 0, 0, 0, AICE_LITTLE_ENDIAN);
1196                 return aice_usb_packet_append(usb_out_buffer,
1197                                 AICE_FORMAT_HTDMC,
1198                                 AICE_FORMAT_DTHMB);
1199         }
1200
1201         do {
1202                 aice_pack_htdmc(AICE_CMD_T_EXECUTE, target_id, 0, 0, 0, AICE_LITTLE_ENDIAN);
1203
1204                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMC);
1205
1206                 LOG_DEBUG("EXECUTE, COREID: %" PRIu8 "", target_id);
1207
1208                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
1209                 if (AICE_FORMAT_DTHMB != result) {
1210                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1211                                         AICE_FORMAT_DTHMB, result);
1212                         return ERROR_FAIL;
1213                 }
1214
1215                 uint8_t cmd_ack_code;
1216                 uint8_t extra_length;
1217                 uint8_t res_target_id;
1218                 aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
1219
1220                 if (cmd_ack_code == AICE_CMD_T_EXECUTE) {
1221                         LOG_DEBUG("EXECUTE response");
1222                         break;
1223                 } else {
1224                         if (retry_times > aice_max_retry_times) {
1225                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1226                                                 AICE_CMD_T_EXECUTE, cmd_ack_code);
1227
1228                                 return ERROR_FAIL;
1229                         }
1230
1231                         /* clear timeout and retry */
1232                         if (aice_reset_box() != ERROR_OK)
1233                                 return ERROR_FAIL;
1234
1235                         retry_times++;
1236                 }
1237         } while (1);
1238
1239         return ERROR_OK;
1240 }
1241
1242 int aice_write_mem_b(uint8_t target_id, uint32_t address, uint32_t data)
1243 {
1244         int32_t result;
1245         int retry_times = 0;
1246
1247         LOG_DEBUG("WRITE_MEM_B, COREID: %" PRIu8 ", ADDRESS %08" PRIx32 "  VALUE %08" PRIx32,
1248                         target_id,
1249                         address,
1250                         data);
1251
1252         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
1253                 (AICE_COMMAND_MODE_BATCH == aice_command_mode)) {
1254                 aice_pack_htdmd(AICE_CMD_T_WRITE_MEM_B, target_id, 0, address,
1255                                 data & 0x000000FF, data_endian);
1256                 return aice_usb_packet_append(usb_out_buffer, AICE_FORMAT_HTDMD,
1257                                 AICE_FORMAT_DTHMB);
1258         } else {
1259                 do {
1260                         aice_pack_htdmd(AICE_CMD_T_WRITE_MEM_B, target_id, 0,
1261                                         address, data & 0x000000FF, data_endian);
1262                         aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMD);
1263
1264                         result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
1265                         if (AICE_FORMAT_DTHMB != result) {
1266                                 LOG_ERROR("aice_usb_read failed (requested=%" PRId32
1267                                                 ", result=%" PRId32 ")", AICE_FORMAT_DTHMB, result);
1268                                 return ERROR_FAIL;
1269                         }
1270
1271                         uint8_t cmd_ack_code;
1272                         uint8_t extra_length;
1273                         uint8_t res_target_id;
1274                         aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
1275
1276                         if (cmd_ack_code == AICE_CMD_T_WRITE_MEM_B) {
1277                                 break;
1278                         } else {
1279                                 if (retry_times > aice_max_retry_times) {
1280                                         LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1281                                                         AICE_CMD_T_WRITE_MEM_B, cmd_ack_code);
1282
1283                                         return ERROR_FAIL;
1284                                 }
1285
1286                                 /* clear timeout and retry */
1287                                 if (aice_reset_box() != ERROR_OK)
1288                                         return ERROR_FAIL;
1289
1290                                 retry_times++;
1291                         }
1292                 } while (1);
1293         }
1294
1295         return ERROR_OK;
1296 }
1297
1298 int aice_write_mem_h(uint8_t target_id, uint32_t address, uint32_t data)
1299 {
1300         int32_t result;
1301         int retry_times = 0;
1302
1303         LOG_DEBUG("WRITE_MEM_H, COREID: %" PRIu8 ", ADDRESS %08" PRIx32 "  VALUE %08" PRIx32,
1304                         target_id,
1305                         address,
1306                         data);
1307
1308         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
1309                 (AICE_COMMAND_MODE_BATCH == aice_command_mode)) {
1310                 aice_pack_htdmd(AICE_CMD_T_WRITE_MEM_H, target_id, 0,
1311                                 (address >> 1) & 0x7FFFFFFF, data & 0x0000FFFF, data_endian);
1312                 return aice_usb_packet_append(usb_out_buffer, AICE_FORMAT_HTDMD,
1313                                 AICE_FORMAT_DTHMB);
1314         } else {
1315                 do {
1316                         aice_pack_htdmd(AICE_CMD_T_WRITE_MEM_H, target_id, 0,
1317                                         (address >> 1) & 0x7FFFFFFF, data & 0x0000FFFF, data_endian);
1318                         aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMD);
1319
1320                         result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
1321                         if (AICE_FORMAT_DTHMB != result) {
1322                                 LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1323                                                 AICE_FORMAT_DTHMB, result);
1324                                 return ERROR_FAIL;
1325                         }
1326
1327                         uint8_t cmd_ack_code;
1328                         uint8_t extra_length;
1329                         uint8_t res_target_id;
1330                         aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
1331
1332                         if (cmd_ack_code == AICE_CMD_T_WRITE_MEM_H) {
1333                                 break;
1334                         } else {
1335                                 if (retry_times > aice_max_retry_times) {
1336                                         LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1337                                                         AICE_CMD_T_WRITE_MEM_H, cmd_ack_code);
1338
1339                                         return ERROR_FAIL;
1340                                 }
1341
1342                                 /* clear timeout and retry */
1343                                 if (aice_reset_box() != ERROR_OK)
1344                                         return ERROR_FAIL;
1345
1346                                 retry_times++;
1347                         }
1348                 } while (1);
1349         }
1350
1351         return ERROR_OK;
1352 }
1353
1354 int aice_write_mem(uint8_t target_id, uint32_t address, uint32_t data)
1355 {
1356         int32_t result;
1357         int retry_times = 0;
1358
1359         LOG_DEBUG("WRITE_MEM, COREID: %" PRIu8 ", ADDRESS %08" PRIx32 "  VALUE %08" PRIx32,
1360                         target_id,
1361                         address,
1362                         data);
1363
1364         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
1365                 (AICE_COMMAND_MODE_BATCH == aice_command_mode)) {
1366                 aice_pack_htdmd(AICE_CMD_T_WRITE_MEM, target_id, 0,
1367                                 (address >> 2) & 0x3FFFFFFF, data, data_endian);
1368                 return aice_usb_packet_append(usb_out_buffer, AICE_FORMAT_HTDMD,
1369                                 AICE_FORMAT_DTHMB);
1370         } else {
1371                 do {
1372                         aice_pack_htdmd(AICE_CMD_T_WRITE_MEM, target_id, 0,
1373                                         (address >> 2) & 0x3FFFFFFF, data, data_endian);
1374                         aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMD);
1375
1376                         result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
1377                         if (AICE_FORMAT_DTHMB != result) {
1378                                 LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1379                                                 AICE_FORMAT_DTHMB, result);
1380                                 return ERROR_FAIL;
1381                         }
1382
1383                         uint8_t cmd_ack_code;
1384                         uint8_t extra_length;
1385                         uint8_t res_target_id;
1386                         aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
1387
1388                         if (cmd_ack_code == AICE_CMD_T_WRITE_MEM) {
1389                                 break;
1390                         } else {
1391                                 if (retry_times > aice_max_retry_times) {
1392                                         LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1393                                                         AICE_CMD_T_WRITE_MEM, cmd_ack_code);
1394
1395                                         return ERROR_FAIL;
1396                                 }
1397
1398                                 /* clear timeout and retry */
1399                                 if (aice_reset_box() != ERROR_OK)
1400                                         return ERROR_FAIL;
1401
1402                                 retry_times++;
1403                         }
1404                 } while (1);
1405         }
1406
1407         return ERROR_OK;
1408 }
1409
1410 int aice_fastread_mem(uint8_t target_id, uint8_t *word, uint32_t num_of_words)
1411 {
1412         int32_t result;
1413         int retry_times = 0;
1414
1415         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
1416                 (AICE_COMMAND_MODE_BATCH == aice_command_mode))
1417                 aice_usb_packet_flush();
1418
1419         do {
1420                 aice_pack_htdmb(AICE_CMD_T_FASTREAD_MEM, target_id, num_of_words - 1, 0);
1421
1422                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMB);
1423
1424                 LOG_DEBUG("FASTREAD_MEM, COREID: %" PRIu8 ", # of DATA %08" PRIx32,
1425                                 target_id, num_of_words);
1426
1427                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMA + (num_of_words - 1) * 4);
1428                 if (result < 0) {
1429                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1430                                         AICE_FORMAT_DTHMA + (num_of_words - 1) * 4, result);
1431                         return ERROR_FAIL;
1432                 }
1433
1434                 uint8_t cmd_ack_code;
1435                 uint8_t extra_length;
1436                 uint8_t res_target_id;
1437                 aice_unpack_dthma_multiple_data(&cmd_ack_code, &res_target_id,
1438                                 &extra_length, word, data_endian);
1439
1440                 if (cmd_ack_code == AICE_CMD_T_FASTREAD_MEM) {
1441                         break;
1442                 } else {
1443                         if (retry_times > aice_max_retry_times) {
1444                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1445                                                 AICE_CMD_T_FASTREAD_MEM, cmd_ack_code);
1446
1447                                 return ERROR_FAIL;
1448                         }
1449
1450                         /* clear timeout and retry */
1451                         if (aice_reset_box() != ERROR_OK)
1452                                 return ERROR_FAIL;
1453
1454                         retry_times++;
1455                 }
1456         } while (1);
1457
1458         return ERROR_OK;
1459 }
1460
1461 int aice_fastwrite_mem(uint8_t target_id, const uint8_t *word, uint32_t num_of_words)
1462 {
1463         int32_t result;
1464         int retry_times = 0;
1465
1466         if (AICE_COMMAND_MODE_PACK == aice_command_mode) {
1467                 aice_usb_packet_flush();
1468         } else if (AICE_COMMAND_MODE_BATCH == aice_command_mode) {
1469                 aice_pack_htdmd_multiple_data(AICE_CMD_T_FASTWRITE_MEM, target_id,
1470                                 num_of_words - 1, 0, word, data_endian);
1471                 return aice_usb_packet_append(usb_out_buffer,
1472                                 AICE_FORMAT_HTDMD + (num_of_words - 1) * 4,
1473                                 AICE_FORMAT_DTHMB);
1474         }
1475
1476         do {
1477                 aice_pack_htdmd_multiple_data(AICE_CMD_T_FASTWRITE_MEM, target_id,
1478                                 num_of_words - 1, 0, word, data_endian);
1479
1480                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMD + (num_of_words - 1) * 4);
1481
1482                 LOG_DEBUG("FASTWRITE_MEM, COREID: %" PRIu8 ", # of DATA %08" PRIx32,
1483                                 target_id, num_of_words);
1484
1485                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
1486                 if (AICE_FORMAT_DTHMB != result) {
1487                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1488                                         AICE_FORMAT_DTHMB, result);
1489                         return ERROR_FAIL;
1490                 }
1491
1492                 uint8_t cmd_ack_code;
1493                 uint8_t extra_length;
1494                 uint8_t res_target_id;
1495                 aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
1496
1497                 if (cmd_ack_code == AICE_CMD_T_FASTWRITE_MEM) {
1498                         break;
1499                 } else {
1500                         if (retry_times > aice_max_retry_times) {
1501                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1502                                                 AICE_CMD_T_FASTWRITE_MEM, cmd_ack_code);
1503
1504                                 return ERROR_FAIL;
1505                         }
1506
1507                         /* clear timeout and retry */
1508                         if (aice_reset_box() != ERROR_OK)
1509                                 return ERROR_FAIL;
1510
1511                         retry_times++;
1512                 }
1513         } while (1);
1514
1515         return ERROR_OK;
1516 }
1517
1518 int aice_read_mem_b(uint8_t target_id, uint32_t address, uint32_t *data)
1519 {
1520         int32_t result;
1521         int retry_times = 0;
1522
1523         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
1524                 (AICE_COMMAND_MODE_BATCH == aice_command_mode))
1525                 aice_usb_packet_flush();
1526
1527         do {
1528                 aice_pack_htdmb(AICE_CMD_T_READ_MEM_B, target_id, 0, address);
1529
1530                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMB);
1531
1532                 LOG_DEBUG("READ_MEM_B, COREID: %" PRIu8 "", target_id);
1533
1534                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMA);
1535                 if (AICE_FORMAT_DTHMA != result) {
1536                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1537                                         AICE_FORMAT_DTHMA, result);
1538                         return ERROR_FAIL;
1539                 }
1540
1541                 uint8_t cmd_ack_code;
1542                 uint8_t extra_length;
1543                 uint8_t res_target_id;
1544                 aice_unpack_dthma(&cmd_ack_code, &res_target_id, &extra_length,
1545                                 data, data_endian);
1546
1547                 if (cmd_ack_code == AICE_CMD_T_READ_MEM_B) {
1548                         LOG_DEBUG("READ_MEM_B response, data: 0x%02" PRIx32, *data);
1549                         break;
1550                 } else {
1551                         if (retry_times > aice_max_retry_times) {
1552                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1553                                                 AICE_CMD_T_READ_MEM_B, cmd_ack_code);
1554
1555                                 return ERROR_FAIL;
1556                         }
1557
1558                         /* clear timeout and retry */
1559                         if (aice_reset_box() != ERROR_OK)
1560                                 return ERROR_FAIL;
1561
1562                         retry_times++;
1563                 }
1564         } while (1);
1565
1566         return ERROR_OK;
1567 }
1568
1569 int aice_read_mem_h(uint8_t target_id, uint32_t address, uint32_t *data)
1570 {
1571         int32_t result;
1572         int retry_times = 0;
1573
1574         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
1575                 (AICE_COMMAND_MODE_BATCH == aice_command_mode))
1576                 aice_usb_packet_flush();
1577
1578         do {
1579                 aice_pack_htdmb(AICE_CMD_T_READ_MEM_H, target_id, 0, (address >> 1) & 0x7FFFFFFF);
1580
1581                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMB);
1582
1583                 LOG_DEBUG("READ_MEM_H, CORE_ID: %" PRIu8 "", target_id);
1584
1585                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMA);
1586                 if (AICE_FORMAT_DTHMA != result) {
1587                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1588                                         AICE_FORMAT_DTHMA, result);
1589                         return ERROR_FAIL;
1590                 }
1591
1592                 uint8_t cmd_ack_code;
1593                 uint8_t extra_length;
1594                 uint8_t res_target_id;
1595                 aice_unpack_dthma(&cmd_ack_code, &res_target_id, &extra_length,
1596                                 data, data_endian);
1597
1598                 if (cmd_ack_code == AICE_CMD_T_READ_MEM_H) {
1599                         LOG_DEBUG("READ_MEM_H response, data: 0x%" PRIx32, *data);
1600                         break;
1601                 } else {
1602                         if (retry_times > aice_max_retry_times) {
1603                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1604                                                 AICE_CMD_T_READ_MEM_H, cmd_ack_code);
1605
1606                                 return ERROR_FAIL;
1607                         }
1608
1609                         /* clear timeout and retry */
1610                         if (aice_reset_box() != ERROR_OK)
1611                                 return ERROR_FAIL;
1612
1613                         retry_times++;
1614                 }
1615         } while (1);
1616
1617         return ERROR_OK;
1618 }
1619
1620 int aice_read_mem(uint8_t target_id, uint32_t address, uint32_t *data)
1621 {
1622         int32_t result;
1623         int retry_times = 0;
1624
1625         if ((AICE_COMMAND_MODE_PACK == aice_command_mode) ||
1626                 (AICE_COMMAND_MODE_BATCH == aice_command_mode))
1627                 aice_usb_packet_flush();
1628
1629         do {
1630                 aice_pack_htdmb(AICE_CMD_T_READ_MEM, target_id, 0,
1631                                 (address >> 2) & 0x3FFFFFFF);
1632
1633                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMB);
1634
1635                 LOG_DEBUG("READ_MEM, COREID: %" PRIu8 "", target_id);
1636
1637                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMA);
1638                 if (AICE_FORMAT_DTHMA != result) {
1639                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1640                                         AICE_FORMAT_DTHMA, result);
1641                         return ERROR_FAIL;
1642                 }
1643
1644                 uint8_t cmd_ack_code;
1645                 uint8_t extra_length;
1646                 uint8_t res_target_id;
1647                 aice_unpack_dthma(&cmd_ack_code, &res_target_id, &extra_length,
1648                                 data, data_endian);
1649
1650                 if (cmd_ack_code == AICE_CMD_T_READ_MEM) {
1651                         LOG_DEBUG("READ_MEM response, data: 0x%" PRIx32, *data);
1652                         break;
1653                 } else {
1654                         if (retry_times > aice_max_retry_times) {
1655                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1656                                                 AICE_CMD_T_READ_MEM, cmd_ack_code);
1657
1658                                 return ERROR_FAIL;
1659                         }
1660
1661                         /* clear timeout and retry */
1662                         if (aice_reset_box() != ERROR_OK)
1663                                 return ERROR_FAIL;
1664
1665                         retry_times++;
1666                 }
1667         } while (1);
1668
1669         return ERROR_OK;
1670 }
1671
1672 int aice_batch_buffer_read(uint8_t buf_index, uint32_t *word, uint32_t num_of_words)
1673 {
1674         int32_t result;
1675         int retry_times = 0;
1676
1677         do {
1678                 aice_pack_htdma(AICE_CMD_BATCH_BUFFER_READ, 0, num_of_words - 1, buf_index);
1679
1680                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMA);
1681
1682                 LOG_DEBUG("BATCH_BUFFER_READ, # of DATA %08" PRIx32, num_of_words);
1683
1684                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMA + (num_of_words - 1) * 4);
1685                 if (result < 0) {
1686                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1687                                         AICE_FORMAT_DTHMA + (num_of_words - 1) * 4, result);
1688                         return ERROR_FAIL;
1689                 }
1690
1691                 uint8_t cmd_ack_code;
1692                 uint8_t extra_length;
1693                 uint8_t res_target_id;
1694                 aice_unpack_dthma_multiple_data(&cmd_ack_code, &res_target_id,
1695                                 &extra_length, (uint8_t *)word, data_endian);
1696
1697                 if (cmd_ack_code == AICE_CMD_BATCH_BUFFER_READ) {
1698                         break;
1699                 } else {
1700                         if (retry_times > aice_max_retry_times) {
1701                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1702                                                 AICE_CMD_BATCH_BUFFER_READ, cmd_ack_code);
1703
1704                                 return ERROR_FAIL;
1705                         }
1706
1707                         /* clear timeout and retry */
1708                         if (aice_reset_box() != ERROR_OK)
1709                                 return ERROR_FAIL;
1710
1711                         retry_times++;
1712                 }
1713         } while (1);
1714
1715         return ERROR_OK;
1716 }
1717
1718 int aice_batch_buffer_write(uint8_t buf_index, const uint8_t *word, uint32_t num_of_words)
1719 {
1720         int32_t result;
1721         int retry_times = 0;
1722
1723         if (num_of_words == 0)
1724                 return ERROR_OK;
1725
1726         do {
1727                 /* only pack AICE_CMD_BATCH_BUFFER_WRITE command header */
1728                 aice_pack_htdmc(AICE_CMD_BATCH_BUFFER_WRITE, 0, num_of_words - 1, buf_index,
1729                                 0, data_endian);
1730
1731                 /* use append instead of pack */
1732                 memcpy(usb_out_buffer + 4, word, num_of_words * 4);
1733
1734                 aice_usb_write(usb_out_buffer, AICE_FORMAT_HTDMC + (num_of_words - 1) * 4);
1735
1736                 LOG_DEBUG("BATCH_BUFFER_WRITE, # of DATA %08" PRIx32, num_of_words);
1737
1738                 result = aice_usb_read(usb_in_buffer, AICE_FORMAT_DTHMB);
1739                 if (AICE_FORMAT_DTHMB != result) {
1740                         LOG_ERROR("aice_usb_read failed (requested=%" PRId32 ", result=%" PRId32 ")",
1741                                         AICE_FORMAT_DTHMB, result);
1742                         return ERROR_FAIL;
1743                 }
1744
1745                 uint8_t cmd_ack_code;
1746                 uint8_t extra_length;
1747                 uint8_t res_target_id;
1748                 aice_unpack_dthmb(&cmd_ack_code, &res_target_id, &extra_length);
1749
1750                 if (cmd_ack_code == AICE_CMD_BATCH_BUFFER_WRITE) {
1751                         break;
1752                 } else {
1753                         if (retry_times > aice_max_retry_times) {
1754                                 LOG_ERROR("aice command timeout (command=0x%" PRIx8 ", response=0x%" PRIx8 ")",
1755                                                 AICE_CMD_BATCH_BUFFER_WRITE, cmd_ack_code);
1756
1757                                 return ERROR_FAIL;
1758                         }
1759
1760                         /* clear timeout and retry */
1761                         if (aice_reset_box() != ERROR_OK)
1762                                 return ERROR_FAIL;
1763
1764                         retry_times++;
1765                 }
1766         } while (1);
1767
1768         return ERROR_OK;
1769 }
1770
1771 /***************************************************************************/
1772 /* End of AICE commands */
1773
1774 typedef int (*read_mem_func_t)(uint32_t coreid, uint32_t address, uint32_t *data);
1775 typedef int (*write_mem_func_t)(uint32_t coreid, uint32_t address, uint32_t data);
1776
1777 struct aice_nds32_info core_info[AICE_MAX_NUM_CORE];
1778 static uint8_t total_num_of_core;
1779
1780 static char *custom_srst_script;
1781 static char *custom_trst_script;
1782 static char *custom_restart_script;
1783 static uint32_t aice_count_to_check_dbger = 30;
1784
1785 static int aice_read_reg(uint32_t coreid, uint32_t num, uint32_t *val);
1786 static int aice_write_reg(uint32_t coreid, uint32_t num, uint32_t val);
1787
1788 static int check_suppressed_exception(uint32_t coreid, uint32_t dbger_value)
1789 {
1790         uint32_t ir4_value;
1791         uint32_t ir6_value;
1792         /* the default value of handling_suppressed_exception is false */
1793         static bool handling_suppressed_exception;
1794
1795         if (handling_suppressed_exception)
1796                 return ERROR_OK;
1797
1798         if ((dbger_value & NDS_DBGER_ALL_SUPRS_EX) == NDS_DBGER_ALL_SUPRS_EX) {
1799                 LOG_ERROR("<-- TARGET WARNING! Exception is detected and suppressed. -->");
1800                 handling_suppressed_exception = true;
1801
1802                 aice_read_reg(coreid, IR4, &ir4_value);
1803                 /* Clear IR6.SUPRS_EXC, IR6.IMP_EXC */
1804                 aice_read_reg(coreid, IR6, &ir6_value);
1805                 /*
1806                  * For MCU version(MSC_CFG.MCU == 1) like V3m
1807                  *  | SWID[30:16] | Reserved[15:10] | SUPRS_EXC[9]  | IMP_EXC[8]
1808                  *  |VECTOR[7:5] | INST[4] | Exc Type[3:0] |
1809                  *
1810                  * For non-MCU version(MSC_CFG.MCU == 0) like V3
1811                  *  | SWID[30:16] | Reserved[15:14] | SUPRS_EXC[13] | IMP_EXC[12]
1812                  *  | VECTOR[11:5] | INST[4] | Exc Type[3:0] |
1813                  */
1814                 LOG_INFO("EVA: 0x%08" PRIx32, ir4_value);
1815                 LOG_INFO("ITYPE: 0x%08" PRIx32, ir6_value);
1816
1817                 ir6_value = ir6_value & (~0x300); /* for MCU */
1818                 ir6_value = ir6_value & (~0x3000); /* for non-MCU */
1819                 aice_write_reg(coreid, IR6, ir6_value);
1820
1821                 handling_suppressed_exception = false;
1822         }
1823
1824         return ERROR_OK;
1825 }
1826
1827 static int check_privilege(uint32_t coreid, uint32_t dbger_value)
1828 {
1829         if ((dbger_value & NDS_DBGER_ILL_SEC_ACC) == NDS_DBGER_ILL_SEC_ACC) {
1830                 LOG_ERROR("<-- TARGET ERROR! Insufficient security privilege "
1831                                 "to execute the debug operations. -->");
1832
1833                 /* Clear DBGER.ILL_SEC_ACC */
1834                 if (aice_write_misc(coreid, NDS_EDM_MISC_DBGER,
1835                                         NDS_DBGER_ILL_SEC_ACC) != ERROR_OK)
1836                         return ERROR_FAIL;
1837         }
1838
1839         return ERROR_OK;
1840 }
1841
1842 static int aice_check_dbger(uint32_t coreid, uint32_t expect_status)
1843 {
1844         uint32_t i = 0;
1845         uint32_t value_dbger;
1846
1847         while (1) {
1848                 aice_read_misc(coreid, NDS_EDM_MISC_DBGER, &value_dbger);
1849
1850                 if ((value_dbger & expect_status) == expect_status) {
1851                         if (ERROR_OK != check_suppressed_exception(coreid, value_dbger))
1852                                 return ERROR_FAIL;
1853                         if (ERROR_OK != check_privilege(coreid, value_dbger))
1854                                 return ERROR_FAIL;
1855                         return ERROR_OK;
1856                 }
1857
1858                 if ((i % 30) == 0)
1859                         keep_alive();
1860
1861                 long long then = 0;
1862                 if (i == aice_count_to_check_dbger)
1863                         then = timeval_ms();
1864                 if (i >= aice_count_to_check_dbger) {
1865                         if ((timeval_ms() - then) > 1000) {
1866                                 LOG_ERROR("Timeout (1000ms) waiting for $DBGER status "
1867                                                 "being 0x%08" PRIx32, expect_status);
1868                                 return ERROR_FAIL;
1869                         }
1870                 }
1871                 i++;
1872         }
1873
1874         return ERROR_FAIL;
1875 }
1876
1877 static int aice_execute_dim(uint32_t coreid, uint32_t *insts, uint8_t n_inst)
1878 {
1879         /** fill DIM */
1880         if (aice_write_dim(coreid, insts, n_inst) != ERROR_OK)
1881                 return ERROR_FAIL;
1882
1883         /** clear DBGER.DPED */
1884         if (aice_write_misc(coreid, NDS_EDM_MISC_DBGER, NDS_DBGER_DPED) != ERROR_OK)
1885                 return ERROR_FAIL;
1886
1887         /** execute DIM */
1888         if (aice_do_execute(coreid) != ERROR_OK)
1889                 return ERROR_FAIL;
1890
1891         /** read DBGER.DPED */
1892         if (aice_check_dbger(coreid, NDS_DBGER_DPED) != ERROR_OK) {
1893                 LOG_ERROR("<-- TARGET ERROR! Debug operations do not finish properly: "
1894                                 "0x%08" PRIx32 "0x%08" PRIx32 "0x%08" PRIx32 "0x%08" PRIx32 ". -->",
1895                                 insts[0],
1896                                 insts[1],
1897                                 insts[2],
1898                                 insts[3]);
1899                 return ERROR_FAIL;
1900         }
1901
1902         return ERROR_OK;
1903 }
1904
1905 static int aice_read_reg(uint32_t coreid, uint32_t num, uint32_t *val)
1906 {
1907         LOG_DEBUG("aice_read_reg, reg_no: 0x%08" PRIx32, num);
1908
1909         uint32_t instructions[4]; /** execute instructions in DIM */
1910
1911         if (NDS32_REG_TYPE_GPR == nds32_reg_type(num)) { /* general registers */
1912                 instructions[0] = MTSR_DTR(num);
1913                 instructions[1] = DSB;
1914                 instructions[2] = NOP;
1915                 instructions[3] = BEQ_MINUS_12;
1916         } else if (NDS32_REG_TYPE_SPR == nds32_reg_type(num)) { /* user special registers */
1917                 instructions[0] = MFUSR_G0(0, nds32_reg_sr_index(num));
1918                 instructions[1] = MTSR_DTR(0);
1919                 instructions[2] = DSB;
1920                 instructions[3] = BEQ_MINUS_12;
1921         } else if (NDS32_REG_TYPE_AUMR == nds32_reg_type(num)) { /* audio registers */
1922                 if ((CB_CTL <= num) && (num <= CBE3)) {
1923                         instructions[0] = AMFAR2(0, nds32_reg_sr_index(num));
1924                         instructions[1] = MTSR_DTR(0);
1925                         instructions[2] = DSB;
1926                         instructions[3] = BEQ_MINUS_12;
1927                 } else {
1928                         instructions[0] = AMFAR(0, nds32_reg_sr_index(num));
1929                         instructions[1] = MTSR_DTR(0);
1930                         instructions[2] = DSB;
1931                         instructions[3] = BEQ_MINUS_12;
1932                 }
1933         } else if (NDS32_REG_TYPE_FPU == nds32_reg_type(num)) { /* fpu registers */
1934                 if (FPCSR == num) {
1935                         instructions[0] = FMFCSR;
1936                         instructions[1] = MTSR_DTR(0);
1937                         instructions[2] = DSB;
1938                         instructions[3] = BEQ_MINUS_12;
1939                 } else if (FPCFG == num) {
1940                         instructions[0] = FMFCFG;
1941                         instructions[1] = MTSR_DTR(0);
1942                         instructions[2] = DSB;
1943                         instructions[3] = BEQ_MINUS_12;
1944                 } else {
1945                         if (FS0 <= num && num <= FS31) { /* single precision */
1946                                 instructions[0] = FMFSR(0, nds32_reg_sr_index(num));
1947                                 instructions[1] = MTSR_DTR(0);
1948                                 instructions[2] = DSB;
1949                                 instructions[3] = BEQ_MINUS_12;
1950                         } else if (FD0 <= num && num <= FD31) { /* double precision */
1951                                 instructions[0] = FMFDR(0, nds32_reg_sr_index(num));
1952                                 instructions[1] = MTSR_DTR(0);
1953                                 instructions[2] = DSB;
1954                                 instructions[3] = BEQ_MINUS_12;
1955                         }
1956                 }
1957         } else { /* system registers */
1958                 instructions[0] = MFSR(0, nds32_reg_sr_index(num));
1959                 instructions[1] = MTSR_DTR(0);
1960                 instructions[2] = DSB;
1961                 instructions[3] = BEQ_MINUS_12;
1962         }
1963
1964         aice_execute_dim(coreid, instructions, 4);
1965
1966         uint32_t value_edmsw;
1967         aice_read_edmsr(coreid, NDS_EDM_SR_EDMSW, &value_edmsw);
1968         if (value_edmsw & NDS_EDMSW_WDV)
1969                 aice_read_dtr(coreid, val);
1970         else {
1971                 LOG_ERROR("<-- TARGET ERROR! The debug target failed to update "
1972                                 "the DTR register. -->");
1973                 return ERROR_FAIL;
1974         }
1975
1976         return ERROR_OK;
1977 }
1978
1979 static int aice_usb_read_reg(uint32_t coreid, uint32_t num, uint32_t *val)
1980 {
1981         LOG_DEBUG("aice_usb_read_reg");
1982
1983         if (num == R0) {
1984                 *val = core_info[coreid].r0_backup;
1985         } else if (num == R1) {
1986                 *val = core_info[coreid].r1_backup;
1987         } else if (num == DR41) {
1988                 /* As target is halted, OpenOCD will backup DR41/DR42/DR43.
1989                  * As user wants to read these registers, OpenOCD should return
1990                  * the backup values, instead of reading the real values.
1991                  * As user wants to write these registers, OpenOCD should write
1992                  * to the backup values, instead of writing to real registers. */
1993                 *val = core_info[coreid].edmsw_backup;
1994         } else if (num == DR42) {
1995                 *val = core_info[coreid].edm_ctl_backup;
1996         } else if ((core_info[coreid].target_dtr_valid == true) && (num == DR43)) {
1997                 *val = core_info[coreid].target_dtr_backup;
1998         } else {
1999                 if (ERROR_OK != aice_read_reg(coreid, num, val))
2000                         *val = 0xBBADBEEF;
2001         }
2002
2003         return ERROR_OK;
2004 }
2005
2006 static int aice_write_reg(uint32_t coreid, uint32_t num, uint32_t val)
2007 {
2008         LOG_DEBUG("aice_write_reg, reg_no: 0x%08" PRIx32 ", value: 0x%08" PRIx32, num, val);
2009
2010         uint32_t instructions[4]; /** execute instructions in DIM */
2011         uint32_t value_edmsw;
2012
2013         aice_write_dtr(coreid, val);
2014         aice_read_edmsr(coreid, NDS_EDM_SR_EDMSW, &value_edmsw);
2015         if (0 == (value_edmsw & NDS_EDMSW_RDV)) {
2016                 LOG_ERROR("<-- TARGET ERROR! AICE failed to write to the DTR register. -->");
2017                 return ERROR_FAIL;
2018         }
2019
2020         if (NDS32_REG_TYPE_GPR == nds32_reg_type(num)) { /* general registers */
2021                 instructions[0] = MFSR_DTR(num);
2022                 instructions[1] = DSB;
2023                 instructions[2] = NOP;
2024                 instructions[3] = BEQ_MINUS_12;
2025         } else if (NDS32_REG_TYPE_SPR == nds32_reg_type(num)) { /* user special registers */
2026                 instructions[0] = MFSR_DTR(0);
2027                 instructions[1] = MTUSR_G0(0, nds32_reg_sr_index(num));
2028                 instructions[2] = DSB;
2029                 instructions[3] = BEQ_MINUS_12;
2030         } else if (NDS32_REG_TYPE_AUMR == nds32_reg_type(num)) { /* audio registers */
2031                 if ((CB_CTL <= num) && (num <= CBE3)) {
2032                         instructions[0] = MFSR_DTR(0);
2033                         instructions[1] = AMTAR2(0, nds32_reg_sr_index(num));
2034                         instructions[2] = DSB;
2035                         instructions[3] = BEQ_MINUS_12;
2036                 } else {
2037                         instructions[0] = MFSR_DTR(0);
2038                         instructions[1] = AMTAR(0, nds32_reg_sr_index(num));
2039                         instructions[2] = DSB;
2040                         instructions[3] = BEQ_MINUS_12;
2041                 }
2042         } else if (NDS32_REG_TYPE_FPU == nds32_reg_type(num)) { /* fpu registers */
2043                 if (FPCSR == num) {
2044                         instructions[0] = MFSR_DTR(0);
2045                         instructions[1] = FMTCSR;
2046                         instructions[2] = DSB;
2047                         instructions[3] = BEQ_MINUS_12;
2048                 } else if (FPCFG == num) {
2049                         /* FPCFG is readonly */
2050                 } else {
2051                         if (FS0 <= num && num <= FS31) { /* single precision */
2052                                 instructions[0] = MFSR_DTR(0);
2053                                 instructions[1] = FMTSR(0, nds32_reg_sr_index(num));
2054                                 instructions[2] = DSB;
2055                                 instructions[3] = BEQ_MINUS_12;
2056                         } else if (FD0 <= num && num <= FD31) { /* double precision */
2057                                 instructions[0] = MFSR_DTR(0);
2058                                 instructions[1] = FMTDR(0, nds32_reg_sr_index(num));
2059                                 instructions[2] = DSB;
2060                                 instructions[3] = BEQ_MINUS_12;
2061                         }
2062                 }
2063         } else {
2064                 instructions[0] = MFSR_DTR(0);
2065                 instructions[1] = MTSR(0, nds32_reg_sr_index(num));
2066                 instructions[2] = DSB;
2067                 instructions[3] = BEQ_MINUS_12;
2068         }
2069
2070         return aice_execute_dim(coreid, instructions, 4);
2071 }
2072
2073 static int aice_usb_write_reg(uint32_t coreid, uint32_t num, uint32_t val)
2074 {
2075         LOG_DEBUG("aice_usb_write_reg");
2076
2077         if (num == R0)
2078                 core_info[coreid].r0_backup = val;
2079         else if (num == R1)
2080                 core_info[coreid].r1_backup = val;
2081         else if (num == DR42)
2082                 /* As target is halted, OpenOCD will backup DR41/DR42/DR43.
2083                  * As user wants to read these registers, OpenOCD should return
2084                  * the backup values, instead of reading the real values.
2085                  * As user wants to write these registers, OpenOCD should write
2086                  * to the backup values, instead of writing to real registers. */
2087                 core_info[coreid].edm_ctl_backup = val;
2088         else if ((core_info[coreid].target_dtr_valid == true) && (num == DR43))
2089                 core_info[coreid].target_dtr_backup = val;
2090         else
2091                 return aice_write_reg(coreid, num, val);
2092
2093         return ERROR_OK;
2094 }
2095
2096 static int aice_usb_open(struct aice_port_param_s *param)
2097 {
2098         const uint16_t vids[] = { param->vid, 0 };
2099         const uint16_t pids[] = { param->pid, 0 };
2100         struct jtag_libusb_device_handle *devh;
2101
2102         if (jtag_libusb_open(vids, pids, &devh) != ERROR_OK)
2103                 return ERROR_FAIL;
2104
2105         /* BE ***VERY CAREFUL*** ABOUT MAKING CHANGES IN THIS
2106          * AREA!!!!!!!!!!!  The behavior of libusb is not completely
2107          * consistent across Windows, Linux, and Mac OS X platforms.
2108          * The actions taken in the following compiler conditionals may
2109          * not agree with published documentation for libusb, but were
2110          * found to be necessary through trials and tribulations.  Even
2111          * little tweaks can break one or more platforms, so if you do
2112          * make changes test them carefully on all platforms before
2113          * committing them!
2114          */
2115
2116 #if IS_WIN32 == 0
2117
2118         jtag_libusb_reset_device(devh);
2119
2120 #if IS_DARWIN == 0
2121
2122         int timeout = 5;
2123         /* reopen jlink after usb_reset
2124          * on win32 this may take a second or two to re-enumerate */
2125         int retval;
2126         while ((retval = jtag_libusb_open(vids, pids, &devh)) != ERROR_OK) {
2127                 usleep(1000);
2128                 timeout--;
2129                 if (!timeout)
2130                         break;
2131         }
2132         if (ERROR_OK != retval)
2133                 return ERROR_FAIL;
2134 #endif
2135
2136 #endif
2137
2138         /* usb_set_configuration required under win32 */
2139         struct jtag_libusb_device *udev = jtag_libusb_get_device(devh);
2140         jtag_libusb_set_configuration(devh, 0);
2141         jtag_libusb_claim_interface(devh, 0);
2142
2143         unsigned int aice_read_ep;
2144         unsigned int aice_write_ep;
2145         jtag_libusb_get_endpoints(udev, &aice_read_ep, &aice_write_ep);
2146
2147         aice_handler.usb_read_ep = aice_read_ep;
2148         aice_handler.usb_write_ep = aice_write_ep;
2149         aice_handler.usb_handle = devh;
2150
2151         return ERROR_OK;
2152 }
2153
2154 static int aice_usb_read_reg_64(uint32_t coreid, uint32_t num, uint64_t *val)
2155 {
2156         LOG_DEBUG("aice_usb_read_reg_64, %s", nds32_reg_simple_name(num));
2157
2158         uint32_t value;
2159         uint32_t high_value;
2160
2161         if (ERROR_OK != aice_read_reg(coreid, num, &value))
2162                 value = 0xBBADBEEF;
2163
2164         aice_read_reg(coreid, R1, &high_value);
2165
2166         LOG_DEBUG("low: 0x%08" PRIx32 ", high: 0x%08" PRIx32 "\n", value, high_value);
2167
2168         if (data_endian == AICE_BIG_ENDIAN)
2169                 *val = (((uint64_t)high_value) << 32) | value;
2170         else
2171                 *val = (((uint64_t)value) << 32) | high_value;
2172
2173         return ERROR_OK;
2174 }
2175
2176 static int aice_usb_write_reg_64(uint32_t coreid, uint32_t num, uint64_t val)
2177 {
2178         uint32_t value;
2179         uint32_t high_value;
2180
2181         if (data_endian == AICE_BIG_ENDIAN) {
2182                 value = val & 0xFFFFFFFF;
2183                 high_value = (val >> 32) & 0xFFFFFFFF;
2184         } else {
2185                 high_value = val & 0xFFFFFFFF;
2186                 value = (val >> 32) & 0xFFFFFFFF;
2187         }
2188
2189         LOG_DEBUG("aice_usb_write_reg_64, %s, low: 0x%08" PRIx32 ", high: 0x%08" PRIx32 "\n",
2190                         nds32_reg_simple_name(num), value, high_value);
2191
2192         aice_write_reg(coreid, R1, high_value);
2193         return aice_write_reg(coreid, num, value);
2194 }
2195
2196 static int aice_get_version_info(void)
2197 {
2198         uint32_t hardware_version;
2199         uint32_t firmware_version;
2200         uint32_t fpga_version;
2201
2202         if (aice_read_ctrl(AICE_READ_CTRL_GET_HARDWARE_VERSION, &hardware_version) != ERROR_OK)
2203                 return ERROR_FAIL;
2204
2205         if (aice_read_ctrl(AICE_READ_CTRL_GET_FIRMWARE_VERSION, &firmware_version) != ERROR_OK)
2206                 return ERROR_FAIL;
2207
2208         if (aice_read_ctrl(AICE_READ_CTRL_GET_FPGA_VERSION, &fpga_version) != ERROR_OK)
2209                 return ERROR_FAIL;
2210
2211         LOG_INFO("AICE version: hw_ver = 0x%" PRIx32 ", fw_ver = 0x%" PRIx32 ", fpga_ver = 0x%" PRIx32,
2212                         hardware_version, firmware_version, fpga_version);
2213
2214         return ERROR_OK;
2215 }
2216
2217 #define LINE_BUFFER_SIZE 1024
2218
2219 static int aice_execute_custom_script(const char *script)
2220 {
2221         FILE *script_fd;
2222         char line_buffer[LINE_BUFFER_SIZE];
2223         char *op_str;
2224         char *reset_str;
2225         uint32_t delay;
2226         uint32_t write_ctrl_value;
2227         bool set_op;
2228
2229         script_fd = fopen(script, "r");
2230         if (script_fd == NULL) {
2231                 return ERROR_FAIL;
2232         } else {
2233                 while (fgets(line_buffer, LINE_BUFFER_SIZE, script_fd) != NULL) {
2234                         /* execute operations */
2235                         set_op = false;
2236                         op_str = strstr(line_buffer, "set");
2237                         if (op_str != NULL) {
2238                                 set_op = true;
2239                                 goto get_reset_type;
2240                         }
2241
2242                         op_str = strstr(line_buffer, "clear");
2243                         if (op_str == NULL)
2244                                 continue;
2245 get_reset_type:
2246                         reset_str = strstr(op_str, "srst");
2247                         if (reset_str != NULL) {
2248                                 if (set_op)
2249                                         write_ctrl_value = AICE_CUSTOM_DELAY_SET_SRST;
2250                                 else
2251                                         write_ctrl_value = AICE_CUSTOM_DELAY_CLEAN_SRST;
2252                                 goto get_delay;
2253                         }
2254                         reset_str = strstr(op_str, "dbgi");
2255                         if (reset_str != NULL) {
2256                                 if (set_op)
2257                                         write_ctrl_value = AICE_CUSTOM_DELAY_SET_DBGI;
2258                                 else
2259                                         write_ctrl_value = AICE_CUSTOM_DELAY_CLEAN_DBGI;
2260                                 goto get_delay;
2261                         }
2262                         reset_str = strstr(op_str, "trst");
2263                         if (reset_str != NULL) {
2264                                 if (set_op)
2265                                         write_ctrl_value = AICE_CUSTOM_DELAY_SET_TRST;
2266                                 else
2267                                         write_ctrl_value = AICE_CUSTOM_DELAY_CLEAN_TRST;
2268                                 goto get_delay;
2269                         }
2270                         continue;
2271 get_delay:
2272                         /* get delay */
2273                         delay = strtoul(reset_str + 4, NULL, 0);
2274                         write_ctrl_value |= (delay << 16);
2275
2276                         if (aice_write_ctrl(AICE_WRITE_CTRL_CUSTOM_DELAY,
2277                                                 write_ctrl_value) != ERROR_OK) {
2278                                 fclose(script_fd);
2279                                 return ERROR_FAIL;
2280                         }
2281                 }
2282                 fclose(script_fd);
2283         }
2284
2285         return ERROR_OK;
2286 }
2287
2288 static int aice_usb_set_clock(int set_clock)
2289 {
2290         if (aice_write_ctrl(AICE_WRITE_CTRL_TCK_CONTROL,
2291                                 AICE_TCK_CONTROL_TCK_SCAN) != ERROR_OK)
2292                 return ERROR_FAIL;
2293
2294         /* Read out TCK_SCAN clock value */
2295         uint32_t scan_clock;
2296         if (aice_read_ctrl(AICE_READ_CTRL_GET_ICE_STATE, &scan_clock) != ERROR_OK)
2297                 return ERROR_FAIL;
2298
2299         scan_clock &= 0x0F;
2300
2301         uint32_t scan_base_freq;
2302         if (scan_clock & 0x8)
2303                 scan_base_freq = 48000; /* 48 MHz */
2304         else
2305                 scan_base_freq = 30000; /* 30 MHz */
2306
2307         uint32_t set_base_freq;
2308         if (set_clock & 0x8)
2309                 set_base_freq = 48000;
2310         else
2311                 set_base_freq = 30000;
2312
2313         uint32_t set_freq;
2314         uint32_t scan_freq;
2315         set_freq = set_base_freq >> (set_clock & 0x7);
2316         scan_freq = scan_base_freq >> (scan_clock & 0x7);
2317
2318         if (scan_freq < set_freq) {
2319                 LOG_ERROR("User specifies higher jtag clock than TCK_SCAN clock");
2320                 return ERROR_FAIL;
2321         }
2322
2323         if (aice_write_ctrl(AICE_WRITE_CTRL_TCK_CONTROL, set_clock) != ERROR_OK)
2324                 return ERROR_FAIL;
2325
2326         uint32_t check_speed;
2327         if (aice_read_ctrl(AICE_READ_CTRL_GET_ICE_STATE, &check_speed) != ERROR_OK)
2328                 return ERROR_FAIL;
2329
2330         if (((int)check_speed & 0x0F) != set_clock) {
2331                 LOG_ERROR("Set jtag clock failed");
2332                 return ERROR_FAIL;
2333         }
2334
2335         return ERROR_OK;
2336 }
2337
2338 static int aice_edm_init(uint32_t coreid)
2339 {
2340         aice_write_edmsr(coreid, NDS_EDM_SR_DIMBR, 0xFFFF0000);
2341         aice_write_misc(coreid, NDS_EDM_MISC_DIMIR, 0);
2342
2343         /* unconditionally try to turn on V3_EDM_MODE */
2344         uint32_t edm_ctl_value;
2345         aice_read_edmsr(coreid, NDS_EDM_SR_EDM_CTL, &edm_ctl_value);
2346         aice_write_edmsr(coreid, NDS_EDM_SR_EDM_CTL, edm_ctl_value | 0x00000040);
2347
2348         /* clear DBGER */
2349         aice_write_misc(coreid, NDS_EDM_MISC_DBGER,
2350                         NDS_DBGER_DPED | NDS_DBGER_CRST | NDS_DBGER_AT_MAX);
2351
2352         /* get EDM version */
2353         uint32_t value_edmcfg;
2354         aice_read_edmsr(coreid, NDS_EDM_SR_EDM_CFG, &value_edmcfg);
2355         core_info[coreid].edm_version = (value_edmcfg >> 16) & 0xFFFF;
2356
2357         return ERROR_OK;
2358 }
2359
2360 static bool is_v2_edm(uint32_t coreid)
2361 {
2362         if ((core_info[coreid].edm_version & 0x1000) == 0)
2363                 return true;
2364         else
2365                 return false;
2366 }
2367
2368 static int aice_init_edm_registers(uint32_t coreid, bool clear_dex_use_psw)
2369 {
2370         /* enable DEH_SEL & MAX_STOP & V3_EDM_MODE & DBGI_MASK */
2371         uint32_t host_edm_ctl = core_info[coreid].edm_ctl_backup | 0xA000004F;
2372         if (clear_dex_use_psw)
2373                 /* After entering debug mode, OpenOCD may set
2374                  * DEX_USE_PSW accidentally through backup value
2375                  * of target EDM_CTL.
2376                  * So, clear DEX_USE_PSW by force. */
2377                 host_edm_ctl &= ~(0x40000000);
2378
2379         LOG_DEBUG("aice_init_edm_registers - EDM_CTL: 0x%08" PRIx32, host_edm_ctl);
2380
2381         int result = aice_write_edmsr(coreid, NDS_EDM_SR_EDM_CTL, host_edm_ctl);
2382
2383         return result;
2384 }
2385
2386 /**
2387  * EDM_CTL will be modified by OpenOCD as debugging. OpenOCD has the
2388  * responsibility to keep EDM_CTL untouched after debugging.
2389  *
2390  * There are two scenarios to consider:
2391  * 1. single step/running as debugging (running under debug session)
2392  * 2. detached from gdb (exit debug session)
2393  *
2394  * So, we need to bakcup EDM_CTL before halted and restore it after
2395  * running. The difference of these two scenarios is EDM_CTL.DEH_SEL
2396  * is on for scenario 1, and off for scenario 2.
2397  */
2398 static int aice_backup_edm_registers(uint32_t coreid)
2399 {
2400         int result = aice_read_edmsr(coreid, NDS_EDM_SR_EDM_CTL,
2401                         &core_info[coreid].edm_ctl_backup);
2402
2403         /* To call aice_backup_edm_registers() after DEX on, DEX_USE_PSW
2404          * may be not correct.  (For example, hit breakpoint, then backup
2405          * EDM_CTL. EDM_CTL.DEX_USE_PSW will be cleared.)  Because debug
2406          * interrupt will clear DEX_USE_PSW, DEX_USE_PSW is always off after
2407          * DEX is on.  It only backups correct value before OpenOCD issues DBGI.
2408          * (Backup EDM_CTL, then issue DBGI actively (refer aice_usb_halt())) */
2409         if (core_info[coreid].edm_ctl_backup & 0x40000000)
2410                 core_info[coreid].dex_use_psw_on = true;
2411         else
2412                 core_info[coreid].dex_use_psw_on = false;
2413
2414         LOG_DEBUG("aice_backup_edm_registers - EDM_CTL: 0x%08" PRIx32 ", DEX_USE_PSW: %s",
2415                         core_info[coreid].edm_ctl_backup,
2416                         core_info[coreid].dex_use_psw_on ? "on" : "off");
2417
2418         return result;
2419 }
2420
2421 static int aice_restore_edm_registers(uint32_t coreid)
2422 {
2423         LOG_DEBUG("aice_restore_edm_registers -");
2424
2425         /* set DEH_SEL, because target still under EDM control */
2426         int result = aice_write_edmsr(coreid, NDS_EDM_SR_EDM_CTL,
2427                         core_info[coreid].edm_ctl_backup | 0x80000000);
2428
2429         return result;
2430 }
2431
2432 static int aice_backup_tmp_registers(uint32_t coreid)
2433 {
2434         LOG_DEBUG("backup_tmp_registers -");
2435
2436         /* backup target DTR first(if the target DTR is valid) */
2437         uint32_t value_edmsw;
2438         aice_read_edmsr(coreid, NDS_EDM_SR_EDMSW, &value_edmsw);
2439         core_info[coreid].edmsw_backup = value_edmsw;
2440         if (value_edmsw & 0x1) { /* EDMSW.WDV == 1 */
2441                 aice_read_dtr(coreid, &core_info[coreid].target_dtr_backup);
2442                 core_info[coreid].target_dtr_valid = true;
2443
2444                 LOG_DEBUG("Backup target DTR: 0x%08" PRIx32, core_info[coreid].target_dtr_backup);
2445         } else {
2446                 core_info[coreid].target_dtr_valid = false;
2447         }
2448
2449         /* Target DTR has been backup, then backup $R0 and $R1 */
2450         aice_read_reg(coreid, R0, &core_info[coreid].r0_backup);
2451         aice_read_reg(coreid, R1, &core_info[coreid].r1_backup);
2452
2453         /* backup host DTR(if the host DTR is valid) */
2454         if (value_edmsw & 0x2) { /* EDMSW.RDV == 1*/
2455                 /* read out host DTR and write into target DTR, then use aice_read_edmsr to
2456                  * read out */
2457                 uint32_t instructions[4] = {
2458                         MFSR_DTR(R0), /* R0 has already been backup */
2459                         DSB,
2460                         MTSR_DTR(R0),
2461                         BEQ_MINUS_12
2462                 };
2463                 aice_execute_dim(coreid, instructions, 4);
2464
2465                 aice_read_dtr(coreid, &core_info[coreid].host_dtr_backup);
2466                 core_info[coreid].host_dtr_valid = true;
2467
2468                 LOG_DEBUG("Backup host DTR: 0x%08" PRIx32, core_info[coreid].host_dtr_backup);
2469         } else {
2470                 core_info[coreid].host_dtr_valid = false;
2471         }
2472
2473         LOG_DEBUG("r0: 0x%08" PRIx32 ", r1: 0x%08" PRIx32,
2474                         core_info[coreid].r0_backup, core_info[coreid].r1_backup);
2475
2476         return ERROR_OK;
2477 }
2478
2479 static int aice_restore_tmp_registers(uint32_t coreid)
2480 {
2481         LOG_DEBUG("restore_tmp_registers - r0: 0x%08" PRIx32 ", r1: 0x%08" PRIx32,
2482                         core_info[coreid].r0_backup, core_info[coreid].r1_backup);
2483
2484         if (core_info[coreid].target_dtr_valid) {
2485                 uint32_t instructions[4] = {
2486                         SETHI(R0, core_info[coreid].target_dtr_backup >> 12),
2487                         ORI(R0, R0, core_info[coreid].target_dtr_backup & 0x00000FFF),
2488                         NOP,
2489                         BEQ_MINUS_12
2490                 };
2491                 aice_execute_dim(coreid, instructions, 4);
2492
2493                 instructions[0] = MTSR_DTR(R0);
2494                 instructions[1] = DSB;
2495                 instructions[2] = NOP;
2496                 instructions[3] = BEQ_MINUS_12;
2497                 aice_execute_dim(coreid, instructions, 4);
2498
2499                 LOG_DEBUG("Restore target DTR: 0x%08" PRIx32, core_info[coreid].target_dtr_backup);
2500         }
2501
2502         aice_write_reg(coreid, R0, core_info[coreid].r0_backup);
2503         aice_write_reg(coreid, R1, core_info[coreid].r1_backup);
2504
2505         if (core_info[coreid].host_dtr_valid) {
2506                 aice_write_dtr(coreid, core_info[coreid].host_dtr_backup);
2507
2508                 LOG_DEBUG("Restore host DTR: 0x%08" PRIx32, core_info[coreid].host_dtr_backup);
2509         }
2510
2511         return ERROR_OK;
2512 }
2513
2514 static int aice_open_device(struct aice_port_param_s *param)
2515 {
2516         if (ERROR_OK != aice_usb_open(param))
2517                 return ERROR_FAIL;
2518
2519         if (ERROR_FAIL == aice_get_version_info()) {
2520                 LOG_ERROR("Cannot get AICE version!");
2521                 return ERROR_FAIL;
2522         }
2523
2524         LOG_INFO("AICE initialization started");
2525
2526         /* attempt to reset Andes EDM */
2527         if (ERROR_FAIL == aice_reset_box()) {
2528                 LOG_ERROR("Cannot initial AICE box!");
2529                 return ERROR_FAIL;
2530         }
2531
2532         return ERROR_OK;
2533 }
2534
2535 static int aice_usb_set_jtag_clock(uint32_t a_clock)
2536 {
2537         jtag_clock = a_clock;
2538
2539         if (ERROR_OK != aice_usb_set_clock(a_clock)) {
2540                 LOG_ERROR("Cannot set AICE JTAG clock!");
2541                 return ERROR_FAIL;
2542         }
2543
2544         return ERROR_OK;
2545 }
2546
2547 static int aice_usb_close(void)
2548 {
2549         jtag_libusb_close(aice_handler.usb_handle);
2550
2551         if (custom_srst_script)
2552                 free(custom_srst_script);
2553
2554         if (custom_trst_script)
2555                 free(custom_trst_script);
2556
2557         if (custom_restart_script)
2558                 free(custom_restart_script);
2559
2560         return ERROR_OK;
2561 }
2562
2563 static int aice_core_init(uint32_t coreid)
2564 {
2565         core_info[coreid].access_channel = NDS_MEMORY_ACC_CPU;
2566         core_info[coreid].memory_select = NDS_MEMORY_SELECT_AUTO;
2567         core_info[coreid].core_state = AICE_TARGET_UNKNOWN;
2568
2569         return ERROR_OK;
2570 }
2571
2572 static int aice_usb_idcode(uint32_t *idcode, uint8_t *num_of_idcode)
2573 {
2574         int retval;
2575
2576         retval = aice_scan_chain(idcode, num_of_idcode);
2577         if (ERROR_OK == retval) {
2578                 for (int i = 0; i < *num_of_idcode; i++) {
2579                         aice_core_init(i);
2580                         aice_edm_init(i);
2581                 }
2582                 total_num_of_core = *num_of_idcode;
2583         }
2584
2585         return retval;
2586 }
2587
2588 static int aice_usb_halt(uint32_t coreid)
2589 {
2590         if (core_info[coreid].core_state == AICE_TARGET_HALTED) {
2591                 LOG_DEBUG("aice_usb_halt check halted");
2592                 return ERROR_OK;
2593         }
2594
2595         LOG_DEBUG("aice_usb_halt");
2596
2597         /** backup EDM registers */
2598         aice_backup_edm_registers(coreid);
2599         /** init EDM for host debugging */
2600         /** no need to clear dex_use_psw, because dbgi will clear it */
2601         aice_init_edm_registers(coreid, false);
2602
2603         /** Clear EDM_CTL.DBGIM & EDM_CTL.DBGACKM */
2604         uint32_t edm_ctl_value;
2605         aice_read_edmsr(coreid, NDS_EDM_SR_EDM_CTL, &edm_ctl_value);
2606         if (edm_ctl_value & 0x3)
2607                 aice_write_edmsr(coreid, NDS_EDM_SR_EDM_CTL, edm_ctl_value & ~(0x3));
2608
2609         uint32_t dbger;
2610         uint32_t acc_ctl_value;
2611
2612         core_info[coreid].debug_under_dex_on = false;
2613         aice_read_misc(coreid, NDS_EDM_MISC_DBGER, &dbger);
2614
2615         if (dbger & NDS_DBGER_AT_MAX)
2616                 LOG_ERROR("<-- TARGET ERROR! Reaching the max interrupt stack level. -->");
2617
2618         if (dbger & NDS_DBGER_DEX) {
2619                 if (is_v2_edm(coreid) == false) {
2620                         /** debug 'debug mode'. use force_debug to issue dbgi */
2621                         aice_read_misc(coreid, NDS_EDM_MISC_ACC_CTL, &acc_ctl_value);
2622                         acc_ctl_value |= 0x8;
2623                         aice_write_misc(coreid, NDS_EDM_MISC_ACC_CTL, acc_ctl_value);
2624                         core_info[coreid].debug_under_dex_on = true;
2625
2626                         aice_write_misc(coreid, NDS_EDM_MISC_EDM_CMDR, 0);
2627                         /* If CPU stalled due to AT_MAX, clear AT_MAX status. */
2628                         if (dbger & NDS_DBGER_AT_MAX)
2629                                 aice_write_misc(coreid, NDS_EDM_MISC_DBGER, NDS_DBGER_AT_MAX);
2630                 }
2631         } else {
2632                 /** Issue DBGI normally */
2633                 aice_write_misc(coreid, NDS_EDM_MISC_EDM_CMDR, 0);
2634                 /* If CPU stalled due to AT_MAX, clear AT_MAX status. */
2635                 if (dbger & NDS_DBGER_AT_MAX)
2636                         aice_write_misc(coreid, NDS_EDM_MISC_DBGER, NDS_DBGER_AT_MAX);
2637         }
2638
2639         if (aice_check_dbger(coreid, NDS_DBGER_DEX) != ERROR_OK) {
2640                 LOG_ERROR("<-- TARGET ERROR! Unable to stop the debug target through DBGI. -->");
2641                 return ERROR_FAIL;
2642         }
2643
2644         if (core_info[coreid].debug_under_dex_on) {
2645                 if (core_info[coreid].dex_use_psw_on == false) {
2646                         /* under debug 'debug mode', force $psw to 'debug mode' bahavior */
2647                         /* !!!NOTICE!!! this is workaround for debug 'debug mode'.
2648                          * it is only for debugging 'debug exception handler' purpose.
2649                          * after openocd detaches from target, target behavior is
2650                          * undefined. */
2651                         uint32_t ir0_value;
2652                         uint32_t debug_mode_ir0_value;
2653                         aice_read_reg(coreid, IR0, &ir0_value);
2654                         debug_mode_ir0_value = ir0_value | 0x408; /* turn on DEX, set POM = 1 */
2655                         debug_mode_ir0_value &= ~(0x000000C1); /* turn off DT/IT/GIE */
2656                         aice_write_reg(coreid, IR0, debug_mode_ir0_value);
2657                 }
2658         }
2659
2660         /** set EDM_CTL.DBGIM & EDM_CTL.DBGACKM after halt */
2661         if (edm_ctl_value & 0x3)
2662                 aice_write_edmsr(coreid, NDS_EDM_SR_EDM_CTL, edm_ctl_value);
2663
2664         /* backup r0 & r1 */
2665         aice_backup_tmp_registers(coreid);
2666         core_info[coreid].core_state = AICE_TARGET_HALTED;
2667
2668         return ERROR_OK;
2669 }
2670
2671 static int aice_usb_state(uint32_t coreid, enum aice_target_state_s *state)
2672 {
2673         uint32_t dbger_value;
2674         uint32_t ice_state;
2675
2676         int result = aice_read_misc(coreid, NDS_EDM_MISC_DBGER, &dbger_value);
2677
2678         if (ERROR_AICE_TIMEOUT == result) {
2679                 if (aice_read_ctrl(AICE_READ_CTRL_GET_ICE_STATE, &ice_state) != ERROR_OK) {
2680                         LOG_ERROR("<-- AICE ERROR! AICE is unplugged. -->");
2681                         return ERROR_FAIL;
2682                 }
2683
2684                 if ((ice_state & 0x20) == 0) {
2685                         LOG_ERROR("<-- TARGET ERROR! Target is disconnected with AICE. -->");
2686                         return ERROR_FAIL;
2687                 } else {
2688                         return ERROR_FAIL;
2689                 }
2690         } else if (ERROR_AICE_DISCONNECT == result) {
2691                 LOG_ERROR("<-- AICE ERROR! AICE is unplugged. -->");
2692                 return ERROR_FAIL;
2693         }
2694
2695         if ((dbger_value & NDS_DBGER_ILL_SEC_ACC) == NDS_DBGER_ILL_SEC_ACC) {
2696                 LOG_ERROR("<-- TARGET ERROR! Insufficient security privilege. -->");
2697
2698                 /* Clear ILL_SEC_ACC */
2699                 aice_write_misc(coreid, NDS_EDM_MISC_DBGER, NDS_DBGER_ILL_SEC_ACC);
2700
2701                 *state = AICE_TARGET_RUNNING;
2702                 core_info[coreid].core_state = AICE_TARGET_RUNNING;
2703         } else if ((dbger_value & NDS_DBGER_AT_MAX) == NDS_DBGER_AT_MAX) {
2704                 /* Issue DBGI to exit cpu stall */
2705                 aice_usb_halt(coreid);
2706
2707                 /* Read OIPC to find out the trigger point */
2708                 uint32_t ir11_value;
2709                 aice_read_reg(coreid, IR11, &ir11_value);
2710
2711                 LOG_ERROR("<-- TARGET ERROR! Reaching the max interrupt stack level; "
2712                                 "CPU is stalled at 0x%08" PRIx32 " for debugging. -->", ir11_value);
2713
2714                 *state = AICE_TARGET_HALTED;
2715         } else if ((dbger_value & NDS_DBGER_CRST) == NDS_DBGER_CRST) {
2716                 LOG_DEBUG("DBGER.CRST is on.");
2717
2718                 *state = AICE_TARGET_RESET;
2719                 core_info[coreid].core_state = AICE_TARGET_RUNNING;
2720
2721                 /* Clear CRST */
2722                 aice_write_misc(coreid, NDS_EDM_MISC_DBGER, NDS_DBGER_CRST);
2723         } else if ((dbger_value & NDS_DBGER_DEX) == NDS_DBGER_DEX) {
2724                 if (AICE_TARGET_RUNNING == core_info[coreid].core_state) {
2725                         /* enter debug mode, init EDM registers */
2726                         /* backup EDM registers */
2727                         aice_backup_edm_registers(coreid);
2728                         /* init EDM for host debugging */
2729                         aice_init_edm_registers(coreid, true);
2730                         aice_backup_tmp_registers(coreid);
2731                         core_info[coreid].core_state = AICE_TARGET_HALTED;
2732                 } else if (AICE_TARGET_UNKNOWN == core_info[coreid].core_state) {
2733                         /* debug 'debug mode', use force debug to halt core */
2734                         aice_usb_halt(coreid);
2735                 }
2736                 *state = AICE_TARGET_HALTED;
2737         } else {
2738                 *state = AICE_TARGET_RUNNING;
2739                 core_info[coreid].core_state = AICE_TARGET_RUNNING;
2740         }
2741
2742         return ERROR_OK;
2743 }
2744
2745 static int aice_usb_reset(void)
2746 {
2747         if (aice_reset_box() != ERROR_OK)
2748                 return ERROR_FAIL;
2749
2750         /* issue TRST */
2751         if (custom_trst_script == NULL) {
2752                 if (aice_write_ctrl(AICE_WRITE_CTRL_JTAG_PIN_CONTROL,
2753                                         AICE_JTAG_PIN_CONTROL_TRST) != ERROR_OK)
2754                         return ERROR_FAIL;
2755         } else {
2756                 /* custom trst operations */
2757                 if (aice_execute_custom_script(custom_trst_script) != ERROR_OK)
2758                         return ERROR_FAIL;
2759         }
2760
2761         if (aice_usb_set_clock(jtag_clock) != ERROR_OK)
2762                 return ERROR_FAIL;
2763
2764         return ERROR_OK;
2765 }
2766
2767 static int aice_issue_srst(uint32_t coreid)
2768 {
2769         LOG_DEBUG("aice_issue_srst");
2770
2771         /* After issuing srst, target will be running. So we need to restore EDM_CTL. */
2772         aice_restore_edm_registers(coreid);
2773
2774         if (custom_srst_script == NULL) {
2775                 if (aice_write_ctrl(AICE_WRITE_CTRL_JTAG_PIN_CONTROL,
2776                                         AICE_JTAG_PIN_CONTROL_SRST) != ERROR_OK)
2777                         return ERROR_FAIL;
2778         } else {
2779                 /* custom srst operations */
2780                 if (aice_execute_custom_script(custom_srst_script) != ERROR_OK)
2781                         return ERROR_FAIL;
2782         }
2783
2784         /* wait CRST infinitely */
2785         uint32_t dbger_value;
2786         int i = 0;
2787         while (1) {
2788                 if (aice_read_misc(coreid,
2789                                         NDS_EDM_MISC_DBGER, &dbger_value) != ERROR_OK)
2790                         return ERROR_FAIL;
2791
2792                 if (dbger_value & NDS_DBGER_CRST)
2793                         break;
2794
2795                 if ((i % 30) == 0)
2796                         keep_alive();
2797                 i++;
2798         }
2799
2800         core_info[coreid].host_dtr_valid = false;
2801         core_info[coreid].target_dtr_valid = false;
2802
2803         core_info[coreid].core_state = AICE_TARGET_RUNNING;
2804         return ERROR_OK;
2805 }
2806
2807 static int aice_issue_reset_hold(uint32_t coreid)
2808 {
2809         LOG_DEBUG("aice_issue_reset_hold");
2810
2811         /* set no_dbgi_pin to 0 */
2812         uint32_t pin_status;
2813         aice_read_ctrl(AICE_READ_CTRL_GET_JTAG_PIN_STATUS, &pin_status);
2814         if (pin_status | 0x4)
2815                 aice_write_ctrl(AICE_WRITE_CTRL_JTAG_PIN_STATUS, pin_status & (~0x4));
2816
2817         /* issue restart */
2818         if (custom_restart_script == NULL) {
2819                 if (aice_write_ctrl(AICE_WRITE_CTRL_JTAG_PIN_CONTROL,
2820                                         AICE_JTAG_PIN_CONTROL_RESTART) != ERROR_OK)
2821                         return ERROR_FAIL;
2822         } else {
2823                 /* custom restart operations */
2824                 if (aice_execute_custom_script(custom_restart_script) != ERROR_OK)
2825                         return ERROR_FAIL;
2826         }
2827
2828         if (aice_check_dbger(coreid, NDS_DBGER_CRST | NDS_DBGER_DEX) == ERROR_OK) {
2829                 aice_backup_tmp_registers(coreid);
2830                 core_info[coreid].core_state = AICE_TARGET_HALTED;
2831
2832                 return ERROR_OK;
2833         } else {
2834                 /* set no_dbgi_pin to 1 */
2835                 aice_write_ctrl(AICE_WRITE_CTRL_JTAG_PIN_STATUS, pin_status | 0x4);
2836
2837                 /* issue restart again */
2838                 if (custom_restart_script == NULL) {
2839                         if (aice_write_ctrl(AICE_WRITE_CTRL_JTAG_PIN_CONTROL,
2840                                                 AICE_JTAG_PIN_CONTROL_RESTART) != ERROR_OK)
2841                                 return ERROR_FAIL;
2842                 } else {
2843                         /* custom restart operations */
2844                         if (aice_execute_custom_script(custom_restart_script) != ERROR_OK)
2845                                 return ERROR_FAIL;
2846                 }
2847
2848                 if (aice_check_dbger(coreid, NDS_DBGER_CRST | NDS_DBGER_DEX) == ERROR_OK) {
2849                         aice_backup_tmp_registers(coreid);
2850                         core_info[coreid].core_state = AICE_TARGET_HALTED;
2851
2852                         return ERROR_OK;
2853                 }
2854
2855                 /* do software reset-and-hold */
2856                 aice_issue_srst(coreid);
2857                 aice_usb_halt(coreid);
2858
2859                 uint32_t value_ir3;
2860                 aice_read_reg(coreid, IR3, &value_ir3);
2861                 aice_write_reg(coreid, PC, value_ir3 & 0xFFFF0000);
2862         }
2863
2864         return ERROR_FAIL;
2865 }
2866
2867 static int aice_issue_reset_hold_multi(void)
2868 {
2869         uint32_t write_ctrl_value = 0;
2870
2871         /* set SRST */
2872         write_ctrl_value = AICE_CUSTOM_DELAY_SET_SRST;
2873         write_ctrl_value |= (0x200 << 16);
2874         if (aice_write_ctrl(AICE_WRITE_CTRL_CUSTOM_DELAY,
2875                                 write_ctrl_value) != ERROR_OK)
2876                 return ERROR_FAIL;
2877
2878         for (uint8_t i = 0 ; i < total_num_of_core ; i++)
2879                 aice_write_misc(i, NDS_EDM_MISC_EDM_CMDR, 0);
2880
2881         /* clear SRST */
2882         write_ctrl_value = AICE_CUSTOM_DELAY_CLEAN_SRST;
2883         write_ctrl_value |= (0x200 << 16);
2884         if (aice_write_ctrl(AICE_WRITE_CTRL_CUSTOM_DELAY,
2885                                 write_ctrl_value) != ERROR_OK)
2886                 return ERROR_FAIL;
2887
2888         for (uint8_t i = 0; i < total_num_of_core; i++)
2889                 aice_edm_init(i);
2890
2891         return ERROR_FAIL;
2892 }
2893
2894 static int aice_usb_assert_srst(uint32_t coreid, enum aice_srst_type_s srst)
2895 {
2896         if ((AICE_SRST != srst) && (AICE_RESET_HOLD != srst))
2897                 return ERROR_FAIL;
2898
2899         /* clear DBGER */
2900         if (aice_write_misc(coreid, NDS_EDM_MISC_DBGER,
2901                                 NDS_DBGER_CLEAR_ALL) != ERROR_OK)
2902                 return ERROR_FAIL;
2903
2904         int result = ERROR_OK;
2905         if (AICE_SRST == srst)
2906                 result = aice_issue_srst(coreid);
2907         else {
2908                 if (1 == total_num_of_core)
2909                         result = aice_issue_reset_hold(coreid);
2910                 else
2911                         result = aice_issue_reset_hold_multi();
2912         }
2913
2914         /* Clear DBGER.CRST after reset to avoid 'core-reset checking' errors.
2915          * assert_srst is user-intentional reset behavior, so we could
2916          * clear DBGER.CRST safely.
2917          */
2918         if (aice_write_misc(coreid,
2919                                 NDS_EDM_MISC_DBGER, NDS_DBGER_CRST) != ERROR_OK)
2920                 return ERROR_FAIL;
2921
2922         return result;
2923 }
2924
2925 static int aice_usb_run(uint32_t coreid)
2926 {
2927         LOG_DEBUG("aice_usb_run");
2928
2929         uint32_t dbger_value;
2930         if (aice_read_misc(coreid,
2931                                 NDS_EDM_MISC_DBGER, &dbger_value) != ERROR_OK)
2932                 return ERROR_FAIL;
2933
2934         if ((dbger_value & NDS_DBGER_DEX) != NDS_DBGER_DEX) {
2935                 LOG_WARNING("<-- TARGET WARNING! The debug target exited "
2936                                 "the debug mode unexpectedly. -->");
2937                 return ERROR_FAIL;
2938         }
2939
2940         /* restore r0 & r1 before free run */
2941         aice_restore_tmp_registers(coreid);
2942         core_info[coreid].core_state = AICE_TARGET_RUNNING;
2943
2944         /* clear DBGER */
2945         aice_write_misc(coreid, NDS_EDM_MISC_DBGER,
2946                         NDS_DBGER_CLEAR_ALL);
2947
2948         /** restore EDM registers */
2949         /** OpenOCD should restore EDM_CTL **before** to exit debug state.
2950          *  Otherwise, following instruction will read wrong EDM_CTL value.
2951          *
2952          *  pc -> mfsr $p0, EDM_CTL (single step)
2953          *        slli $p0, $p0, 1
2954          *        slri $p0, $p0, 31
2955          */
2956         aice_restore_edm_registers(coreid);
2957
2958         /** execute instructions in DIM */
2959         uint32_t instructions[4] = {
2960                 NOP,
2961                 NOP,
2962                 NOP,
2963                 IRET
2964         };
2965         int result = aice_execute_dim(coreid, instructions, 4);
2966
2967         return result;
2968 }
2969
2970 static int aice_usb_step(uint32_t coreid)
2971 {
2972         LOG_DEBUG("aice_usb_step");
2973
2974         uint32_t ir0_value;
2975         uint32_t ir0_reg_num;
2976
2977         if (is_v2_edm(coreid) == true)
2978                 /* V2 EDM will push interrupt stack as debug exception */
2979                 ir0_reg_num = IR1;
2980         else
2981                 ir0_reg_num = IR0;
2982
2983         /** enable HSS */
2984         aice_read_reg(coreid, ir0_reg_num, &ir0_value);
2985         if ((ir0_value & 0x800) == 0) {
2986                 /** set PSW.HSS */
2987                 ir0_value |= (0x01 << 11);
2988                 aice_write_reg(coreid, ir0_reg_num, ir0_value);
2989         }
2990
2991         if (ERROR_FAIL == aice_usb_run(coreid))
2992                 return ERROR_FAIL;
2993
2994         int i = 0;
2995         enum aice_target_state_s state;
2996         while (1) {
2997                 /* read DBGER */
2998                 if (aice_usb_state(coreid, &state) != ERROR_OK)
2999                         return ERROR_FAIL;
3000
3001                 if (AICE_TARGET_HALTED == state)
3002                         break;
3003
3004                 long long then = 0;
3005                 if (i == 30)
3006                         then = timeval_ms();
3007
3008                 if (i >= 30) {
3009                         if ((timeval_ms() - then) > 1000)
3010                                 LOG_WARNING("Timeout (1000ms) waiting for halt to complete");
3011
3012                         return ERROR_FAIL;
3013                 }
3014                 i++;
3015         }
3016
3017         /** disable HSS */
3018         aice_read_reg(coreid, ir0_reg_num, &ir0_value);
3019         ir0_value &= ~(0x01 << 11);
3020         aice_write_reg(coreid, ir0_reg_num, ir0_value);
3021
3022         return ERROR_OK;
3023 }
3024
3025 static int aice_usb_read_mem_b_bus(uint32_t coreid, uint32_t address, uint32_t *data)
3026 {
3027         return aice_read_mem_b(coreid, address, data);
3028 }
3029
3030 static int aice_usb_read_mem_h_bus(uint32_t coreid, uint32_t address, uint32_t *data)
3031 {
3032         return aice_read_mem_h(coreid, address, data);
3033 }
3034
3035 static int aice_usb_read_mem_w_bus(uint32_t coreid, uint32_t address, uint32_t *data)
3036 {
3037         return aice_read_mem(coreid, address, data);
3038 }
3039
3040 static int aice_usb_read_mem_b_dim(uint32_t coreid, uint32_t address, uint32_t *data)
3041 {
3042         uint32_t value;
3043         uint32_t instructions[4] = {
3044                 LBI_BI(R1, R0),
3045                 MTSR_DTR(R1),
3046                 DSB,
3047                 BEQ_MINUS_12
3048         };
3049
3050         aice_execute_dim(coreid, instructions, 4);
3051
3052         aice_read_dtr(coreid, &value);
3053         *data = value & 0xFF;
3054
3055         return ERROR_OK;
3056 }
3057
3058 static int aice_usb_read_mem_h_dim(uint32_t coreid, uint32_t address, uint32_t *data)
3059 {
3060         uint32_t value;
3061         uint32_t instructions[4] = {
3062                 LHI_BI(R1, R0),
3063                 MTSR_DTR(R1),
3064                 DSB,
3065                 BEQ_MINUS_12
3066         };
3067
3068         aice_execute_dim(coreid, instructions, 4);
3069
3070         aice_read_dtr(coreid, &value);
3071         *data = value & 0xFFFF;
3072
3073         return ERROR_OK;
3074 }
3075
3076 static int aice_usb_read_mem_w_dim(uint32_t coreid, uint32_t address, uint32_t *data)
3077 {
3078         uint32_t instructions[4] = {
3079                 LWI_BI(R1, R0),
3080                 MTSR_DTR(R1),
3081                 DSB,
3082                 BEQ_MINUS_12
3083         };
3084
3085         aice_execute_dim(coreid, instructions, 4);
3086
3087         aice_read_dtr(coreid, data);
3088
3089         return ERROR_OK;
3090 }
3091
3092 static int aice_usb_set_address_dim(uint32_t coreid, uint32_t address)
3093 {
3094         uint32_t instructions[4] = {
3095                 SETHI(R0, address >> 12),
3096                 ORI(R0, R0, address & 0x00000FFF),
3097                 NOP,
3098                 BEQ_MINUS_12
3099         };
3100
3101         return aice_execute_dim(coreid, instructions, 4);
3102 }
3103
3104 static int aice_usb_read_memory_unit(uint32_t coreid, uint32_t addr, uint32_t size,
3105                 uint32_t count, uint8_t *buffer)
3106 {
3107         LOG_DEBUG("aice_usb_read_memory_unit, addr: 0x%08" PRIx32
3108                         ", size: %" PRIu32 ", count: %" PRIu32 "",
3109                         addr, size, count);
3110
3111         if (NDS_MEMORY_ACC_CPU == core_info[coreid].access_channel)
3112                 aice_usb_set_address_dim(coreid, addr);
3113
3114         uint32_t value;
3115         size_t i;
3116         read_mem_func_t read_mem_func;
3117
3118         switch (size) {
3119                 case 1:
3120                         if (NDS_MEMORY_ACC_BUS == core_info[coreid].access_channel)
3121                                 read_mem_func = aice_usb_read_mem_b_bus;
3122                         else
3123                                 read_mem_func = aice_usb_read_mem_b_dim;
3124
3125                         for (i = 0; i < count; i++) {
3126                                 read_mem_func(coreid, addr, &value);
3127                                 *buffer++ = (uint8_t)value;
3128                                 addr++;
3129                         }
3130                         break;
3131                 case 2:
3132                         if (NDS_MEMORY_ACC_BUS == core_info[coreid].access_channel)
3133                                 read_mem_func = aice_usb_read_mem_h_bus;
3134                         else
3135                                 read_mem_func = aice_usb_read_mem_h_dim;
3136
3137                         for (i = 0; i < count; i++) {
3138                                 read_mem_func(coreid, addr, &value);
3139                                 uint16_t svalue = value;
3140                                 memcpy(buffer, &svalue, sizeof(uint16_t));
3141                                 buffer += 2;
3142                                 addr += 2;
3143                         }
3144                         break;
3145                 case 4:
3146                         if (NDS_MEMORY_ACC_BUS == core_info[coreid].access_channel)
3147                                 read_mem_func = aice_usb_read_mem_w_bus;
3148                         else
3149                                 read_mem_func = aice_usb_read_mem_w_dim;
3150
3151                         for (i = 0; i < count; i++) {
3152                                 read_mem_func(coreid, addr, &value);
3153                                 memcpy(buffer, &value, sizeof(uint32_t));
3154                                 buffer += 4;
3155                                 addr += 4;
3156                         }
3157                         break;
3158         }
3159
3160         return ERROR_OK;
3161 }
3162
3163 static int aice_usb_write_mem_b_bus(uint32_t coreid, uint32_t address, uint32_t data)
3164 {
3165         return aice_write_mem_b(coreid, address, data);
3166 }
3167
3168 static int aice_usb_write_mem_h_bus(uint32_t coreid, uint32_t address, uint32_t data)
3169 {
3170         return aice_write_mem_h(coreid, address, data);
3171 }
3172
3173 static int aice_usb_write_mem_w_bus(uint32_t coreid, uint32_t address, uint32_t data)
3174 {
3175         return aice_write_mem(coreid, address, data);
3176 }
3177
3178 static int aice_usb_write_mem_b_dim(uint32_t coreid, uint32_t address, uint32_t data)
3179 {
3180         uint32_t instructions[4] = {
3181                 MFSR_DTR(R1),
3182                 SBI_BI(R1, R0),
3183                 DSB,
3184                 BEQ_MINUS_12
3185         };
3186
3187         aice_write_dtr(coreid, data & 0xFF);
3188         aice_execute_dim(coreid, instructions, 4);
3189
3190         return ERROR_OK;
3191 }
3192
3193 static int aice_usb_write_mem_h_dim(uint32_t coreid, uint32_t address, uint32_t data)
3194 {
3195         uint32_t instructions[4] = {
3196                 MFSR_DTR(R1),
3197                 SHI_BI(R1, R0),
3198                 DSB,
3199                 BEQ_MINUS_12
3200         };
3201
3202         aice_write_dtr(coreid, data & 0xFFFF);
3203         aice_execute_dim(coreid, instructions, 4);
3204
3205         return ERROR_OK;
3206 }
3207
3208 static int aice_usb_write_mem_w_dim(uint32_t coreid, uint32_t address, uint32_t data)
3209 {
3210         uint32_t instructions[4] = {
3211                 MFSR_DTR(R1),
3212                 SWI_BI(R1, R0),
3213                 DSB,
3214                 BEQ_MINUS_12
3215         };
3216
3217         aice_write_dtr(coreid, data);
3218         aice_execute_dim(coreid, instructions, 4);
3219
3220         return ERROR_OK;
3221 }
3222
3223 static int aice_usb_write_memory_unit(uint32_t coreid, uint32_t addr, uint32_t size,
3224                 uint32_t count, const uint8_t *buffer)
3225 {
3226         LOG_DEBUG("aice_usb_write_memory_unit, addr: 0x%08" PRIx32
3227                         ", size: %" PRIu32 ", count: %" PRIu32 "",
3228                         addr, size, count);
3229
3230         if (NDS_MEMORY_ACC_CPU == core_info[coreid].access_channel)
3231                 aice_usb_set_address_dim(coreid, addr);
3232
3233         size_t i;
3234         write_mem_func_t write_mem_func;
3235
3236         switch (size) {
3237                 case 1:
3238                         if (NDS_MEMORY_ACC_BUS == core_info[coreid].access_channel)
3239                                 write_mem_func = aice_usb_write_mem_b_bus;
3240                         else
3241                                 write_mem_func = aice_usb_write_mem_b_dim;
3242
3243                         for (i = 0; i < count; i++) {
3244                                 write_mem_func(coreid, addr, *buffer);
3245                                 buffer++;
3246                                 addr++;
3247                         }
3248                         break;
3249                 case 2:
3250                         if (NDS_MEMORY_ACC_BUS == core_info[coreid].access_channel)
3251                                 write_mem_func = aice_usb_write_mem_h_bus;
3252                         else
3253                                 write_mem_func = aice_usb_write_mem_h_dim;
3254
3255                         for (i = 0; i < count; i++) {
3256                                 uint16_t value;
3257                                 memcpy(&value, buffer, sizeof(uint16_t));
3258
3259                                 write_mem_func(coreid, addr, value);
3260                                 buffer += 2;
3261                                 addr += 2;
3262                         }
3263                         break;
3264                 case 4:
3265                         if (NDS_MEMORY_ACC_BUS == core_info[coreid].access_channel)
3266                                 write_mem_func = aice_usb_write_mem_w_bus;
3267                         else
3268                                 write_mem_func = aice_usb_write_mem_w_dim;
3269
3270                         for (i = 0; i < count; i++) {
3271                                 uint32_t value;
3272                                 memcpy(&value, buffer, sizeof(uint32_t));
3273
3274                                 write_mem_func(coreid, addr, value);
3275                                 buffer += 4;
3276                                 addr += 4;
3277                         }
3278                         break;
3279         }
3280
3281         return ERROR_OK;
3282 }
3283
3284 static int aice_bulk_read_mem(uint32_t coreid, uint32_t addr, uint32_t count,
3285                 uint8_t *buffer)
3286 {
3287         uint32_t packet_size;
3288
3289         while (count > 0) {
3290                 packet_size = (count >= 0x100) ? 0x100 : count;
3291
3292                 /** set address */
3293                 addr &= 0xFFFFFFFC;
3294                 if (aice_write_misc(coreid, NDS_EDM_MISC_SBAR, addr) != ERROR_OK)
3295                         return ERROR_FAIL;
3296
3297                 if (aice_fastread_mem(coreid, buffer,
3298                                         packet_size) != ERROR_OK)
3299                         return ERROR_FAIL;
3300
3301                 buffer += (packet_size * 4);
3302                 addr += (packet_size * 4);
3303                 count -= packet_size;
3304         }
3305
3306         return ERROR_OK;
3307 }
3308
3309 static int aice_bulk_write_mem(uint32_t coreid, uint32_t addr, uint32_t count,
3310                 const uint8_t *buffer)
3311 {
3312         uint32_t packet_size;
3313
3314         while (count > 0) {
3315                 packet_size = (count >= 0x100) ? 0x100 : count;
3316
3317                 /** set address */
3318                 addr &= 0xFFFFFFFC;
3319                 if (aice_write_misc(coreid, NDS_EDM_MISC_SBAR, addr | 1) != ERROR_OK)
3320                         return ERROR_FAIL;
3321
3322                 if (aice_fastwrite_mem(coreid, buffer,
3323                                         packet_size) != ERROR_OK)
3324                         return ERROR_FAIL;
3325
3326                 buffer += (packet_size * 4);
3327                 addr += (packet_size * 4);
3328                 count -= packet_size;
3329         }
3330
3331         return ERROR_OK;
3332 }
3333
3334 static int aice_usb_bulk_read_mem(uint32_t coreid, uint32_t addr,
3335                 uint32_t length, uint8_t *buffer)
3336 {
3337         LOG_DEBUG("aice_usb_bulk_read_mem, addr: 0x%08" PRIx32 ", length: 0x%08" PRIx32, addr, length);
3338
3339         int retval;
3340
3341         if (NDS_MEMORY_ACC_CPU == core_info[coreid].access_channel)
3342                 aice_usb_set_address_dim(coreid, addr);
3343
3344         if (NDS_MEMORY_ACC_CPU == core_info[coreid].access_channel)
3345                 retval = aice_usb_read_memory_unit(coreid, addr, 4, length / 4, buffer);
3346         else
3347                 retval = aice_bulk_read_mem(coreid, addr, length / 4, buffer);
3348
3349         return retval;
3350 }
3351
3352 static int aice_usb_bulk_write_mem(uint32_t coreid, uint32_t addr,
3353                 uint32_t length, const uint8_t *buffer)
3354 {
3355         LOG_DEBUG("aice_usb_bulk_write_mem, addr: 0x%08" PRIx32 ", length: 0x%08" PRIx32, addr, length);
3356
3357         int retval;
3358
3359         if (NDS_MEMORY_ACC_CPU == core_info[coreid].access_channel)
3360                 aice_usb_set_address_dim(coreid, addr);
3361
3362         if (NDS_MEMORY_ACC_CPU == core_info[coreid].access_channel)
3363                 retval = aice_usb_write_memory_unit(coreid, addr, 4, length / 4, buffer);
3364         else
3365                 retval = aice_bulk_write_mem(coreid, addr, length / 4, buffer);
3366
3367         return retval;
3368 }
3369
3370 static int aice_usb_read_debug_reg(uint32_t coreid, uint32_t addr, uint32_t *val)
3371 {
3372         if (AICE_TARGET_HALTED == core_info[coreid].core_state) {
3373                 if (NDS_EDM_SR_EDMSW == addr) {
3374                         *val = core_info[coreid].edmsw_backup;
3375                 } else if (NDS_EDM_SR_EDM_DTR == addr) {
3376                         if (core_info[coreid].target_dtr_valid) {
3377                                 /* if EDM_DTR has read out, clear it. */
3378                                 *val = core_info[coreid].target_dtr_backup;
3379                                 core_info[coreid].edmsw_backup &= (~0x1);
3380                                 core_info[coreid].target_dtr_valid = false;
3381                         } else {
3382                                 *val = 0;
3383                         }
3384                 }
3385         }
3386
3387         return aice_read_edmsr(coreid, addr, val);
3388 }
3389
3390 static int aice_usb_write_debug_reg(uint32_t coreid, uint32_t addr, const uint32_t val)
3391 {
3392         if (AICE_TARGET_HALTED == core_info[coreid].core_state) {
3393                 if (NDS_EDM_SR_EDM_DTR == addr) {
3394                         core_info[coreid].host_dtr_backup = val;
3395                         core_info[coreid].edmsw_backup |= 0x2;
3396                         core_info[coreid].host_dtr_valid = true;
3397                 }
3398         }
3399
3400         return aice_write_edmsr(coreid, addr, val);
3401 }
3402
3403 static int aice_usb_memory_access(uint32_t coreid, enum nds_memory_access channel)
3404 {
3405         LOG_DEBUG("aice_usb_memory_access, access channel: %u", channel);
3406
3407         core_info[coreid].access_channel = channel;
3408
3409         return ERROR_OK;
3410 }
3411
3412 static int aice_usb_memory_mode(uint32_t coreid, enum nds_memory_select mem_select)
3413 {
3414         if (core_info[coreid].memory_select == mem_select)
3415                 return ERROR_OK;
3416
3417         LOG_DEBUG("aice_usb_memory_mode, memory select: %u", mem_select);
3418
3419         core_info[coreid].memory_select = mem_select;
3420
3421         if (NDS_MEMORY_SELECT_AUTO != core_info[coreid].memory_select)
3422                 aice_write_misc(coreid, NDS_EDM_MISC_ACC_CTL,
3423                                 core_info[coreid].memory_select - 1);
3424         else
3425                 aice_write_misc(coreid, NDS_EDM_MISC_ACC_CTL,
3426                                 NDS_MEMORY_SELECT_MEM - 1);
3427
3428         return ERROR_OK;
3429 }
3430
3431 static int aice_usb_read_tlb(uint32_t coreid, uint32_t virtual_address,
3432                 uint32_t *physical_address)
3433 {
3434         LOG_DEBUG("aice_usb_read_tlb, virtual address: 0x%08" PRIx32, virtual_address);
3435
3436         uint32_t instructions[4];
3437         uint32_t probe_result;
3438         uint32_t value_mr3;
3439         uint32_t value_mr4;
3440         uint32_t access_page_size;
3441         uint32_t virtual_offset;
3442         uint32_t physical_page_number;
3443
3444         aice_write_dtr(coreid, virtual_address);
3445
3446         /* probe TLB first */
3447         instructions[0] = MFSR_DTR(R0);
3448         instructions[1] = TLBOP_TARGET_PROBE(R1, R0);
3449         instructions[2] = DSB;
3450         instructions[3] = BEQ_MINUS_12;
3451         aice_execute_dim(coreid, instructions, 4);
3452
3453         aice_read_reg(coreid, R1, &probe_result);
3454
3455         if (probe_result & 0x80000000)
3456                 return ERROR_FAIL;
3457
3458         /* read TLB entry */
3459         aice_write_dtr(coreid, probe_result & 0x7FF);
3460
3461         /* probe TLB first */
3462         instructions[0] = MFSR_DTR(R0);
3463         instructions[1] = TLBOP_TARGET_READ(R0);
3464         instructions[2] = DSB;
3465         instructions[3] = BEQ_MINUS_12;
3466         aice_execute_dim(coreid, instructions, 4);
3467
3468         /* TODO: it should backup mr3, mr4 */
3469         aice_read_reg(coreid, MR3, &value_mr3);
3470         aice_read_reg(coreid, MR4, &value_mr4);
3471
3472         access_page_size = value_mr4 & 0xF;
3473         if (0 == access_page_size) { /* 4K page */
3474                 virtual_offset = virtual_address & 0x00000FFF;
3475                 physical_page_number = value_mr3 & 0xFFFFF000;
3476         } else if (1 == access_page_size) { /* 8K page */
3477                 virtual_offset = virtual_address & 0x00001FFF;
3478                 physical_page_number = value_mr3 & 0xFFFFE000;
3479         } else if (5 == access_page_size) { /* 1M page */
3480                 virtual_offset = virtual_address & 0x000FFFFF;
3481                 physical_page_number = value_mr3 & 0xFFF00000;
3482         } else {
3483                 return ERROR_FAIL;
3484         }
3485
3486         *physical_address = physical_page_number | virtual_offset;
3487
3488         return ERROR_OK;
3489 }
3490
3491 static int aice_usb_init_cache(uint32_t coreid)
3492 {
3493         LOG_DEBUG("aice_usb_init_cache");
3494
3495         uint32_t value_cr1;
3496         uint32_t value_cr2;
3497
3498         aice_read_reg(coreid, CR1, &value_cr1);
3499         aice_read_reg(coreid, CR2, &value_cr2);
3500
3501         struct cache_info *icache = &core_info[coreid].icache;
3502
3503         icache->set = value_cr1 & 0x7;
3504         icache->log2_set = icache->set + 6;
3505         icache->set = 64 << icache->set;
3506         icache->way = ((value_cr1 >> 3) & 0x7) + 1;
3507         icache->line_size = (value_cr1 >> 6) & 0x7;
3508         if (icache->line_size != 0) {
3509                 icache->log2_line_size = icache->line_size + 2;
3510                 icache->line_size = 8 << (icache->line_size - 1);
3511         } else {
3512                 icache->log2_line_size = 0;
3513         }
3514
3515         LOG_DEBUG("\ticache set: %" PRIu32 ", way: %" PRIu32 ", line size: %" PRIu32 ", "
3516                         "log2(set): %" PRIu32 ", log2(line_size): %" PRIu32 "",
3517                         icache->set, icache->way, icache->line_size,
3518                         icache->log2_set, icache->log2_line_size);
3519
3520         struct cache_info *dcache = &core_info[coreid].dcache;
3521
3522         dcache->set = value_cr2 & 0x7;
3523         dcache->log2_set = dcache->set + 6;
3524         dcache->set = 64 << dcache->set;
3525         dcache->way = ((value_cr2 >> 3) & 0x7) + 1;
3526         dcache->line_size = (value_cr2 >> 6) & 0x7;
3527         if (dcache->line_size != 0) {
3528                 dcache->log2_line_size = dcache->line_size + 2;
3529                 dcache->line_size = 8 << (dcache->line_size - 1);
3530         } else {
3531                 dcache->log2_line_size = 0;
3532         }
3533
3534         LOG_DEBUG("\tdcache set: %" PRIu32 ", way: %" PRIu32 ", line size: %" PRIu32 ", "
3535                         "log2(set): %" PRIu32 ", log2(line_size): %" PRIu32 "",
3536                         dcache->set, dcache->way, dcache->line_size,
3537                         dcache->log2_set, dcache->log2_line_size);
3538
3539         core_info[coreid].cache_init = true;
3540
3541         return ERROR_OK;
3542 }
3543
3544 static int aice_usb_dcache_inval_all(uint32_t coreid)
3545 {
3546         LOG_DEBUG("aice_usb_dcache_inval_all");
3547
3548         uint32_t set_index;
3549         uint32_t way_index;
3550         uint32_t cache_index;
3551         uint32_t instructions[4];
3552
3553         instructions[0] = MFSR_DTR(R0);
3554         instructions[1] = L1D_IX_INVAL(R0);
3555         instructions[2] = DSB;
3556         instructions[3] = BEQ_MINUS_12;
3557
3558         struct cache_info *dcache = &core_info[coreid].dcache;
3559
3560         for (set_index = 0; set_index < dcache->set; set_index++) {
3561                 for (way_index = 0; way_index < dcache->way; way_index++) {
3562                         cache_index = (way_index << (dcache->log2_set + dcache->log2_line_size)) |
3563                                 (set_index << dcache->log2_line_size);
3564
3565                         if (ERROR_OK != aice_write_dtr(coreid, cache_index))
3566                                 return ERROR_FAIL;
3567
3568                         if (ERROR_OK != aice_execute_dim(coreid, instructions, 4))
3569                                 return ERROR_FAIL;
3570                 }
3571         }
3572
3573         return ERROR_OK;
3574 }
3575
3576 static int aice_usb_dcache_va_inval(uint32_t coreid, uint32_t address)
3577 {
3578         LOG_DEBUG("aice_usb_dcache_va_inval");
3579
3580         uint32_t instructions[4];
3581
3582         aice_write_dtr(coreid, address);
3583
3584         instructions[0] = MFSR_DTR(R0);
3585         instructions[1] = L1D_VA_INVAL(R0);
3586         instructions[2] = DSB;
3587         instructions[3] = BEQ_MINUS_12;
3588
3589         return aice_execute_dim(coreid, instructions, 4);
3590 }
3591
3592 static int aice_usb_dcache_wb_all(uint32_t coreid)
3593 {
3594         LOG_DEBUG("aice_usb_dcache_wb_all");
3595
3596         uint32_t set_index;
3597         uint32_t way_index;
3598         uint32_t cache_index;
3599         uint32_t instructions[4];
3600
3601         instructions[0] = MFSR_DTR(R0);
3602         instructions[1] = L1D_IX_WB(R0);
3603         instructions[2] = DSB;
3604         instructions[3] = BEQ_MINUS_12;
3605
3606         struct cache_info *dcache = &core_info[coreid].dcache;
3607
3608         for (set_index = 0; set_index < dcache->set; set_index++) {
3609                 for (way_index = 0; way_index < dcache->way; way_index++) {
3610                         cache_index = (way_index << (dcache->log2_set + dcache->log2_line_size)) |
3611                                 (set_index << dcache->log2_line_size);
3612
3613                         if (ERROR_OK != aice_write_dtr(coreid, cache_index))
3614                                 return ERROR_FAIL;
3615
3616                         if (ERROR_OK != aice_execute_dim(coreid, instructions, 4))
3617                                 return ERROR_FAIL;
3618                 }
3619         }
3620
3621         return ERROR_OK;
3622 }
3623
3624 static int aice_usb_dcache_va_wb(uint32_t coreid, uint32_t address)
3625 {
3626         LOG_DEBUG("aice_usb_dcache_va_wb");
3627
3628         uint32_t instructions[4];
3629
3630         aice_write_dtr(coreid, address);
3631
3632         instructions[0] = MFSR_DTR(R0);
3633         instructions[1] = L1D_VA_WB(R0);
3634         instructions[2] = DSB;
3635         instructions[3] = BEQ_MINUS_12;
3636
3637         return aice_execute_dim(coreid, instructions, 4);
3638 }
3639
3640 static int aice_usb_icache_inval_all(uint32_t coreid)
3641 {
3642         LOG_DEBUG("aice_usb_icache_inval_all");
3643
3644         uint32_t set_index;
3645         uint32_t way_index;
3646         uint32_t cache_index;
3647         uint32_t instructions[4];
3648
3649         instructions[0] = MFSR_DTR(R0);
3650         instructions[1] = L1I_IX_INVAL(R0);
3651         instructions[2] = ISB;
3652         instructions[3] = BEQ_MINUS_12;
3653
3654         struct cache_info *icache = &core_info[coreid].icache;
3655
3656         for (set_index = 0; set_index < icache->set; set_index++) {
3657                 for (way_index = 0; way_index < icache->way; way_index++) {
3658                         cache_index = (way_index << (icache->log2_set + icache->log2_line_size)) |
3659                                 (set_index << icache->log2_line_size);
3660
3661                         if (ERROR_OK != aice_write_dtr(coreid, cache_index))
3662                                 return ERROR_FAIL;
3663
3664                         if (ERROR_OK != aice_execute_dim(coreid, instructions, 4))
3665                                 return ERROR_FAIL;
3666                 }
3667         }
3668
3669         return ERROR_OK;
3670 }
3671
3672 static int aice_usb_icache_va_inval(uint32_t coreid, uint32_t address)
3673 {
3674         LOG_DEBUG("aice_usb_icache_va_inval");
3675
3676         uint32_t instructions[4];
3677
3678         aice_write_dtr(coreid, address);
3679
3680         instructions[0] = MFSR_DTR(R0);
3681         instructions[1] = L1I_VA_INVAL(R0);
3682         instructions[2] = ISB;
3683         instructions[3] = BEQ_MINUS_12;
3684
3685         return aice_execute_dim(coreid, instructions, 4);
3686 }
3687
3688 static int aice_usb_cache_ctl(uint32_t coreid, uint32_t subtype, uint32_t address)
3689 {
3690         LOG_DEBUG("aice_usb_cache_ctl");
3691
3692         int result;
3693
3694         if (core_info[coreid].cache_init == false)
3695                 aice_usb_init_cache(coreid);
3696
3697         switch (subtype) {
3698                 case AICE_CACHE_CTL_L1D_INVALALL:
3699                         result = aice_usb_dcache_inval_all(coreid);
3700                         break;
3701                 case AICE_CACHE_CTL_L1D_VA_INVAL:
3702                         result = aice_usb_dcache_va_inval(coreid, address);
3703                         break;
3704                 case AICE_CACHE_CTL_L1D_WBALL:
3705                         result = aice_usb_dcache_wb_all(coreid);
3706                         break;
3707                 case AICE_CACHE_CTL_L1D_VA_WB:
3708                         result = aice_usb_dcache_va_wb(coreid, address);
3709                         break;
3710                 case AICE_CACHE_CTL_L1I_INVALALL:
3711                         result = aice_usb_icache_inval_all(coreid);
3712                         break;
3713                 case AICE_CACHE_CTL_L1I_VA_INVAL:
3714                         result = aice_usb_icache_va_inval(coreid, address);
3715                         break;
3716                 default:
3717                         result = ERROR_FAIL;
3718                         break;
3719         }
3720
3721         return result;
3722 }
3723
3724 static int aice_usb_set_retry_times(uint32_t a_retry_times)
3725 {
3726         aice_max_retry_times = a_retry_times;
3727         return ERROR_OK;
3728 }
3729
3730 static int aice_usb_program_edm(uint32_t coreid, char *command_sequence)
3731 {
3732         char *command_str;
3733         char *reg_name_0;
3734         char *reg_name_1;
3735         uint32_t data_value;
3736         int i;
3737
3738         /* init strtok() */
3739         command_str = strtok(command_sequence, ";");
3740         if (command_str == NULL)
3741                 return ERROR_OK;
3742
3743         do {
3744                 i = 0;
3745                 /* process one command */
3746                 while (command_str[i] == ' ' ||
3747                                 command_str[i] == '\n' ||
3748                                 command_str[i] == '\r' ||
3749                                 command_str[i] == '\t')
3750                         i++;
3751
3752                 /* skip ' ', '\r', '\n', '\t' */
3753                 command_str = command_str + i;
3754
3755                 if (strncmp(command_str, "write_misc", 10) == 0) {
3756                         reg_name_0 = strstr(command_str, "gen_port0");
3757                         reg_name_1 = strstr(command_str, "gen_port1");
3758
3759                         if (reg_name_0 != NULL) {
3760                                 data_value = strtoul(reg_name_0 + 9, NULL, 0);
3761
3762                                 if (aice_write_misc(coreid,
3763                                                         NDS_EDM_MISC_GEN_PORT0, data_value) != ERROR_OK)
3764                                         return ERROR_FAIL;
3765
3766                         } else if (reg_name_1 != NULL) {
3767                                 data_value = strtoul(reg_name_1 + 9, NULL, 0);
3768
3769                                 if (aice_write_misc(coreid,
3770                                                         NDS_EDM_MISC_GEN_PORT1, data_value) != ERROR_OK)
3771                                         return ERROR_FAIL;
3772                         } else {
3773                                 LOG_ERROR("program EDM, unsupported misc register: %s", command_str);
3774                         }
3775                 } else {
3776                         LOG_ERROR("program EDM, unsupported command: %s", command_str);
3777                 }
3778
3779                 /* update command_str */
3780                 command_str = strtok(NULL, ";");
3781
3782         } while (command_str != NULL);
3783
3784         return ERROR_OK;
3785 }
3786
3787 static int aice_usb_set_command_mode(enum aice_command_mode command_mode)
3788 {
3789         int retval = ERROR_OK;
3790
3791         /* flush usb_packets_buffer as users change mode */
3792         retval = aice_usb_packet_flush();
3793
3794         if (AICE_COMMAND_MODE_BATCH == command_mode) {
3795                 /* reset batch buffer */
3796                 aice_command_mode = AICE_COMMAND_MODE_NORMAL;
3797                 retval = aice_write_ctrl(AICE_WRITE_CTRL_BATCH_CMD_BUF0_CTRL, 0x40000);
3798         }
3799
3800         aice_command_mode = command_mode;
3801
3802         return retval;
3803 }
3804
3805 static int aice_usb_execute(uint32_t coreid, uint32_t *instructions,
3806                 uint32_t instruction_num)
3807 {
3808         uint32_t i, j;
3809         uint8_t current_instruction_num;
3810         uint32_t dim_instructions[4] = {NOP, NOP, NOP, BEQ_MINUS_12};
3811
3812         /* To execute 4 instructions as a special case */
3813         if (instruction_num == 4)
3814                 return aice_execute_dim(coreid, instructions, 4);
3815
3816         for (i = 0 ; i < instruction_num ; i += 3) {
3817                 if (instruction_num - i < 3) {
3818                         current_instruction_num = instruction_num - i;
3819                         for (j = current_instruction_num ; j < 3 ; j++)
3820                                 dim_instructions[j] = NOP;
3821                 } else {
3822                         current_instruction_num = 3;
3823                 }
3824
3825                 memcpy(dim_instructions, instructions + i,
3826                                 current_instruction_num * sizeof(uint32_t));
3827
3828                 /** fill DIM */
3829                 if (aice_write_dim(coreid,
3830                                         dim_instructions,
3831                                         4) != ERROR_OK)
3832                         return ERROR_FAIL;
3833
3834                 /** clear DBGER.DPED */
3835                 if (aice_write_misc(coreid,
3836                                         NDS_EDM_MISC_DBGER, NDS_DBGER_DPED) != ERROR_OK)
3837                         return ERROR_FAIL;
3838
3839                 /** execute DIM */
3840                 if (aice_do_execute(coreid) != ERROR_OK)
3841                         return ERROR_FAIL;
3842
3843                 /** check DBGER.DPED */
3844                 if (aice_check_dbger(coreid, NDS_DBGER_DPED) != ERROR_OK) {
3845
3846                         LOG_ERROR("<-- TARGET ERROR! Debug operations do not finish properly:"
3847                                         "0x%08" PRIx32 " 0x%08" PRIx32 " 0x%08" PRIx32 " 0x%08" PRIx32 ". -->",
3848                                         dim_instructions[0],
3849                                         dim_instructions[1],
3850                                         dim_instructions[2],
3851                                         dim_instructions[3]);
3852                         return ERROR_FAIL;
3853                 }
3854         }
3855
3856         return ERROR_OK;
3857 }
3858
3859 static int aice_usb_set_custom_srst_script(const char *script)
3860 {
3861         custom_srst_script = strdup(script);
3862
3863         return ERROR_OK;
3864 }
3865
3866 static int aice_usb_set_custom_trst_script(const char *script)
3867 {
3868         custom_trst_script = strdup(script);
3869
3870         return ERROR_OK;
3871 }
3872
3873 static int aice_usb_set_custom_restart_script(const char *script)
3874 {
3875         custom_restart_script = strdup(script);
3876
3877         return ERROR_OK;
3878 }
3879
3880 static int aice_usb_set_count_to_check_dbger(uint32_t count_to_check)
3881 {
3882         aice_count_to_check_dbger = count_to_check;
3883
3884         return ERROR_OK;
3885 }
3886
3887 static int aice_usb_set_data_endian(uint32_t coreid,
3888                 enum aice_target_endian target_data_endian)
3889 {
3890         data_endian = target_data_endian;
3891
3892         return ERROR_OK;
3893 }
3894
3895 static int fill_profiling_batch_commands(uint32_t coreid, uint32_t reg_no)
3896 {
3897         uint32_t dim_instructions[4];
3898
3899         aice_usb_set_command_mode(AICE_COMMAND_MODE_BATCH);
3900
3901         /* halt */
3902         if (aice_write_misc(coreid, NDS_EDM_MISC_EDM_CMDR, 0) != ERROR_OK)
3903                 return ERROR_FAIL;
3904
3905         /* backup $r0 */
3906         dim_instructions[0] = MTSR_DTR(0);
3907         dim_instructions[1] = DSB;
3908         dim_instructions[2] = NOP;
3909         dim_instructions[3] = BEQ_MINUS_12;
3910         if (aice_write_dim(coreid, dim_instructions, 4) != ERROR_OK)
3911                 return ERROR_FAIL;
3912         aice_read_dtr_to_buffer(coreid, AICE_BATCH_DATA_BUFFER_0);
3913
3914         /* get samples */
3915         if (NDS32_REG_TYPE_GPR == nds32_reg_type(reg_no)) {
3916                 /* general registers */
3917                 dim_instructions[0] = MTSR_DTR(reg_no);
3918                 dim_instructions[1] = DSB;
3919                 dim_instructions[2] = NOP;
3920                 dim_instructions[3] = BEQ_MINUS_12;
3921         } else if (NDS32_REG_TYPE_SPR == nds32_reg_type(reg_no)) {
3922                 /* user special registers */
3923                 dim_instructions[0] = MFUSR_G0(0, nds32_reg_sr_index(reg_no));
3924                 dim_instructions[1] = MTSR_DTR(0);
3925                 dim_instructions[2] = DSB;
3926                 dim_instructions[3] = BEQ_MINUS_12;
3927         } else { /* system registers */
3928                 dim_instructions[0] = MFSR(0, nds32_reg_sr_index(reg_no));
3929                 dim_instructions[1] = MTSR_DTR(0);
3930                 dim_instructions[2] = DSB;
3931                 dim_instructions[3] = BEQ_MINUS_12;
3932         }
3933         if (aice_write_dim(coreid, dim_instructions, 4) != ERROR_OK)
3934                 return ERROR_FAIL;
3935         aice_read_dtr_to_buffer(coreid, AICE_BATCH_DATA_BUFFER_1);
3936
3937         /* restore $r0 */
3938         aice_write_dtr_from_buffer(coreid, AICE_BATCH_DATA_BUFFER_0);
3939         dim_instructions[0] = MFSR_DTR(0);
3940         dim_instructions[1] = DSB;
3941         dim_instructions[2] = NOP;
3942         dim_instructions[3] = IRET;  /* free run */
3943         if (aice_write_dim(coreid, dim_instructions, 4) != ERROR_OK)
3944                 return ERROR_FAIL;
3945
3946         aice_command_mode = AICE_COMMAND_MODE_NORMAL;
3947
3948         /* use BATCH_BUFFER_WRITE to fill command-batch-buffer */
3949         if (aice_batch_buffer_write(AICE_BATCH_COMMAND_BUFFER_0,
3950                                 usb_out_packets_buffer,
3951                                 (usb_out_packets_buffer_length + 3) / 4) != ERROR_OK)
3952                 return ERROR_FAIL;
3953
3954         usb_out_packets_buffer_length = 0;
3955         usb_in_packets_buffer_length = 0;
3956
3957         return ERROR_OK;
3958 }
3959
3960 static int aice_usb_profiling(uint32_t coreid, uint32_t interval, uint32_t iteration,
3961                 uint32_t reg_no, uint32_t *samples, uint32_t *num_samples)
3962 {
3963         uint32_t iteration_count;
3964         uint32_t this_iteration;
3965         int retval = ERROR_OK;
3966         const uint32_t MAX_ITERATION = 250;
3967
3968         *num_samples = 0;
3969
3970         /* init DIM size */
3971         if (aice_write_ctrl(AICE_WRITE_CTRL_BATCH_DIM_SIZE, 4) != ERROR_OK)
3972                 return ERROR_FAIL;
3973
3974         /* Use AICE_BATCH_DATA_BUFFER_0 to read/write $DTR.
3975          * Set it to circular buffer */
3976         if (aice_write_ctrl(AICE_WRITE_CTRL_BATCH_DATA_BUF0_CTRL, 0xC0000) != ERROR_OK)
3977                 return ERROR_FAIL;
3978
3979         fill_profiling_batch_commands(coreid, reg_no);
3980
3981         iteration_count = 0;
3982         while (iteration_count < iteration) {
3983                 if (iteration - iteration_count < MAX_ITERATION)
3984                         this_iteration = iteration - iteration_count;
3985                 else
3986                         this_iteration = MAX_ITERATION;
3987
3988                 /* set number of iterations */
3989                 uint32_t val_iteration;
3990                 val_iteration = interval << 16 | this_iteration;
3991                 if (aice_write_ctrl(AICE_WRITE_CTRL_BATCH_ITERATION,
3992                                         val_iteration) != ERROR_OK) {
3993                         retval = ERROR_FAIL;
3994                         goto end_profiling;
3995                 }
3996
3997                 /* init AICE_WRITE_CTRL_BATCH_DATA_BUF1_CTRL to store $PC */
3998                 if (aice_write_ctrl(AICE_WRITE_CTRL_BATCH_DATA_BUF1_CTRL,
3999                                         0x40000) != ERROR_OK) {
4000                         retval = ERROR_FAIL;
4001                         goto end_profiling;
4002                 }
4003
4004                 aice_usb_run(coreid);
4005
4006                 /* enable BATCH command */
4007                 if (aice_write_ctrl(AICE_WRITE_CTRL_BATCH_CTRL,
4008                                         0x80000000) != ERROR_OK) {
4009                         aice_usb_halt(coreid);
4010                         retval = ERROR_FAIL;
4011                         goto end_profiling;
4012                 }
4013
4014                 /* wait a while (AICE bug, workaround) */
4015                 alive_sleep(this_iteration);
4016
4017                 /* check status */
4018                 uint32_t i;
4019                 uint32_t batch_status;
4020
4021                 i = 0;
4022                 while (1) {
4023                         aice_read_ctrl(AICE_READ_CTRL_BATCH_STATUS, &batch_status);
4024
4025                         if (batch_status & 0x1) {
4026                                 break;
4027                         } else if (batch_status & 0xE) {
4028                                 aice_usb_halt(coreid);
4029                                 retval = ERROR_FAIL;
4030                                 goto end_profiling;
4031                         }
4032
4033                         if ((i % 30) == 0)
4034                                 keep_alive();
4035
4036                         i++;
4037                 }
4038
4039                 aice_usb_halt(coreid);
4040
4041                 /* get samples from batch data buffer */
4042                 if (aice_batch_buffer_read(AICE_BATCH_DATA_BUFFER_1,
4043                                         samples + iteration_count, this_iteration) != ERROR_OK) {
4044                         retval = ERROR_FAIL;
4045                         goto end_profiling;
4046                 }
4047
4048                 iteration_count += this_iteration;
4049         }
4050
4051 end_profiling:
4052         *num_samples = iteration_count;
4053
4054         return retval;
4055 }
4056
4057 /** */
4058 struct aice_port_api_s aice_usb_api = {
4059         /** */
4060         .open = aice_open_device,
4061         /** */
4062         .close = aice_usb_close,
4063         /** */
4064         .idcode = aice_usb_idcode,
4065         /** */
4066         .state = aice_usb_state,
4067         /** */
4068         .reset = aice_usb_reset,
4069         /** */
4070         .assert_srst = aice_usb_assert_srst,
4071         /** */
4072         .run = aice_usb_run,
4073         /** */
4074         .halt = aice_usb_halt,
4075         /** */
4076         .step = aice_usb_step,
4077         /** */
4078         .read_reg = aice_usb_read_reg,
4079         /** */
4080         .write_reg = aice_usb_write_reg,
4081         /** */
4082         .read_reg_64 = aice_usb_read_reg_64,
4083         /** */
4084         .write_reg_64 = aice_usb_write_reg_64,
4085         /** */
4086         .read_mem_unit = aice_usb_read_memory_unit,
4087         /** */
4088         .write_mem_unit = aice_usb_write_memory_unit,
4089         /** */
4090         .read_mem_bulk = aice_usb_bulk_read_mem,
4091         /** */
4092         .write_mem_bulk = aice_usb_bulk_write_mem,
4093         /** */
4094         .read_debug_reg = aice_usb_read_debug_reg,
4095         /** */
4096         .write_debug_reg = aice_usb_write_debug_reg,
4097         /** */
4098         .set_jtag_clock = aice_usb_set_jtag_clock,
4099         /** */
4100         .memory_access = aice_usb_memory_access,
4101         /** */
4102         .memory_mode = aice_usb_memory_mode,
4103         /** */
4104         .read_tlb = aice_usb_read_tlb,
4105         /** */
4106         .cache_ctl = aice_usb_cache_ctl,
4107         /** */
4108         .set_retry_times = aice_usb_set_retry_times,
4109         /** */
4110         .program_edm = aice_usb_program_edm,
4111         /** */
4112         .set_command_mode = aice_usb_set_command_mode,
4113         /** */
4114         .execute = aice_usb_execute,
4115         /** */
4116         .set_custom_srst_script = aice_usb_set_custom_srst_script,
4117         /** */
4118         .set_custom_trst_script = aice_usb_set_custom_trst_script,
4119         /** */
4120         .set_custom_restart_script = aice_usb_set_custom_restart_script,
4121         /** */
4122         .set_count_to_check_dbger = aice_usb_set_count_to_check_dbger,
4123         /** */
4124         .set_data_endian = aice_usb_set_data_endian,
4125         /** */
4126         .profiling = aice_usb_profiling,
4127 };