mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 06:52:16 +00:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2434 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			894 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			894 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Header file for IDE Bus Driver's Data Structures
 | 
						|
 | 
						|
  Copyright (c) 2006 - 2007 Intel Corporation. <BR>
 | 
						|
  All rights reserved. This program and the accompanying materials                          
 | 
						|
  are licensed and made available under the terms and conditions of the BSD License         
 | 
						|
  which accompanies this distribution.  The full text of the license may be found at        
 | 
						|
  http://opensource.org/licenses/bsd-license.php                                            
 | 
						|
 | 
						|
  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | 
						|
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef _IDE_DATA_H
 | 
						|
#define _IDE_DATA_H
 | 
						|
 | 
						|
//
 | 
						|
// bit definition
 | 
						|
//
 | 
						|
#define bit0  (1 << 0)
 | 
						|
#define bit1  (1 << 1)
 | 
						|
#define bit2  (1 << 2)
 | 
						|
#define bit3  (1 << 3)
 | 
						|
#define bit4  (1 << 4)
 | 
						|
#define bit5  (1 << 5)
 | 
						|
#define bit6  (1 << 6)
 | 
						|
#define bit7  (1 << 7)
 | 
						|
#define bit8  (1 << 8)
 | 
						|
#define bit9  (1 << 9)
 | 
						|
#define bit10 (1 << 10)
 | 
						|
#define bit11 (1 << 11)
 | 
						|
#define bit12 (1 << 12)
 | 
						|
#define bit13 (1 << 13)
 | 
						|
#define bit14 (1 << 14)
 | 
						|
#define bit15 (1 << 15)
 | 
						|
#define bit16 (1 << 16)
 | 
						|
#define bit17 (1 << 17)
 | 
						|
#define bit18 (1 << 18)
 | 
						|
#define bit19 (1 << 19)
 | 
						|
#define bit20 (1 << 20)
 | 
						|
#define bit21 (1 << 21)
 | 
						|
#define bit22 (1 << 22)
 | 
						|
#define bit23 (1 << 23)
 | 
						|
#define bit24 (1 << 24)
 | 
						|
#define bit25 (1 << 25)
 | 
						|
#define bit26 (1 << 26)
 | 
						|
#define bit27 (1 << 27)
 | 
						|
#define bit28 (1 << 28)
 | 
						|
#define bit29 (1 << 29)
 | 
						|
#define bit30 (1 << 30)
 | 
						|
#define bit31 (1 << 31)
 | 
						|
 | 
						|
//
 | 
						|
// common constants
 | 
						|
//
 | 
						|
#define STALL_1_MILLI_SECOND  1000    // stall 1 ms
 | 
						|
#define STALL_1_SECOND        1000000 // stall 1 second
 | 
						|
typedef enum {
 | 
						|
  IdePrimary    = 0,
 | 
						|
  IdeSecondary  = 1,
 | 
						|
  IdeMaxChannel = 2
 | 
						|
} EFI_IDE_CHANNEL;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  IdeMaster     = 0,
 | 
						|
  IdeSlave      = 1,
 | 
						|
  IdeMaxDevice  = 2
 | 
						|
} EFI_IDE_DEVICE;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  IdeMagnetic,                        /* ZIP Drive or LS120 Floppy Drive */
 | 
						|
  IdeCdRom,                           /* ATAPI CDROM */
 | 
						|
  IdeHardDisk,                        /* Hard Disk */
 | 
						|
  Ide48bitAddressingHardDisk,         /* Hard Disk larger than 120GB */
 | 
						|
  IdeUnknown
 | 
						|
} IDE_DEVICE_TYPE;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  SenseNoSenseKey,
 | 
						|
  SenseDeviceNotReadyNoRetry,
 | 
						|
  SenseDeviceNotReadyNeedRetry,
 | 
						|
  SenseNoMedia,
 | 
						|
  SenseMediaChange,
 | 
						|
  SenseMediaError,
 | 
						|
  SenseOtherSense
 | 
						|
} SENSE_RESULT;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  AtaUdmaReadOp,
 | 
						|
  AtaUdmaReadExtOp,
 | 
						|
  AtaUdmaWriteOp,
 | 
						|
  AtaUdmaWriteExtOp
 | 
						|
} ATA_UDMA_OPERATION;
 | 
						|
 | 
						|
//
 | 
						|
// IDE Registers
 | 
						|
//
 | 
						|
typedef union {
 | 
						|
  UINT16  Command;        /* when write */
 | 
						|
  UINT16  Status;         /* when read */
 | 
						|
} IDE_CMD_OR_STATUS;
 | 
						|
 | 
						|
typedef union {
 | 
						|
  UINT16  Error;          /* when read */
 | 
						|
  UINT16  Feature;        /* when write */
 | 
						|
} IDE_ERROR_OR_FEATURE;
 | 
						|
 | 
						|
typedef union {
 | 
						|
  UINT16  AltStatus;      /* when read */
 | 
						|
  UINT16  DeviceControl;  /* when write */
 | 
						|
} IDE_AltStatus_OR_DeviceControl;
 | 
						|
 | 
						|
//
 | 
						|
// IDE registers set
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  UINT16                          Data;
 | 
						|
  IDE_ERROR_OR_FEATURE            Reg1;
 | 
						|
  UINT16                          SectorCount;
 | 
						|
  UINT16                          SectorNumber;
 | 
						|
  UINT16                          CylinderLsb;
 | 
						|
  UINT16                          CylinderMsb;
 | 
						|
  UINT16                          Head;
 | 
						|
  IDE_CMD_OR_STATUS               Reg;
 | 
						|
 | 
						|
  IDE_AltStatus_OR_DeviceControl  Alt;
 | 
						|
  UINT16                          DriveAddress;
 | 
						|
 | 
						|
  UINT16                          MasterSlave;
 | 
						|
  UINT16                          BusMasterBaseAddr;
 | 
						|
} IDE_BASE_REGISTERS;
 | 
						|
 | 
						|
