xref: /DragonOS/kernel/src/driver/base/block/disk_info.rs (revision b087521e07f601b30e3d48df788fcc2f09f19566)
1*b087521eSChiichen #![allow(dead_code)]
2*b087521eSChiichen use alloc::sync::{Arc, Weak};
3*b087521eSChiichen 
4*b087521eSChiichen use super::block_device::BlockDevice;
5*b087521eSChiichen 
6*b087521eSChiichen pub type SectorT = u64;
7*b087521eSChiichen 
8*b087521eSChiichen pub const BLK_TYPE_AHCI: u64 = 0;
9*b087521eSChiichen pub const DISK_NAME_LEN: usize = 32; // 磁盘名称的最大长度
10*b087521eSChiichen pub const BLK_GF_AHCI: u16 = 1 << 0; // 定义blk_gendisk中的标志位
11*b087521eSChiichen 
12*b087521eSChiichen /// @brief: 磁盘的分区信息 - (保留了c版本的数据信息)
13*b087521eSChiichen #[derive(Debug)]
14*b087521eSChiichen pub struct Partition {
15*b087521eSChiichen     pub start_sector: SectorT,   // 该分区的起始扇区
16*b087521eSChiichen     pub lba_start: u64,          // 起始LBA号
17*b087521eSChiichen     pub sectors_num: u64,        // 该分区的扇区数
18*b087521eSChiichen     disk: Weak<dyn BlockDevice>, // 当前分区所属的磁盘
19*b087521eSChiichen     pub partno: u16,             // 在磁盘上的分区号
20*b087521eSChiichen 
21*b087521eSChiichen                                  // struct block_device_request_queue *bd_queue; // 请求队列
22*b087521eSChiichen                                  // struct vfs_superblock_t *bd_superblock;      // 执行超级块的指针
23*b087521eSChiichen }
24*b087521eSChiichen 
25*b087521eSChiichen /// @brief: 分区信息 - 成员函数
26*b087521eSChiichen impl Partition {
27*b087521eSChiichen     /// @brief: 为 disk new 一个分区结构体
28*b087521eSChiichen     pub fn new(
29*b087521eSChiichen         start_sector: SectorT,
30*b087521eSChiichen         lba_start: u64,
31*b087521eSChiichen         sectors_num: u64,
32*b087521eSChiichen         disk: Weak<dyn BlockDevice>,
33*b087521eSChiichen         partno: u16,
34*b087521eSChiichen     ) -> Arc<Self> {
35*b087521eSChiichen         return Arc::new(Partition {
36*b087521eSChiichen             start_sector,
37*b087521eSChiichen             lba_start,
38*b087521eSChiichen             sectors_num,
39*b087521eSChiichen             disk,
40*b087521eSChiichen             partno,
41*b087521eSChiichen         });
42*b087521eSChiichen     }
43*b087521eSChiichen 
44*b087521eSChiichen     /// @brief 获取当前分区所属的磁盘的Arc指针
45*b087521eSChiichen     #[inline]
46*b087521eSChiichen     pub fn disk(&self) -> Arc<dyn BlockDevice> {
47*b087521eSChiichen         return self.disk.upgrade().unwrap();
48*b087521eSChiichen     }
49*b087521eSChiichen }
50