mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-26 23:24:03 +02:00
add native ide/ahci driver
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10901 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
22c5a7af03
commit
a41b5272cd
2010
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c
Normal file
2010
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c
Normal file
File diff suppressed because it is too large
Load Diff
464
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h
Normal file
464
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h
Normal file
@ -0,0 +1,464 @@
|
|||||||
|
/** @file
|
||||||
|
Header file for AHCI mode of ATA host controller.
|
||||||
|
|
||||||
|
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
|
||||||
|
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 __ATA_HC_AHCI_MODE_H__
|
||||||
|
#define __ATA_HC_AHCI_MODE_H__
|
||||||
|
|
||||||
|
#define EFI_AHCI_BAR_INDEX 0x05
|
||||||
|
|
||||||
|
#define EFI_AHCI_CAPABILITY_OFFSET 0x0000
|
||||||
|
#define EFI_AHCI_GHC_OFFSET 0x0004
|
||||||
|
#define EFI_AHCI_GHC_RESET BIT0
|
||||||
|
#define EFI_AHCI_GHC_IE BIT1
|
||||||
|
#define EFI_AHCI_GHC_ENABLE BIT31
|
||||||
|
#define EFI_AHCI_IS_OFFSET 0x0008
|
||||||
|
#define EFI_AHCI_PI_OFFSET 0x000C
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 Lower32;
|
||||||
|
UINT32 Upper32;
|
||||||
|
} DATA_32;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
DATA_32 Uint32;
|
||||||
|
UINT64 Uint64;
|
||||||
|
} DATA_64;
|
||||||
|
|
||||||
|
#define EFI_AHCI_ATAPI_DEVICE_SIG 0xEB140000
|
||||||
|
#define EFI_AHCI_ATA_DEVICE_SIG 0x00000000
|
||||||
|
#define EFI_AHCI_PORT_MULTIPLIER_SIG 0x96690000
|
||||||
|
#define EFI_AHCI_ATAPI_SIG_MASK 0xFFFF0000
|
||||||
|
|
||||||
|
//
|
||||||
|
// Each PRDT entry can point to a memory block up to 4M byte
|
||||||
|
//
|
||||||
|
#define EFI_AHCI_MAX_DATA_PER_PRDT 0x400000
|
||||||
|
|
||||||
|
#define EFI_AHCI_FIS_REGISTER_H2D 0x27 //Register FIS - Host to Device
|
||||||
|
#define EFI_AHCI_FIS_REGISTER_H2D_LENGTH 20
|
||||||
|
#define EFI_AHCI_FIS_REGISTER_D2H 0x34 //Register FIS - Device to Host
|
||||||
|
#define EFI_AHCI_FIS_REGISTER_D2H_LENGTH 20
|
||||||
|
#define EFI_AHCI_FIS_DMA_ACTIVATE 0x39 //DMA Activate FIS - Device to Host
|
||||||
|
#define EFI_AHCI_FIS_DMA_ACTIVATE_LENGTH 4
|
||||||
|
#define EFI_AHCI_FIS_DMA_SETUP 0x41 //DMA Setup FIS - Bi-directional
|
||||||
|
#define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28
|
||||||
|
#define EFI_AHCI_FIS_DATA 0x46 //Data FIS - Bi-directional
|
||||||
|
#define EFI_AHCI_FIS_BIST 0x58 //BIST Activate FIS - Bi-directional
|
||||||
|
#define EFI_AHCI_FIS_BIST_LENGTH 12
|
||||||
|
#define EFI_AHCI_FIS_PIO_SETUP 0x5F //PIO Setup FIS - Device to Host
|
||||||
|
#define EFI_AHCI_FIS_PIO_SETUP_LENGTH 20
|
||||||
|
#define EFI_AHCI_FIS_SET_DEVICE 0xA1 //Set Device Bits FIS - Device to Host
|
||||||
|
#define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8
|
||||||
|
|
||||||
|
#define EFI_AHCI_D2H_FIS_OFFSET 0x40
|
||||||
|
#define EFI_AHCI_DMA_FIS_OFFSET 0x00
|
||||||
|
#define EFI_AHCI_PIO_FIS_OFFSET 0x20
|
||||||
|
#define EFI_AHCI_SDB_FIS_OFFSET 0x58
|
||||||
|
#define EFI_AHCI_FIS_TYPE_MASK 0xFF
|
||||||
|
#define EFI_AHCI_U_FIS_OFFSET 0x60
|
||||||
|
|
||||||
|
//
|
||||||
|
// Port register
|
||||||
|
//
|
||||||
|
#define EFI_AHCI_PORT_START 0x0100
|
||||||
|
#define EFI_AHCI_PORT_REG_WIDTH 0x0080
|
||||||
|
#define EFI_AHCI_PORT_CLB 0x0000
|
||||||
|
#define EFI_AHCI_PORT_CLBU 0x0004
|
||||||
|
#define EFI_AHCI_PORT_FB 0x0008
|
||||||
|
#define EFI_AHCI_PORT_FBU 0x000C
|
||||||
|
#define EFI_AHCI_PORT_IS 0x0010
|
||||||
|
#define EFI_AHCI_PORT_IS_DHRS BIT0
|
||||||
|
#define EFI_AHCI_PORT_IS_PSS BIT1
|
||||||
|
#define EFI_AHCI_PORT_IS_SSS BIT2
|
||||||
|
#define EFI_AHCI_PORT_IS_SDBS BIT3
|
||||||
|
#define EFI_AHCI_PORT_IS_UFS BIT4
|
||||||
|
#define EFI_AHCI_PORT_IS_DPS BIT5
|
||||||
|
#define EFI_AHCI_PORT_IS_PCS BIT6
|
||||||
|
#define EFI_AHCI_PORT_IS_DIS BIT7
|
||||||
|
#define EFI_AHCI_PORT_IS_PRCS BIT22
|
||||||
|
#define EFI_AHCI_PORT_IS_IPMS BIT23
|
||||||
|
#define EFI_AHCI_PORT_IS_OFS BIT24
|
||||||
|
#define EFI_AHCI_PORT_IS_INFS BIT26
|
||||||
|
#define EFI_AHCI_PORT_IS_IFS BIT27
|
||||||
|
#define EFI_AHCI_PORT_IS_HBDS BIT28
|
||||||
|
#define EFI_AHCI_PORT_IS_HBFS BIT29
|
||||||
|
#define EFI_AHCI_PORT_IS_TFES BIT30
|
||||||
|
#define EFI_AHCI_PORT_IS_CPDS BIT31
|
||||||
|
#define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF
|
||||||
|
#define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F
|
||||||
|
|
||||||
|
#define EFI_AHCI_PORT_IE 0x0014
|
||||||
|
#define EFI_AHCI_PORT_CMD 0x0018
|
||||||
|
#define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE
|
||||||
|
#define EFI_AHCI_PORT_CMD_ST BIT0
|
||||||
|
#define EFI_AHCI_PORT_CMD_SUD BIT1
|
||||||
|
#define EFI_AHCI_PORT_CMD_POD BIT2
|
||||||
|
#define EFI_AHCI_PORT_CMD_COL BIT3
|
||||||
|
#define EFI_AHCI_PORT_CMD_CR BIT15
|
||||||
|
#define EFI_AHCI_PORT_CMD_FRE BIT4
|
||||||
|
#define EFI_AHCI_PORT_CMD_FR BIT14
|
||||||
|
#define EFI_AHCI_PORT_CMD_MASK ~(EFI_AHCI_PORT_CMD_ST | EFI_AHCI_PORT_CMD_FRE | EFI_AHCI_PORT_CMD_COL)
|
||||||
|
#define EFI_AHCI_PORT_CMD_PMA BIT17
|
||||||
|
#define EFI_AHCI_PORT_CMD_HPCP BIT18
|
||||||
|
#define EFI_AHCI_PORT_CMD_MPSP BIT19
|
||||||
|
#define EFI_AHCI_PORT_CMD_CPD BIT20
|
||||||
|
#define EFI_AHCI_PORT_CMD_ESP BIT21
|
||||||
|
#define EFI_AHCI_PORT_CMD_ATAPI BIT24
|
||||||
|
#define EFI_AHCI_PORT_CMD_DLAE BIT25
|
||||||
|
#define EFI_AHCI_PORT_CMD_ALPE BIT26
|
||||||
|
#define EFI_AHCI_PORT_CMD_ASP BIT27
|
||||||
|
#define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31)
|
||||||
|
#define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 )
|
||||||
|
#define EFI_AHCI_PORT_TFD 0x0020
|
||||||
|
#define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0)
|
||||||
|
#define EFI_AHCI_PORT_TFD_BSY BIT7
|
||||||
|
#define EFI_AHCI_PORT_TFD_DRQ BIT3
|
||||||
|
#define EFI_AHCI_PORT_TFD_ERR BIT0
|
||||||
|
#define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00
|
||||||
|
#define EFI_AHCI_PORT_SIG 0x0024
|
||||||
|
#define EFI_AHCI_PORT_SSTS 0x0028
|
||||||
|
#define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F
|
||||||
|
#define EFI_AHCI_PORT_SSTS_DET 0x0001
|
||||||
|
#define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003
|
||||||
|
#define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0
|
||||||
|
#define EFI_AHCI_PORT_SCTL 0x002C
|
||||||
|
#define EFI_AHCI_PORT_SCTL_DET_MASK 0x000F
|
||||||
|
#define EFI_AHCI_PORT_SCTL_MASK (~EFI_AHCI_PORT_SCTL_DET_MASK)
|
||||||
|
#define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001
|
||||||
|
#define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003
|
||||||
|
#define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0
|
||||||
|
#define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00
|
||||||
|
#define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300
|
||||||
|
#define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100
|
||||||
|
#define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200
|
||||||
|
#define EFI_AHCI_PORT_SERR 0x0030
|
||||||
|
#define EFI_AHCI_PORT_SERR_RDIE BIT0
|
||||||
|
#define EFI_AHCI_PORT_SERR_RCE BIT1
|
||||||
|
#define EFI_AHCI_PORT_SERR_TDIE BIT8
|
||||||
|
#define EFI_AHCI_PORT_SERR_PCDIE BIT9
|
||||||
|
#define EFI_AHCI_PORT_SERR_PE BIT10
|
||||||
|
#define EFI_AHCI_PORT_SERR_IE BIT11
|
||||||
|
#define EFI_AHCI_PORT_SERR_PRC BIT16
|
||||||
|
#define EFI_AHCI_PORT_SERR_PIE BIT17
|
||||||
|
#define EFI_AHCI_PORT_SERR_CW BIT18
|
||||||
|
#define EFI_AHCI_PORT_SERR_BDE BIT19
|
||||||
|
#define EFI_AHCI_PORT_SERR_DE BIT20
|
||||||
|
#define EFI_AHCI_PORT_SERR_CRCE BIT21
|
||||||
|
#define EFI_AHCI_PORT_SERR_HE BIT22
|
||||||
|
#define EFI_AHCI_PORT_SERR_LSE BIT23
|
||||||
|
#define EFI_AHCI_PORT_SERR_TSTE BIT24
|
||||||
|
#define EFI_AHCI_PORT_SERR_UFT BIT25
|
||||||
|
#define EFI_AHCI_PORT_SERR_EX BIT26
|
||||||
|
#define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF
|
||||||
|
#define EFI_AHCI_PORT_SACT 0x0034
|
||||||
|
#define EFI_AHCI_PORT_CI 0x0038
|
||||||
|
#define EFI_AHCI_PORT_SNTF 0x003C
|
||||||
|
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
//
|
||||||
|
// Command List structure includes total 32 entries.
|
||||||
|
// The entry data structure is listed at the following.
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
UINT32 AhciCmdCfl:5; //Command FIS Length
|
||||||
|
UINT32 AhciCmdA:1; //ATAPI
|
||||||
|
UINT32 AhciCmdW:1; //Write
|
||||||
|
UINT32 AhciCmdP:1; //Prefetchable
|
||||||
|
UINT32 AhciCmdR:1; //Reset
|
||||||
|
UINT32 AhciCmdB:1; //BIST
|
||||||
|
UINT32 AhciCmdC:1; //Clear Busy upon R_OK
|
||||||
|
UINT32 AhciCmdRsvd:1;
|
||||||
|
UINT32 AhciCmdPmp:4; //Port Multiplier Port
|
||||||
|
UINT32 AhciCmdPrdtl:16; //Physical Region Descriptor Table Length
|
||||||
|
UINT32 AhciCmdPrdbc; //Physical Region Descriptor Byte Count
|
||||||
|
UINT32 AhciCmdCtba; //Command Table Descriptor Base Address
|
||||||
|
UINT32 AhciCmdCtbau; //Command Table Descriptor Base Address Upper 32-BITs
|
||||||
|
UINT32 AhciCmdRsvd1[4];
|
||||||
|
} EFI_AHCI_COMMAND_LIST;
|
||||||
|
|
||||||
|
//
|
||||||
|
// This is a software constructed FIS.
|
||||||
|
// For data transfer operations, this is the H2D Register FIS format as
|
||||||
|
// specified in the Serial ATA Revision 2.6 specification.
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
UINT8 AhciCFisType;
|
||||||
|
UINT8 AhciCFisPmNum:4;
|
||||||
|
UINT8 AhciCFisRsvd:1;
|
||||||
|
UINT8 AhciCFisRsvd1:1;
|
||||||
|
UINT8 AhciCFisRsvd2:1;
|
||||||
|
UINT8 AhciCFisCmdInd:1;
|
||||||
|
UINT8 AhciCFisCmd;
|
||||||
|
UINT8 AhciCFisFeature;
|
||||||
|
UINT8 AhciCFisSecNum;
|
||||||
|
UINT8 AhciCFisClyLow;
|
||||||
|
UINT8 AhciCFisClyHigh;
|
||||||
|
UINT8 AhciCFisDevHead;
|
||||||
|
UINT8 AhciCFisSecNumExp;
|
||||||
|
UINT8 AhciCFisClyLowExp;
|
||||||
|
UINT8 AhciCFisClyHighExp;
|
||||||
|
UINT8 AhciCFisFeatureExp;
|
||||||
|
UINT8 AhciCFisSecCount;
|
||||||
|
UINT8 AhciCFisSecCountExp;
|
||||||
|
UINT8 AhciCFisRsvd3;
|
||||||
|
UINT8 AhciCFisControl;
|
||||||
|
UINT8 AhciCFisRsvd4[4];
|
||||||
|
UINT8 AhciCFisRsvd5[44];
|
||||||
|
} EFI_AHCI_COMMAND_FIS;
|
||||||
|
|
||||||
|
//
|
||||||
|
// ACMD: ATAPI command (12 or 16 bytes)
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
UINT8 AtapiCmd[0x10];
|
||||||
|
} EFI_AHCI_ATAPI_COMMAND;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Physical Region Descriptor Table includes up to 65535 entries
|
||||||
|
// The entry data structure is listed at the following.
|
||||||
|
// the actual entry number comes from the PRDTL field in the command
|
||||||
|
// list entry for this command slot.
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
UINT32 AhciPrdtDba; //Data Base Address
|
||||||
|
UINT32 AhciPrdtDbau; //Data Base Address Upper 32-BITs
|
||||||
|
UINT32 AhciPrdtRsvd;
|
||||||
|
UINT32 AhciPrdtDbc:22; //Data Byte Count
|
||||||
|
UINT32 AhciPrdtRsvd1:9;
|
||||||
|
UINT32 AhciPrdtIoc:1; //Interrupt on Completion
|
||||||
|
} EFI_AHCI_COMMAND_PRDT;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Command table data strucute which is pointed to by the entry in the command list
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
EFI_AHCI_COMMAND_FIS CommandFis; // A software constructed FIS.
|
||||||
|
EFI_AHCI_ATAPI_COMMAND AtapiCmd; // 12 or 16 bytes ATAPI cmd.
|
||||||
|
UINT8 Reserved[0x30];
|
||||||
|
EFI_AHCI_COMMAND_PRDT PrdtTable[65535]; // The scatter/gather list for data transfer
|
||||||
|
} EFI_AHCI_COMMAND_TABLE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Received FIS structure
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
UINT8 AhciDmaSetupFis[0x1C]; // Dma Setup Fis: offset 0x00
|
||||||
|
UINT8 AhciDmaSetupFisRsvd[0x04];
|
||||||
|
UINT8 AhciPioSetupFis[0x14]; // Pio Setup Fis: offset 0x20
|
||||||
|
UINT8 AhciPioSetupFisRsvd[0x0C];
|
||||||
|
UINT8 AhciD2HRegisterFis[0x14]; // D2H Register Fis: offset 0x40
|
||||||
|
UINT8 AhciD2HRegisterFisRsvd[0x04];
|
||||||
|
UINT64 AhciSetDeviceBitsFis; // Set Device Bits Fix: offset 0x58
|
||||||
|
UINT8 AhciUnknownFis[0x40]; // Unkonwn Fis: offset 0x60
|
||||||
|
UINT8 AhciUnknownFisRsvd[0x60];
|
||||||
|
} EFI_AHCI_RECEIVED_FIS;
|
||||||
|
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_AHCI_RECEIVED_FIS *AhciRFis;
|
||||||
|
EFI_AHCI_COMMAND_LIST *AhciCmdList;
|
||||||
|
EFI_AHCI_COMMAND_TABLE *AhciCommandTable;
|
||||||
|
EFI_AHCI_RECEIVED_FIS *AhciRFisPciAddr;
|
||||||
|
EFI_AHCI_COMMAND_LIST *AhciCmdListPciAddr;
|
||||||
|
EFI_AHCI_COMMAND_TABLE *AhciCommandTablePciAddr;
|
||||||
|
UINT64 MaxCommandListSize;
|
||||||
|
UINT64 MaxCommandTableSize;
|
||||||
|
UINT64 MaxReceiveFisSize;
|
||||||
|
VOID *MapRFis;
|
||||||
|
VOID *MapCmdList;
|
||||||
|
VOID *MapCommandTable;
|
||||||
|
} EFI_AHCI_REGISTERS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function is used to send out ATAPI commands conforms to the Packet Command
|
||||||
|
with PIO Protocol.
|
||||||
|
|
||||||
|
@param PciIo The PCI IO protocol instance.
|
||||||
|
@param AhciRegisters The pointer to the EFI_AHCI_REGISTERS.
|
||||||
|
@param Port The number of port.
|
||||||
|
@param PortMultiplier The number of port multiplier.
|
||||||
|
@param Packet A pointer to EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET structure.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS send out the ATAPI packet command successfully
|
||||||
|
and device sends data successfully.
|
||||||
|
@retval EFI_DEVICE_ERROR the device failed to send data.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AhciPacketCommandExecute (
|
||||||
|
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||||
|
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||||
|
IN UINT8 Port,
|
||||||
|
IN UINT8 PortMultiplier,
|
||||||
|
IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Start command for give slot on specific port.
|
||||||
|
|
||||||
|
@param PciIo The PCI IO protocol instance.
|
||||||
|
@param Port The number of port.
|
||||||
|
@param CommandSlot The number of CommandSlot.
|
||||||
|
@param Timeout The timeout value of start.
|
||||||
|
|
||||||
|
@retval EFI_DEVICE_ERROR The command start unsuccessfully.
|
||||||
|
@retval EFI_TIMEOUT The operation is time out.
|
||||||
|
@retval EFI_SUCCESS The command start successfully.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AhciStartCommand (
|
||||||
|
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||||
|
IN UINT8 Port,
|
||||||
|
IN UINT8 CommandSlot,
|
||||||
|
IN UINT64 Timeout
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Stop command running for giving port
|
||||||
|
|
||||||
|
@param PciIo The PCI IO protocol instance.
|
||||||
|
@param Port The number of port.
|
||||||
|
@param Timeout The timeout value of stop.
|
||||||
|
|
||||||
|
@retval EFI_DEVICE_ERROR The command stop unsuccessfully.
|
||||||
|
@retval EFI_TIMEOUT The operation is time out.
|
||||||
|
@retval EFI_SUCCESS The command stop successfully.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AhciStopCommand (
|
||||||
|
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||||
|
IN UINT8 Port,
|
||||||
|
IN UINT64 Timeout
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Start a non data transfer on specific port.
|
||||||
|
|
||||||
|
@param PciIo The PCI IO protocol instance.
|
||||||
|
@param AhciRegisters The pointer to the EFI_AHCI_REGISTERS.
|
||||||
|
@param Port The number of port.
|
||||||
|
@param PortMultiplier The timeout value of stop.
|
||||||
|
@param AtapiCommand The atapi command will be used for the transfer.
|
||||||
|
@param AtapiCommandLength The length of the atapi command.
|
||||||
|
@param AtaCommandBlock The EFI_ATA_COMMAND_BLOCK data.
|
||||||
|
@param AtaStatusBlock The EFI_ATA_STATUS_BLOCK data.
|
||||||
|
@param Timeout The timeout value of non data transfer.
|
||||||
|
|
||||||
|
@retval EFI_DEVICE_ERROR The non data transfer abort with error occurs.
|
||||||
|
@retval EFI_TIMEOUT The operation is time out.
|
||||||
|
@retval EFI_UNSUPPORTED The device is not ready for transfer.
|
||||||
|
@retval EFI_SUCCESS The non data transfer executes successfully.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AhciNonDataTransfer (
|
||||||
|
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||||
|
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||||
|
IN UINT8 Port,
|
||||||
|
IN UINT8 PortMultiplier,
|
||||||
|
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
|
||||||
|
IN UINT8 AtapiCommandLength,
|
||||||
|
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||||
|
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||||
|
IN UINT64 Timeout
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Start a DMA data transfer on specific port
|
||||||
|
|
||||||
|
@param PciIo The PCI IO protocol instance.
|
||||||
|
@param AhciRegisters The pointer to the EFI_AHCI_REGISTERS.
|
||||||
|
@param Port The number of port.
|
||||||
|
@param PortMultiplier The timeout value of stop.
|
||||||
|
@param AtapiCommand The atapi command will be used for the transfer.
|
||||||
|
@param AtapiCommandLength The length of the atapi command.
|
||||||
|
@param Read The transfer direction.
|
||||||
|
@param AtaCommandBlock The EFI_ATA_COMMAND_BLOCK data.
|
||||||
|
@param AtaStatusBlock The EFI_ATA_STATUS_BLOCK data.
|
||||||
|
@param MemoryAddr The pointer to the data buffer.
|
||||||
|
@param DataCount The data count to be transferred.
|
||||||
|
@param Timeout The timeout value of non data transfer.
|
||||||
|
|
||||||
|
@retval EFI_DEVICE_ERROR The DMA data transfer abort with error occurs.
|
||||||
|
@retval EFI_TIMEOUT The operation is time out.
|
||||||
|
@retval EFI_UNSUPPORTED The device is not ready for transfer.
|
||||||
|
@retval EFI_SUCCESS The DMA data transfer executes successfully.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AhciDmaTransfer (
|
||||||
|
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||||
|
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||||
|
IN UINT8 Port,
|
||||||
|
IN UINT8 PortMultiplier,
|
||||||
|
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
|
||||||
|
IN UINT8 AtapiCommandLength,
|
||||||
|
IN BOOLEAN Read,
|
||||||
|
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||||
|
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||||
|
IN OUT VOID *MemoryAddr,
|
||||||
|
IN UINTN DataCount,
|
||||||
|
IN UINT64 Timeout
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Start a PIO data transfer on specific port.
|
||||||
|
|
||||||
|
@param PciIo The PCI IO protocol instance.
|
||||||
|
@param AhciRegisters The pointer to the EFI_AHCI_REGISTERS.
|
||||||
|
@param Port The number of port.
|
||||||
|
@param PortMultiplier The timeout value of stop.
|
||||||
|
@param AtapiCommand The atapi command will be used for the transfer.
|
||||||
|
@param AtapiCommandLength The length of the atapi command.
|
||||||
|
@param Read The transfer direction.
|
||||||
|
@param AtaCommandBlock The EFI_ATA_COMMAND_BLOCK data.
|
||||||
|
@param AtaStatusBlock The EFI_ATA_STATUS_BLOCK data.
|
||||||
|
@param MemoryAddr The pointer to the data buffer.
|
||||||
|
@param DataCount The data count to be transferred.
|
||||||
|
@param Timeout The timeout value of non data transfer.
|
||||||
|
|
||||||
|
@retval EFI_DEVICE_ERROR The PIO data transfer abort with error occurs.
|
||||||
|
@retval EFI_TIMEOUT The operation is time out.
|
||||||
|
@retval EFI_UNSUPPORTED The device is not ready for transfer.
|
||||||
|
@retval EFI_SUCCESS The PIO data transfer executes successfully.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AhciPioTransfer (
|
||||||
|
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||||
|
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||||
|
IN UINT8 Port,
|
||||||
|
IN UINT8 PortMultiplier,
|
||||||
|
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
|
||||||
|
IN UINT8 AtapiCommandLength,
|
||||||
|
IN BOOLEAN Read,
|
||||||
|
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||||
|
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||||
|
IN OUT VOID *MemoryAddr,
|
||||||
|
IN UINT32 DataCount,
|
||||||
|
IN UINT64 Timeout
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
2195
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c
Normal file
2195
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c
Normal file
File diff suppressed because it is too large
Load Diff
1000
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.h
Normal file
1000
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.h
Normal file
File diff suppressed because it is too large
Load Diff
68
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
Normal file
68
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
## @file
|
||||||
|
# AtaAtapiPassThru driver to provide native IDE/AHCI mode support.
|
||||||
|
#
|
||||||
|
# This driver installs AtaPassThru and ExtScsiPassThru protocol in each ide/sata controller
|
||||||
|
# to access to all attached Ata/Atapi devices.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
##
|
||||||
|
|
||||||
|
[Defines]
|
||||||
|
INF_VERSION = 0x00010005
|
||||||
|
BASE_NAME = AtaAtapiPassThruDxe
|
||||||
|
FILE_GUID = 5E523CB4-D397-4986-87BD-A6DD8B22F455
|
||||||
|
MODULE_TYPE = UEFI_DRIVER
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
ENTRY_POINT = InitializeAtaAtapiPassThru
|
||||||
|
|
||||||
|
#
|
||||||
|
# The following information is for reference only and not required by the build tools.
|
||||||
|
#
|
||||||
|
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||||
|
#
|
||||||
|
# DRIVER_BINDING = gAtaAtapiPassThruDriverBinding
|
||||||
|
# COMPONENT_NAME = gAtaAtapiPassThruComponentName
|
||||||
|
# COMPONENT_NAME2 = gAtaAtapiPassThruComponentName2
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
[Sources]
|
||||||
|
AtaAtapiPassThru.c
|
||||||
|
AtaAtapiPassThru.h
|
||||||
|
AhciMode.c
|
||||||
|
AhciMode.h
|
||||||
|
IdeMode.c
|
||||||
|
IdeMode.h
|
||||||
|
ComponentName.c
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
DevicePathLib
|
||||||
|
UefiBootServicesTableLib
|
||||||
|
MemoryAllocationLib
|
||||||
|
BaseMemoryLib
|
||||||
|
UefiLib
|
||||||
|
BaseLib
|
||||||
|
UefiDriverEntryPoint
|
||||||
|
DebugLib
|
||||||
|
TimerLib
|
||||||
|
|
||||||
|
[Guids]
|
||||||
|
|
||||||
|
[Protocols]
|
||||||
|
gEfiIdeControllerInitProtocolGuid # BY_START
|
||||||
|
gEfiAtaPassThruProtocolGuid # BY_START
|
||||||
|
gEfiExtScsiPassThruProtocolGuid # BY_START
|
||||||
|
gEfiDevicePathProtocolGuid # TO_START
|
||||||
|
gEfiPciIoProtocolGuid # TO_START
|
251
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/ComponentName.c
Normal file
251
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/ComponentName.c
Normal file
@ -0,0 +1,251 @@
|
|||||||
|
/** @file
|
||||||
|
UEFI Component Name(2) protocol implementation for AtaAtapiPassThru driver.
|
||||||
|
|
||||||
|
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
|
||||||
|
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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include "AtaAtapiPassThru.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// Driver name table
|
||||||
|
//
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaAtapiPassThruDriverNameTable[] = {
|
||||||
|
{ "eng;en", L"AtaAtapiPassThru Driver" },
|
||||||
|
{ NULL , NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Controller name table
|
||||||
|
//
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaAtapiPassThruIdeControllerNameTable[] = {
|
||||||
|
{ "eng;en", L"IDE Controller" },
|
||||||
|
{ NULL , NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaAtapiPassThruAhciControllerNameTable[] = {
|
||||||
|
{ "eng;en", L"AHCI Controller" },
|
||||||
|
{ NULL , NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Component Name Protocol
|
||||||
|
//
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gAtaAtapiPassThruComponentName = {
|
||||||
|
AtaAtapiPassThruComponentNameGetDriverName,
|
||||||
|
AtaAtapiPassThruComponentNameGetControllerName,
|
||||||
|
"eng"
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Component Name 2 Protocol
|
||||||
|
//
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gAtaAtapiPassThruComponentName2 = {
|
||||||
|
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) AtaAtapiPassThruComponentNameGetDriverName,
|
||||||
|
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) AtaAtapiPassThruComponentNameGetControllerName,
|
||||||
|
"en"
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Retrieves a Unicode string that is the user readable name of the driver.
|
||||||
|
|
||||||
|
This function retrieves the user readable name of a driver in the form of a
|
||||||
|
Unicode string. If the driver specified by This has a user readable name in
|
||||||
|
the language specified by Language, then a pointer to the driver name is
|
||||||
|
returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
|
||||||
|
by This does not support the language specified by Language,
|
||||||
|
then EFI_UNSUPPORTED is returned.
|
||||||
|
|
||||||
|
@param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
|
||||||
|
EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||||
|
|
||||||
|
@param Language[in] A pointer to a Null-terminated ASCII string
|
||||||
|
array indicating the language. This is the
|
||||||
|
language of the driver name that the caller is
|
||||||
|
requesting, and it must match one of the
|
||||||
|
languages specified in SupportedLanguages. The
|
||||||
|
number of languages supported by a driver is up
|
||||||
|
to the driver writer. Language is specified
|
||||||
|
in RFC 4646 or ISO 639-2 language code format.
|
||||||
|
|
||||||
|
@param DriverName[out] A pointer to the Unicode string to return.
|
||||||
|
This Unicode string is the name of the
|
||||||
|
driver specified by This in the language
|
||||||
|
specified by Language.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The Unicode string for the Driver specified by
|
||||||
|
This and the language specified by Language was
|
||||||
|
returned in DriverName.
|
||||||
|
|
||||||
|
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||||
|
|
||||||
|
@retval EFI_INVALID_PARAMETER DriverName is NULL.
|
||||||
|
|
||||||
|
@retval EFI_UNSUPPORTED The driver specified by This does not support
|
||||||
|
the language specified by Language.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AtaAtapiPassThruComponentNameGetDriverName (
|
||||||
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
|
IN CHAR8 *Language,
|
||||||
|
OUT CHAR16 **DriverName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return LookupUnicodeString2 (
|
||||||
|
Language,
|
||||||
|
This->SupportedLanguages,
|
||||||
|
mAtaAtapiPassThruDriverNameTable,
|
||||||
|
DriverName,
|
||||||
|
(BOOLEAN)(This == &gAtaAtapiPassThruComponentName)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Retrieves a Unicode string that is the user readable name of the controller
|
||||||
|
that is being managed by a driver.
|
||||||
|
|
||||||
|
This function retrieves the user readable name of the controller specified by
|
||||||
|
ControllerHandle and ChildHandle in the form of a Unicode string. If the
|
||||||
|
driver specified by This has a user readable name in the language specified by
|
||||||
|
Language, then a pointer to the controller name is returned in ControllerName,
|
||||||
|
and EFI_SUCCESS is returned. If the driver specified by This is not currently
|
||||||
|
managing the controller specified by ControllerHandle and ChildHandle,
|
||||||
|
then EFI_UNSUPPORTED is returned. If the driver specified by This does not
|
||||||
|
support the language specified by Language, then EFI_UNSUPPORTED is returned.
|
||||||
|
|
||||||
|
@param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
|
||||||
|
EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||||
|
|
||||||
|
@param ControllerHandle[in] The handle of a controller that the driver
|
||||||
|
specified by This is managing. This handle
|
||||||
|
specifies the controller whose name is to be
|
||||||
|
returned.
|
||||||
|
|
||||||
|
@param ChildHandle[in] The handle of the child controller to retrieve
|
||||||
|
the name of. This is an optional parameter that
|
||||||
|
may be NULL. It will be NULL for device
|
||||||
|
drivers. It will also be NULL for a bus drivers
|
||||||
|
that wish to retrieve the name of the bus
|
||||||
|
controller. It will not be NULL for a bus
|
||||||
|
driver that wishes to retrieve the name of a
|
||||||
|
child controller.
|
||||||
|
|
||||||
|
@param Language[in] A pointer to a Null-terminated ASCII string
|
||||||
|
array indicating the language. This is the
|
||||||
|
language of the driver name that the caller is
|
||||||
|
requesting, and it must match one of the
|
||||||
|
languages specified in SupportedLanguages. The
|
||||||
|
number of languages supported by a driver is up
|
||||||
|
to the driver writer. Language is specified in
|
||||||
|
RFC 4646 or ISO 639-2 language code format.
|
||||||
|
|
||||||
|
@param ControllerName[out] A pointer to the Unicode string to return.
|
||||||
|
This Unicode string is the name of the
|
||||||
|
controller specified by ControllerHandle and
|
||||||
|
ChildHandle in the language specified by
|
||||||
|
Language from the point of view of the driver
|
||||||
|
specified by This.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The Unicode string for the user readable name in
|
||||||
|
the language specified by Language for the
|
||||||
|
driver specified by This was returned in
|
||||||
|
DriverName.
|
||||||
|
|
||||||
|
@retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
|
||||||
|
|
||||||
|
@retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
|
||||||
|
EFI_HANDLE.
|
||||||
|
|
||||||
|
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||||
|
|
||||||
|
@retval EFI_INVALID_PARAMETER ControllerName is NULL.
|
||||||
|
|
||||||
|
@retval EFI_UNSUPPORTED The driver specified by This is not currently
|
||||||
|
managing the controller specified by
|
||||||
|
ControllerHandle and ChildHandle.
|
||||||
|
|
||||||
|
@retval EFI_UNSUPPORTED The driver specified by This does not support
|
||||||
|
the language specified by Language.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AtaAtapiPassThruComponentNameGetControllerName (
|
||||||
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
|
IN CHAR8 *Language,
|
||||||
|
OUT CHAR16 **ControllerName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||||
|
VOID *Interface;
|
||||||
|
ATA_ATAPI_PASS_THRU_INSTANCE *Instance;
|
||||||
|
|
||||||
|
if (Language == NULL || ControllerName == NULL) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// This is a device driver, so ChildHandle must be NULL.
|
||||||
|
//
|
||||||
|
if (ChildHandle != NULL) {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Make sure this driver is currently managing Controller Handle
|
||||||
|
//
|
||||||
|
Status = EfiTestManagedDevice (
|
||||||
|
ControllerHandle,
|
||||||
|
gAtaAtapiPassThruDriverBinding.DriverBindingHandle,
|
||||||
|
&gEfiIdeControllerInitProtocolGuid
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// AtaPassThru and ExtScsiPassThru should also be installed at the controller handle.
|
||||||
|
//
|
||||||
|
Status = gBS->OpenProtocol (
|
||||||
|
ControllerHandle,
|
||||||
|
&gEfiAtaPassThruProtocolGuid,
|
||||||
|
&Interface,
|
||||||
|
gAtaAtapiPassThruDriverBinding.DriverBindingHandle,
|
||||||
|
ControllerHandle,
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance = ATA_PASS_THRU_PRIVATE_DATA_FROM_THIS (Interface);
|
||||||
|
|
||||||
|
if (Instance->Mode == EfiAtaIdeMode) {
|
||||||
|
ControllerNameTable = mAtaAtapiPassThruIdeControllerNameTable;
|
||||||
|
} else if (Instance->Mode == EfiAtaAhciMode) {
|
||||||
|
ControllerNameTable = mAtaAtapiPassThruAhciControllerNameTable;
|
||||||
|
} else {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return LookupUnicodeString2 (
|
||||||
|
Language,
|
||||||
|
This->SupportedLanguages,
|
||||||
|
ControllerNameTable,
|
||||||
|
ControllerName,
|
||||||
|
(BOOLEAN)(This == &gAtaAtapiPassThruComponentName)
|
||||||
|
);
|
||||||
|
}
|
2524
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/IdeMode.c
Normal file
2524
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/IdeMode.c
Normal file
File diff suppressed because it is too large
Load Diff
293
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/IdeMode.h
Normal file
293
MdeModulePkg/Bus/Ata/AtaAtapiPassThru/IdeMode.h
Normal file
@ -0,0 +1,293 @@
|
|||||||
|
/** @file
|
||||||
|
Header file for IDE mode of ATA host controller.
|
||||||
|
|
||||||
|
Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
|
||||||
|
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 __ATA_HC_IDE_MODE_H__
|
||||||
|
#define __ATA_HC_IDE_MODE_H__
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiIdePrimary = 0,
|
||||||
|
EfiIdeSecondary = 1,
|
||||||
|
EfiIdeMaxChannel = 2
|
||||||
|
} EFI_IDE_CHANNEL;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiIdeMaster = 0,
|
||||||
|
EfiIdeSlave = 1,
|
||||||
|
EfiIdeMaxDevice = 2
|
||||||
|
} EFI_IDE_DEVICE;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// PIO mode definition
|
||||||
|
///
|
||||||
|
typedef enum {
|
||||||
|
EfiAtaPioModeBelow2,
|
||||||
|
EfiAtaPioMode2,
|
||||||
|
EfiAtaPioMode3,
|
||||||
|
EfiAtaPioMode4
|
||||||
|
} EFI_ATA_PIO_MODE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Multi word DMA definition
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
EfiAtaMdmaMode0,
|
||||||
|
EfiAtaMdmaMode1,
|
||||||
|
EfiAtaMdmaMode2
|
||||||
|
} EFI_ATA_MDMA_MODE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// UDMA mode definition
|
||||||
|
//
|
||||||
|
typedef enum {
|
||||||
|
EfiAtaUdmaMode0,
|
||||||
|
EfiAtaUdmaMode1,
|
||||||
|
EfiAtaUdmaMode2,
|
||||||
|
EfiAtaUdmaMode3,
|
||||||
|
EfiAtaUdmaMode4,
|
||||||
|
EfiAtaUdmaMode5
|
||||||
|
} EFI_ATA_UDMA_MODE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bus Master Reg
|
||||||
|
//
|
||||||
|
#define BMIC_NREAD BIT3
|
||||||
|
#define BMIC_START BIT0
|
||||||
|
#define BMIS_INTERRUPT BIT2
|
||||||
|
#define BMIS_ERROR BIT1
|
||||||
|
|
||||||
|
#define BMIC_OFFSET 0x00
|
||||||
|
#define BMIS_OFFSET 0x02
|
||||||
|
#define BMID_OFFSET 0x04
|
||||||
|
|
||||||
|
//
|
||||||
|
// IDE transfer mode
|
||||||
|
//
|
||||||
|
#define EFI_ATA_MODE_DEFAULT_PIO 0x00
|
||||||
|
#define EFI_ATA_MODE_FLOW_PIO 0x01
|
||||||
|
#define EFI_ATA_MODE_MDMA 0x04
|
||||||
|
#define EFI_ATA_MODE_UDMA 0x08
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 RegionBaseAddr;
|
||||||
|
UINT16 ByteCount;
|
||||||
|
UINT16 EndOfTable;
|
||||||
|
} EFI_ATA_DMA_PRD;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 ModeNumber : 3;
|
||||||
|
UINT8 ModeCategory : 5;
|
||||||
|
} EFI_ATA_TRANSFER_MODE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Sector;
|
||||||
|
UINT8 Heads;
|
||||||
|
UINT8 MultipleSector;
|
||||||
|
} EFI_ATA_DRIVE_PARMS;
|
||||||
|
|
||||||
|
//
|
||||||
|
// IDE registers set
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
UINT16 Data;
|
||||||
|
UINT16 ErrOrFeature;
|
||||||
|
UINT16 SectorCount;
|
||||||
|
UINT16 SectorNumber;
|
||||||
|
UINT16 CylinderLsb;
|
||||||
|
UINT16 CylinderMsb;
|
||||||
|
UINT16 Head;
|
||||||
|
UINT16 CmdOrStatus;
|
||||||
|
UINT16 AltOrDev;
|
||||||
|
|
||||||
|
UINT16 BusMasterBaseAddr;
|
||||||
|
} EFI_IDE_REGISTERS;
|
||||||
|
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get IDE i/o port registers' base addresses by mode.
|
||||||
|
|
||||||
|
In 'Compatibility' mode, use fixed addresses.
|
||||||
|
In Native-PCI mode, get base addresses from BARs in the PCI IDE controller's
|
||||||
|
Configuration Space.
|
||||||
|
|
||||||
|
The steps to get IDE i/o port registers' base addresses for each channel
|
||||||
|
as follows:
|
||||||
|
|
||||||
|
1. Examine the Programming Interface byte of the Class Code fields in PCI IDE
|
||||||
|
controller's Configuration Space to determine the operating mode.
|
||||||
|
|
||||||
|
2. a) In 'Compatibility' mode, use fixed addresses shown in the Table 1 below.
|
||||||
|
___________________________________________
|
||||||
|
| | Command Block | Control Block |
|
||||||
|
| Channel | Registers | Registers |
|
||||||
|
|___________|_______________|_______________|
|
||||||
|
| Primary | 1F0h - 1F7h | 3F6h - 3F7h |
|
||||||
|
|___________|_______________|_______________|
|
||||||
|
| Secondary | 170h - 177h | 376h - 377h |
|
||||||
|
|___________|_______________|_______________|
|
||||||
|
|
||||||
|
Table 1. Compatibility resource mappings
|
||||||
|
|
||||||
|
b) In Native-PCI mode, IDE registers are mapped into IO space using the BARs
|
||||||
|
in IDE controller's PCI Configuration Space, shown in the Table 2 below.
|
||||||
|
___________________________________________________
|
||||||
|
| | Command Block | Control Block |
|
||||||
|
| Channel | Registers | Registers |
|
||||||
|
|___________|___________________|___________________|
|
||||||
|
| Primary | BAR at offset 0x10| BAR at offset 0x14|
|
||||||
|
|___________|___________________|___________________|
|
||||||
|
| Secondary | BAR at offset 0x18| BAR at offset 0x1C|
|
||||||
|
|___________|___________________|___________________|
|
||||||
|
|
||||||
|
Table 2. BARs for Register Mapping
|
||||||
|
|
||||||
|
@param[in] PciIo Pointer to the EFI_PCI_IO_PROTOCOL instance
|
||||||
|
@param[in, out] IdeRegisters Pointer to EFI_IDE_REGISTERS which is used to
|
||||||
|
store the IDE i/o port registers' base addresses
|
||||||
|
|
||||||
|
@retval EFI_UNSUPPORTED Return this value when the BARs is not IO type
|
||||||
|
@retval EFI_SUCCESS Get the Base address successfully
|
||||||
|
@retval Other Read the pci configureation data error
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
GetIdeRegisterIoAddr (
|
||||||
|
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||||
|
IN OUT EFI_IDE_REGISTERS *IdeRegisters
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function is used to send out ATAPI commands conforms to the Packet Command
|
||||||
|
with PIO Data In Protocol.
|
||||||
|
|
||||||
|
@param[in] PciIo Pointer to the EFI_PCI_IO_PROTOCOL instance
|
||||||
|
@param[in] IdeRegisters Pointer to EFI_IDE_REGISTERS which is used to
|
||||||
|
store the IDE i/o port registers' base addresses
|
||||||
|
@param[in] Channel The channel number of device.
|
||||||
|
@param[in] Device The device number of device.
|
||||||
|
@param[in] Packet A pointer to EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET data structure.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS send out the ATAPI packet command successfully
|
||||||
|
and device sends data successfully.
|
||||||
|
@retval EFI_DEVICE_ERROR the device failed to send data.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AtaPacketCommandExecute (
|
||||||
|
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||||
|
IN EFI_IDE_REGISTERS *IdeRegisters,
|
||||||
|
IN UINT8 Channel,
|
||||||
|
IN UINT8 Device,
|
||||||
|
IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Send ATA command into device with NON_DATA protocol
|
||||||
|
|
||||||
|
@param PciIo A pointer to ATA_ATAPI_PASS_THRU_INSTANCE data structure.
|
||||||
|
@param IdeRegisters A pointer to EFI_IDE_REGISTERS data structure.
|
||||||
|
@param AtaCommandBlock A pointer to EFI_ATA_COMMAND_BLOCK data structure.
|
||||||
|
@param AtaStatusBlock A pointer to EFI_ATA_STATUS_BLOCK data structure.
|
||||||
|
@param Timeout The time to complete the command.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Reading succeed
|
||||||
|
@retval EFI_ABORTED Command failed
|
||||||
|
@retval EFI_DEVICE_ERROR Device status error.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AtaNonDataCommandIn (
|
||||||
|
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||||
|
IN EFI_IDE_REGISTERS *IdeRegisters,
|
||||||
|
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||||
|
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||||
|
IN UINT64 Timeout
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Perform an ATA Udma operation (Read, ReadExt, Write, WriteExt).
|
||||||
|
|
||||||
|
@param PciIo A pointer to ATA_ATAPI_PASS_THRU_INSTANCE data structure.
|
||||||
|
@param IdeRegisters A pointer to EFI_IDE_REGISTERS data structure.
|
||||||
|
@param Read Flag used to determine the data transfer direction.
|
||||||
|
Read equals 1, means data transferred from device to host;
|
||||||
|
Read equals 0, means data transferred from host to device.
|
||||||
|
@param DataBuffer A pointer to the source buffer for the data.
|
||||||
|
@param DataLength The length of the data.
|
||||||
|
@param AtaCommandBlock A pointer to EFI_ATA_COMMAND_BLOCK data structure.
|
||||||
|
@param AtaStatusBlock A pointer to EFI_ATA_STATUS_BLOCK data structure.
|
||||||
|
@param Timeout The time to complete the command.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS the operation is successful.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Build PRD table failed
|
||||||
|
@retval EFI_UNSUPPORTED Unknown channel or operations command
|
||||||
|
@retval EFI_DEVICE_ERROR Ata command execute failed
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AtaUdmaInOut (
|
||||||
|
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||||
|
IN EFI_IDE_REGISTERS *IdeRegisters,
|
||||||
|
IN BOOLEAN Read,
|
||||||
|
IN VOID *DataBuffer,
|
||||||
|
IN UINT64 DataLength,
|
||||||
|
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||||
|
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||||
|
IN UINT64 Timeout
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function is used to send out ATA commands conforms to the PIO Data In Protocol.
|
||||||
|
|
||||||
|
@param PciIo A pointer to ATA_ATAPI_PASS_THRU_INSTANCE data structure.
|
||||||
|
@param IdeRegisters A pointer to EFI_IDE_REGISTERS data structure.
|
||||||
|
@param Buffer A pointer to the source buffer for the data.
|
||||||
|
@param ByteCount The length of the data.
|
||||||
|
@param Read Flag used to determine the data transfer direction.
|
||||||
|
Read equals 1, means data transferred from device to host;
|
||||||
|
Read equals 0, means data transferred from host to device.
|
||||||
|
@param AtaCommandBlock A pointer to EFI_ATA_COMMAND_BLOCK data structure.
|
||||||
|
@param AtaStatusBlock A pointer to EFI_ATA_STATUS_BLOCK data structure.
|
||||||
|
@param Timeout The time to complete the command.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS send out the ATA command and device send required data successfully.
|
||||||
|
@retval EFI_DEVICE_ERROR command sent failed.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AtaPioDataInOut (
|
||||||
|
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||||
|
IN EFI_IDE_REGISTERS *IdeRegisters,
|
||||||
|
IN OUT VOID *Buffer,
|
||||||
|
IN UINT64 ByteCount,
|
||||||
|
IN BOOLEAN Read,
|
||||||
|
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||||
|
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||||
|
IN UINT64 Timeout
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user