blob: 5e7d0fb340b90e871b995e15a3c930d9e95396ef [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//
5// This file may be distributed under the terms of the GNU GPLv3 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'Connorf076a3e2008-02-25 22:25:15 -050011
Kevin O'Connore43df9e2008-03-01 22:16:32 -050012#define DISK_RET_SUCCESS 0x00
13#define DISK_RET_EPARAM 0x01
Kevin O'Connorb74102d2008-03-03 21:57:30 -050014#define DISK_RET_EADDRNOTFOUND 0x02
15#define DISK_RET_EWRITEPROTECT 0x03
Kevin O'Connore43df9e2008-03-01 22:16:32 -050016#define DISK_RET_ECHANGED 0x06
17#define DISK_RET_EBOUNDARY 0x09
18#define DISK_RET_EBADTRACK 0x0c
19#define DISK_RET_ECONTROLLER 0x20
20#define DISK_RET_ETIMEOUT 0x80
Kevin O'Connorb74102d2008-03-03 21:57:30 -050021#define DISK_RET_ENOTLOCKED 0xb0
22#define DISK_RET_ELOCKED 0xb1
Kevin O'Connore43df9e2008-03-01 22:16:32 -050023#define DISK_RET_ENOTREMOVABLE 0xb2
Kevin O'Connorb74102d2008-03-03 21:57:30 -050024#define DISK_RET_ETOOMANYLOCKS 0xb4
Kevin O'Connore43df9e2008-03-01 22:16:32 -050025#define DISK_RET_EMEDIA 0xC0
26#define DISK_RET_ENOTREADY 0xAA
27
Kevin O'Connor609da232008-12-28 23:18:57 -050028
29/****************************************************************
30 * Interface structs
31 ****************************************************************/
32
Kevin O'Connore43df9e2008-03-01 22:16:32 -050033// Bios disk structures.
34struct int13ext_s {
35 u8 size;
36 u8 reserved;
37 u16 count;
38 u16 offset;
39 u16 segment;
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'Connor31d8c8a2008-03-04 19:56:41 -0500104
Kevin O'Connor609da232008-12-28 23:18:57 -0500105
106/****************************************************************
Kevin O'Connor4524bf72008-12-31 00:31:03 -0500107 * Disk command request
108 ****************************************************************/
109
110struct disk_op_s {
111 u64 lba;
112 void *far_buffer;
113 u16 count;
114 u8 driveid;
115 u8 command;
116};
117
118#define CMD_CDROM_READ 1
119#define CMD_CDEMU_READ 2
120
121
122/****************************************************************
Kevin O'Connor609da232008-12-28 23:18:57 -0500123 * Global storage
124 ****************************************************************/
125
126struct chs_s {
127 u16 heads; // # heads
128 u16 cylinders; // # cylinders
129 u16 spt; // # sectors / track
130};
131
132struct ata_channel_s {
133 u16 iobase1; // IO Base 1
134 u16 iobase2; // IO Base 2
135 u16 pci_bdf;
136 u8 irq; // IRQ
137};
138
139struct ata_device_s {
140 u8 type; // Detected type of ata (ata/atapi/none/unknown)
141 u8 device; // Detected type of attached devices (hd/cd/none)
142 u8 removable; // Removable device flag
143 u8 mode; // transfer mode : PIO 16/32 bits - IRQ - ISADMA - PCIDMA
144 u16 blksize; // block size
145
146 u8 translation; // type of translation
147 struct chs_s lchs; // Logical CHS
148 struct chs_s pchs; // Physical CHS
149
150 u64 sectors; // Total sectors count
151};
152
153struct ata_s {
154 // ATA channels info
155 struct ata_channel_s channels[CONFIG_MAX_ATA_INTERFACES];
156
157 // ATA devices info
158 struct ata_device_s devices[CONFIG_MAX_ATA_DEVICES];
159 //
160 // map between bios hd/cd id and ata channels
Kevin O'Connor4a16ef62008-12-31 00:09:28 -0500161 u8 cdcount;
Kevin O'Connor609da232008-12-28 23:18:57 -0500162 u8 idmap[2][CONFIG_MAX_ATA_DEVICES];
163};
164
Kevin O'Connor609da232008-12-28 23:18:57 -0500165
166/****************************************************************
167 * Function defs
168 ****************************************************************/
169
170// ata.c
171extern struct ata_s ATA;
Kevin O'Connor4524bf72008-12-31 00:31:03 -0500172int ata_cmd_data(struct disk_op_s *op);
173int cdrom_read(struct disk_op_s *op);
174int cdrom_read_512(struct disk_op_s *op);
175int ata_cmd_packet(int driveid, u8 *cmdbuf, u8 cmdlen
176 , u32 length, void *far_buffer);
177void ata_reset(int driveid);
178void hard_drive_setup();
Kevin O'Connor609da232008-12-28 23:18:57 -0500179
Kevin O'Connorf076a3e2008-02-25 22:25:15 -0500180// floppy.c
Kevin O'Connor941d3e42008-03-04 19:45:04 -0500181extern struct floppy_ext_dbt_s diskette_param_table2;
Kevin O'Connor3bbcc142008-04-13 17:07:33 -0400182void floppy_drive_setup();
Kevin O'Connorf076a3e2008-02-25 22:25:15 -0500183void floppy_13(struct bregs *regs, u8 drive);
184void floppy_tick();
Kevin O'Connor786502d2008-02-27 10:41:41 -0500185
Kevin O'Connor31d8c8a2008-03-04 19:56:41 -0500186// disk.c
Kevin O'Connor31d8c8a2008-03-04 19:56:41 -0500187void disk_13(struct bregs *regs, u8 device);
188void disk_13XX(struct bregs *regs, u8 device);
189
190// cdrom.c
191void cdrom_13(struct bregs *regs, u8 device);
192void cdemu_13(struct bregs *regs);
193void cdemu_134b(struct bregs *regs);
Kevin O'Connora05223c2008-06-28 12:15:57 -0400194int cdrom_boot();
Kevin O'Connor31d8c8a2008-03-04 19:56:41 -0500195
Kevin O'Connor786502d2008-02-27 10:41:41 -0500196#endif // disk.h