//
 | 
						|
// IDE registers' base addresses
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  UINT16  CommandBlockBaseAddr;
 | 
						|
  UINT16  ControlBlockBaseAddr;
 | 
						|
  UINT16  BusMasterBaseAddr;
 | 
						|
} IDE_REGISTERS_BASE_ADDR;
 | 
						|
 | 
						|
//
 | 
						|
// Bit definitions in Programming Interface byte of the Class Code field
 | 
						|
// in PCI IDE controller's Configuration Space
 | 
						|
//
 | 
						|
#define IDE_PRIMARY_OPERATING_MODE            bit0
 | 
						|
#define IDE_PRIMARY_PROGRAMMABLE_INDICATOR    bit1
 | 
						|
#define IDE_SECONDARY_OPERATING_MODE          bit2
 | 
						|
#define IDE_SECONDARY_PROGRAMMABLE_INDICATOR  bit3
 | 
						|
 | 
						|
//
 | 
						|
// IDE registers bit definitions
 | 
						|
//
 | 
						|
 | 
						|
//
 | 
						|
// Err Reg
 | 
						|
//
 | 
						|
#define BBK_ERR   bit7  /* Bad block detected */
 | 
						|
#define UNC_ERR   bit6  /* Uncorrectable Data */
 | 
						|
#define MC_ERR    bit5  /* Media Change */
 | 
						|
#define IDNF_ERR  bit4  /* ID Not Found */
 | 
						|
#define MCR_ERR   bit3  /* Media Change Requested */
 | 
						|
#define ABRT_ERR  bit2  /* Aborted Command */
 | 
						|
#define TK0NF_ERR bit1  /* Track 0 Not Found */
 | 
						|
#define AMNF_ERR  bit0  /* Address Mark Not Found */
 | 
						|
 | 
						|
//
 | 
						|
// Device/Head Reg
 | 
						|
//
 | 
						|
#define LBA_MODE  bit6
 | 
						|
#define DEV       bit4
 | 
						|
#define HS3       bit3
 | 
						|
#define HS2       bit2
 | 
						|
#define HS1       bit1
 | 
						|
#define HS0       bit0
 | 
						|
#define CHS_MODE  (0)
 | 
						|
#define DRV0      (0)
 | 
						|
#define DRV1      (1)
 | 
						|
#define MST_DRV   DRV0
 | 
						|
#define SLV_DRV   DRV1
 | 
						|
 | 
						|
//
 | 
						|
// Status Reg
 | 
						|
//
 | 
						|
#define BSY   bit7  /* Controller Busy */
 | 
						|
#define DRDY  bit6  /* Drive Ready */
 | 
						|
#define DWF   bit5  /* Drive Write Fault */
 | 
						|
#define DSC   bit4  /* Disk Seek Complete */
 | 
						|
#define DRQ   bit3  /* Data Request */
 | 
						|
#define CORR  bit2  /* Corrected Data */
 | 
						|
#define IDX   bit1  /* Index */
 | 
						|
#define ERR   bit0  /* Error */
 | 
						|
 | 
						|
//
 | 
						|
// Device Control Reg
 | 
						|
//
 | 
						|
#define SRST  bit2  /* Software Reset */
 | 
						|
#define IEN_L bit1  /* Interrupt Enable #*/
 | 
						|
 | 
						|
//
 | 
						|
// Bus Master Reg
 | 
						|
//
 | 
						|
#define BMIC_nREAD      bit3
 | 
						|
#define BMIC_START      bit0
 | 
						|
#define BMIS_INTERRUPT  bit2
 | 
						|
#define BMIS_ERROR      bit1
 | 
						|
 | 
						|
#define BMICP_OFFSET    0x00
 | 
						|
#define BMISP_OFFSET    0x02
 | 
						|
#define BMIDP_OFFSET    0x04
 | 
						|
#define BMICS_OFFSET    0x08
 | 
						|
#define BMISS_OFFSET    0x0A
 | 
						|
#define BMIDS_OFFSET    0x0C
 | 
						|
 | 
						|
//
 | 
						|
// Time Out Value For IDE Device Polling
 | 
						|
//
 | 
						|
 | 
						|
//
 | 
						|
// ATATIMEOUT is used for waiting time out for ATA device
 | 
						|
//
 | 
						|
 | 
						|
//
 | 
						|
// 1 second
 | 
						|
//
 | 
						|
#define ATATIMEOUT  1000  
 | 
						|
 | 
						|
//
 | 
						|
// ATAPITIMEOUT is used for waiting operation
 | 
						|
// except read and write time out for ATAPI device
 | 
						|
//
 | 
						|
 | 
						|
//
 | 
						|
// 1 second
 | 
						|
//
 | 
						|
#define ATAPITIMEOUT  1000 
 | 
						|
 | 
						|
//
 | 
						|
// ATAPILONGTIMEOUT is used for waiting read and
 | 
						|
// write operation timeout for ATAPI device
 | 
						|
//
 | 
						|
 | 
						|
//
 | 
						|
// 2 seconds
 | 
						|
//
 | 
						|
#define CDROMLONGTIMEOUT  2000  
 | 
						|
 | 
						|
//
 | 
						|
