1004e86ffSlogin use super::{_port, hba::HbaCmdTable, virt_2_phys}; 2b087521eSChiichen use crate::driver::base::block::block_device::{BlockDevice, BlockId}; 3b087521eSChiichen use crate::driver::base::block::disk_info::Partition; 408a2ee40SLoGin use crate::driver::base::class::Class; 506d5e247SLoGin use crate::driver::base::device::bus::Bus; 6ad1d649eSGnoCiYeH 7a03c4f9dSLoGin use crate::driver::base::device::driver::Driver; 806d5e247SLoGin use crate::driver::base::device::{Device, DeviceType, IdTable}; 906d5e247SLoGin use crate::driver::base::kobject::{KObjType, KObject, KObjectState}; 1006d5e247SLoGin use crate::driver::base::kset::KSet; 11004e86ffSlogin use crate::driver::disk::ahci::HBA_PxIS_TFES; 12a03c4f9dSLoGin 1306d5e247SLoGin use crate::filesystem::kernfs::KernFSInode; 14004e86ffSlogin use crate::filesystem::mbr::MbrDiskPartionTable; 15004e86ffSlogin 1606d5e247SLoGin use crate::libs::rwlock::{RwLockReadGuard, RwLockWriteGuard}; 17*731bc2b3SLoGin use crate::libs::spinlock::SpinLock; 184fda81ceSLoGin use crate::mm::{phys_2_virt, verify_area, VirtAddr}; 19004e86ffSlogin use crate::{ 20004e86ffSlogin driver::disk::ahci::hba::{ 21004e86ffSlogin FisRegH2D, FisType, HbaCmdHeader, ATA_CMD_READ_DMA_EXT, ATA_CMD_WRITE_DMA_EXT, 22004e86ffSlogin ATA_DEV_BUSY, ATA_DEV_DRQ, 23004e86ffSlogin }, 24004e86ffSlogin kerror, 25004e86ffSlogin }; 2691e9d4abSLoGin use system_error::SystemError; 27004e86ffSlogin 28004e86ffSlogin use alloc::sync::Weak; 29004e86ffSlogin use alloc::{string::String, sync::Arc, vec::Vec}; 30004e86ffSlogin 31004e86ffSlogin use core::fmt::Debug; 327ae679ddSLoGin use core::sync::atomic::{compiler_fence, Ordering}; 33004e86ffSlogin use core::{mem::size_of, ptr::write_bytes}; 34004e86ffSlogin 35004e86ffSlogin /// @brief: 只支持MBR分区格式的磁盘结构体 36004e86ffSlogin pub struct AhciDisk { 37004e86ffSlogin pub name: String, 38004e86ffSlogin pub flags: u16, // 磁盘的状态flags 39004e86ffSlogin pub partitions: Vec<Arc<Partition>>, // 磁盘分区数组 40004e86ffSlogin // port: &'static mut HbaPort, // 控制硬盘的端口 41004e86ffSlogin pub ctrl_num: u8, 42004e86ffSlogin pub port_num: u8, 43004e86ffSlogin /// 指向LockAhciDisk的弱引用 44004e86ffSlogin self_ref: Weak<LockedAhciDisk>, 45004e86ffSlogin } 46004e86ffSlogin 47004e86ffSlogin /// @brief: 带锁的AhciDisk 48004e86ffSlogin #[derive(Debug)] 49004e86ffSlogin pub struct LockedAhciDisk(pub SpinLock<AhciDisk>); 50004e86ffSlogin /// 函数实现 51004e86ffSlogin impl Debug for AhciDisk { 52004e86ffSlogin fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 53004e86ffSlogin write!( 54004e86ffSlogin f, 55004e86ffSlogin "{{ name: {}, flags: {}, part_s: {:?} }}", 56004e86ffSlogin self.name, self.flags, self.partitions 57004e86ffSlogin )?; 58004e86ffSlogin return Ok(()); 59004e86ffSlogin } 60004e86ffSlogin } 61004e86ffSlogin 62004e86ffSlogin impl AhciDisk { 63004e86ffSlogin fn read_at( 64004e86ffSlogin &self, 65b087521eSChiichen lba_id_start: BlockId, // 起始lba编号 66004e86ffSlogin count: usize, // 读取lba的数量 67004e86ffSlogin buf: &mut [u8], 68676b8ef6SMork ) -> Result<usize, SystemError> { 697ae679ddSLoGin assert!((buf.len() & 511) == 0); 70*731bc2b3SLoGin compiler_fence(Ordering::SeqCst); 71004e86ffSlogin let check_length = ((count - 1) >> 4) + 1; // prdt length 72b5b571e0SLoGin if count * 512 > buf.len() || check_length > 8_usize { 73004e86ffSlogin kerror!("ahci read: e2big"); 74004e86ffSlogin // 不可能的操作 75676b8ef6SMork return Err(SystemError::E2BIG); 76004e86ffSlogin } else if count == 0 { 77004e86ffSlogin return Ok(0); 78004e86ffSlogin } 79004e86ffSlogin 80004e86ffSlogin let port = _port(self.ctrl_num, self.port_num); 81004e86ffSlogin volatile_write!(port.is, u32::MAX); // Clear pending interrupt bits 82004e86ffSlogin 83004e86ffSlogin let slot = port.find_cmdslot().unwrap_or(u32::MAX); 84004e86ffSlogin 85004e86ffSlogin if slot == u32::MAX { 86676b8ef6SMork return Err(SystemError::EIO); 87004e86ffSlogin } 88004e86ffSlogin 89004e86ffSlogin #[allow(unused_unsafe)] 90004e86ffSlogin let cmdheader: &mut HbaCmdHeader = unsafe { 91004e86ffSlogin (phys_2_virt( 92b5b571e0SLoGin volatile_read!(port.clb) as usize + slot as usize * size_of::<HbaCmdHeader>(), 93004e86ffSlogin ) as *mut HbaCmdHeader) 94004e86ffSlogin .as_mut() 95004e86ffSlogin .unwrap() 96004e86ffSlogin }; 97004e86ffSlogin 987ae679ddSLoGin cmdheader.cfl = (size_of::<FisRegH2D>() / size_of::<u32>()) as u8; 99004e86ffSlogin 100004e86ffSlogin volatile_set_bit!(cmdheader.cfl, 1 << 6, false); // Read/Write bit : Read from device 101004e86ffSlogin volatile_write!(cmdheader.prdtl, check_length as u16); // PRDT entries count 102004e86ffSlogin 103004e86ffSlogin // 设置数据存放地址 104004e86ffSlogin let mut buf_ptr = buf as *mut [u8] as *mut usize as usize; 105660a04ceSlogin 106660a04ceSlogin // 由于目前的内存管理机制无法把用户空间的内存地址转换为物理地址,所以只能先把数据拷贝到内核空间 107660a04ceSlogin // TODO:在内存管理重构后,可以直接使用用户空间的内存地址 1084fda81ceSLoGin 109b5b571e0SLoGin let user_buf = verify_area(VirtAddr::new(buf_ptr), buf.len()).is_ok(); 110660a04ceSlogin let mut kbuf = if user_buf { 111b5b571e0SLoGin let x: Vec<u8> = vec![0; buf.len()]; 112660a04ceSlogin Some(x) 113660a04ceSlogin } else { 114660a04ceSlogin None 115660a04ceSlogin }; 116660a04ceSlogin 117660a04ceSlogin if kbuf.is_some() { 118660a04ceSlogin buf_ptr = kbuf.as_mut().unwrap().as_mut_ptr() as usize; 119660a04ceSlogin } 120660a04ceSlogin 121004e86ffSlogin #[allow(unused_unsafe)] 122004e86ffSlogin let cmdtbl = unsafe { 123004e86ffSlogin (phys_2_virt(volatile_read!(cmdheader.ctba) as usize) as *mut HbaCmdTable) 124004e86ffSlogin .as_mut() 125004e86ffSlogin .unwrap() // 必须使用 as_mut ,得到的才是原来的变量 126004e86ffSlogin }; 127004e86ffSlogin let mut tmp_count = count; 128004e86ffSlogin 129004e86ffSlogin unsafe { 130004e86ffSlogin // 清空整个table的旧数据 131004e86ffSlogin write_bytes(cmdtbl, 0, 1); 132004e86ffSlogin } 1337ae679ddSLoGin // kdebug!("cmdheader.prdtl={}", volatile_read!(cmdheader.prdtl)); 134004e86ffSlogin 135004e86ffSlogin // 8K bytes (16 sectors) per PRDT 136004e86ffSlogin for i in 0..((volatile_read!(cmdheader.prdtl) - 1) as usize) { 137004e86ffSlogin volatile_write!(cmdtbl.prdt_entry[i].dba, virt_2_phys(buf_ptr) as u64); 1387ae679ddSLoGin cmdtbl.prdt_entry[i].dbc = 8 * 1024 - 1; 139004e86ffSlogin volatile_set_bit!(cmdtbl.prdt_entry[i].dbc, 1 << 31, true); // 允许中断 prdt_entry.i 140004e86ffSlogin buf_ptr += 8 * 1024; 141004e86ffSlogin tmp_count -= 16; 142004e86ffSlogin } 143004e86ffSlogin 144004e86ffSlogin // Last entry 145004e86ffSlogin let las = (volatile_read!(cmdheader.prdtl) - 1) as usize; 146004e86ffSlogin volatile_write!(cmdtbl.prdt_entry[las].dba, virt_2_phys(buf_ptr) as u64); 1477ae679ddSLoGin cmdtbl.prdt_entry[las].dbc = ((tmp_count << 9) - 1) as u32; // 数据长度 1487ae679ddSLoGin 149004e86ffSlogin volatile_set_bit!(cmdtbl.prdt_entry[las].dbc, 1 << 31, true); // 允许中断 150004e86ffSlogin 151004e86ffSlogin // 设置命令 152004e86ffSlogin let cmdfis = unsafe { 153004e86ffSlogin ((&mut cmdtbl.cfis) as *mut [u8] as *mut usize as *mut FisRegH2D) 154004e86ffSlogin .as_mut() 155004e86ffSlogin .unwrap() 156004e86ffSlogin }; 157004e86ffSlogin volatile_write!(cmdfis.fis_type, FisType::RegH2D as u8); 158004e86ffSlogin volatile_set_bit!(cmdfis.pm, 1 << 7, true); // command_bit set 159004e86ffSlogin volatile_write!(cmdfis.command, ATA_CMD_READ_DMA_EXT); 160004e86ffSlogin 161004e86ffSlogin volatile_write!(cmdfis.lba0, (lba_id_start & 0xFF) as u8); 162004e86ffSlogin volatile_write!(cmdfis.lba1, ((lba_id_start >> 8) & 0xFF) as u8); 163004e86ffSlogin volatile_write!(cmdfis.lba2, ((lba_id_start >> 16) & 0xFF) as u8); 164004e86ffSlogin volatile_write!(cmdfis.lba3, ((lba_id_start >> 24) & 0xFF) as u8); 165004e86ffSlogin volatile_write!(cmdfis.lba4, ((lba_id_start >> 32) & 0xFF) as u8); 166004e86ffSlogin volatile_write!(cmdfis.lba5, ((lba_id_start >> 40) & 0xFF) as u8); 167004e86ffSlogin 168004e86ffSlogin volatile_write!(cmdfis.countl, (count & 0xFF) as u8); 169004e86ffSlogin volatile_write!(cmdfis.counth, ((count >> 8) & 0xFF) as u8); 170004e86ffSlogin 171004e86ffSlogin volatile_write!(cmdfis.device, 1 << 6); // LBA Mode 172004e86ffSlogin 173004e86ffSlogin // 等待之前的操作完成 174004e86ffSlogin let mut spin_count = 0; 175004e86ffSlogin const SPIN_LIMIT: u32 = 10000; 176004e86ffSlogin 177004e86ffSlogin while (volatile_read!(port.tfd) as u8 & (ATA_DEV_BUSY | ATA_DEV_DRQ)) > 0 178004e86ffSlogin && spin_count < SPIN_LIMIT 179004e86ffSlogin { 180004e86ffSlogin spin_count += 1; 181004e86ffSlogin } 182004e86ffSlogin 183004e86ffSlogin if spin_count == SPIN_LIMIT { 184004e86ffSlogin kerror!("Port is hung"); 185676b8ef6SMork return Err(SystemError::EIO); 186004e86ffSlogin } 187004e86ffSlogin 188004e86ffSlogin volatile_set_bit!(port.ci, 1 << slot, true); // Issue command 189004e86ffSlogin // kdebug!("To wait ahci read complete."); 190004e86ffSlogin // 等待操作完成 191004e86ffSlogin loop { 192004e86ffSlogin if (volatile_read!(port.ci) & (1 << slot)) == 0 { 193004e86ffSlogin break; 194004e86ffSlogin } 195004e86ffSlogin if (volatile_read!(port.is) & HBA_PxIS_TFES) > 0 { 196004e86ffSlogin kerror!("Read disk error"); 197676b8ef6SMork return Err(SystemError::EIO); 198004e86ffSlogin } 199004e86ffSlogin } 200004e86ffSlogin 201660a04ceSlogin if kbuf.is_some() { 202660a04ceSlogin buf.copy_from_slice(kbuf.as_ref().unwrap()); 203660a04ceSlogin } 204660a04ceSlogin 205*731bc2b3SLoGin compiler_fence(Ordering::SeqCst); 206004e86ffSlogin // successfully read 207004e86ffSlogin return Ok(count * 512); 208004e86ffSlogin } 209004e86ffSlogin 210004e86ffSlogin fn write_at( 211004e86ffSlogin &self, 212b087521eSChiichen lba_id_start: BlockId, 213004e86ffSlogin count: usize, 214004e86ffSlogin buf: &[u8], 215676b8ef6SMork ) -> Result<usize, SystemError> { 2167ae679ddSLoGin assert!((buf.len() & 511) == 0); 217*731bc2b3SLoGin compiler_fence(Ordering::SeqCst); 218004e86ffSlogin let check_length = ((count - 1) >> 4) + 1; // prdt length 219b5b571e0SLoGin if count * 512 > buf.len() || check_length > 8 { 220004e86ffSlogin // 不可能的操作 221676b8ef6SMork return Err(SystemError::E2BIG); 222004e86ffSlogin } else if count == 0 { 223004e86ffSlogin return Ok(0); 224004e86ffSlogin } 225004e86ffSlogin 226004e86ffSlogin let port = _port(self.ctrl_num, self.port_num); 227004e86ffSlogin 228004e86ffSlogin volatile_write!(port.is, u32::MAX); // Clear pending interrupt bits 229004e86ffSlogin 230004e86ffSlogin let slot = port.find_cmdslot().unwrap_or(u32::MAX); 231004e86ffSlogin 232004e86ffSlogin if slot == u32::MAX { 233676b8ef6SMork return Err(SystemError::EIO); 234004e86ffSlogin } 235004e86ffSlogin 236*731bc2b3SLoGin compiler_fence(Ordering::SeqCst); 237004e86ffSlogin #[allow(unused_unsafe)] 238004e86ffSlogin let cmdheader: &mut HbaCmdHeader = unsafe { 239004e86ffSlogin (phys_2_virt( 240b5b571e0SLoGin volatile_read!(port.clb) as usize + slot as usize * size_of::<HbaCmdHeader>(), 241004e86ffSlogin ) as *mut HbaCmdHeader) 242004e86ffSlogin .as_mut() 243004e86ffSlogin .unwrap() 244004e86ffSlogin }; 245*731bc2b3SLoGin compiler_fence(Ordering::SeqCst); 246004e86ffSlogin 247004e86ffSlogin volatile_write_bit!( 248004e86ffSlogin cmdheader.cfl, 249b5b571e0SLoGin (1 << 5) - 1_u8, 250004e86ffSlogin (size_of::<FisRegH2D>() / size_of::<u32>()) as u8 251004e86ffSlogin ); // Command FIS size 252004e86ffSlogin 253004e86ffSlogin volatile_set_bit!(cmdheader.cfl, 7 << 5, true); // (p,c,w)都设置为1, Read/Write bit : Write from device 254004e86ffSlogin volatile_write!(cmdheader.prdtl, check_length as u16); // PRDT entries count 255004e86ffSlogin 256004e86ffSlogin // 设置数据存放地址 257*731bc2b3SLoGin compiler_fence(Ordering::SeqCst); 258004e86ffSlogin let mut buf_ptr = buf as *const [u8] as *mut usize as usize; 259660a04ceSlogin 260660a04ceSlogin // 由于目前的内存管理机制无法把用户空间的内存地址转换为物理地址,所以只能先把数据拷贝到内核空间 261660a04ceSlogin // TODO:在内存管理重构后,可以直接使用用户空间的内存地址 262b5b571e0SLoGin let user_buf = verify_area(VirtAddr::new(buf_ptr), buf.len()).is_ok(); 263660a04ceSlogin let mut kbuf = if user_buf { 264b5b571e0SLoGin let mut x: Vec<u8> = vec![0; buf.len()]; 265660a04ceSlogin x.resize(buf.len(), 0); 266660a04ceSlogin x.copy_from_slice(buf); 267660a04ceSlogin Some(x) 268660a04ceSlogin } else { 269660a04ceSlogin None 270660a04ceSlogin }; 271660a04ceSlogin 272660a04ceSlogin if kbuf.is_some() { 273660a04ceSlogin buf_ptr = kbuf.as_mut().unwrap().as_mut_ptr() as usize; 274660a04ceSlogin } 275660a04ceSlogin 276004e86ffSlogin #[allow(unused_unsafe)] 277004e86ffSlogin let cmdtbl = unsafe { 278004e86ffSlogin (phys_2_virt(volatile_read!(cmdheader.ctba) as usize) as *mut HbaCmdTable) 279004e86ffSlogin .as_mut() 280004e86ffSlogin .unwrap() 281004e86ffSlogin }; 282004e86ffSlogin let mut tmp_count = count; 283*731bc2b3SLoGin compiler_fence(Ordering::SeqCst); 284004e86ffSlogin 285004e86ffSlogin unsafe { 286004e86ffSlogin // 清空整个table的旧数据 287004e86ffSlogin write_bytes(cmdtbl, 0, 1); 288004e86ffSlogin } 289004e86ffSlogin 290004e86ffSlogin // 8K bytes (16 sectors) per PRDT 291004e86ffSlogin for i in 0..((volatile_read!(cmdheader.prdtl) - 1) as usize) { 292004e86ffSlogin volatile_write!(cmdtbl.prdt_entry[i].dba, virt_2_phys(buf_ptr) as u64); 293004e86ffSlogin volatile_write_bit!(cmdtbl.prdt_entry[i].dbc, (1 << 22) - 1, 8 * 1024 - 1); // 数据长度 294004e86ffSlogin volatile_set_bit!(cmdtbl.prdt_entry[i].dbc, 1 << 31, true); // 允许中断 295004e86ffSlogin buf_ptr += 8 * 1024; 296004e86ffSlogin tmp_count -= 16; 297004e86ffSlogin } 298004e86ffSlogin 299004e86ffSlogin // Last entry 300004e86ffSlogin let las = (volatile_read!(cmdheader.prdtl) - 1) as usize; 301004e86ffSlogin volatile_write!(cmdtbl.prdt_entry[las].dba, virt_2_phys(buf_ptr) as u64); 302004e86ffSlogin volatile_set_bit!(cmdtbl.prdt_entry[las].dbc, 1 << 31, true); // 允许中断 303004e86ffSlogin volatile_write_bit!( 304004e86ffSlogin cmdtbl.prdt_entry[las].dbc, 305004e86ffSlogin (1 << 22) - 1, 306004e86ffSlogin ((tmp_count << 9) - 1) as u32 307004e86ffSlogin ); // 数据长度 308004e86ffSlogin 309004e86ffSlogin // 设置命令 310004e86ffSlogin let cmdfis = unsafe { 311004e86ffSlogin ((&mut cmdtbl.cfis) as *mut [u8] as *mut usize as *mut FisRegH2D) 312004e86ffSlogin .as_mut() 313004e86ffSlogin .unwrap() 314004e86ffSlogin }; 315004e86ffSlogin volatile_write!(cmdfis.fis_type, FisType::RegH2D as u8); 316004e86ffSlogin volatile_set_bit!(cmdfis.pm, 1 << 7, true); // command_bit set 317004e86ffSlogin volatile_write!(cmdfis.command, ATA_CMD_WRITE_DMA_EXT); 318004e86ffSlogin 319004e86ffSlogin volatile_write!(cmdfis.lba0, (lba_id_start & 0xFF) as u8); 320004e86ffSlogin volatile_write!(cmdfis.lba1, ((lba_id_start >> 8) & 0xFF) as u8); 321004e86ffSlogin volatile_write!(cmdfis.lba2, ((lba_id_start >> 16) & 0xFF) as u8); 322004e86ffSlogin volatile_write!(cmdfis.lba3, ((lba_id_start >> 24) & 0xFF) as u8); 323004e86ffSlogin volatile_write!(cmdfis.lba4, ((lba_id_start >> 32) & 0xFF) as u8); 324004e86ffSlogin volatile_write!(cmdfis.lba5, ((lba_id_start >> 40) & 0xFF) as u8); 325004e86ffSlogin 326004e86ffSlogin volatile_write!(cmdfis.countl, (count & 0xFF) as u8); 327004e86ffSlogin volatile_write!(cmdfis.counth, ((count >> 8) & 0xFF) as u8); 328004e86ffSlogin 329004e86ffSlogin volatile_write!(cmdfis.device, 1 << 6); // LBA Mode 330004e86ffSlogin 331004e86ffSlogin volatile_set_bit!(port.ci, 1 << slot, true); // Issue command 332004e86ffSlogin 333004e86ffSlogin // 等待操作完成 334004e86ffSlogin loop { 335004e86ffSlogin if (volatile_read!(port.ci) & (1 << slot)) == 0 { 336004e86ffSlogin break; 337004e86ffSlogin } 338004e86ffSlogin if (volatile_read!(port.is) & HBA_PxIS_TFES) > 0 { 339004e86ffSlogin kerror!("Write disk error"); 340676b8ef6SMork return Err(SystemError::EIO); 341004e86ffSlogin } 342004e86ffSlogin } 343004e86ffSlogin 344*731bc2b3SLoGin compiler_fence(Ordering::SeqCst); 345004e86ffSlogin // successfully read 346004e86ffSlogin return Ok(count * 512); 347004e86ffSlogin } 348004e86ffSlogin 349676b8ef6SMork fn sync(&self) -> Result<(), SystemError> { 350004e86ffSlogin // 由于目前没有block cache, 因此sync返回成功即可 351004e86ffSlogin return Ok(()); 352004e86ffSlogin } 353004e86ffSlogin } 354004e86ffSlogin 355004e86ffSlogin impl LockedAhciDisk { 356004e86ffSlogin pub fn new( 357004e86ffSlogin name: String, 358004e86ffSlogin flags: u16, 359004e86ffSlogin ctrl_num: u8, 360004e86ffSlogin port_num: u8, 361676b8ef6SMork ) -> Result<Arc<LockedAhciDisk>, SystemError> { 362004e86ffSlogin // 构建磁盘结构体 363*731bc2b3SLoGin let result: Arc<LockedAhciDisk> = Arc::new_cyclic(|self_ref| { 364*731bc2b3SLoGin LockedAhciDisk(SpinLock::new(AhciDisk { 365004e86ffSlogin name, 366004e86ffSlogin flags, 367004e86ffSlogin partitions: Default::default(), 368004e86ffSlogin ctrl_num, 369004e86ffSlogin port_num, 370*731bc2b3SLoGin self_ref: self_ref.clone(), 371*731bc2b3SLoGin })) 372*731bc2b3SLoGin }); 373004e86ffSlogin let table: MbrDiskPartionTable = result.read_mbr_table()?; 374004e86ffSlogin 375004e86ffSlogin // 求出有多少可用分区 376*731bc2b3SLoGin let partitions = table.partitions(Arc::downgrade(&result) as Weak<dyn BlockDevice>); 377*731bc2b3SLoGin result.0.lock().partitions = partitions; 3787ae679ddSLoGin 379004e86ffSlogin return Ok(result); 380004e86ffSlogin } 381004e86ffSlogin 382*731bc2b3SLoGin /// @brief: 从磁盘中读取 MBR 分区表结构体 383676b8ef6SMork pub fn read_mbr_table(&self) -> Result<MbrDiskPartionTable, SystemError> { 384*731bc2b3SLoGin let disk = self.0.lock().self_ref.upgrade().unwrap() as Arc<dyn BlockDevice>; 385*731bc2b3SLoGin MbrDiskPartionTable::from_disk(disk) 386004e86ffSlogin } 387004e86ffSlogin } 388004e86ffSlogin 38906d5e247SLoGin impl KObject for LockedAhciDisk { 39006d5e247SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 39106d5e247SLoGin self 39206d5e247SLoGin } 39306d5e247SLoGin 39406d5e247SLoGin fn inode(&self) -> Option<Arc<KernFSInode>> { 39506d5e247SLoGin todo!() 39606d5e247SLoGin } 39706d5e247SLoGin 39806d5e247SLoGin fn kobj_type(&self) -> Option<&'static dyn KObjType> { 39906d5e247SLoGin todo!() 40006d5e247SLoGin } 40106d5e247SLoGin 40206d5e247SLoGin fn kset(&self) -> Option<Arc<KSet>> { 40306d5e247SLoGin todo!() 40406d5e247SLoGin } 40506d5e247SLoGin 40606d5e247SLoGin fn parent(&self) -> Option<Weak<dyn KObject>> { 40706d5e247SLoGin todo!() 40806d5e247SLoGin } 40906d5e247SLoGin 41006d5e247SLoGin fn set_inode(&self, _inode: Option<Arc<KernFSInode>>) { 41106d5e247SLoGin todo!() 41206d5e247SLoGin } 41306d5e247SLoGin 41406d5e247SLoGin fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 41506d5e247SLoGin todo!() 41606d5e247SLoGin } 41706d5e247SLoGin 41806d5e247SLoGin fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 41906d5e247SLoGin todo!() 42006d5e247SLoGin } 42106d5e247SLoGin 42206d5e247SLoGin fn set_kobj_state(&self, _state: KObjectState) { 42306d5e247SLoGin todo!() 42406d5e247SLoGin } 42506d5e247SLoGin 42606d5e247SLoGin fn name(&self) -> alloc::string::String { 42706d5e247SLoGin todo!() 42806d5e247SLoGin } 42906d5e247SLoGin 43006d5e247SLoGin fn set_name(&self, _name: alloc::string::String) { 43106d5e247SLoGin todo!() 43206d5e247SLoGin } 43306d5e247SLoGin 43406d5e247SLoGin fn set_kset(&self, _kset: Option<Arc<KSet>>) { 43506d5e247SLoGin todo!() 43606d5e247SLoGin } 43706d5e247SLoGin 43806d5e247SLoGin fn set_parent(&self, _parent: Option<Weak<dyn KObject>>) { 43906d5e247SLoGin todo!() 44006d5e247SLoGin } 441a03c4f9dSLoGin 442a03c4f9dSLoGin fn set_kobj_type(&self, _ktype: Option<&'static dyn KObjType>) { 443a03c4f9dSLoGin todo!() 444a03c4f9dSLoGin } 44506d5e247SLoGin } 446b087521eSChiichen 447b087521eSChiichen impl Device for LockedAhciDisk { 448b087521eSChiichen fn dev_type(&self) -> DeviceType { 449b087521eSChiichen return DeviceType::Block; 450b087521eSChiichen } 451b087521eSChiichen 45206d5e247SLoGin fn id_table(&self) -> IdTable { 453b087521eSChiichen todo!() 454b087521eSChiichen } 455b087521eSChiichen 456c566df45SLoGin fn bus(&self) -> Option<Weak<dyn Bus>> { 45706d5e247SLoGin todo!("LockedAhciDisk::bus()") 458b087521eSChiichen } 459b087521eSChiichen 460c566df45SLoGin fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) { 461a03c4f9dSLoGin todo!("LockedAhciDisk::set_bus()") 462a03c4f9dSLoGin } 463a03c4f9dSLoGin 46406d5e247SLoGin fn driver(&self) -> Option<Arc<dyn Driver>> { 46506d5e247SLoGin todo!("LockedAhciDisk::driver()") 46606d5e247SLoGin } 46706d5e247SLoGin 46806d5e247SLoGin fn is_dead(&self) -> bool { 46906d5e247SLoGin false 47006d5e247SLoGin } 47106d5e247SLoGin 472a03c4f9dSLoGin fn set_driver(&self, _driver: Option<Weak<dyn Driver>>) { 47306d5e247SLoGin todo!("LockedAhciDisk::set_driver()") 474b087521eSChiichen } 475a03c4f9dSLoGin 476a03c4f9dSLoGin fn can_match(&self) -> bool { 477a03c4f9dSLoGin todo!() 478a03c4f9dSLoGin } 479a03c4f9dSLoGin 480a03c4f9dSLoGin fn set_can_match(&self, _can_match: bool) { 481a03c4f9dSLoGin todo!() 482a03c4f9dSLoGin } 483a03c4f9dSLoGin 484a03c4f9dSLoGin fn state_synced(&self) -> bool { 485a03c4f9dSLoGin todo!() 486a03c4f9dSLoGin } 48708a2ee40SLoGin 4884256da7fSLoGin fn set_class(&self, _class: Option<Weak<dyn Class>>) { 48908a2ee40SLoGin todo!() 49008a2ee40SLoGin } 491b087521eSChiichen } 492b087521eSChiichen 493004e86ffSlogin impl BlockDevice for LockedAhciDisk { 494004e86ffSlogin #[inline] 495004e86ffSlogin fn as_any_ref(&self) -> &dyn core::any::Any { 496004e86ffSlogin self 497004e86ffSlogin } 498004e86ffSlogin 499004e86ffSlogin #[inline] 500004e86ffSlogin fn blk_size_log2(&self) -> u8 { 501004e86ffSlogin 9 502004e86ffSlogin } 503004e86ffSlogin 504676b8ef6SMork fn sync(&self) -> Result<(), SystemError> { 505004e86ffSlogin return self.0.lock().sync(); 506004e86ffSlogin } 507004e86ffSlogin 508004e86ffSlogin #[inline] 509b087521eSChiichen fn device(&self) -> Arc<dyn Device> { 510004e86ffSlogin return self.0.lock().self_ref.upgrade().unwrap(); 511004e86ffSlogin } 512004e86ffSlogin 513004e86ffSlogin fn block_size(&self) -> usize { 514004e86ffSlogin todo!() 515004e86ffSlogin } 516004e86ffSlogin 517004e86ffSlogin fn partitions(&self) -> Vec<Arc<Partition>> { 518004e86ffSlogin return self.0.lock().partitions.clone(); 519004e86ffSlogin } 520b087521eSChiichen 521b087521eSChiichen #[inline] 522eb49bb99S曾俊 fn read_at_sync( 523b087521eSChiichen &self, 524b087521eSChiichen lba_id_start: BlockId, // 起始lba编号 525b087521eSChiichen count: usize, // 读取lba的数量 526b087521eSChiichen buf: &mut [u8], 527b087521eSChiichen ) -> Result<usize, SystemError> { 528b087521eSChiichen self.0.lock().read_at(lba_id_start, count, buf) 529b087521eSChiichen } 530b087521eSChiichen 531b087521eSChiichen #[inline] 532eb49bb99S曾俊 fn write_at_sync( 533b087521eSChiichen &self, 534b087521eSChiichen lba_id_start: BlockId, 535b087521eSChiichen count: usize, 536b087521eSChiichen buf: &[u8], 537b087521eSChiichen ) -> Result<usize, SystemError> { 538b087521eSChiichen self.0.lock().write_at(lba_id_start, count, buf) 539b087521eSChiichen } 540004e86ffSlogin } 541