soc/intel/cmn/block/fast_spi: Lock DMA before exiting coreboot

Introduce a DMA lock mechanism to secure the Fast SPI DMA operations
during the payload boot phase. A new `fast_spi_dma_lock` function is
added to lock the DMA control register when the system enters the
payload boot state. This ensures that DMA operations are appropriately
secured, preventing any unintended data transfers post-boot.

TEST=On a Fatcat device with an FSP not locking down Fast SPI DMA,
     coreboot logs show "Fast-SPI: DMA has been locked." and
     /sys/devices/pci0000:00/0000:00:1f.5/config shows that bit 15 of
     register FAST_SPI_DMA_CONTROL (0xbc) has been is set.

Change-Id: Ie4abbcfc798480319a32b0049e3559d623ef78ef
Signed-off-by: Jeremy Compostella <jeremy.compostella@intel.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/88488
Reviewed-by: Bora Guvendik <bora.guvendik@intel.com>
Reviewed-by: Wonkyu Kim <wonkyu.kim@intel.com>
Reviewed-by: Subrata Banik <subratabanik@google.com>
Reviewed-by: Kapil Porwal <kapilporwal@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Jeremy Compostella 2025-07-18 13:12:56 -07:00 committed by Jérémy Compostella
commit 9e41c7cec7

View file

@ -403,3 +403,17 @@ void spi_flash_dma_install_ops(struct xlate_region_device *mmap_xlate_rdev)
fast_spi_dma_rdev_ro_ops.readat = fast_spi_dma_readat;
mmap_xlate_rdev->rdev.ops = &fast_spi_dma_rdev_ro_ops;
}
static void fast_spi_dma_lock(void *unused)
{
union fast_spi_dma_control control = {fast_spi_read(FAST_SPI_DMA_CONTROL)};
if (control.fields.lock)
return;
control.fields.lock = 1;
fast_spi_write(FAST_SPI_DMA_CONTROL, control.data);
printk(BIOS_DEBUG, "Fast-SPI: driver locked DMA\n");
}
BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_BOOT, BS_ON_ENTRY, fast_spi_dma_lock, NULL);