11 #include "gtest/gtest.h"
14 #include "sw/device/lib/base/mock_mmio.h"
15 #include "sw/device/lib/base/multibits.h"
18 #include "lc_ctrl_regs.h"
20 namespace dif_lc_ctrl_unittest {
22 using ::mock_mmio::LeInt;
23 using ::mock_mmio::MmioTest;
24 using ::mock_mmio::MockDevice;
25 using ::testing::Test;
29 dif_lc_ctrl_t lc_ = {.base_addr = dev().region()};
35 std::vector<std::pair<uint32_t, dif_lc_ctrl_state_t>> states = {
37 {LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED0,
40 {LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED1,
43 {LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED2,
46 {LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED3,
49 {LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED4,
52 {LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED5,
55 {LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED6,
58 {LC_CTRL_LC_STATE_STATE_VALUE_TEST_UNLOCKED7,
66 {LC_CTRL_LC_STATE_STATE_VALUE_POST_TRANSITION,
72 for (
auto pair : states) {
75 EXPECT_READ32(LC_CTRL_LC_STATE_REG_OFFSET,
76 {{LC_CTRL_LC_STATE_STATE_OFFSET, pair.first}});
78 EXPECT_EQ(state, pair.second);
82 TEST_F(StateTest, GetAttempts) {
85 EXPECT_READ32(LC_CTRL_LC_TRANSITION_CNT_REG_OFFSET,
86 {{LC_CTRL_LC_TRANSITION_CNT_CNT_OFFSET, 13}});
88 EXPECT_EQ(attempts, 13);
90 EXPECT_READ32(LC_CTRL_LC_TRANSITION_CNT_REG_OFFSET,
91 {{LC_CTRL_LC_TRANSITION_CNT_CNT_OFFSET,
92 LC_CTRL_LC_TRANSITION_CNT_CNT_MASK}});
96 TEST_F(StateTest, GetStatus) {
99 EXPECT_READ32(LC_CTRL_STATUS_REG_OFFSET,
101 {LC_CTRL_STATUS_INITIALIZED_BIT,
true},
102 {LC_CTRL_STATUS_READY_BIT,
true},
108 EXPECT_READ32(LC_CTRL_STATUS_REG_OFFSET,
110 {LC_CTRL_STATUS_TRANSITION_ERROR_BIT,
true},
111 {LC_CTRL_STATUS_TOKEN_ERROR_BIT,
true},
112 {LC_CTRL_STATUS_OTP_ERROR_BIT,
true},
121 TEST_F(StateTest, GetIdState) {
122 std::vector<std::pair<uint32_t, dif_lc_ctrl_id_state_t>> states = {
124 {LC_CTRL_LC_ID_STATE_STATE_VALUE_PERSONALIZED,
129 for (
auto pair : states) {
132 EXPECT_READ32(LC_CTRL_LC_ID_STATE_REG_OFFSET, pair.first);
134 EXPECT_EQ(state, pair.second);
138 TEST_F(StateTest, NullArgs) {
159 EXPECT_READ32(LC_CTRL_CLAIM_TRANSITION_IF_REGWEN_REG_OFFSET,
true);
160 EXPECT_WRITE32(LC_CTRL_CLAIM_TRANSITION_IF_REG_OFFSET, kMultiBitBool8True);
161 EXPECT_READ32(LC_CTRL_CLAIM_TRANSITION_IF_REG_OFFSET, kMultiBitBool8True);
164 EXPECT_READ32(LC_CTRL_CLAIM_TRANSITION_IF_REGWEN_REG_OFFSET,
true);
165 EXPECT_WRITE32(LC_CTRL_CLAIM_TRANSITION_IF_REG_OFFSET, kMultiBitBool8True);
166 EXPECT_READ32(LC_CTRL_CLAIM_TRANSITION_IF_REG_OFFSET, kMultiBitBool8False);
170 TEST_F(MutexTest, Release) {
171 EXPECT_READ32(LC_CTRL_CLAIM_TRANSITION_IF_REG_OFFSET, kMultiBitBool8True);
172 EXPECT_WRITE32(LC_CTRL_CLAIM_TRANSITION_IF_REG_OFFSET, kMultiBitBool8False);
175 EXPECT_READ32(LC_CTRL_CLAIM_TRANSITION_IF_REG_OFFSET, kMultiBitBool8False);
179 TEST_F(MutexTest, NullArgs) {
184 TEST_F(MutexTest, LockMutexClaim) {
185 EXPECT_WRITE32(LC_CTRL_CLAIM_TRANSITION_IF_REGWEN_REG_OFFSET,
false);
187 EXPECT_READ32(LC_CTRL_CLAIM_TRANSITION_IF_REGWEN_REG_OFFSET,
false);
194 EXPECT_READ32(LC_CTRL_TRANSITION_REGWEN_REG_OFFSET,
true);
195 EXPECT_WRITE32(LC_CTRL_TRANSITION_TARGET_REG_OFFSET,
196 LC_CTRL_TRANSITION_TARGET_STATE_VALUE_PROD);
197 EXPECT_WRITE32(LC_CTRL_TRANSITION_CTRL_REG_OFFSET, 0x0);
202 TEST_F(ConfigureTest, SucessWithToken) {
205 EXPECT_READ32(LC_CTRL_TRANSITION_REGWEN_REG_OFFSET,
true);
206 EXPECT_WRITE32(LC_CTRL_TRANSITION_TARGET_REG_OFFSET,
207 LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_UNLOCKED2);
208 EXPECT_WRITE32(LC_CTRL_TRANSITION_CTRL_REG_OFFSET, 0x1);
209 EXPECT_WRITE32(LC_CTRL_TRANSITION_TOKEN_0_REG_OFFSET, LeInt(
"this"));
210 EXPECT_WRITE32(LC_CTRL_TRANSITION_TOKEN_1_REG_OFFSET, LeInt(
" is "));
211 EXPECT_WRITE32(LC_CTRL_TRANSITION_TOKEN_2_REG_OFFSET, LeInt(
"a to"));
212 EXPECT_WRITE32(LC_CTRL_TRANSITION_TOKEN_3_REG_OFFSET, LeInt(
"ken\0"));
216 EXPECT_READ32(LC_CTRL_TRANSITION_REGWEN_REG_OFFSET,
true);
217 EXPECT_WRITE32(LC_CTRL_TRANSITION_TARGET_REG_OFFSET,
218 LC_CTRL_TRANSITION_TARGET_STATE_VALUE_TEST_UNLOCKED6);
219 EXPECT_WRITE32(LC_CTRL_TRANSITION_CTRL_REG_OFFSET, 0x1);
220 EXPECT_WRITE32(LC_CTRL_TRANSITION_TOKEN_0_REG_OFFSET, LeInt(
"this"));
221 EXPECT_WRITE32(LC_CTRL_TRANSITION_TOKEN_1_REG_OFFSET, LeInt(
" is "));
222 EXPECT_WRITE32(LC_CTRL_TRANSITION_TOKEN_2_REG_OFFSET, LeInt(
"a to"));
223 EXPECT_WRITE32(LC_CTRL_TRANSITION_TOKEN_3_REG_OFFSET, LeInt(
"ken\0"));
228 TEST_F(ConfigureTest, Locked) {
229 EXPECT_READ32(LC_CTRL_TRANSITION_REGWEN_REG_OFFSET,
false);
234 TEST_F(ConfigureTest, NullHandle) {
243 EXPECT_READ32(LC_CTRL_TRANSITION_REGWEN_REG_OFFSET,
true);
244 EXPECT_WRITE32(LC_CTRL_TRANSITION_CMD_REG_OFFSET,
true);
248 TEST_F(TransitionTest, Locked) {
249 EXPECT_READ32(LC_CTRL_TRANSITION_REGWEN_REG_OFFSET,
false);
253 TEST_F(TransitionTest, NullHandle) {
260 uint32_t settings_read = 0;
261 EXPECT_READ32(LC_CTRL_TRANSITION_REGWEN_REG_OFFSET,
true);
262 EXPECT_READ32(LC_CTRL_OTP_VENDOR_TEST_CTRL_REG_OFFSET, 0x5A);
264 EXPECT_EQ(settings_read, 0x5A);
267 TEST_F(OtpVendorTestRegTest, Write) {
268 EXPECT_READ32(LC_CTRL_TRANSITION_REGWEN_REG_OFFSET,
true);
269 EXPECT_WRITE32(LC_CTRL_OTP_VENDOR_TEST_CTRL_REG_OFFSET, 0xA5);