mips: fix gaffe in previous commit
[fw/openocd] / src / target / mips32_pracc.c
index 11d5a43a317241e1c1f6d39e0583780c2466ff19..2dc7a8fb982f37f8d6ba9725ee7560e91036a4a3 100644 (file)
@@ -90,18 +90,36 @@ struct mips32_pracc_context
        struct mips_ejtag *ejtag_info;
 };
 
+static int mips32_pracc_read_mem8(struct mips_ejtag *ejtag_info,
+               uint32_t addr, int count, uint8_t *buf);
+static int mips32_pracc_read_mem16(struct mips_ejtag *ejtag_info,
+               uint32_t addr, int count, uint16_t *buf);
+static int mips32_pracc_read_mem32(struct mips_ejtag *ejtag_info,
+               uint32_t addr, int count, uint32_t *buf);
+static int mips32_pracc_read_u32(struct mips_ejtag *ejtag_info,
+               uint32_t addr, uint32_t *buf);
+
+static int mips32_pracc_write_mem8(struct mips_ejtag *ejtag_info,
+               uint32_t addr, int count, uint8_t *buf);
+static int mips32_pracc_write_mem16(struct mips_ejtag *ejtag_info,
+               uint32_t addr, int count, uint16_t *buf);
+static int mips32_pracc_write_mem32(struct mips_ejtag *ejtag_info,
+               uint32_t addr, int count, uint32_t *buf);
+static int mips32_pracc_write_u32(struct mips_ejtag *ejtag_info,
+               uint32_t addr, uint32_t *buf);
+
 static int wait_for_pracc_rw(struct mips_ejtag *ejtag_info, uint32_t *ctrl)
 {
        uint32_t ejtag_ctrl;
 
        while (1)
        {
-               mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
+               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_PRACC)
                        break;
-               LOG_DEBUG("DEBUGMODULE: No memory access in progress!\n");
+               LOG_DEBUG("DEBUGMODULE: No memory access in progress!");
                return ERROR_JTAG_DEVICE_ERROR;
        }
 
@@ -149,18 +167,16 @@ static int mips32_pracc_exec_read(struct mips32_pracc_context *ctx, uint32_t add
        }
 
        /* Send the data out */
-       mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_DATA, NULL);
+       mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_DATA);
        mips_ejtag_drscan_32(ctx->ejtag_info, &data);
 
        /* Clear the access pending bit (let the processor eat!) */
        ejtag_ctrl = ejtag_info->ejtag_ctrl & ~EJTAG_CTRL_PRACC;
-       mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_CONTROL, NULL);
+       mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_CONTROL);
        mips_ejtag_drscan_32(ctx->ejtag_info, &ejtag_ctrl);
 
        jtag_add_clocks(5);
-       jtag_execute_queue();
-
-       return ERROR_OK;
+       return jtag_execute_queue();
 }
 
 static int mips32_pracc_exec_write(struct mips32_pracc_context *ctx, uint32_t address)
@@ -169,16 +185,19 @@ static int mips32_pracc_exec_write(struct mips32_pracc_context *ctx, uint32_t ad
        int offset;
        struct mips_ejtag *ejtag_info = ctx->ejtag_info;
 
-       mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_DATA, NULL);
+       mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_DATA);
        mips_ejtag_drscan_32(ctx->ejtag_info, &data);
 
        /* Clear access pending bit */
        ejtag_ctrl = ejtag_info->ejtag_ctrl & ~EJTAG_CTRL_PRACC;
-       mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_CONTROL, NULL);
+       mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_CONTROL);
        mips_ejtag_drscan_32(ctx->ejtag_info, &ejtag_ctrl);
 
        jtag_add_clocks(5);
-       jtag_execute_queue();
+       int retval;
+       retval = jtag_execute_queue();
+       if (retval != ERROR_OK)
+               return retval;
 
        if ((address >= MIPS32_PRACC_PARAM_IN)
                && (address <= MIPS32_PRACC_PARAM_IN + ctx->num_iparam * 4))
@@ -206,7 +225,8 @@ static int mips32_pracc_exec_write(struct mips32_pracc_context *ctx, uint32_t ad
        return ERROR_OK;
 }
 
