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,
184 dt_instance_id_t inst_id,
size_t sig_idx,
186 if (pwrmgr == NULL || sources == NULL) {
196 for (
size_t i = 0; i < dt_pwrmgr_wakeup_src_count(dt); i++) {
197 dt_pwrmgr_wakeup_src_t src = dt_pwrmgr_wakeup_src(dt, i);
198 if (src.inst_id == inst_id && src.wakeup == sig_idx) {
205 for (
size_t i = 0; i < dt_pwrmgr_reset_request_src_count(dt); i++) {
206 dt_pwrmgr_reset_req_src_t src = dt_pwrmgr_reset_request_src(dt, i);
207 if (src.inst_id == inst_id && src.reset_req == sig_idx) {
232 return (val & bitfield.
mask) == val;
242 static bool control_register_is_locked(
const dif_pwrmgr_t *pwrmgr) {
245 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CTRL_CFG_REGWEN_REG_OFFSET),
246 PWRMGR_CTRL_CFG_REGWEN_EN_BIT);
255 static void sync_slow_clock_domain_polled(
const dif_pwrmgr_t *pwrmgr) {
258 pwrmgr->base_addr, PWRMGR_CFG_CDC_SYNC_REG_OFFSET,
261 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CFG_CDC_SYNC_REG_OFFSET),
262 PWRMGR_CFG_CDC_SYNC_SYNC_BIT)) {
270 static bool request_sources_is_locked(
const dif_pwrmgr_t *pwrmgr,
274 mmio_region_read32(pwrmgr->base_addr, reg_info.write_enable_reg_offset);
287 if (control_register_is_locked(pwrmgr)) {
292 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET);
295 mmio_region_write32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET, reg_val);
299 sync_slow_clock_domain_polled(pwrmgr);
306 if (pwrmgr == NULL || cur_state == NULL) {
311 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET);
321 if (pwrmgr == NULL || !is_valid_for_bitfield(config, kDomainConfigBitfield) ||
326 if (control_register_is_locked(pwrmgr)) {
331 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET);
333 mmio_region_write32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET, reg_val);
337 sync_slow_clock_domain_polled(pwrmgr);
344 if (pwrmgr == NULL || config == NULL) {
349 mmio_region_read32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET);
351 reg_val, kDomainConfigBitfield);
359 if (pwrmgr == NULL || !is_valid_req_type(req_type) ||
366 if (!is_valid_for_bitfield(sources, reg_info.bitfield)) {
371 if (request_sources_is_locked(pwrmgr, req_type)) {
377 mmio_region_write32(pwrmgr->base_addr, reg_info.sources_enable_reg_offset,
381 sync_slow_clock_domain_polled(pwrmgr);
389 if (pwrmgr == NULL || !is_valid_req_type(req_type) || sources == NULL) {
395 mmio_region_read32(pwrmgr->base_addr, reg_info.sources_enable_reg_offset);
404 if (pwrmgr == NULL || !is_valid_req_type(req_type) || sources == NULL) {
409 uint32_t reg_val = mmio_region_read32(pwrmgr->base_addr,
410 reg_info.cur_req_sources_reg_offset);
418 if (pwrmgr == NULL || !is_valid_req_type(req_type)) {
424 mmio_region_write32(pwrmgr->base_addr,
425 request_reg_infos[req_type].write_enable_reg_offset, 0);
433 if (pwrmgr == NULL || !is_valid_req_type(req_type) || is_locked == NULL) {
437 *is_locked = request_sources_is_locked(pwrmgr, req_type);
452 mmio_region_write32(pwrmgr->base_addr,
453 PWRMGR_WAKE_INFO_CAPTURE_DIS_REG_OFFSET, reg_val);
460 if (pwrmgr == NULL || cur_state == NULL) {
464 uint32_t reg_val = mmio_region_read32(
465 pwrmgr->base_addr, PWRMGR_WAKE_INFO_CAPTURE_DIS_REG_OFFSET);
475 if (pwrmgr == NULL || reason == NULL) {
480 mmio_region_read32(pwrmgr->base_addr, PWRMGR_WAKE_INFO_REG_OFFSET);
492 if (request_sources != 0) {
498 .request_sources = request_sources,
505 if (pwrmgr == NULL) {
509 mmio_region_write32(pwrmgr->base_addr, PWRMGR_WAKE_INFO_REG_OFFSET,
517 if (pwrmgr == NULL || codes == NULL) {
521 mmio_region_read32(pwrmgr->base_addr, PWRMGR_FAULT_STATUS_REG_OFFSET);