add ahci support
[seabios.git] / src / disk.h
index 89e4a2af81106f092611306f09fad25adbe8e61c..c1ba6ae44c0ad468fbd4c618865da83e8c661722 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "types.h" // u8
 #include "config.h" // CONFIG_*
+#include "farptr.h" // struct segoff_s
 
 #define DISK_RET_SUCCESS       0x00
 #define DISK_RET_EPARAM        0x01
@@ -35,8 +36,7 @@ struct int13ext_s {
     u8  size;
     u8  reserved;
     u16 count;
-    u16 offset;
-    u16 segment;
+    struct segoff_s data;
     u64 lba;
 } PACKED;
 
@@ -101,6 +101,10 @@ struct bregs;
 void __disk_ret(struct bregs *regs, u32 linecode, const char *fname);
 #define disk_ret(regs, code) \
     __disk_ret((regs), (code) | (__LINE__ << 8), __func__)
+void __disk_ret_unimplemented(struct bregs *regs, u32 linecode
+                              , const char *fname);
+#define disk_ret_unimplemented(regs, code) \
+    __disk_ret_unimplemented((regs), (code) | (__LINE__ << 8), __func__)
 
 
 /****************************************************************
@@ -144,8 +148,8 @@ struct mbr_s {
 struct disk_op_s {
     u64 lba;
     void *buf_fl;
+    struct drive_s *drive_g;
     u16 count;
-    u8 driveid;
     u8 command;
 };
 
@@ -169,25 +173,34 @@ struct chs_s {
 };
 
 struct drive_s {
-    u8  type;         // Detected type of drive (ata/atapi/none)
-    u8  removable;    // Removable device flag
-    u16 blksize;      // block size
-    int cntl_id;
-    u8  floppy_type;  // Type of floppy (only for floppy drives).
-
-    char model[41];
-
-    u8  translation;  // type of translation
-    struct chs_s  lchs;         // Logical CHS
-    struct chs_s  pchs;         // Physical CHS
-
-    u64 sectors;      // Total sectors count
+    u8 type;            // Driver type (DTYPE_*)
+    u8 floppy_type;     // Type of floppy (only for floppy drives).
+    struct chs_s lchs;  // Logical CHS
+    u64 sectors;        // Total sectors count
+    char *desc;         // Drive description (only available during POST)
+    u32 cntl_id;        // Unique id for a given driver type.
+    u8 removable;       // Is media removable (currently unused)
+
+    // Info for EDD calls
+    u8 translation;     // type of translation
+    u16 blksize;        // block size
+    struct chs_s pchs;  // Physical CHS
 };
 
+#define DISK_SECTOR_SIZE  512
+#define CDROM_SECTOR_SIZE 2048
+
 #define DTYPE_NONE     0x00
 #define DTYPE_FLOPPY   0x01
 #define DTYPE_ATA      0x02
 #define DTYPE_ATAPI    0x03
+#define DTYPE_RAMDISK  0x04
+#define DTYPE_CDEMU    0x05
+#define DTYPE_USB      0x06
+#define DTYPE_VIRTIO   0x07
+#define DTYPE_AHCI     0x08
+
+#define MAXDESCSIZE 80
 
 #define TRANSLATION_NONE  0
 #define TRANSLATION_LBA   1
@@ -195,20 +208,19 @@ struct drive_s {
 #define TRANSLATION_RECHS 3
 
 struct drives_s {
-    // info on each internally handled drive
-    struct drive_s drives[CONFIG_MAX_DRIVES];
-    u8 drivecount;
-    //
-    // map between bios floppy/hd/cd id and driveid index into drives[]
+    // map between bios floppy/hd/cd id and drive_s struct
     u8 floppycount;
     u8 cdcount;
-    u8 idmap[3][CONFIG_MAX_EXTDRIVE];
+    struct drive_s *idmap[3][CONFIG_MAX_EXTDRIVE];
 };
 
 #define EXTTYPE_FLOPPY 0
 #define EXTTYPE_HD 1
 #define EXTTYPE_CD 2
 
+#define EXTSTART_HD 0x80
+#define EXTSTART_CD 0xE0
+
 
 /****************************************************************
  * Function defs
@@ -216,28 +228,31 @@ struct drives_s {
 
 // block.c
 extern struct drives_s Drives;
-void setup_translation(int driveid);
-void map_floppy_drive(int driveid);
-void map_hd_drive(int driveid);
-void map_cd_drive(int driveid);
+struct drive_s *getDrive(u8 exttype, u8 extdriveoffset);
+void setup_translation(struct drive_s *drive_g);
+void map_floppy_drive(struct drive_s *drive_g);
+void map_hd_drive(struct drive_s *drive_g);
+void map_cd_drive(struct drive_s *drive_g);
+int process_op(struct disk_op_s *op);
 int send_disk_op(struct disk_op_s *op);
-void drive_setup();
 
 // floppy.c
 extern struct floppy_ext_dbt_s diskette_param_table2;
-void floppy_setup();
+void floppy_setup(void);
+struct drive_s *addFloppy(int floppyid, int ftype, int driver);
+int find_floppy_type(u32 size);
 int process_floppy_op(struct disk_op_s *op);
-void floppy_tick();
-
-// disk.c
-void disk_13(struct bregs *regs, u8 driveid);
-void disk_13XX(struct bregs *regs, u8 driveid);
-void cdemu_access(struct bregs *regs, u8 driveid, u16 command);
+void floppy_tick(void);
 
 // cdrom.c
-void cdrom_13(struct bregs *regs, u8 driveid);
-void cdemu_13(struct bregs *regs);
+extern struct drive_s *cdemu_drive_gf;
+int process_cdemu_op(struct disk_op_s *op);
+void cdemu_setup(void);
 void cdemu_134b(struct bregs *regs);
 int cdrom_boot(int cdid);
 
+// ramdisk.c
+void ramdisk_setup(void);
+int process_ramdisk_op(struct disk_op_s *op);
+
 #endif // disk.h