Use device addresses instead of physical addresses
This commit is contained in:
parent
4e2bdc65de
commit
9e2d8e9f08
|
|
@ -9,7 +9,7 @@ use log::warn;
|
|||
use ostd::{
|
||||
bus::pci::cfg_space::Bar,
|
||||
io::IoMem,
|
||||
mm::{DmaCoherent, HasPaddr, PAGE_SIZE},
|
||||
mm::{DmaCoherent, HasDaddr, PAGE_SIZE},
|
||||
sync::RwLock,
|
||||
trap::irq::IrqCallbackFunction,
|
||||
};
|
||||
|
|
@ -115,9 +115,9 @@ impl VirtioTransport for VirtioMmioTransport {
|
|||
return Err(VirtioTransportError::InvalidArgs);
|
||||
}
|
||||
|
||||
let descriptor_paddr = descriptor_ptr.paddr();
|
||||
let driver_paddr = driver_ptr.paddr();
|
||||
let device_paddr = device_ptr.paddr();
|
||||
let descriptor_daddr = descriptor_ptr.daddr();
|
||||
let driver_daddr = driver_ptr.daddr();
|
||||
let device_daddr = device_ptr.daddr();
|
||||
|
||||
field_ptr!(&self.layout, VirtioMmioLayout, queue_num)
|
||||
.write_once(&(queue_size as u32))
|
||||
|
|
@ -125,14 +125,14 @@ impl VirtioTransport for VirtioMmioTransport {
|
|||
|
||||
match self.common_device.read_version().unwrap() {
|
||||
VirtioMmioVersion::Legacy => {
|
||||
// The area should be continuous
|
||||
// The area should be continuous.
|
||||
assert_eq!(
|
||||
driver_paddr - descriptor_paddr,
|
||||
driver_daddr - descriptor_daddr,
|
||||
size_of::<Descriptor>() * queue_size as usize
|
||||
);
|
||||
// Descriptor paddr should align
|
||||
assert_eq!(descriptor_paddr % PAGE_SIZE, 0);
|
||||
let pfn = (descriptor_paddr / PAGE_SIZE) as u32;
|
||||
// Descriptor device addresses should be aligned.
|
||||
assert_eq!(descriptor_daddr % PAGE_SIZE, 0);
|
||||
let pfn = (descriptor_daddr / PAGE_SIZE) as u32;
|
||||
field_ptr!(&self.layout, VirtioMmioLayout, legacy_queue_align)
|
||||
.write_once(&(PAGE_SIZE as u32))
|
||||
.unwrap();
|
||||
|
|
@ -142,24 +142,24 @@ impl VirtioTransport for VirtioMmioTransport {
|
|||
}
|
||||
VirtioMmioVersion::Modern => {
|
||||
field_ptr!(&self.layout, VirtioMmioLayout, queue_desc_low)
|
||||
.write_once(&(descriptor_paddr as u32))
|
||||
.write_once(&(descriptor_daddr as u32))
|
||||
.unwrap();
|
||||
field_ptr!(&self.layout, VirtioMmioLayout, queue_desc_high)
|
||||
.write_once(&((descriptor_paddr >> 32) as u32))
|
||||
.write_once(&((descriptor_daddr >> 32) as u32))
|
||||
.unwrap();
|
||||
|
||||
field_ptr!(&self.layout, VirtioMmioLayout, queue_driver_low)
|
||||
.write_once(&(driver_paddr as u32))
|
||||
.write_once(&(driver_daddr as u32))
|
||||
.unwrap();
|
||||
field_ptr!(&self.layout, VirtioMmioLayout, queue_driver_high)
|
||||
.write_once(&((driver_paddr >> 32) as u32))
|
||||
.write_once(&((driver_daddr >> 32) as u32))
|
||||
.unwrap();
|
||||
|
||||
field_ptr!(&self.layout, VirtioMmioLayout, queue_device_low)
|
||||
.write_once(&(device_paddr as u32))
|
||||
.write_once(&(device_daddr as u32))
|
||||
.unwrap();
|
||||
field_ptr!(&self.layout, VirtioMmioLayout, queue_device_high)
|
||||
.write_once(&((device_paddr >> 32) as u32))
|
||||
.write_once(&((device_daddr >> 32) as u32))
|
||||
.unwrap();
|
||||
// enable queue
|
||||
field_ptr!(&self.layout, VirtioMmioLayout, queue_sel)
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ use ostd::{
|
|||
BusProbeError,
|
||||
},
|
||||
io::IoMem,
|
||||
mm::{DmaCoherent, HasPaddr},
|
||||
mm::{DmaCoherent, HasDaddr},
|
||||
trap::irq::IrqCallbackFunction,
|
||||
};
|
||||
|
||||
|
|
@ -98,13 +98,13 @@ impl VirtioTransport for VirtioPciModernTransport {
|
|||
.write_once(&queue_size)
|
||||
.unwrap();
|
||||
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, queue_desc)
|
||||
.write_once(&(descriptor_ptr.paddr() as u64))
|
||||
.write_once(&(descriptor_ptr.daddr() as u64))
|
||||
.unwrap();
|
||||
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, queue_driver)
|
||||
.write_once(&(avail_ring_ptr.paddr() as u64))
|
||||
.write_once(&(avail_ring_ptr.daddr() as u64))
|
||||
.unwrap();
|
||||
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, queue_device)
|
||||
.write_once(&(used_ring_ptr.paddr() as u64))
|
||||
.write_once(&(used_ring_ptr.daddr() as u64))
|
||||
.unwrap();
|
||||
// Enable queue
|
||||
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, queue_enable)
|
||||
|
|
|
|||
Loading…
Reference in New Issue