Stop using conditional writes.

It doesn't help, and makes the spec more complex. Now that I've proven
OpenOCD doesn't need it, I'll remove it from the spec.
__archive__
Tim Newsome 2016-07-29 17:01:00 -07:00
parent 5dbad6b0c9
commit 2f1b6b5803
1 changed files with 18 additions and 16 deletions

View File

@ -60,12 +60,10 @@
typedef enum { typedef enum {
DBUS_OP_NOP = 0, DBUS_OP_NOP = 0,
DBUS_OP_READ = 1, DBUS_OP_READ = 1,
DBUS_OP_WRITE = 2, DBUS_OP_WRITE = 2
DBUS_OP_CONDITIONAL_WRITE = 3
} dbus_op_t; } dbus_op_t;
typedef enum { typedef enum {
DBUS_STATUS_SUCCESS = 0, DBUS_STATUS_SUCCESS = 0,
DBUS_STATUS_NO_WRITE = 1,
DBUS_STATUS_FAILED = 2, DBUS_STATUS_FAILED = 2,
DBUS_STATUS_BUSY = 3 DBUS_STATUS_BUSY = 3
} dbus_status_t; } dbus_status_t;
@ -567,15 +565,15 @@ static int cache_write(struct target *target, unsigned int address, bool run)
switch (status) { switch (status) {
case DBUS_STATUS_SUCCESS: case DBUS_STATUS_SUCCESS:
break; break;
case DBUS_STATUS_NO_WRITE:
LOG_ERROR("Got no-write response to unconditional write. Hardware error?");
return ERROR_FAIL;
case DBUS_STATUS_FAILED: case DBUS_STATUS_FAILED:
LOG_ERROR("Debug RAM write failed. Hardware error?"); LOG_ERROR("Debug RAM write failed. Hardware error?");
return ERROR_FAIL; return ERROR_FAIL;
case DBUS_STATUS_BUSY: case DBUS_STATUS_BUSY:
errors++; errors++;
break; break;
default:
LOG_ERROR("Got invalid bus access status: %d", status);
return ERROR_FAIL;
} }
LOG_DEBUG("read scan=%d result=%d data=%09" PRIx64 " address=%02x", LOG_DEBUG("read scan=%d result=%d data=%09" PRIx64 " address=%02x",
i, i,
@ -1209,15 +1207,15 @@ static riscv_error_t handle_halt_routine(struct target *target)
switch (status) { switch (status) {
case DBUS_STATUS_SUCCESS: case DBUS_STATUS_SUCCESS:
break; break;
case DBUS_STATUS_NO_WRITE:
LOG_ERROR("Got no-write response without conditional write. Hardware error?");
goto error;
case DBUS_STATUS_FAILED: case DBUS_STATUS_FAILED:
LOG_ERROR("Debug access failed. Hardware error?"); LOG_ERROR("Debug access failed. Hardware error?");
goto error; goto error;
case DBUS_STATUS_BUSY: case DBUS_STATUS_BUSY:
dbus_busy++; dbus_busy++;
break; break;
default:
LOG_ERROR("Got invalid bus access status: %d", status);
return ERROR_FAIL;
} }
if (data & DMCONTROL_INTERRUPT) { if (data & DMCONTROL_INTERRUPT) {
interrupt_set++; interrupt_set++;
@ -1474,15 +1472,15 @@ static int riscv_read_memory(struct target *target, uint32_t address,
switch (status) { switch (status) {
case DBUS_STATUS_SUCCESS: case DBUS_STATUS_SUCCESS:
break; break;
case DBUS_STATUS_NO_WRITE:
LOG_ERROR("Got no-write status without conditional write.");
goto error;
case DBUS_STATUS_FAILED: case DBUS_STATUS_FAILED:
LOG_ERROR("Debug RAM write failed. Hardware error?"); LOG_ERROR("Debug RAM write failed. Hardware error?");
goto error; goto error;
case DBUS_STATUS_BUSY: case DBUS_STATUS_BUSY:
dbus_busy++; dbus_busy++;
break; break;
default:
LOG_ERROR("Got invalid bus access status: %d", status);
return ERROR_FAIL;
} }
uint64_t data = buf_get_u64(in + 8*j, DBUS_DATA_START, DBUS_DATA_SIZE); uint64_t data = buf_get_u64(in + 8*j, DBUS_DATA_START, DBUS_DATA_SIZE);
if (data & DMCONTROL_INTERRUPT) { if (data & DMCONTROL_INTERRUPT) {
@ -1637,7 +1635,7 @@ static int riscv_write_memory(struct target *target, uint32_t address,
} }
add_dbus_scan(target, &field[j], out + 8*j, in + 8*j, add_dbus_scan(target, &field[j], out + 8*j, in + 8*j,
DBUS_OP_CONDITIONAL_WRITE, 4, DMCONTROL_HALTNOT | DMCONTROL_INTERRUPT | value); DBUS_OP_WRITE, 4, DMCONTROL_HALTNOT | DMCONTROL_INTERRUPT | value);
} }
} }
@ -1655,15 +1653,19 @@ static int riscv_write_memory(struct target *target, uint32_t address,
switch (status) { switch (status) {
case DBUS_STATUS_SUCCESS: case DBUS_STATUS_SUCCESS:
break; break;
case DBUS_STATUS_NO_WRITE:
execute_busy++;
break;
case DBUS_STATUS_FAILED: case DBUS_STATUS_FAILED:
LOG_ERROR("Debug RAM write failed. Hardware error?"); LOG_ERROR("Debug RAM write failed. Hardware error?");
goto error; goto error;
case DBUS_STATUS_BUSY: case DBUS_STATUS_BUSY:
dbus_busy++; dbus_busy++;
break; break;
default:
LOG_ERROR("Got invalid bus access status: %d", status);
return ERROR_FAIL;
}
int interrupt = buf_get_u32(in + 8*j, DBUS_DATA_START + 33, 1);
if (interrupt) {
execute_busy++;
} }
uint64_t data = buf_get_u64(in + 8*j, DBUS_DATA_START, DBUS_DATA_SIZE); uint64_t data = buf_get_u64(in + 8*j, DBUS_DATA_START, DBUS_DATA_SIZE);
if (i + j == count + 1) { if (i + j == count + 1) {