diff options
author | Andrew Waterman <andrew@sifive.com> | 2023-01-12 07:31:26 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-12 07:31:26 -0800 |
commit | 469d9c6907d6df44afce48c422626194c9cd1e3c (patch) | |
tree | 3601e672532ee95a942000edd229591873e00dab | |
parent | d97ad271eeb8d435c7f53c05cf39d6ff9ee0be41 (diff) | |
parent | 32cf5bb54a088385f8e27174c2caf4722cf7f0de (diff) | |
download | spike-469d9c6907d6df44afce48c422626194c9cd1e3c.zip spike-469d9c6907d6df44afce48c422626194c9cd1e3c.tar.gz spike-469d9c6907d6df44afce48c422626194c9cd1e3c.tar.bz2 |
Merge pull request #1224 from riscv-software-src/uart-poll-less-often
For NS16550 UART, poll stdin less often
-rw-r--r-- | riscv/devices.h | 3 | ||||
-rw-r--r-- | riscv/ns16550.cc | 10 |
2 files changed, 12 insertions, 1 deletions
diff --git a/riscv/devices.h b/riscv/devices.h index 0030da8..040fe3e 100644 --- a/riscv/devices.h +++ b/riscv/devices.h @@ -148,6 +148,9 @@ class ns16550_t : public abstract_device_t { void update_interrupt(void); uint8_t rx_byte(void); void tx_byte(uint8_t val); + + int backoff_counter; + static const int MAX_BACKOFF = 16; }; class mmio_plugin_device_t : public abstract_device_t { diff --git a/riscv/ns16550.cc b/riscv/ns16550.cc index 7bc1d20..8d7e4de 100644 --- a/riscv/ns16550.cc +++ b/riscv/ns16550.cc @@ -71,7 +71,7 @@ ns16550_t::ns16550_t(class bus_t *bus, abstract_interrupt_controller_t *intctrl, uint32_t interrupt_id, uint32_t reg_shift, uint32_t reg_io_width) - : bus(bus), intctrl(intctrl), interrupt_id(interrupt_id), reg_shift(reg_shift), reg_io_width(reg_io_width) + : bus(bus), intctrl(intctrl), interrupt_id(interrupt_id), reg_shift(reg_shift), reg_io_width(reg_io_width), backoff_counter(0) { ier = 0; iir = UART_IIR_NO_INT; @@ -300,11 +300,19 @@ void ns16550_t::tick(void) return; } + if (backoff_counter > 0 && backoff_counter < MAX_BACKOFF) { + backoff_counter++; + return; + } + int rc = canonical_terminal_t::read(); if (rc < 0) { + backoff_counter = 1; return; } + backoff_counter = 0; + rx_queue.push((uint8_t)rc); lsr |= UART_LSR_DR; update_interrupt(); |