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.