// 5 seconds
 | 
						|
//
 | 
						|
#define ATAPILONGTIMEOUT  5000  
 | 
						|
 | 
						|
//
 | 
						|
// 10 seconds
 | 
						|
//
 | 
						|
#define ATASMARTTIMEOUT   10000
 | 
						|
 | 
						|
//
 | 
						|
// ATA Commands Code
 | 
						|
//
 | 
						|
#define ATA_INITIALIZE_DEVICE 0x91
 | 
						|
 | 
						|
//
 | 
						|
// Class 1
 | 
						|
//
 | 
						|
#define IDENTIFY_DRIVE_CMD          0xec
 | 
						|
#define READ_BUFFER_CMD             0xe4
 | 
						|
#define READ_SECTORS_CMD            0x20
 | 
						|
#define READ_SECTORS_WITH_RETRY_CMD 0x21
 | 
						|
#define READ_LONG_CMD               0x22
 | 
						|
#define READ_LONG_WITH_RETRY_CMD    0x23
 | 
						|
//
 | 
						|
// Class 1 - Atapi6 enhanced commands
 | 
						|
//
 | 
						|
#define READ_SECTORS_EXT_CMD  0x24
 | 
						|
 | 
						|
//
 | 
						|
// Class 2
 | 
						|
//
 | 
						|
#define FORMAT_TRACK_CMD              0x50
 | 
						|
#define WRITE_BUFFER_CMD              0xe8
 | 
						|
#define WRITE_SECTORS_CMD             0x30
 | 
						|
#define WRITE_SECTORS_WITH_RETRY_CMD  0x31
 | 
						|
#define WRITE_LONG_CMD                0x32
 | 
						|
#define WRITE_LONG_WITH_RETRY_CMD     0x33
 | 
						|
#define WRITE_VERIFY_CMD              0x3c
 | 
						|
//
 | 
						|
// Class 2 - Atapi6 enhanced commands
 | 
						|
//
 | 
						|
#define WRITE_SECTORS_EXT_CMD 0x34
 | 
						|
 | 
						|
//
 | 
						|
// Class 3
 | 
						|
//
 | 
						|
#define ACK_MEDIA_CHANGE_CMD        0xdb
 | 
						|
#define BOOT_POST_BOOT_CMD          0xdc
 | 
						|
#define BOOT_PRE_BOOT_CMD           0xdd
 | 
						|
#define CHECK_POWER_MODE_CMD        0x98
 | 
						|
#define CHECK_POWER_MODE_CMD_ALIAS  0xe5
 | 
						|
#define DOOR_LOCK_CMD               0xde
 | 
						|
#define DOOR_UNLOCK_CMD             0xdf
 | 
						|
#define EXEC_DRIVE_DIAG_CMD         0x90
 | 
						|
#define IDLE_CMD_ALIAS              0x97
 | 
						|
#define IDLE_CMD                    0xe3
 | 
						|
#define IDLE_IMMEDIATE_CMD          0x95
 | 
						|
#define IDLE_IMMEDIATE_CMD_ALIAS    0xe1
 | 
						|
#define INIT_DRIVE_PARAM_CMD        0x91
 | 
						|
#define RECALIBRATE_CMD             0x10  /* aliased to 1x */
 | 
						|
#define READ_DRIVE_STATE_CMD        0xe9
 | 
						|
#define SET_MULTIPLE_MODE_CMD       0xC6
 | 
						|
#define READ_DRIVE_STATE_CMD        0xe9
 | 
						|
#define READ_VERIFY_CMD             0x40
 | 
						|
#define READ_VERIFY_WITH_RETRY_CMD  0x41
 | 
						|
#define SEEK_CMD                    0x70  /* aliased to 7x */
 | 
						|
#define SET_FEATURES_CMD            0xef
 | 
						|
#define STANDBY_CMD                 0x96
 | 
						|
#define STANDBY_CMD_ALIAS           0xe2
 | 
						|
#define STANDBY_IMMEDIATE_CMD       0x94
 | 
						|
#define STANDBY_IMMEDIATE_CMD_ALIAS 0xe0
 | 
						|
 | 
						|
//
 | 
						|
// Class 4
 | 
						|
//
 | 
						|
#define READ_DMA_CMD              0xc8
 | 
						|
#define READ_DMA_WITH_RETRY_CMD   0xc9
 | 
						|
#define READ_DMA_EXT_CMD          0x25
 | 
						|
#define WRITE_DMA_CMD             0xca
 | 
						|
#define WRITE_DMA_WITH_RETRY_CMD  0xcb
 | 
						|
#define WRITE_DMA_EXT_CMD         0x35
 | 
						|
 | 
						|
//
 | 
						|
// Class 5
 | 
						|
//
 | 
						|
#define READ_MULTIPLE_CMD         0xc4
 | 
						|
#define REST_CMD                  0xe7
 | 
						|
#define RESTORE_DRIVE_STATE_CMD   0xea
 | 
						|
#define SET_SLEEP_MODE_CMD        0x99
 | 
						|
#define SET_SLEEP_MODE_CMD_ALIAS  0xe6
 | 
						|
#define WRITE_MULTIPLE_CMD        0xc5
 | 
						|
#define WRITE_SAME_CMD            0xe9
 | 
						|
 | 
						|
//
 | 
						|
// Class 6 - Host protected area access feature set
 | 
						|
//
 | 
						|
#define READ_NATIVE_MAX_ADDRESS_CMD 0xf8
 | 
						|
#define SET_MAX_ADDRESS_CMD         0xf9
 | 
						|
 | 
						|
