pub trait VirtIOTransport {
// Required methods
fn initialize(
&self,
driver: &dyn VirtIODeviceDriver,
queues: &'static [&'static dyn Virtqueue],
) -> Result<VirtIODeviceType, VirtIOInitializationError>;
fn queue_notify(&self, queue_id: u32);
}
Expand description
VirtIO transports.
VirtIO can be used over multiple different transports, such as over a PCI bus, an MMIO device or channel IO. This trait provides a basic abstraction over such transports.
Required Methods§
Sourcefn initialize(
&self,
driver: &dyn VirtIODeviceDriver,
queues: &'static [&'static dyn Virtqueue],
) -> Result<VirtIODeviceType, VirtIOInitializationError>
fn initialize( &self, driver: &dyn VirtIODeviceDriver, queues: &'static [&'static dyn Virtqueue], ) -> Result<VirtIODeviceType, VirtIOInitializationError>
Initialize the VirtIO transport using a device driver instance.
This function is expected to run the basic initialization routine as defined for the various VirtIO transports. As part of this routine, it shall
- negotiate device features,
- invoke the driver
pre_device_initialization
hook before anddevice_initialized
hook after announcing theDRIVER_OK
device status flag to the device, - register the passed
Virtqueue
s with the device, calling theVirtqueue::initialize
function with the registered queue ID before registration, - as well as perform any other required initialization of the VirtIO transport.
The passed Virtqueue
s are registered with a queue ID matching their
offset in the supplied slice.
If the initialization fails, it shall report this condition to the
device (setting FAILED
) if it has started initializing the device
(setting the ACKNOWLEDGE
device status flag), and return an
appropriate VirtIOInitializationError
. Otherwise, it shall return
the type of device connected to this VirtIO transport.
Sourcefn queue_notify(&self, queue_id: u32)
fn queue_notify(&self, queue_id: u32)
Notify the device of a changed Virtqueue
.
Whenever a queue has been updated (e.g. move descriptors from the used to available ring) and these updates shall be made visible to the driver, the queue can invoke this function, passing its own respective queue ID.