From ef0c650edf7769107820382d44cbe23adeec196b Mon Sep 17 00:00:00 2001 From: Jeremy Compostella Date: Fri, 22 Aug 2025 16:52:08 -0700 Subject: [PATCH] soc/intel/cmn/blk/fast_spi: Cancel DMA transfer before locking This commit addresses a potential low power state over-consumption issue. This issue could arise if SPI DMA has been locked down while a transfer was still marked as active, typically if a SPI DMA transfer failed and hung. The fast_spi_dma_lock() function now checks if a DMA transfer is ongoing and ensures that it is marked as complete before locking the DMA control register. Change-Id: I5e08991b2160a43013b129d302c46fc229f2286d Signed-off-by: Jeremy Compostella Reviewed-on: https://review.coreboot.org/c/coreboot/+/88913 Reviewed-by: Zhixing Ma Tested-by: build bot (Jenkins) Reviewed-by: Bora Guvendik --- src/soc/intel/common/block/fast_spi/fast_spi_dma.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/soc/intel/common/block/fast_spi/fast_spi_dma.c b/src/soc/intel/common/block/fast_spi/fast_spi_dma.c index e4eea9d704..ffb68f05f4 100644 --- a/src/soc/intel/common/block/fast_spi/fast_spi_dma.c +++ b/src/soc/intel/common/block/fast_spi/fast_spi_dma.c @@ -516,6 +516,19 @@ static void fast_spi_dma_lock(void *unused) if (control.fields.lock) return; + /* Ensure that any ongoing DMA transfer is marked as complete before locking. */ + if (control.fields.start) { + union fast_spi_dma_status status = {fast_spi_read(FAST_SPI_DMA_STATUS)}; + if (!status.fields.complete) { + status.data = 0; + status.fields.complete = 1; + fast_spi_write(FAST_SPI_DMA_STATUS, status.data); + } + + control.fields.start = 0; + fast_spi_write(FAST_SPI_DMA_CONTROL, control.data); + } + control.fields.lock = 1; fast_spi_write(FAST_SPI_DMA_CONTROL, control.data);