This attribute allows the EFI_MMC_HOST_PROTOCOL interface to manage multiple instances in one driver. EmbeddedPkg/MmcDxe: Add Revision attribute to the EFI_MMC_HOST_PROTOCOL Note: The ARM PL180 and Omap35xx MMC host drivers has been updated. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12255 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			303 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			303 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Main Header file for the MMC DXE driver
 | |
| 
 | |
|   Copyright (c) 2011, ARM Limited. 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 __MMC_H
 | |
| #define __MMC_H
 | |
| 
 | |
| #include <Uefi.h>
 | |
| 
 | |
| #include <Protocol/DiskIo.h>
 | |
| #include <Protocol/BlockIo.h>
 | |
| #include <Protocol/DevicePath.h>
 | |
| #include <Protocol/MmcHost.h>
 | |
| 
 | |
| #include <Library/UefiLib.h>
 | |
| 
 | |
| #define MMC_TRACE(txt)  DEBUG((EFI_D_BLKIO, "MMC: " txt "\n"))
 | |
| 
 | |
| #define MMC_IOBLOCKS_READ       0
 | |
| #define MMC_IOBLOCKS_WRITE      1
 | |
| 
 | |
| #define MMC_OCR_POWERUP             0x80000000
 | |
| 
 | |
| #define MMC_CSD_GET_CCC(Response)    (Response[2] >> 20)
 | |
| #define MMC_CSD_GET_TRANSPEED(Response)    (Response[3] & 0xFF)
 | |
| #define MMC_CSD_GET_READBLLEN(Response)    ((Response[2] >> 16) & 0xF)
 | |
| #define MMC_CSD_GET_WRITEBLLEN(Response)  ((Response[0] >> 22) & 0xF)
 | |
| #define MMC_CSD_GET_FILEFORMAT(Response)  ((Response[0] >> 10) & 0x3)
 | |
| #define MMC_CSD_GET_FILEFORMATGRP(Response)  ((Response[0] >> 15) & 0x1)
 | |
| #define MMC_CSD_GET_DEVICESIZE(csd)         (((Response[1] >> 30) & 0x3) | ((Response[2] & 0x3FF) << 2))
 | |
| #define HC_MMC_CSD_GET_DEVICESIZE(Response)    ((Response[1] >> 16) | ((Response[2] & 0x40) << 16));
 | |
| #define MMC_CSD_GET_DEVICESIZEMULT(csd)     ((Response[1] >> 15) & 0x7)
 | |
| 
 | |
| #define MMC_R0_READY_FOR_DATA               (1 << 8)
 | |
| 
 | |
| #define MMC_R0_CURRENTSTATE(Response)       ((Response[0] >> 9) & 0xF)
 | |
| 
 | |
| #define MMC_R0_STATE_IDLE       0
 | |
| #define MMC_R0_STATE_READY      1
 | |
| #define MMC_R0_STATE_IDENT      2
 | |
| #define MMC_R0_STATE_STDBY      3
 | |
| #define MMC_R0_STATE_TRAN       4
 | |
| #define MMC_R0_STATE_DATA       5
 | |
| 
 | |
| typedef enum {
 | |
|   UNKNOWN_CARD,
 | |
|   MMC_CARD,              //MMC card
 | |
|   MMC_CARD_HIGH,         //MMC Card with High capacity
 | |
|   SD_CARD,               //SD 1.1 card
 | |
|   SD_CARD_2,             //SD 2.0 or above standard card
 | |
|   SD_CARD_2_HIGH         //SD 2.0 or above high capacity card
 | |
| } CARD_TYPE;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32  Reserved0:   7; // 0 
 | |
|   UINT32  V170_V195:   1; // 1.70V - 1.95V
 | |
|   UINT32  V200_V260:   7; // 2.00V - 2.60V
 | |
|   UINT32  V270_V360:   9; // 2.70V - 3.60V
 | |
|   UINT32  RESERVED_1:  5; // Reserved
 | |
|   UINT32  AccessMode:  2; // 00b (byte mode), 10b (sector mode) 
 | |
