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