7 #include "gtest/gtest.h"
9 #include "sw/device/lib/base/mock_mmio.h"
10 #include "sw/device/lib/base/multibits.h"
14 #include "clkmgr_regs.h"
16 namespace dif_clkmgr_unittest {
22 const dif_clkmgr_measure_clock_t kBadMeasClock =
23 static_cast<dif_clkmgr_measure_clock_t
>(27);
27 dif_clkmgr_t clkmgr_ = {.base_addr = dev().region()};
36 EXPECT_READ32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 0);
38 EXPECT_EQ(locked,
true);
43 EXPECT_READ32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 1);
45 EXPECT_EQ(locked,
false);
49 TEST_F(JitterRegwenTest, GetLockedError) {
56 TEST_F(JitterRegwenTest, SetLocked) {
57 EXPECT_WRITE32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 0);
62 TEST_F(JitterRegwenTest, SetLockedError) {
73 EXPECT_READ32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 1);
74 EXPECT_WRITE32(CLKMGR_JITTER_ENABLE_REG_OFFSET, kMultiBitBool4False);
79 EXPECT_READ32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 1);
80 EXPECT_WRITE32(CLKMGR_JITTER_ENABLE_REG_OFFSET, kMultiBitBool4True);
85 TEST_F(JitterEnableTest, SetEnabledError) {
90 TEST_F(JitterEnableTest, SetEnabledLocked) {
92 EXPECT_READ32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 0);
96 TEST_F(JitterEnableTest, GetEnabled) {
100 EXPECT_READ32(CLKMGR_JITTER_ENABLE_REG_OFFSET, kMultiBitBool4True);
108 EXPECT_READ32(CLKMGR_JITTER_ENABLE_REG_OFFSET, kMultiBitBool4False);
114 TEST_F(JitterEnableTest, GetEnabledError) {
125 EXPECT_MASK32(CLKMGR_CLK_ENABLES_REG_OFFSET,
126 {{CLKMGR_CLK_ENABLES_CLK_IO_DIV4_PERI_EN_BIT, 0x1,
false}});
128 &clkmgr_, CLKMGR_CLK_ENABLES_CLK_IO_DIV4_PERI_EN_BIT,
132 EXPECT_MASK32(CLKMGR_CLK_ENABLES_REG_OFFSET,
133 {{CLKMGR_CLK_ENABLES_CLK_USB_PERI_EN_BIT, 0x1,
true}});
138 TEST_F(GateableClockTest, SetEnabledError) {
145 &clkmgr_, std::numeric_limits<dif_clkmgr_gateable_clock_t>::max(),
153 TEST_F(GateableClockTest, GetEnabled) {
157 EXPECT_READ32(CLKMGR_CLK_ENABLES_REG_OFFSET,
158 {{CLKMGR_CLK_ENABLES_CLK_IO_DIV4_PERI_EN_BIT,
true}});
160 &clkmgr_, CLKMGR_CLK_ENABLES_CLK_IO_DIV4_PERI_EN_BIT, &state));
167 EXPECT_READ32(CLKMGR_CLK_ENABLES_REG_OFFSET,
168 {{CLKMGR_CLK_ENABLES_CLK_USB_PERI_EN_BIT,
false}});
170 &clkmgr_, CLKMGR_CLK_ENABLES_CLK_USB_PERI_EN_BIT, &state));
175 TEST_F(GateableClockTest, GetEnabledError) {
179 nullptr, CLKMGR_CLK_ENABLES_CLK_IO_DIV4_PERI_EN_BIT, &state));
181 &clkmgr_, CLKMGR_CLK_ENABLES_CLK_IO_DIV4_PERI_EN_BIT,
nullptr));
185 &clkmgr_, std::numeric_limits<dif_clkmgr_gateable_clock_t>::max(),
190 &clkmgr_, CLKMGR_PARAM_NUM_SW_GATEABLE_CLOCKS, &state));
197 EXPECT_MASK32(CLKMGR_CLK_HINTS_REG_OFFSET,
198 {{CLKMGR_CLK_HINTS_CLK_MAIN_AES_HINT_BIT, 0x1,
false}});
203 EXPECT_MASK32(CLKMGR_CLK_HINTS_REG_OFFSET,
204 {{CLKMGR_PARAM_NUM_HINTABLE_CLOCKS - 1, 0x1,
true}});
209 TEST_F(HintableClockTest, SetHintError) {
216 &clkmgr_, std::numeric_limits<dif_clkmgr_hintable_clock_t>::max(),
224 TEST_F(HintableClockTest, GetHint) {
228 EXPECT_READ32(CLKMGR_CLK_HINTS_REG_OFFSET,
229 {{CLKMGR_CLK_HINTS_CLK_MAIN_AES_HINT_BIT,
true}});
231 &clkmgr_, CLKMGR_CLK_HINTS_CLK_MAIN_AES_HINT_BIT, &state));
238 EXPECT_READ32(CLKMGR_CLK_HINTS_REG_OFFSET,
239 {{CLKMGR_CLK_HINTS_CLK_MAIN_OTBN_HINT_BIT,
false}});
241 &clkmgr_, CLKMGR_CLK_HINTS_CLK_MAIN_OTBN_HINT_BIT, &state));
246 TEST_F(HintableClockTest, GetHintError) {
250 nullptr, CLKMGR_CLK_HINTS_CLK_MAIN_AES_HINT_BIT, &state));
253 &clkmgr_, CLKMGR_CLK_HINTS_CLK_MAIN_AES_HINT_BIT,
nullptr));
257 &clkmgr_, std::numeric_limits<dif_clkmgr_hintable_clock_t>::max(),
262 &clkmgr_, CLKMGR_PARAM_NUM_HINTABLE_CLOCKS, &state));
265 TEST_F(HintableClockTest, GetEnabled) {
269 EXPECT_READ32(CLKMGR_CLK_HINTS_STATUS_REG_OFFSET,
270 {{CLKMGR_CLK_HINTS_STATUS_CLK_MAIN_AES_VAL_BIT,
false}});
272 &clkmgr_, CLKMGR_CLK_HINTS_STATUS_CLK_MAIN_AES_VAL_BIT, &state));
279 EXPECT_READ32(CLKMGR_CLK_HINTS_STATUS_REG_OFFSET,
280 {{CLKMGR_CLK_HINTS_STATUS_CLK_MAIN_OTBN_VAL_BIT,
true}});
282 &clkmgr_, CLKMGR_CLK_HINTS_STATUS_CLK_MAIN_OTBN_VAL_BIT, &state));
287 TEST_F(HintableClockTest, GetEnabledError) {
291 nullptr, CLKMGR_CLK_HINTS_STATUS_CLK_MAIN_AES_VAL_BIT, &state));
294 &clkmgr_, CLKMGR_CLK_HINTS_STATUS_CLK_MAIN_AES_VAL_BIT,
nullptr));
298 &clkmgr_, std::numeric_limits<dif_clkmgr_hintable_clock_t>::max(),
303 &clkmgr_, CLKMGR_PARAM_NUM_HINTABLE_CLOCKS, &state));
312 EXPECT_READ32(CLKMGR_EXTCLK_CTRL_REGWEN_REG_OFFSET, 0);
315 EXPECT_EQ(locked,
true);
320 EXPECT_READ32(CLKMGR_EXTCLK_CTRL_REGWEN_REG_OFFSET, 1);
323 EXPECT_EQ(locked,
false);
327 TEST_F(ExternalClkRegwenTest, GetLockedError) {
337 TEST_F(ExternalClkRegwenTest, SetLocked) {
338 EXPECT_WRITE32(CLKMGR_EXTCLK_CTRL_REGWEN_REG_OFFSET, 0);
343 TEST_F(ExternalClkRegwenTest, SetLockedError) {
354 TEST_F(ExternalClkTest, DisableError) {
358 TEST_F(ExternalClkTest, Enable) {
359 #define EXTCLK_CTRL_REG_VALUE(enable_, low_speed_) \
361 .offset = CLKMGR_EXTCLK_CTRL_SEL_OFFSET, \
362 .value = enable_ ? kMultiBitBool4True : kMultiBitBool4False, \
365 .offset = CLKMGR_EXTCLK_CTRL_HI_SPEED_SEL_OFFSET, \
366 .value = low_speed_ ? kMultiBitBool4False : kMultiBitBool4True, \
369 EXPECT_READ32(CLKMGR_EXTCLK_CTRL_REGWEN_REG_OFFSET, 1);
370 EXPECT_WRITE32(CLKMGR_EXTCLK_CTRL_REG_OFFSET,
371 EXTCLK_CTRL_REG_VALUE(
true,
true));
375 EXPECT_READ32(CLKMGR_EXTCLK_CTRL_REGWEN_REG_OFFSET, 1);
376 EXPECT_WRITE32(CLKMGR_EXTCLK_CTRL_REG_OFFSET,
377 EXTCLK_CTRL_REG_VALUE(
true,
false));
382 TEST_F(ExternalClkTest, Disable) {
384 EXPECT_READ32(CLKMGR_EXTCLK_CTRL_REGWEN_REG_OFFSET, 1);
385 EXPECT_WRITE32(CLKMGR_EXTCLK_CTRL_REG_OFFSET,
386 EXTCLK_CTRL_REG_VALUE(
false,
false));
389 #undef EXTCLK_CTRL_REG_VALUE
391 TEST_F(ExternalClkTest, Switch) {
392 EXPECT_READ32(CLKMGR_EXTCLK_STATUS_REG_OFFSET, kMultiBitBool4False);
393 EXPECT_READ32(CLKMGR_EXTCLK_STATUS_REG_OFFSET, kMultiBitBool4False);
394 EXPECT_READ32(CLKMGR_EXTCLK_STATUS_REG_OFFSET, kMultiBitBool4True);
398 TEST_F(ExternalClkTest, SwitchError) {
405 EXPECT_WRITE32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 0);
409 TEST_F(MeasureCtrlTest, DisableError) {
413 TEST_F(MeasureCtrlTest, GetEnable) {
416 EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET,
417 {{CLKMGR_MEASURE_CTRL_REGWEN_EN_BIT,
true}});
423 EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET,
424 {{CLKMGR_MEASURE_CTRL_REGWEN_EN_BIT,
false}});
430 TEST_F(MeasureCtrlTest, GetEnableError) {
443 EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 1);
447 nullptr, kDifClkmgrMeasureClockIoDiv2, 2, 3));
449 EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 1);
454 TEST_F(MeasureCountTest, EnableLocked) {
456 EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 0);
458 &clkmgr_, kDifClkmgrMeasureClockIoDiv2, 2, 3),
462 TEST_F(MeasureCountTest, Enable) {
463 uint32_t hi_val = 16;
472 dif_clkmgr_measure_clock_t clk = (dif_clkmgr_measure_clock_t)i;
474 #define PICK_COUNT_CTRL_FIELDS(kind_) \
475 en_offset = CLKMGR_##kind_##_MEAS_CTRL_EN_REG_OFFSET; \
476 reg_offset = CLKMGR_##kind_##_MEAS_CTRL_SHADOWED_REG_OFFSET; \
477 lo_field = CLKMGR_##kind_##_MEAS_CTRL_SHADOWED_LO_FIELD; \
478 hi_field = CLKMGR_##kind_##_MEAS_CTRL_SHADOWED_HI_FIELD; \
480 case kDifClkmgrMeasureClockIo:
481 PICK_COUNT_CTRL_FIELDS(IO);
482 case kDifClkmgrMeasureClockIoDiv2:
483 PICK_COUNT_CTRL_FIELDS(IO_DIV2);
485 PICK_COUNT_CTRL_FIELDS(IO_DIV4);
487 PICK_COUNT_CTRL_FIELDS(MAIN);
489 PICK_COUNT_CTRL_FIELDS(USB);
491 #undef PICK_COUNT_CTRL_FIELDS
493 EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 1);
494 std::vector<mock_mmio::BitField> thresholds_val = {
496 .offset = (uintptr_t)lo_field.
index,
497 .value = (uintptr_t)lo_val,
500 .offset = hi_field.
index,
503 EXPECT_WRITE32(reg_offset, thresholds_val);
504 EXPECT_WRITE32(reg_offset, thresholds_val);
505 EXPECT_WRITE32(en_offset, kMultiBitBool4True);
511 TEST_F(MeasureCountTest, DisableBadArgs) {
514 EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 1);
519 EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 0);
525 TEST_F(MeasureCountTest, DisableLocked) {
527 EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 0);
533 TEST_F(MeasureCountTest, Disable) {
537 dif_clkmgr_measure_clock_t clk = (dif_clkmgr_measure_clock_t)i;
539 #define PICK_COUNT_CTRL_FIELDS(kind_) \
540 en_offset = CLKMGR_##kind_##_MEAS_CTRL_EN_REG_OFFSET; \
542 case kDifClkmgrMeasureClockIo:
543 PICK_COUNT_CTRL_FIELDS(IO);
544 case kDifClkmgrMeasureClockIoDiv2:
545 PICK_COUNT_CTRL_FIELDS(IO_DIV2);
547 PICK_COUNT_CTRL_FIELDS(IO_DIV4);
549 PICK_COUNT_CTRL_FIELDS(MAIN);
551 PICK_COUNT_CTRL_FIELDS(USB);
553 #undef PICK_COUNT_CTRL_FIELDS
555 EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 1);
556 EXPECT_WRITE32(en_offset, kMultiBitBool4False);
561 TEST_F(MeasureCountTest, GetEnableBadArgs) {
568 nullptr, kDifClkmgrMeasureClockIoDiv2,
nullptr));
572 &clkmgr_, kDifClkmgrMeasureClockIoDiv2,
nullptr));
574 nullptr, kDifClkmgrMeasureClockIoDiv2, &state));
579 TEST_F(MeasureCountTest, GetEnable) {
583 dif_clkmgr_measure_clock_t clk = (dif_clkmgr_measure_clock_t)i;
585 #define PICK_COUNT_CTRL_FIELDS(kind_) \
586 en_offset = CLKMGR_##kind_##_MEAS_CTRL_EN_REG_OFFSET; \
588 case kDifClkmgrMeasureClockIo:
589 PICK_COUNT_CTRL_FIELDS(IO);
590 case kDifClkmgrMeasureClockIoDiv2:
591 PICK_COUNT_CTRL_FIELDS(IO_DIV2);
593 PICK_COUNT_CTRL_FIELDS(IO_DIV4);
595 PICK_COUNT_CTRL_FIELDS(MAIN);
597 PICK_COUNT_CTRL_FIELDS(USB);
599 #undef PICK_COUNT_CTRL_FIELDS
608 TEST_F(MeasureCountTest, GetThresholdsBadArgs) {
612 nullptr, kBadMeasClock,
nullptr,
nullptr));
614 &clkmgr_, kBadMeasClock,
nullptr,
nullptr));
616 nullptr, kDifClkmgrMeasureClockIoDiv2,
nullptr,
nullptr));
618 nullptr, kBadMeasClock, &lo,
nullptr));
620 nullptr, kBadMeasClock,
nullptr, &hi));
623 nullptr, kDifClkmgrMeasureClockIoDiv2, &lo,
nullptr));
625 nullptr, kDifClkmgrMeasureClockIoDiv2,
nullptr, &hi));
627 nullptr, kBadMeasClock, &lo, &hi));
629 &clkmgr_, kDifClkmgrMeasureClockIoDiv2,
nullptr,
nullptr));
631 &clkmgr_, kBadMeasClock,
nullptr, &hi));
633 &clkmgr_, kBadMeasClock, &lo,
nullptr));
636 &clkmgr_, kDifClkmgrMeasureClockIoDiv2, &lo,
nullptr));
638 &clkmgr_, kDifClkmgrMeasureClockIoDiv2,
nullptr, &hi));
640 &clkmgr_, kBadMeasClock, &lo, &hi));
642 nullptr, kDifClkmgrMeasureClockIoDiv2, &lo, &hi));
645 TEST_F(MeasureCountTest, GetThresholds) {
651 dif_clkmgr_measure_clock_t clk = (dif_clkmgr_measure_clock_t)i;
653 #define PICK_COUNT_CTRL_FIELDS(kind_) \
654 reg_offset = CLKMGR_##kind_##_MEAS_CTRL_SHADOWED_REG_OFFSET; \
655 lo_field = CLKMGR_##kind_##_MEAS_CTRL_SHADOWED_LO_FIELD; \
656 hi_field = CLKMGR_##kind_##_MEAS_CTRL_SHADOWED_HI_FIELD; \
658 case kDifClkmgrMeasureClockIo:
659 PICK_COUNT_CTRL_FIELDS(IO);
660 case kDifClkmgrMeasureClockIoDiv2:
661 PICK_COUNT_CTRL_FIELDS(IO_DIV2);
663 PICK_COUNT_CTRL_FIELDS(IO_DIV4);
665 PICK_COUNT_CTRL_FIELDS(MAIN);
667 PICK_COUNT_CTRL_FIELDS(USB);
669 #undef PICK_COUNT_CTRL_FIELDS
671 EXPECT_READ32(reg_offset, {{
672 .offset = lo_field.
index,
676 .offset = hi_field.
index,
679 uint32_t min_threshold = 0;
680 uint32_t max_threshold = 0;
682 &clkmgr_, clk, &min_threshold, &max_threshold));
683 EXPECT_EQ(min_threshold, 8);
684 EXPECT_EQ(max_threshold, 9);
697 TEST_F(RecovErrorTest, GetCodes) {
699 EXPECT_READ32(CLKMGR_RECOV_ERR_CODE_REG_OFFSET, 6);
704 TEST_F(RecovErrorTest, ClearBadArgs) {
708 TEST_F(RecovErrorTest, ClearCodes) {
709 EXPECT_WRITE32(CLKMGR_RECOV_ERR_CODE_REG_OFFSET, 6);
722 TEST_F(FatalErrorTest, GetCodes) {
724 EXPECT_READ32(CLKMGR_FATAL_ERR_CODE_REG_OFFSET, 6);