]> www.infradead.org Git - users/borneoa/openocd-next.git/commitdiff
driver/linuxspidev: Clear queue on allocation
authorRichard Pasek <rpasek@google.com>
Thu, 30 Jan 2025 10:38:08 +0000 (05:38 -0500)
committerTomas Vanek <vanekt@fbl.cz>
Tue, 11 Feb 2025 11:57:58 +0000 (11:57 +0000)
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: 83e0293f7ba3 ("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
src/jtag/drivers/linuxspidev.c

index 73d5e8bed4597b24b014bd5102ace4cf7cc85db4..6a149a977ba75938465a3f689e1b0742f2ee2a09 100644 (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;