//
 | 
						|
// Class 6 - ATA/ATAPI-6 enhanced commands
 | 
						|
//
 | 
						|
#define READ_NATIVE_MAX_ADDRESS_EXT_CMD 0x27
 | 
						|
#define SET_MAX_ADDRESS_CMD_EXT         0x37
 | 
						|
 | 
						|
//
 | 
						|
// Class 6 - SET_MAX related sub command (in feature register)
 | 
						|
//
 | 
						|
#define PARTIES_SET_MAX_ADDRESS_SUB_CMD 0x00
 | 
						|
#define PARTIES_SET_PASSWORD_SUB_CMD    0x01
 | 
						|
#define PARTIES_LOCK_SUB_CMD            0x02
 | 
						|
#define PARTIES_UNLOCK_SUB_CMD          0x03
 | 
						|
#define PARTIES_FREEZE_SUB_CMD          0x04
 | 
						|
 | 
						|
//
 | 
						|
// S.M.A.R.T
 | 
						|
//
 | 
						|
#define ATA_SMART_CMD               0xb0
 | 
						|
#define ATA_CONSTANT_C2             0xc2
 | 
						|
#define ATA_CONSTANT_4F             0x4f
 | 
						|
#define ATA_SMART_ENABLE_OPERATION  0xd8
 | 
						|
#define ATA_SMART_RETURN_STATUS     0xda
 | 
						|
 | 
						|
//
 | 
						|
// Error codes for Exec Drive Diag
 | 
						|
//
 | 
						|
#define DRIV_DIAG_NO_ERROR          (0x01)
 | 
						|
#define DRIV_DIAG_FORMATTER_ERROR   (0x02)
 | 
						|
#define DRIV_DIAG_DATA_BUFFER_ERROR (0x03)
 | 
						|
#define DRIV_DIAG_ECC_CKT_ERRROR    (0x04)
 | 
						|
#define DRIV_DIAG_UP_ERROR          (0x05)
 | 
						|
#define DRIV_DIAG_SLAVE_DRV_ERROR   (0x80)  /* aliased to 0x8x */
 | 
						|
 | 
						|
//
 | 
						|
// Codes for Format Track
 | 
						|
//
 | 
						|
#define FORMAT_GOOD_SECTOR            (0x00)
 | 
						|
#define FORMAT_SUSPEND_ALLOC          (0x01)
 | 
						|
#define FORMAT_REALLOC_SECTOR         (0x02)
 | 
						|
#define FORMAT_MARK_SECTOR_DEFECTIVE  (0x03)
 | 
						|
 | 
						|
//
 | 
						|
// IDE_IDENTIFY bits
 | 
						|
// config bits :
 | 
						|
//
 | 
						|
#define ID_CONFIG_RESERVED0                             bit0
 | 
						|
#define ID_CONFIG_HARD_SECTORED_DRIVE                   bit1
 | 
						|
#define ID_CONFIG_SOFT_SECTORED_DRIVE                   bit2
 | 
						|
#define ID_CONFIG_NON_MFM                               bit3
 | 
						|
#define ID_CONFIG_15uS_HEAD_SWITCHING                   bit4
 | 
						|
#define ID_CONFIG_SPINDLE_MOTOR_CONTROL                 bit5
 | 
						|
#define ID_CONFIG_HARD_DRIVE                            bit6
 | 
						|
#define ID_CONFIG_CHANGEABLE_MEDIUM                     bit7
 | 
						|
#define ID_CONFIG_DATA_RATE_TO_5MHZ                     bit8
 | 
						|
#define ID_CONFIG_DATA_RATE_5_TO_10MHZ                  bit9
 | 
						|
#define ID_CONFIG_DATA_RATE_ABOVE_10MHZ                 bit10
 | 
						|
#define ID_CONFIG_MOTOR_SPEED_TOLERANCE_ABOVE_0_5_PERC  bit11
 | 
						|
#define ID_CONFIG_DATA_CLK_OFFSET_AVAIL                 bit12
 | 
						|
#define ID_CONFIG_TRACK_OFFSET_AVAIL                    bit13
 | 
						|
#define ID_CONFIG_SPEED_TOLERANCE_GAP_NECESSARY         bit14
 | 
						|
#define ID_CONFIG_RESERVED1                             bit15
 | 
						|
 | 
						|
#define ID_DOUBLE_WORD_IO_POSSIBLE                      bit01
 | 
						|
#define ID_LBA_SUPPORTED                                bit9
 | 
						|
#define ID_DMA_SUPPORTED                                bit8
 | 
						|
 | 
						|
#define SET_FEATURE_ENABLE_8BIT_TRANSFER                (0x01)
 | 
						|
#define SET_FEATURE_ENABLE_WRITE_CACHE                  (0x02)
 | 
						|
#define SET_FEATURE_TRANSFER_MODE                       (0x03)
 | 
						|
#define SET_FEATURE_WRITE_SAME_WRITE_SPECIFIC_AREA      (0x22)
 | 
						|
#define SET_FEATURE_DISABLE_RETRIES                     (0x33)
 | 
						|
//
 | 
						|
// for Read & Write Longs
 | 
						|
//
 | 
						|
#define SET_FEATURE_VENDOR_SPEC_ECC_LENGTH                          (0x44)
 | 
						|
#define SET_FEATURE_PLACE_NO_OF_CACHE_SEGMENTS_IN_SECTOR_NO_REG     (0x54)
 | 
						|
#define SET_FEATURE_DISABLE_READ_AHEAD                              (0x55)
 | 
						|
