]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/IdeData.h
fef54328b2b68639aec2dfa4244b812605bd32a3
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Pci / IdeBusDxe / IdeData.h
1 /** @file
2 Header file for IDE Bus Driver's Data Structures
3
4 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7 **/
8
9 #ifndef _IDE_DATA_H_
10 #define _IDE_DATA_H_
11
12 #include <IndustryStandard/Atapi.h>
13
14 //
15 // common constants
16 //
17 #define STALL_1_MILLI_SECOND 1000 // stall 1 ms
18 #define STALL_1_SECOND 1000000 // stall 1 second
19 typedef enum {
20 IdePrimary = 0,
21 IdeSecondary = 1,
22 IdeMaxChannel = 2
23 } EFI_IDE_CHANNEL;
24
25 typedef enum {
26 IdeMaster = 0,
27 IdeSlave = 1,
28 IdeMaxDevice = 2
29 } EFI_IDE_DEVICE;
30
31 typedef enum {
32 IdeMagnetic, /* ZIP Drive or LS120 Floppy Drive */
33 IdeCdRom, /* ATAPI CDROM */
34 IdeHardDisk, /* Hard Disk */
35 Ide48bitAddressingHardDisk, /* Hard Disk larger than 120GB */
36 IdeUnknown
37 } IDE_DEVICE_TYPE;
38
39 typedef enum {
40 SenseNoSenseKey,
41 SenseDeviceNotReadyNoRetry,
42 SenseDeviceNotReadyNeedRetry,
43 SenseNoMedia,
44 SenseMediaChange,
45 SenseMediaError,
46 SenseOtherSense
47 } SENSE_RESULT;
48
49 typedef enum {
50 AtaUdmaReadOp,
51 AtaUdmaReadExtOp,
52 AtaUdmaWriteOp,
53 AtaUdmaWriteExtOp
54 } ATA_UDMA_OPERATION;
55
56 //
57 // IDE Registers
58 //
59 typedef union {
60 UINT16 Command; /* when write */
61 UINT16 Status; /* when read */
62 } IDE_CMD_OR_STATUS;
63
64 typedef union {
65 UINT16 Error; /* when read */
66 UINT16 Feature; /* when write */
67 } IDE_ERROR_OR_FEATURE;
68
69 typedef union {
70 UINT16 AltStatus; /* when read */
71 UINT16 DeviceControl; /* when write */
72 } IDE_ALTSTATUS_OR_DEVICECONTROL;
73
74 //
75 // IDE registers set
76 //
77 typedef struct {
78 UINT16 Data;
79 IDE_ERROR_OR_FEATURE Reg1;
80 UINT16 SectorCount;
81 UINT16 SectorNumber;
82 UINT16 CylinderLsb;
83 UINT16 CylinderMsb;
84 UINT16 Head;
85 IDE_CMD_OR_STATUS Reg;
86
87 IDE_ALTSTATUS_OR_DEVICECONTROL Alt;
88 UINT16 DriveAddress;
89
90 UINT16 MasterSlave;
91 UINT16 BusMasterBaseAddr;
92 } IDE_BASE_REGISTERS;
93
94 //
95 // IDE registers' base addresses
96 //
97 typedef struct {
98 UINT16 CommandBlockBaseAddr;
99 UINT16 ControlBlockBaseAddr;
100 UINT16 BusMasterBaseAddr;
101 } IDE_REGISTERS_BASE_ADDR;
102
103 //
104 // Bit definitions in Programming Interface byte of the Class Code field
105 // in PCI IDE controller's Configuration Space
106 //
107 #define IDE_PRIMARY_OPERATING_MODE BIT0
108 #define IDE_PRIMARY_PROGRAMMABLE_INDICATOR BIT1
109 #define IDE_SECONDARY_OPERATING_MODE BIT2
110 #define IDE_SECONDARY_PROGRAMMABLE_INDICATOR BIT3
111
112
113 //
114 // Bus Master Reg
115 //
116 #define BMIC_NREAD BIT3
117 #define BMIC_START BIT0
118 #define BMIS_INTERRUPT BIT2
119 #define BMIS_ERROR BIT1
120
121 #define BMICP_OFFSET 0x00
122 #define BMISP_OFFSET 0x02
123 #define BMIDP_OFFSET 0x04
124 #define BMICS_OFFSET 0x08
125 #define BMISS_OFFSET 0x0A
126 #define BMIDS_OFFSET 0x0C
127
128 //
129 // Time Out Value For IDE Device Polling
130 //
131
132 //
133 // ATATIMEOUT is used for waiting time out for ATA device
134 //
135
136 //
137 // 1 second
138 //
139 #define ATATIMEOUT 1000
140
141 //
142 // ATAPITIMEOUT is used for waiting operation
143 // except read and write time out for ATAPI device
144 //
145
146 //
147 // 1 second
148 //
149 #define ATAPITIMEOUT 1000
150
151 //
152 // ATAPILONGTIMEOUT is used for waiting read and
153 // write operation timeout for ATAPI device
154 //
155
156 //
157 // 2 seconds
158 //
159 #define CDROMLONGTIMEOUT 2000
160
161 //
162 // 5 seconds
163 //
164 #define ATAPILONGTIMEOUT 5000
165
166 //
167 // 10 seconds
168 //
169 #define ATASMARTTIMEOUT 10000
170
171
172 //
173 // ATAPI6 related data structure definition
174 //
175
176 //
177 // The maximum sectors count in 28 bit addressing mode
178 //
179 #define MAX_28BIT_ADDRESSING_CAPACITY 0xfffffff
180
181 #pragma pack(1)
182
183 typedef struct {
184 UINT32 RegionBaseAddr;
185 UINT16 ByteCount;
186 UINT16 EndOfTable;
187 } IDE_DMA_PRD;
188
189 #pragma pack()
190
191 #define SETFEATURE TRUE
192 #define CLEARFEATURE FALSE
193
194 ///
195 /// PIO mode definition
196 ///
197 typedef enum _ATA_PIO_MODE_ {
198 AtaPioModeBelow2,
199 AtaPioMode2,
200 AtaPioMode3,
201 AtaPioMode4
202 } ATA_PIO_MODE;
203
204 //
205 // Multi word DMA definition
206 //
207 typedef enum _ATA_MDMA_MODE_ {
208 AtaMdmaMode0,
209 AtaMdmaMode1,
210 AtaMdmaMode2
211 } ATA_MDMA_MODE;
212
213 //
214 // UDMA mode definition
215 //
216 typedef enum _ATA_UDMA_MODE_ {
217 AtaUdmaMode0,
218 AtaUdmaMode1,
219 AtaUdmaMode2,
220 AtaUdmaMode3,
221 AtaUdmaMode4,
222 AtaUdmaMode5
223 } ATA_UDMA_MODE;
224
225 #define ATA_MODE_CATEGORY_DEFAULT_PIO 0x00
226 #define ATA_MODE_CATEGORY_FLOW_PIO 0x01
227 #define ATA_MODE_CATEGORY_MDMA 0x04
228 #define ATA_MODE_CATEGORY_UDMA 0x08
229
230 #pragma pack(1)
231
232 typedef struct {
233 UINT8 ModeNumber : 3;
234 UINT8 ModeCategory : 5;
235 } ATA_TRANSFER_MODE;
236
237 typedef struct {
238 UINT8 Sector;
239 UINT8 Heads;
240 UINT8 MultipleSector;
241 } ATA_DRIVE_PARMS;
242
243 #pragma pack()
244 //
245 // IORDY Sample Point field value
246 //
247 #define ISP_5_CLK 0
248 #define ISP_4_CLK 1
249 #define ISP_3_CLK 2
250 #define ISP_2_CLK 3
251
252 //
253 // Recovery Time field value
254 //
255 #define RECVY_4_CLK 0
256 #define RECVY_3_CLK 1
257 #define RECVY_2_CLK 2
258 #define RECVY_1_CLK 3
259
260 //
261 // Slave IDE Timing Register Enable
262 //
263 #define SITRE BIT14
264
265 //
266 // DMA Timing Enable Only Select 1
267 //
268 #define DTE1 BIT7
269
270 //
271 // Pre-fetch and Posting Enable Select 1
272 //
273 #define PPE1 BIT6
274
275 //
276 // IORDY Sample Point Enable Select 1
277 //
278 #define IE1 BIT5
279
280 //
281 // Fast Timing Bank Drive Select 1
282 //
283 #define TIME1 BIT4
284
285 //
286 // DMA Timing Enable Only Select 0
287 //
288 #define DTE0 BIT3
289
290 //
291 // Pre-fetch and Posting Enable Select 0
292 //
293 #define PPE0 BIT2
294
295 //
296 // IOREY Sample Point Enable Select 0
297 //
298 #define IE0 BIT1
299
300 //
301 // Fast Timing Bank Drive Select 0
302 //
303 #define TIME0 BIT0
304
305 #endif