1 #pragma once
2 
3 #include <DragonOS/stdint.h>
4 #include <common/glib.h>
5 #include <common/mutex.h>
6 #include <common/semaphore.h>
7 
8 #define BLK_TYPE_AHCI 0
9 
10 #define DISK_NAME_LEN 32 // 磁盘名称的最大长度
11 
12 struct blk_gendisk;
13 
14 struct block_device_operation
15 {
16     long (*open)();
17     long (*close)();
18     long (*ioctl)(long cmd, long arg);
19 
20     /**
21      * @brief 块设备驱动程序的传输函数
22      *
23      * @param gd 磁盘设备结构体
24      * @param cmd 控制命令
25      * @param base_addr 48位LBA地址
26      * @param count total sectors to read
27      * @param buf 缓冲区线性地址
28      * @return long
29      */
30     long (*transfer)(struct blk_gendisk *gd, long cmd, uint64_t base_addr, uint64_t count, uint64_t buf);
31 };
32 
33 /**
34  * @brief 块设备请求队列内的packet
35  *
36  */
37 struct block_device_request_packet
38 {
39     uchar cmd;
40     uint64_t LBA_start;
41     uint32_t count;
42     uint64_t buffer_vaddr;
43     uint8_t device_type; // 0: ahci
44     void (*end_handler)(ul num, ul arg);
45 };
46 
47 /**
48  * @brief 块设备的请求队列
49  *
50  */
51 struct block_device_request_queue
52 {
53     struct block_device_request_packet *in_service; // 正在请求的结点
54     ul request_count;
55 };
56 
57 /**
58  * @brief 块设备结构体(对应磁盘的一个分区)
59  *
60  */
61 struct block_device
62 {
63     sector_t bd_start_sector;               // 该分区的起始扇区
64     uint64_t bd_start_LBA;                  // 起始LBA号
65     sector_t bd_sectors_num;                // 该分区的扇区数
66     struct vfs_superblock_t *bd_superblock; // 执行超级块的指针
67     struct blk_gendisk *bd_disk;            // 当前分区所属的磁盘
68     uint16_t bd_partno;                     // 在磁盘上的分区号
69 };
70 
71 // 定义blk_gendisk中的标志位
72 #define BLK_GF_AHCI (1 << 0)
73 
74 /**
75  * @brief 磁盘设备结构体
76  *
77  */
78 struct blk_gendisk
79 {
80     char disk_name[DISK_NAME_LEN]; // 磁盘驱动器名称
81     uint16_t part_cnt;             // 磁盘分区计数
82     uint16_t flags;
83     struct block_device *partition;            // 磁盘分区数组
84     const struct block_device_operation *fops; // 磁盘操作
85     void *private_data;
86     mutex_t open_mutex; // open()/close()操作的互斥锁
87 };