#define SET_FEATURE_MAINTAIN_PARAM_AFTER_RESET                      (0x66)
 | 
						|
#define SET_FEATURE_DISABLE_ECC                                     (0x77)
 | 
						|
#define SET_FEATURE_DISABLE_8BIT_TRANSFER                           (0x81)
 | 
						|
#define SET_FEATURE_DISABLE_WRITE_CACHE                             (0x82)
 | 
						|
#define SET_FEATURE_ENABLE_ECC                                      (0x88)
 | 
						|
#define SET_FEATURE_ENABLE_RETRIES                                  (0x99)
 | 
						|
#define SET_FEATURE_ENABLE_READ_AHEAD                               (0xaa)
 | 
						|
#define SET_FEATURE_SET_SECTOR_CNT_REG_AS_NO_OF_READ_AHEAD_SECTORS  (0xab)
 | 
						|
#define SET_FEATURE_ALLOW_REST_MODE                                 (0xac)
 | 
						|
//
 | 
						|
// for Read & Write Longs
 | 
						|
//
 | 
						|
#define SET_FEATURE_4BYTE_ECC                           (0xbb)
 | 
						|
#define SET_FEATURE_DEFALUT_FEATURES_ON_SOFTWARE_RESET  (0xcc)
 | 
						|
#define SET_FEATURE_WRITE_SAME_TO_WRITE_ENTIRE_MEDIUM   (0xdd)
 | 
						|
 | 
						|
#define BLOCK_TRANSFER_MODE                             (0x00)
 | 
						|
#define SINGLE_WORD_DMA_TRANSFER_MODE                   (0x10)
 | 
						|
#define MULTI_WORD_DMA_TRANSFER_MODE                    (0x20)
 | 
						|
#define TRANSFER_MODE_MASK                              (0x07)  // 3 LSBs
 | 
						|
 | 
						|
//
 | 
						|
// Drive 0 - Head 0
 | 
						|
//
 | 
						|
#define DEFAULT_DRIVE (0x00)
 | 
						|
#define DEFAULT_CMD   (0xa0)
 | 
						|
//
 | 
						|
// default content of device control register, disable INT
 | 
						|
//
 | 
						|
#define DEFAULT_CTL                 (0x0a)
 | 
						|
#define DEFAULT_IDE_BM_IO_BASE_ADR  (0xffa0)
 | 
						|
 | 
						|
//
 | 
						|
// ATAPI6 related data structure definition
 | 
						|
//
 | 
						|
 | 
						|
//
 | 
						|
// The maximum sectors count in 28 bit addressing mode
 | 
						|
//
 | 
						|
#define MAX_28BIT_ADDRESSING_CAPACITY 0xfffffff
 | 
						|
 | 
						|
//
 | 
						|
// Move the IDENTIFY section to DXE\Protocol\IdeControllerInit
 | 
						|
//
 | 
						|
 | 
						|
//
 | 
						|
// ATAPI Command
 | 
						|
//
 | 
						|
#define ATAPI_SOFT_RESET_CMD      0x08
 | 
						|
#define ATAPI_PACKET_CMD          0xA0
 | 
						|
#define PACKET_CMD                0xA0
 | 
						|
#define ATAPI_IDENTIFY_DEVICE_CMD 0xA1
 | 
						|
#define ATAPI_SERVICE_CMD         0xA2
 | 
						|
 | 
						|
//
 | 
						|
// ATAPI Packet Command
 | 
						|
//
 | 
						|
#pragma pack(1)
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 opcode;
 | 
						|
  UINT8 reserved_1;
 | 
						|
  UINT8 reserved_2;
 | 
						|
  UINT8 reserved_3;
 | 
						|
  UINT8 reserved_4;
 | 
						|
  UINT8 reserved_5;
 | 
						|
  UINT8 reserved_6;
 | 
						|
  UINT8 reserved_7;
 | 
						|
  UINT8 reserved_8;
 | 
						|
  UINT8 reserved_9;
 | 
						|
  UINT8 reserved_10;
 | 
						|
  UINT8 reserved_11;
 | 
						|
} TEST_UNIT_READY_CMD;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 opcode;
 | 
						|
  UINT8 reserved_1 : 4;
 | 
						|
  UINT8 lun : 4;
 | 
						|
  UINT8 page_code;
 | 
						|
  UINT8 reserved_3;
 | 
						|
  UINT8 allocation_length;
 | 
						|
  UINT8 reserved_5;
 | 
						|
  UINT8 reserved_6;
 | 
						|
  UINT8 reserved_7;
 | 
						|
  UINT8 reserved_8;
 | 
						|
  UINT8 reserved_9;
 | 
						|
  UINT8 reserved_10;
 | 
						|
  UINT8 reserved_11;
 | 
						|
} INQUIRY_CMD;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 opcode;
 | 
						|
  UINT8 reserved_1 : 4;
 | 
						|
  UINT8 lun : 4;
 | 
						|
  UINT8 reserved_2;
 | 
						|
  UINT8 reserved_3;
 | 
						|
  UINT8 allocation_length;
 | 
						|
  UINT8 reserved_5;
 | 
						|
  UINT8 reserved_6;
 | 
						|
  UINT8 reserved_7;
 | 
						|
  UINT8 reserved_8;
 | 
						|
  UINT8 reserved_9;
 | 
						|
  UINT8 reserved_10;
 | 
						|
  UINT8 reserved_11;
 | 
						|
} REQUEST_SENSE_CMD;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 opcode;
 | 
						|
  UINT8 reserved_1 : 4;
 | 
						|
  UINT8 lun : 4;
 | 
						|
  UINT8 page_code : 4;
 | 
						|
  UINT8 page_control : 4;
 | 
						|
  UINT8 reserved_3;
 | 
						|
  UINT8 reserved_4;
 | 
						|
  UINT8 reserved_5;
 | 
						|
  UINT8 reserved_6;
 | 
						|
  UINT8 parameter_list_length_hi;
 | 
						|
  UINT8 parameter_list_length_lo;
 | 
						|
  UINT8 reserved_9;
 | 
						|
  UINT8 reserved_10;
 | 
						|
  UINT8 reserved_11;
 | 
						|
} MODE_SENSE_CMD;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 opcode;
 | 
						|
  UINT8 reserved_1 : 5;
 | 
						|
  UINT8 lun : 3;
 | 
						|
  UINT8 Lba0;
 | 
						|
  UINT8 Lba1;
 | 
						|
  UINT8 Lba2;
 | 
						|
  UINT8 Lba3;
 | 
						|
  UINT8 reserved_6;
 | 
						|
  UINT8 TranLen0;
 | 
						|
  UINT8 TranLen1;
 | 
						|
  UINT8 reserved_9;
 | 
						|
  UINT8 reserved_10;
 | 
						|
  UINT8 reserved_11;
 | 
						|
} READ10_CMD;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 opcode;
 | 
						|
  UINT8 reserved_1;
 | 
						|
  UINT8 reserved_2;
 | 
						|
  UINT8 reserved_3;
 | 
						|
  UINT8 reserved_4;
 | 
						|
  UINT8 reserved_5;
 | 
						|
  UINT8 reserved_6;
 | 
						|
  UINT8 allocation_length_hi;
 | 
						|
  UINT8 allocation_length_lo;
 | 
						|
  UINT8 reserved_9;
 | 
						|
  UINT8 reserved_10;
 | 
						|
  UINT8 reserved_11;
 | 
						|
} READ_FORMAT_CAP_CMD;
 | 
						|
 | 
						|
