|
@@ -1,4 +1,5 @@
|
|
|
-use super::{_port, hba::HbaCmdTable, virt_2_phys};
|
|
|
+use super::{_port, hba::HbaCmdTable};
|
|
|
+use crate::arch::MMArch;
|
|
|
use crate::driver::base::block::block_device::{BlockDevice, BlockId};
|
|
|
use crate::driver::base::block::disk_info::Partition;
|
|
|
use crate::driver::base::class::Class;
|
|
@@ -19,7 +20,7 @@ use crate::driver::disk::ahci::hba::{
|
|
|
};
|
|
|
use crate::libs::rwlock::{RwLockReadGuard, RwLockWriteGuard};
|
|
|
use crate::libs::spinlock::SpinLock;
|
|
|
-use crate::mm::{phys_2_virt, verify_area, VirtAddr};
|
|
|
+use crate::mm::{verify_area, MemoryManagementArch, PhysAddr, VirtAddr};
|
|
|
use log::error;
|
|
|
use system_error::SystemError;
|
|
|
|
|
@@ -86,9 +87,11 @@ impl AhciDisk {
|
|
|
|
|
|
#[allow(unused_unsafe)]
|
|
|
let cmdheader: &mut HbaCmdHeader = unsafe {
|
|
|
- (phys_2_virt(
|
|
|
+ (MMArch::phys_2_virt(PhysAddr::new(
|
|
|
volatile_read!(port.clb) as usize + slot as usize * size_of::<HbaCmdHeader>(),
|
|
|
- ) as *mut HbaCmdHeader)
|
|
|
+ ))
|
|
|
+ .unwrap()
|
|
|
+ .data() as *mut HbaCmdHeader)
|
|
|
.as_mut()
|
|
|
.unwrap()
|
|
|
};
|
|
@@ -118,7 +121,9 @@ impl AhciDisk {
|
|
|
|
|
|
#[allow(unused_unsafe)]
|
|
|
let cmdtbl = unsafe {
|
|
|
- (phys_2_virt(volatile_read!(cmdheader.ctba) as usize) as *mut HbaCmdTable)
|
|
|
+ (MMArch::phys_2_virt(PhysAddr::new(volatile_read!(cmdheader.ctba) as usize))
|
|
|
+ .unwrap()
|
|
|
+ .data() as *mut HbaCmdTable)
|
|
|
.as_mut()
|
|
|
.unwrap() // 必须使用 as_mut ,得到的才是原来的变量
|
|
|
};
|
|
@@ -132,7 +137,10 @@ impl AhciDisk {
|
|
|
|
|
|
// 8K bytes (16 sectors) per PRDT
|
|
|
for i in 0..((volatile_read!(cmdheader.prdtl) - 1) as usize) {
|
|
|
- volatile_write!(cmdtbl.prdt_entry[i].dba, virt_2_phys(buf_ptr) as u64);
|
|
|
+ volatile_write!(
|
|
|
+ cmdtbl.prdt_entry[i].dba,
|
|
|
+ MMArch::virt_2_phys(VirtAddr::new(buf_ptr)).unwrap().data() as u64
|
|
|
+ );
|
|
|
cmdtbl.prdt_entry[i].dbc = 8 * 1024 - 1;
|
|
|
volatile_set_bit!(cmdtbl.prdt_entry[i].dbc, 1 << 31, true); // 允许中断 prdt_entry.i
|
|
|
buf_ptr += 8 * 1024;
|
|
@@ -141,7 +149,10 @@ impl AhciDisk {
|
|
|
|
|
|
// Last entry
|
|
|
let las = (volatile_read!(cmdheader.prdtl) - 1) as usize;
|
|
|
- volatile_write!(cmdtbl.prdt_entry[las].dba, virt_2_phys(buf_ptr) as u64);
|
|
|
+ volatile_write!(
|
|
|
+ cmdtbl.prdt_entry[las].dba,
|
|
|
+ MMArch::virt_2_phys(VirtAddr::new(buf_ptr)).unwrap().data() as u64
|
|
|
+ );
|
|
|
cmdtbl.prdt_entry[las].dbc = ((tmp_count << 9) - 1) as u32; // 数据长度
|
|
|
|
|
|
volatile_set_bit!(cmdtbl.prdt_entry[las].dbc, 1 << 31, true); // 允许中断
|
|
@@ -233,9 +244,11 @@ impl AhciDisk {
|
|
|
compiler_fence(Ordering::SeqCst);
|
|
|
#[allow(unused_unsafe)]
|
|
|
let cmdheader: &mut HbaCmdHeader = unsafe {
|
|
|
- (phys_2_virt(
|
|
|
+ (MMArch::phys_2_virt(PhysAddr::new(
|
|
|
volatile_read!(port.clb) as usize + slot as usize * size_of::<HbaCmdHeader>(),
|
|
|
- ) as *mut HbaCmdHeader)
|
|
|
+ ))
|
|
|
+ .unwrap()
|
|
|
+ .data() as *mut HbaCmdHeader)
|
|
|
.as_mut()
|
|
|
.unwrap()
|
|
|
};
|
|
@@ -272,7 +285,9 @@ impl AhciDisk {
|
|
|
|
|
|
#[allow(unused_unsafe)]
|
|
|
let cmdtbl = unsafe {
|
|
|
- (phys_2_virt(volatile_read!(cmdheader.ctba) as usize) as *mut HbaCmdTable)
|
|
|
+ (MMArch::phys_2_virt(PhysAddr::new(volatile_read!(cmdheader.ctba) as usize))
|
|
|
+ .unwrap()
|
|
|
+ .data() as *mut HbaCmdTable)
|
|
|
.as_mut()
|
|
|
.unwrap()
|
|
|
};
|
|
@@ -286,7 +301,10 @@ impl AhciDisk {
|
|
|
|
|
|
// 8K bytes (16 sectors) per PRDT
|
|
|
for i in 0..((volatile_read!(cmdheader.prdtl) - 1) as usize) {
|
|
|
- volatile_write!(cmdtbl.prdt_entry[i].dba, virt_2_phys(buf_ptr) as u64);
|
|
|
+ volatile_write!(
|
|
|
+ cmdtbl.prdt_entry[i].dba,
|
|
|
+ MMArch::virt_2_phys(VirtAddr::new(buf_ptr)).unwrap().data() as u64
|
|
|
+ );
|
|
|
volatile_write_bit!(cmdtbl.prdt_entry[i].dbc, (1 << 22) - 1, 8 * 1024 - 1); // 数据长度
|
|
|
volatile_set_bit!(cmdtbl.prdt_entry[i].dbc, 1 << 31, true); // 允许中断
|
|
|
buf_ptr += 8 * 1024;
|
|
@@ -295,7 +313,10 @@ impl AhciDisk {
|
|
|
|
|
|
// Last entry
|
|
|
let las = (volatile_read!(cmdheader.prdtl) - 1) as usize;
|
|
|
- volatile_write!(cmdtbl.prdt_entry[las].dba, virt_2_phys(buf_ptr) as u64);
|
|
|
+ volatile_write!(
|
|
|
+ cmdtbl.prdt_entry[las].dba,
|
|
|
+ MMArch::virt_2_phys(VirtAddr::new(buf_ptr)).unwrap().data() as u64
|
|
|
+ );
|
|
|
volatile_set_bit!(cmdtbl.prdt_entry[las].dbc, 1 << 31, true); // 允许中断
|
|
|
volatile_write_bit!(
|
|
|
cmdtbl.prdt_entry[las].dbc,
|