/** @file Copyright (c) 2015, Intel Corporation. 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 _EMMC_HCI_H_ #define _EMMC_HCI_H_ // // EMMC Host Controller MMIO Register Offset // #define EMMC_HC_SDMA_ADDR 0x00 #define EMMC_HC_ARG2 0x00 #define EMMC_HC_BLK_SIZE 0x04 #define EMMC_HC_BLK_COUNT 0x06 #define EMMC_HC_ARG1 0x08 #define EMMC_HC_TRANS_MOD 0x0C #define EMMC_HC_COMMAND 0x0E #define EMMC_HC_RESPONSE 0x10 #define EMMC_HC_BUF_DAT_PORT 0x20 #define EMMC_HC_PRESENT_STATE 0x24 #define EMMC_HC_HOST_CTRL1 0x28 #define EMMC_HC_POWER_CTRL 0x29 #define EMMC_HC_BLK_GAP_CTRL 0x2A #define EMMC_HC_WAKEUP_CTRL 0x2B #define EMMC_HC_CLOCK_CTRL 0x2C #define EMMC_HC_TIMEOUT_CTRL 0x2E #define EMMC_HC_SW_RST 0x2F #define EMMC_HC_NOR_INT_STS 0x30 #define EMMC_HC_ERR_INT_STS 0x32 #define EMMC_HC_NOR_INT_STS_EN 0x34 #define EMMC_HC_ERR_INT_STS_EN 0x36 #define EMMC_HC_NOR_INT_SIG_EN 0x38 #define EMMC_HC_ERR_INT_SIG_EN 0x3A #define EMMC_HC_AUTO_CMD_ERR_STS 0x3C #define EMMC_HC_HOST_CTRL2 0x3E #define EMMC_HC_CAP 0x40 #define EMMC_HC_MAX_CURRENT_CAP 0x48 #define EMMC_HC_FORCE_EVT_AUTO_CMD 0x50 #define EMMC_HC_FORCE_EVT_ERR_INT 0x52 #define EMMC_HC_ADMA_ERR_STS 0x54 #define EMMC_HC_ADMA_SYS_ADDR 0x58 #define EMMC_HC_PRESET_VAL 0x60 #define EMMC_HC_SHARED_BUS_CTRL 0xE0 #define EMMC_HC_SLOT_INT_STS 0xFC #define EMMC_HC_CTRL_VER 0xFE // // The transfer modes supported by SD Host Controller // Simplified Spec 3.0 Table 1-2 // typedef enum { EmmcNoData, EmmcPioMode, EmmcSdmaMode, EmmcAdmaMode } EMMC_HC_TRANSFER_MODE; // // The maximum data length of each descriptor line // #define ADMA_MAX_DATA_PER_LINE 0x10000 #define EMMC_SDMA_BOUNDARY 512 * 1024 #define EMMC_SDMA_ROUND_UP(x, n) (((x) + n) & ~(n - 1)) typedef enum { EmmcCommandTypeBc, // Broadcast commands, no response EmmcCommandTypeBcr, // Broadcast commands with response EmmcCommandTypeAc, // Addressed(point-to-point) commands EmmcCommandTypeAdtc // Addressed(point-to-point) data transfer commands } EMMC_COMMAND_TYPE; typedef enum { EmmcResponceTypeR1, EmmcResponceTypeR1b, EmmcResponceTypeR2, EmmcResponceTypeR3, EmmcResponceTypeR4, EmmcResponceTypeR5, EmmcResponceTypeR5b, EmmcResponceTypeR6, EmmcResponceTypeR7 } EMMC_RESPONSE_TYPE; typedef struct _EMMC_COMMAND_BLOCK { UINT16 CommandIndex; UINT32 CommandArgument; UINT32 CommandType; // One of the EMMC_COMMAND_TYPE values UINT32 ResponseType; // One of the EMMC_RESPONSE_TYPE values } EMMC_COMMAND_BLOCK; typedef struct _EMMC_STATUS_BLOCK { UINT32 Resp0; UINT32 Resp1; UINT32 Resp2; UINT32 Resp3; } EMMC_STATUS_BLOCK; typedef struct _EMMC_COMMAND_PACKET { UINT64 Timeout; EMMC_COMMAND_BLOCK *EmmcCmdBlk; EMMC_STATUS_BLOCK *EmmcStatusBlk; VOID *InDataBuffer; VOID *OutDataBuffer; UINT32 InTransferLength; UINT32 OutTransferLength; } EMMC_COMMAND_PACKET; #pragma pack(1) typedef struct { UINT32 Valid:1; UINT32 End:1; UINT32 Int:1; UINT32 Reserved:1; UINT32 Act:2; UINT32 Reserved1:10; UINT32 Length:16; UINT32 Address; } EMMC_HC_ADMA_DESC_LINE; typedef struct { UINT32 TimeoutFreq:6; // bit 0:5 UINT32 Reserved:1; // bit 6 UINT32 TimeoutUnit:1; // bit 7 UINT32 BaseClkFreq:8; // bit 8:15 UINT32 MaxBlkLen:2; // bit 16:17 UINT32 BusWidth8:1; // bit 18 UINT32 Adma2:1; // bit 19 UINT32 Reserved2:1; // bit 20 UINT32 HighSpeed:1; // bit 21 UINT32 Sdma:1; // bit 22 UINT32 SuspRes:1; // bit 23 UINT32 Voltage33:1; // bit 24 UINT32 Voltage30:1; // bit 25 UINT32 Voltage18:1; // bit 26 UINT32 Reserved3:1; // bit 27 UINT32 SysBus64:1; // bit 28 UINT32 AsyncInt:1; // bit 29 UINT32 SlotType:2; // bit 30:31 UINT32 Sdr50:1; // bit 32 UINT32 Sdr104:1; // bit 33 UINT32 Ddr50:1; // bit 34 UINT32 Reserved4:1; // bit 35 UINT32 DriverTypeA:1; // bit 36 UINT32 DriverTypeC:1; // bit 37 UINT32 DriverTypeD:1; // bit 38 UINT32 DriverType4:1; // bit 39 UINT32 TimerCount:4; // bit 40:43 UINT32 Reserved5:1; // bit 44 UINT32 TuningSDR50:1; // bit 45 UINT32 RetuningMod:2; // bit 46:47 UINT32 ClkMultiplier:8; // bit 48:55 UINT32 Reserved6:7; // bit 56:62 UINT32 Hs400:1; // bit 63 } EMMC_HC_SLOT_CAP; #pragma pack() /** Software reset the specified EMMC host controller and enable all interrupts. @param[in] Bar The mmio base address of the slot to be accessed. @retval EFI_SUCCESS The software reset executes successfully. @retval Others The software reset fails. **/ EFI_STATUS EmmcPeimHcReset ( IN UINTN Bar ); /** Set all interrupt status bits in Normal and Error Interrupt Status Enable register. @param[in] Bar The mmio base address of the slot to be accessed. @retval EFI_SUCCESS The operation executes successfully. @retval Others The operation fails. **/ EFI_STATUS EmmcPeimHcEnableInterrupt ( IN UINTN Bar ); /** Get the capability data from the specified slot. @param[in] Bar The mmio base address of the slot to be accessed. @param[out] Capability The buffer to store the capability data. @retval EFI_SUCCESS The operation executes successfully. @retval Others The operation fails. **/ EFI_STATUS EmmcPeimHcGetCapability ( IN UINTN Bar, OUT EMMC_HC_SLOT_CAP *Capability ); /** Detect whether there is a EMMC card attached at the specified EMMC host controller slot. Refer to SD Host Controller Simplified spec 3.0 Section 3.1 for details. @param[in] Bar The mmio base address of the slot to be accessed. @retval EFI_SUCCESS There is a EMMC card attached. @retval EFI_NO_MEDIA There is not a EMMC card attached. @retval Others The detection fails. **/ EFI_STATUS EmmcPeimHcCardDetect ( IN UINTN Bar ); /** Initial EMMC host controller with lowest clock frequency, max power and max timeout value at initialization. @param[in] Bar The mmio base address of the slot to be accessed. @retval EFI_SUCCESS The host controller is initialized successfully. @retval Others The host controller isn't initialized successfully. **/ EFI_STATUS EmmcPeimHcInitHost ( IN UINTN Bar ); /** Send command SWITCH to the EMMC device to switch the mode of operation of the selected Device or modifies the EXT_CSD registers. Refer to EMMC Electrical Standard Spec 5.1 Section 6.10.4 for details. @param[in] Slot The slot number of the Emmc card to send the command to. @param[in] Access The access mode of SWTICH command. @param[in] Index The offset of the field to be access. @param[in] Value The value to be set to the specified field of EXT_CSD register. @param[in] CmdSet The value of CmdSet field of EXT_CSD register. @retval EFI_SUCCESS The operation is done correctly. @retval Others The operation fails. **/ EFI_STATUS EmmcPeimSwitch ( IN EMMC_PEIM_HC_SLOT *Slot, IN UINT8 Access, IN UINT8 Index, IN UINT8 Value, IN UINT8 CmdSet ); /** Send command SET_BLOCK_COUNT to the addressed EMMC device to set the number of blocks for the following block read/write cmd. Refer to EMMC Electrical Standard Spec 5.1 Section 6.10.4 for details. @param[in] Slot The slot number of the Emmc card to send the command to. @param[in] BlockCount The number of the logical block to access. @retval EFI_SUCCESS The operation is done correctly. @retval Others The operation fails. **/ EFI_STATUS EmmcPeimSetBlkCount ( IN EMMC_PEIM_HC_SLOT *Slot, IN UINT16 BlockCount ); /** Send command READ_MULTIPLE_BLOCK/WRITE_MULTIPLE_BLOCK to the addressed EMMC device to read/write the specified number of blocks. Refer to EMMC Electrical Standard Spec 5.1 Section 6.10.4 for details. @param[in] Slot The slot number of the Emmc card to send the command to. @param[in] Lba The logical block address of starting access. @param[in] BlockSize The block size of specified EMMC device partition. @param[in] Buffer The pointer to the transfer buffer. @param[in] BufferSize The size of transfer buffer. @param[in] IsRead Boolean to show the operation direction. @retval EFI_SUCCESS The operation is done correctly. @retval Others The operation fails. **/ EFI_STATUS EmmcPeimRwMultiBlocks ( IN EMMC_PEIM_HC_SLOT *Slot, IN EFI_LBA Lba, IN UINT32 BlockSize, IN VOID *Buffer, IN UINTN BufferSize, IN BOOLEAN IsRead ); /** Execute EMMC device identification procedure. Refer to EMMC Electrical Standard Spec 5.1 Section 6.4 for details. @param[in] Slot The slot number of the Emmc card to send the command to. @retval EFI_SUCCESS There is a EMMC card. @retval Others There is not a EMMC card. **/ EFI_STATUS EmmcPeimIdentification ( IN EMMC_PEIM_HC_SLOT *Slot ); /** Free the resource used by the TRB. @param[in] Trb The pointer to the EMMC_TRB instance. **/ VOID EmmcPeimFreeTrb ( IN EMMC_TRB *Trb ); #endif