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 
44     uint8_t device_type; // 0: ahci
45     void (*end_handler)(ul num, ul arg);
46 
47     wait_queue_node_t wait_queue;
48 };
49 
50 /**
51  * @brief 块设备的请求队列
52  *
53  */
54 struct block_device_request_queue
55 {
56     wait_queue_node_t wait_queue_list;
57     struct block_device_request_packet *in_service; // 正在请求的结点
58     ul request_count;
59 };
60 
61 /**
62  * @brief 块设备结构体(对应磁盘的一个分区)
63  *
64  */
65 struct block_device
66 {
67     sector_t bd_start_sector;                    // 该分区的起始扇区
68     uint64_t bd_start_LBA;                       // 起始LBA号
69     sector_t bd_sectors_num;                     // 该分区的扇区数
70     struct vfs_superblock_t *bd_superblock;      // 执行超级块的指针
71     struct blk_gendisk *bd_disk;                 // 当前分区所属的磁盘
72     struct block_device_request_queue *bd_queue; // 请求队列
73     uint16_t bd_partno;                          // 在磁盘上的分区号
74 };
75 
76 // 定义blk_gendisk中的标志位
77 #define BLK_GF_AHCI (1 << 0)
78 
79 /**
80  * @brief 磁盘设备结构体
81  *
82  */
83 struct blk_gendisk
84 {
85     char disk_name[DISK_NAME_LEN]; // 磁盘驱动器名称
86     uint16_t part_cnt;             // 磁盘分区计数
87     uint16_t flags;
88     struct block_device *partition;                   // 磁盘分区数组
89     const struct block_device_operation *fops;        // 磁盘操作
90     struct block_device_request_queue *request_queue; // 磁盘请求队列
91     void *private_data;
92 
93     mutex_t open_mutex; // open()/close()操作的互斥锁
94 };