Software APIs
dif_clkmgr_unittest.cc
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
6 
7 #include "gtest/gtest.h"
9 #include "sw/device/lib/base/mock_mmio.h"
10 #include "sw/device/lib/base/multibits.h"
12 
13 // Generated.
14 #include "clkmgr_regs.h"
15 
16 namespace dif_clkmgr_unittest {
17 namespace {
20 using testing::Test;
21 
22 const dif_clkmgr_measure_clock_t kBadMeasClock =
23  static_cast<dif_clkmgr_measure_clock_t>(27);
24 
25 class ClkMgrTest : public Test, public MmioTest {
26  protected:
27  dif_clkmgr_t clkmgr_ = {.base_addr = dev().region()};
28 };
29 
30 class JitterRegwenTest : public ClkMgrTest {};
31 
32 TEST_F(JitterRegwenTest, GetLocked) {
33  // Get regwen locked
34  {
35  bool locked = false;
36  EXPECT_READ32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 0);
38  EXPECT_EQ(locked, true);
39  }
40  // Get regwen unlocked
41  {
42  bool locked = true;
43  EXPECT_READ32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 1);
45  EXPECT_EQ(locked, false);
46  }
47 }
48 
49 TEST_F(JitterRegwenTest, GetLockedError) {
50  bool locked;
54 }
55 
56 TEST_F(JitterRegwenTest, SetLocked) {
57  EXPECT_WRITE32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 0);
59  // There is no support for unlock in the hardware.
60 }
61 
62 TEST_F(JitterRegwenTest, SetLockedError) {
64 }
65 
66 class JitterEnableTest : public ClkMgrTest {};
67 
68 // SetEnabled uses EXPECT_WRITE32 instead of EXPECT_MASK32 because
69 // dif_clkmgr_jitter_set_enabled doesn't perform a read, just a write.
70 TEST_F(JitterEnableTest, SetEnabled) {
71  // Disable jitter with jitter unlocked.
72  {
73  EXPECT_READ32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 1);
74  EXPECT_WRITE32(CLKMGR_JITTER_ENABLE_REG_OFFSET, kMultiBitBool4False);
76  }
77  // Enable jitter with jitter unlocked.
78  {
79  EXPECT_READ32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 1);
80  EXPECT_WRITE32(CLKMGR_JITTER_ENABLE_REG_OFFSET, kMultiBitBool4True);
82  }
83 }
84 
85 TEST_F(JitterEnableTest, SetEnabledError) {
86  // Null handle.
88 }
89 
90 TEST_F(JitterEnableTest, SetEnabledLocked) {
91  // Lock the register via regwen, and check no change occurs.
92  EXPECT_READ32(CLKMGR_JITTER_REGWEN_REG_OFFSET, 0);
94 }
95 
96 TEST_F(JitterEnableTest, GetEnabled) {
97  // Get jitter (enabled).
98  {
100  EXPECT_READ32(CLKMGR_JITTER_ENABLE_REG_OFFSET, kMultiBitBool4True);
101  EXPECT_DIF_OK(dif_clkmgr_jitter_get_enabled(&clkmgr_, &state));
102  EXPECT_EQ(state, kDifToggleEnabled);
103  }
104 
105  // Get jitter (disabled).
106  {
108  EXPECT_READ32(CLKMGR_JITTER_ENABLE_REG_OFFSET, kMultiBitBool4False);
109  EXPECT_DIF_OK(dif_clkmgr_jitter_get_enabled(&clkmgr_, &state));
110  EXPECT_EQ(state, kDifToggleDisabled);
111  }
112 }
113 
114 TEST_F(JitterEnableTest, GetEnabledError) {
116 
119 }
120 
121 class GateableClockTest : public ClkMgrTest {};
122 
123 TEST_F(GateableClockTest, SetEnabled) {
124  // Disable gateable clock.
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,
130 
131  // Enable gateable clock.
132  EXPECT_MASK32(CLKMGR_CLK_ENABLES_REG_OFFSET,
133  {{CLKMGR_CLK_ENABLES_CLK_USB_PERI_EN_BIT, 0x1, true}});
135  &clkmgr_, CLKMGR_CLK_ENABLES_CLK_USB_PERI_EN_BIT, kDifToggleEnabled));
136 }
137 
138 TEST_F(GateableClockTest, SetEnabledError) {
139  // Null handle.
141  nullptr, CLKMGR_CLK_ENABLES_CLK_IO_DIV4_PERI_EN_BIT, kDifToggleEnabled));
142 
143  // Out-of-bounds index [~0].
145  &clkmgr_, std::numeric_limits<dif_clkmgr_gateable_clock_t>::max(),
147 
148  // Out-of-bounds index [last+1].
150  &clkmgr_, CLKMGR_PARAM_NUM_SW_GATEABLE_CLOCKS, kDifToggleDisabled));
151 }
152 
153 TEST_F(GateableClockTest, GetEnabled) {
154  // Get gateable clock status (enabled).
155  {
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));
161  EXPECT_EQ(state, kDifToggleEnabled);
162  }
163 
164  // Get gateable clock status (disabled).
165  {
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));
171  EXPECT_EQ(state, kDifToggleDisabled);
172  }
173 }
174 
175 TEST_F(GateableClockTest, GetEnabledError) {
177 
179  nullptr, CLKMGR_CLK_ENABLES_CLK_IO_DIV4_PERI_EN_BIT, &state));
181  &clkmgr_, CLKMGR_CLK_ENABLES_CLK_IO_DIV4_PERI_EN_BIT, nullptr));
182 
183  // Out-of-bounds index [~0].
185  &clkmgr_, std::numeric_limits<dif_clkmgr_gateable_clock_t>::max(),
186  &state));
187 
188  // Out-of-bounds index [last+1].
190  &clkmgr_, CLKMGR_PARAM_NUM_SW_GATEABLE_CLOCKS, &state));
191 }
192 
193 class HintableClockTest : public ClkMgrTest {};
194 
195 TEST_F(HintableClockTest, SetHint) {
196  // Disable hint.
197  EXPECT_MASK32(CLKMGR_CLK_HINTS_REG_OFFSET,
198  {{CLKMGR_CLK_HINTS_CLK_MAIN_AES_HINT_BIT, 0x1, false}});
200  &clkmgr_, CLKMGR_CLK_HINTS_CLK_MAIN_AES_HINT_BIT, kDifToggleDisabled));
201 
202  // Enable hint.
203  EXPECT_MASK32(CLKMGR_CLK_HINTS_REG_OFFSET,
204  {{CLKMGR_PARAM_NUM_HINTABLE_CLOCKS - 1, 0x1, true}});
206  &clkmgr_, CLKMGR_PARAM_NUM_HINTABLE_CLOCKS - 1, kDifToggleEnabled));
207 }
208 
209 TEST_F(HintableClockTest, SetHintError) {
210  // Null handle.
212  nullptr, CLKMGR_CLK_HINTS_CLK_MAIN_AES_HINT_BIT, kDifToggleEnabled));
213 
214  // Out-of-bounds index [~0].
216  &clkmgr_, std::numeric_limits<dif_clkmgr_hintable_clock_t>::max(),
218 
219  // Out-of-bounds index [last+1].
221  &clkmgr_, CLKMGR_PARAM_NUM_HINTABLE_CLOCKS, kDifToggleDisabled));
222 }
223 
224 TEST_F(HintableClockTest, GetHint) {
225  // Get hint state (enabled).
226  {
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));
232  EXPECT_EQ(state, kDifToggleEnabled);
233  }
234 
235  // Get hint state (disabled).
236  {
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));
242  EXPECT_EQ(state, kDifToggleDisabled);
243  }
244 }
245 
246 TEST_F(HintableClockTest, GetHintError) {
248 
250  nullptr, CLKMGR_CLK_HINTS_CLK_MAIN_AES_HINT_BIT, &state));
251 
253  &clkmgr_, CLKMGR_CLK_HINTS_CLK_MAIN_AES_HINT_BIT, nullptr));
254 
255  // Out-of-bounds index [~0].
257  &clkmgr_, std::numeric_limits<dif_clkmgr_hintable_clock_t>::max(),
258  &state));
259 
260  // Out-of-bounds index [last+1].
262  &clkmgr_, CLKMGR_PARAM_NUM_HINTABLE_CLOCKS, &state));
263 }
264 
265 TEST_F(HintableClockTest, GetEnabled) {
266  // Get hintable clock status (enabled).
267  {
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));
273  EXPECT_EQ(state, kDifToggleDisabled);
274  }
275 
276  // Get hintable clock status (disabled).
277  {
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));
283  EXPECT_EQ(state, kDifToggleEnabled);
284  }
285 }
286 
287 TEST_F(HintableClockTest, GetEnabledError) {
289 
291  nullptr, CLKMGR_CLK_HINTS_STATUS_CLK_MAIN_AES_VAL_BIT, &state));
292 
294  &clkmgr_, CLKMGR_CLK_HINTS_STATUS_CLK_MAIN_AES_VAL_BIT, nullptr));
295 
296  // Out-of-bounds index [~0].
298  &clkmgr_, std::numeric_limits<dif_clkmgr_hintable_clock_t>::max(),
299  &state));
300 
301  // Out-of-bounds index [last+1].
303  &clkmgr_, CLKMGR_PARAM_NUM_HINTABLE_CLOCKS, &state));
304 }
305 
307 
308 TEST_F(ExternalClkRegwenTest, GetLocked) {
309  // Get regwen locked
310  {
311  bool locked = false;
312  EXPECT_READ32(CLKMGR_EXTCLK_CTRL_REGWEN_REG_OFFSET, 0);
315  EXPECT_EQ(locked, true);
316  }
317  // Get regwen unlocked
318  {
319  bool locked = true;
320  EXPECT_READ32(CLKMGR_EXTCLK_CTRL_REGWEN_REG_OFFSET, 1);
323  EXPECT_EQ(locked, false);
324  }
325 }
326 
327 TEST_F(ExternalClkRegwenTest, GetLockedError) {
328  bool locked;
335 }
336 
337 TEST_F(ExternalClkRegwenTest, SetLocked) {
338  EXPECT_WRITE32(CLKMGR_EXTCLK_CTRL_REGWEN_REG_OFFSET, 0);
340  // There is no support for unlock in the hardware.
341 }
342 
343 TEST_F(ExternalClkRegwenTest, SetLockedError) {
345 }
346 
347 class ExternalClkTest : public ClkMgrTest {};
348 
349 TEST_F(ExternalClkTest, EnableError) {
352 }
353 
354 TEST_F(ExternalClkTest, DisableError) {
356 }
357 
358 TEST_F(ExternalClkTest, Enable) {
359 #define EXTCLK_CTRL_REG_VALUE(enable_, low_speed_) \
360  {{ \
361  .offset = CLKMGR_EXTCLK_CTRL_SEL_OFFSET, \
362  .value = enable_ ? kMultiBitBool4True : kMultiBitBool4False, \
363  }, \
364  { \
365  .offset = CLKMGR_EXTCLK_CTRL_HI_SPEED_SEL_OFFSET, \
366  .value = low_speed_ ? kMultiBitBool4False : kMultiBitBool4True, \
367  }}
368  { // low speed with control unlocked
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));
373  }
374  { // high speed with control unlocked
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));
379  }
380 }
381 
382 TEST_F(ExternalClkTest, Disable) {
383  // disable with control unlocked
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));
388 }
389 #undef EXTCLK_CTRL_REG_VALUE
390 
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);
396 }
397 
398 TEST_F(ExternalClkTest, SwitchError) {
400 }
401 
402 class MeasureCtrlTest : public ClkMgrTest {};
403 
404 TEST_F(MeasureCtrlTest, Disable) {
405  EXPECT_WRITE32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 0);
407 }
408 
409 TEST_F(MeasureCtrlTest, DisableError) {
411 }
412 
413 TEST_F(MeasureCtrlTest, GetEnable) {
414  { // enabled
416  EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET,
417  {{CLKMGR_MEASURE_CTRL_REGWEN_EN_BIT, true}});
419  EXPECT_EQ(state, kDifToggleEnabled);
420  }
421  { // disabled
423  EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET,
424  {{CLKMGR_MEASURE_CTRL_REGWEN_EN_BIT, false}});
426  EXPECT_EQ(state, kDifToggleDisabled);
427  }
428 }
429 
430 TEST_F(MeasureCtrlTest, GetEnableError) {
433  dif_toggle_t state;
435 }
436 
437 class MeasureCountTest : public ClkMgrTest {};
438 
439 TEST_F(MeasureCountTest, EnableBadArgs) {
441  dif_clkmgr_enable_measure_counts(nullptr, kBadMeasClock, 2, 3));
442  // regwen on
443  EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 1);
445  dif_clkmgr_enable_measure_counts(&clkmgr_, kBadMeasClock, 2, 3));
447  nullptr, kDifClkmgrMeasureClockIoDiv2, 2, 3));
448  // regwen on
449  EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 1);
451  dif_clkmgr_enable_measure_counts(&clkmgr_, kBadMeasClock, 2, 3));
452 }
453 
454 TEST_F(MeasureCountTest, EnableLocked) {
455  // regwen off
456  EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 0);
458  &clkmgr_, kDifClkmgrMeasureClockIoDiv2, 2, 3),
459  kDifLocked);
460 }
461 
462 TEST_F(MeasureCountTest, Enable) {
463  uint32_t hi_val = 16;
464  uint32_t lo_val = 8;
465 
466  uint32_t en_offset;
467  uint32_t reg_offset;
468  bitfield_field32_t lo_field;
469  bitfield_field32_t hi_field;
470 
471  for (int i = 0; i < kDifClkmgrMeasureClockCount; ++i) {
472  dif_clkmgr_measure_clock_t clk = (dif_clkmgr_measure_clock_t)i;
473  switch (clk) {
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; \
479  break // No semicolon to force semicolon below.
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);
490  default:;
491 #undef PICK_COUNT_CTRL_FIELDS
492  }
493  EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 1);
494  std::vector<mock_mmio::BitField> thresholds_val = {
495  {
496  .offset = (uintptr_t)lo_field.index,
497  .value = (uintptr_t)lo_val,
498  },
499  {
500  .offset = hi_field.index,
501  .value = hi_val,
502  }};
503  EXPECT_WRITE32(reg_offset, thresholds_val);
504  EXPECT_WRITE32(reg_offset, thresholds_val);
505  EXPECT_WRITE32(en_offset, kMultiBitBool4True);
507  dif_clkmgr_enable_measure_counts(&clkmgr_, clk, lo_val, hi_val));
508  }
509 }
510 
511 TEST_F(MeasureCountTest, DisableBadArgs) {
512  EXPECT_DIF_BADARG(dif_clkmgr_disable_measure_counts(nullptr, kBadMeasClock));
513  // regwen on
514  EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 1);
515  EXPECT_DIF_BADARG(dif_clkmgr_disable_measure_counts(&clkmgr_, kBadMeasClock));
517  dif_clkmgr_disable_measure_counts(nullptr, kDifClkmgrMeasureClockIoDiv2));
518  // regwen off
519  EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 0);
520  EXPECT_EQ(
521  dif_clkmgr_disable_measure_counts(&clkmgr_, kDifClkmgrMeasureClockIoDiv2),
522  kDifLocked);
523 }
524 
525 TEST_F(MeasureCountTest, DisableLocked) {
526  // regwen off
527  EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 0);
528  EXPECT_EQ(
529  dif_clkmgr_disable_measure_counts(&clkmgr_, kDifClkmgrMeasureClockIoDiv2),
530  kDifLocked);
531 }
532 
533 TEST_F(MeasureCountTest, Disable) {
534  uint32_t en_offset;
535 
536  for (int i = 0; i < kDifClkmgrMeasureClockCount; ++i) {
537  dif_clkmgr_measure_clock_t clk = (dif_clkmgr_measure_clock_t)i;
538  switch (clk) {
539 #define PICK_COUNT_CTRL_FIELDS(kind_) \
540  en_offset = CLKMGR_##kind_##_MEAS_CTRL_EN_REG_OFFSET; \
541  break // No semicolon to force semicolon below.
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);
552  default:;
553 #undef PICK_COUNT_CTRL_FIELDS
554  }
555  EXPECT_READ32(CLKMGR_MEASURE_CTRL_REGWEN_REG_OFFSET, 1);
556  EXPECT_WRITE32(en_offset, kMultiBitBool4False);
558  }
559 }
560 
561 TEST_F(MeasureCountTest, GetEnableBadArgs) {
562  dif_toggle_t state;
564  dif_clkmgr_measure_counts_get_enable(nullptr, kBadMeasClock, nullptr));
566  dif_clkmgr_measure_counts_get_enable(&clkmgr_, kBadMeasClock, nullptr));
568  nullptr, kDifClkmgrMeasureClockIoDiv2, nullptr));
570  dif_clkmgr_measure_counts_get_enable(nullptr, kBadMeasClock, &state));
572  &clkmgr_, kDifClkmgrMeasureClockIoDiv2, nullptr));
574  nullptr, kDifClkmgrMeasureClockIoDiv2, &state));
576  dif_clkmgr_measure_counts_get_enable(&clkmgr_, kBadMeasClock, &state));
577 }
578 
579 TEST_F(MeasureCountTest, GetEnable) {
580  uint32_t en_offset;
581 
582  for (int i = 0; i < kDifClkmgrMeasureClockCount; ++i) {
583  dif_clkmgr_measure_clock_t clk = (dif_clkmgr_measure_clock_t)i;
584  switch (clk) {
585 #define PICK_COUNT_CTRL_FIELDS(kind_) \
586  en_offset = CLKMGR_##kind_##_MEAS_CTRL_EN_REG_OFFSET; \
587  break // No semicolon to force semicolon below.
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);
598  default:;
599 #undef PICK_COUNT_CTRL_FIELDS
600  }
601  EXPECT_READ32(en_offset, kDifToggleDisabled);
603  EXPECT_DIF_OK(dif_clkmgr_measure_counts_get_enable(&clkmgr_, clk, &state));
604  EXPECT_EQ(state, kDifToggleDisabled);
605  }
606 }
607 
608 TEST_F(MeasureCountTest, GetThresholdsBadArgs) {
609  uint32_t hi;
610  uint32_t lo;
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));
621  // Two bar args.
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));
634  // One bad args.
636  &clkmgr_, kDifClkmgrMeasureClockIoDiv2, &lo, nullptr));
638  &clkmgr_, kDifClkmgrMeasureClockIoDiv2, nullptr, &hi));
640  &clkmgr_, kBadMeasClock, &lo, &hi));
642  nullptr, kDifClkmgrMeasureClockIoDiv2, &lo, &hi));
643 }
644 
645 TEST_F(MeasureCountTest, GetThresholds) {
646  uint32_t reg_offset;
647  bitfield_field32_t lo_field;
648  bitfield_field32_t hi_field;
649 
650  for (int i = 0; i < kDifClkmgrMeasureClockCount; ++i) {
651  dif_clkmgr_measure_clock_t clk = (dif_clkmgr_measure_clock_t)i;
652  switch (clk) {
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; \
657  break // No semicolon to force semicolon below.
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);
668  default:;
669 #undef PICK_COUNT_CTRL_FIELDS
670  }
671  EXPECT_READ32(reg_offset, {{
672  .offset = lo_field.index,
673  .value = 8,
674  },
675  {
676  .offset = hi_field.index,
677  .value = 9,
678  }});
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);
685  }
686 }
687 
688 class RecovErrorTest : public ClkMgrTest {};
689 
690 TEST_F(RecovErrorTest, GetBadArgs) {
695 }
696 
697 TEST_F(RecovErrorTest, GetCodes) {
699  EXPECT_READ32(CLKMGR_RECOV_ERR_CODE_REG_OFFSET, 6);
701  EXPECT_EQ(codes, 6);
702 }
703 
704 TEST_F(RecovErrorTest, ClearBadArgs) {
706 }
707 
708 TEST_F(RecovErrorTest, ClearCodes) {
709  EXPECT_WRITE32(CLKMGR_RECOV_ERR_CODE_REG_OFFSET, 6);
711 }
712 
713 class FatalErrorTest : public ClkMgrTest {};
714 
715 TEST_F(FatalErrorTest, GetBadArgs) {
720 }
721 
722 TEST_F(FatalErrorTest, GetCodes) {
724  EXPECT_READ32(CLKMGR_FATAL_ERR_CODE_REG_OFFSET, 6);
726  EXPECT_EQ(codes, 6);
727 }
728 } // namespace
729 } // namespace dif_clkmgr_unittest