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 };