Software APIs
dif_usbdev_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 "usbdev_regs.h" // Generated.
15 
18  if (usbdev == NULL) {
19  return kDifBadArg;
20  }
21 
22  usbdev->base_addr = base_addr;
23 
24  return kDifOk;
25 }
26 
28  dif_usbdev_alert_t alert) {
29  if (usbdev == NULL) {
30  return kDifBadArg;
31  }
32 
33  bitfield_bit32_index_t alert_idx;
34  switch (alert) {
36  alert_idx = USBDEV_ALERT_TEST_FATAL_FAULT_BIT;
37  break;
38  default:
39  return kDifBadArg;
40  }
41 
42  uint32_t alert_test_reg = bitfield_bit32_write(0, alert_idx, true);
43  mmio_region_write32(usbdev->base_addr,
44  (ptrdiff_t)USBDEV_ALERT_TEST_REG_OFFSET, alert_test_reg);
45 
46  return kDifOk;
47 }
48 
49 /**
50  * Get the corresponding interrupt register bit offset of the IRQ.
51  */
52 static bool usbdev_get_irq_bit_index(dif_usbdev_irq_t irq,
53  bitfield_bit32_index_t *index_out) {
54  switch (irq) {
56  *index_out = USBDEV_INTR_COMMON_PKT_RECEIVED_BIT;
57  break;
59  *index_out = USBDEV_INTR_COMMON_PKT_SENT_BIT;
60  break;
62  *index_out = USBDEV_INTR_COMMON_DISCONNECTED_BIT;
63  break;
65  *index_out = USBDEV_INTR_COMMON_HOST_LOST_BIT;
66  break;
68  *index_out = USBDEV_INTR_COMMON_LINK_RESET_BIT;
69  break;
71  *index_out = USBDEV_INTR_COMMON_LINK_SUSPEND_BIT;
72  break;
74  *index_out = USBDEV_INTR_COMMON_LINK_RESUME_BIT;
75  break;
77  *index_out = USBDEV_INTR_COMMON_AV_OUT_EMPTY_BIT;
78  break;
80  *index_out = USBDEV_INTR_COMMON_RX_FULL_BIT;
81  break;
83  *index_out = USBDEV_INTR_COMMON_AV_OVERFLOW_BIT;
84  break;
86  *index_out = USBDEV_INTR_COMMON_LINK_IN_ERR_BIT;
87  break;
89  *index_out = USBDEV_INTR_COMMON_RX_CRC_ERR_BIT;
90  break;
92  *index_out = USBDEV_INTR_COMMON_RX_PID_ERR_BIT;
93  break;
95  *index_out = USBDEV_INTR_COMMON_RX_BITSTUFF_ERR_BIT;
96  break;
97  case kDifUsbdevIrqFrame:
98  *index_out = USBDEV_INTR_COMMON_FRAME_BIT;
99  break;
101  *index_out = USBDEV_INTR_COMMON_POWERED_BIT;
102  break;
104  *index_out = USBDEV_INTR_COMMON_LINK_OUT_ERR_BIT;
105  break;
107  *index_out = USBDEV_INTR_COMMON_AV_SETUP_EMPTY_BIT;
108  break;
109  default:
110  return false;
111  }
112 
113  return true;
114 }
115 
116 static dif_irq_type_t irq_types[] = {
122 };
123 
126  dif_usbdev_irq_t irq,
127  dif_irq_type_t *type) {
128  if (usbdev == NULL || type == NULL || irq < 0 ||
130  return kDifBadArg;
131  }
132 
133  *type = irq_types[irq];
134 
135  return kDifOk;
136 }
137 
140  const dif_usbdev_t *usbdev, dif_usbdev_irq_state_snapshot_t *snapshot) {
141  if (usbdev == NULL || snapshot == NULL) {
142  return kDifBadArg;
143  }
144 
145  *snapshot = mmio_region_read32(usbdev->base_addr,
146  (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET);
147 
148  return kDifOk;
149 }
150 
153  const dif_usbdev_t *usbdev, dif_usbdev_irq_state_snapshot_t snapshot) {
154  if (usbdev == NULL) {
155  return kDifBadArg;
156  }
157 
158  mmio_region_write32(usbdev->base_addr,
159  (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET, snapshot);
160 
161  return kDifOk;
162 }
163 
166  dif_usbdev_irq_t irq, bool *is_pending) {
167  if (usbdev == NULL || is_pending == NULL) {
168  return kDifBadArg;
169  }
170 
172  if (!usbdev_get_irq_bit_index(irq, &index)) {
173  return kDifBadArg;
174  }
175 
176  uint32_t intr_state_reg = mmio_region_read32(
177  usbdev->base_addr, (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET);
178 
179  *is_pending = bitfield_bit32_read(intr_state_reg, index);
180 
181  return kDifOk;
182 }
183 
186  if (usbdev == NULL) {
187  return kDifBadArg;
188  }
189 
190  // Writing to the register clears the corresponding bits (Write-one clear).
191  mmio_region_write32(usbdev->base_addr,
192  (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET, UINT32_MAX);
193 
194  return kDifOk;
195 }
196 
199  dif_usbdev_irq_t irq) {
200  if (usbdev == NULL) {
201  return kDifBadArg;
202  }
203 
205  if (!usbdev_get_irq_bit_index(irq, &index)) {
206  return kDifBadArg;
207  }
208 
209  // Writing to the register clears the corresponding bits (Write-one clear).
210  uint32_t intr_state_reg = bitfield_bit32_write(0, index, true);
211  mmio_region_write32(usbdev->base_addr,
212  (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET, intr_state_reg);
213 
214  return kDifOk;
215 }
216 
219  dif_usbdev_irq_t irq, const bool val) {
220  if (usbdev == NULL) {
221  return kDifBadArg;
222  }
223 
225  if (!usbdev_get_irq_bit_index(irq, &index)) {
226  return kDifBadArg;
227  }
228 
229  uint32_t intr_test_reg = bitfield_bit32_write(0, index, val);
230  mmio_region_write32(usbdev->base_addr, (ptrdiff_t)USBDEV_INTR_TEST_REG_OFFSET,
231  intr_test_reg);
232 
233  return kDifOk;
234 }
235 
238  dif_usbdev_irq_t irq,
239  dif_toggle_t *state) {
240  if (usbdev == NULL || state == NULL) {
241  return kDifBadArg;
242  }
243 
245  if (!usbdev_get_irq_bit_index(irq, &index)) {
246  return kDifBadArg;
247  }
248 
249  uint32_t intr_enable_reg = mmio_region_read32(
250  usbdev->base_addr, (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET);
251 
252  bool is_enabled = bitfield_bit32_read(intr_enable_reg, index);
253  *state = is_enabled ? kDifToggleEnabled : kDifToggleDisabled;
254 
255  return kDifOk;
256 }
257 
260  dif_usbdev_irq_t irq,
261  dif_toggle_t state) {
262  if (usbdev == NULL) {
263  return kDifBadArg;
264  }
265 
267  if (!usbdev_get_irq_bit_index(irq, &index)) {
268  return kDifBadArg;
269  }
270 
271  uint32_t intr_enable_reg = mmio_region_read32(
272  usbdev->base_addr, (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET);
273 
274  bool enable_bit = (state == kDifToggleEnabled) ? true : false;
275  intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
276  mmio_region_write32(usbdev->base_addr,
277  (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET,
278  intr_enable_reg);
279 
280  return kDifOk;
281 }
282 
285  const dif_usbdev_t *usbdev, dif_usbdev_irq_enable_snapshot_t *snapshot) {
286  if (usbdev == NULL) {
287  return kDifBadArg;
288  }
289 
290  // Pass the current interrupt state to the caller, if requested.
291  if (snapshot != NULL) {
292  *snapshot = mmio_region_read32(usbdev->base_addr,
293  (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET);
294  }
295 
296  // Disable all interrupts.
297  mmio_region_write32(usbdev->base_addr,
298  (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET, 0u);
299 
300  return kDifOk;
301 }
302 
305  const dif_usbdev_t *usbdev,
306  const dif_usbdev_irq_enable_snapshot_t *snapshot) {
307  if (usbdev == NULL || snapshot == NULL) {
308  return kDifBadArg;
309  }
310 
311  mmio_region_write32(usbdev->base_addr,
312  (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET, *snapshot);
313 
314  return kDifOk;
315 }