typedef union {
 | 
						|
  UINT16              Data16[6];
 | 
						|
  TEST_UNIT_READY_CMD TestUnitReady;
 | 
						|
  READ10_CMD          Read10;
 | 
						|
  REQUEST_SENSE_CMD   RequestSence;
 | 
						|
  INQUIRY_CMD         Inquiry;
 | 
						|
  MODE_SENSE_CMD      ModeSense;
 | 
						|
  READ_FORMAT_CAP_CMD ReadFormatCapacity;
 | 
						|
} ATAPI_PACKET_COMMAND;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT32  RegionBaseAddr;
 | 
						|
  UINT16  ByteCount;
 | 
						|
  UINT16  EndOfTable;
 | 
						|
} IDE_DMA_PRD;
 | 
						|
 | 
						|
#define MAX_DMA_EXT_COMMAND_SECTORS 0x10000
 | 
						|
#define MAX_DMA_COMMAND_SECTORS     0x100
 | 
						|
 | 
						|
#pragma pack()
 | 
						|
 | 
						|
//
 | 
						|
// Packet Command Code
 | 
						|
//
 | 
						|
#define TEST_UNIT_READY             0x00
 | 
						|
#define REZERO                      0x01
 | 
						|
#define REQUEST_SENSE               0x03
 | 
						|
#define FORMAT_UNIT                 0x04
 | 
						|
#define REASSIGN_BLOCKS             0x07
 | 
						|
#define INQUIRY                     0x12
 | 
						|
#define START_STOP_UNIT             0x1B
 | 
						|
#define PREVENT_ALLOW_MEDIA_REMOVAL 0x1E
 | 
						|
#define READ_FORMAT_CAPACITY        0x23
 | 
						|
#define OLD_FORMAT_UNIT             0x24
 | 
						|
#define READ_CAPACITY               0x25
 | 
						|
#define READ_10                     0x28
 | 
						|
#define WRITE_10                    0x2A
 | 
						|
#define SEEK                        0x2B
 | 
						|
#define SEND_DIAGNOSTICS            0x3D
 | 
						|
#define WRITE_VERIFY                0x2E
 | 
						|
#define VERIFY                      0x2F
 | 
						|
#define READ_DEFECT_DATA            0x37
 | 
						|
#define WRITE_BUFFER                0x38
 | 
						|
#define READ_BUFFER                 0x3C
 | 
						|
#define READ_LONG                   0x3E
 | 
						|
#define WRITE_LONG                  0x3F
 | 
						|
#define MODE_SELECT                 0x55
 | 
						|
#define MODE_SENSE                  0x5A
 | 
						|
#define READ_12                     0xA8
 | 
						|
#define WRITE_12                    0xAA
 | 
						|
#define MAX_ATAPI_BYTE_COUNT        (0xfffe)
 | 
						|
 | 
						|
//
 | 
						|
// Sense Key
 | 
						|
//
 | 
						|
#define REQUEST_SENSE_ERROR (0x70)
 | 
						|
#define SK_NO_SENSE         (0x0)
 | 
						|
#define SK_RECOVERY_ERROR   (0x1)
 | 
						|
#define SK_NOT_READY        (0x2)
 | 
						|
#define SK_MEDIUM_ERROR     (0x3)
 | 
						|
#define SK_HARDWARE_ERROR   (0x4)
 | 
						|
#define SK_ILLEGAL_REQUEST  (0x5)
 | 
						|
#define SK_UNIT_ATTENTION   (0x6)
 | 
						|
#define SK_DATA_PROTECT     (0x7)
 | 
						|
#define SK_BLANK_CHECK      (0x8)
 | 
						|
