driver/linuxspidev: Clear queue on allocation

SWD idle clocks are added to the queue by advancing the queue index
assuming the queue is zeroed. If the queue isn't zeroed, these idle
clocks end up being filled with junk data. Lets clear the queue and
associated buffers on queue allocation.

TEST: Connects successfully and ran the following TCL command:
  dump_image /dev/null 0x20000000 0x42000
  Host: Unnamed Qualcomm SoC with QUPv3 based SPI port
  Target: RT500

Signed-off-by: Richard Pasek <rpasek@google.com>
Change-Id: Ie660c10c27c4d0937ab0629138935ddbf5aeb0ae
Fixes: 83e0293f7b ("Add Linux SPI device SWD adapter support")
Reviewed-on: https://review.openocd.org/c/openocd/+/8730
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-by: Jonathon Reinhart <jrreinhart@google.com>
Tested-by: jenkins
This commit is contained in:
Richard Pasek 2025-01-30 05:38:08 -05:00 committed by Tomas Vanek
parent 82277462b9
commit d09f53a930
1 changed files with 15 additions and 7 deletions

View File

@ -230,10 +230,21 @@ static void spidev_free_queue(void)
tx_flip_buf = NULL;
}
static void spidev_clear_queue(void)
{
queue_fill = 0;
queue_buf_fill = 0;
memset(queue_infos, 0, sizeof(struct queue_info) * max_queue_entries);
memset(queue_tx_buf, 0, queue_buf_size);
memset(queue_rx_buf, 0, queue_buf_size);
memset(tx_flip_buf, 0, queue_buf_size);
}
static int spidev_alloc_queue(unsigned int new_queue_entries)
{
if (queue_fill || queue_buf_fill) {
LOG_ERROR("Can't realloc allocate queue when queue is in use");
LOG_ERROR("Can't realloc queue when queue is in use");
return ERROR_FAIL;
}
@ -259,6 +270,8 @@ static int spidev_alloc_queue(unsigned int new_queue_entries)
max_queue_entries = new_queue_entries;
queue_buf_size = new_queue_buf_size;
spidev_clear_queue();
LOG_DEBUG("Set queue entries to %u (buffers %u bytes)", max_queue_entries, queue_buf_size);
return ERROR_OK;
@ -400,12 +413,7 @@ static int spidev_swd_execute_queue(unsigned int end_idle_bytes)
}
skip:
// Clear everything in the queue
queue_fill = 0;
queue_buf_fill = 0;
memset(queue_infos, 0, sizeof(queue_infos[0]) * max_queue_entries);
memset(queue_tx_buf, 0, queue_buf_size);
memset(queue_rx_buf, 0, queue_buf_size);
spidev_clear_queue();
int retval = queue_retval;
queue_retval = ERROR_OK;