Software APIs
dif_soc_proxy_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
13// hw/top_darjeeling/ip/soc_proxy/data/soc_proxy.hjson -o
14// bazel-out/k8-fastbuild-ST-24cc6a2908d2/bin/sw/device/lib/dif/autogen
15
16
17#include <stdint.h>
18
21
22#include "soc_proxy_regs.h" // Generated.
23
24
26dif_result_t dif_soc_proxy_init(
27 mmio_region_t base_addr,
28 dif_soc_proxy_t *soc_proxy) {
29 if (soc_proxy == NULL) {
30 return kDifBadArg;
31 }
32
33 soc_proxy->dt = kDtSocProxyCount;
34 soc_proxy->base_addr = base_addr;
35
36 return kDifOk;
37}
38
40dif_result_t dif_soc_proxy_init_from_dt(
42 dif_soc_proxy_t *soc_proxy) {
43 if (soc_proxy == NULL) {
44 return kDifBadArg;
45 }
46
47 soc_proxy->dt = dt;
48 soc_proxy->base_addr = mmio_region_from_addr(dt_soc_proxy_primary_reg_block(dt));
49
50 return kDifOk;
51}
52
53dif_result_t dif_soc_proxy_get_dt(
54 const dif_soc_proxy_t *soc_proxy,
55 dt_soc_proxy_t *dt) {
56 if (soc_proxy->dt == kDtSocProxyCount || dt == NULL) {
57 return kDifBadArg;
58 }
59 *dt = soc_proxy->dt;
60 return kDifOk;
61}
62
63 dif_result_t dif_soc_proxy_alert_force(
64 const dif_soc_proxy_t *soc_proxy,
66 if (soc_proxy == NULL) {
67 return kDifBadArg;
68 }
69
70 bitfield_bit32_index_t alert_idx;
71 switch (alert) {
73 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_INTG_BIT;
74 break;
76 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_0_BIT;
77 break;
79 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_1_BIT;
80 break;
82 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_2_BIT;
83 break;
85 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_3_BIT;
86 break;
88 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_4_BIT;
89 break;
91 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_5_BIT;
92 break;
94 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_6_BIT;
95 break;
97 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_7_BIT;
98 break;
100 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_8_BIT;
101 break;
103 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_9_BIT;
104 break;
106 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_10_BIT;
107 break;
109 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_11_BIT;
110 break;
112 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_12_BIT;
113 break;
115 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_13_BIT;
116 break;
118 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_14_BIT;
119 break;
121 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_15_BIT;
122 break;
124 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_16_BIT;
125 break;
127 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_17_BIT;
128 break;
130 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_18_BIT;
131 break;
133 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_19_BIT;
134 break;
136 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_20_BIT;
137 break;
139 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_21_BIT;
140 break;
142 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_22_BIT;
143 break;
145 alert_idx = SOC_PROXY_ALERT_TEST_FATAL_ALERT_EXTERNAL_23_BIT;
146 break;
148 alert_idx = SOC_PROXY_ALERT_TEST_RECOV_ALERT_EXTERNAL_0_BIT;
149 break;
151 alert_idx = SOC_PROXY_ALERT_TEST_RECOV_ALERT_EXTERNAL_1_BIT;
152 break;
154 alert_idx = SOC_PROXY_ALERT_TEST_RECOV_ALERT_EXTERNAL_2_BIT;
155 break;
157 alert_idx = SOC_PROXY_ALERT_TEST_RECOV_ALERT_EXTERNAL_3_BIT;
158 break;
159 default:
160 return kDifBadArg;
161 }
162
163 uint32_t alert_test_reg = bitfield_bit32_write(0, alert_idx, true);
164 mmio_region_write32(
165 soc_proxy->base_addr,
166 (ptrdiff_t)SOC_PROXY_ALERT_TEST_REG_OFFSET,
167 alert_test_reg);
168
169
170 return kDifOk;
171}
172
173
174 /**
175 * Get the corresponding interrupt register bit offset of the IRQ.
176 */
177 static bool soc_proxy_get_irq_bit_index(
178 dif_soc_proxy_irq_t irq,
179 bitfield_bit32_index_t *index_out) {
180
181 switch (irq) {
183 *index_out = 0;
184 break;
186 *index_out = 1;
187 break;
189 *index_out = 2;
190 break;
192 *index_out = 3;
193 break;
195 *index_out = 4;
196 break;
198 *index_out = 5;
199 break;
201 *index_out = 6;
202 break;
204 *index_out = 7;
205 break;
207 *index_out = 8;
208 break;
210 *index_out = 9;
211 break;
213 *index_out = 10;
214 break;
216 *index_out = 11;
217 break;
219 *index_out = 12;
220 break;
222 *index_out = 13;
223 break;
225 *index_out = 14;
226 break;
228 *index_out = 15;
229 break;
231 *index_out = 16;
232 break;
234 *index_out = 17;
235 break;
237 *index_out = 18;
238 break;
240 *index_out = 19;
241 break;
243 *index_out = 20;
244 break;
246 *index_out = 21;
247 break;
249 *index_out = 22;
250 break;
252 *index_out = 23;
253 break;
255 *index_out = 24;
256 break;
258 *index_out = 25;
259 break;
261 *index_out = 26;
262 break;
264 *index_out = 27;
265 break;
267 *index_out = 28;
268 break;
270 *index_out = 29;
271 break;
273 *index_out = 30;
274 break;
276 *index_out = 31;
277 break;
278 default:
279 return false;
280 }
281
282 return true;
283 }
284
285 static dif_irq_type_t irq_types[] = {
287 };
288
290 dif_result_t dif_soc_proxy_irq_get_type(
291 const dif_soc_proxy_t *soc_proxy,
292 dif_soc_proxy_irq_t irq,
293 dif_irq_type_t *type) {
294
295
296 if (soc_proxy == NULL ||
297 type == NULL ||
299 irq > kDifSocProxyIrqExternal31) {
300 return kDifBadArg;
301 }
302
303 *type = irq_types[irq];
304
305 return kDifOk;
306 }
307
309 dif_result_t dif_soc_proxy_irq_get_state(
310 const dif_soc_proxy_t *soc_proxy,
312
313 if (soc_proxy == NULL || snapshot == NULL) {
314 return kDifBadArg;
315 }
316
317 *snapshot = mmio_region_read32(
318 soc_proxy->base_addr,
319 (ptrdiff_t)SOC_PROXY_INTR_STATE_REG_OFFSET);
320
321
322 return kDifOk;
323 }
324
326 dif_result_t dif_soc_proxy_irq_acknowledge_state(
327 const dif_soc_proxy_t *soc_proxy,
329 if (soc_proxy == NULL) {
330 return kDifBadArg;
331 }
332
333 mmio_region_write32(
334 soc_proxy->base_addr,
335 (ptrdiff_t)SOC_PROXY_INTR_STATE_REG_OFFSET,
336 snapshot);
337
338
339 return kDifOk;
340 }
341
343 dif_result_t dif_soc_proxy_irq_is_pending(
344 const dif_soc_proxy_t *soc_proxy,
345 dif_soc_proxy_irq_t irq,
346 bool *is_pending) {
347
348 if (soc_proxy == NULL || is_pending == NULL) {
349 return kDifBadArg;
350 }
351
353 if (!soc_proxy_get_irq_bit_index(irq, &index)) {
354 return kDifBadArg;
355 }
356
357 uint32_t intr_state_reg = mmio_region_read32(
358 soc_proxy->base_addr,
359 (ptrdiff_t)SOC_PROXY_INTR_STATE_REG_OFFSET);
360
361
362 *is_pending = bitfield_bit32_read(intr_state_reg, index);
363
364 return kDifOk;
365 }
366
368 dif_result_t dif_soc_proxy_irq_acknowledge_all(
369 const dif_soc_proxy_t *soc_proxy
370 ) {
371
372 if (soc_proxy == NULL) {
373 return kDifBadArg;
374 }
375
376 // Writing to the register clears the corresponding bits (Write-one clear).
377 mmio_region_write32(
378 soc_proxy->base_addr,
379 (ptrdiff_t)SOC_PROXY_INTR_STATE_REG_OFFSET,
380 UINT32_MAX);
381
382
383 return kDifOk;
384 }
385
387 dif_result_t dif_soc_proxy_irq_acknowledge(
388 const dif_soc_proxy_t *soc_proxy,
389 dif_soc_proxy_irq_t irq) {
390
391 if (soc_proxy == NULL) {
392 return kDifBadArg;
393 }
394
396 if (!soc_proxy_get_irq_bit_index(irq, &index)) {
397 return kDifBadArg;
398 }
399
400 // Writing to the register clears the corresponding bits (Write-one clear).
401 uint32_t intr_state_reg = bitfield_bit32_write(0, index, true);
402 mmio_region_write32(
403 soc_proxy->base_addr,
404 (ptrdiff_t)SOC_PROXY_INTR_STATE_REG_OFFSET,
405 intr_state_reg);
406
407
408 return kDifOk;
409 }
410
412 dif_result_t dif_soc_proxy_irq_force(
413 const dif_soc_proxy_t *soc_proxy,
414 dif_soc_proxy_irq_t irq,
415 const bool val) {
416
417 if (soc_proxy == NULL) {
418 return kDifBadArg;
419 }
420
422 if (!soc_proxy_get_irq_bit_index(irq, &index)) {
423 return kDifBadArg;
424 }
425
426 uint32_t intr_test_reg = bitfield_bit32_write(0, index, val);
427 mmio_region_write32(
428 soc_proxy->base_addr,
429 (ptrdiff_t)SOC_PROXY_INTR_TEST_REG_OFFSET,
430 intr_test_reg);
431
432
433 return kDifOk;
434 }
435
437 dif_result_t dif_soc_proxy_irq_get_enabled(
438 const dif_soc_proxy_t *soc_proxy,
439 dif_soc_proxy_irq_t irq,
440 dif_toggle_t *state) {
441
442 if (soc_proxy == NULL || state == NULL) {
443 return kDifBadArg;
444 }
445
447 if (!soc_proxy_get_irq_bit_index(irq, &index)) {
448 return kDifBadArg;
449 }
450
451 uint32_t intr_enable_reg = mmio_region_read32(
452 soc_proxy->base_addr,
453 (ptrdiff_t)SOC_PROXY_INTR_ENABLE_REG_OFFSET);
454
455
456 bool is_enabled = bitfield_bit32_read(intr_enable_reg, index);
457 *state = is_enabled ?
459
460 return kDifOk;
461 }
462
464 dif_result_t dif_soc_proxy_irq_set_enabled(
465 const dif_soc_proxy_t *soc_proxy,
466 dif_soc_proxy_irq_t irq,
467 dif_toggle_t state) {
468
469 if (soc_proxy == NULL) {
470 return kDifBadArg;
471 }
472
474 if (!soc_proxy_get_irq_bit_index(irq, &index)) {
475 return kDifBadArg;
476 }
477
478 uint32_t intr_enable_reg = mmio_region_read32(
479 soc_proxy->base_addr,
480 (ptrdiff_t)SOC_PROXY_INTR_ENABLE_REG_OFFSET);
481
482
483 bool enable_bit = (state == kDifToggleEnabled) ? true : false;
484 intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
485 mmio_region_write32(
486 soc_proxy->base_addr,
487 (ptrdiff_t)SOC_PROXY_INTR_ENABLE_REG_OFFSET,
488 intr_enable_reg);
489
490
491 return kDifOk;
492 }
493
495 dif_result_t dif_soc_proxy_irq_disable_all(
496 const dif_soc_proxy_t *soc_proxy,
498
499 if (soc_proxy == NULL) {
500 return kDifBadArg;
501 }
502
503 // Pass the current interrupt state to the caller, if requested.
504 if (snapshot != NULL) {
505 *snapshot = mmio_region_read32(
506 soc_proxy->base_addr,
507 (ptrdiff_t)SOC_PROXY_INTR_ENABLE_REG_OFFSET);
508
509 }
510
511 // Disable all interrupts.
512 mmio_region_write32(
513 soc_proxy->base_addr,
514 (ptrdiff_t)SOC_PROXY_INTR_ENABLE_REG_OFFSET,
515 0u);
516
517
518 return kDifOk;
519 }
520
522 dif_result_t dif_soc_proxy_irq_restore_all(
523 const dif_soc_proxy_t *soc_proxy,
524 const dif_soc_proxy_irq_enable_snapshot_t *snapshot) {
525
526 if (soc_proxy == NULL || snapshot == NULL) {
527 return kDifBadArg;
528 }
529
530 mmio_region_write32(
531 soc_proxy->base_addr,
532 (ptrdiff_t)SOC_PROXY_INTR_ENABLE_REG_OFFSET,
533 *snapshot);
534
535
536 return kDifOk;
537 }
538