#define SK_VENDOR_SPECIFIC  (0x9)
 | 
						|
#define SK_RESERVED_A       (0xA)
 | 
						|
#define SK_ABORT            (0xB)
 | 
						|
#define SK_RESERVED_C       (0xC)
 | 
						|
#define SK_OVERFLOW         (0xD)
 | 
						|
#define SK_MISCOMPARE       (0xE)
 | 
						|
#define SK_RESERVED_F       (0xF)
 | 
						|
 | 
						|
//
 | 
						|
// Additional Sense Codes
 | 
						|
//
 | 
						|
#define ASC_NOT_READY                   (0x04)
 | 
						|
#define ASC_MEDIA_ERR1                  (0x10)
 | 
						|
#define ASC_MEDIA_ERR2                  (0x11)
 | 
						|
#define ASC_MEDIA_ERR3                  (0x14)
 | 
						|
#define ASC_MEDIA_ERR4                  (0x30)
 | 
						|
#define ASC_MEDIA_UPSIDE_DOWN           (0x06)
 | 
						|
#define ASC_INVALID_CMD                 (0x20)
 | 
						|
#define ASC_LBA_OUT_OF_RANGE            (0x21)
 | 
						|
#define ASC_INVALID_FIELD               (0x24)
 | 
						|
#define ASC_WRITE_PROTECTED             (0x27)
 | 
						|
#define ASC_MEDIA_CHANGE                (0x28)
 | 
						|
#define ASC_RESET                       (0x29)  /* Power On Reset or Bus Reset occurred */
 | 
						|
#define ASC_ILLEGAL_FIELD               (0x26)
 | 
						|
#define ASC_NO_MEDIA                    (0x3A)
 | 
						|
#define ASC_ILLEGAL_MODE_FOR_THIS_TRACK (0x64)
 | 
						|
 | 
						|
//
 | 
						|
// Additional Sense Code Qualifier
 | 
						|
//
 | 
						|
#define ASCQ_IN_PROGRESS  (0x01)
 | 
						|
 | 
						|
#define SETFEATURE        TRUE
 | 
						|
#define CLEARFEATURE      FALSE
 | 
						|
 | 
						|
//
 | 
						|
//  ATAPI Data structure
 | 
						|
//
 | 
						|
#pragma pack(1)
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 peripheral_type;
 | 
						|
  UINT8 RMB;
 | 
						|
  UINT8 version;
 | 
						|
  UINT8 response_data_format;
 | 
						|
  UINT8 addnl_length;
 | 
						|
  UINT8 reserved_5;
 | 
						|
  UINT8 reserved_6;
 | 
						|
  UINT8 reserved_7;
 | 
						|
  UINT8 vendor_info[8];
 | 
						|
  UINT8 product_id[12];
 | 
						|
  UINT8 eeprom_product_code[4];
 | 
						|
  UINT8 firmware_rev_level[4];
 | 
						|
  UINT8 firmware_sub_rev_level[1];
 | 
						|
  UINT8 reserved_37;
 | 
						|
  UINT8 reserved_38;
 | 
						|
  UINT8 reserved_39;
 | 
						|
  UINT8 max_capacity_hi;
 | 
						|
  UINT8 max_capacity_mid;
 | 
						|
  UINT8 max_capacity_lo;
 | 
						|
  UINT8 reserved_43_95[95 - 43 + 1];
 | 
						|
} INQUIRY_DATA;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 peripheral_type;
 | 
						|
  UINT8 RMB;
 | 
						|
  UINT8 version;
 | 
						|
  UINT8 response_data_format;
 | 
						|
  UINT8 addnl_length;
 | 
						|
  UINT8 reserved_5;
 | 
						|
  UINT8 reserved_6;
 | 
						|
  UINT8 reserved_7;
 | 
						|
  UINT8 vendor_info[8];
 | 
						|
  UINT8 product_id[16];
 | 
						|
  UINT8 product_revision_level[4];
 | 
						|
  UINT8 vendor_specific[20];
 | 
						|
  UINT8 reserved_56_95[40];
 | 
						|
} CDROM_INQUIRY_DATA;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 error_code : 7;
 | 
						|
  UINT8 valid : 1;
 | 
						|
  UINT8 reserved_1;
 | 
						|
  UINT8 sense_key : 4;
 | 
						|
  UINT8 reserved_21 : 1;
 | 
						|
  UINT8 ILI : 1;
 | 
						|
  UINT8 reserved_22 : 2;
 | 
						|
  UINT8 vendor_specific_3;
 | 
						|
  UINT8 vendor_specific_4;
 | 
						|
  UINT8 vendor_specific_5;
 | 
						|
  UINT8 vendor_specific_6;
 | 
						|
  UINT8 addnl_sense_length;           // n - 7
 | 
						|
  UINT8 vendor_specific_8;
 | 
						|
  UINT8 vendor_specific_9;
 | 
						|
  UINT8 vendor_specific_10;
 | 
						|
  UINT8 vendor_specific_11;
 | 
						|
  UINT8 addnl_sense_code;             // mandatory
 | 
						|
  UINT8 addnl_sense_code_qualifier;   // mandatory
 | 
						|
  UINT8 field_replaceable_unit_code;  // optional
 | 
						|
  UINT8 reserved_15;
 | 
						|
  UINT8 reserved_16;
 | 
						|
  UINT8 reserved_17;
 | 
						|
  //
 | 
						|
  // Followed by additional sense bytes     : FIXME
 | 
						|
  //
 | 
						|
} REQUEST_SENSE_DATA;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 LastLba3;
 | 
						|
  UINT8 LastLba2;
 | 
						|
  UINT8 LastLba1;
 | 
						|
  UINT8 LastLba0;
 | 
						|
  UINT8 BlockSize3;
 | 
						|
  UINT8 BlockSize2;
 | 
						|
  UINT8 BlockSize1;
 | 
						|
  UINT8 BlockSize0;
 | 
						|
} READ_CAPACITY_DATA;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 reserved_0;
 | 
						|
  UINT8 reserved_1;
 | 
						|
  UINT8 reserved_2;
 | 
						|
  UINT8 Capacity_Length;
 | 
						|
  UINT8 LastLba3;
 | 
						|
  UINT8 LastLba2;
 | 
						|
  UINT8 LastLba1;
 | 
						|
  UINT8 LastLba0;
 | 
						|
  UINT8 DesCode : 2;
 | 
						|
  UINT8 reserved_9 : 6;
 | 
						|
  UINT8 BlockSize2;
 | 
						|
  UINT8 BlockSize1;
 | 
						|
  UINT8 BlockSize0;
 | 
						|
} READ_FORMAT_CAPACITY_DATA;
 | 
						|
 | 
						|
