pub struct EventRing {
mem: GuestMemory,
segment_table_size: u16,
segment_table_base_address: GuestAddress,
current_segment_index: u16,
trb_count: u16,
enqueue_pointer: GuestAddress,
dequeue_pointer: GuestAddress,
producer_cycle_state: bool,
}
Expand description
Event rings are segmented circular buffers used to pass event TRBs from the xHCI device back to the guest. Each event ring is associated with a single interrupter. See section 4.9.4 of the xHCI specification for more details. This implementation is only for primary interrupter. Please review xhci spec before using it for secondary.
Fields§
§mem: GuestMemory
§segment_table_size: u16
§segment_table_base_address: GuestAddress
§current_segment_index: u16
§trb_count: u16
§enqueue_pointer: GuestAddress
§dequeue_pointer: GuestAddress
§producer_cycle_state: bool
Implementations§
source§impl EventRing
impl EventRing
sourcepub fn new(mem: GuestMemory) -> Self
pub fn new(mem: GuestMemory) -> Self
Create an empty, uninitialized event ring.
sourcepub fn add_event(&mut self, trb: Trb) -> Result<(), Error>
pub fn add_event(&mut self, trb: Trb) -> Result<(), Error>
This function implements left side of xHCI spec, Figure 4-12.
sourcepub fn set_seg_table_base_addr(
&mut self,
addr: GuestAddress
) -> Result<(), Error>
pub fn set_seg_table_base_addr( &mut self, addr: GuestAddress ) -> Result<(), Error>
Set segment table base addr.
sourcepub fn set_dequeue_pointer(&mut self, addr: GuestAddress)
pub fn set_dequeue_pointer(&mut self, addr: GuestAddress)
Set dequeue pointer.
sourcepub fn is_full(&self) -> Result<bool, Error>
pub fn is_full(&self) -> Result<bool, Error>
Event ring is considered full when there is only space for one last TRB. In this case, xHC should write an error Trb and do a bunch of handlings. See spec, figure 4-12 for more details. For now, we just check event ring full and fail (as it’s unlikely to happen).
sourcefn try_reconfigure_event_ring(&mut self) -> Result<(), Error>
fn try_reconfigure_event_ring(&mut self) -> Result<(), Error>
Try to init event ring. Will fail if seg table size/address are invalid.
fn check_inited(&self) -> Result<(), Error>
fn load_current_seg_table_entry(&mut self) -> Result<(), Error>
fn read_seg_table_entry( &self, index: u16 ) -> Result<EventRingSegmentTableEntry, Error>
fn get_seg_table_addr(&self, index: u16) -> Result<GuestAddress, Error>
Auto Trait Implementations§
impl RefUnwindSafe for EventRing
impl Send for EventRing
impl Sync for EventRing
impl Unpin for EventRing
impl UnwindSafe for EventRing
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.