[RFC] mips: Enable bulk write optimization for all writes

mips_m4k_bulk_write_memory was only called from target_write_buffer as an
optimization when the word count was large enough.

Remove mips_m4k_bulk_write_memory from the target type, causing the default
implementation to call the regular mips_m4k_write_memory instead.

Perform the dispatch to bulk write in mips_m4k_write_memory, enabling the
optimization for target_write_memory() writes with size 4, in addition to
target_write_buffer() writes.

It also enables making the choice of bulk write vs regular write
specifically for the architecture and not relying on the generic target
code to make a sensible decision.

Change-Id: I295f21a67ceaa195802403f2518ea2e0a025c1c7
Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-on: http://openocd.zylin.com/1215
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Tested-by: jenkins
__archive__
Andreas Fritiofson 2013-03-09 10:44:07 +01:00
parent 8e4c80c17d
commit b8c44b3fd7
1 changed files with 13 additions and 13 deletions

View File

@ -46,6 +46,8 @@ static int mips_m4k_internal_restore(struct target *target, int current,
uint32_t address, int handle_breakpoints, uint32_t address, int handle_breakpoints,
int debug_execution); int debug_execution);
static int mips_m4k_halt(struct target *target); static int mips_m4k_halt(struct target *target);
static int mips_m4k_bulk_write_memory(struct target *target, uint32_t address,
uint32_t count, const uint8_t *buffer);
static int mips_m4k_examine_debug_reason(struct target *target) static int mips_m4k_examine_debug_reason(struct target *target)
{ {
@ -978,6 +980,13 @@ static int mips_m4k_write_memory(struct target *target, uint32_t address,
return ERROR_TARGET_NOT_HALTED; return ERROR_TARGET_NOT_HALTED;
} }
if (size == 4 && count > 32) {
int retval = mips_m4k_bulk_write_memory(target, address, count, buffer);
if (retval == ERROR_OK)
return ERROR_OK;
LOG_WARNING("Falling back to non-bulk write");
}
/* sanitize arguments */ /* sanitize arguments */
if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !(buffer)) if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !(buffer))
return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_COMMAND_SYNTAX_ERROR;
@ -1098,11 +1107,6 @@ static int mips_m4k_bulk_write_memory(struct target *target, uint32_t address,
LOG_DEBUG("address: 0x%8.8" PRIx32 ", count: 0x%8.8" PRIx32 "", address, count); LOG_DEBUG("address: 0x%8.8" PRIx32 ", count: 0x%8.8" PRIx32 "", address, count);
if (target->state != TARGET_HALTED) {
LOG_WARNING("target not halted");
return ERROR_TARGET_NOT_HALTED;
}
/* check alignment */ /* check alignment */
if (address & 0x3u) if (address & 0x3u)
return ERROR_TARGET_UNALIGNED_ACCESS; return ERROR_TARGET_UNALIGNED_ACCESS;
@ -1116,8 +1120,8 @@ static int mips_m4k_bulk_write_memory(struct target *target, uint32_t address,
MIPS32_FASTDATA_HANDLER_SIZE, MIPS32_FASTDATA_HANDLER_SIZE,
&mips32->fast_data_area); &mips32->fast_data_area);
if (retval != ERROR_OK) { if (retval != ERROR_OK) {
LOG_WARNING("No working area available, falling back to non-bulk write"); LOG_ERROR("No working area available");
return mips_m4k_write_memory(target, address, 4, count, buffer); return retval;
} }
/* reset fastadata state so the algo get reloaded */ /* reset fastadata state so the algo get reloaded */
@ -1141,11 +1145,8 @@ static int mips_m4k_bulk_write_memory(struct target *target, uint32_t address,
if (t != NULL) if (t != NULL)
free(t); free(t);
if (retval != ERROR_OK) { if (retval != ERROR_OK)
/* FASTDATA access failed, try normal memory write */ LOG_ERROR("Fastdata access Failed");
LOG_DEBUG("Fastdata access Failed, falling back to non-bulk write");
retval = mips_m4k_write_memory(target, address, 4, count, buffer);
}
return retval; return retval;
} }
@ -1368,7 +1369,6 @@ struct target_type mips_m4k_target = {
.read_memory = mips_m4k_read_memory, .read_memory = mips_m4k_read_memory,
.write_memory = mips_m4k_write_memory, .write_memory = mips_m4k_write_memory,
.bulk_write_memory = mips_m4k_bulk_write_memory,
.checksum_memory = mips32_checksum_memory, .checksum_memory = mips32_checksum_memory,
.blank_check_memory = mips32_blank_check_memory, .blank_check_memory = mips32_blank_check_memory,