[sw/silicon_creator] Add lifecycle_hw_rev_get()
This commit adds lifecycle_hw_rev_get() to the silicon_creator lifecycle
driver to read the 32-bit HW revision register added in #11617.
Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/lib/drivers/lifecycle.c b/sw/device/silicon_creator/lib/drivers/lifecycle.c
index e64c7db..e0d824d 100644
--- a/sw/device/silicon_creator/lib/drivers/lifecycle.c
+++ b/sw/device/silicon_creator/lib/drivers/lifecycle.c
@@ -87,4 +87,12 @@
}
}
-#endif
\ No newline at end of file
+void lifecycle_hw_rev_get(lifecycle_hw_rev_t *hw_rev) {
+ uint32_t reg = sec_mmio_read32(kBase + LC_CTRL_HW_REV_REG_OFFSET);
+ *hw_rev = (lifecycle_hw_rev_t){
+ .chip_gen = bitfield_field32_read(reg, LC_CTRL_HW_REV_CHIP_GEN_FIELD),
+ .chip_rev = bitfield_field32_read(reg, LC_CTRL_HW_REV_CHIP_REV_FIELD),
+ };
+}
+
+#endif
diff --git a/sw/device/silicon_creator/lib/drivers/lifecycle.h b/sw/device/silicon_creator/lib/drivers/lifecycle.h
index d1d8a58..d0ef9c6 100644
--- a/sw/device/silicon_creator/lib/drivers/lifecycle.h
+++ b/sw/device/silicon_creator/lib/drivers/lifecycle.h
@@ -68,6 +68,16 @@
} lifecycle_device_id_t;
/**
+ * Hardware revision.
+ *
+ * Consists of a 16-bit chip generation and a 16-bit chip revision.
+ */
+typedef struct lifecycle_hw_rev {
+ uint16_t chip_gen;
+ uint16_t chip_rev;
+} lifecycle_hw_rev_t;
+
+/**
* Get the life cycle state.
*
* This function checks the value read from the hardware and returns a
@@ -94,6 +104,13 @@
*/
void lifecycle_device_id_get(lifecycle_device_id_t *device_id);
+/**
+ * Get the hardware revision.
+ *
+ * @param[out] hw_rev Hardware revision.
+ */
+void lifecycle_hw_rev_get(lifecycle_hw_rev_t *hw_rev);
+
#ifdef __cplusplus
}
#endif
diff --git a/sw/device/silicon_creator/lib/drivers/lifecycle_unittest.cc b/sw/device/silicon_creator/lib/drivers/lifecycle_unittest.cc
index af95ccf..7d4ce62 100644
--- a/sw/device/silicon_creator/lib/drivers/lifecycle_unittest.cc
+++ b/sw/device/silicon_creator/lib/drivers/lifecycle_unittest.cc
@@ -46,6 +46,22 @@
EXPECT_THAT(device_id.device_id, ElementsAreArray(kDeviceId));
}
+TEST_F(LifecycleTest, HwRev) {
+ uint16_t exp_chip_gen = 0xa5;
+ uint16_t exp_chip_rev = 0xc3;
+
+ EXPECT_SEC_READ32(base_ + LC_CTRL_HW_REV_REG_OFFSET,
+ {
+ {LC_CTRL_HW_REV_CHIP_GEN_OFFSET, exp_chip_gen},
+ {LC_CTRL_HW_REV_CHIP_REV_OFFSET, exp_chip_rev},
+ });
+
+ lifecycle_hw_rev_t hw_rev;
+ lifecycle_hw_rev_get(&hw_rev);
+ EXPECT_EQ(hw_rev.chip_gen, exp_chip_gen);
+ EXPECT_EQ(hw_rev.chip_rev, exp_chip_rev);
+}
+
struct ValidStateTestCase {
/**
* Value reported by hardware.
diff --git a/sw/device/silicon_creator/lib/drivers/mock_lifecycle.cc b/sw/device/silicon_creator/lib/drivers/mock_lifecycle.cc
index 7bf304c..c59ff2b 100644
--- a/sw/device/silicon_creator/lib/drivers/mock_lifecycle.cc
+++ b/sw/device/silicon_creator/lib/drivers/mock_lifecycle.cc
@@ -17,5 +17,9 @@
void lifecycle_device_id_get(lifecycle_device_id_t *device_id) {
MockLifecycle::Instance().DeviceId(device_id);
}
+
+void lifecycle_hw_rev_get(lifecycle_hw_rev_t *hw_rev) {
+ MockLifecycle::Instance().HwRev(hw_rev);
+}
} // extern "C"
} // namespace mask_rom_test
diff --git a/sw/device/silicon_creator/lib/drivers/mock_lifecycle.h b/sw/device/silicon_creator/lib/drivers/mock_lifecycle.h
index af92a15..dfdd6cf 100644
--- a/sw/device/silicon_creator/lib/drivers/mock_lifecycle.h
+++ b/sw/device/silicon_creator/lib/drivers/mock_lifecycle.h
@@ -20,6 +20,7 @@
MOCK_METHOD(lifecycle_state_t, State, ());
MOCK_METHOD(uint32_t, RawState, ());
MOCK_METHOD(void, DeviceId, (lifecycle_device_id_t * device_id));
+ MOCK_METHOD(void, HwRev, (lifecycle_hw_rev_t * hw_rev));
};
} // namespace internal
@@ -41,6 +42,10 @@
MockLifecycle::Instance().DeviceId(device_id);
}
+void lifecycle_hw_rev_get(lifecycle_hw_rev_t *hw_rev) {
+ MockLifecycle::Instance().HwRev(hw_rev);
+}
+
} // extern "C"
#endif
} // namespace mask_rom_test