10 #include "gtest/gtest.h"
12 #include "sw/device/lib/base/mock_mmio.h"
17 namespace dif_edn_unittest {
20 using ::testing::ElementsAreArray;
24 const dif_edn_t edn_ = {.base_addr = dev().region()};
31 TEST_F(ConfigTest, ConfigOk) {
32 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 1);
33 EXPECT_MASK32(EDN_CTRL_REG_OFFSET,
35 {EDN_CTRL_EDN_ENABLE_OFFSET, 0xf, kMultiBitBool4True},
40 TEST_F(ConfigTest, Locked) {
41 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 0);
54 TEST_F(LockTest, Lock) {
55 EXPECT_WRITE32(EDN_REGWEN_REG_OFFSET, 0);
59 TEST_F(LockTest, IsLocked) {
62 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 1);
66 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 0);
78 TEST_F(SetModeTest, Boot) {
79 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 1);
80 EXPECT_MASK32(EDN_CTRL_REG_OFFSET,
82 {EDN_CTRL_BOOT_REQ_MODE_OFFSET, 0xf, kMultiBitBool4True},
87 TEST_F(SetModeTest, Auto) {
88 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 1);
90 EXPECT_READ32(EDN_CTRL_REG_OFFSET, EDN_CTRL_REG_RESVAL);
91 EXPECT_WRITE32(EDN_CTRL_REG_OFFSET,
93 {EDN_CTRL_EDN_ENABLE_OFFSET, kMultiBitBool4False},
94 {EDN_CTRL_BOOT_REQ_MODE_OFFSET, kMultiBitBool4False},
95 {EDN_CTRL_AUTO_REQ_MODE_OFFSET, kMultiBitBool4False},
96 {EDN_CTRL_CMD_FIFO_RST_OFFSET, kMultiBitBool4False},
98 EXPECT_WRITE32(EDN_CTRL_REG_OFFSET,
100 {EDN_CTRL_EDN_ENABLE_OFFSET, kMultiBitBool4False},
101 {EDN_CTRL_BOOT_REQ_MODE_OFFSET, kMultiBitBool4False},
102 {EDN_CTRL_AUTO_REQ_MODE_OFFSET, kMultiBitBool4False},
103 {EDN_CTRL_CMD_FIFO_RST_OFFSET, kMultiBitBool4True},
105 EXPECT_WRITE32(EDN_CTRL_REG_OFFSET,
107 {EDN_CTRL_EDN_ENABLE_OFFSET, kMultiBitBool4False},
108 {EDN_CTRL_BOOT_REQ_MODE_OFFSET, kMultiBitBool4False},
109 {EDN_CTRL_AUTO_REQ_MODE_OFFSET, kMultiBitBool4False},
110 {EDN_CTRL_CMD_FIFO_RST_OFFSET, kMultiBitBool4False},
120 .reseed_cmd = {.cmd = 11,
124 .data = {4, 5, 6, 7},
126 .generate_cmd = {.cmd = 12,
130 .data = {8, 9, 10, 11, 12},
132 .reseed_interval = 42,
135 EXPECT_WRITE32(EDN_RESEED_CMD_REG_OFFSET, params.reseed_cmd.cmd);
136 for (
size_t i = 0; i < params.reseed_cmd.seed_material.len; ++i) {
137 EXPECT_WRITE32(EDN_RESEED_CMD_REG_OFFSET,
138 params.reseed_cmd.seed_material.data[i]);
140 EXPECT_WRITE32(EDN_GENERATE_CMD_REG_OFFSET, params.generate_cmd.cmd);
141 for (
size_t i = 0; i < params.generate_cmd.seed_material.len; ++i) {
142 EXPECT_WRITE32(EDN_GENERATE_CMD_REG_OFFSET,
143 params.generate_cmd.seed_material.data[i]);
145 EXPECT_WRITE32(EDN_MAX_NUM_REQS_BETWEEN_RESEEDS_REG_OFFSET,
146 params.reseed_interval);
148 EXPECT_WRITE32(EDN_CTRL_REG_OFFSET,
150 {EDN_CTRL_EDN_ENABLE_OFFSET, kMultiBitBool4True},
151 {EDN_CTRL_BOOT_REQ_MODE_OFFSET, kMultiBitBool4False},
152 {EDN_CTRL_AUTO_REQ_MODE_OFFSET, kMultiBitBool4True},
153 {EDN_CTRL_CMD_FIFO_RST_OFFSET, kMultiBitBool4False},
156 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
157 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
158 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
159 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
161 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
162 1 | params.instantiate_cmd.seed_material.len << 4 |
163 kMultiBitBool4False << 8);
164 for (
size_t i = 0; i < params.instantiate_cmd.seed_material.len; ++i) {
165 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
166 {{EDN_SW_CMD_STS_CMD_REG_RDY_BIT,
true}});
167 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
168 params.instantiate_cmd.seed_material.data[i]);
171 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
172 {{EDN_SW_CMD_STS_CMD_ACK_BIT,
true}});
174 uint32_t ctrl_reg = 0;
180 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET, ctrl_reg);
185 TEST_F(SetModeTest, Locked) {
186 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 0);
187 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 0);
196 uint32_t ctrl_reg = 0;
204 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET, ctrl_reg);
211 TEST_F(GetStatusTest, Ok) {
213 uint32_t ctrl_reg = 0;
220 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET, ctrl_reg);
230 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET, ctrl_reg);
240 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET, ctrl_reg);
250 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET, ctrl_reg);
271 TEST_F(ErrorTest, Ok) {
272 EXPECT_READ32(EDN_ERR_CODE_REG_OFFSET,
274 {EDN_ERR_CODE_SFIFO_RESCMD_ERR_BIT,
true},
275 {EDN_ERR_CODE_EDN_MAIN_SM_ERR_BIT,
true},
276 {EDN_ERR_CODE_FIFO_STATE_ERR_BIT,
true},
279 uint32_t fifos, errors;
281 EXPECT_EQ(fifos, 1 << kDifEdnFifoReseedCmd);
286 TEST_F(ErrorTest, ForceFifo) {
287 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 1);
288 EXPECT_WRITE32(EDN_ERR_CODE_TEST_REG_OFFSET,
289 EDN_ERR_CODE_SFIFO_RESCMD_ERR_BIT);
294 TEST_F(ErrorTest, ForceError) {
295 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 1);
296 EXPECT_WRITE32(EDN_ERR_CODE_TEST_REG_OFFSET,
297 EDN_ERR_CODE_EDN_MAIN_SM_ERR_BIT);
301 TEST_F(ErrorTest, Locked) {
302 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 0);
303 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 0);
317 TEST_F(MiscStatusTest, GetMainSm) {
318 EXPECT_READ32(EDN_MAIN_SM_STATE_REG_OFFSET, 42);
335 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
336 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
337 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
338 0x00000001 | kMultiBitBool4True << 8);
342 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
343 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
344 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
345 0x00000001 | kMultiBitBool4False << 8);
349 seed_material_.data[0] = 0x5a5a5a5a;
350 seed_material_.len = 1;
351 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
352 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
353 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
354 0x00000011 | kMultiBitBool4False << 8);
355 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
356 {{EDN_SW_CMD_STS_CMD_REG_RDY_BIT,
true}});
357 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET, 0x5a5a5a5a);
362 TEST_F(CommandTest, InstantiateBadArgs) {
369 reinterpret_cast<uintptr_t
>(&seed_material_) + 3);
371 corrupt_seed_material_ptr));
374 seed_material_.len = 16;
379 TEST_F(CommandTest, ReseedOk) {
380 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
381 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
382 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
383 0x00000002 | kMultiBitBool4False << 8);
386 seed_material_.data[0] = 0x5a5a5a5a;
387 seed_material_.len = 1;
388 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
389 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
390 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
391 0x00000012 | kMultiBitBool4False << 8);
392 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
393 {{EDN_SW_CMD_STS_CMD_REG_RDY_BIT,
true}});
394 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET, 0x5a5a5a5a);
398 TEST_F(CommandTest, ReseedBadArgs) {
402 seed_material_.len = 16;
406 TEST_F(CommandTest, UpdateOk) {
407 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
408 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
409 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
410 0x00000004 | kMultiBitBool4False << 8);
412 seed_material_.data[0] = 0x5a5a5a5a;
413 seed_material_.len = 1;
414 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
415 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
416 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
417 0x00000014 | kMultiBitBool4False << 8);
418 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
419 {{EDN_SW_CMD_STS_CMD_REG_RDY_BIT,
true}});
420 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET, 0x5a5a5a5a);
424 TEST_F(CommandTest, UpdateBadArgs) {
428 TEST_F(CommandTest, GenerateOk) {
430 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
431 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
432 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
433 0x00004003 | kMultiBitBool4False << 8);
437 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
438 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
439 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
440 0x00005003 | kMultiBitBool4False << 8);
444 TEST_F(CommandTest, GenerateBadArgs) {
449 TEST_F(CommandTest, GenerateOutOfRange) {
453 kGenerateLenOutOfRange = 0x800 * 4 + 1,
458 TEST_F(CommandTest, UninstantiateOk) {
459 EXPECT_READ32(EDN_SW_CMD_STS_REG_OFFSET,
460 {{EDN_SW_CMD_STS_CMD_RDY_BIT,
true}});
461 EXPECT_WRITE32(EDN_SW_CMD_REQ_REG_OFFSET,
462 0x00000005 | kMultiBitBool4False << 8);
470 TEST_F(StopTest, Stop) {
471 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 1);
472 EXPECT_READ32(EDN_CTRL_REG_OFFSET, 0x3);
475 EXPECT_WRITE32(EDN_CTRL_REG_OFFSET, ctrl_reg);
476 EXPECT_WRITE32(EDN_CTRL_REG_OFFSET, EDN_CTRL_REG_RESVAL);
480 TEST_F(StopTest, Locked) {
481 EXPECT_READ32(EDN_REGWEN_REG_OFFSET, 0);
494 TEST_F(AlertTest, Get) {
496 EXPECT_READ32(EDN_RECOV_ALERT_STS_REG_OFFSET,
498 {EDN_RECOV_ALERT_STS_BOOT_REQ_MODE_FIELD_ALERT_BIT,
true},
499 {EDN_RECOV_ALERT_STS_EDN_BUS_CMP_ALERT_BIT,
true},
506 TEST_F(AlertTest, Clear) {
507 EXPECT_WRITE32(EDN_RECOV_ALERT_STS_REG_OFFSET, 0);