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: boolImplementations§
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 Freeze for EventRing
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.