-static void as_add_tx1(struct algorithm_steps *as, uint8_t byte)
-{
- uint8_t data[1];
- data[0] = byte;
- as_add_tx(as, 1, data);
-}
-
-static void as_add_write_reg(struct algorithm_steps *as, uint8_t offset, uint8_t data)
-{
- uint8_t *step = malloc(3);
- step[0] = STEP_WRITE_REG;
- step[1] = offset;
- step[2] = data;
- as_add_step(as, step);
-}
-
-static void as_add_txwm_wait(struct algorithm_steps *as)
-{
- uint8_t *step = malloc(1);
- step[0] = STEP_TXWM_WAIT;
- as_add_step(as, step);
-}
-
-static void as_add_wip_wait(struct algorithm_steps *as)
-{
- uint8_t *step = malloc(1);
- step[0] = STEP_WIP_WAIT;
- as_add_step(as, step);
-}
-
-static void as_add_set_dir(struct algorithm_steps *as, bool dir)
-{
- uint8_t *step = malloc(2);
- step[0] = STEP_SET_DIR;
- step[1] = FESPI_FMT_DIR(dir);
- as_add_step(as, step);
-}
-
-/* This should write something less than or equal to a page.*/
-static int steps_add_buffer_write(struct algorithm_steps *as,
- const uint8_t *buffer, uint32_t chip_offset, uint32_t len)
-{
- if (chip_offset & 0xFF000000) {
- LOG_ERROR("FESPI interface does not support greater than 3B addressing, can't write to offset 0x%x",
- chip_offset);
- return ERROR_FAIL;
- }
-
- as_add_tx1(as, SPIFLASH_WRITE_ENABLE);
- as_add_txwm_wait(as);
- as_add_write_reg(as, FESPI_REG_CSMODE, FESPI_CSMODE_HOLD);
-
- uint8_t setup[] = {
- SPIFLASH_PAGE_PROGRAM,
- chip_offset >> 16,
- chip_offset >> 8,
- chip_offset,
- };
- as_add_tx(as, sizeof(setup), setup);
-
- as_add_tx(as, len, buffer);
- as_add_txwm_wait(as);
- as_add_write_reg(as, FESPI_REG_CSMODE, FESPI_CSMODE_AUTO);
-
- /* fespi_wip() */
- as_add_set_dir(as, FESPI_DIR_RX);
- as_add_write_reg(as, FESPI_REG_CSMODE, FESPI_CSMODE_HOLD);
- as_add_wip_wait(as);
- as_add_write_reg(as, FESPI_REG_CSMODE, FESPI_CSMODE_AUTO);
- as_add_set_dir(as, FESPI_DIR_TX);
-
- return ERROR_OK;
-}
-
-static int steps_execute(struct algorithm_steps *as,
- struct flash_bank *bank, struct working_area *algorithm_wa,
- struct working_area *data_wa)
-{
- struct target *target = bank->target;
- struct fespi_flash_bank *fespi_info = bank->driver_priv;
- uint32_t ctrl_base = fespi_info->ctrl_base;
- int xlen = riscv_xlen(target);
-
- struct reg_param reg_params[2];
- init_reg_param(®_params[0], "a0", xlen, PARAM_OUT);
- init_reg_param(®_params[1], "a1", xlen, PARAM_OUT);
- buf_set_u64(reg_params[0].value, 0, xlen, ctrl_base);
- buf_set_u64(reg_params[1].value, 0, xlen, data_wa->address);
-
- int retval = ERROR_OK;
- while (!as_empty(as)) {
- keep_alive();
- uint8_t *data_buf = malloc(data_wa->size);
- unsigned bytes = as_compile(as, data_buf, data_wa->size);
- retval = target_write_buffer(target, data_wa->address, bytes,
- data_buf);
- free(data_buf);
- if (retval != ERROR_OK) {
- LOG_ERROR("Failed to write data to " TARGET_ADDR_FMT ": %d",
- data_wa->address, retval);
- goto exit;
- }
-
- retval = target_run_algorithm(target, 0, NULL, 2, reg_params,
- algorithm_wa->address, algorithm_wa->address + 4,
- 10000, NULL);
- if (retval != ERROR_OK) {
- LOG_ERROR("Failed to execute algorithm at " TARGET_ADDR_FMT ": %d",
- algorithm_wa->address, retval);
- goto exit;
- }
- }
-
-exit:
- destroy_reg_param(®_params[1]);
- destroy_reg_param(®_params[0]);
- return retval;
-}