|   UINT32  Busy:        1; // This bit is set to LOW if the card has not finished the power up routine
 | |
| } OCR;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32  NOT_USED;   // 1 [0:0]
 | |
|   UINT32  CRC;        // CRC7 checksum [7:1]
 | |
|   UINT32  MDT;        // Manufacturing date [19:8]
 | |
|   UINT32  RESERVED_1; // Reserved [23:20]
 | |
|   UINT32  PSN;        // Product serial number [55:24]
 | |
|   UINT8   PRV;        // Product revision [63:56]
 | |
|   UINT8   PNM[5];     // Product name [64:103]
 | |
|   UINT16  OID;        // OEM/Application ID [119:104]
 | |
|   UINT8   MID;        // Manufacturer ID [127:120]
 | |
| } CID;
 | |
| 
 | |
| typedef struct {
 | |
|   UINT8   NOT_USED:           1; // Not used, always 1 [0:0]
 | |
|   UINT8   CRC:                7; // CRC [7:1]
 | |
| 
 | |
|   UINT8   RESERVED_1:         2; // Reserved [9:8]
 | |
|   UINT8   FILE_FORMAT:        2; // File format [11:10]
 | |
|   UINT8   TMP_WRITE_PROTECT:  1; // Temporary write protection [12:12]
 | |
|   UINT8   PERM_WRITE_PROTECT: 1; // Permanent write protection [13:13]
 | |
|   UINT8   COPY:               1; // Copy flag (OTP) [14:14]
 | |
|   UINT8   FILE_FORMAT_GRP:    1; // File format group [15:15]
 | |
|   
 | |
|   UINT16  RESERVED_2:         5; // Reserved [20:16]
 | |
|   UINT16  WRITE_BL_PARTIAL:   1; // Partial blocks for write allowed [21:21]
 | |
|   UINT16  WRITE_BL_LEN:       4; // Max. write data block length [25:22]
 | |
|   UINT16  R2W_FACTOR:         3; // Write speed factor [28:26]
 | |
|   UINT16  RESERVED_3:         2; // Reserved [30:29]
 | |
|   UINT16  WP_GRP_ENABLE:      1; // Write protect group enable [31:31]
 | |
|   
 | |
|   UINT32  WP_GRP_SIZE:        7; // Write protect group size [38:32]
 | |
|   UINT32  SECTOR_SIZE:        7; // Erase sector size [45:39]
 | |
|   UINT32  ERASE_BLK_EN:       1; // Erase single block enable [46:46]
 | |
|   UINT32  C_SIZE_MULT:        3; // Device size multiplier [49:47]
 | |
|   UINT32  VDD_W_CURR_MAX:     3; // Max. write current @ VDD max [52:50]
 | |
|   UINT32  VDD_W_CURR_MIN:     3; // Max. write current @ VDD min [55:53]
 | |
|   UINT32  VDD_R_CURR_MAX:     3; // Max. read current @ VDD max [58:56]
 | |
|   UINT32  VDD_R_CURR_MIN:     3; // Max. read current @ VDD min [61:59]
 | |
|   UINT32  C_SIZELow2:         2; // Device size [63:62]
 | |
|   
 | |
|   UINT32  C_SIZEHigh10:       10;// Device size [73:64]
 | |
|   UINT32  RESERVED_4:         2; // Reserved [75:74]
 | |
|   UINT32  DSR_IMP:            1; // DSR implemented [76:76]
 | |
|   UINT32  READ_BLK_MISALIGN:  1; // Read block misalignment [77:77]
 | |
|   UINT32  WRITE_BLK_MISALIGN: 1; // Write block misalignment [78:78]
 | |
|   UINT32  READ_BL_PARTIAL:    1; // Partial blocks for read allowed [79:79]
 | |
|   UINT32  READ_BL_LEN:        4; // Max. read data block length [83:80]
 | |
|   UINT32  CCC:                12;// Card command classes [95:84]
 | |
| 
 | |
|   UINT8   TRAN_SPEED          ;  // Max. bus clock frequency [103:96]
 | |
|   UINT8   NSAC                ;  // Data read access-time 2 in CLK cycles (NSAC*100) [111:104]
 | |
|   UINT8   TAAC                ;  // Data read access-time 1 [119:112]
 | |
|   
 | |
|   UINT8   RESERVED_5:         6; // Reserved [125:120]
 | |
|   UINT8   CSD_STRUCTURE:      2; // CSD structure [127:126]
 | |
| } CSD;
 | |
