[sw/silicon_creeator] Register spi commands after initializing spi_device buffers
Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/lib/drivers/spi_device.c b/sw/device/silicon_creator/lib/drivers/spi_device.c
index 6f12299..05c9bdb 100644
--- a/sw/device/silicon_creator/lib/drivers/spi_device.c
+++ b/sw/device/silicon_creator/lib/drivers/spi_device.c
@@ -529,6 +529,30 @@
kSpiDeviceJedecManufId);
abs_mmio_write32(kBase + SPI_DEVICE_JEDEC_ID_REG_OFFSET, reg);
+ // Write SFDP table to the reserved region in spi_device buffer.
+ uint32_t dest = kSfdpAreaStartAddr;
+ const char *table = (const char *)&kSpiDeviceSfdpTable;
+ for (size_t i = 0; i < kSpiDeviceSfdpTableNumWords; ++i) {
+ abs_mmio_write32(dest, read_32(table));
+ dest += sizeof(uint32_t);
+ table += sizeof(uint32_t);
+ }
+ // Fill the remaining space with `0xff`s.
+ for (; dest < kSfdpAreaEndAddr; dest += sizeof(uint32_t)) {
+ abs_mmio_write32(dest, UINT32_MAX);
+ }
+
+ // Reset the payload buffer to prevent access faults when reading beyond
+ // current payload depth (see #11782).
+ for (size_t i = 0; i < kSpiDevicePayloadAreaNumBytes; i += sizeof(uint32_t)) {
+ abs_mmio_write32(
+ kBase + SPI_DEVICE_BUFFER_REG_OFFSET + kSpiDevicePayloadAreaOffset + i,
+ 0);
+ }
+
+ // Reset status register
+ abs_mmio_write32(kBase + SPI_DEVICE_FLASH_STATUS_REG_OFFSET, 0);
+
// Configure the READ_STATUS command (CMD_INFO_0).
cmd_info_set((cmd_info_t){
.reg_offset = SPI_DEVICE_CMD_INFO_0_REG_OFFSET,
@@ -593,30 +617,6 @@
reg = bitfield_field32_write(reg, SPI_DEVICE_CMD_INFO_WRDI_OPCODE_FIELD,
kSpiDeviceOpcodeWriteDisable);
abs_mmio_write32(kBase + SPI_DEVICE_CMD_INFO_WRDI_REG_OFFSET, reg);
-
- // Write SFDP table to the reserved region in spi_device buffer.
- uint32_t dest = kSfdpAreaStartAddr;
- const char *table = (const char *)&kSpiDeviceSfdpTable;
- for (size_t i = 0; i < kSpiDeviceSfdpTableNumWords; ++i) {
- abs_mmio_write32(dest, read_32(table));
- dest += sizeof(uint32_t);
- table += sizeof(uint32_t);
- }
- // Fill the remaining space with `0xff`s.
- for (; dest < kSfdpAreaEndAddr; dest += sizeof(uint32_t)) {
- abs_mmio_write32(dest, UINT32_MAX);
- }
-
- // Reset the payload buffer to prevent access faults when reading beyond
- // current payload depth (see #11782).
- for (size_t i = 0; i < kSpiDevicePayloadAreaNumBytes; i += sizeof(uint32_t)) {
- abs_mmio_write32(
- kBase + SPI_DEVICE_BUFFER_REG_OFFSET + kSpiDevicePayloadAreaOffset + i,
- 0);
- }
-
- // Reset status register
- abs_mmio_write32(kBase + SPI_DEVICE_FLASH_STATUS_REG_OFFSET, 0);
}
rom_error_t spi_device_cmd_get(spi_device_cmd_t *cmd) {
diff --git a/sw/device/silicon_creator/lib/drivers/spi_device_unittest.cc b/sw/device/silicon_creator/lib/drivers/spi_device_unittest.cc
index 93d8ff0..6381b26 100644
--- a/sw/device/silicon_creator/lib/drivers/spi_device_unittest.cc
+++ b/sw/device/silicon_creator/lib/drivers/spi_device_unittest.cc
@@ -55,6 +55,7 @@
.chip_rev = 3,
};
EXPECT_CALL(lifecycle_, HwRev(NotNull())).WillOnce(SetArgPointee<0>(hw_rev));
+
EXPECT_ABS_WRITE32(
base_ + SPI_DEVICE_JEDEC_ID_REG_OFFSET,
{
@@ -68,6 +69,26 @@
{SPI_DEVICE_JEDEC_ID_MF_OFFSET, kSpiDeviceJedecManufId},
});
+ std::array<uint32_t, kSpiDeviceSfdpAreaNumBytes / sizeof(uint32_t)>
+ sfdp_buffer;
+ sfdp_buffer.fill(std::numeric_limits<uint32_t>::max());
+ std::memcpy(sfdp_buffer.data(), &kSpiDeviceSfdpTable,
+ sizeof(kSpiDeviceSfdpTable));
+ uint32_t offset =
+ base_ + SPI_DEVICE_BUFFER_REG_OFFSET + kSpiDeviceSfdpAreaOffset;
+ for (size_t i = 0; i < sfdp_buffer.size(); ++i) {
+ EXPECT_ABS_WRITE32(offset, sfdp_buffer[i]);
+ offset += sizeof(uint32_t);
+ }
+
+ offset = base_ + SPI_DEVICE_BUFFER_REG_OFFSET + kSpiDevicePayloadAreaOffset;
+ for (size_t i = 0; i < kSpiDevicePayloadAreaNumWords; ++i) {
+ EXPECT_ABS_WRITE32(offset, 0);
+ offset += sizeof(uint32_t);
+ }
+
+ EXPECT_ABS_WRITE32(base_ + SPI_DEVICE_FLASH_STATUS_REG_OFFSET, 0);
+
EXPECT_ABS_WRITE32(
base_ + SPI_DEVICE_CMD_INFO_0_REG_OFFSET,
{
@@ -147,26 +168,6 @@
{SPI_DEVICE_CMD_INFO_WRDI_VALID_BIT, 1},
});
- std::array<uint32_t, kSpiDeviceSfdpAreaNumBytes / sizeof(uint32_t)>
- sfdp_buffer;
- sfdp_buffer.fill(std::numeric_limits<uint32_t>::max());
- std::memcpy(sfdp_buffer.data(), &kSpiDeviceSfdpTable,
- sizeof(kSpiDeviceSfdpTable));
- uint32_t offset =
- base_ + SPI_DEVICE_BUFFER_REG_OFFSET + kSpiDeviceSfdpAreaOffset;
- for (size_t i = 0; i < sfdp_buffer.size(); ++i) {
- EXPECT_ABS_WRITE32(offset, sfdp_buffer[i]);
- offset += sizeof(uint32_t);
- }
-
- offset = base_ + SPI_DEVICE_BUFFER_REG_OFFSET + kSpiDevicePayloadAreaOffset;
- for (size_t i = 0; i < kSpiDevicePayloadAreaNumWords; ++i) {
- EXPECT_ABS_WRITE32(offset, 0);
- offset += sizeof(uint32_t);
- }
-
- EXPECT_ABS_WRITE32(base_ + SPI_DEVICE_FLASH_STATUS_REG_OFFSET, 0);
-
spi_device_init();
}