[sw/silicon_creator] Add tests for flash_ctrl info page definitions
Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc b/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc
index 55d4ffb..332d124 100644
--- a/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc
+++ b/sw/device/silicon_creator/lib/drivers/flash_ctrl_unittest.cc
@@ -16,6 +16,41 @@
namespace flash_ctrl_unittest {
namespace {
+using ::testing::Each;
+using ::testing::SizeIs;
+
+/**
+ * A struct that holds bank, page, and config register information for an
+ * information page.
+ */
+struct InfoPage {
+ uint32_t bank;
+ uint32_t page;
+ uint32_t cfg_offset;
+ uint32_t cfg_wen_offset;
+};
+
+/**
+ * Returns a map from `flash_ctrl_info_page_t` to `InfoPage` to be used in
+ * tests.
+ */
+const std::map<flash_ctrl_info_page_t, InfoPage> &InfoPages() {
+#define INFO_PAGE_MAP_INIT(name_, bank_, page_) \
+ { \
+ name_, \
+ { \
+ bank_, \
+ page_, \
+ FLASH_CTRL_BANK##bank_##_INFO0_PAGE_CFG_SHADOWED_##page_##_REG_OFFSET, \
+ FLASH_CTRL_BANK##bank_##_INFO0_REGWEN_##page_##_REG_OFFSET, \
+ }, \
+ }
+
+ static const std::map<flash_ctrl_info_page_t, InfoPage> *const kInfoPages =
+ new std::map<flash_ctrl_info_page_t, InfoPage>{
+ FLASH_CTRL_INFO_PAGES_DEFINE(INFO_PAGE_MAP_INIT)};
+ return *kInfoPages;
+}
class FlashCtrlTest : public mask_rom_test::MaskRomTest {
protected:
@@ -24,6 +59,41 @@
mask_rom_test::MockSecMmio sec_mmio_;
};
+class InfoPagesTest : public FlashCtrlTest {};
+TEST_F(InfoPagesTest, NumberOfPages) { EXPECT_THAT(InfoPages(), SizeIs(20)); }
+
+TEST_F(InfoPagesTest, PagesPerBank) {
+ std::array<uint32_t, 2> pages_per_bank = {0, 0};
+ for (const auto &it : InfoPages()) {
+ const uint32_t bank = it.second.bank;
+ EXPECT_EQ(bank, static_cast<uint32_t>(bitfield_bit32_read(
+ it.first, FLASH_CTRL_INFO_PAGE_BIT_BANK)));
+ EXPECT_LE(bank, 1);
+ ++pages_per_bank[bank];
+ }
+
+ EXPECT_THAT(pages_per_bank, Each(10));
+}
+
+TEST_F(InfoPagesTest, AllType0) {
+ for (const auto &it : InfoPages()) {
+ const flash_ctrl_partition_t partition =
+ static_cast<flash_ctrl_partition_t>(bitfield_field32_read(
+ it.first, FLASH_CTRL_INFO_PAGE_FIELD_PARTITION));
+ EXPECT_EQ(partition, kFlashCtrlPartitionInfo0);
+ }
+}
+
+TEST_F(InfoPagesTest, PageIndices) {
+ for (const auto &it : InfoPages()) {
+ const uint32_t page = it.second.page;
+
+ EXPECT_EQ(page,
+ bitfield_field32_read(it.first, FLASH_CTRL_INFO_PAGE_FIELD_PAGE));
+ EXPECT_LE(page, 9);
+ }
+}
+
class InitTest : public FlashCtrlTest {};
TEST_F(InitTest, Initialize) {