-int mips32_pracc_exec(struct mips_ejtag *ejtag_info, int code_len, const uint32_t *code, int num_param_in, uint32_t *param_in, int num_param_out, uint32_t *param_out, int cycle)
+int mips32_pracc_exec(struct mips_ejtag *ejtag_info, int code_len, const uint32_t *code,
+               int num_param_in, uint32_t *param_in, int num_param_out, uint32_t *param_out, int cycle)
 {
        uint32_t ejtag_ctrl;
        uint32_t address, data;
@@ -229,7 +249,7 @@ int mips32_pracc_exec(struct mips_ejtag *ejtag_info, int code_len, const uint32_
                        return retval;
 
                address = data = 0;
-               mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS, NULL);
+               mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS);
                mips_ejtag_drscan_32(ejtag_info, &address);
 
                /* Check for read or write */
@@ -283,7 +303,7 @@ int mips32_pracc_read_mem(struct mips_ejtag *ejtag_info, uint32_t addr, int size
        return ERROR_OK;
 }
 
-int mips32_pracc_read_mem32(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint32_t *buf)
+static int mips32_pracc_read_mem32(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint32_t *buf)
 {
        static const uint32_t code[] = {
                                                                                                                        /* start: */
@@ -353,7 +373,7 @@ int mips32_pracc_read_mem32(struct mips_ejtag *ejtag_info, uint32_t addr, int co
        return retval;
 }
 
-int mips32_pracc_read_u32(struct mips_ejtag *ejtag_info, uint32_t addr, uint32_t *buf)
+static int mips32_pracc_read_u32(struct mips_ejtag *ejtag_info, uint32_t addr, uint32_t *buf)
 {
        static const uint32_t code[] = {
                                                                                                                        /* start: */
@@ -386,7 +406,7 @@ int mips32_pracc_read_u32(struct mips_ejtag *ejtag_info, uint32_t addr, uint32_t
        return retval;
 }
 
-int mips32_pracc_read_mem16(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint16_t *buf)
+static int mips32_pracc_read_mem16(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint16_t *buf)
 {
        static const uint32_t code[] = {
                                                                                                                        /* start: */
@@ -463,7 +483,7 @@ int mips32_pracc_read_mem16(struct mips_ejtag *ejtag_info, uint32_t addr, int co
        return ERROR_OK;
 }
 
-int mips32_pracc_read_mem8(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint8_t *buf)
+static int mips32_pracc_read_mem8(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint8_t *buf)
 {
        static const uint32_t code[] = {
                                                                                                                        /* start: */
@@ -558,7 +578,7 @@ int mips32_pracc_write_mem(struct mips_ejtag *ejtag_info, uint32_t addr, int siz
        return ERROR_OK;
 }
 
-int mips32_pracc_write_mem32(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint32_t *buf)
+static int mips32_pracc_write_mem32(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint32_t *buf)
 {
        static const uint32_t code[] = {
                                                                                                                        /* start: */
@@ -607,7 +627,7 @@ int mips32_pracc_write_mem32(struct mips_ejtag *ejtag_info, uint32_t addr, int c
        return ERROR_OK;
 }
 
-int mips32_pracc_write_u32(struct mips_ejtag *ejtag_info, uint32_t addr, uint32_t *buf)
+static int mips32_pracc_write_u32(struct mips_ejtag *ejtag_info, uint32_t addr, uint32_t *buf)
 {
        static const uint32_t code[] = {
                                                                                                                        /* start: */
@@ -639,7 +659,7 @@ int mips32_pracc_write_u32(struct mips_ejtag *ejtag_info, uint32_t addr, uint32_
        return ERROR_OK;
 }
 
-int mips32_pracc_write_mem16(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint16_t *buf)
+static int mips32_pracc_write_mem16(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint16_t *buf)
 {
        static const uint32_t code[] = {
                                                                                                                        /* start: */
@@ -697,7 +717,7 @@ int mips32_pracc_write_mem16(struct mips_ejtag *ejtag_info, uint32_t addr, int c
        return ERROR_OK;
 }
 
-int mips32_pracc_write_mem8(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint8_t *buf)
+static int mips32_pracc_write_mem8(struct mips_ejtag *ejtag_info, uint32_t addr, int count, uint8_t *buf)
 {
        static const uint32_t code[] = {
                                                                                                                        /* start: */
@@ -909,7 +929,7 @@ int mips32_pracc_read_regs(struct mips_ejtag *ejtag_info, uint32_t *regs)
  * 3. data ...
  */
 int mips32_pracc_fastdata_xfer(struct mips_ejtag *ejtag_info, struct working_area *source,
-                                                               int write, uint32_t addr, int count, uint32_t *buf)
+                                                               int write_t, uint32_t addr, int count, uint32_t *buf)
 {
        uint32_t handler_code[] = {
                /* caution when editing, table is modified below */
@@ -954,7 +974,7 @@ int mips32_pracc_fastdata_xfer(struct mips_ejtag *ejtag_info, struct working_are
        if (source->size < MIPS32_FASTDATA_HANDLER_SIZE)
                return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
 
-       if (write)
+       if (write_t)
        {
                handler_code[8] = MIPS32_LW(11,0,8);    /* load data from probe at fastdata area */
                handler_code[9] = MIPS32_SW(11,0,9);    /* store data to RAM @ r9 */
@@ -966,9 +986,14 @@ int mips32_pracc_fastdata_xfer(struct mips_ejtag *ejtag_info, struct working_are
        }
 
        /* write program into RAM */
-       mips32_pracc_write_mem32(ejtag_info, source->address, ARRAY_SIZE(handler_code), handler_code);
+       if (write_t != ejtag_info->fast_access_save)
+       {
+               mips32_pracc_write_mem32(ejtag_info, source->address, ARRAY_SIZE(handler_code), handler_code);
+               /* save previous operation to speed to any consecutive read/writes */
+               ejtag_info->fast_access_save = write_t;
+       }
 
-       LOG_DEBUG("%s using 0x%.8x for write handler\n", __func__, source->address);
+       LOG_DEBUG("%s using 0x%.8" PRIx32 " for write handler", __func__, source->address);
 
        jmp_code[1] |= UPPER16(source->address);
        jmp_code[2] |= LOWER16(source->address);
@@ -978,12 +1003,12 @@ int mips32_pracc_fastdata_xfer(struct mips_ejtag *ejtag_info, struct working_are
                if ((retval = wait_for_pracc_rw(ejtag_info, &ejtag_ctrl)) != ERROR_OK)
                        return retval;
 
-               mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA, NULL);
+               mips_ejtag_set_instr(ejtag_info, EJTAG_INST_DATA);
                mips_ejtag_drscan_32(ejtag_info, &jmp_code[i]);
 
                /* Clear the access pending bit (let the processor eat!) */
                ejtag_ctrl = ejtag_info->ejtag_ctrl & ~EJTAG_CTRL_PRACC;
-               mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL, NULL);
+               mips_ejtag_set_instr(ejtag_info, EJTAG_INST_CONTROL);
                mips_ejtag_drscan_32(ejtag_info, &ejtag_ctrl);
        }
 
@@ -992,7 +1017,7 @@ int mips32_pracc_fastdata_xfer(struct mips_ejtag *ejtag_info, struct working_are
 
        /* next fetch to dmseg should be in FASTDATA_AREA, check */
        address = 0;
-       mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS, NULL);
+       mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS);
        mips_ejtag_drscan_32(ejtag_info, &address);
 
        if (address != MIPS32_PRACC_FASTDATA_AREA)
@@ -1000,18 +1025,18 @@ int mips32_pracc_fastdata_xfer(struct mips_ejtag *ejtag_info, struct working_are
 
        /* Send the load start address */
        val = addr;
-       mips_ejtag_set_instr(ejtag_info, EJTAG_INST_FASTDATA, NULL);
+       mips_ejtag_set_instr(ejtag_info, EJTAG_INST_FASTDATA);
        mips_ejtag_fastdata_scan(ejtag_info, 1, &val);
 
        /* Send the load end address */
        val = addr + (count - 1) * 4;
-       mips_ejtag_set_instr(ejtag_info, EJTAG_INST_FASTDATA, NULL);
+       mips_ejtag_set_instr(ejtag_info, EJTAG_INST_FASTDATA);
        mips_ejtag_fastdata_scan(ejtag_info, 1, &val);
 
        for (i = 0; i < count; i++)
        {
                /* Send the data out using fastdata (clears the access pending bit) */
-               if ((retval = mips_ejtag_fastdata_scan(ejtag_info, write, buf++)) != ERROR_OK)
+               if ((retval = mips_ejtag_fastdata_scan(ejtag_info, write_t, buf++)) != ERROR_OK)
                        return retval;
        }
 
@@ -1025,11 +1050,11 @@ int mips32_pracc_fastdata_xfer(struct mips_ejtag *ejtag_info, struct working_are
                return retval;
 
        address = 0;
-       mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS, NULL);
+       mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS);
        mips_ejtag_drscan_32(ejtag_info, &address);
 
        if (address != MIPS32_PRACC_TEXT)
-               LOG_ERROR("mini program did not return to start\n");
+               LOG_ERROR("mini program did not return to start");
 
        return retval;
 }