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