Software APIs
dif_pwrmgr_autogen.c
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 // THIS FILE HAS BEEN GENERATED, DO NOT EDIT MANUALLY. COMMAND:
6 // util/make_new_dif.py --mode=regen --only=autogen
7 
9 
10 #include <stdint.h>
11 
13 
14 #include "pwrmgr_regs.h" // Generated.
15 
18  if (pwrmgr == NULL) {
19  return kDifBadArg;
20  }
21 
22  pwrmgr->base_addr = base_addr;
23 
24  return kDifOk;
25 }
26 
28  dif_pwrmgr_alert_t alert) {
29  if (pwrmgr == NULL) {
30  return kDifBadArg;
31  }
32 
33  bitfield_bit32_index_t alert_idx;
34  switch (alert) {
36  alert_idx = PWRMGR_ALERT_TEST_FATAL_FAULT_BIT;
37  break;
38  default:
39  return kDifBadArg;
40  }
41 
42  uint32_t alert_test_reg = bitfield_bit32_write(0, alert_idx, true);
43  mmio_region_write32(pwrmgr->base_addr,
44  (ptrdiff_t)PWRMGR_ALERT_TEST_REG_OFFSET, alert_test_reg);
45 
46  return kDifOk;
47 }
48 
49 /**
50  * Get the corresponding interrupt register bit offset of the IRQ.
51  */
52 static bool pwrmgr_get_irq_bit_index(dif_pwrmgr_irq_t irq,
53  bitfield_bit32_index_t *index_out) {
54  switch (irq) {
56  *index_out = PWRMGR_INTR_COMMON_WAKEUP_BIT;
57  break;
58  default:
59  return false;
60  }
61 
62  return true;
63 }
64 
65 static dif_irq_type_t irq_types[] = {
67 };
68 
71  dif_pwrmgr_irq_t irq,
72  dif_irq_type_t *type) {
73  if (pwrmgr == NULL || type == NULL || irq == kDifPwrmgrIrqWakeup + 1) {
74  return kDifBadArg;
75  }
76 
77  *type = irq_types[irq];
78 
79  return kDifOk;
80 }
81 
84  const dif_pwrmgr_t *pwrmgr, dif_pwrmgr_irq_state_snapshot_t *snapshot) {
85  if (pwrmgr == NULL || snapshot == NULL) {
86  return kDifBadArg;
87  }
88 
89  *snapshot = mmio_region_read32(pwrmgr->base_addr,
90  (ptrdiff_t)PWRMGR_INTR_STATE_REG_OFFSET);
91 
92  return kDifOk;
93 }
94 
97  const dif_pwrmgr_t *pwrmgr, dif_pwrmgr_irq_state_snapshot_t snapshot) {
98  if (pwrmgr == NULL) {
99  return kDifBadArg;
100  }
101 
102  mmio_region_write32(pwrmgr->base_addr,
103  (ptrdiff_t)PWRMGR_INTR_STATE_REG_OFFSET, snapshot);
104 
105  return kDifOk;
106 }
107 
110  dif_pwrmgr_irq_t irq, bool *is_pending) {
111  if (pwrmgr == NULL || is_pending == NULL) {
112  return kDifBadArg;
113  }
114 
116  if (!pwrmgr_get_irq_bit_index(irq, &index)) {
117  return kDifBadArg;
118  }
119 
120  uint32_t intr_state_reg = mmio_region_read32(
121  pwrmgr->base_addr, (ptrdiff_t)PWRMGR_INTR_STATE_REG_OFFSET);
122 
123  *is_pending = bitfield_bit32_read(intr_state_reg, index);
124 
125  return kDifOk;
126 }
127 
130  if (pwrmgr == NULL) {
131  return kDifBadArg;
132  }
133 
134  // Writing to the register clears the corresponding bits (Write-one clear).
135  mmio_region_write32(pwrmgr->base_addr,
136  (ptrdiff_t)PWRMGR_INTR_STATE_REG_OFFSET, UINT32_MAX);
137 
138  return kDifOk;
139 }
140 
143  dif_pwrmgr_irq_t irq) {
144  if (pwrmgr == NULL) {
145  return kDifBadArg;
146  }
147 
149  if (!pwrmgr_get_irq_bit_index(irq, &index)) {
150  return kDifBadArg;
151  }
152 
153  // Writing to the register clears the corresponding bits (Write-one clear).
154  uint32_t intr_state_reg = bitfield_bit32_write(0, index, true);
155  mmio_region_write32(pwrmgr->base_addr,
156  (ptrdiff_t)PWRMGR_INTR_STATE_REG_OFFSET, intr_state_reg);
157 
158  return kDifOk;
159 }
160 
163  dif_pwrmgr_irq_t irq, const bool val) {
164  if (pwrmgr == NULL) {
165  return kDifBadArg;
166  }
167 
169  if (!pwrmgr_get_irq_bit_index(irq, &index)) {
170  return kDifBadArg;
171  }
172 
173  uint32_t intr_test_reg = bitfield_bit32_write(0, index, val);
174  mmio_region_write32(pwrmgr->base_addr, (ptrdiff_t)PWRMGR_INTR_TEST_REG_OFFSET,
175  intr_test_reg);
176 
177  return kDifOk;
178 }
179 
182  dif_pwrmgr_irq_t irq,
183  dif_toggle_t *state) {
184  if (pwrmgr == NULL || state == NULL) {
185  return kDifBadArg;
186  }
187 
189  if (!pwrmgr_get_irq_bit_index(irq, &index)) {
190  return kDifBadArg;
191  }
192 
193  uint32_t intr_enable_reg = mmio_region_read32(
194  pwrmgr->base_addr, (ptrdiff_t)PWRMGR_INTR_ENABLE_REG_OFFSET);
195 
196  bool is_enabled = bitfield_bit32_read(intr_enable_reg, index);
197  *state = is_enabled ? kDifToggleEnabled : kDifToggleDisabled;
198 
199  return kDifOk;
200 }
201 
204  dif_pwrmgr_irq_t irq,
205  dif_toggle_t state) {
206  if (pwrmgr == NULL) {
207  return kDifBadArg;
208  }
209 
211  if (!pwrmgr_get_irq_bit_index(irq, &index)) {
212  return kDifBadArg;
213  }
214 
215  uint32_t intr_enable_reg = mmio_region_read32(
216  pwrmgr->base_addr, (ptrdiff_t)PWRMGR_INTR_ENABLE_REG_OFFSET);
217 
218  bool enable_bit = (state == kDifToggleEnabled) ? true : false;
219  intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
220  mmio_region_write32(pwrmgr->base_addr,
221  (ptrdiff_t)PWRMGR_INTR_ENABLE_REG_OFFSET,
222  intr_enable_reg);
223 
224  return kDifOk;
225 }
226 
229  const dif_pwrmgr_t *pwrmgr, dif_pwrmgr_irq_enable_snapshot_t *snapshot) {
230  if (pwrmgr == NULL) {
231  return kDifBadArg;
232  }
233 
234  // Pass the current interrupt state to the caller, if requested.
235  if (snapshot != NULL) {
236  *snapshot = mmio_region_read32(pwrmgr->base_addr,
237  (ptrdiff_t)PWRMGR_INTR_ENABLE_REG_OFFSET);
238  }
239 
240  // Disable all interrupts.
241  mmio_region_write32(pwrmgr->base_addr,
242  (ptrdiff_t)PWRMGR_INTR_ENABLE_REG_OFFSET, 0u);
243 
244  return kDifOk;
245 }
246 
249  const dif_pwrmgr_t *pwrmgr,
250  const dif_pwrmgr_irq_enable_snapshot_t *snapshot) {
251  if (pwrmgr == NULL || snapshot == NULL) {
252  return kDifBadArg;
253  }
254 
255  mmio_region_write32(pwrmgr->base_addr,
256  (ptrdiff_t)PWRMGR_INTR_ENABLE_REG_OFFSET, *snapshot);
257 
258  return kDifOk;
259 }