mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-24 11:45:27 +01:00
226 lines
7.1 KiB
C
226 lines
7.1 KiB
C
|
/** @file
|
||
|
Header file for IDE mode of ATA host controller.
|
||
|
|
||
|
Copyright (c) 2010 - 2011, 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;
|
||
|
|
||
|
//Slice - add here as VBox
|
||
|
UINT16 DriveAddress;
|
||
|
UINT16 MasterSlave;
|
||
|
//
|
||
|
UINT16 BusMasterBaseAddr;
|
||
|
} EFI_IDE_REGISTERS;
|
||
|
//same for compare
|
||
|
/*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;*/
|
||
|
|
||
|
//
|
||
|
// 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
|
||
|
);
|
||
|
|
||
|
#endif
|
||
|
|