13 #include "pwrmgr_regs.h"
28 (1u << (PWRMGR_CONTROL_CORE_CLK_EN_BIT -
29 PWRMGR_CONTROL_CORE_CLK_EN_BIT)),
30 "Layout of control register changed.");
33 (1u << (PWRMGR_CONTROL_IO_CLK_EN_BIT -
34 PWRMGR_CONTROL_CORE_CLK_EN_BIT)),
35 "Layout of control register changed.");
38 (1u << (PWRMGR_CONTROL_USB_CLK_EN_LP_BIT -
39 PWRMGR_CONTROL_CORE_CLK_EN_BIT)),
40 "Layout of control register changed.");
43 (1u << (PWRMGR_CONTROL_USB_CLK_EN_ACTIVE_BIT -
44 PWRMGR_CONTROL_CORE_CLK_EN_BIT)),
45 "Layout of control register changed.");
48 (1u << (PWRMGR_CONTROL_MAIN_PD_N_BIT -
49 PWRMGR_CONTROL_CORE_CLK_EN_BIT)),
50 "Layout of control register changed.");
62 .index = PWRMGR_CONTROL_CORE_CLK_EN_BIT,
69 #if defined(OPENTITAN_IS_EARLGREY)
70 static_assert(kDifPwrmgrWakeupRequestSourceOne ==
71 (1u << PWRMGR_WAKEUP_EN_EN_0_BIT),
72 "Layout of WAKEUP_EN register changed.");
73 static_assert(kDifPwrmgrWakeupRequestSourceOne ==
74 (1u << PWRMGR_PARAM_SYSRST_CTRL_AON_WKUP_REQ_IDX),
75 "Layout of WAKE_INFO register changed.");
76 static_assert(kDifPwrmgrWakeupRequestSourceTwo ==
77 (1u << PWRMGR_PARAM_ADC_CTRL_AON_WKUP_REQ_IDX),
78 "Layout of WAKE_INFO register changed.");
79 static_assert(kDifPwrmgrWakeupRequestSourceThree ==
80 (1u << PWRMGR_PARAM_PINMUX_AON_PIN_WKUP_REQ_IDX),
81 "Layout of WAKE_INFO register changed.");
82 static_assert(kDifPwrmgrWakeupRequestSourceFour ==
83 (1u << PWRMGR_PARAM_PINMUX_AON_USB_WKUP_REQ_IDX),
84 "Layout of WAKE_INFO register changed.");
85 static_assert(kDifPwrmgrWakeupRequestSourceFive ==
86 (1u << PWRMGR_PARAM_AON_TIMER_AON_WKUP_REQ_IDX),
87 "Layout of WAKE_INFO register changed.");
88 static_assert(kDifPwrmgrWakeupRequestSourceSix ==
89 (1u << PWRMGR_PARAM_SENSOR_CTRL_AON_WKUP_REQ_IDX),
90 "Layout of WAKE_INFO register changed.");
91 #elif defined(OPENTITAN_IS_DARJEELING)
92 static_assert(kDifPwrmgrWakeupRequestSourceOne ==
93 (1u << PWRMGR_PARAM_PINMUX_AON_PIN_WKUP_REQ_IDX),
94 "Layout of WAKE_INFO register changed.");
95 static_assert(kDifPwrmgrWakeupRequestSourceTwo ==
96 (1u << PWRMGR_PARAM_AON_TIMER_AON_WKUP_REQ_IDX),
97 "Layout of WAKE_INFO register changed.");
98 static_assert(kDifPwrmgrWakeupRequestSourceThree ==
99 (1u << PWRMGR_PARAM_SOC_PROXY_WKUP_INTERNAL_REQ_IDX),
100 "Layout of WAKE_INFO register changed.");
101 static_assert(kDifPwrmgrWakeupRequestSourceFour ==
102 (1u << PWRMGR_PARAM_SOC_PROXY_WKUP_EXTERNAL_REQ_IDX),
103 "Layout of WAKE_INFO register changed.");
105 #error "dif_pwrmgr does not support this top"
112 static_assert(kDifPwrmgrResetRequestSourceOne ==
113 (1u << PWRMGR_RESET_EN_EN_0_BIT),
114 "Layout of RESET_EN register changed.");
115 static_assert(kDifPwrmgrResetRequestSourceTwo ==
116 (1u << PWRMGR_RESET_EN_EN_1_BIT),
117 "Layout of RESET_EN register changed.");
122 static_assert(kDifPwrmgrIrqWakeup == PWRMGR_INTR_COMMON_WAKEUP_BIT,
123 "Layout of interrupt registers changed.");
129 ptrdiff_t write_enable_reg_offset;
131 ptrdiff_t sources_enable_reg_offset;
132 ptrdiff_t cur_req_sources_reg_offset;
146 .write_enable_reg_offset = PWRMGR_WAKEUP_EN_REGWEN_REG_OFFSET,
147 .write_enable_bit_index = PWRMGR_WAKEUP_EN_REGWEN_EN_BIT,
148 .sources_enable_reg_offset = PWRMGR_WAKEUP_EN_REG_OFFSET,
149 .cur_req_sources_reg_offset = PWRMGR_WAKE_STATUS_REG_OFFSET,
152 .mask = kDifPwrmgrWakeupRequestSourceOne |
153 kDifPwrmgrWakeupRequestSourceTwo |
154 kDifPwrmgrWakeupRequestSourceThree |
155 #if defined(OPENTITAN_IS_EARLGREY)
156 kDifPwrmgrWakeupRequestSourceFour |
157 kDifPwrmgrWakeupRequestSourceFive |
158 kDifPwrmgrWakeupRequestSourceSix,
159 #elif defined(OPENTITAN_IS_DARJEELING)
160 kDifPwrmgrWakeupRequestSourceFour,
162 #error "dif_pwrmgr does not support this top"
169 .write_enable_reg_offset = PWRMGR_RESET_EN_REGWEN_REG_OFFSET,
170 .write_enable_bit_index = PWRMGR_RESET_EN_REGWEN_EN_BIT,
171 .sources_enable_reg_offset = PWRMGR_RESET_EN_REG_OFFSET,
172 .cur_req_sources_reg_offset = PWRMGR_RESET_STATUS_REG_OFFSET,
175 .mask = kDifPwrmgrResetRequestSourceOne |
176 kDifPwrmgrResetRequestSourceTwo,
196 return (val & bitfield.
mask) == val;
206 static bool control_register_is_locked(
const dif_pwrmgr_t *pwrmgr) {
209 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CTRL_CFG_REGWEN_REG_OFFSET),
210 PWRMGR_CTRL_CFG_REGWEN_EN_BIT);
219 static void sync_slow_clock_domain_polled(
const dif_pwrmgr_t *pwrmgr) {
222 pwrmgr->base_addr, PWRMGR_CFG_CDC_SYNC_REG_OFFSET,
225 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CFG_CDC_SYNC_REG_OFFSET),
226 PWRMGR_CFG_CDC_SYNC_SYNC_BIT)) {
234 static bool request_sources_is_locked(
const dif_pwrmgr_t *pwrmgr,
238 mmio_region_read32(pwrmgr->base_addr, reg_info.write_enable_reg_offset);
251 if (control_register_is_locked(pwrmgr)) {
256 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET);
259 mmio_region_write32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET, reg_val);
263 sync_slow_clock_domain_polled(pwrmgr);
270 if (pwrmgr == NULL || cur_state == NULL) {
275 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET);
285 if (pwrmgr == NULL || !is_valid_for_bitfield(config, kDomainConfigBitfield) ||
290 if (control_register_is_locked(pwrmgr)) {
295 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET);
297 mmio_region_write32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET, reg_val);
301 sync_slow_clock_domain_polled(pwrmgr);
308 if (pwrmgr == NULL || config == NULL) {
313 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET);
315 reg_val, kDomainConfigBitfield);
323 if (pwrmgr == NULL || !is_valid_req_type(req_type) ||
330 if (!is_valid_for_bitfield(sources, reg_info.bitfield)) {
335 if (request_sources_is_locked(pwrmgr, req_type)) {
341 mmio_region_write32(pwrmgr->base_addr, reg_info.sources_enable_reg_offset,
345 sync_slow_clock_domain_polled(pwrmgr);
353 if (pwrmgr == NULL || !is_valid_req_type(req_type) || sources == NULL) {
359 mmio_region_read32(pwrmgr->base_addr, reg_info.sources_enable_reg_offset);
368 if (pwrmgr == NULL || !is_valid_req_type(req_type) || sources == NULL) {
373 uint32_t reg_val = mmio_region_read32(pwrmgr->base_addr,
374 reg_info.cur_req_sources_reg_offset);
382 if (pwrmgr == NULL || !is_valid_req_type(req_type)) {
388 mmio_region_write32(pwrmgr->base_addr,
389 request_reg_infos[req_type].write_enable_reg_offset, 0);
397 if (pwrmgr == NULL || !is_valid_req_type(req_type) || is_locked == NULL) {
401 *is_locked = request_sources_is_locked(pwrmgr, req_type);
416 mmio_region_write32(pwrmgr->base_addr,
417 PWRMGR_WAKE_INFO_CAPTURE_DIS_REG_OFFSET, reg_val);
424 if (pwrmgr == NULL || cur_state == NULL) {
428 uint32_t reg_val = mmio_region_read32(
429 pwrmgr->base_addr, PWRMGR_WAKE_INFO_CAPTURE_DIS_REG_OFFSET);
439 if (pwrmgr == NULL || reason == NULL) {
444 mmio_region_read32(pwrmgr->base_addr, PWRMGR_WAKE_INFO_REG_OFFSET);
456 if (request_sources != 0) {
462 .request_sources = request_sources,
469 if (pwrmgr == NULL) {
473 mmio_region_write32(pwrmgr->base_addr, PWRMGR_WAKE_INFO_REG_OFFSET,
481 if (pwrmgr == NULL || codes == NULL) {
485 mmio_region_read32(pwrmgr->base_addr, PWRMGR_FAULT_STATUS_REG_OFFSET);