[sw/silicon_creator] Use the actual HW revision in spi_device_init()
Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/lib/drivers/BUILD b/sw/device/silicon_creator/lib/drivers/BUILD
index 48be359..9466c50 100644
--- a/sw/device/silicon_creator/lib/drivers/BUILD
+++ b/sw/device/silicon_creator/lib/drivers/BUILD
@@ -600,6 +600,7 @@
"@googletest//:gtest",
],
shared = [
+ ":lifecycle",
"//sw/device/lib/base:abs_mmio",
"//sw/device/lib/base:memory",
"//sw/device/silicon_creator/lib:error",
diff --git a/sw/device/silicon_creator/lib/drivers/meson.build b/sw/device/silicon_creator/lib/drivers/meson.build
index 72266a2..bd3bc39 100644
--- a/sw/device/silicon_creator/lib/drivers/meson.build
+++ b/sw/device/silicon_creator/lib/drivers/meson.build
@@ -595,6 +595,7 @@
dependencies: [
sw_lib_abs_mmio,
sw_lib_mem,
+ sw_silicon_creator_lib_driver_lifecycle,
],
),
)
diff --git a/sw/device/silicon_creator/lib/drivers/spi_device.c b/sw/device/silicon_creator/lib/drivers/spi_device.c
index 4f21348..a5defc7 100644
--- a/sw/device/silicon_creator/lib/drivers/spi_device.c
+++ b/sw/device/silicon_creator/lib/drivers/spi_device.c
@@ -7,6 +7,7 @@
#include "sw/device/lib/base/abs_mmio.h"
#include "sw/device/lib/base/bitfield.h"
#include "sw/device/lib/base/memory.h"
+#include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
#include "sw/device/silicon_creator/lib/error.h"
#include "flash_ctrl_regs.h"
@@ -501,10 +502,16 @@
reg = bitfield_field32_write(reg, SPI_DEVICE_JEDEC_CC_NUM_CC_FIELD,
kSpiDeviceJedecContCodeCount);
abs_mmio_write32(kBase + SPI_DEVICE_JEDEC_CC_REG_OFFSET, reg);
- // TODO(#11605): Use the HW revision register when available.
- reg = bitfield_field32_write(0, SPI_DEVICE_DEV_ID_CHIP_REV_FIELD, 0);
+ // Note: The code below assumes that chip revision and generation numbers
+ // from the life cycle controller (16-bits each) will fit in the revision and
+ // generation fields of the device ID (3 and 4 bits, respectively).
+ lifecycle_hw_rev_t hw_rev;
+ lifecycle_hw_rev_get(&hw_rev);
+ reg = bitfield_field32_write(0, SPI_DEVICE_DEV_ID_CHIP_REV_FIELD,
+ hw_rev.chip_rev);
reg = bitfield_bit32_write(reg, SPI_DEVICE_DEV_ID_ROM_BOOTSTRAP_BIT, true);
- reg = bitfield_field32_write(reg, SPI_DEVICE_DEV_ID_CHIP_GEN_FIELD, 0);
+ reg = bitfield_field32_write(reg, SPI_DEVICE_DEV_ID_CHIP_GEN_FIELD,
+ hw_rev.chip_gen);
reg = bitfield_field32_write(reg, SPI_DEVICE_DEV_ID_DENSITY_FIELD,
kSpiDeviceJedecDensity);
reg = bitfield_field32_write(reg, SPI_DEVICE_JEDEC_ID_MF_FIELD,
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 ea90d80..2ab8768 100644
--- a/sw/device/silicon_creator/lib/drivers/spi_device_unittest.cc
+++ b/sw/device/silicon_creator/lib/drivers/spi_device_unittest.cc
@@ -9,6 +9,7 @@
#include "gtest/gtest.h"
#include "sw/device/lib/base/testing/mock_abs_mmio.h"
+#include "sw/device/silicon_creator/lib/drivers/mock_lifecycle.h"
#include "sw/device/silicon_creator/lib/error.h"
#include "sw/device/silicon_creator/testing/mask_rom_test.h"
@@ -17,11 +18,14 @@
namespace spi_device_unittest {
namespace {
+using ::testing::NotNull;
+using ::testing::SetArgPointee;
class SpiDeviceTest : public mask_rom_test::MaskRomTest {
protected:
uint32_t base_ = TOP_EARLGREY_SPI_DEVICE_BASE_ADDR;
mask_rom_test::MockAbsMmio mmio_;
+ mask_rom_test::MockLifecycle lifecycle_;
};
class InitTest : public SpiDeviceTest {};
@@ -44,12 +48,17 @@
{SPI_DEVICE_JEDEC_CC_CC_OFFSET, kSpiDeviceJedecContCode},
{SPI_DEVICE_JEDEC_CC_NUM_CC_OFFSET, kSpiDeviceJedecContCodeCount},
});
+ lifecycle_hw_rev_t hw_rev{
+ .chip_gen = 1,
+ .chip_rev = 3,
+ };
+ EXPECT_CALL(lifecycle_, HwRev(NotNull())).WillOnce(SetArgPointee<0>(hw_rev));
EXPECT_ABS_WRITE32(
base_ + SPI_DEVICE_JEDEC_ID_REG_OFFSET,
{
- {SPI_DEVICE_DEV_ID_CHIP_REV_FIELD.index, 0},
+ {SPI_DEVICE_DEV_ID_CHIP_REV_FIELD.index, hw_rev.chip_rev},
{SPI_DEVICE_DEV_ID_ROM_BOOTSTRAP_BIT, 1},
- {SPI_DEVICE_DEV_ID_CHIP_GEN_FIELD.index, 0},
+ {SPI_DEVICE_DEV_ID_CHIP_GEN_FIELD.index, hw_rev.chip_gen},
{SPI_DEVICE_DEV_ID_DENSITY_FIELD.index, kSpiDeviceJedecDensity},
{SPI_DEVICE_JEDEC_ID_MF_OFFSET, kSpiDeviceJedecManufId},
});