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 == kDifUsbdevIrqAvSetupEmpty + 1) {
129  return kDifBadArg;
130  }
131 
132  *type = irq_types[irq];
133 
134  return kDifOk;
135 }
136 
139  const dif_usbdev_t *usbdev, dif_usbdev_irq_state_snapshot_t *snapshot) {
140  if (usbdev == NULL || snapshot == NULL) {
141  return kDifBadArg;
142  }
143 
144  *snapshot = mmio_region_read32(usbdev->base_addr,
145  (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET);
146 
147  return kDifOk;
148 }
149 
152  const dif_usbdev_t *usbdev, dif_usbdev_irq_state_snapshot_t snapshot) {
153  if (usbdev == NULL) {
154  return kDifBadArg;
155  }
156 
157  mmio_region_write32(usbdev->base_addr,
158  (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET, snapshot);
159 
160  return kDifOk;
161 }
162 
165  dif_usbdev_irq_t irq, bool *is_pending) {
166  if (usbdev == NULL || is_pending == NULL) {
167  return kDifBadArg;
168  }
169 
171  if (!usbdev_get_irq_bit_index(irq, &index)) {
172  return kDifBadArg;
173  }
174 
175  uint32_t intr_state_reg = mmio_region_read32(
176  usbdev->base_addr, (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET);
177 
178  *is_pending = bitfield_bit32_read(intr_state_reg, index);
179 
180  return kDifOk;
181 }
182 
185  if (usbdev == NULL) {
186  return kDifBadArg;
187  }
188 
189  // Writing to the register clears the corresponding bits (Write-one clear).
190  mmio_region_write32(usbdev->base_addr,
191  (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET, UINT32_MAX);
192 
193  return kDifOk;
194 }
195 
198  dif_usbdev_irq_t irq) {
199  if (usbdev == NULL) {
200  return kDifBadArg;
201  }
202 
204  if (!usbdev_get_irq_bit_index(irq, &index)) {
205  return kDifBadArg;
206  }
207 
208  // Writing to the register clears the corresponding bits (Write-one clear).
209  uint32_t intr_state_reg = bitfield_bit32_write(0, index, true);
210  mmio_region_write32(usbdev->base_addr,
211  (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET, intr_state_reg);
212 
213  return kDifOk;
214 }
215 
218  dif_usbdev_irq_t irq, const bool val) {
219  if (usbdev == NULL) {
220  return kDifBadArg;
221  }
222 
224  if (!usbdev_get_irq_bit_index(irq, &index)) {
225  return kDifBadArg;
226  }
227 
228  uint32_t intr_test_reg = bitfield_bit32_write(0, index, val);
229  mmio_region_write32(usbdev->base_addr, (ptrdiff_t)USBDEV_INTR_TEST_REG_OFFSET,
230  intr_test_reg);
231 
232  return kDifOk;
233 }
234 
237  dif_usbdev_irq_t irq,
238  dif_toggle_t *state) {
239  if (usbdev == NULL || state == NULL) {
240  return kDifBadArg;
241  }
242 
244  if (!usbdev_get_irq_bit_index(irq, &index)) {
245  return kDifBadArg;
246  }
247 
248  uint32_t intr_enable_reg = mmio_region_read32(
249  usbdev->base_addr, (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET);
250 
251  bool is_enabled = bitfield_bit32_read(intr_enable_reg, index);
252  *state = is_enabled ? kDifToggleEnabled : kDifToggleDisabled;
253 
254  return kDifOk;
255 }
256 
259  dif_usbdev_irq_t irq,
260  dif_toggle_t state) {
261  if (usbdev == NULL) {
262  return kDifBadArg;
263  }
264 
266  if (!usbdev_get_irq_bit_index(irq, &index)) {
267  return kDifBadArg;
268  }
269 
270  uint32_t intr_enable_reg = mmio_region_read32(
271  usbdev->base_addr, (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET);
272 
273  bool enable_bit = (state == kDifToggleEnabled) ? true : false;
274  intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
275  mmio_region_write32(usbdev->base_addr,
276  (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET,
277  intr_enable_reg);
278 
279  return kDifOk;
280 }
281 
284  const dif_usbdev_t *usbdev, dif_usbdev_irq_enable_snapshot_t *snapshot) {
285  if (usbdev == NULL) {
286  return kDifBadArg;
287  }
288 
289  // Pass the current interrupt state to the caller, if requested.
290  if (snapshot != NULL) {
291  *snapshot = mmio_region_read32(usbdev->base_addr,
292  (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET);
293  }
294 
295  // Disable all interrupts.
296  mmio_region_write32(usbdev->base_addr,
297  (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET, 0u);
298 
299  return kDifOk;
300 }
301 
304  const dif_usbdev_t *usbdev,
305  const dif_usbdev_irq_enable_snapshot_t *snapshot) {
306  if (usbdev == NULL || snapshot == NULL) {
307  return kDifBadArg;
308  }
309 
310  mmio_region_write32(usbdev->base_addr,
311  (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET, *snapshot);
312 
313  return kDifOk;
314 }