Software APIs
dif_dma_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 "dma_regs.h" // Generated.
15 
18  if (dma == NULL) {
19  return kDifBadArg;
20  }
21 
22  dma->base_addr = base_addr;
23 
24  return kDifOk;
25 }
26 
28  if (dma == NULL) {
29  return kDifBadArg;
30  }
31 
32  bitfield_bit32_index_t alert_idx;
33  switch (alert) {
35  alert_idx = DMA_ALERT_TEST_FATAL_FAULT_BIT;
36  break;
37  default:
38  return kDifBadArg;
39  }
40 
41  uint32_t alert_test_reg = bitfield_bit32_write(0, alert_idx, true);
42  mmio_region_write32(dma->base_addr, (ptrdiff_t)DMA_ALERT_TEST_REG_OFFSET,
43  alert_test_reg);
44 
45  return kDifOk;
46 }
47 
48 /**
49  * Get the corresponding interrupt register bit offset of the IRQ.
50  */
51 static bool dma_get_irq_bit_index(dif_dma_irq_t irq,
52  bitfield_bit32_index_t *index_out) {
53  switch (irq) {
54  case kDifDmaIrqDmaDone:
55  *index_out = DMA_INTR_COMMON_DMA_DONE_BIT;
56  break;
57  case kDifDmaIrqDmaError:
58  *index_out = DMA_INTR_COMMON_DMA_ERROR_BIT;
59  break;
60  default:
61  return false;
62  }
63 
64  return true;
65 }
66 
67 static dif_irq_type_t irq_types[] = {
70 };
71 
74  dif_irq_type_t *type) {
75  if (dma == NULL || type == NULL || irq == kDifDmaIrqDmaError + 1) {
76  return kDifBadArg;
77  }
78 
79  *type = irq_types[irq];
80 
81  return kDifOk;
82 }
83 
86  dif_dma_irq_state_snapshot_t *snapshot) {
87  if (dma == NULL || snapshot == NULL) {
88  return kDifBadArg;
89  }
90 
91  *snapshot =
92  mmio_region_read32(dma->base_addr, (ptrdiff_t)DMA_INTR_STATE_REG_OFFSET);
93 
94  return kDifOk;
95 }
96 
99  const dif_dma_t *dma, dif_dma_irq_state_snapshot_t snapshot) {
100  if (dma == NULL) {
101  return kDifBadArg;
102  }
103 
104  mmio_region_write32(dma->base_addr, (ptrdiff_t)DMA_INTR_STATE_REG_OFFSET,
105  snapshot);
106 
107  return kDifOk;
108 }
109 
112  bool *is_pending) {
113  if (dma == NULL || is_pending == NULL) {
114  return kDifBadArg;
115  }
116 
118  if (!dma_get_irq_bit_index(irq, &index)) {
119  return kDifBadArg;
120  }
121 
122  uint32_t intr_state_reg =
123  mmio_region_read32(dma->base_addr, (ptrdiff_t)DMA_INTR_STATE_REG_OFFSET);
124 
125  *is_pending = bitfield_bit32_read(intr_state_reg, index);
126 
127  return kDifOk;
128 }
129 
132  if (dma == NULL) {
133  return kDifBadArg;
134  }
135 
136  // Writing to the register clears the corresponding bits (Write-one clear).
137  mmio_region_write32(dma->base_addr, (ptrdiff_t)DMA_INTR_STATE_REG_OFFSET,
138  UINT32_MAX);
139 
140  return kDifOk;
141 }
142 
145  if (dma == NULL) {
146  return kDifBadArg;
147  }
148 
150  if (!dma_get_irq_bit_index(irq, &index)) {
151  return kDifBadArg;
152  }
153 
154  // Writing to the register clears the corresponding bits (Write-one clear).
155  uint32_t intr_state_reg = bitfield_bit32_write(0, index, true);
156  mmio_region_write32(dma->base_addr, (ptrdiff_t)DMA_INTR_STATE_REG_OFFSET,
157  intr_state_reg);
158 
159  return kDifOk;
160 }
161 
164  const bool val) {
165  if (dma == NULL) {
166  return kDifBadArg;
167  }
168 
170  if (!dma_get_irq_bit_index(irq, &index)) {
171  return kDifBadArg;
172  }
173 
174  uint32_t intr_test_reg = bitfield_bit32_write(0, index, val);
175  mmio_region_write32(dma->base_addr, (ptrdiff_t)DMA_INTR_TEST_REG_OFFSET,
176  intr_test_reg);
177 
178  return kDifOk;
179 }
180 
183  dif_toggle_t *state) {
184  if (dma == NULL || state == NULL) {
185  return kDifBadArg;
186  }
187 
189  if (!dma_get_irq_bit_index(irq, &index)) {
190  return kDifBadArg;
191  }
192 
193  uint32_t intr_enable_reg =
194  mmio_region_read32(dma->base_addr, (ptrdiff_t)DMA_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_toggle_t state) {
205  if (dma == NULL) {
206  return kDifBadArg;
207  }
208 
210  if (!dma_get_irq_bit_index(irq, &index)) {
211  return kDifBadArg;
212  }
213 
214  uint32_t intr_enable_reg =
215  mmio_region_read32(dma->base_addr, (ptrdiff_t)DMA_INTR_ENABLE_REG_OFFSET);
216 
217  bool enable_bit = (state == kDifToggleEnabled) ? true : false;
218  intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
219  mmio_region_write32(dma->base_addr, (ptrdiff_t)DMA_INTR_ENABLE_REG_OFFSET,
220  intr_enable_reg);
221 
222  return kDifOk;
223 }
224 
227  dif_dma_irq_enable_snapshot_t *snapshot) {
228  if (dma == NULL) {
229  return kDifBadArg;
230  }
231 
232  // Pass the current interrupt state to the caller, if requested.
233  if (snapshot != NULL) {
234  *snapshot = mmio_region_read32(dma->base_addr,
235  (ptrdiff_t)DMA_INTR_ENABLE_REG_OFFSET);
236  }
237 
238  // Disable all interrupts.
239  mmio_region_write32(dma->base_addr, (ptrdiff_t)DMA_INTR_ENABLE_REG_OFFSET,
240  0u);
241 
242  return kDifOk;
243 }
244 
247  const dif_dma_t *dma, const dif_dma_irq_enable_snapshot_t *snapshot) {
248  if (dma == NULL || snapshot == NULL) {
249  return kDifBadArg;
250  }
251 
252  mmio_region_write32(dma->base_addr, (ptrdiff_t)DMA_INTR_ENABLE_REG_OFFSET,
253  *snapshot);
254 
255  return kDifOk;
256 }