xref: /qemu/include/hw/char/ibex_uart.h (revision 8063396bf3459a810d24e3efd6110b8480f0de5b)
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"
32db1015e9SEduardo 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*8063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(IbexUartState, IBEX_UART)
74a7d2d98cSAlistair Francis 
75db1015e9SEduardo Habkost struct IbexUartState {
76a7d2d98cSAlistair Francis     /* <private> */
77a7d2d98cSAlistair Francis     SysBusDevice parent_obj;
78a7d2d98cSAlistair Francis 
79a7d2d98cSAlistair Francis     /* <public> */
80a7d2d98cSAlistair Francis     MemoryRegion mmio;
81a7d2d98cSAlistair Francis 
82a7d2d98cSAlistair Francis     uint8_t tx_fifo[IBEX_UART_TX_FIFO_SIZE];
83a7d2d98cSAlistair Francis     uint32_t tx_level;
84a7d2d98cSAlistair Francis 
85a7d2d98cSAlistair Francis     QEMUTimer *fifo_trigger_handle;
86a7d2d98cSAlistair Francis     uint64_t char_tx_time;
87a7d2d98cSAlistair Francis 
88a7d2d98cSAlistair Francis     uint32_t uart_intr_state;
89a7d2d98cSAlistair Francis     uint32_t uart_intr_enable;
90a7d2d98cSAlistair Francis     uint32_t uart_ctrl;
91a7d2d98cSAlistair Francis     uint32_t uart_status;
92a7d2d98cSAlistair Francis     uint32_t uart_rdata;
93a7d2d98cSAlistair Francis     uint32_t uart_fifo_ctrl;
94a7d2d98cSAlistair Francis     uint32_t uart_fifo_status;
95a7d2d98cSAlistair Francis     uint32_t uart_ovrd;
96a7d2d98cSAlistair Francis     uint32_t uart_val;
97a7d2d98cSAlistair Francis     uint32_t uart_timeout_ctrl;
98a7d2d98cSAlistair Francis 
99940aabb9SAlistair Francis     Clock *f_clk;
100940aabb9SAlistair Francis 
101a7d2d98cSAlistair Francis     CharBackend chr;
102a7d2d98cSAlistair Francis     qemu_irq tx_watermark;
103a7d2d98cSAlistair Francis     qemu_irq rx_watermark;
104a7d2d98cSAlistair Francis     qemu_irq tx_empty;
105a7d2d98cSAlistair Francis     qemu_irq rx_overflow;
106db1015e9SEduardo Habkost };
107a7d2d98cSAlistair Francis #endif /* HW_IBEX_UART_H */
108