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