| 
 | |
| typedef struct  {
 | |
|   UINT16    RCA;
 | |
|   CARD_TYPE CardType;
 | |
|   OCR       OCRData;
 | |
|   CID       CIDData;
 | |
|   CSD       CSDData;
 | |
| } CARD_INFO;
 | |
| 
 | |
| typedef struct _MMC_HOST_INSTANCE {
 | |
|   UINTN                     Signature;
 | |
|   LIST_ENTRY                Link;
 | |
|   EFI_HANDLE                MmcHandle;
 | |
|   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
 | |
| 
 | |
|   MMC_STATE                 State;
 | |
|   EFI_BLOCK_IO_PROTOCOL     BlockIo;
 | |
|   CARD_INFO                 CardInfo;
 | |
|   EFI_MMC_HOST_PROTOCOL     *MmcHost;
 | |
|   
 | |
|   BOOLEAN                   Initialized;
 | |
| } MMC_HOST_INSTANCE;
 | |
| 
 | |
| #define MMC_HOST_INSTANCE_SIGNATURE                 SIGNATURE_32('m', 'm', 'c', 'h')
 | |
| #define MMC_HOST_INSTANCE_FROM_BLOCK_IO_THIS(a)     CR (a, MMC_HOST_INSTANCE, BlockIo, MMC_HOST_INSTANCE_SIGNATURE)
 | |
| #define MMC_HOST_INSTANCE_FROM_LINK(a)              CR (a, MMC_HOST_INSTANCE, Link, MMC_HOST_INSTANCE_SIGNATURE)
 | |