#pragma pack()
 | 
						|
 | 
						|
//
 | 
						|
// PIO mode definition
 | 
						|
//
 | 
						|
typedef enum {
 | 
						|
  ATA_PIO_MODE_BELOW_2,
 | 
						|
  ATA_PIO_MODE_2,
 | 
						|
  ATA_PIO_MODE_3,
 | 
						|
  ATA_PIO_MODE_4
 | 
						|
} ATA_PIO_MODE;
 | 
						|
 | 
						|
//
 | 
						|
// Multi word DMA definition
 | 
						|
//
 | 
						|
typedef enum {
 | 
						|
  ATA_MDMA_MODE_0,
 | 
						|
  ATA_MDMA_MODE_1,
 | 
						|
  ATA_MDMA_MODE_2
 | 
						|
} ATA_MDMA_MODE;
 | 
						|
 | 
						|
//
 | 
						|
// UDMA mode definition
 | 
						|
//
 | 
						|
typedef enum {
 | 
						|
  ATA_UDMA_MODE_0,
 | 
						|
  ATA_UDMA_MODE_1,
 | 
						|
  ATA_UDMA_MODE_2,
 | 
						|
  ATA_UDMA_MODE_3,
 | 
						|
  ATA_UDMA_MODE_4,
 | 
						|
  ATA_UDMA_MODE_5
 | 
						|
} ATA_UDMA_MODE;
 | 
						|
 | 
						|
#define ATA_MODE_CATEGORY_DEFAULT_PIO 0x00
 | 
						|
#define ATA_MODE_CATEGORY_FLOW_PIO    0x01
 | 
						|
#define ATA_MODE_CATEGORY_MDMA        0x04
 | 
						|
#define ATA_MODE_CATEGORY_UDMA        0x08
 | 
						|
 | 
						|
#pragma pack(1)
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 ModeNumber : 3;
 | 
						|
  UINT8 ModeCategory : 5;
 | 
						|
} ATA_TRANSFER_MODE;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT8 Sector;
 | 
						|
  UINT8 Heads;
 | 
						|
  UINT8 MultipleSector;
 | 
						|
} ATA_DRIVE_PARMS;
 | 
						|
 | 
						|
#pragma pack()
 | 
						|
//
 | 
						|
// IORDY Sample Point field value
 | 
						|
//
 | 
						|
#define ISP_5_CLK 0
 | 
						|
#define ISP_4_CLK 1
 | 
						|
#define ISP_3_CLK 2
 | 
						|
#define ISP_2_CLK 3
 | 
						|
 | 
						|
//
 | 
						|
// Recovery Time field value
 | 
						|
//
 | 
						|
#define RECVY_4_CLK 0
 | 
						|
#define RECVY_3_CLK 1
 | 
						|
#define RECVY_2_CLK 2
 | 
						|
#define RECVY_1_CLK 3
 | 
						|
 | 
						|
//
 | 
						|
// Slave IDE Timing Register Enable
 | 
						|
//
 | 
						|
#define SITRE bit14
 | 
						|
 | 
						|
//
 | 
						|
// DMA Timing Enable Only Select 1
 | 
						|
//
 | 
						|
#define DTE1  bit7
 | 
						|
 | 
						|
//
 | 
						|
// Pre-fetch and Posting Enable Select 1
 | 
						|
//
 | 
						|
#define PPE1  bit6
 | 
						|
 | 
						|
//
 | 
						|
// IORDY Sample Point Enable Select 1
 | 
						|
//
 | 
						|
#define IE1 bit5
 | 
						|
 | 
						|
//
 | 
						|
// Fast Timing Bank Drive Select 1
 | 
						|
//
 | 
						|
#define TIME1 bit4
 | 
						|
 | 
						|
//
 | 
						|
// DMA Timing Enable Only Select 0
 | 
						|
//
 | 
						|
#define DTE0  bit3
 | 
						|
 | 
						|
//
 | 
						|
// Pre-fetch and Posting Enable Select 0
 | 
						|
//
 | 
						|
#define PPE0  bit2
 | 
						|
 | 
						|
//
 | 
						|
// IOREY Sample Point Enable Select 0
 | 
						|
//
 | 
						|
#define IE0 bit1
 | 
						|
 | 
						|
//
 | 
						|
// Fast Timing Bank Drive Select 0
 | 
						|
//
 | 
						|
#define TIME0 bit0
 | 
						|
 | 
						|
#endif
 |