19#include "sw/device/lib/dif/autogen/dif_uart_autogen.h"
21#include "hw/top/uart_regs.h"
32 uart->
dt = kDtUartCount;
47 uart->
base_addr = mmio_region_from_addr(dt_uart_primary_reg_block(dt));
55 if (uart->
dt == kDtUartCount || dt == NULL) {
72 alert_idx = UART_ALERT_TEST_FATAL_FAULT_BIT;
78 uint32_t alert_test_reg = bitfield_bit32_write(0, alert_idx,
true);
81 (ptrdiff_t)UART_ALERT_TEST_REG_OFFSET,
92 static bool uart_get_irq_bit_index(
98 *index_out = UART_INTR_COMMON_TX_WATERMARK_BIT;
101 *index_out = UART_INTR_COMMON_RX_WATERMARK_BIT;
104 *index_out = UART_INTR_COMMON_TX_DONE_BIT;
107 *index_out = UART_INTR_COMMON_RX_OVERFLOW_BIT;
110 *index_out = UART_INTR_COMMON_RX_FRAME_ERR_BIT;
113 *index_out = UART_INTR_COMMON_RX_BREAK_ERR_BIT;
116 *index_out = UART_INTR_COMMON_RX_TIMEOUT_BIT;
119 *index_out = UART_INTR_COMMON_RX_PARITY_ERR_BIT;
122 *index_out = UART_INTR_COMMON_TX_EMPTY_BIT;
157 *type = irq_types[irq];
167 if (uart == NULL || snapshot == NULL) {
171 *snapshot = mmio_region_read32(
173 (ptrdiff_t)UART_INTR_STATE_REG_OFFSET);
189 (ptrdiff_t)UART_INTR_STATE_REG_OFFSET,
202 if (uart == NULL || is_pending == NULL) {
207 if (!uart_get_irq_bit_index(irq, &index)) {
211 uint32_t intr_state_reg = mmio_region_read32(
213 (ptrdiff_t)UART_INTR_STATE_REG_OFFSET);
216 *is_pending = bitfield_bit32_read(intr_state_reg, index);
233 (ptrdiff_t)UART_INTR_STATE_REG_OFFSET,
243 dif_uart_irq_t irq) {
250 if (!uart_get_irq_bit_index(irq, &index)) {
255 uint32_t intr_state_reg = bitfield_bit32_write(0, index,
true);
258 (ptrdiff_t)UART_INTR_STATE_REG_OFFSET,
276 if (!uart_get_irq_bit_index(irq, &index)) {
280 uint32_t intr_test_reg = bitfield_bit32_write(0, index, val);
283 (ptrdiff_t)UART_INTR_TEST_REG_OFFSET,
296 if (uart == NULL || state == NULL) {
301 if (!uart_get_irq_bit_index(irq, &index)) {
305 uint32_t intr_enable_reg = mmio_region_read32(
307 (ptrdiff_t)UART_INTR_ENABLE_REG_OFFSET);
310 bool is_enabled = bitfield_bit32_read(intr_enable_reg, index);
311 *state = is_enabled ?
328 if (!uart_get_irq_bit_index(irq, &index)) {
332 uint32_t intr_enable_reg = mmio_region_read32(
334 (ptrdiff_t)UART_INTR_ENABLE_REG_OFFSET);
338 intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
341 (ptrdiff_t)UART_INTR_ENABLE_REG_OFFSET,
358 if (snapshot != NULL) {
359 *snapshot = mmio_region_read32(
361 (ptrdiff_t)UART_INTR_ENABLE_REG_OFFSET);
368 (ptrdiff_t)UART_INTR_ENABLE_REG_OFFSET,
380 if (uart == NULL || snapshot == NULL) {
386 (ptrdiff_t)UART_INTR_ENABLE_REG_OFFSET,