Software APIs
dif_edn_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 "edn_regs.h" // Generated.
15 
18  if (edn == NULL) {
19  return kDifBadArg;
20  }
21 
22  edn->base_addr = base_addr;
23 
24  return kDifOk;
25 }
26 
28  if (edn == NULL) {
29  return kDifBadArg;
30  }
31 
32  bitfield_bit32_index_t alert_idx;
33  switch (alert) {
35  alert_idx = EDN_ALERT_TEST_RECOV_ALERT_BIT;
36  break;
38  alert_idx = EDN_ALERT_TEST_FATAL_ALERT_BIT;
39  break;
40  default:
41  return kDifBadArg;
42  }
43 
44  uint32_t alert_test_reg = bitfield_bit32_write(0, alert_idx, true);
45  mmio_region_write32(edn->base_addr, (ptrdiff_t)EDN_ALERT_TEST_REG_OFFSET,
46  alert_test_reg);
47 
48  return kDifOk;
49 }
50 
51 /**
52  * Get the corresponding interrupt register bit offset of the IRQ.
53  */
54 static bool edn_get_irq_bit_index(dif_edn_irq_t irq,
55  bitfield_bit32_index_t *index_out) {
56  switch (irq) {
58  *index_out = EDN_INTR_COMMON_EDN_CMD_REQ_DONE_BIT;
59  break;
61  *index_out = EDN_INTR_COMMON_EDN_FATAL_ERR_BIT;
62  break;
63  default:
64  return false;
65  }
66 
67  return true;
68 }
69 
70 static dif_irq_type_t irq_types[] = {
73 };
74 
77  dif_irq_type_t *type) {
78  if (edn == NULL || type == NULL || irq == kDifEdnIrqEdnFatalErr + 1) {
79  return kDifBadArg;
80  }
81 
82  *type = irq_types[irq];
83 
84  return kDifOk;
85 }
86 
89  dif_edn_irq_state_snapshot_t *snapshot) {
90  if (edn == NULL || snapshot == NULL) {
91  return kDifBadArg;
92  }
93 
94  *snapshot =
95  mmio_region_read32(edn->base_addr, (ptrdiff_t)EDN_INTR_STATE_REG_OFFSET);
96 
97  return kDifOk;
98 }
99 
102  const dif_edn_t *edn, dif_edn_irq_state_snapshot_t snapshot) {
103  if (edn == NULL) {
104  return kDifBadArg;
105  }
106 
107  mmio_region_write32(edn->base_addr, (ptrdiff_t)EDN_INTR_STATE_REG_OFFSET,
108  snapshot);
109 
110  return kDifOk;
111 }
112 
115  bool *is_pending) {
116  if (edn == NULL || is_pending == NULL) {
117  return kDifBadArg;
118  }
119 
121  if (!edn_get_irq_bit_index(irq, &index)) {
122  return kDifBadArg;
123  }
124 
125  uint32_t intr_state_reg =
126  mmio_region_read32(edn->base_addr, (ptrdiff_t)EDN_INTR_STATE_REG_OFFSET);
127 
128  *is_pending = bitfield_bit32_read(intr_state_reg, index);
129 
130  return kDifOk;
131 }
132 
135  if (edn == NULL) {
136  return kDifBadArg;
137  }
138 
139  // Writing to the register clears the corresponding bits (Write-one clear).
140  mmio_region_write32(edn->base_addr, (ptrdiff_t)EDN_INTR_STATE_REG_OFFSET,
141  UINT32_MAX);
142 
143  return kDifOk;
144 }
145 
148  if (edn == NULL) {
149  return kDifBadArg;
150  }
151 
153  if (!edn_get_irq_bit_index(irq, &index)) {
154  return kDifBadArg;
155  }
156 
157  // Writing to the register clears the corresponding bits (Write-one clear).
158  uint32_t intr_state_reg = bitfield_bit32_write(0, index, true);
159  mmio_region_write32(edn->base_addr, (ptrdiff_t)EDN_INTR_STATE_REG_OFFSET,
160  intr_state_reg);
161 
162  return kDifOk;
163 }
164 
167  const bool val) {
168  if (edn == NULL) {
169  return kDifBadArg;
170  }
171 
173  if (!edn_get_irq_bit_index(irq, &index)) {
174  return kDifBadArg;
175  }
176 
177  uint32_t intr_test_reg = bitfield_bit32_write(0, index, val);
178  mmio_region_write32(edn->base_addr, (ptrdiff_t)EDN_INTR_TEST_REG_OFFSET,
179  intr_test_reg);
180 
181  return kDifOk;
182 }
183 
186  dif_toggle_t *state) {
187  if (edn == NULL || state == NULL) {
188  return kDifBadArg;
189  }
190 
192  if (!edn_get_irq_bit_index(irq, &index)) {
193  return kDifBadArg;
194  }
195 
196  uint32_t intr_enable_reg =
197  mmio_region_read32(edn->base_addr, (ptrdiff_t)EDN_INTR_ENABLE_REG_OFFSET);
198 
199  bool is_enabled = bitfield_bit32_read(intr_enable_reg, index);
200  *state = is_enabled ? kDifToggleEnabled : kDifToggleDisabled;
201 
202  return kDifOk;
203 }
204 
207  dif_toggle_t state) {
208  if (edn == NULL) {
209  return kDifBadArg;
210  }
211 
213  if (!edn_get_irq_bit_index(irq, &index)) {
214  return kDifBadArg;
215  }
216 
217  uint32_t intr_enable_reg =
218  mmio_region_read32(edn->base_addr, (ptrdiff_t)EDN_INTR_ENABLE_REG_OFFSET);
219 
220  bool enable_bit = (state == kDifToggleEnabled) ? true : false;
221  intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
222  mmio_region_write32(edn->base_addr, (ptrdiff_t)EDN_INTR_ENABLE_REG_OFFSET,
223  intr_enable_reg);
224 
225  return kDifOk;
226 }
227 
230  dif_edn_irq_enable_snapshot_t *snapshot) {
231  if (edn == NULL) {
232  return kDifBadArg;
233  }
234 
235  // Pass the current interrupt state to the caller, if requested.
236  if (snapshot != NULL) {
237  *snapshot = mmio_region_read32(edn->base_addr,
238  (ptrdiff_t)EDN_INTR_ENABLE_REG_OFFSET);
239  }
240 
241  // Disable all interrupts.
242  mmio_region_write32(edn->base_addr, (ptrdiff_t)EDN_INTR_ENABLE_REG_OFFSET,
243  0u);
244 
245  return kDifOk;
246 }
247 
250  const dif_edn_t *edn, const dif_edn_irq_enable_snapshot_t *snapshot) {
251  if (edn == NULL || snapshot == NULL) {
252  return kDifBadArg;
253  }
254 
255  mmio_region_write32(edn->base_addr, (ptrdiff_t)EDN_INTR_ENABLE_REG_OFFSET,
256  *snapshot);
257 
258  return kDifOk;
259 }