xref: /qemu/include/hw/char/ibex_uart.h (revision db1015e92e04835c9eb50c29625fe566d1202dbd)
1a7d2d98cSAlistair Francis /*
2a7d2d98cSAlistair Francis  * QEMU lowRISC Ibex UART device
3a7d2d98cSAlistair Francis  *
4a7d2d98cSAlistair Francis  * Copyright (c) 2020 Western Digital
5a7d2d98cSAlistair Francis  *
6a7d2d98cSAlistair Francis  * Permission is hereby granted, free of charge, to any person obtaining a copy
7a7d2d98cSAlistair Francis  * of this software and associated documentation files (the "Software"), to deal
8a7d2d98cSAlistair Francis  * in the Software without restriction, including without limitation the rights
9a7d2d98cSAlistair Francis  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10a7d2d98cSAlistair Francis  * copies of the Software, and to permit persons to whom the Software is
11a7d2d98cSAlistair Francis  * furnished to do so, subject to the following conditions:
12a7d2d98cSAlistair Francis  *
13a7d2d98cSAlistair Francis  * The above copyright notice and this permission notice shall be included in
14a7d2d98cSAlistair Francis  * all copies or substantial portions of the Software.
15a7d2d98cSAlistair Francis  *
16a7d2d98cSAlistair Francis  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17a7d2d98cSAlistair Francis  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18a7d2d98cSAlistair Francis  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19a7d2d98cSAlistair Francis  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20a7d2d98cSAlistair Francis  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21a7d2d98cSAlistair Francis  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22a7d2d98cSAlistair Francis  * THE SOFTWARE.
23a7d2d98cSAlistair Francis  */
24a7d2d98cSAlistair Francis 
25a7d2d98cSAlistair Francis #ifndef HW_IBEX_UART_H
26a7d2d98cSAlistair Francis #define HW_IBEX_UART_H
27a7d2d98cSAlistair Francis 
28a7d2d98cSAlistair Francis #include "hw/sysbus.h"
2959093cc4SAlistair Francis #include "hw/registerfields.h"
30a7d2d98cSAlistair Francis #include "chardev/char-fe.h"
31a7d2d98cSAlistair Francis #include "qemu/timer.h"
32*db1015e9SEduardo Habkost #include "qom/object.h"
33a7d2d98cSAlistair Francis 
3459093cc4SAlistair Francis REG32(INTR_STATE, 0x00)
3559093cc4SAlistair Francis     FIELD(INTR_STATE, TX_WATERMARK, 0, 1)
3659093cc4SAlistair Francis     FIELD(INTR_STATE, RX_WATERMARK, 1, 1)
3759093cc4SAlistair Francis     FIELD(INTR_STATE, TX_EMPTY, 2, 1)
3859093cc4SAlistair Francis     FIELD(INTR_STATE, RX_OVERFLOW, 3, 1)
3959093cc4SAlistair Francis REG32(INTR_ENABLE, 0x04)
4059093cc4SAlistair Francis REG32(INTR_TEST, 0x08)
4159093cc4SAlistair Francis REG32(CTRL, 0x0C)
4259093cc4SAlistair Francis     FIELD(CTRL, TX_ENABLE, 0, 1)
4359093cc4SAlistair Francis     FIELD(CTRL, RX_ENABLE, 1, 1)
4459093cc4SAlistair Francis     FIELD(CTRL, NF, 2, 1)
4559093cc4SAlistair Francis     FIELD(CTRL, SLPBK, 4, 1)
4659093cc4SAlistair Francis     FIELD(CTRL, LLPBK, 5, 1)
4759093cc4SAlistair Francis     FIELD(CTRL, PARITY_EN, 6, 1)
4859093cc4SAlistair Francis     FIELD(CTRL, PARITY_ODD, 7, 1)
4959093cc4SAlistair Francis     FIELD(CTRL, RXBLVL, 8, 2)
5059093cc4SAlistair Francis     FIELD(CTRL, NCO, 16, 16)
5159093cc4SAlistair Francis REG32(STATUS, 0x10)
5259093cc4SAlistair Francis     FIELD(STATUS, TXFULL, 0, 1)
5359093cc4SAlistair Francis     FIELD(STATUS, RXFULL, 1, 1)
5459093cc4SAlistair Francis     FIELD(STATUS, TXEMPTY, 2, 1)
5559093cc4SAlistair Francis     FIELD(STATUS, RXIDLE, 4, 1)
5659093cc4SAlistair Francis     FIELD(STATUS, RXEMPTY, 5, 1)
5759093cc4SAlistair Francis REG32(RDATA, 0x14)
5859093cc4SAlistair Francis REG32(WDATA, 0x18)
5959093cc4SAlistair Francis REG32(FIFO_CTRL, 0x1c)
6059093cc4SAlistair Francis     FIELD(FIFO_CTRL, RXRST, 0, 1)
6159093cc4SAlistair Francis     FIELD(FIFO_CTRL, TXRST, 1, 1)
6259093cc4SAlistair Francis     FIELD(FIFO_CTRL, RXILVL, 2, 3)
6359093cc4SAlistair Francis     FIELD(FIFO_CTRL, TXILVL, 5, 2)
6459093cc4SAlistair Francis REG32(FIFO_STATUS, 0x20)
6559093cc4SAlistair Francis REG32(OVRD, 0x24)
6659093cc4SAlistair Francis REG32(VAL, 0x28)
6759093cc4SAlistair Francis REG32(TIMEOUT_CTRL, 0x2c)
68a7d2d98cSAlistair Francis 
69a7d2d98cSAlistair Francis #define IBEX_UART_TX_FIFO_SIZE 16
70940aabb9SAlistair Francis #define IBEX_UART_CLOCK 50000000 /* 50MHz clock */
71a7d2d98cSAlistair Francis 
72a7d2d98cSAlistair Francis #define TYPE_IBEX_UART "ibex-uart"
73*db1015e9SEduardo Habkost typedef struct IbexUartState IbexUartState;
74a7d2d98cSAlistair Francis #define IBEX_UART(obj) \
75a7d2d98cSAlistair Francis     OBJECT_CHECK(IbexUartState, (obj), TYPE_IBEX_UART)
76a7d2d98cSAlistair Francis 
77*db1015e9SEduardo Habkost struct IbexUartState {
78a7d2d98cSAlistair Francis     /* <private> */
79a7d2d98cSAlistair Francis     SysBusDevice parent_obj;
80a7d2d98cSAlistair Francis 
81a7d2d98cSAlistair Francis     /* <public> */
82a7d2d98cSAlistair Francis     MemoryRegion mmio;
83a7d2d98cSAlistair Francis 
84a7d2d98cSAlistair Francis     uint8_t tx_fifo[IBEX_UART_TX_FIFO_SIZE];
85a7d2d98cSAlistair Francis     uint32_t tx_level;
86a7d2d98cSAlistair Francis 
87a7d2d98cSAlistair Francis     QEMUTimer *fifo_trigger_handle;
88a7d2d98cSAlistair Francis     uint64_t char_tx_time;
89a7d2d98cSAlistair Francis 
90a7d2d98cSAlistair Francis     uint32_t uart_intr_state;
91a7d2d98cSAlistair Francis     uint32_t uart_intr_enable;
92a7d2d98cSAlistair Francis     uint32_t uart_ctrl;
93a7d2d98cSAlistair Francis     uint32_t uart_status;
94a7d2d98cSAlistair Francis     uint32_t uart_rdata;
95a7d2d98cSAlistair Francis     uint32_t uart_fifo_ctrl;
96a7d2d98cSAlistair Francis     uint32_t uart_fifo_status;
97a7d2d98cSAlistair Francis     uint32_t uart_ovrd;
98a7d2d98cSAlistair Francis     uint32_t uart_val;
99a7d2d98cSAlistair Francis     uint32_t uart_timeout_ctrl;
100a7d2d98cSAlistair Francis 
101940aabb9SAlistair Francis     Clock *f_clk;
102940aabb9SAlistair Francis 
103a7d2d98cSAlistair Francis     CharBackend chr;
104a7d2d98cSAlistair Francis     qemu_irq tx_watermark;
105a7d2d98cSAlistair Francis     qemu_irq rx_watermark;
106a7d2d98cSAlistair Francis     qemu_irq tx_empty;
107a7d2d98cSAlistair Francis     qemu_irq rx_overflow;
108*db1015e9SEduardo Habkost };
109a7d2d98cSAlistair Francis #endif /* HW_IBEX_UART_H */
110