xref: /qemu/include/hw/char/ibex_uart.h (revision 82a4ed8e5014ee814c63be33987e6783d5eacce2)
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)
65*82a4ed8eSAlexander Wagner     FIELD(FIFO_STATUS, TXLVL, 0, 5)
66*82a4ed8eSAlexander Wagner     FIELD(FIFO_STATUS, RXLVL, 16, 5)
6759093cc4SAlistair Francis REG32(OVRD, 0x24)
6859093cc4SAlistair Francis REG32(VAL, 0x28)
6959093cc4SAlistair Francis REG32(TIMEOUT_CTRL, 0x2c)
70a7d2d98cSAlistair Francis 
71a7d2d98cSAlistair Francis #define IBEX_UART_TX_FIFO_SIZE 16
72940aabb9SAlistair Francis #define IBEX_UART_CLOCK 50000000 /* 50MHz clock */
73a7d2d98cSAlistair Francis 
74a7d2d98cSAlistair Francis #define TYPE_IBEX_UART "ibex-uart"
758063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(IbexUartState, IBEX_UART)
76a7d2d98cSAlistair Francis 
77db1015e9SEduardo 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 
87*82a4ed8eSAlexander Wagner     uint32_t rx_level;
88*82a4ed8eSAlexander Wagner 
89a7d2d98cSAlistair Francis     QEMUTimer *fifo_trigger_handle;
90a7d2d98cSAlistair Francis     uint64_t char_tx_time;
91a7d2d98cSAlistair Francis 
92a7d2d98cSAlistair Francis     uint32_t uart_intr_state;
93a7d2d98cSAlistair Francis     uint32_t uart_intr_enable;
94a7d2d98cSAlistair Francis     uint32_t uart_ctrl;
95a7d2d98cSAlistair Francis     uint32_t uart_status;
96a7d2d98cSAlistair Francis     uint32_t uart_rdata;
97a7d2d98cSAlistair Francis     uint32_t uart_fifo_ctrl;
98a7d2d98cSAlistair Francis     uint32_t uart_fifo_status;
99a7d2d98cSAlistair Francis     uint32_t uart_ovrd;
100a7d2d98cSAlistair Francis     uint32_t uart_val;
101a7d2d98cSAlistair Francis     uint32_t uart_timeout_ctrl;
102a7d2d98cSAlistair Francis 
103940aabb9SAlistair Francis     Clock *f_clk;
104940aabb9SAlistair Francis 
105a7d2d98cSAlistair Francis     CharBackend chr;
106a7d2d98cSAlistair Francis     qemu_irq tx_watermark;
107a7d2d98cSAlistair Francis     qemu_irq rx_watermark;
108a7d2d98cSAlistair Francis     qemu_irq tx_empty;
109a7d2d98cSAlistair Francis     qemu_irq rx_overflow;
110db1015e9SEduardo Habkost };
111a7d2d98cSAlistair Francis #endif /* HW_IBEX_UART_H */
112