block/fast_spi: Use read32p/write32p for SPI RW
The current fast_spi code uses memcpy for rw. The SPI flash read/write has 4 byte limit, due to which the current 64 bit memcpy doesn't work. Hence update rw ops to use read32p/write32p. BUG=b:242829490 TEST=Verified MRC cache working on MTL 64-bit, future 64 bit platforms and RPL(brox/skolas) 32-bit platforms. Change-Id: I317c7160bf192dd2aeacebf6029a809bc97f3420 Signed-off-by: Ashish Kumar Mishra <ashish.k.mishra@intel.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/82079 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Subrata Banik <subratabanik@google.com> Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
parent
7da138dd10
commit
2de0e87622
@ -75,18 +75,28 @@ static uint32_t fast_spi_flash_read_sfdp(struct fast_spi_flash_ctx *ctx,
|
|||||||
|
|
||||||
/* Fill FDATAn FIFO in preparation for a write transaction. */
|
/* Fill FDATAn FIFO in preparation for a write transaction. */
|
||||||
static void fill_xfer_fifo(struct fast_spi_flash_ctx *ctx, const void *data,
|
static void fill_xfer_fifo(struct fast_spi_flash_ctx *ctx, const void *data,
|
||||||
size_t len)
|
size_t len)
|
||||||
{
|
{
|
||||||
/* YES! memcpy() works. FDATAn does not require 32-bit accesses. */
|
const uint32_t *data32 = (const uint32_t *)data;
|
||||||
memcpy((void *)(ctx->mmio_base + SPIBAR_FDATA(0)), data, len);
|
for (size_t i = 0; i < len / sizeof(uint32_t); i++)
|
||||||
|
write32p(ctx->mmio_base + SPIBAR_FDATA(i), *data32++);
|
||||||
|
|
||||||
|
const uint8_t *data8 = (const uint8_t *)data32;
|
||||||
|
for (size_t i = 0; i < len % sizeof(uint32_t); i++)
|
||||||
|
write8p(ctx->mmio_base + SPIBAR_FDATA(len / sizeof(uint32_t)) + i, *data8++);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Drain FDATAn FIFO after a read transaction populates data. */
|
/* Drain FDATAn FIFO after a read transaction populates data. */
|
||||||
static void drain_xfer_fifo(struct fast_spi_flash_ctx *ctx, void *dest,
|
static void drain_xfer_fifo(struct fast_spi_flash_ctx *ctx, void *data,
|
||||||
size_t len)
|
size_t len)
|
||||||
{
|
{
|
||||||
/* YES! memcpy() works. FDATAn does not require 32-bit accesses. */
|
uint32_t *data32 = (uint32_t *)data;
|
||||||
memcpy(dest, (void *)(ctx->mmio_base + SPIBAR_FDATA(0)), len);
|
for (size_t i = 0; i < len / sizeof(uint32_t); i++)
|
||||||
|
*data32++ = read32p(ctx->mmio_base + SPIBAR_FDATA(i));
|
||||||
|
|
||||||
|
uint8_t *data8 = (uint8_t *)data32;
|
||||||
|
for (size_t i = 0; i < len % sizeof(uint32_t); i++)
|
||||||
|
*data8++ = read8p(ctx->mmio_base + SPIBAR_FDATA(len / sizeof(uint32_t)) + i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fire up a transfer using the hardware sequencer. */
|
/* Fire up a transfer using the hardware sequencer. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user