Skip to content

Commit 5afed58

Browse files
authored
Merge pull request riscv-collab#1100 from en-sc/en-sc/single-as-batch
target/riscv: single DMI accesses via batch
2 parents 87c581a + 9a489be commit 5afed58

File tree

5 files changed

+74
-272
lines changed

5 files changed

+74
-272
lines changed

src/target/riscv/batch.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,23 +190,22 @@ int riscv_batch_run_from(struct riscv_batch *batch, size_t start_idx,
190190

191191
for (size_t i = start_idx; i < batch->used_scans; ++i) {
192192
const int delay = get_delay(batch, i, delays);
193-
riscv_log_dmi_scan(batch->target, delay, batch->fields + i,
194-
/*discard_in*/ false);
193+
riscv_log_dmi_scan(batch->target, delay, batch->fields + i);
195194
}
196195

197196
batch->was_run = true;
198197
batch->last_scan_delay = get_delay(batch, batch->used_scans - 1, delays);
199198
return ERROR_OK;
200199
}
201200

202-
void riscv_batch_add_dm_write(struct riscv_batch *batch, uint64_t address, uint32_t data,
201+
void riscv_batch_add_dmi_write(struct riscv_batch *batch, uint64_t address, uint32_t data,
203202
bool read_back, enum riscv_scan_delay_class delay_class)
204203
{
205204
assert(batch->used_scans < batch->allocated_scans);
206205
struct scan_field *field = batch->fields + batch->used_scans;
207206
field->num_bits = riscv_get_dmi_scan_length(batch->target);
208207
field->out_value = (void *)(batch->data_out + batch->used_scans * DMI_SCAN_BUF_SIZE);
209-
riscv_fill_dm_write(batch->target, (char *)field->out_value, address, data);
208+
riscv_fill_dmi_write(batch->target, (char *)field->out_value, address, data);
210209
if (read_back) {
211210
field->in_value = (void *)(batch->data_in + batch->used_scans * DMI_SCAN_BUF_SIZE);
212211
riscv_fill_dm_nop(batch->target, (char *)field->in_value);
@@ -218,15 +217,15 @@ void riscv_batch_add_dm_write(struct riscv_batch *batch, uint64_t address, uint3
218217
batch->used_scans++;
219218
}
220219

221-
size_t riscv_batch_add_dm_read(struct riscv_batch *batch, uint64_t address,
220+
size_t riscv_batch_add_dmi_read(struct riscv_batch *batch, uint64_t address,
222221
enum riscv_scan_delay_class delay_class)
223222
{
224223
assert(batch->used_scans < batch->allocated_scans);
225224
struct scan_field *field = batch->fields + batch->used_scans;
226225
field->num_bits = riscv_get_dmi_scan_length(batch->target);
227226
field->out_value = (void *)(batch->data_out + batch->used_scans * DMI_SCAN_BUF_SIZE);
228227
field->in_value = (void *)(batch->data_in + batch->used_scans * DMI_SCAN_BUF_SIZE);
229-
riscv_fill_dm_read(batch->target, (char *)field->out_value, address);
228+
riscv_fill_dmi_read(batch->target, (char *)field->out_value, address);
230229
riscv_fill_dm_nop(batch->target, (char *)field->in_value);
231230
batch->delay_classes[batch->used_scans] = delay_class;
232231
batch->last_scan = RISCV_SCAN_TYPE_READ;

src/target/riscv/batch.h

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,32 @@ int riscv_batch_run_from(struct riscv_batch *batch, size_t start_idx,
190190
size_t riscv_batch_finished_scans(const struct riscv_batch *batch);
191191

192192
/* Adds a DM register write to this batch. */
193-
void riscv_batch_add_dm_write(struct riscv_batch *batch, uint64_t address, uint32_t data,
193+
void riscv_batch_add_dmi_write(struct riscv_batch *batch, uint64_t address, uint32_t data,
194194
bool read_back, enum riscv_scan_delay_class delay_class);
195195

196+
static inline void
197+
riscv_batch_add_dm_write(struct riscv_batch *batch, uint64_t address, uint32_t data,
198+
bool read_back, enum riscv_scan_delay_class delay_type)
199+
{
200+
return riscv_batch_add_dmi_write(batch,
201+
riscv_get_dmi_address(batch->target, address), data,
202+
read_back, delay_type);
203+
}
204+
196205
/* DM register reads must be handled in two parts: the first one schedules a read and
197206
* provides a key, the second one actually obtains the result of the read -
198207
* status (op) and the actual data. */
199-
size_t riscv_batch_add_dm_read(struct riscv_batch *batch, uint64_t address,
208+
size_t riscv_batch_add_dmi_read(struct riscv_batch *batch, uint64_t address,
200209
enum riscv_scan_delay_class delay_class);
210+
211+
static inline size_t
212+
riscv_batch_add_dm_read(struct riscv_batch *batch, uint64_t address,
213+
enum riscv_scan_delay_class delay_type)
214+
{
215+
return riscv_batch_add_dmi_read(batch,
216+
riscv_get_dmi_address(batch->target, address), delay_type);
217+
}
218+
201219
unsigned int riscv_batch_get_dmi_read_op(const struct riscv_batch *batch, size_t key);
202220
uint32_t riscv_batch_get_dmi_read_data(const struct riscv_batch *batch, size_t key);
203221

@@ -213,7 +231,7 @@ bool riscv_batch_was_batch_busy(const struct riscv_batch *batch);
213231
/* TODO: The function is defined in `riscv-013.c`. This is done to reduce the
214232
* diff of the commit. The intention is to move the function definition to
215233
* a separate module (e.g. `riscv013-jtag-dtm.c/h`) in another commit. */
216-
void riscv_log_dmi_scan(const struct target *target, int idle, const struct scan_field *field,
217-
bool discard_in);
234+
void riscv_log_dmi_scan(const struct target *target, int idle,
235+
const struct scan_field *field);
218236

219237
#endif

0 commit comments

Comments
 (0)