- LOG_DEBUG("EJTAG: features:%s%s%s%s%s%s%s",
- ejtag_info->impcode & (1 << 28) ? " R3k": " R4k",
- ejtag_info->impcode & (1 << 24) ? " DINT": "",
- ejtag_info->impcode & (1 << 22) ? " ASID_8": "",
- ejtag_info->impcode & (1 << 21) ? " ASID_6": "",
- ejtag_info->impcode & (1 << 16) ? " MIPS16": "",
- ejtag_info->impcode & (1 << 14) ? " noDMA": " DMA",
- ejtag_info->impcode & (1 << 0) ? " MIPS64": " MIPS32"
-);
-
- if ((ejtag_info->impcode & (1 << 14)) == 0)
- LOG_DEBUG("EJTAG: DMA Access Mode Support Enabled");
-
- /* set initial state for ejtag control reg */
- ejtag_info->ejtag_ctrl = EJTAG_CTRL_ROCC | EJTAG_CTRL_PRACC | EJTAG_CTRL_PROBEN | EJTAG_CTRL_SETDEV;
+ ejtag_main_print_imp(ejtag_info);
+
+ if ((ejtag_info->impcode & EJTAG_IMP_NODMA) == 0) {
+ LOG_DEBUG("EJTAG: DMA Access Mode detected. Disabling to "
+ "workaround current broken code.");
+ ejtag_info->impcode |= EJTAG_IMP_NODMA;
+ }
+
+ ejtag_info->ejtag_ctrl = EJTAG_CTRL_PRACC | EJTAG_CTRL_PROBEN;
+
+ if (ejtag_info->ejtag_version != EJTAG_VERSION_20)
+ ejtag_info->ejtag_ctrl |= EJTAG_CTRL_ROCC | EJTAG_CTRL_SETDEV;
+
+ ejtag_info->fast_access_save = -1;
+
+ mips_ejtag_init_mmr(ejtag_info);
+
+ return ERROR_OK;
+}
+
+int mips_ejtag_fastdata_scan(struct mips_ejtag *ejtag_info, int write_t, uint32_t *data)
+{
+ assert(ejtag_info->tap != NULL);
+ struct jtag_tap *tap = ejtag_info->tap;
+
+ struct scan_field fields[2];
+
+ /* fastdata 1-bit register */
+ fields[0].num_bits = 1;
+
+ uint8_t spracc = 0;
+ fields[0].out_value = &spracc;
+ fields[0].in_value = NULL;
+
+ /* processor access data register 32 bit */
+ fields[1].num_bits = 32;
+
+ uint8_t t[4] = {0, 0, 0, 0};
+ fields[1].out_value = t;
+
+ if (write_t) {
+ fields[1].in_value = NULL;
+ buf_set_u32(t, 0, 32, *data);
+ } else
+ fields[1].in_value = (uint8_t *) data;
+
+ jtag_add_dr_scan(tap, 2, fields, TAP_IDLE);
+
+ if (!write_t && data)
+ jtag_add_callback(mips_le_to_h_u32,
+ (jtag_callback_data_t) data);
+
+ keep_alive();