Software APIs
sensor_ctrl_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 
5 #include "sw/device/silicon_creator/lib/drivers/sensor_ctrl.h"
6 
7 #include "gmock/gmock.h"
8 #include "gtest/gtest.h"
9 #include "sw/device/silicon_creator/lib/base/mock_sec_mmio.h"
10 #include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
11 #include "sw/device/silicon_creator/lib/drivers/mock_otp.h"
12 #include "sw/device/silicon_creator/testing/rom_test.h"
13 
15 #include "otp_ctrl_regs.h"
16 #include "sensor_ctrl_regs.h"
17 
18 namespace sensor_ctrl_unittest {
19 namespace {
20 using ::testing::_;
21 using ::testing::AnyNumber;
22 using ::testing::NiceMock;
23 using ::testing::NotNull;
24 using ::testing::Return;
25 
26 constexpr uint32_t kOtpSensorCtrl =
27  OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_SENSOR_CTRL_ALERT_CFG_OFFSET;
28 
30  public testing::WithParamInterface<lifecycle_state_t> {
31  protected:
32  void SetupExpectations() {
33  ON_CALL(otp_, read32(_)).WillByDefault([](uint32_t addr) {
34  // Sensor configuration:
35  // 0: Enabled=True Recov=True
36  // 1: Enabled=True Recov=False
37  // 2: Enabled=True Recov=False
38  // 3: Enabled=True Recov=True
39  // 4: Enabled=False Recov=False
40  // 5: Enabled=False Recov=False
41  // 6: Enabled=False Recov=False
42  // 7: Enabled=False Recov=False
43  // The remaining values are zero, which is meaningless for "Enabled", and
44  // translates to Recov=True because of the bit-ops in the configure
45  // function.
46  // 8: Enabled=X Recov=True
47  // 9: Enabled=X Recov=True
48  // 10: Enabled=X Recov=True
49  switch (addr) {
50  case kOtpSensorCtrl + 0:
51  return 0x66969666UL;
52  case kOtpSensorCtrl + 4:
53  return 0x99999999UL;
54  case kOtpSensorCtrl + 8:
55  return 0x00000000UL;
56  default:
57  return 0UL;
58  }
59  });
60 
61  EXPECT_CALL(sec_mmio_,
62  Write32(base_ + SENSOR_CTRL_ALERT_EN_0_REG_OFFSET, 6));
63  EXPECT_CALL(sec_mmio_,
64  Write32(base_ + SENSOR_CTRL_ALERT_EN_1_REG_OFFSET, 6));
65  EXPECT_CALL(sec_mmio_,
66  Write32(base_ + SENSOR_CTRL_ALERT_EN_2_REG_OFFSET, 6));
67  EXPECT_CALL(sec_mmio_,
68  Write32(base_ + SENSOR_CTRL_ALERT_EN_3_REG_OFFSET, 6));
69 
70  EXPECT_CALL(sec_mmio_,
71  Write32(base_ + SENSOR_CTRL_ALERT_EN_4_REG_OFFSET, 9));
72  EXPECT_CALL(sec_mmio_,
73  Write32(base_ + SENSOR_CTRL_ALERT_EN_5_REG_OFFSET, 9));
74  EXPECT_CALL(sec_mmio_,
75  Write32(base_ + SENSOR_CTRL_ALERT_EN_6_REG_OFFSET, 9));
76  EXPECT_CALL(sec_mmio_,
77  Write32(base_ + SENSOR_CTRL_ALERT_EN_7_REG_OFFSET, 9));
78 
79  EXPECT_CALL(sec_mmio_,
80  Write32(base_ + SENSOR_CTRL_ALERT_EN_8_REG_OFFSET, 0));
81  EXPECT_CALL(sec_mmio_,
82  Write32(base_ + SENSOR_CTRL_ALERT_EN_9_REG_OFFSET, 0));
83  EXPECT_CALL(sec_mmio_,
84  Write32(base_ + SENSOR_CTRL_ALERT_EN_10_REG_OFFSET, 0));
85 
86  // Expect to see a 1 bit for every Recov=False configuration.
87  EXPECT_CALL(sec_mmio_,
88  Write32(base_ + SENSOR_CTRL_FATAL_ALERT_EN_REG_OFFSET, 0x0F6));
89  }
91  rom_test::NiceMockOtp otp_;
92  rom_test::MockSecMmio sec_mmio_;
93 };
94 
95 TEST_P(SensorCtrlTest, Configure) {
96  lifecycle_state_t state = GetParam();
97  switch (state) {
98  case kLcStateTest:
99  case kLcStateRma:
100  // The configure function does nothing for Test and RMA states.
101  break;
102  default:
103  // Normal test conditions.
104  SetupExpectations();
105  }
106  EXPECT_EQ(kErrorOk, sensor_ctrl_configure(state));
107 }
108 
109 INSTANTIATE_TEST_SUITE_P(LcStates, SensorCtrlTest,
110  testing::Values(kLcStateTest, kLcStateRma, kLcStateDev,
111  kLcStateProd, kLcStateProdEnd));
112 
113 } // namespace
114 } // namespace sensor_ctrl_unittest