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.
This commit is contained in:
parent
5dbad6b0c9
commit
2f1b6b5803
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue