2 Header file for IDE Bus Driver's Data Structures
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
31 #define bit10 (1 << 10)
32 #define bit11 (1 << 11)
33 #define bit12 (1 << 12)
34 #define bit13 (1 << 13)
35 #define bit14 (1 << 14)
36 #define bit15 (1 << 15)
37 #define bit16 (1 << 16)
38 #define bit17 (1 << 17)
39 #define bit18 (1 << 18)
40 #define bit19 (1 << 19)
41 #define bit20 (1 << 20)
42 #define bit21 (1 << 21)
43 #define bit22 (1 << 22)
44 #define bit23 (1 << 23)
45 #define bit24 (1 << 24)
46 #define bit25 (1 << 25)
47 #define bit26 (1 << 26)
48 #define bit27 (1 << 27)
49 #define bit28 (1 << 28)
50 #define bit29 (1 << 29)
51 #define bit30 (1 << 30)
52 #define bit31 (1 << 31)
57 #define STALL_1_MILLI_SECOND 1000 // stall 1 ms
58 #define STALL_1_SECOND 1000000 // stall 1 second
72 IdeMagnetic
, /* ZIP Drive or LS120 Floppy Drive */
73 IdeCdRom
, /* ATAPI CDROM */
74 IdeHardDisk
, /* Hard Disk */
75 Ide48bitAddressingHardDisk
, /* Hard Disk larger than 120GB */
81 SenseDeviceNotReadyNoRetry
,
82 SenseDeviceNotReadyNeedRetry
,
93 UINT16 Command
; /* when write */
94 UINT16 Status
; /* when read */
98 UINT16 Error
; /* when read */
99 UINT16 Feature
; /* when write */
100 } IDE_ERROR_OR_FEATURE
;
103 UINT16 AltStatus
; /* when read */
104 UINT16 DeviceControl
; /* when write */
105 } IDE_AltStatus_OR_DeviceControl
;
112 IDE_ERROR_OR_FEATURE Reg1
;
118 IDE_CMD_OR_STATUS Reg
;
120 IDE_AltStatus_OR_DeviceControl Alt
;
124 UINT16 BusMasterBaseAddr
;
125 } IDE_BASE_REGISTERS
;
128 // IDE registers' base addresses
131 UINT16 CommandBlockBaseAddr
;
132 UINT16 ControlBlockBaseAddr
;
133 UINT16 BusMasterBaseAddr
;
134 } IDE_REGISTERS_BASE_ADDR
;
137 // Bit definitions in Programming Interface byte of the Class Code field
138 // in PCI IDE controller's Configuration Space
140 #define IDE_PRIMARY_OPERATING_MODE bit0
141 #define IDE_PRIMARY_PROGRAMMABLE_INDICATOR bit1
142 #define IDE_SECONDARY_OPERATING_MODE bit2
143 #define IDE_SECONDARY_PROGRAMMABLE_INDICATOR bit3
146 // IDE registers bit definitions
152 #define BBK_ERR bit7 /* Bad block detected */
153 #define UNC_ERR bit6 /* Uncorrectable Data */
154 #define MC_ERR bit5 /* Media Change */
155 #define IDNF_ERR bit4 /* ID Not Found */
156 #define MCR_ERR bit3 /* Media Change Requested */
157 #define ABRT_ERR bit2 /* Aborted Command */
158 #define TK0NF_ERR bit1 /* Track 0 Not Found */
159 #define AMNF_ERR bit0 /* Address Mark Not Found */
164 #define LBA_MODE bit6
179 #define BSY bit7 /* Controller Busy */
180 #define DRDY bit6 /* Drive Ready */
181 #define DWF bit5 /* Drive Write Fault */
182 #define DSC bit4 /* Disk Seek Complete */
183 #define DRQ bit3 /* Data Request */
184 #define CORR bit2 /* Corrected Data */
185 #define IDX bit1 /* Index */
186 #define ERR bit0 /* Error */
189 // Device Control Reg
191 #define SRST bit2 /* Software Reset */
192 #define IEN_L bit1 /* Interrupt Enable #*/
197 #define BMIC_nREAD bit3
198 #define BMIC_START bit0
199 #define BMIS_INTERRUPT bit2
200 #define BMIS_ERROR bit1
202 #define BMICP_OFFSET 0x00
203 #define BMISP_OFFSET 0x02
204 #define BMIDP_OFFSET 0x04
205 #define BMICS_OFFSET 0x08
206 #define BMISS_OFFSET 0x0A
207 #define BMIDS_OFFSET 0x0C
210 // Time Out Value For IDE Device Polling
214 // ATATIMEOUT is used for waiting time out for ATA device
220 #define ATATIMEOUT 1000
223 // ATAPITIMEOUT is used for waiting operation
224 // except read and write time out for ATAPI device
230 #define ATAPITIMEOUT 1000
233 // ATAPILONGTIMEOUT is used for waiting read and
234 // write operation timeout for ATAPI device
240 #define CDROMLONGTIMEOUT 2000
245 #define ATAPILONGTIMEOUT 5000
250 #define ATASMARTTIMEOUT 10000
255 #define ATA_INITIALIZE_DEVICE 0x91
260 #define IDENTIFY_DRIVE_CMD 0xec
261 #define READ_BUFFER_CMD 0xe4
262 #define READ_SECTORS_CMD 0x20
263 #define READ_SECTORS_WITH_RETRY_CMD 0x21
264 #define READ_LONG_CMD 0x22
265 #define READ_LONG_WITH_RETRY_CMD 0x23
267 // Class 1 - Atapi6 enhanced commands
269 #define READ_SECTORS_EXT_CMD 0x24
274 #define FORMAT_TRACK_CMD 0x50
275 #define WRITE_BUFFER_CMD 0xe8
276 #define WRITE_SECTORS_CMD 0x30
277 #define WRITE_SECTORS_WITH_RETRY_CMD 0x31
278 #define WRITE_LONG_CMD 0x32
279 #define WRITE_LONG_WITH_RETRY_CMD 0x33
280 #define WRITE_VERIFY_CMD 0x3c
282 // Class 2 - Atapi6 enhanced commands
284 #define WRITE_SECTORS_EXT_CMD 0x34
289 #define ACK_MEDIA_CHANGE_CMD 0xdb
290 #define BOOT_POST_BOOT_CMD 0xdc
291 #define BOOT_PRE_BOOT_CMD 0xdd
292 #define CHECK_POWER_MODE_CMD 0x98
293 #define CHECK_POWER_MODE_CMD_ALIAS 0xe5
294 #define DOOR_LOCK_CMD 0xde
295 #define DOOR_UNLOCK_CMD 0xdf
296 #define EXEC_DRIVE_DIAG_CMD 0x90
297 #define IDLE_CMD_ALIAS 0x97
298 #define IDLE_CMD 0xe3
299 #define IDLE_IMMEDIATE_CMD 0x95
300 #define IDLE_IMMEDIATE_CMD_ALIAS 0xe1
301 #define INIT_DRIVE_PARAM_CMD 0x91
302 #define RECALIBRATE_CMD 0x10 /* aliased to 1x */
303 #define READ_DRIVE_STATE_CMD 0xe9
304 #define SET_MULTIPLE_MODE_CMD 0xC6
305 #define READ_DRIVE_STATE_CMD 0xe9
306 #define READ_VERIFY_CMD 0x40
307 #define READ_VERIFY_WITH_RETRY_CMD 0x41
308 #define SEEK_CMD 0x70 /* aliased to 7x */
309 #define SET_FEATURES_CMD 0xef
310 #define STANDBY_CMD 0x96
311 #define STANDBY_CMD_ALIAS 0xe2
312 #define STANDBY_IMMEDIATE_CMD 0x94
313 #define STANDBY_IMMEDIATE_CMD_ALIAS 0xe0
318 #define READ_DMA_CMD 0xc8
319 #define READ_DMA_WITH_RETRY_CMD 0xc9
320 #define READ_DMA_EXT_CMD 0x25
321 #define WRITE_DMA_CMD 0xca
322 #define WRITE_DMA_WITH_RETRY_CMD 0xcb
323 #define WRITE_DMA_EXT_CMD 0x35
328 #define READ_MULTIPLE_CMD 0xc4
329 #define REST_CMD 0xe7
330 #define RESTORE_DRIVE_STATE_CMD 0xea
331 #define SET_SLEEP_MODE_CMD 0x99
332 #define SET_SLEEP_MODE_CMD_ALIAS 0xe6
333 #define WRITE_MULTIPLE_CMD 0xc5
334 #define WRITE_SAME_CMD 0xe9
337 // Class 6 - Host protected area access feature set
339 #define READ_NATIVE_MAX_ADDRESS_CMD 0xf8
340 #define SET_MAX_ADDRESS_CMD 0xf9
343 // Class 6 - ATA/ATAPI-6 enhanced commands
345 #define READ_NATIVE_MAX_ADDRESS_EXT_CMD 0x27
346 #define SET_MAX_ADDRESS_CMD_EXT 0x37
349 // Class 6 - SET_MAX related sub command (in feature register)
351 #define PARTIES_SET_MAX_ADDRESS_SUB_CMD 0x00
352 #define PARTIES_SET_PASSWORD_SUB_CMD 0x01
353 #define PARTIES_LOCK_SUB_CMD 0x02
354 #define PARTIES_UNLOCK_SUB_CMD 0x03
355 #define PARTIES_FREEZE_SUB_CMD 0x04
360 #define ATA_SMART_CMD 0xb0
361 #define ATA_CONSTANT_C2 0xc2
362 #define ATA_CONSTANT_4F 0x4f
363 #define ATA_SMART_ENABLE_OPERATION 0xd8
364 #define ATA_SMART_RETURN_STATUS 0xda
367 // Error codes for Exec Drive Diag
369 #define DRIV_DIAG_NO_ERROR (0x01)
370 #define DRIV_DIAG_FORMATTER_ERROR (0x02)
371 #define DRIV_DIAG_DATA_BUFFER_ERROR (0x03)
372 #define DRIV_DIAG_ECC_CKT_ERRROR (0x04)
373 #define DRIV_DIAG_UP_ERROR (0x05)
374 #define DRIV_DIAG_SLAVE_DRV_ERROR (0x80) /* aliased to 0x8x */
377 // Codes for Format Track
379 #define FORMAT_GOOD_SECTOR (0x00)
380 #define FORMAT_SUSPEND_ALLOC (0x01)
381 #define FORMAT_REALLOC_SECTOR (0x02)
382 #define FORMAT_MARK_SECTOR_DEFECTIVE (0x03)
388 #define ID_CONFIG_RESERVED0 bit0
389 #define ID_CONFIG_HARD_SECTORED_DRIVE bit1
390 #define ID_CONFIG_SOFT_SECTORED_DRIVE bit2
391 #define ID_CONFIG_NON_MFM bit3
392 #define ID_CONFIG_15uS_HEAD_SWITCHING bit4
393 #define ID_CONFIG_SPINDLE_MOTOR_CONTROL bit5
394 #define ID_CONFIG_HARD_DRIVE bit6
395 #define ID_CONFIG_CHANGEABLE_MEDIUM bit7
396 #define ID_CONFIG_DATA_RATE_TO_5MHZ bit8
397 #define ID_CONFIG_DATA_RATE_5_TO_10MHZ bit9
398 #define ID_CONFIG_DATA_RATE_ABOVE_10MHZ bit10
399 #define ID_CONFIG_MOTOR_SPEED_TOLERANCE_ABOVE_0_5_PERC bit11
400 #define ID_CONFIG_DATA_CLK_OFFSET_AVAIL bit12
401 #define ID_CONFIG_TRACK_OFFSET_AVAIL bit13
402 #define ID_CONFIG_SPEED_TOLERANCE_GAP_NECESSARY bit14
403 #define ID_CONFIG_RESERVED1 bit15
405 #define ID_DOUBLE_WORD_IO_POSSIBLE bit01
406 #define ID_LBA_SUPPORTED bit9
407 #define ID_DMA_SUPPORTED bit8
409 #define SET_FEATURE_ENABLE_8BIT_TRANSFER (0x01)
410 #define SET_FEATURE_ENABLE_WRITE_CACHE (0x02)
411 #define SET_FEATURE_TRANSFER_MODE (0x03)
412 #define SET_FEATURE_WRITE_SAME_WRITE_SPECIFIC_AREA (0x22)
413 #define SET_FEATURE_DISABLE_RETRIES (0x33)
415 // for Read & Write Longs
417 #define SET_FEATURE_VENDOR_SPEC_ECC_LENGTH (0x44)
418 #define SET_FEATURE_PLACE_NO_OF_CACHE_SEGMENTS_IN_SECTOR_NO_REG (0x54)
419 #define SET_FEATURE_DISABLE_READ_AHEAD (0x55)
420 #define SET_FEATURE_MAINTAIN_PARAM_AFTER_RESET (0x66)
421 #define SET_FEATURE_DISABLE_ECC (0x77)
422 #define SET_FEATURE_DISABLE_8BIT_TRANSFER (0x81)
423 #define SET_FEATURE_DISABLE_WRITE_CACHE (0x82)
424 #define SET_FEATURE_ENABLE_ECC (0x88)
425 #define SET_FEATURE_ENABLE_RETRIES (0x99)
426 #define SET_FEATURE_ENABLE_READ_AHEAD (0xaa)
427 #define SET_FEATURE_SET_SECTOR_CNT_REG_AS_NO_OF_READ_AHEAD_SECTORS (0xab)
428 #define SET_FEATURE_ALLOW_REST_MODE (0xac)
430 // for Read & Write Longs
432 #define SET_FEATURE_4BYTE_ECC (0xbb)
433 #define SET_FEATURE_DEFALUT_FEATURES_ON_SOFTWARE_RESET (0xcc)
434 #define SET_FEATURE_WRITE_SAME_TO_WRITE_ENTIRE_MEDIUM (0xdd)
436 #define BLOCK_TRANSFER_MODE (0x00)
437 #define SINGLE_WORD_DMA_TRANSFER_MODE (0x10)
438 #define MULTI_WORD_DMA_TRANSFER_MODE (0x20)
439 #define TRANSFER_MODE_MASK (0x07) // 3 LSBs
444 #define DEFAULT_DRIVE (0x00)
445 #define DEFAULT_CMD (0xa0)
447 // default content of device control register, disable INT
449 #define DEFAULT_CTL (0x0a)
450 #define DEFAULT_IDE_BM_IO_BASE_ADR (0xffa0)
453 // ATAPI6 related data structure definition
457 // The maximum sectors count in 28 bit addressing mode
459 #define MAX_28BIT_ADDRESSING_CAPACITY 0xfffffff
462 // Move the IDENTIFY section to DXE\Protocol\IdeControllerInit
468 #define ATAPI_SOFT_RESET_CMD 0x08
469 #define ATAPI_PACKET_CMD 0xA0
470 #define PACKET_CMD 0xA0
471 #define ATAPI_IDENTIFY_DEVICE_CMD 0xA1
472 #define ATAPI_SERVICE_CMD 0xA2
475 // ATAPI Packet Command
492 } TEST_UNIT_READY_CMD
;
496 UINT8 reserved_1
: 4;
500 UINT8 allocation_length
;
512 UINT8 reserved_1
: 4;
516 UINT8 allocation_length
;
528 UINT8 reserved_1
: 4;
531 UINT8 page_control
: 4;
536 UINT8 parameter_list_length_hi
;
537 UINT8 parameter_list_length_lo
;
545 UINT8 reserved_1
: 5;
567 UINT8 allocation_length_hi
;
568 UINT8 allocation_length_lo
;
572 } READ_FORMAT_CAP_CMD
;
576 TEST_UNIT_READY_CMD TestUnitReady
;
578 REQUEST_SENSE_CMD RequestSence
;
580 MODE_SENSE_CMD ModeSense
;
581 READ_FORMAT_CAP_CMD ReadFormatCapacity
;
582 } ATAPI_PACKET_COMMAND
;
585 UINT32 RegionBaseAddr
;
590 #define MAX_DMA_EXT_COMMAND_SECTORS 0x10000
591 #define MAX_DMA_COMMAND_SECTORS 0x100
596 // Packet Command Code
598 #define TEST_UNIT_READY 0x00
600 #define REQUEST_SENSE 0x03
601 #define FORMAT_UNIT 0x04
602 #define REASSIGN_BLOCKS 0x07
604 #define START_STOP_UNIT 0x1B
605 #define PREVENT_ALLOW_MEDIA_REMOVAL 0x1E
606 #define READ_FORMAT_CAPACITY 0x23
607 #define OLD_FORMAT_UNIT 0x24
608 #define READ_CAPACITY 0x25
610 #define WRITE_10 0x2A
612 #define SEND_DIAGNOSTICS 0x3D
613 #define WRITE_VERIFY 0x2E
615 #define READ_DEFECT_DATA 0x37
616 #define WRITE_BUFFER 0x38
617 #define READ_BUFFER 0x3C
618 #define READ_LONG 0x3E
619 #define WRITE_LONG 0x3F
620 #define MODE_SELECT 0x55
621 #define MODE_SENSE 0x5A
623 #define WRITE_12 0xAA
624 #define MAX_ATAPI_BYTE_COUNT (0xfffe)
629 #define REQUEST_SENSE_ERROR (0x70)
630 #define SK_NO_SENSE (0x0)
631 #define SK_RECOVERY_ERROR (0x1)
632 #define SK_NOT_READY (0x2)
633 #define SK_MEDIUM_ERROR (0x3)
634 #define SK_HARDWARE_ERROR (0x4)
635 #define SK_ILLEGAL_REQUEST (0x5)
636 #define SK_UNIT_ATTENTION (0x6)
637 #define SK_DATA_PROTECT (0x7)
638 #define SK_BLANK_CHECK (0x8)
639 #define SK_VENDOR_SPECIFIC (0x9)
640 #define SK_RESERVED_A (0xA)
641 #define SK_ABORT (0xB)
642 #define SK_RESERVED_C (0xC)
643 #define SK_OVERFLOW (0xD)
644 #define SK_MISCOMPARE (0xE)
645 #define SK_RESERVED_F (0xF)
648 // Additional Sense Codes
650 #define ASC_NOT_READY (0x04)
651 #define ASC_MEDIA_ERR1 (0x10)
652 #define ASC_MEDIA_ERR2 (0x11)
653 #define ASC_MEDIA_ERR3 (0x14)
654 #define ASC_MEDIA_ERR4 (0x30)
655 #define ASC_MEDIA_UPSIDE_DOWN (0x06)
656 #define ASC_INVALID_CMD (0x20)
657 #define ASC_LBA_OUT_OF_RANGE (0x21)
658 #define ASC_INVALID_FIELD (0x24)
659 #define ASC_WRITE_PROTECTED (0x27)
660 #define ASC_MEDIA_CHANGE (0x28)
661 #define ASC_RESET (0x29) /* Power On Reset or Bus Reset occurred */
662 #define ASC_ILLEGAL_FIELD (0x26)
663 #define ASC_NO_MEDIA (0x3A)
664 #define ASC_ILLEGAL_MODE_FOR_THIS_TRACK (0x64)
667 // Additional Sense Code Qualifier
669 #define ASCQ_IN_PROGRESS (0x01)
671 #define SETFEATURE TRUE
672 #define CLEARFEATURE FALSE
675 // ATAPI Data structure
680 UINT8 peripheral_type
;
683 UINT8 response_data_format
;
688 UINT8 vendor_info
[8];
689 UINT8 product_id
[12];
690 UINT8 eeprom_product_code
[4];
691 UINT8 firmware_rev_level
[4];
692 UINT8 firmware_sub_rev_level
[1];
696 UINT8 max_capacity_hi
;
697 UINT8 max_capacity_mid
;
698 UINT8 max_capacity_lo
;
699 UINT8 reserved_43_95
[95 - 43 + 1];
703 UINT8 peripheral_type
;
706 UINT8 response_data_format
;
711 UINT8 vendor_info
[8];
712 UINT8 product_id
[16];
713 UINT8 product_revision_level
[4];
714 UINT8 vendor_specific
[20];
715 UINT8 reserved_56_95
[40];
716 } CDROM_INQUIRY_DATA
;
719 UINT8 error_code
: 7;
723 UINT8 reserved_21
: 1;
725 UINT8 reserved_22
: 2;
726 UINT8 vendor_specific_3
;
727 UINT8 vendor_specific_4
;
728 UINT8 vendor_specific_5
;
729 UINT8 vendor_specific_6
;
730 UINT8 addnl_sense_length
; // n - 7
731 UINT8 vendor_specific_8
;
732 UINT8 vendor_specific_9
;
733 UINT8 vendor_specific_10
;
734 UINT8 vendor_specific_11
;
735 UINT8 addnl_sense_code
; // mandatory
736 UINT8 addnl_sense_code_qualifier
; // mandatory
737 UINT8 field_replaceable_unit_code
; // optional
742 // Followed by additional sense bytes : FIXME
744 } REQUEST_SENSE_DATA
;
755 } READ_CAPACITY_DATA
;
761 UINT8 Capacity_Length
;
767 UINT8 reserved_9
: 6;
771 } READ_FORMAT_CAPACITY_DATA
;
776 // PIO mode definition
779 ATA_PIO_MODE_BELOW_2
,
786 // Multi word DMA definition
795 // UDMA mode definition
806 #define ATA_MODE_CATEGORY_DEFAULT_PIO 0x00
807 #define ATA_MODE_CATEGORY_FLOW_PIO 0x01
808 #define ATA_MODE_CATEGORY_MDMA 0x04
809 #define ATA_MODE_CATEGORY_UDMA 0x08
814 UINT8 ModeNumber
: 3;
815 UINT8 ModeCategory
: 5;
821 UINT8 MultipleSector
;
826 // IORDY Sample Point field value
834 // Recovery Time field value
836 #define RECVY_4_CLK 0
837 #define RECVY_3_CLK 1
838 #define RECVY_2_CLK 2
839 #define RECVY_1_CLK 3
842 // Slave IDE Timing Register Enable
847 // DMA Timing Enable Only Select 1
852 // Pre-fetch and Posting Enable Select 1
857 // IORDY Sample Point Enable Select 1
862 // Fast Timing Bank Drive Select 1
867 // DMA Timing Enable Only Select 0
872 // Pre-fetch and Posting Enable Select 0
877 // IOREY Sample Point Enable Select 0
882 // Fast Timing Bank Drive Select 0