--- /dev/null
+/** @file\r
+\r
+The definition for SD media device driver model and blkio protocol routines.\r
+\r
+Copyright (c) 2013-2015 Intel Corporation.\r
+\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _SD_MEDIA_DEVICE_H_\r
+#define _SD_MEDIA_DEVICE_H_\r
+\r
+\r
+#include <Uefi.h>\r
+\r
+#include <Protocol/PciIo.h>\r
+#include <Protocol/BlockIo.h>\r
+\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <IndustryStandard/Pci22.h>\r
+\r
+#include "ComponentName.h"\r
+#include "SDHostIo.h"\r
+\r
+\r
+extern EFI_DRIVER_BINDING_PROTOCOL gSDMediaDeviceDriverBinding;\r
+extern EFI_COMPONENT_NAME_PROTOCOL gSDMediaDeviceName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL gSDMediaDeviceName2;\r
+\r
+//\r
+// Define the region of memory used for DMA memory\r
+//\r
+#define DMA_MEMORY_TOP 0x0000000001FFFFFFULL\r
+\r
+#define CARD_DATA_SIGNATURE SIGNATURE_32 ('c', 'a', 'r', 'd')\r
+\r
+//\r
+// Command timeout will be max 100 ms\r
+//\r
+#define TIMEOUT_COMMAND 100\r
+#define TIMEOUT_DATA 5000\r
+\r
+typedef enum{\r
+ UnknownCard = 0,\r
+ MMCCard, // MMC card\r
+ MMCCardHighCap, // MMC Card High Capacity\r
+ CEATACard, // CE-ATA device\r
+ SDMemoryCard, // SD 1.1 card\r
+ SDMemoryCard2, // SD 2.0 or above standard card\r
+ SDMemoryCard2High // SD 2.0 or above high capacity card\r
+}CARD_TYPE;\r
+\r
+\r
+typedef struct {\r
+ //\r
+ //BlockIO\r
+ //\r
+ UINTN Signature;\r
+ EFI_BLOCK_IO_PROTOCOL BlockIo;\r
+\r
+ EFI_BLOCK_IO_MEDIA BlockIoMedia;\r
+\r
+ EFI_SD_HOST_IO_PROTOCOL *SDHostIo;\r
+ EFI_UNICODE_STRING_TABLE *ControllerNameTable;\r
+ CARD_TYPE CardType;\r
+\r
+ UINT8 CurrentBusWidth;\r
+ BOOLEAN DualVoltage;\r
+ BOOLEAN NeedFlush;\r
+ UINT8 Reserved[3];\r
+\r
+ UINT16 Address;\r
+ UINT32 BlockLen;\r
+ UINT32 MaxFrequency;\r
+ UINT64 BlockNumber;\r
+ //\r
+ //Common used\r
+ //\r
+ CARD_STATUS CardStatus;\r
+ OCR OCRRegister;\r
+ CID CIDRegister;\r
+ CSD CSDRegister;\r
+ EXT_CSD ExtCSDRegister;\r
+ UINT8 *RawBufferPointer;\r
+ UINT8 *AlignedBuffer;\r
+ //\r
+ //CE-ATA specific\r
+ //\r
+ TASK_FILE TaskFile;\r
+ IDENTIFY_DEVICE_DATA IndentifyDeviceData;\r
+ //\r
+ //SD specific\r
+ //\r
+ SCR SCRRegister;\r
+ SD_STATUS_REG SDSattus;\r
+ SWITCH_STATUS SwitchStatus;\r
+}CARD_DATA;\r
+\r
+#define CARD_DATA_FROM_THIS(a) \\r
+ CR(a, CARD_DATA, BlockIo, CARD_DATA_SIGNATURE)\r
+\r
+/**\r
+ Test to see if this driver supports ControllerHandle. Any\r
+ ControllerHandle that has BlockIoProtocol installed will be supported.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param Controller Handle of device to test.\r
+ @param RemainingDevicePath Not used.\r
+\r
+ @return EFI_SUCCESS This driver supports this device.\r
+ @return EFI_UNSUPPORTED This driver does not support this device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SDMediaDeviceSupported (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ );\r
+\r
+/**\r
+ Starting the SD Media Device Driver.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param Controller Handle of device to test.\r
+ @param RemainingDevicePath Not used.\r
+\r
+ @retval EFI_SUCCESS This driver supports this device.\r
+ @retval EFI_UNSUPPORTED This driver does not support this device.\r
+ @retval EFI_DEVICE_ERROR This driver cannot be started due to device Error.\r
+ EFI_OUT_OF_RESOURCES- Failed due to resource shortage.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SDMediaDeviceStart (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ );\r
+\r
+/**\r
+ Stop this driver on ControllerHandle. Support stoping any child handles\r
+ created by this driver.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param Controller Handle of device to stop driver on.\r
+ @param NumberOfChildren Number of Children in the ChildHandleBuffer.\r
+ @param ChildHandleBuffer List of handles for the children we need to stop.\r
+\r
+ @return EFI_SUCCESS\r
+ @return others\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SDMediaDeviceStop (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Controller,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer\r
+ );\r
+\r
+/**\r
+ MMC/SD card init function\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+\r
+ @return EFI_SUCCESS\r
+ @return others\r
+\r
+**/\r
+EFI_STATUS\r
+MMCSDCardInit (\r
+ IN CARD_DATA *CardData\r
+ );\r
+\r
+/**\r
+ Send command by using Host IO protocol\r
+\r
+ @param This A pointer to the EFI_SD_HOST_IO_PROTOCOL instance.\r
+ @param CommandIndex The command index to set the command index field of command register.\r
+ @param Argument Command argument to set the argument field of command register.\r
+ @param DataType TRANSFER_TYPE, indicates no data, data in or data out.\r
+ @param Buffer Contains the data read from / write to the device.\r
+ @param BufferSize The size of the buffer.\r
+ @param ResponseType RESPONSE_TYPE.\r
+ @param TimeOut Time out value in 1 ms unit.\r
+ @param ResponseData Depending on the ResponseType, such as CSD or card status.\r
+\r
+ @retval EFI_SUCCESS\r
+ @retval EFI_INVALID_PARAMETER\r
+ @retval EFI_UNSUPPORTED\r
+ @retval EFI_DEVICE_ERROR\r
+\r
+**/\r
+EFI_STATUS\r
+SendCommand (\r
+ IN CARD_DATA *CardData,\r
+ IN UINT16 CommandIndex,\r
+ IN UINT32 Argument,\r
+ IN TRANSFER_TYPE DataType,\r
+ IN UINT8 *Buffer, OPTIONAL\r
+ IN UINT32 BufferSize,\r
+ IN RESPONSE_TYPE ResponseType,\r
+ IN UINT32 TimeOut,\r
+ OUT UINT32 *ResponseData\r
+ );\r
+\r
+/**\r
+ Send the card APP_CMD command with the following command indicated by CommandIndex\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+ @param CommandIndex The command index to set the command index field of command register.\r
+ @param Argument Command argument to set the argument field of command register.\r
+ @param DataType TRANSFER_TYPE, indicates no data, data in or data out.\r
+ @param Buffer Contains the data read from / write to the device.\r
+ @param BufferSize The size of the buffer.\r
+ @param ResponseType RESPONSE_TYPE.\r
+ @param TimeOut Time out value in 1 ms unit.\r
+ @param ResponseData Depending on the ResponseType, such as CSD or card status.\r
+\r
+ @retval EFI_SUCCESS\r
+ @retval EFI_INVALID_PARAMETER\r
+ @retval EFI_UNSUPPORTED\r
+ @retval EFI_DEVICE_ERROR\r
+\r
+**/\r
+EFI_STATUS\r
+SendAppCommand (\r
+ IN CARD_DATA *CardData,\r
+ IN UINT16 CommandIndex,\r
+ IN UINT32 Argument,\r
+ IN TRANSFER_TYPE DataType,\r
+ IN UINT8 *Buffer, OPTIONAL\r
+ IN UINT32 BufferSize,\r
+ IN RESPONSE_TYPE ResponseType,\r
+ IN UINT32 TimeOut,\r
+ OUT UINT32 *ResponseData\r
+ );\r
+\r
+/**\r
+ Send the card FAST_IO command\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+ @param RegisterAddress Register Address.\r
+ @param RegisterData Pointer to register Data.\r
+ @param Write TRUE for write, FALSE for read.\r
+\r
+ @retval EFI_SUCCESS\r
+ @retval EFI_UNSUPPORTED\r
+ @retval EFI_INVALID_PARAMETER\r
+ @retval EFI_DEVICE_ERROR\r
+\r
+**/\r
+EFI_STATUS\r
+FastIO (\r
+ IN CARD_DATA *CardData,\r
+ IN UINT8 RegisterAddress,\r
+ IN OUT UINT8 *RegisterData,\r
+ IN BOOLEAN Write\r
+ );\r
+\r
+/**\r
+ Judge whether it is CE-ATA device or not.\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+\r
+ @retval TRUE\r
+ @retval FALSE\r
+\r
+**/\r
+BOOLEAN\r
+IsCEATADevice (\r
+ IN CARD_DATA *CardData\r
+ );\r
+\r
+/**\r
+ Send software reset\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+\r
+ @retval EFI_SUCCESS Success\r
+ @retval EFI_DEVICE_ERROR Hardware Error\r
+ @retval EFI_INVALID_PARAMETER Parameter is error\r
+ @retval EFI_NO_MEDIA No media\r
+ @retval EFI_MEDIA_CHANGED Media Change\r
+ @retval EFI_BAD_BUFFER_SIZE Buffer size is bad\r
+\r
+**/\r
+EFI_STATUS\r
+SoftwareReset (\r
+ IN CARD_DATA *CardData\r
+ );\r
+\r
+/**\r
+ SendATACommand specificed in Taskfile\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+ @param TaskFile Pointer to TASK_FILE.\r
+ @param Write TRUE means write, FALSE means read.\r
+ @param Buffer If NULL, means no data transfer, neither read nor write.\r
+ @param SectorCount Buffer size in 512 bytes unit.\r
+\r
+ @retval EFI_SUCCESS Success\r
+ @retval EFI_DEVICE_ERROR Hardware Error\r
+ @retval EFI_INVALID_PARAMETER Parameter is error\r
+ @retval EFI_NO_MEDIA No media\r
+ @retval EFI_MEDIA_CHANGED Media Change\r
+ @retval EFI_BAD_BUFFER_SIZE Buffer size is bad\r
+\r
+**/\r
+EFI_STATUS\r
+SendATACommand (\r
+ IN CARD_DATA *CardData,\r
+ IN TASK_FILE *TaskFile,\r
+ IN BOOLEAN Write,\r
+ IN UINT8 *Buffer,\r
+ IN UINT16 SectorCount\r
+ );\r
+\r
+/**\r
+ IDENTIFY_DEVICE command\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+\r
+ @retval EFI_SUCCESS Success\r
+ @retval EFI_DEVICE_ERROR Hardware Error\r
+ @retval EFI_INVALID_PARAMETER Parameter is error\r
+ @retval EFI_NO_MEDIA No media\r
+ @retval EFI_MEDIA_CHANGED Media Change\r
+ @retval EFI_BAD_BUFFER_SIZE Buffer size is bad\r
+\r
+**/\r
+EFI_STATUS\r
+IndentifyDevice (\r
+ IN CARD_DATA *CardData\r
+ );\r
+\r
+/**\r
+ FLUSH_CACHE_EXT command\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+\r
+ @retval EFI_SUCCESS Success\r
+ @retval EFI_DEVICE_ERROR Hardware Error\r
+ @retval EFI_INVALID_PARAMETER Parameter is error\r
+ @retval EFI_NO_MEDIA No media\r
+ @retval EFI_MEDIA_CHANGED Media Change\r
+ @retval EFI_BAD_BUFFER_SIZE Buffer size is bad\r
+\r
+**/\r
+EFI_STATUS\r
+FlushCache (\r
+ IN CARD_DATA *CardData\r
+ );\r
+\r
+/**\r
+ STANDBY_IMMEDIATE command\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+\r
+ @retval EFI_SUCCESS Success\r
+ @retval EFI_DEVICE_ERROR Hardware Error\r
+ @retval EFI_INVALID_PARAMETER Parameter is error\r
+ @retval EFI_NO_MEDIA No media\r
+ @retval EFI_MEDIA_CHANGED Media Change\r
+ @retval EFI_BAD_BUFFER_SIZE Buffer size is bad\r
+\r
+**/\r
+EFI_STATUS\r
+StandByImmediate (\r
+ IN CARD_DATA *CardData\r
+ );\r
+\r
+/**\r
+ READ_DMA_EXT command\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+ @param LBA The starting logical block address to read from on the device.\r
+ @param Buffer A pointer to the destination buffer for the data. The caller\r
+ is responsible for either having implicit or explicit ownership\r
+ of the buffer.\r
+ @param SectorCount Size in 512 bytes unit.\r
+\r
+ @retval EFI_SUCCESS Success\r
+ @retval EFI_DEVICE_ERROR Hardware Error\r
+ @retval EFI_INVALID_PARAMETER Parameter is error\r
+ @retval EFI_NO_MEDIA No media\r
+ @retval EFI_MEDIA_CHANGED Media Change\r
+ @retval EFI_BAD_BUFFER_SIZE Buffer size is bad\r
+\r
+**/\r
+EFI_STATUS\r
+ReadDMAExt (\r
+ IN CARD_DATA *CardData,\r
+ IN EFI_LBA LBA,\r
+ IN UINT8 *Buffer,\r
+ IN UINT16 SectorCount\r
+ );\r
+\r
+/**\r
+ WRITE_DMA_EXT command\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+ @param LBA The starting logical block address to read from on the device.\r
+ @param Buffer A pointer to the destination buffer for the data. The caller\r
+ is responsible for either having implicit or explicit ownership\r
+ of the buffer.\r
+ @param SectorCount Size in 512 bytes unit.\r
+\r
+ @retval EFI_SUCCESS Success\r
+ @retval EFI_DEVICE_ERROR Hardware Error\r
+ @retval EFI_INVALID_PARAMETER Parameter is error\r
+ @retval EFI_NO_MEDIA No media\r
+ @retval EFI_MEDIA_CHANGED Media Change\r
+ @retval EFI_BAD_BUFFER_SIZE Buffer size is bad\r
+\r
+**/\r
+EFI_STATUS\r
+WriteDMAExt (\r
+ IN CARD_DATA *CardData,\r
+ IN EFI_LBA LBA,\r
+ IN UINT8 *Buffer,\r
+ IN UINT16 SectorCount\r
+ );\r
+\r
+/**\r
+ CEATA card BlockIo init function.\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+\r
+ @retval EFI_SUCCESS\r
+ @retval Others\r
+**/\r
+EFI_STATUS\r
+CEATABlockIoInit (\r
+ IN CARD_DATA *CardData\r
+ );\r
+\r
+/**\r
+ MMC/SD card BlockIo init function.\r
+\r
+ @param CardData Pointer to CARD_DATA.\r
+\r
+ @retval EFI_SUCCESS\r
+ @retval Others\r
+**/\r
+EFI_STATUS\r
+MMCSDBlockIoInit (\r
+ IN CARD_DATA *CardData\r
+ );\r
+#endif\r