This is an automated email from Gerrit. Elta Era (elta....@gmail.com) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/1654
-- gerrit commit 25756cb772cde9cceef365e5431d140dd13b4418 Author: Dongxue Zhang <elta....@gmail.com> Date: Mon Sep 23 16:53:32 2013 +0800 targets: Add mips64 dma support patch 5 Add mips64 dma common files. Some ejtag use dma module, it can use this files. Change-Id: If6ec44fd06b69d5d0130e3a94643b1e394cfe1e4 Signed-off-by: Dongxue Zhang <elta....@gmail.com> diff --git a/src/target/Makefile.am b/src/target/Makefile.am index cf86f6f..dfea06f 100644 --- a/src/target/Makefile.am +++ b/src/target/Makefile.am @@ -114,7 +114,8 @@ MIPS32_SRC = \ MIPS64_SRC = \ mips64.c \ - mips64_pracc.c + mips64_pracc.c \ + mips64_dmaacc.c NDS32_SRC = \ nds32.c \ @@ -173,6 +174,7 @@ noinst_HEADERS = \ mips32_dmaacc.h \ mips64.h \ mips64_pracc.h \ + mips64_dmaacc.h \ oocd_trace.h \ register.h \ target.h \ diff --git a/src/target/mips64_dmaacc.c b/src/target/mips64_dmaacc.c new file mode 100644 index 0000000..45ab0f5 --- /dev/null +++ b/src/target/mips64_dmaacc.c @@ -0,0 +1,634 @@ +/*************************************************************************** + * Copyright (C) 2008 by John McCarthy * + * jg...@magma.ca * + * * + * Copyright (C) 2008 by Spencer Oliver * + * s...@spen-soft.co.uk * + * * + * Copyright (C) 2008 by David T.L. Wong * + * * + * Copyright (C) 2013 by Dongxue Zhang * + * elta....@gmail.com * + * * + * Copyright (C) 2013 by FengGao * + * gf91...@gmail.com * + * * + * Copyright (C) 2013 by Jia Liu * + * pro...@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "mips64_dmaacc.h" + +static int mips64_dmaacc_read_mem8(struct mips_ejtag *ejtag_info, + uint64_t addr, int count, uint8_t *buf); +static int mips64_dmaacc_read_mem16(struct mips_ejtag *ejtag_info, + uint64_t addr, int count, uint16_t *buf); +static int mips64_dmaacc_read_mem32(struct mips_ejtag *ejtag_info, + uint64_t addr, int count, uint32_t *buf); +static int mips64_dmaacc_read_mem64(struct mips_ejtag *ejtag_info, + uint64_t addr, int count, uint64_t *buf); + +static int mips64_dmaacc_write_mem8(struct mips_ejtag *ejtag_info, + uint64_t addr, int count, uint8_t *buf); +static int mips64_dmaacc_write_mem16(struct mips_ejtag *ejtag_info, + uint64_t addr, int count, uint16_t *buf); +static int mips64_dmaacc_write_mem32(struct mips_ejtag *ejtag_info, + uint64_t addr, int count, uint32_t *buf); +static int mips64_dmaacc_write_mem64(struct mips_ejtag *ejtag_info, + uint64_t addr, int count, uint64_t *buf); + +/* + * The following logic shamelessly cloned from HairyDairyMaid's wrt54g_debrick + * to support the Broadcom BCM5352 SoC in the Linksys WRT54GL wireless router + * (and any others that support EJTAG DMA transfers). + * Note: This only supports memory read/write. Since the BCM5352 doesn't + * appear to support PRACC accesses, all debug functions except halt + * do not work. Still, this does allow erasing/writing flash as well as + * displaying/modifying memory and memory mapped registers. + */ + +static int ejtag_dma_read(struct mips_ejtag *ejtag_info, uint64_t addr, uint64_t *data) +{ + uint64_t v; + uint32_t ejtag_ctrl; + int retries = RETRY_ATTEMPTS; + +begin_ejtag_dma_read: + + /* Setup Address */ + v = addr; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Initiate DMA Read & set DSTRT */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DRWN | EJTAG_CTRL_DMA_WORD | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + + /* Wait for DSTRT to Clear */ + do { + ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + } while (ejtag_ctrl & EJTAG_CTRL_DSTRT); + + /* Read Data */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA); + mips_ejtag_drscan_64(ejtag_info, data); + + /* Clear DMA & Check DERR */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + if (ejtag_ctrl & EJTAG_CTRL_DERR) { + if (retries--) { + LOG_ERROR("DMA Read Addr = %16.16" PRIx64 " Data = ERROR ON READ (retrying)", addr); + goto begin_ejtag_dma_read; + } else + LOG_ERROR("DMA Read Addr = %16.16" PRIx64 " Data = ERROR ON READ", addr); + return ERROR_JTAG_DEVICE_ERROR; + } + + return ERROR_OK; +} + +static int ejtag_dma_read_w(struct mips_ejtag *ejtag_info, uint64_t addr, uint32_t *data) +{ + uint64_t v; + uint32_t ejtag_ctrl; + int retries = RETRY_ATTEMPTS; + +begin_ejtag_dma_read: + + /* Setup Address */ + v = addr; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Initiate DMA Read & set DSTRT */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DRWN | EJTAG_CTRL_DMA_WORD | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + + /* Wait for DSTRT to Clear */ + do { + ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + } while (ejtag_ctrl & EJTAG_CTRL_DSTRT); + + /* Read Data */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA); + mips_ejtag_drscan_32(ejtag_info, data); + + /* Clear DMA & Check DERR */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + if (ejtag_ctrl & EJTAG_CTRL_DERR) { + if (retries--) { + LOG_ERROR("DMA Read Addr = %16.16" PRIx64 " Data = ERROR ON READ (retrying)", addr); + goto begin_ejtag_dma_read; + } else + LOG_ERROR("DMA Read Addr = %16.16" PRIx64 " Data = ERROR ON READ", addr); + return ERROR_JTAG_DEVICE_ERROR; + } + + /* Handle the bigendian/littleendian */ + if (addr & 0x2) + *data = (v >> 32) & 0xffffffff; + else + *data = (v & 0xffffffff); + + + return ERROR_OK; +} + +static int ejtag_dma_read_h(struct mips_ejtag *ejtag_info, uint64_t addr, uint16_t *data) +{ + uint64_t v; + uint32_t ejtag_ctrl; + int retries = RETRY_ATTEMPTS; + +begin_ejtag_dma_read_h: + + /* Setup Address */ + v = addr; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Initiate DMA Read & set DSTRT */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DRWN | EJTAG_CTRL_DMA_HALFWORD | + EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + + /* Wait for DSTRT to Clear */ + do { + ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + } while (ejtag_ctrl & EJTAG_CTRL_DSTRT); + + /* Read Data */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Clear DMA & Check DERR */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + if (ejtag_ctrl & EJTAG_CTRL_DERR) { + if (retries--) { + LOG_ERROR("DMA Read Addr = %16.16" PRIx64 " Data = ERROR ON READ (retrying)", addr); + goto begin_ejtag_dma_read_h; + } else + LOG_ERROR("DMA Read Addr = %16.16" PRIx64 " Data = ERROR ON READ", addr); + return ERROR_JTAG_DEVICE_ERROR; + } + + /* Handle the bigendian/littleendian */ + switch (addr & 0x3) { + case 0: + *data = v & 0xffff; + break; + case 1: + *data = (v >> 16) & 0xffff; + break; + case 2: + *data = (v >> 32) & 0xffff; + break; + case 3: + *data = (v >> 48) & 0xffff; + break; + } + + return ERROR_OK; +} + +static int ejtag_dma_read_b(struct mips_ejtag *ejtag_info, uint64_t addr, uint8_t *data) +{ + uint64_t v; + uint32_t ejtag_ctrl; + int retries = RETRY_ATTEMPTS; + +begin_ejtag_dma_read_b: + + /* Setup Address */ + v = addr; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Initiate DMA Read & set DSTRT */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DRWN | EJTAG_CTRL_DMA_BYTE | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + + /* Wait for DSTRT to Clear */ + do { + ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + } while (ejtag_ctrl & EJTAG_CTRL_DSTRT); + + /* Read Data */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Clear DMA & Check DERR */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + if (ejtag_ctrl & EJTAG_CTRL_DERR) { + if (retries--) { + LOG_ERROR("DMA Read Addr = %16.16" PRIx64 " Data = ERROR ON READ (retrying)", addr); + goto begin_ejtag_dma_read_b; + } else + LOG_ERROR("DMA Read Addr = %16.16" PRIx64 " Data = ERROR ON READ", addr); + return ERROR_JTAG_DEVICE_ERROR; + } + + /* Handle the bigendian/littleendian */ + switch (addr & 0x7) { + case 0: + *data = v & 0xff; + break; + case 1: + *data = (v >> 8) & 0xff; + break; + case 2: + *data = (v >> 16) & 0xff; + break; + case 3: + *data = (v >> 24) & 0xff; + break; + case 4: + *data = (v >> 32) & 0xff; + break; + case 5: + *data = (v >> 40) & 0xff; + break; + case 6: + *data = (v >> 48) & 0xff; + break; + case 7: + *data = (v >> 56) & 0xff; + break; + } + + return ERROR_OK; +} + +static int ejtag_dma_write(struct mips_ejtag *ejtag_info, uint64_t addr, uint64_t data) +{ + uint64_t v; + uint32_t ejtag_ctrl; + int retries = RETRY_ATTEMPTS; + +begin_ejtag_dma_write: + + /* Setup Address */ + v = addr; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Setup Data */ + v = data; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Initiate DMA Write & set DSTRT */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DMA_WORD | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + + /* Wait for DSTRT to Clear */ + do { + ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + } while (ejtag_ctrl & EJTAG_CTRL_DSTRT); + + /* Clear DMA & Check DERR */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + if (ejtag_ctrl & EJTAG_CTRL_DERR) { + if (retries--) { + LOG_ERROR("DMA Write Addr = %16.16" PRIx64 " Data = ERROR ON WRITE (retrying)", addr); + goto begin_ejtag_dma_write; + } else + LOG_ERROR("DMA Write Addr = %16.16" PRIx64 " Data = ERROR ON WRITE", addr); + return ERROR_JTAG_DEVICE_ERROR; + } + + return ERROR_OK; +} + +static int ejtag_dma_write_w(struct mips_ejtag *ejtag_info, uint64_t addr, uint64_t data) +{ + uint64_t v; + uint32_t ejtag_ctrl; + int retries = RETRY_ATTEMPTS; + + /* Handle the bigendian/littleendian */ + data &= 0xffffffff; + data |= data << 32; + +begin_ejtag_dma_write: + + /* Setup Address */ + v = addr; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Setup Data */ + v = data; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Initiate DMA Write & set DSTRT */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DMA_WORD | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + + /* Wait for DSTRT to Clear */ + do { + ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + } while (ejtag_ctrl & EJTAG_CTRL_DSTRT); + + /* Clear DMA & Check DERR */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + if (ejtag_ctrl & EJTAG_CTRL_DERR) { + if (retries--) { + LOG_ERROR("DMA Write Addr = %16.16" PRIx64 " Data = ERROR ON WRITE (retrying)", addr); + goto begin_ejtag_dma_write; + } else + LOG_ERROR("DMA Write Addr = %16.16" PRIx64 " Data = ERROR ON WRITE", addr); + return ERROR_JTAG_DEVICE_ERROR; + } + + return ERROR_OK; +} + +static int ejtag_dma_write_h(struct mips_ejtag *ejtag_info, uint64_t addr, uint64_t data) +{ + uint64_t v; + uint32_t ejtag_ctrl; + int retries = RETRY_ATTEMPTS; + + /* Handle the bigendian/littleendian */ + data &= 0xffff; + data |= data << 16; + data |= data << 32; + +begin_ejtag_dma_write_h: + + /* Setup Address */ + v = addr; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Setup Data */ + v = data; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Initiate DMA Write & set DSTRT */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DMA_HALFWORD | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + + /* Wait for DSTRT to Clear */ + do { + ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + } while (ejtag_ctrl & EJTAG_CTRL_DSTRT); + + /* Clear DMA & Check DERR */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + if (ejtag_ctrl & EJTAG_CTRL_DERR) { + if (retries--) { + LOG_ERROR("DMA Write Addr = %64" PRIx64 " Data = ERROR ON WRITE (retrying)", addr); + goto begin_ejtag_dma_write_h; + } else + LOG_ERROR("DMA Write Addr = %64" PRIx64 " Data = ERROR ON WRITE", addr); + return ERROR_JTAG_DEVICE_ERROR; + } + + return ERROR_OK; +} + +static int ejtag_dma_write_b(struct mips_ejtag *ejtag_info, uint64_t addr, uint64_t data) +{ + uint64_t v; + uint32_t ejtag_ctrl; + int retries = RETRY_ATTEMPTS; + + /* Handle the bigendian/littleendian */ + data &= 0xff; + data |= data << 8; + data |= data << 16; + data |= data << 32; + +begin_ejtag_dma_write_b: + + /* Setup Address*/ + v = addr; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Setup Data */ + v = data; + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA); + mips_ejtag_drscan_64(ejtag_info, &v); + + /* Initiate DMA Write & set DSTRT */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = EJTAG_CTRL_DMAACC | EJTAG_CTRL_DMA_BYTE | EJTAG_CTRL_DSTRT | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + + /* Wait for DSTRT to Clear */ + do { + ejtag_ctrl = EJTAG_CTRL_DMAACC | ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + } while (ejtag_ctrl & EJTAG_CTRL_DSTRT); + + /* Clear DMA & Check DERR */ + mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL); + ejtag_ctrl = ejtag_info->ejtag_ctrl; + mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl); + if (ejtag_ctrl & EJTAG_CTRL_DERR) { + if (retries--) { + LOG_ERROR("DMA Write Addr = %16.16" PRIx64 " Data = ERROR ON WRITE (retrying)", addr); + goto begin_ejtag_dma_write_b; + } else + LOG_ERROR("DMA Write Addr = %16.16" PRIx64 " Data = ERROR ON WRITE", addr); + return ERROR_JTAG_DEVICE_ERROR; + } + + return ERROR_OK; +} + +int mips64_dmaacc_read_mem(struct mips_ejtag *ejtag_info, uint64_t addr, int size, int count, void *buf) +{ + switch (size) { + case 1: + return mips64_dmaacc_read_mem8(ejtag_info, addr, count, (uint8_t *)buf); + case 2: + return mips64_dmaacc_read_mem16(ejtag_info, addr, count, (uint16_t *)buf); + case 4: + return mips64_dmaacc_read_mem32(ejtag_info, addr, count, (uint32_t *)buf); + case 8: + return mips64_dmaacc_read_mem64(ejtag_info, addr, count, (uint64_t *)buf); + } + + return ERROR_OK; +} + +static int mips64_dmaacc_read_mem64(struct mips_ejtag *ejtag_info, uint64_t addr, int count, uint64_t *buf) +{ + int i; + int retval; + + for (i = 0; i < count; i++) { + retval = ejtag_dma_read(ejtag_info, addr + i * sizeof(*buf), &buf[i]); + if (retval != ERROR_OK) + return retval; + } + + return ERROR_OK; +} + +static int mips64_dmaacc_read_mem32(struct mips_ejtag *ejtag_info, uint64_t addr, int count, uint32_t *buf) +{ + int i; + int retval; + + for (i = 0; i < count; i++) { + retval = ejtag_dma_read_w(ejtag_info, addr + i * sizeof(*buf), &buf[i]); + if (retval != ERROR_OK) + return retval; + } + + return ERROR_OK; +} + +static int mips64_dmaacc_read_mem16(struct mips_ejtag *ejtag_info, uint64_t addr, int count, uint16_t *buf) +{ + int i; + int retval; + + for (i = 0; i < count; i++) { + retval = ejtag_dma_read_h(ejtag_info, addr + i * sizeof(*buf), &buf[i]); + if (retval != ERROR_OK) + return retval; + } + + return ERROR_OK; +} + +static int mips64_dmaacc_read_mem8(struct mips_ejtag *ejtag_info, uint64_t addr, int count, uint8_t *buf) +{ + int i; + int retval; + + for (i = 0; i < count; i++) { + retval = ejtag_dma_read_b(ejtag_info, addr + i * sizeof(*buf), &buf[i]); + if (retval != ERROR_OK) + return retval; + } + + return ERROR_OK; +} + +int mips64_dmaacc_write_mem(struct mips_ejtag *ejtag_info, uint64_t addr, int size, int count, void *buf) +{ + switch (size) { + case 1: + return mips64_dmaacc_write_mem8(ejtag_info, addr, count, (uint8_t *)buf); + case 2: + return mips64_dmaacc_write_mem16(ejtag_info, addr, count, (uint16_t *)buf); + case 4: + return mips64_dmaacc_write_mem32(ejtag_info, addr, count, (uint32_t *)buf); + case 8: + return mips64_dmaacc_write_mem64(ejtag_info, addr, count, (uint64_t *)buf); + } + + return ERROR_OK; +} + +static int mips64_dmaacc_write_mem64(struct mips_ejtag *ejtag_info, uint64_t addr, int count, uint64_t *buf) +{ + int i; + int retval; + + for (i = 0; i < count; i++) { + retval = ejtag_dma_write(ejtag_info, addr + i * sizeof(*buf), buf[i]); + if (retval != ERROR_OK) + return retval; + } + + return ERROR_OK; +} + +static int mips64_dmaacc_write_mem32(struct mips_ejtag *ejtag_info, uint64_t addr, int count, uint32_t *buf) +{ + int i; + int retval; + + for (i = 0; i < count; i++) { + retval = ejtag_dma_write_w(ejtag_info, addr + i * sizeof(*buf), buf[i]); + if (retval != ERROR_OK) + return retval; + } + + return ERROR_OK; +} + +static int mips64_dmaacc_write_mem16(struct mips_ejtag *ejtag_info, uint64_t addr, int count, uint16_t *buf) +{ + int i; + int retval; + + for (i = 0; i < count; i++) { + retval = ejtag_dma_write_h(ejtag_info, addr + i * sizeof(*buf), buf[i]); + if (retval != ERROR_OK) + return retval; + } + + return ERROR_OK; +} + +static int mips64_dmaacc_write_mem8(struct mips_ejtag *ejtag_info, uint64_t addr, int count, uint8_t *buf) +{ + int i; + int retval; + + for (i = 0; i < count; i++) { + retval = ejtag_dma_write_b(ejtag_info, addr + i * sizeof(*buf), buf[i]); + if (retval != ERROR_OK) + return retval; + } + + return ERROR_OK; +} diff --git a/src/target/mips64_dmaacc.h b/src/target/mips64_dmaacc.h new file mode 100644 index 0000000..aeebb36 --- /dev/null +++ b/src/target/mips64_dmaacc.h @@ -0,0 +1,52 @@ +/*************************************************************************** + * Copyright (C) 2008 by John McCarthy * + * jg...@magma.ca * + * * + * Copyright (C) 2008 by Spencer Oliver * + * s...@spen-soft.co.uk * + * * + * Copyright (C) 2008 by David T.L. Wong * + * * + * Copyright (C) 2013 by Dongxue Zhang * + * elta....@gmail.com * + * * + * Copyright (C) 2013 by FengGao * + * gf91...@gmail.com * + * * + * Copyright (C) 2013 by Jia Liu * + * pro...@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef MIPS32_DMAACC_H +#define MIPS32_DMAACC_H + +#include "mips_ejtag.h" + +#define EJTAG_CTRL_DMA_BYTE 0x00000000 +#define EJTAG_CTRL_DMA_HALFWORD 0x00000080 +#define EJTAG_CTRL_DMA_WORD 0x00000100 +#define EJTAG_CTRL_DMA_TRIPLEBYTE 0x00000180 + +#define RETRY_ATTEMPTS 0 + +int mips64_dmaacc_read_mem(struct mips_ejtag *ejtag_info, + uint64_t addr, int size, int count, void *buf); +int mips64_dmaacc_write_mem(struct mips_ejtag *ejtag_info, + uint64_t addr, int size, int count, void *buf); + +#endif -- ------------------------------------------------------------------------------ LIMITED TIME SALE - Full Year of Microsoft Training For Just $49.99! 1,500+ hours of tutorials including VisualStudio 2012, Windows 8, SharePoint 2013, SQL 2012, MVC 4, more. BEST VALUE: New Multi-Library Power Pack includes Mobile, Cloud, Java, and UX Design. Lowest price ever! Ends 9/20/13. http://pubads.g.doubleclick.net/gampad/clk?id=58041151&iu=/4140/ostg.clktrk _______________________________________________ OpenOCD-devel mailing list OpenOCD-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openocd-devel