| 
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| MmcGetDriverName (
 | |
|   IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
 | |
|   IN  CHAR8                        *Language,
 | |
|   OUT CHAR16                       **DriverName
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| MmcGetControllerName (
 | |
|   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
 | |
|   IN  EFI_HANDLE                                      ControllerHandle,
 | |
|   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
 | |
|   IN  CHAR8                                           *Language,
 | |
|   OUT CHAR16                                          **ControllerName
 | |
|   );
 | |
| 
 | |
| extern EFI_COMPONENT_NAME_PROTOCOL  gMmcComponentName;
 | |
| extern EFI_COMPONENT_NAME2_PROTOCOL gMmcComponentName2;
 | |
| 
 | |
| extern EFI_DRIVER_DIAGNOSTICS2_PROTOCOL gMmcDriverDiagnostics2;
 | |
| 
 | |
| extern LIST_ENTRY mMmcHostPool;
 | |
| 
 | |
| /**
 | |
|   Reset the block device.
 | |
| 
 | |
|   This function implements EFI_BLOCK_IO_PROTOCOL.Reset(). 
 | |
|   It resets the block device hardware.
 | |
|   ExtendedVerification is ignored in this implementation.
 | |
| 
 | |
|   @param  This                   Indicates a pointer to the calling context.
 | |
|   @param  ExtendedVerification   Indicates that the driver may perform a more exhaustive
 | |
|                                  verification operation of the device during reset.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The block device was reset.
 | |
|   @retval EFI_DEVICE_ERROR       The block device is not functioning correctly and could not be reset.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| MmcReset (
 | |
|   IN EFI_BLOCK_IO_PROTOCOL    *This,
 | |
|   IN BOOLEAN                  ExtendedVerification
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Reads the requested number of blocks from the device.
 | |
| 
 | |
|   This function implements EFI_BLOCK_IO_PROTOCOL.ReadBlocks(). 
 | |
|   It reads the requested number of blocks from the device.
 | |
|   All the blocks are read, or an error is returned.
 | |
| 
 | |
|   @param  This                   Indicates a pointer to the calling context.
 | |
|   @param  MediaId                The media ID that the read request is for.
 | |
|   @param  Lba                    The starting logical block address to read from on the device.
 | |
|   @param  BufferSize             The size of the Buffer in bytes.
 | |
|                                  This must be a multiple of the intrinsic block size of the device.
 | |
|   @param  Buffer                 A pointer to the destination buffer for the data. The caller is
 | |
|                                  responsible for either having implicit or explicit ownership of the buffer.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The data was read correctly from the device.
 | |
|   @retval EFI_DEVICE_ERROR       The device reported an error while attempting to perform the read operation.
 | |
|   @retval EFI_NO_MEDIA           There is no media in the device.
 | |
|   @retval EFI_MEDIA_CHANGED      The MediaId is not for the current media.
 | |
|   @retval EFI_BAD_BUFFER_SIZE    The BufferSize parameter is not a multiple of the intrinsic block size of the device.
 | |
|   @retval EFI_INVALID_PARAMETER  The read request contains LBAs that are not valid,
 | |
|                                  or the buffer is not on proper alignment.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| MmcReadBlocks (
 | |
|   IN EFI_BLOCK_IO_PROTOCOL    *This,
 | |
|   IN UINT32                   MediaId,
 | |
|   IN EFI_LBA                  Lba,
 | |
|   IN UINTN                    BufferSize,
 | |
|   OUT VOID                    *Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Writes a specified number of blocks to the device.
 | |
| 
 | |
|   This function implements EFI_BLOCK_IO_PROTOCOL.WriteBlocks(). 
 | |
|   It writes a specified number of blocks to the device.
 | |
|   All blocks are written, or an error is returned.
 | |
| 
 | |
|   @param  This                   Indicates a pointer to the calling context.
 | |
|   @param  MediaId                The media ID that the write request is for.
 | |
|   @param  Lba                    The starting logical block address to be written.
 | |
|   @param  BufferSize             The size of the Buffer in bytes.
 | |
|                                  This must be a multiple of the intrinsic block size of the device.
 | |
|   @param  Buffer                 Pointer to the source buffer for the data.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The data were written correctly to the device.
 | |
|   @retval EFI_WRITE_PROTECTED    The device cannot be written to.
 | |
|   @retval EFI_NO_MEDIA           There is no media in the device.
 | |
|   @retval EFI_MEDIA_CHANGED      The MediaId is not for the current media.
 | |
|   @retval EFI_DEVICE_ERROR       The device reported an error while attempting to perform the write operation.
 | |
|   @retval EFI_BAD_BUFFER_SIZE    The BufferSize parameter is not a multiple of the intrinsic
 | |
|                                  block size of the device.
 | |
|   @retval EFI_INVALID_PARAMETER  The write request contains LBAs that are not valid,
 | |
|                                  or the buffer is not on proper alignment.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| MmcWriteBlocks (
 | |
|   IN EFI_BLOCK_IO_PROTOCOL    *This,
 | |
|   IN UINT32                   MediaId,
 | |
|   IN EFI_LBA                  Lba,
 | |
|   IN UINTN                    BufferSize,
 | |
|   IN VOID                     *Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Flushes all modified data to a physical block device.
 | |
| 
 | |
|   @param  This                   Indicates a pointer to the calling context.
 | |
| 
 | |
|   @retval EFI_SUCCESS            All outstanding data were written correctly to the device.
 | |
|   @retval EFI_DEVICE_ERROR       The device reported an error while attempting to write data.
 | |
|   @retval EFI_NO_MEDIA           There is no media in the device.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| MmcFlushBlocks (
 | |
|   IN EFI_BLOCK_IO_PROTOCOL  *This
 | |
|   );
 | |
| 
 | |
| EFI_STATUS InitializeMmcDevice (
 | |
|   IN  MMC_HOST_INSTANCE   *MmcHost
 | |
|   );
 | |
| 
 | |
| VOID
 | |
| EFIAPI
 | |
| CheckCardsCallback (
 | |
|   IN  EFI_EVENT   Event,
 | |
|   IN  VOID        *Context
 | |
|   );
 | |
| 
 | |
| #endif
 |