Software APIs
dif_keymgr_dpe_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
6
7
8
9
10
11// THIS FILE HAS BEEN GENERATED, DO NOT EDIT MANUALLY. COMMAND:
12// util/autogen_dif.py -i hw/ip/keymgr_dpe/data/keymgr_dpe.hjson -o
13// bazel-out/k8-fastbuild-ST-24cc6a2908d2/bin/sw/device/lib/dif/autogen
14
15
16#include <stdint.h>
17
20
21#include "keymgr_dpe_regs.h" // Generated.
22
23
25dif_result_t dif_keymgr_dpe_init(
26 mmio_region_t base_addr,
27 dif_keymgr_dpe_t *keymgr_dpe) {
28 if (keymgr_dpe == NULL) {
29 return kDifBadArg;
30 }
31
32 keymgr_dpe->dt = kDtKeymgrDpeCount;
33 keymgr_dpe->base_addr = base_addr;
34
35 return kDifOk;
36}
37
39dif_result_t dif_keymgr_dpe_init_from_dt(
41 dif_keymgr_dpe_t *keymgr_dpe) {
42 if (keymgr_dpe == NULL) {
43 return kDifBadArg;
44 }
45
46 keymgr_dpe->dt = dt;
47 keymgr_dpe->base_addr = mmio_region_from_addr(dt_keymgr_dpe_primary_reg_block(dt));
48
49 return kDifOk;
50}
51
52dif_result_t dif_keymgr_dpe_get_dt(
53 const dif_keymgr_dpe_t *keymgr_dpe,
54 dt_keymgr_dpe_t *dt) {
55 if (keymgr_dpe->dt == kDtKeymgrDpeCount || dt == NULL) {
56 return kDifBadArg;
57 }
58 *dt = keymgr_dpe->dt;
59 return kDifOk;
60}
61
62 dif_result_t dif_keymgr_dpe_alert_force(
63 const dif_keymgr_dpe_t *keymgr_dpe,
65 if (keymgr_dpe == NULL) {
66 return kDifBadArg;
67 }
68
69 bitfield_bit32_index_t alert_idx;
70 switch (alert) {
72 alert_idx = KEYMGR_DPE_ALERT_TEST_RECOV_OPERATION_ERR_BIT;
73 break;
75 alert_idx = KEYMGR_DPE_ALERT_TEST_FATAL_FAULT_ERR_BIT;
76 break;
77 default:
78 return kDifBadArg;
79 }
80
81 uint32_t alert_test_reg = bitfield_bit32_write(0, alert_idx, true);
82 mmio_region_write32(
83 keymgr_dpe->base_addr,
84 (ptrdiff_t)KEYMGR_DPE_ALERT_TEST_REG_OFFSET,
85 alert_test_reg);
86
87
88 return kDifOk;
89}
90
91
92 /**
93 * Get the corresponding interrupt register bit offset of the IRQ.
94 */
95 static bool keymgr_dpe_get_irq_bit_index(
96 dif_keymgr_dpe_irq_t irq,
97 bitfield_bit32_index_t *index_out) {
98
99 switch (irq) {
101 *index_out = KEYMGR_DPE_INTR_COMMON_OP_DONE_BIT;
102 break;
103 default:
104 return false;
105 }
106
107 return true;
108 }
109
110 static dif_irq_type_t irq_types[] = {
112 };
113
115 dif_result_t dif_keymgr_dpe_irq_get_type(
116 const dif_keymgr_dpe_t *keymgr_dpe,
117 dif_keymgr_dpe_irq_t irq,
118 dif_irq_type_t *type) {
119
120
121 if (keymgr_dpe == NULL ||
122 type == NULL ||
125 return kDifBadArg;
126 }
127
128 *type = irq_types[irq];
129
130 return kDifOk;
131 }
132
134 dif_result_t dif_keymgr_dpe_irq_get_state(
135 const dif_keymgr_dpe_t *keymgr_dpe,
137
138 if (keymgr_dpe == NULL || snapshot == NULL) {
139 return kDifBadArg;
140 }
141
142 *snapshot = mmio_region_read32(
143 keymgr_dpe->base_addr,
144 (ptrdiff_t)KEYMGR_DPE_INTR_STATE_REG_OFFSET);
145
146
147 return kDifOk;
148 }
149
151 dif_result_t dif_keymgr_dpe_irq_acknowledge_state(
152 const dif_keymgr_dpe_t *keymgr_dpe,
154 if (keymgr_dpe == NULL) {
155 return kDifBadArg;
156 }
157
158 mmio_region_write32(
159 keymgr_dpe->base_addr,
160 (ptrdiff_t)KEYMGR_DPE_INTR_STATE_REG_OFFSET,
161 snapshot);
162
163
164 return kDifOk;
165 }
166
168 dif_result_t dif_keymgr_dpe_irq_is_pending(
169 const dif_keymgr_dpe_t *keymgr_dpe,
170 dif_keymgr_dpe_irq_t irq,
171 bool *is_pending) {
172
173 if (keymgr_dpe == NULL || is_pending == NULL) {
174 return kDifBadArg;
175 }
176
178 if (!keymgr_dpe_get_irq_bit_index(irq, &index)) {
179 return kDifBadArg;
180 }
181
182 uint32_t intr_state_reg = mmio_region_read32(
183 keymgr_dpe->base_addr,
184 (ptrdiff_t)KEYMGR_DPE_INTR_STATE_REG_OFFSET);
185
186
187 *is_pending = bitfield_bit32_read(intr_state_reg, index);
188
189 return kDifOk;
190 }
191
193 dif_result_t dif_keymgr_dpe_irq_acknowledge_all(
194 const dif_keymgr_dpe_t *keymgr_dpe
195 ) {
196
197 if (keymgr_dpe == NULL) {
198 return kDifBadArg;
199 }
200
201 // Writing to the register clears the corresponding bits (Write-one clear).
202 mmio_region_write32(
203 keymgr_dpe->base_addr,
204 (ptrdiff_t)KEYMGR_DPE_INTR_STATE_REG_OFFSET,
205 UINT32_MAX);
206
207
208 return kDifOk;
209 }
210
212 dif_result_t dif_keymgr_dpe_irq_acknowledge(
213 const dif_keymgr_dpe_t *keymgr_dpe,
214 dif_keymgr_dpe_irq_t irq) {
215
216 if (keymgr_dpe == NULL) {
217 return kDifBadArg;
218 }
219
221 if (!keymgr_dpe_get_irq_bit_index(irq, &index)) {
222 return kDifBadArg;
223 }
224
225 // Writing to the register clears the corresponding bits (Write-one clear).
226 uint32_t intr_state_reg = bitfield_bit32_write(0, index, true);
227 mmio_region_write32(
228 keymgr_dpe->base_addr,
229 (ptrdiff_t)KEYMGR_DPE_INTR_STATE_REG_OFFSET,
230 intr_state_reg);
231
232
233 return kDifOk;
234 }
235
237 dif_result_t dif_keymgr_dpe_irq_force(
238 const dif_keymgr_dpe_t *keymgr_dpe,
239 dif_keymgr_dpe_irq_t irq,
240 const bool val) {
241
242 if (keymgr_dpe == NULL) {
243 return kDifBadArg;
244 }
245
247 if (!keymgr_dpe_get_irq_bit_index(irq, &index)) {
248 return kDifBadArg;
249 }
250
251 uint32_t intr_test_reg = bitfield_bit32_write(0, index, val);
252 mmio_region_write32(
253 keymgr_dpe->base_addr,
254 (ptrdiff_t)KEYMGR_DPE_INTR_TEST_REG_OFFSET,
255 intr_test_reg);
256
257
258 return kDifOk;
259 }
260
262 dif_result_t dif_keymgr_dpe_irq_get_enabled(
263 const dif_keymgr_dpe_t *keymgr_dpe,
264 dif_keymgr_dpe_irq_t irq,
265 dif_toggle_t *state) {
266
267 if (keymgr_dpe == NULL || state == NULL) {
268 return kDifBadArg;
269 }
270
272 if (!keymgr_dpe_get_irq_bit_index(irq, &index)) {
273 return kDifBadArg;
274 }
275
276 uint32_t intr_enable_reg = mmio_region_read32(
277 keymgr_dpe->base_addr,
278 (ptrdiff_t)KEYMGR_DPE_INTR_ENABLE_REG_OFFSET);
279
280
281 bool is_enabled = bitfield_bit32_read(intr_enable_reg, index);
282 *state = is_enabled ?
284
285 return kDifOk;
286 }
287
289 dif_result_t dif_keymgr_dpe_irq_set_enabled(
290 const dif_keymgr_dpe_t *keymgr_dpe,
291 dif_keymgr_dpe_irq_t irq,
292 dif_toggle_t state) {
293
294 if (keymgr_dpe == NULL) {
295 return kDifBadArg;
296 }
297
299 if (!keymgr_dpe_get_irq_bit_index(irq, &index)) {
300 return kDifBadArg;
301 }
302
303 uint32_t intr_enable_reg = mmio_region_read32(
304 keymgr_dpe->base_addr,
305 (ptrdiff_t)KEYMGR_DPE_INTR_ENABLE_REG_OFFSET);
306
307
308 bool enable_bit = (state == kDifToggleEnabled) ? true : false;
309 intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
310 mmio_region_write32(
311 keymgr_dpe->base_addr,
312 (ptrdiff_t)KEYMGR_DPE_INTR_ENABLE_REG_OFFSET,
313 intr_enable_reg);
314
315
316 return kDifOk;
317 }
318
320 dif_result_t dif_keymgr_dpe_irq_disable_all(
321 const dif_keymgr_dpe_t *keymgr_dpe,
323
324 if (keymgr_dpe == NULL) {
325 return kDifBadArg;
326 }
327
328 // Pass the current interrupt state to the caller, if requested.
329 if (snapshot != NULL) {
330 *snapshot = mmio_region_read32(
331 keymgr_dpe->base_addr,
332 (ptrdiff_t)KEYMGR_DPE_INTR_ENABLE_REG_OFFSET);
333
334 }
335
336 // Disable all interrupts.
337 mmio_region_write32(
338 keymgr_dpe->base_addr,
339 (ptrdiff_t)KEYMGR_DPE_INTR_ENABLE_REG_OFFSET,
340 0u);
341
342
343 return kDifOk;
344 }
345
347 dif_result_t dif_keymgr_dpe_irq_restore_all(
348 const dif_keymgr_dpe_t *keymgr_dpe,
349 const dif_keymgr_dpe_irq_enable_snapshot_t *snapshot) {
350
351 if (keymgr_dpe == NULL || snapshot == NULL) {
352 return kDifBadArg;
353 }
354
355 mmio_region_write32(
356 keymgr_dpe->base_addr,
357 (ptrdiff_t)KEYMGR_DPE_INTR_ENABLE_REG_OFFSET,
358 *snapshot);
359
360
361 return kDifOk;
362 }
363