mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-22 17:03:23 +00:00
Rename the methods in the interface of VirtioTransport
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
300403e3eb
commit
3cb7f5b721
@ -410,7 +410,7 @@ impl DeviceInner {
|
|||||||
/// Flushes any cached data from the guest to the persistent storage on the host.
|
/// Flushes any cached data from the guest to the persistent storage on the host.
|
||||||
/// This will be ignored if the device doesn't support the `VIRTIO_BLK_F_FLUSH` feature.
|
/// This will be ignored if the device doesn't support the `VIRTIO_BLK_F_FLUSH` feature.
|
||||||
fn flush(&self, bio_request: BioRequest) {
|
fn flush(&self, bio_request: BioRequest) {
|
||||||
if self.transport.lock().device_features() & BlockFeatures::FLUSH.bits() == 0 {
|
if self.transport.lock().read_device_features() & BlockFeatures::FLUSH.bits() == 0 {
|
||||||
bio_request.bios().for_each(|bio| {
|
bio_request.bios().for_each(|bio| {
|
||||||
bio.complete(BioStatus::Complete);
|
bio.complete(BioStatus::Complete);
|
||||||
});
|
});
|
||||||
|
@ -51,7 +51,7 @@ impl NetworkDevice {
|
|||||||
pub fn init(mut transport: Box<dyn VirtioTransport>) -> Result<(), VirtioDeviceError> {
|
pub fn init(mut transport: Box<dyn VirtioTransport>) -> Result<(), VirtioDeviceError> {
|
||||||
let virtio_net_config = VirtioNetConfig::new(transport.as_mut());
|
let virtio_net_config = VirtioNetConfig::new(transport.as_mut());
|
||||||
let features = NetworkFeatures::from_bits_truncate(Self::negotiate_features(
|
let features = NetworkFeatures::from_bits_truncate(Self::negotiate_features(
|
||||||
transport.device_features(),
|
transport.read_device_features(),
|
||||||
));
|
));
|
||||||
debug!("virtio_net_config = {:?}", virtio_net_config);
|
debug!("virtio_net_config = {:?}", virtio_net_config);
|
||||||
debug!("features = {:?}", features);
|
debug!("features = {:?}", features);
|
||||||
|
@ -40,17 +40,19 @@ fn virtio_component_init() -> Result<(), ComponentInitError> {
|
|||||||
socket::init();
|
socket::init();
|
||||||
while let Some(mut transport) = pop_device_transport() {
|
while let Some(mut transport) = pop_device_transport() {
|
||||||
// Reset device
|
// Reset device
|
||||||
transport.set_device_status(DeviceStatus::empty()).unwrap();
|
transport
|
||||||
|
.write_device_status(DeviceStatus::empty())
|
||||||
|
.unwrap();
|
||||||
// Set to acknowledge
|
// Set to acknowledge
|
||||||
transport
|
transport
|
||||||
.set_device_status(DeviceStatus::ACKNOWLEDGE | DeviceStatus::DRIVER)
|
.write_device_status(DeviceStatus::ACKNOWLEDGE | DeviceStatus::DRIVER)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
// negotiate features
|
// negotiate features
|
||||||
negotiate_features(&mut transport);
|
negotiate_features(&mut transport);
|
||||||
|
|
||||||
// change to features ok status
|
// change to features ok status
|
||||||
transport
|
transport
|
||||||
.set_device_status(
|
.write_device_status(
|
||||||
DeviceStatus::ACKNOWLEDGE | DeviceStatus::DRIVER | DeviceStatus::FEATURES_OK,
|
DeviceStatus::ACKNOWLEDGE | DeviceStatus::DRIVER | DeviceStatus::FEATURES_OK,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@ -87,7 +89,7 @@ fn pop_device_transport() -> Option<Box<dyn VirtioTransport>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn negotiate_features(transport: &mut Box<dyn VirtioTransport>) {
|
fn negotiate_features(transport: &mut Box<dyn VirtioTransport>) {
|
||||||
let features = transport.device_features();
|
let features = transport.read_device_features();
|
||||||
let mask = ((1u64 << 24) - 1) | (((1u64 << 24) - 1) << 50);
|
let mask = ((1u64 << 24) - 1) | (((1u64 << 24) - 1) << 50);
|
||||||
let device_specified_features = features & mask;
|
let device_specified_features = features & mask;
|
||||||
let device_support_features = match transport.device_type() {
|
let device_support_features = match transport.device_type() {
|
||||||
@ -101,7 +103,7 @@ fn negotiate_features(transport: &mut Box<dyn VirtioTransport>) {
|
|||||||
let mut support_feature = Feature::from_bits_truncate(features);
|
let mut support_feature = Feature::from_bits_truncate(features);
|
||||||
support_feature.remove(Feature::RING_EVENT_IDX);
|
support_feature.remove(Feature::RING_EVENT_IDX);
|
||||||
transport
|
transport
|
||||||
.set_driver_features(features & (support_feature.bits | device_support_features))
|
.write_driver_features(features & (support_feature.bits | device_support_features))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ impl VirtioTransport for VirtioMmioTransport {
|
|||||||
self.common_device.io_mem().slice(0x100..0x200)
|
self.common_device.io_mem().slice(0x100..0x200)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn device_features(&self) -> u64 {
|
fn read_device_features(&self) -> u64 {
|
||||||
// select low
|
// select low
|
||||||
field_ptr!(&self.layout, VirtioMmioLayout, device_features_select)
|
field_ptr!(&self.layout, VirtioMmioLayout, device_features_select)
|
||||||
.write_once(&0u32)
|
.write_once(&0u32)
|
||||||
@ -219,7 +219,7 @@ impl VirtioTransport for VirtioMmioTransport {
|
|||||||
device_feature_high << 32 | device_feature_low as u64
|
device_feature_high << 32 | device_feature_low as u64
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> {
|
fn write_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> {
|
||||||
let low = features as u32;
|
let low = features as u32;
|
||||||
let high = (features >> 32) as u32;
|
let high = (features >> 32) as u32;
|
||||||
field_ptr!(&self.layout, VirtioMmioLayout, driver_features_select)
|
field_ptr!(&self.layout, VirtioMmioLayout, driver_features_select)
|
||||||
@ -237,7 +237,7 @@ impl VirtioTransport for VirtioMmioTransport {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn device_status(&self) -> DeviceStatus {
|
fn read_device_status(&self) -> DeviceStatus {
|
||||||
DeviceStatus::from_bits(
|
DeviceStatus::from_bits(
|
||||||
field_ptr!(&self.layout, VirtioMmioLayout, status)
|
field_ptr!(&self.layout, VirtioMmioLayout, status)
|
||||||
.read_once()
|
.read_once()
|
||||||
@ -246,7 +246,7 @@ impl VirtioTransport for VirtioMmioTransport {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> {
|
fn write_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> {
|
||||||
field_ptr!(&self.layout, VirtioMmioLayout, status)
|
field_ptr!(&self.layout, VirtioMmioLayout, status)
|
||||||
.write_once(&(status.bits() as u32))
|
.write_once(&(status.bits() as u32))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -24,23 +24,24 @@ pub mod pci;
|
|||||||
pub trait VirtioTransport: Sync + Send + Debug {
|
pub trait VirtioTransport: Sync + Send + Debug {
|
||||||
// ====================Device related APIs=======================
|
// ====================Device related APIs=======================
|
||||||
|
|
||||||
|
/// Get device type.
|
||||||
fn device_type(&self) -> VirtioDeviceType;
|
fn device_type(&self) -> VirtioDeviceType;
|
||||||
|
|
||||||
/// Get device features.
|
/// Get device features.
|
||||||
fn device_features(&self) -> u64;
|
fn read_device_features(&self) -> u64;
|
||||||
|
|
||||||
/// Set driver features.
|
/// Set driver features.
|
||||||
fn set_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError>;
|
fn write_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError>;
|
||||||
|
|
||||||
/// Get device status.
|
/// Get device status.
|
||||||
fn device_status(&self) -> DeviceStatus;
|
fn read_device_status(&self) -> DeviceStatus;
|
||||||
|
|
||||||
/// Set device status.
|
/// Set device status.
|
||||||
fn set_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError>;
|
fn write_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError>;
|
||||||
|
|
||||||
// Set to driver ok status
|
// Set to driver ok status
|
||||||
fn finish_init(&mut self) {
|
fn finish_init(&mut self) {
|
||||||
self.set_device_status(
|
self.write_device_status(
|
||||||
DeviceStatus::ACKNOWLEDGE
|
DeviceStatus::ACKNOWLEDGE
|
||||||
| DeviceStatus::DRIVER
|
| DeviceStatus::DRIVER
|
||||||
| DeviceStatus::FEATURES_OK
|
| DeviceStatus::FEATURES_OK
|
||||||
|
@ -132,7 +132,7 @@ impl VirtioTransport for VirtioPciTransport {
|
|||||||
memory.slice(offset..offset + length)
|
memory.slice(offset..offset + length)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn device_features(&self) -> u64 {
|
fn read_device_features(&self) -> u64 {
|
||||||
// select low
|
// select low
|
||||||
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_feature_select)
|
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_feature_select)
|
||||||
.write_once(&0u32)
|
.write_once(&0u32)
|
||||||
@ -150,7 +150,7 @@ impl VirtioTransport for VirtioPciTransport {
|
|||||||
device_feature_high << 32 | device_feature_low as u64
|
device_feature_high << 32 | device_feature_low as u64
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> {
|
fn write_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> {
|
||||||
let low = features as u32;
|
let low = features as u32;
|
||||||
let high = (features >> 32) as u32;
|
let high = (features >> 32) as u32;
|
||||||
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, driver_feature_select)
|
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, driver_feature_select)
|
||||||
@ -168,14 +168,14 @@ impl VirtioTransport for VirtioPciTransport {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn device_status(&self) -> DeviceStatus {
|
fn read_device_status(&self) -> DeviceStatus {
|
||||||
let status = field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_status)
|
let status = field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_status)
|
||||||
.read_once()
|
.read_once()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
DeviceStatus::from_bits(status).unwrap()
|
DeviceStatus::from_bits(status).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> {
|
fn write_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> {
|
||||||
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_status)
|
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_status)
|
||||||
.write_once(&(status.bits()))
|
.write_once(&(status.bits()))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
Reference in New Issue
Block a user