1b609b7e3SBin Meng /* 2b609b7e3SBin Meng * SiFive UART interface 3b609b7e3SBin Meng * 4b609b7e3SBin Meng * Copyright (c) 2016 Stefan O'Rear 5b609b7e3SBin Meng * Copyright (c) 2017 SiFive, Inc. 6b609b7e3SBin Meng * 7b609b7e3SBin Meng * This program is free software; you can redistribute it and/or modify it 8b609b7e3SBin Meng * under the terms and conditions of the GNU General Public License, 9b609b7e3SBin Meng * version 2 or later, as published by the Free Software Foundation. 10b609b7e3SBin Meng * 11b609b7e3SBin Meng * This program is distributed in the hope it will be useful, but WITHOUT 12b609b7e3SBin Meng * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13b609b7e3SBin Meng * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14b609b7e3SBin Meng * more details. 15b609b7e3SBin Meng * 16b609b7e3SBin Meng * You should have received a copy of the GNU General Public License along with 17b609b7e3SBin Meng * this program. If not, see <http://www.gnu.org/licenses/>. 18b609b7e3SBin Meng */ 19b609b7e3SBin Meng 20b609b7e3SBin Meng #ifndef HW_SIFIVE_UART_H 21b609b7e3SBin Meng #define HW_SIFIVE_UART_H 22b609b7e3SBin Meng 23b609b7e3SBin Meng #include "chardev/char-fe.h" 246ee7ba1bSLukas Jünger #include "hw/qdev-properties.h" 25b609b7e3SBin Meng #include "hw/sysbus.h" 26ac900edeSEduardo Habkost #include "qom/object.h" 27*53c1557bSAlistair Francis #include "qemu/fifo8.h" 28b609b7e3SBin Meng 29b609b7e3SBin Meng enum { 30b609b7e3SBin Meng SIFIVE_UART_TXFIFO = 0, 31b609b7e3SBin Meng SIFIVE_UART_RXFIFO = 4, 32b609b7e3SBin Meng SIFIVE_UART_TXCTRL = 8, 33b609b7e3SBin Meng SIFIVE_UART_TXMARK = 10, 34b609b7e3SBin Meng SIFIVE_UART_RXCTRL = 12, 35b609b7e3SBin Meng SIFIVE_UART_RXMARK = 14, 36b609b7e3SBin Meng SIFIVE_UART_IE = 16, 37b609b7e3SBin Meng SIFIVE_UART_IP = 20, 38b609b7e3SBin Meng SIFIVE_UART_DIV = 24, 39b609b7e3SBin Meng SIFIVE_UART_MAX = 32 40b609b7e3SBin Meng }; 41b609b7e3SBin Meng 42b609b7e3SBin Meng enum { 43b609b7e3SBin Meng SIFIVE_UART_IE_TXWM = 1, /* Transmit watermark interrupt enable */ 44b609b7e3SBin Meng SIFIVE_UART_IE_RXWM = 2 /* Receive watermark interrupt enable */ 45b609b7e3SBin Meng }; 46b609b7e3SBin Meng 47b609b7e3SBin Meng enum { 48b609b7e3SBin Meng SIFIVE_UART_IP_TXWM = 1, /* Transmit watermark interrupt pending */ 49b609b7e3SBin Meng SIFIVE_UART_IP_RXWM = 2 /* Receive watermark interrupt pending */ 50b609b7e3SBin Meng }; 51b609b7e3SBin Meng 52*53c1557bSAlistair Francis #define SIFIVE_UART_TXFIFO_FULL 0x80000000 53*53c1557bSAlistair Francis 54b609b7e3SBin Meng #define SIFIVE_UART_GET_TXCNT(txctrl) ((txctrl >> 16) & 0x7) 55b609b7e3SBin Meng #define SIFIVE_UART_GET_RXCNT(rxctrl) ((rxctrl >> 16) & 0x7) 56*53c1557bSAlistair Francis 576ee7ba1bSLukas Jünger #define SIFIVE_UART_RX_FIFO_SIZE 8 58*53c1557bSAlistair Francis #define SIFIVE_UART_TX_FIFO_SIZE 8 59b609b7e3SBin Meng 60b609b7e3SBin Meng #define TYPE_SIFIVE_UART "riscv.sifive.uart" 616ee7ba1bSLukas Jünger OBJECT_DECLARE_SIMPLE_TYPE(SiFiveUARTState, SIFIVE_UART) 62b609b7e3SBin Meng 63ac900edeSEduardo Habkost struct SiFiveUARTState { 64b609b7e3SBin Meng /*< private >*/ 65b609b7e3SBin Meng SysBusDevice parent_obj; 66b609b7e3SBin Meng 67b609b7e3SBin Meng /*< public >*/ 68b609b7e3SBin Meng qemu_irq irq; 69b609b7e3SBin Meng MemoryRegion mmio; 70b609b7e3SBin Meng CharBackend chr; 71*53c1557bSAlistair Francis 72*53c1557bSAlistair Francis uint32_t txfifo; 73b609b7e3SBin Meng uint32_t ie; 74b609b7e3SBin Meng uint32_t ip; 75b609b7e3SBin Meng uint32_t txctrl; 76b609b7e3SBin Meng uint32_t rxctrl; 77b609b7e3SBin Meng uint32_t div; 78*53c1557bSAlistair Francis 79*53c1557bSAlistair Francis uint8_t rx_fifo[SIFIVE_UART_RX_FIFO_SIZE]; 80*53c1557bSAlistair Francis uint8_t rx_fifo_len; 81*53c1557bSAlistair Francis 82*53c1557bSAlistair Francis Fifo8 tx_fifo; 83*53c1557bSAlistair Francis 84*53c1557bSAlistair Francis QEMUTimer *fifo_trigger_handle; 85ac900edeSEduardo Habkost }; 86b609b7e3SBin Meng 87b609b7e3SBin Meng SiFiveUARTState *sifive_uart_create(MemoryRegion *address_space, hwaddr base, 88b609b7e3SBin Meng Chardev *chr, qemu_irq irq); 89b609b7e3SBin Meng 90b609b7e3SBin Meng #endif 91