xref: /qemu/include/hw/char/ibex_uart.h (revision 59093cc407cb044c72aa786006a07bd404eb36b9)
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"
29*59093cc4SAlistair Francis #include "hw/registerfields.h"
30a7d2d98cSAlistair Francis #include "chardev/char-fe.h"
31a7d2d98cSAlistair Francis #include "qemu/timer.h"
32a7d2d98cSAlistair Francis 
33*59093cc4SAlistair Francis REG32(INTR_STATE, 0x00)
34*59093cc4SAlistair Francis     FIELD(INTR_STATE, TX_WATERMARK, 0, 1)
35*59093cc4SAlistair Francis     FIELD(INTR_STATE, RX_WATERMARK, 1, 1)
36*59093cc4SAlistair Francis     FIELD(INTR_STATE, TX_EMPTY, 2, 1)
37*59093cc4SAlistair Francis     FIELD(INTR_STATE, RX_OVERFLOW, 3, 1)
38*59093cc4SAlistair Francis REG32(INTR_ENABLE, 0x04)
39*59093cc4SAlistair Francis REG32(INTR_TEST, 0x08)
40*59093cc4SAlistair Francis REG32(CTRL, 0x0C)
41*59093cc4SAlistair Francis     FIELD(CTRL, TX_ENABLE, 0, 1)
42*59093cc4SAlistair Francis     FIELD(CTRL, RX_ENABLE, 1, 1)
43*59093cc4SAlistair Francis     FIELD(CTRL, NF, 2, 1)
44*59093cc4SAlistair Francis     FIELD(CTRL, SLPBK, 4, 1)
45*59093cc4SAlistair Francis     FIELD(CTRL, LLPBK, 5, 1)
46*59093cc4SAlistair Francis     FIELD(CTRL, PARITY_EN, 6, 1)
47*59093cc4SAlistair Francis     FIELD(CTRL, PARITY_ODD, 7, 1)
48*59093cc4SAlistair Francis     FIELD(CTRL, RXBLVL, 8, 2)
49*59093cc4SAlistair Francis     FIELD(CTRL, NCO, 16, 16)
50*59093cc4SAlistair Francis REG32(STATUS, 0x10)
51*59093cc4SAlistair Francis     FIELD(STATUS, TXFULL, 0, 1)
52*59093cc4SAlistair Francis     FIELD(STATUS, RXFULL, 1, 1)
53*59093cc4SAlistair Francis     FIELD(STATUS, TXEMPTY, 2, 1)
54*59093cc4SAlistair Francis     FIELD(STATUS, RXIDLE, 4, 1)
55*59093cc4SAlistair Francis     FIELD(STATUS, RXEMPTY, 5, 1)
56*59093cc4SAlistair Francis REG32(RDATA, 0x14)
57*59093cc4SAlistair Francis REG32(WDATA, 0x18)
58*59093cc4SAlistair Francis REG32(FIFO_CTRL, 0x1c)
59*59093cc4SAlistair Francis     FIELD(FIFO_CTRL, RXRST, 0, 1)
60*59093cc4SAlistair Francis     FIELD(FIFO_CTRL, TXRST, 1, 1)
61*59093cc4SAlistair Francis     FIELD(FIFO_CTRL, RXILVL, 2, 3)
62*59093cc4SAlistair Francis     FIELD(FIFO_CTRL, TXILVL, 5, 2)
63*59093cc4SAlistair Francis REG32(FIFO_STATUS, 0x20)
64*59093cc4SAlistair Francis REG32(OVRD, 0x24)
65*59093cc4SAlistair Francis REG32(VAL, 0x28)
66*59093cc4SAlistair Francis REG32(TIMEOUT_CTRL, 0x2c)
67a7d2d98cSAlistair Francis 
68a7d2d98cSAlistair Francis #define IBEX_UART_TX_FIFO_SIZE 16
69940aabb9SAlistair Francis #define IBEX_UART_CLOCK 50000000 /* 50MHz clock */
70a7d2d98cSAlistair Francis 
71a7d2d98cSAlistair Francis #define TYPE_IBEX_UART "ibex-uart"
72a7d2d98cSAlistair Francis #define IBEX_UART(obj) \
73a7d2d98cSAlistair Francis     OBJECT_CHECK(IbexUartState, (obj), TYPE_IBEX_UART)
74a7d2d98cSAlistair Francis 
75a7d2d98cSAlistair Francis typedef struct {
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;
106a7d2d98cSAlistair Francis } IbexUartState;
107a7d2d98cSAlistair Francis #endif /* HW_IBEX_UART_H */
108