707 lines
24 KiB
C
707 lines
24 KiB
C
/** @file
|
|
_H2O_SD_HOST_IO_PPI
|
|
|
|
;******************************************************************************
|
|
;* Copyright (c) 2013 - 2018, Insyde Software Corp. All Rights Reserved.
|
|
;*
|
|
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
|
|
;* transmit, broadcast, present, recite, release, license or otherwise exploit
|
|
;* any part of this publication in any form, by any means, without the prior
|
|
;* written permission of Insyde Software Corporation.
|
|
;*
|
|
;******************************************************************************
|
|
*/
|
|
|
|
#ifndef _H2O_SD_HOST_IO_PEI_H_
|
|
#define _H2O_SD_HOST_IO_PEI_H_
|
|
|
|
//
|
|
#define H2O_SD_HOST_IO_PPI_GUID \
|
|
{ \
|
|
0xaf6e2bb9, 0x96fd, 0x4f8f, 0xaf, 0x73, 0x1c, 0x27, 0x92, 0x51, 0x8c, 0xbf \
|
|
}
|
|
|
|
typedef struct _H2O_SD_HOST_IO_PPI H2O_SD_HOST_IO_PPI;
|
|
|
|
#define H2O_SD_HOST_IO_PPI_REVISION_01 0x01
|
|
|
|
#define TIMEOUT_1S (1000)
|
|
#define TIMEOUT_250MS (250)
|
|
//
|
|
// Command timeout will be max 100 ms
|
|
//
|
|
#define TIMEOUT_COMMAND (100)
|
|
#define TIMEOUT_DATA (5000)
|
|
|
|
//
|
|
// Sd Host MMIO Registers
|
|
//
|
|
#define SDMA_ADDR 0x00
|
|
#define BLOCK_SIZE 0x04
|
|
#define BLEN_512BYTES (0x200 << 0)
|
|
#define BLOCK_COUNT 0x06
|
|
#define ARGUMENT 0x08 //It is Specified as bit39-8 of Command Format.
|
|
#define TRANSMODE 0x0C
|
|
#define DE_ENABLE BIT0
|
|
#define BCE_ENABLE BIT1
|
|
#define ACMD12_ENABLE BIT2
|
|
#define TRANS_DIRECTION BIT4
|
|
#define DDIR_READ BIT4
|
|
#define DDIR_WRITE (0x0 << 4)
|
|
#define MSBS_SGLEBLK (0x0 << 5)
|
|
#define MSBS_MULTBLK BIT5
|
|
#define RSP_TYPE_MASK (0x3 << 16) // 00Eh bit0 ~ bit1
|
|
#define RSP_TYPE_136BITS BIT16 // 00Eh bit0 ~ bit1
|
|
#define RSP_TYPE_48BITS (0x2 << 16) // 00Eh bit0 ~ bit1
|
|
#define RSP_48_CHECK_BUSY (0x3 << 16) // 00Eh bit0 ~ bit1
|
|
#define CCCE_ENABLE BIT19 // 00Eh bit3
|
|
#define CICE_ENABLE BIT20 // 00Eh bit4
|
|
#define DATA_PRESENT BIT21 // 00Eh bit5
|
|
#define COMMAND_TYPE (0x3 << 22)
|
|
#define NORMAL_CMD (0x0 << 22) // 00Eh bit6 ~ bit1
|
|
#define SUSPEND_CMD (0x1 << 22) // 00Eh bit6 ~ bit7
|
|
#define RESUME_CMD (0x2 << 22) // 00Eh bit6 ~ bit7
|
|
#define ABORT_CMD (0x3 << 22) // 00Eh bit6 ~ bit7
|
|
#define COMMAND_REG 0x0E
|
|
#define RESPONSE 0x10
|
|
#define BUFFER 0x20
|
|
#define PRESENT_STATE 0x24
|
|
#define CMDI_MASK BIT0
|
|
#define CMDI_ALLOWED (0x0 << 0)
|
|
#define CMDI_NOT_ALLOWED BIT0
|
|
#define DATAI_MASK BIT1
|
|
#define DATAI_ALLOWED (0x0 << 1)
|
|
#define DATAI_NOT_ALLOWED BIT1
|
|
#define DATA_LINE_ACT BIT2
|
|
#define CARD_INSERTED BIT16
|
|
#define SDWP BIT19
|
|
#define HOST_CONTROL 0x28
|
|
#define DTW BIT1
|
|
#define DTW_1_BIT (0x0 << 1)
|
|
#define DTW_4_BIT BIT1
|
|
#define DTW_8_BIT BIT5
|
|
#define HS_EN BIT2
|
|
#define DMA_SELECT_MASK (0x03 << 3)
|
|
#define SDMA_SELECT (0x00 << 3)
|
|
#define ADMA1_32_SELECT (0x01 << 3)
|
|
#define ADMA2_32_SELECT (0x02 << 3)
|
|
#define ADMA2_64_SELECT (0x03 << 3)
|
|
#define SDBP_MASK BIT8 // 029h bit0
|
|
#define SDBP_OFF (0x0 << 8) // 029h bit0
|
|
#define SDBP_ON BIT8 // 029h bit0
|
|
#define SDVS_1_8_V (0x5 << 9) // 029h bit1 ~ bit3
|
|
#define SDVS_3_0_V (0x6 << 9) // 029h bit1 ~ bit3
|
|
#define SDVS_3_3_V (0x7 << 9) // 029h bit1 ~ bit3
|
|
#define IWE BIT24 // 02Bh bit0
|
|
#define POWER_CONTROL 0x29
|
|
#define BLK_GAP_CONTROL 0x2A
|
|
#define WAKEUP_CONTROL 0x2B
|
|
#define CLOCK_CONTROL 0x2C
|
|
#define ICE BIT0
|
|
#define ICS_MASK BIT1
|
|
#define ICS BIT1
|
|
#define CEN BIT2
|
|
#define CLKD_8BITS_MASK (0xFF << 8)
|
|
#define CLKD_10BITS_MASK (0xFFC << 4)
|
|
#define DTO_MASK (0xF << 16) // 02Eh bit0 ~ bit3
|
|
#define DTO_VAL (0xE << 16) // 02Eh bit0 ~ bit3
|
|
#define SOFT_RESET_ALL BIT24 // 02Fh bit0
|
|
#define SOFT_RESET_CMD BIT25 // 02Fh bit1
|
|
#define SOFT_RESET_DATA BIT26 // 02Fh bit2
|
|
#define TIMEOUT_CONTROL 0x2E
|
|
#define SOFT_RESET 0x2F
|
|
#define RESET_ALL BIT0
|
|
#define INTERRUPT_STATUS 0x30
|
|
#define CC BIT0
|
|
#define TC BIT1
|
|
#define BGAP BIT2
|
|
#define DMA_INT BIT3
|
|
#define BWR BIT4
|
|
#define BRR BIT5
|
|
#define ERRI BIT15
|
|
#define CTO BIT16 // 032h bit0
|
|
#define CMD_CRC_ERR BIT17 // 032h bit1
|
|
#define CMD_END_BIT_ERR BIT18 // 032h bit2
|
|
#define CMD_IDX_ERR BIT19 // 032h bit3
|
|
#define DATA_TIMEOUT_ERR BIT20 // 032h bit4
|
|
#define DATA_CRC_ERR BIT21 // 032h bit5
|
|
#define DATA_END_BIT_ERR BIT22 // 032h bit6
|
|
#define ADMA_ERR BIT25 // 032h bit9
|
|
#define ERROR_INT_STATUS 0x32
|
|
#define INT_STATUS_ENABLE 0x34
|
|
#define CC_EN BIT0
|
|
#define TC_EN BIT1
|
|
#define BGAP_EN BIT2
|
|
#define DMA_EN BIT3
|
|
#define BWR_EN BIT4
|
|
#define BRR_EN BIT5
|
|
#define ERROR_INT_STSATUS_EN_ALL (0xFFFF << 16)
|
|
#define CTO_EN BIT16 // 036h bit0
|
|
#define CCRC_EN BIT17 // 036h bit1
|
|
#define CEB_EN BIT18 // 036h bit2
|
|
#define CIE_EN BIT19 // 036h bit3
|
|
#define DTO_EN BIT20 // 036h bit4
|
|
#define DCRC_EN BIT21 // 036h bit5
|
|
#define DEB_EN BIT22 // 036h bit6
|
|
#define CLME_EN BIT23 // 036h bit7
|
|
#define ACMDE_EN BIT24 // 036h bit8
|
|
#define ADMAERR_EN BIT25 // 036h bit9
|
|
#define CERR_EN BIT28 // 036h bit12
|
|
#define BADA_EN BIT29 // 036h bit13
|
|
#define ERROR_INT_STATUS_ENABLE 0x36
|
|
#define INT_SIGNAL_ENABLE 0x38
|
|
#define CC_SIGEN BIT0
|
|
#define TC_SIGEN BIT1
|
|
#define BWR_SIGEN BIT4
|
|
#define BRR_SIGEN BIT5
|
|
#define CTO_SIGEN BIT16 // 03Ah bit0
|
|
#define CCRC_SIGEN BIT17 // 03Ah bit1
|
|
#define CEB_SIGEN BIT18 // 03Ah bit2
|
|
#define CIE_SIGEN BIT19 // 03Ah bit3
|
|
#define DTO_SIGEN BIT20 // 03Ah bit4
|
|
#define DCRC_SIGEN BIT21 // 03Ah bit5
|
|
#define DEB_SIGEN BIT22 // 03Ah bit6
|
|
#define CERR_SIGEN BIT28 // 03Ah bit12
|
|
#define BADA_SIGEN BIT29 // 03Ah bit13
|
|
#define ERROR_INT_SIGNAL_ENABLE 0x3A
|
|
#define AUTO_CMD12_ERROR_STATUS 0x3C
|
|
#define HOST_CONTROL_2 0x3E
|
|
#define V18_SIGNALING BIT3
|
|
#define HOST_VER_4_ENABLE BIT12
|
|
#define CAPABILITIES 0x40
|
|
#define VS33 BIT24
|
|
#define VS30 BIT25
|
|
#define VS18 BIT26
|
|
#define MAX_CURRENT_CAPABILITIES 0x48
|
|
#define FORCE_EVENT_FOR_CMD12 0x50
|
|
#define FORCE_EVENT_FOR_ERR_INT 0x52
|
|
#define ADMA_ERROR_STATUS 0x54
|
|
#define ADMA_ADDR_LOW32 0x58
|
|
#define ADMA_ADDR_HIGH32 0x5C
|
|
#define SLOT_INT_STATUS 0xFC
|
|
#define HOST_CONTROLLER_VER 0xFE
|
|
|
|
#define SD_HOST_SPEC_VER_100 0x00
|
|
#define SD_HOST_SPEC_VER_200 0x01
|
|
#define SD_HOST_SPEC_VER_300 0x02
|
|
#define SD_HOST_SPEC_VER_400 0x03
|
|
#define SD_HOST_SPEC_VER_410 0x04
|
|
#define SD_HOST_SPEC_VER_420 0x05
|
|
|
|
//
|
|
// Commands
|
|
//
|
|
#define CMD0 0
|
|
#define CMD1 1
|
|
#define CMD2 2
|
|
#define CMD3 3
|
|
#define CMD4 4
|
|
#define CMD5 5
|
|
#define CMD6 6
|
|
#define CMD7 7
|
|
#define CMD8 8
|
|
#define CMD9 9
|
|
#define CMD10 10
|
|
#define CMD11 11
|
|
#define CMD12 12
|
|
#define CMD13 13
|
|
#define CMD14 14
|
|
#define CMD15 15
|
|
#define CMD16 16
|
|
#define CMD17 17
|
|
#define CMD18 18
|
|
#define CMD19 19
|
|
#define CMD20 20
|
|
#define CMD23 23
|
|
#define CMD24 24
|
|
#define CMD25 25
|
|
#define CMD26 26
|
|
#define CMD27 27
|
|
#define CMD28 28
|
|
#define CMD29 29
|
|
#define CMD30 30
|
|
#define CMD35 35
|
|
#define CMD36 36
|
|
#define CMD38 38
|
|
#define CMD39 39
|
|
#define CMD40 40
|
|
#define CMD42 42
|
|
#define CMD52 52
|
|
#define CMD53 53
|
|
#define CMD55 55
|
|
#define CMD56 56
|
|
|
|
#define ACMD6 6
|
|
#define ACMD13 13
|
|
#define ACMD23 23
|
|
#define ACMD41 41
|
|
#define ACMD42 42
|
|
#define ACMD51 51
|
|
|
|
#define CHECK_PATTERN 0xAA
|
|
#define VOLTAGE_27_36 0x1
|
|
//#define CMD8_ARG (0x0 << 12 | BIT8 | 0xAA << 0) // Reserved(0)[12:31], Supply voltage(1)[11:8], check pattern(0xCE)[7:0] = 0xAA
|
|
#define HCS BIT30 // For ACMD41: Host capacity support/1 = Supporting high capacity
|
|
#define CLOCK_400KHZ 400
|
|
#define CLOCK_26MHZ 26000
|
|
#define BUS_1BIT 0x00
|
|
#define BUS_4BIT 0x02
|
|
//
|
|
// DMA related definitions
|
|
//
|
|
#define SDMA_BOUNDARY_SIZE (4*1024) //4k. In CloverTrail, it's 512k.
|
|
#define MAX_TRANS_SIZE_PER_ENTR 0x10000
|
|
|
|
#define ADMA1_PAGE_SIZE 0x1000
|
|
#define ADMA2_64BIT_ALIGN 0x0008
|
|
#define ADMA2_32BIT_ALIGN 0x0004
|
|
#define ADMA1_32BIT_ALIGN ADMA1_PAGE_SIZE
|
|
#define SDMA_ALIGN ADMA2_32BIT_ALIGN //Minimum of ADMA alignment.
|
|
|
|
//
|
|
// Card Status in ResponseR1
|
|
//
|
|
#define ADDRESS_OUT_OF_RANGE BIT31
|
|
#define ADDRESS_MISALIGN BIT30
|
|
#define BLOCK_LEN_ERROR BIT29
|
|
#define ERASE_SEQ_ERROR BIT28
|
|
#define ERASE_PARAM BIT27
|
|
#define WP_VIOLATION BIT26
|
|
#define CARD_IS_LOCKED BIT25
|
|
#define LOCK_UNLOCK_FAILED BIT24
|
|
#define COM_CRC_ERROR BIT23
|
|
#define ILLEGAL_COMMAND BIT22
|
|
#define CARD_ECC_FAILED BIT21
|
|
#define CC_ERROR BIT20
|
|
#define UNKNOWN_ERROR BIT19
|
|
#define CSD_OVERWRITE BIT16
|
|
#define WP_ERASE_SKIP BIT15
|
|
#define CARD_ECC_DISABLED BIT14
|
|
#define ERASE_RESET BIT13
|
|
#define CURRENT_STATE (BIT12 | BIT11 | BIT10 | BIT9)
|
|
#define READY_FOR_DATA BIT8
|
|
#define APP_CMD_STATUS BIT5
|
|
#define AKE_SEQ_ERROR BIT3
|
|
|
|
#define INDX(CMD_INDX) ((CMD_INDX & 0x3F) << 24)
|
|
|
|
//
|
|
// Capability Slot Type
|
|
//
|
|
#define REMOVABLE_CARD_SLOT 0
|
|
#define EMBEDDED_SLOT_FOR_ONE_DEVICE 1
|
|
#define SHARED_BUS_SLOT 2
|
|
|
|
#define MAX_SLOT_NUM 6
|
|
|
|
#pragma pack(1)
|
|
|
|
typedef struct {
|
|
UINT32 Valid :1;
|
|
UINT32 End :1;
|
|
UINT32 Int :1;
|
|
UINT32 Reserved0 :1;
|
|
UINT32 Act :2;
|
|
UINT32 Reserved :6;
|
|
UINT32 AddrOrDataLen :20;
|
|
} ADMA1_DESCRIPTOR_TABLE;
|
|
|
|
typedef struct {
|
|
UINT32 Valid :1;
|
|
UINT32 End :1;
|
|
UINT32 Int :1;
|
|
UINT32 Reserved0 :1;
|
|
UINT32 Act :2;
|
|
UINT32 Reserved :10;
|
|
UINT32 Length :16;
|
|
UINT32 Address;
|
|
} ADMA2_32BIT_DESCRIPTOR_TABLE;
|
|
|
|
typedef struct {
|
|
UINT32 Valid :1;
|
|
UINT32 End :1;
|
|
UINT32 Int :1;
|
|
UINT32 Reserved0 :1;
|
|
UINT32 Act :2;
|
|
UINT32 Reserved :10;
|
|
UINT32 Length :16;
|
|
UINT64 Address;
|
|
} ADMA2_64BIT_DESCRIPTOR_TABLE;
|
|
|
|
typedef enum {
|
|
NoOperation = 0,
|
|
Reserved = 1,
|
|
SetDataLength = 1,
|
|
TransferData = 2,
|
|
LinkDescriptor = 3
|
|
} ADMA_ACTION_SYMBOLS;
|
|
|
|
typedef struct {
|
|
UINT32 TimeoutClockFreq :6;
|
|
UINT32 Reserved_0 :1;
|
|
UINT32 TimeoutClockUnit :1;
|
|
UINT32 SDBaseClockFreq :8;
|
|
UINT32 MaxBlockLenth :2;
|
|
UINT32 ExtBusWidth :1;
|
|
UINT32 ADMA2Support :1;
|
|
UINT32 ADMA1Support :1;
|
|
UINT32 HighSpeedSupport :1;
|
|
UINT32 SDMASupport :1;
|
|
UINT32 SusResSupport :1;
|
|
UINT32 Support3_3V :1;
|
|
UINT32 Support3_0V :1;
|
|
UINT32 Support1_8V :1;
|
|
UINT32 Reserved_1 :1;
|
|
UINT32 Support64bitBus :1;
|
|
UINT32 AsyncIntSupport :1;
|
|
UINT32 SlotType :2;
|
|
UINT32 SDR50Support :1;
|
|
UINT32 SDR104Support :1;
|
|
UINT32 DDR50Support :1;
|
|
UINT32 Reserved_2 :1;
|
|
UINT32 TypeASupport :1;
|
|
UINT32 TypeCSupport :1;
|
|
UINT32 TypeDSupport :1;
|
|
UINT32 Reserved_3 :1;
|
|
UINT32 ReTuneTimer :4;
|
|
UINT32 Reserved_4 :1;
|
|
UINT32 SDR50Tuning :1;
|
|
UINT32 ReTuneMode :2;
|
|
UINT32 ClockMultipler :8;
|
|
UINT32 Reserved_5 :8;
|
|
} HOST_CAPABILITY;
|
|
|
|
typedef enum {
|
|
SdHostIoWidthUint8 = 0,
|
|
SdHostIoWidthUint16,
|
|
SdHostIoWidthUint32,
|
|
SdHostIoWidthUint64
|
|
} H2O_SD_HOST_IO_WIDTH;
|
|
|
|
typedef enum {
|
|
ResponseNo = 0,
|
|
ResponseR1,
|
|
ResponseR1b,
|
|
ResponseR2,
|
|
ResponseR3,
|
|
ResponseR4,
|
|
ResponseR5,
|
|
ResponseR5b,
|
|
ResponseR6,
|
|
ResponseR7
|
|
} RESPONSE_TYPE;
|
|
|
|
typedef enum {
|
|
NoData = 0,
|
|
InData,
|
|
OutData
|
|
} TRANSFER_TYPE;
|
|
|
|
typedef enum {
|
|
ResetAuto = 0,
|
|
ResetDat,
|
|
ResetCmd,
|
|
ResetDatCmd,
|
|
ResetAll,
|
|
} RESET_TYPE;
|
|
|
|
#pragma pack()
|
|
|
|
/**
|
|
Reads data from specific host register.
|
|
|
|
@param[in] This Pointer to H2O_SD_HOST_IO_PROTOCOL
|
|
@param[in] Width Data width
|
|
@param[in] Offset Offset of host register
|
|
@param[in,out] Buffer Pointer to output
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
@retval EFI_UNSUPPORTED Unsupported data width
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_READ) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN H2O_SD_HOST_IO_WIDTH Width,
|
|
IN UINT64 Offset,
|
|
IN OUT VOID *Buffer
|
|
);
|
|
|
|
/**
|
|
Writes data to specific host register.
|
|
|
|
@param[in] This Pointer to H2O_SD_HOST_IO_PROTOCOL
|
|
@param[in] Width Data width
|
|
@param[in] Offset Offset of host register
|
|
@param[in] Buffer Pointer to input data
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
@retval EFI_UNSUPPORTED Unsupported data width
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_WRITE) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN H2O_SD_HOST_IO_WIDTH Width,
|
|
IN UINT64 Offset,
|
|
IN VOID *Buffer
|
|
);
|
|
|
|
/**
|
|
Executes a logic OR operation on Data and specific host register.
|
|
|
|
@param[in] This Pointer to H2O_SD_HOST_IO_PROTOCOL
|
|
@param[in] Width Data width
|
|
@param[in] Offset Offset of host register
|
|
@param[in] Data Input data
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
@retval EFI_UNSUPPORTED Unsupported data width
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_OR) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN H2O_SD_HOST_IO_WIDTH Width,
|
|
IN UINT64 Offset,
|
|
IN UINTN Data
|
|
);
|
|
|
|
/**
|
|
Executes a logic AND operation on Data and specific host register.
|
|
|
|
@param[in] This Pointer to H2O_SD_HOST_IO_PROTOCOL
|
|
@param[in] Width Data width
|
|
@param[in] Offset Offset of host register
|
|
@param[in] Data Input data
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
@retval EFI_UNSUPPORTED Unsupported data width
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_AND) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN H2O_SD_HOST_IO_WIDTH Width,
|
|
IN UINT64 Offset,
|
|
IN UINTN Data
|
|
);
|
|
|
|
/**
|
|
The main function used to send the command to the card inserted into the SD host
|
|
slot.
|
|
It will assemble the arguments to set the command register and wait for the command
|
|
and transfer completed until timeout. Then it will read the response register to fill
|
|
the ResponseData
|
|
|
|
@param[in] This Pointer to H2O_SD_HOST_IO_PROTOCOL
|
|
@param[in] CommandIndex The command index to set the command index field of command register
|
|
@param[in] Argument Command argument to set the argument field of command register
|
|
@param[in] DataType TRANSFER_TYPE, indicates no data, data in or data out
|
|
@param[in] Buffer Contains the data read from / write to the device
|
|
@param[in] BufferSize The size of the buffer
|
|
@param[in] ResponseType RESPONSE_TYPE
|
|
@param[in] TimeOut Time out value in 1 ms unit
|
|
@param[in] ResponseData Depending on the ResponseType, such as CSD or card status
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
@retval EFI_UNSUPPORTED Transfer mode is unsupported
|
|
@retval EFI_DEVICE_ERROR Data transfer error
|
|
@retval EFI_TIMEOUT Data transfer time-out
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_SEND_COMMAND) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN UINT16 CommandIndex,
|
|
IN UINT32 Argument,
|
|
IN TRANSFER_TYPE DataType,
|
|
IN UINT8 *Buffer, OPTIONAL
|
|
IN UINT32 BufferSize,
|
|
IN RESPONSE_TYPE ResponseType,
|
|
IN UINT32 TimeOut,
|
|
OUT UINT32 *ResponseData OPTIONAL
|
|
);
|
|
|
|
/**
|
|
Set max clock frequency of the host, the actual frequency
|
|
may not be the same as MaxFrequencyInKHz. It depends on
|
|
the max frequency the host can support, divider, and host
|
|
speed mode.
|
|
|
|
@param[in] This Pointer to EFI_SD_HOST_IO_PROTOCOL
|
|
@param[in] MaxFrequencyInKHz Max frequency in Khz
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
@retval EFI_TIMEOUT Data transfer time-out
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_SET_CLOCK_FREQUENCY) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN UINT32 *MaxFrequency
|
|
);
|
|
|
|
/**
|
|
Set bus width of the host.
|
|
|
|
@param[in] This Pointer to EFI_SD_HOST_IO_PROTOCOL
|
|
@param[in] BusWidth Bus width in 1, 4, 8 bits
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
@retval EFI_INVALID_PARAMETER Invalid bus width
|
|
@retval EFI_UNSUPPORTED Target width is unsupported
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_SET_BUS_WIDTH) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN UINT32 BusWidth
|
|
);
|
|
|
|
/**
|
|
Set voltage which could supported by the host.
|
|
Support 0(Power off the host), 1.8V, 3.0V, 3.3V
|
|
|
|
@param[in] This Pointer to EFI_SD_HOST_IO_PROTOCOL
|
|
@param[in] Voltage Units in 0.1 V
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
@retval EFI_UNSUPPORTED Target voltage is unsupported
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_SET_HOST_VOLTAGE) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN UINT32 Voltage
|
|
);
|
|
|
|
/**
|
|
Reset the host.
|
|
|
|
@param[in] This Pointer to EFI_SD_HOST_IO_PROTOCOL
|
|
@param[in] ResetType RESET_TYPE
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
@retval EFI_TIMEOUT Operation time-out
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_RESET_SD_HOST) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN RESET_TYPE ResetType
|
|
);
|
|
|
|
/**
|
|
Find whether these is a card inserted into the slot. If so
|
|
init the host. If not, return EFI_NOT_FOUND.
|
|
|
|
@param[in] This Pointer to EFI_SD_HOST_IO_PROTOCOL
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
@retval EFI_NOT_FOUND No card is inserted
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_DETECT_CARD_AND_INIT_HOST) (
|
|
IN H2O_SD_HOST_IO_PPI *This
|
|
);
|
|
|
|
/**
|
|
Set Host mode in DDR.
|
|
|
|
@param[in] This Pointer to H2O_SD_HOST_IO_PROTOCOL
|
|
@param[in] DdrMode TRUE for DDR Mode set, FALSE returns EFI_SUCCESS
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_SET_HOST_DDR_MODE) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN BOOLEAN DdrMode
|
|
);
|
|
|
|
/**
|
|
Set Host in High Speed.
|
|
|
|
@param[in] This Pointer to H2O_SD_HOST_IO_PROTOCOL
|
|
@param[in] HighSpeed TRUE for High Speed Mode set, FALSE for normal mode
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_SET_HOST_SPEED_MODE) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN BOOLEAN HighSpeed
|
|
);
|
|
|
|
/**
|
|
Set auto CMD12
|
|
|
|
@param[in] This Pointer to H2O_SD_HOST_IO_PROTOCOL
|
|
@param[in] Enable TRUE for auto CMD12 set, FALSE for auto CMD12 not set
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_ENABLE_AUTO_STOP_CMD) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN BOOLEAN Enable
|
|
);
|
|
|
|
/**
|
|
Get slot number.
|
|
|
|
@param[in] This Pointer to H2O_SD_HOST_IO_PROTOCOL
|
|
@param[in,out] SlotNum Pointer to slot number
|
|
|
|
@retval EFI_SUCCESS Operation succeed
|
|
@retval EFI_INVALID_PARAMETER Invalid input
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *H2O_SD_HOST_IO_PPI_GET_SLOT_NUM) (
|
|
IN H2O_SD_HOST_IO_PPI *This,
|
|
IN OUT UINT8 *SlotNum
|
|
);
|
|
|
|
struct _H2O_SD_HOST_IO_PPI {
|
|
UINT32 Revision;
|
|
HOST_CAPABILITY HostCapability;
|
|
H2O_SD_HOST_IO_PPI_READ SdHostRead;
|
|
H2O_SD_HOST_IO_PPI_WRITE SdHostWrite;
|
|
H2O_SD_HOST_IO_PPI_OR SdHostOr;
|
|
H2O_SD_HOST_IO_PPI_AND SdHostAnd;
|
|
H2O_SD_HOST_IO_PPI_SEND_COMMAND SendCommand;
|
|
H2O_SD_HOST_IO_PPI_SET_CLOCK_FREQUENCY SetClockFrequency;
|
|
H2O_SD_HOST_IO_PPI_SET_BUS_WIDTH SetBusWidth;
|
|
H2O_SD_HOST_IO_PPI_SET_HOST_VOLTAGE SetHostVoltage;
|
|
H2O_SD_HOST_IO_PPI_RESET_SD_HOST ResetSdHost;
|
|
H2O_SD_HOST_IO_PPI_DETECT_CARD_AND_INIT_HOST DetectCardAndInitHost;
|
|
H2O_SD_HOST_IO_PPI_SET_HOST_SPEED_MODE SetHostSpeedMode;
|
|
H2O_SD_HOST_IO_PPI_SET_HOST_DDR_MODE SetHostDdrMode;
|
|
H2O_SD_HOST_IO_PPI_ENABLE_AUTO_STOP_CMD EnableAutoStopCmd;
|
|
H2O_SD_HOST_IO_PPI_GET_SLOT_NUM GetSlotNum;
|
|
};
|
|
|
|
extern EFI_GUID gH2OSdHostIoPpiGuid;
|
|
|
|
#endif
|