19#include "sw/device/lib/dif/autogen/dif_usbdev_autogen.h"
21#include "hw/top/usbdev_regs.h"
47 usbdev->
base_addr = mmio_region_from_addr(dt_usbdev_primary_reg_block(dt));
72 alert_idx = USBDEV_ALERT_TEST_FATAL_FAULT_BIT;
78 uint32_t alert_test_reg = bitfield_bit32_write(0, alert_idx,
true);
81 (ptrdiff_t)USBDEV_ALERT_TEST_REG_OFFSET,
92 static bool usbdev_get_irq_bit_index(
98 *index_out = USBDEV_INTR_COMMON_PKT_RECEIVED_BIT;
101 *index_out = USBDEV_INTR_COMMON_PKT_SENT_BIT;
104 *index_out = USBDEV_INTR_COMMON_DISCONNECTED_BIT;
107 *index_out = USBDEV_INTR_COMMON_HOST_LOST_BIT;
110 *index_out = USBDEV_INTR_COMMON_LINK_RESET_BIT;
113 *index_out = USBDEV_INTR_COMMON_LINK_SUSPEND_BIT;
116 *index_out = USBDEV_INTR_COMMON_LINK_RESUME_BIT;
119 *index_out = USBDEV_INTR_COMMON_AV_OUT_EMPTY_BIT;
122 *index_out = USBDEV_INTR_COMMON_RX_FULL_BIT;
125 *index_out = USBDEV_INTR_COMMON_AV_OVERFLOW_BIT;
128 *index_out = USBDEV_INTR_COMMON_LINK_IN_ERR_BIT;
131 *index_out = USBDEV_INTR_COMMON_RX_CRC_ERR_BIT;
134 *index_out = USBDEV_INTR_COMMON_RX_PID_ERR_BIT;
137 *index_out = USBDEV_INTR_COMMON_RX_BITSTUFF_ERR_BIT;
140 *index_out = USBDEV_INTR_COMMON_FRAME_BIT;
143 *index_out = USBDEV_INTR_COMMON_POWERED_BIT;
146 *index_out = USBDEV_INTR_COMMON_LINK_OUT_ERR_BIT;
149 *index_out = USBDEV_INTR_COMMON_AV_SETUP_EMPTY_BIT;
182 dif_usbdev_irq_t irq,
186 if (usbdev == NULL ||
193 *type = irq_types[irq];
203 if (usbdev == NULL || snapshot == NULL) {
207 *snapshot = mmio_region_read32(
209 (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET);
219 if (usbdev == NULL) {
225 (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET,
235 dif_usbdev_irq_t irq,
238 if (usbdev == NULL || is_pending == NULL) {
243 if (!usbdev_get_irq_bit_index(irq, &index)) {
247 uint32_t intr_state_reg = mmio_region_read32(
249 (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET);
252 *is_pending = bitfield_bit32_read(intr_state_reg, index);
262 if (usbdev == NULL) {
269 (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET,
279 dif_usbdev_irq_t irq) {
281 if (usbdev == NULL) {
286 if (!usbdev_get_irq_bit_index(irq, &index)) {
291 uint32_t intr_state_reg = bitfield_bit32_write(0, index,
true);
294 (ptrdiff_t)USBDEV_INTR_STATE_REG_OFFSET,
304 dif_usbdev_irq_t irq,
307 if (usbdev == NULL) {
312 if (!usbdev_get_irq_bit_index(irq, &index)) {
316 uint32_t intr_test_reg = bitfield_bit32_write(0, index, val);
319 (ptrdiff_t)USBDEV_INTR_TEST_REG_OFFSET,
329 dif_usbdev_irq_t irq,
332 if (usbdev == NULL || state == NULL) {
337 if (!usbdev_get_irq_bit_index(irq, &index)) {
341 uint32_t intr_enable_reg = mmio_region_read32(
343 (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET);
346 bool is_enabled = bitfield_bit32_read(intr_enable_reg, index);
347 *state = is_enabled ?
356 dif_usbdev_irq_t irq,
359 if (usbdev == NULL) {
364 if (!usbdev_get_irq_bit_index(irq, &index)) {
368 uint32_t intr_enable_reg = mmio_region_read32(
370 (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET);
374 intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
377 (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET,
389 if (usbdev == NULL) {
394 if (snapshot != NULL) {
395 *snapshot = mmio_region_read32(
397 (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET);
404 (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET,
416 if (usbdev == NULL || snapshot == NULL) {
422 (ptrdiff_t)USBDEV_INTR_ENABLE_REG_OFFSET,