Software APIs
dif_pattgen_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/pattgen/data/pattgen.hjson -o
13// bazel-out/k8-fastbuild/bin/sw/device/lib/dif/autogen
14
15
16#include <stdint.h>
17
20
21#include "pattgen_regs.h" // Generated.
22
23
25dif_result_t dif_pattgen_init(
26 mmio_region_t base_addr,
27 dif_pattgen_t *pattgen) {
28 if (pattgen == NULL) {
29 return kDifBadArg;
30 }
31
32 pattgen->dt = kDtPattgenCount;
33 pattgen->base_addr = base_addr;
34
35 return kDifOk;
36}
37
39dif_result_t dif_pattgen_init_from_dt(
40 dt_pattgen_t dt,
41 dif_pattgen_t *pattgen) {
42 if (pattgen == NULL) {
43 return kDifBadArg;
44 }
45
46 pattgen->dt = dt;
47 pattgen->base_addr = mmio_region_from_addr(dt_pattgen_primary_reg_block(dt));
48
49 return kDifOk;
50}
51
52dif_result_t dif_pattgen_get_dt(
53 const dif_pattgen_t *pattgen,
54 dt_pattgen_t *dt) {
55 if (pattgen->dt == kDtPattgenCount || dt == NULL) {
56 return kDifBadArg;
57 }
58 *dt = pattgen->dt;
59 return kDifOk;
60}
61
62 dif_result_t dif_pattgen_alert_force(
63 const dif_pattgen_t *pattgen,
64 dif_pattgen_alert_t alert) {
65 if (pattgen == NULL) {
66 return kDifBadArg;
67 }
68
69 bitfield_bit32_index_t alert_idx;
70 switch (alert) {
72 alert_idx = PATTGEN_ALERT_TEST_FATAL_FAULT_BIT;
73 break;
74 default:
75 return kDifBadArg;
76 }
77
78 uint32_t alert_test_reg = bitfield_bit32_write(0, alert_idx, true);
79 mmio_region_write32(
80 pattgen->base_addr,
81 (ptrdiff_t)PATTGEN_ALERT_TEST_REG_OFFSET,
82 alert_test_reg);
83
84
85 return kDifOk;
86}
87
88
89 /**
90 * Get the corresponding interrupt register bit offset of the IRQ.
91 */
92 static bool pattgen_get_irq_bit_index(
93 dif_pattgen_irq_t irq,
94 bitfield_bit32_index_t *index_out) {
95
96 switch (irq) {
98 *index_out = PATTGEN_INTR_COMMON_DONE_CH0_BIT;
99 break;
101 *index_out = PATTGEN_INTR_COMMON_DONE_CH1_BIT;
102 break;
103 default:
104 return false;
105 }
106
107 return true;
108 }
109
110 static dif_irq_type_t irq_types[] = {
113 };
114
116 dif_result_t dif_pattgen_irq_get_type(
117 const dif_pattgen_t *pattgen,
118 dif_pattgen_irq_t irq,
119 dif_irq_type_t *type) {
120
121
122 if (pattgen == NULL ||
123 type == NULL ||
124 irq < kDifPattgenIrqDoneCh0 ||
125 irq > kDifPattgenIrqDoneCh1) {
126 return kDifBadArg;
127 }
128
129 *type = irq_types[irq];
130
131 return kDifOk;
132 }
133
135 dif_result_t dif_pattgen_irq_get_state(
136 const dif_pattgen_t *pattgen,
138
139 if (pattgen == NULL || snapshot == NULL) {
140 return kDifBadArg;
141 }
142
143 *snapshot = mmio_region_read32(
144 pattgen->base_addr,
145 (ptrdiff_t)PATTGEN_INTR_STATE_REG_OFFSET);
146
147
148 return kDifOk;
149 }
150
152 dif_result_t dif_pattgen_irq_acknowledge_state(
153 const dif_pattgen_t *pattgen,
155 if (pattgen == NULL) {
156 return kDifBadArg;
157 }
158
159 mmio_region_write32(
160 pattgen->base_addr,
161 (ptrdiff_t)PATTGEN_INTR_STATE_REG_OFFSET,
162 snapshot);
163
164
165 return kDifOk;
166 }
167
169 dif_result_t dif_pattgen_irq_is_pending(
170 const dif_pattgen_t *pattgen,
171 dif_pattgen_irq_t irq,
172 bool *is_pending) {
173
174 if (pattgen == NULL || is_pending == NULL) {
175 return kDifBadArg;
176 }
177
179 if (!pattgen_get_irq_bit_index(irq, &index)) {
180 return kDifBadArg;
181 }
182
183 uint32_t intr_state_reg = mmio_region_read32(
184 pattgen->base_addr,
185 (ptrdiff_t)PATTGEN_INTR_STATE_REG_OFFSET);
186
187
188 *is_pending = bitfield_bit32_read(intr_state_reg, index);
189
190 return kDifOk;
191 }
192
194 dif_result_t dif_pattgen_irq_acknowledge_all(
195 const dif_pattgen_t *pattgen
196 ) {
197
198 if (pattgen == NULL) {
199 return kDifBadArg;
200 }
201
202 // Writing to the register clears the corresponding bits (Write-one clear).
203 mmio_region_write32(
204 pattgen->base_addr,
205 (ptrdiff_t)PATTGEN_INTR_STATE_REG_OFFSET,
206 UINT32_MAX);
207
208
209 return kDifOk;
210 }
211
213 dif_result_t dif_pattgen_irq_acknowledge(
214 const dif_pattgen_t *pattgen,
215 dif_pattgen_irq_t irq) {
216
217 if (pattgen == NULL) {
218 return kDifBadArg;
219 }
220
222 if (!pattgen_get_irq_bit_index(irq, &index)) {
223 return kDifBadArg;
224 }
225
226 // Writing to the register clears the corresponding bits (Write-one clear).
227 uint32_t intr_state_reg = bitfield_bit32_write(0, index, true);
228 mmio_region_write32(
229 pattgen->base_addr,
230 (ptrdiff_t)PATTGEN_INTR_STATE_REG_OFFSET,
231 intr_state_reg);
232
233
234 return kDifOk;
235 }
236
238 dif_result_t dif_pattgen_irq_force(
239 const dif_pattgen_t *pattgen,
240 dif_pattgen_irq_t irq,
241 const bool val) {
242
243 if (pattgen == NULL) {
244 return kDifBadArg;
245 }
246
248 if (!pattgen_get_irq_bit_index(irq, &index)) {
249 return kDifBadArg;
250 }
251
252 uint32_t intr_test_reg = bitfield_bit32_write(0, index, val);
253 mmio_region_write32(
254 pattgen->base_addr,
255 (ptrdiff_t)PATTGEN_INTR_TEST_REG_OFFSET,
256 intr_test_reg);
257
258
259 return kDifOk;
260 }
261
263 dif_result_t dif_pattgen_irq_get_enabled(
264 const dif_pattgen_t *pattgen,
265 dif_pattgen_irq_t irq,
266 dif_toggle_t *state) {
267
268 if (pattgen == NULL || state == NULL) {
269 return kDifBadArg;
270 }
271
273 if (!pattgen_get_irq_bit_index(irq, &index)) {
274 return kDifBadArg;
275 }
276
277 uint32_t intr_enable_reg = mmio_region_read32(
278 pattgen->base_addr,
279 (ptrdiff_t)PATTGEN_INTR_ENABLE_REG_OFFSET);
280
281
282 bool is_enabled = bitfield_bit32_read(intr_enable_reg, index);
283 *state = is_enabled ?
285
286 return kDifOk;
287 }
288
290 dif_result_t dif_pattgen_irq_set_enabled(
291 const dif_pattgen_t *pattgen,
292 dif_pattgen_irq_t irq,
293 dif_toggle_t state) {
294
295 if (pattgen == NULL) {
296 return kDifBadArg;
297 }
298
300 if (!pattgen_get_irq_bit_index(irq, &index)) {
301 return kDifBadArg;
302 }
303
304 uint32_t intr_enable_reg = mmio_region_read32(
305 pattgen->base_addr,
306 (ptrdiff_t)PATTGEN_INTR_ENABLE_REG_OFFSET);
307
308
309 bool enable_bit = (state == kDifToggleEnabled) ? true : false;
310 intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
311 mmio_region_write32(
312 pattgen->base_addr,
313 (ptrdiff_t)PATTGEN_INTR_ENABLE_REG_OFFSET,
314 intr_enable_reg);
315
316
317 return kDifOk;
318 }
319
321 dif_result_t dif_pattgen_irq_disable_all(
322 const dif_pattgen_t *pattgen,
324
325 if (pattgen == NULL) {
326 return kDifBadArg;
327 }
328
329 // Pass the current interrupt state to the caller, if requested.
330 if (snapshot != NULL) {
331 *snapshot = mmio_region_read32(
332 pattgen->base_addr,
333 (ptrdiff_t)PATTGEN_INTR_ENABLE_REG_OFFSET);
334
335 }
336
337 // Disable all interrupts.
338 mmio_region_write32(
339 pattgen->base_addr,
340 (ptrdiff_t)PATTGEN_INTR_ENABLE_REG_OFFSET,
341 0u);
342
343
344 return kDifOk;
345 }
346
348 dif_result_t dif_pattgen_irq_restore_all(
349 const dif_pattgen_t *pattgen,
350 const dif_pattgen_irq_enable_snapshot_t *snapshot) {
351
352 if (pattgen == NULL || snapshot == NULL) {
353 return kDifBadArg;
354 }
355
356 mmio_region_write32(
357 pattgen->base_addr,
358 (ptrdiff_t)PATTGEN_INTR_ENABLE_REG_OFFSET,
359 *snapshot);
360
361
362 return kDifOk;
363 }
364