mirror of
https://github.com/qemu/qemu.git
synced 2025-08-17 16:03:30 +00:00
rust/hw/char/pl011: Extract extract DR read logic into separate function
- Split `read()` DR case into `read_data_register()` Signed-off-by: Rakesh Jeyasingh <rakeshjb010@gmail.com> Link: https://lore.kernel.org/r/20250407181327.171563-2-rakeshjb010@gmail.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
d031d2fac9
commit
efc5603292
@ -190,25 +190,7 @@ pub(self) fn read(&mut self, offset: RegisterOffset) -> (bool, u32) {
|
|||||||
|
|
||||||
let mut update = false;
|
let mut update = false;
|
||||||
let result = match offset {
|
let result = match offset {
|
||||||
DR => {
|
DR => self.read_data_register(&mut update),
|
||||||
self.flags.set_receive_fifo_full(false);
|
|
||||||
let c = self.read_fifo[self.read_pos];
|
|
||||||
if self.read_count > 0 {
|
|
||||||
self.read_count -= 1;
|
|
||||||
self.read_pos = (self.read_pos + 1) & (self.fifo_depth() - 1);
|
|
||||||
}
|
|
||||||
if self.read_count == 0 {
|
|
||||||
self.flags.set_receive_fifo_empty(true);
|
|
||||||
}
|
|
||||||
if self.read_count + 1 == self.read_trigger {
|
|
||||||
self.int_level &= !Interrupt::RX.0;
|
|
||||||
}
|
|
||||||
// Update error bits.
|
|
||||||
self.receive_status_error_clear.set_from_data(c);
|
|
||||||
// Must call qemu_chr_fe_accept_input
|
|
||||||
update = true;
|
|
||||||
u32::from(c)
|
|
||||||
}
|
|
||||||
RSR => u32::from(self.receive_status_error_clear),
|
RSR => u32::from(self.receive_status_error_clear),
|
||||||
FR => u32::from(self.flags),
|
FR => u32::from(self.flags),
|
||||||
FBRD => self.fbrd,
|
FBRD => self.fbrd,
|
||||||
@ -306,6 +288,25 @@ pub(self) fn write(
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn read_data_register(&mut self, update: &mut bool) -> u32 {
|
||||||
|
self.flags.set_receive_fifo_full(false);
|
||||||
|
let c = self.read_fifo[self.read_pos];
|
||||||
|
|
||||||
|
if self.read_count > 0 {
|
||||||
|
self.read_count -= 1;
|
||||||
|
self.read_pos = (self.read_pos + 1) & (self.fifo_depth() - 1);
|
||||||
|
}
|
||||||
|
if self.read_count == 0 {
|
||||||
|
self.flags.set_receive_fifo_empty(true);
|
||||||
|
}
|
||||||
|
if self.read_count + 1 == self.read_trigger {
|
||||||
|
self.int_level &= !Interrupt::RX.0;
|
||||||
|
}
|
||||||
|
self.receive_status_error_clear.set_from_data(c);
|
||||||
|
*update = true;
|
||||||
|
u32::from(c)
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[must_use]
|
#[must_use]
|
||||||
fn loopback_tx(&mut self, value: registers::Data) -> bool {
|
fn loopback_tx(&mut self, value: registers::Data) -> bool {
|
||||||
|
Loading…
Reference in New Issue
Block a user