xref: /DragonOS/kernel/src/driver/disk/ahci/ahcidisk.rs (revision 731bc2b32d7b37298883d7a15b6dca659b436ee4)
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