blob: 90ca04dfa7f9d374450b0661ef94d35ca52ef38d [file] [log] [blame]
Kevin O'Connorf076a3e2008-02-25 22:25:15 -05001// Definitions for X86 bios disks.
2//
3// Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
4//
Kevin O'Connorb1b7c2a2009-01-15 20:52:58 -05005// This file may be distributed under the terms of the GNU LGPLv3 license.
Kevin O'Connor786502d2008-02-27 10:41:41 -05006#ifndef __DISK_H
7#define __DISK_H
Kevin O'Connorf076a3e2008-02-25 22:25:15 -05008
Kevin O'Connor9521e262008-07-04 13:04:29 -04009#include "types.h" // u8
Kevin O'Connor609da232008-12-28 23:18:57 -050010#include "config.h" // CONFIG_*
Kevin O'Connor9f985422009-09-09 11:34:39 -040011#include "farptr.h" // struct segoff_s
Kevin O'Connorf076a3e2008-02-25 22:25:15 -050012
Kevin O'Connore43df9e2008-03-01 22:16:32 -050013#define DISK_RET_SUCCESS 0x00
14#define DISK_RET_EPARAM 0x01
Kevin O'Connorb74102d2008-03-03 21:57:30 -050015#define DISK_RET_EADDRNOTFOUND 0x02
16#define DISK_RET_EWRITEPROTECT 0x03
Kevin O'Connore43df9e2008-03-01 22:16:32 -050017#define DISK_RET_ECHANGED 0x06
18#define DISK_RET_EBOUNDARY 0x09
19#define DISK_RET_EBADTRACK 0x0c
20#define DISK_RET_ECONTROLLER 0x20
21#define DISK_RET_ETIMEOUT 0x80
Kevin O'Connorb74102d2008-03-03 21:57:30 -050022#define DISK_RET_ENOTLOCKED 0xb0
23#define DISK_RET_ELOCKED 0xb1
Kevin O'Connore43df9e2008-03-01 22:16:32 -050024#define DISK_RET_ENOTREMOVABLE 0xb2
Kevin O'Connorb74102d2008-03-03 21:57:30 -050025#define DISK_RET_ETOOMANYLOCKS 0xb4
Kevin O'Connore43df9e2008-03-01 22:16:32 -050026#define DISK_RET_EMEDIA 0xC0
27#define DISK_RET_ENOTREADY 0xAA
28
Kevin O'Connor609da232008-12-28 23:18:57 -050029
30/****************************************************************
31 * Interface structs
32 ****************************************************************/
33
Kevin O'Connore43df9e2008-03-01 22:16:32 -050034// Bios disk structures.
35struct int13ext_s {
36 u8 size;
37 u8 reserved;
38 u16 count;
Kevin O'Connor9f985422009-09-09 11:34:39 -040039 struct segoff_s data;
Kevin O'Connor1bb3b5c2008-05-14 00:43:13 -040040 u64 lba;
Kevin O'Connored128492008-03-11 11:14:59 -040041} PACKED;
Kevin O'Connore43df9e2008-03-01 22:16:32 -050042
43#define GET_INT13EXT(regs,var) \
44 GET_FARVAR((regs)->ds, ((struct int13ext_s*)((regs)->si+0))->var)
45#define SET_INT13EXT(regs,var,val) \
46 SET_FARVAR((regs)->ds, ((struct int13ext_s*)((regs)->si+0))->var, (val))
47
48// Disk Physical Table definition
49struct int13dpt_s {
50 u16 size;
51 u16 infos;
52 u32 cylinders;
53 u32 heads;
54 u32 spt;
Kevin O'Connor1bb3b5c2008-05-14 00:43:13 -040055 u64 sector_count;
Kevin O'Connore43df9e2008-03-01 22:16:32 -050056 u16 blksize;
57 u16 dpte_offset;
58 u16 dpte_segment;
59 u16 key;
60 u8 dpi_length;
61 u8 reserved1;
62 u16 reserved2;
63 u8 host_bus[4];
64 u8 iface_type[8];
Kevin O'Connor53236cc2008-08-31 11:16:33 -040065 u64 iface_path;
66 u64 device_path;
Kevin O'Connore43df9e2008-03-01 22:16:32 -050067 u8 reserved3;
68 u8 checksum;
Kevin O'Connored128492008-03-11 11:14:59 -040069} PACKED;
Kevin O'Connore43df9e2008-03-01 22:16:32 -050070
71#define GET_INT13DPT(regs,var) \
72 GET_FARVAR((regs)->ds, ((struct int13dpt_s*)((regs)->si+0))->var)
73#define SET_INT13DPT(regs,var,val) \
74 SET_FARVAR((regs)->ds, ((struct int13dpt_s*)((regs)->si+0))->var, (val))
75
Kevin O'Connor44c631d2008-03-02 11:24:36 -050076// Floppy "Disk Base Table"
77struct floppy_dbt_s {
78 u8 specify1;
79 u8 specify2;
80 u8 shutoff_ticks;
81 u8 bps_code;
82 u8 sectors;
83 u8 interblock_len;
84 u8 data_len;
85 u8 gap_len;
86 u8 fill_byte;
87 u8 settle_time;
88 u8 startup_time;
Kevin O'Connored128492008-03-11 11:14:59 -040089} PACKED;
Kevin O'Connor44c631d2008-03-02 11:24:36 -050090
91struct floppy_ext_dbt_s {
92 struct floppy_dbt_s dbt;
93 // Extra fields
94 u8 max_track;
95 u8 data_rate;
96 u8 drive_type;
Kevin O'Connored128492008-03-11 11:14:59 -040097} PACKED;
Kevin O'Connorf076a3e2008-02-25 22:25:15 -050098
Kevin O'Connor31d8c8a2008-03-04 19:56:41 -050099// Helper function for setting up a return code.
Kevin O'Connor9521e262008-07-04 13:04:29 -0400100struct bregs;
Kevin O'Connor05600342009-01-02 13:10:58 -0500101void __disk_ret(struct bregs *regs, u32 linecode, const char *fname);
Kevin O'Connor567e4e32008-04-05 11:37:51 -0400102#define disk_ret(regs, code) \
Kevin O'Connor05600342009-01-02 13:10:58 -0500103 __disk_ret((regs), (code) | (__LINE__ << 8), __func__)
Kevin O'Connordfefeb52009-12-13 13:04:17 -0500104void __disk_ret_unimplemented(struct bregs *regs, u32 linecode
105 , const char *fname);
106#define disk_ret_unimplemented(regs, code) \
107 __disk_ret_unimplemented((regs), (code) | (__LINE__ << 8), __func__)
Kevin O'Connor31d8c8a2008-03-04 19:56:41 -0500108
Kevin O'Connor609da232008-12-28 23:18:57 -0500109
110/****************************************************************
Kevin O'Connor95827c42009-02-07 00:04:57 -0500111 * Master boot record
112 ****************************************************************/
113
114struct packed_chs_s {
115 u8 heads;
116 u8 sptcyl;
117 u8 cyllow;
118};
119
120struct partition_s {
121 u8 status;
122 struct packed_chs_s first;
123 u8 type;
124 struct packed_chs_s last;
125 u32 lba;
126 u32 count;
127} PACKED;
128
129struct mbr_s {
130 u8 code[440];
131 // 0x01b8
132 u32 diskseg;
133 // 0x01bc
134 u16 null;
135 // 0x01be
136 struct partition_s partitions[4];
137 // 0x01fe
138 u16 signature;
139} PACKED;
140
141#define MBR_SIGNATURE 0xaa55
142
143
144/****************************************************************
Kevin O'Connor4524bf72008-12-31 00:31:03 -0500145 * Disk command request
146 ****************************************************************/
147
148struct disk_op_s {
149 u64 lba;
Kevin O'Connor35ae7262009-01-19 15:44:44 -0500150 void *buf_fl;
Kevin O'Connor77d227b2009-10-22 21:48:39 -0400151 struct drive_s *drive_g;
Kevin O'Connor4524bf72008-12-31 00:31:03 -0500152 u16 count;
Kevin O'Connor4524bf72008-12-31 00:31:03 -0500153 u8 command;
154};
155
Kevin O'Connor42337662009-08-10 00:06:37 -0400156#define CMD_RESET 0x00
157#define CMD_READ 0x02
158#define CMD_WRITE 0x03
159#define CMD_VERIFY 0x04
Kevin O'Connoraf5aabb2009-08-16 18:48:38 -0400160#define CMD_FORMAT 0x05
Kevin O'Connor42337662009-08-10 00:06:37 -0400161#define CMD_SEEK 0x07
162#define CMD_ISREADY 0x10
Kevin O'Connor4524bf72008-12-31 00:31:03 -0500163
164
165/****************************************************************
Kevin O'Connor609da232008-12-28 23:18:57 -0500166 * Global storage
167 ****************************************************************/
168
169struct chs_s {
170 u16 heads; // # heads
171 u16 cylinders; // # cylinders
172 u16 spt; // # sectors / track
173};
174
Kevin O'Connorc892b132009-08-11 21:59:37 -0400175struct drive_s {
Kevin O'Connora4bd9192010-02-17 22:55:36 -0500176 u8 type; // Driver type (DTYPE_*)
177 u8 floppy_type; // Type of floppy (only for floppy drives).
178 struct chs_s lchs; // Logical CHS
179 u64 sectors; // Total sectors count
180
181 // Info for EDD calls
182 u16 blksize; // block size
183 struct chs_s pchs; // Physical CHS
184 u8 translation; // type of translation
185
186 // Driver specific
Kevin O'Connor51fd0a12009-09-12 13:20:14 -0400187 u32 cntl_id;
188 u32 cntl_info;
Kevin O'Connora4bd9192010-02-17 22:55:36 -0500189 u8 removable; // Removable device flag
Kevin O'Connor0a924122009-02-08 19:43:47 -0500190 char model[41];
Kevin O'Connor609da232008-12-28 23:18:57 -0500191};
192
Kevin O'Connor36c93a52009-09-12 19:35:04 -0400193#define DISK_SECTOR_SIZE 512
194#define CDROM_SECTOR_SIZE 2048
195
Kevin O'Connor42337662009-08-10 00:06:37 -0400196#define DTYPE_NONE 0x00
Kevin O'Connoraf5aabb2009-08-16 18:48:38 -0400197#define DTYPE_FLOPPY 0x01
Kevin O'Connor42337662009-08-10 00:06:37 -0400198#define DTYPE_ATA 0x02
199#define DTYPE_ATAPI 0x03
Kevin O'Connora3855ad2009-08-16 21:59:40 -0400200#define DTYPE_RAMDISK 0x04
Kevin O'Connor36c93a52009-09-12 19:35:04 -0400201#define DTYPE_CDEMU 0x05
Kevin O'Connor42337662009-08-10 00:06:37 -0400202
203#define TRANSLATION_NONE 0
204#define TRANSLATION_LBA 1
205#define TRANSLATION_LARGE 2
206#define TRANSLATION_RECHS 3
207
Kevin O'Connorc892b132009-08-11 21:59:37 -0400208struct drives_s {
Kevin O'Connord7e998f2010-02-15 22:48:28 -0500209 // map between bios floppy/hd/cd id and drive_s struct
Kevin O'Connor0a0e42e2009-08-16 12:09:44 -0400210 u8 floppycount;
Kevin O'Connor4a16ef62008-12-31 00:09:28 -0500211 u8 cdcount;
Kevin O'Connord7e998f2010-02-15 22:48:28 -0500212 struct drive_s *idmap[3][CONFIG_MAX_EXTDRIVE];
Kevin O'Connor609da232008-12-28 23:18:57 -0500213};
214
Kevin O'Connor0a0e42e2009-08-16 12:09:44 -0400215#define EXTTYPE_FLOPPY 0
216#define EXTTYPE_HD 1
217#define EXTTYPE_CD 2
218
Kevin O'Connor51cfbe72009-08-18 22:38:49 -0400219#define EXTSTART_HD 0x80
220#define EXTSTART_CD 0xE0
221
Kevin O'Connor609da232008-12-28 23:18:57 -0500222
223/****************************************************************
224 * Function defs
225 ****************************************************************/
226
Kevin O'Connorc892b132009-08-11 21:59:37 -0400227// block.c
228extern struct drives_s Drives;
Kevin O'Connor77d227b2009-10-22 21:48:39 -0400229struct drive_s *getDrive(u8 exttype, u8 extdriveoffset);
Kevin O'Connor77d227b2009-10-22 21:48:39 -0400230void setup_translation(struct drive_s *drive_g);
231void map_floppy_drive(struct drive_s *drive_g);
232void map_hd_drive(struct drive_s *drive_g);
233void map_cd_drive(struct drive_s *drive_g);
234void describe_drive(struct drive_s *drive_g);
Kevin O'Connor36c93a52009-09-12 19:35:04 -0400235int process_op(struct disk_op_s *op);
Kevin O'Connoraf5aabb2009-08-16 18:48:38 -0400236int send_disk_op(struct disk_op_s *op);
Kevin O'Connor1ca05b02010-01-03 17:43:37 -0500237void drive_setup(void);
Kevin O'Connor609da232008-12-28 23:18:57 -0500238
Kevin O'Connorf076a3e2008-02-25 22:25:15 -0500239// floppy.c
Kevin O'Connor941d3e42008-03-04 19:45:04 -0500240extern struct floppy_ext_dbt_s diskette_param_table2;
Kevin O'Connor1ca05b02010-01-03 17:43:37 -0500241void floppy_setup(void);
Kevin O'Connor77d227b2009-10-22 21:48:39 -0400242struct drive_s *addFloppy(int floppyid, int ftype, int driver);
243void describe_floppy(struct drive_s *drive_g);
Kevin O'Connora3855ad2009-08-16 21:59:40 -0400244int find_floppy_type(u32 size);
Kevin O'Connoraf5aabb2009-08-16 18:48:38 -0400245int process_floppy_op(struct disk_op_s *op);
Kevin O'Connor1ca05b02010-01-03 17:43:37 -0500246void floppy_tick(void);
Kevin O'Connor786502d2008-02-27 10:41:41 -0500247
Kevin O'Connor31d8c8a2008-03-04 19:56:41 -0500248// cdrom.c
Kevin O'Connor77d227b2009-10-22 21:48:39 -0400249extern struct drive_s *cdemu_drive;
Kevin O'Connor36c93a52009-09-12 19:35:04 -0400250int process_cdemu_op(struct disk_op_s *op);
Kevin O'Connor1ca05b02010-01-03 17:43:37 -0500251void cdemu_setup(void);
Kevin O'Connor31d8c8a2008-03-04 19:56:41 -0500252void cdemu_134b(struct bregs *regs);
Kevin O'Connor7da1dcd2009-02-16 10:51:24 -0500253int cdrom_boot(int cdid);
Kevin O'Connor31d8c8a2008-03-04 19:56:41 -0500254
Kevin O'Connora3855ad2009-08-16 21:59:40 -0400255// ramdisk.c
Kevin O'Connor77d227b2009-10-22 21:48:39 -0400256void describe_ramdisk(struct drive_s *drive_g);
Kevin O'Connor1ca05b02010-01-03 17:43:37 -0500257void ramdisk_setup(void);
Kevin O'Connora3855ad2009-08-16 21:59:40 -0400258int process_ramdisk_op(struct disk_op_s *op);
259
Kevin O'Connor786502d2008-02-27 10:41:41 -0500260#endif // disk.h