Skip to content

Commit 573173c

Browse files
committed
[silicon_creator,pwrmgr] Create a mock
This pwrmgr library is used in the watchdog unittest so it is useful to create a mock to abstract from the details of how the pwrmgr works. Signed-off-by: Amaury Pouly <[email protected]>
1 parent 2d105c4 commit 573173c

File tree

4 files changed

+91
-24
lines changed

4 files changed

+91
-24
lines changed

sw/device/silicon_creator/lib/drivers/BUILD

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -879,18 +879,33 @@ cc_test(
879879
],
880880
)
881881

882-
cc_library(
882+
dual_cc_library(
883883
name = "pwrmgr",
884-
srcs = ["pwrmgr.c"],
885-
hdrs = ["pwrmgr.h"],
886-
deps = [
887-
":ibex",
888-
"//hw/top:dt",
889-
"//hw/top:pwrmgr_c_regs",
890-
"//sw/device/lib/base:abs_mmio",
891-
"//sw/device/silicon_creator/lib:error",
892-
"//sw/device/silicon_creator/lib/base:sec_mmio",
893-
],
884+
srcs = dual_inputs(
885+
device = ["pwrmgr.c"],
886+
host = ["mock_pwrmgr.cc"],
887+
),
888+
hdrs = dual_inputs(
889+
host = ["mock_pwrmgr.h"],
890+
shared = ["pwrmgr.h"],
891+
),
892+
deps = dual_inputs(
893+
device = [
894+
":ibex",
895+
"//hw/top:pwrmgr_c_regs",
896+
"//sw/device/lib/base:abs_mmio",
897+
"//sw/device/silicon_creator/lib/base:sec_mmio",
898+
],
899+
host = [
900+
"//sw/device/lib/base:global_mock",
901+
"//sw/device/silicon_creator/testing:rom_test",
902+
"@googletest//:gtest",
903+
],
904+
shared = [
905+
"//hw/top:dt",
906+
"//sw/device/silicon_creator/lib:error",
907+
],
908+
),
894909
)
895910

896911
cc_library(
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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/mock_pwrmgr.h"
6+
7+
namespace rom_test {
8+
extern "C" {
9+
void pwrmgr_enable_watchdog_reset_request(void) {
10+
MockPwrmgr::Instance().EnableWatchdogResetRequest();
11+
}
12+
13+
/**
14+
* Synchronize across clock domain.
15+
*
16+
* Synchronizes across clock domains by setting the CDC_SYNC register and
17+
* waiting for it to clear.
18+
*
19+
* @param n Number of synchronizations to perform.
20+
*/
21+
void pwrmgr_cdc_sync(uint32_t n) { MockPwrmgr::Instance().CdcSync(n); }
22+
23+
/**
24+
* Enable all resets.
25+
*/
26+
void pwrmgr_all_resets_enable(void) {
27+
MockPwrmgr::Instance().AllResetsEnable();
28+
}
29+
30+
} // extern "C"
31+
} // namespace rom_test
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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+
#ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_MOCK_PWRMGR_H_
6+
#define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_MOCK_PWRMGR_H_
7+
8+
#include "sw/device/lib/base/global_mock.h"
9+
#include "sw/device/silicon_creator/lib/drivers/pwrmgr.h"
10+
11+
namespace rom_test {
12+
namespace internal {
13+
14+
/**
15+
* Mock class for pwrmgr.c.
16+
*/
17+
class MockPwrmgr : public global_mock::GlobalMock<MockPwrmgr> {
18+
public:
19+
MOCK_METHOD(void, EnableWatchdogResetRequest, ());
20+
MOCK_METHOD(void, CdcSync, (uint32_t));
21+
MOCK_METHOD(void, AllResetsEnable, ());
22+
};
23+
24+
} // namespace internal
25+
26+
using MockPwrmgr = testing::StrictMock<internal::MockPwrmgr>;
27+
28+
} // namespace rom_test
29+
30+
#endif // OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_MOCK_PWRMGR_H_

sw/device/silicon_creator/lib/drivers/watchdog_unittest.cc

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "sw/device/silicon_creator/lib/base/mock_sec_mmio.h"
1212
#include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
1313
#include "sw/device/silicon_creator/lib/drivers/mock_otp.h"
14+
#include "sw/device/silicon_creator/lib/drivers/mock_pwrmgr.h"
1415
#include "sw/device/silicon_creator/testing/rom_test.h"
1516

1617
#include "hw/top/aon_timer_regs.h"
@@ -24,13 +25,7 @@ using ::testing::Return;
2425

2526
class WatchdogTest : public rom_test::RomTest {
2627
protected:
27-
void ExpectCdcSync() {
28-
// The pwrmgr_cdc_sync function reads to check that the sync bit is clear,
29-
// writes to the sync bit and then reads back waiting for it to clear.
30-
EXPECT_ABS_READ32(pwrmgr_ + PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 0);
31-
EXPECT_ABS_WRITE32(pwrmgr_ + PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 1);
32-
EXPECT_ABS_READ32(pwrmgr_ + PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 0);
33-
}
28+
void ExpectCdcSync() { EXPECT_CALL(pwrmgr_, CdcSync(1)).WillOnce(Return()); }
3429
/**
3530
* Sets up expectations for `watchdog_init()`.
3631
*
@@ -44,11 +39,7 @@ class WatchdogTest : public rom_test::RomTest {
4439
OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_WATCHDOG_BITE_THRESHOLD_CYCLES_OFFSET))
4540
.WillOnce(Return(kBiteThreshold));
4641

47-
EXPECT_SEC_WRITE32(pwrmgr_ + PWRMGR_RESET_EN_REG_OFFSET,
48-
{
49-
{PWRMGR_RESET_EN_EN_1_BIT, true},
50-
});
51-
ExpectCdcSync();
42+
EXPECT_CALL(pwrmgr_, EnableWatchdogResetRequest).WillOnce(Return());
5243
EXPECT_SEC_WRITE32(wdog_ + AON_TIMER_WDOG_CTRL_REG_OFFSET,
5344
0 << AON_TIMER_WDOG_CTRL_ENABLE_BIT);
5445
EXPECT_ABS_WRITE32(wdog_ + AON_TIMER_WDOG_COUNT_REG_OFFSET, 0);
@@ -61,11 +52,11 @@ class WatchdogTest : public rom_test::RomTest {
6152
ExpectCdcSync();
6253
}
6354

64-
uint32_t pwrmgr_ = TOP_EARLGREY_PWRMGR_AON_BASE_ADDR;
6555
uint32_t wdog_ = TOP_EARLGREY_AON_TIMER_AON_BASE_ADDR;
6656
rom_test::MockAbsMmio abs_;
6757
rom_test::MockSecMmio sec_;
6858
rom_test::MockOtp otp_;
59+
rom_test::MockPwrmgr pwrmgr_;
6960
};
7061

7162
TEST_F(WatchdogTest, InitializeNoOtp) {

0 commit comments

Comments
 (0)