]> git.proxmox.com Git - mirror_edk2.git/blame - EmbeddedPkg/Universal/MmcDxe/Mmc.h
MmcDxe: Adding eMMC support
[mirror_edk2.git] / EmbeddedPkg / Universal / MmcDxe / Mmc.h
CommitLineData
1bfda055 1/** @file\r
2 Main Header file for the MMC DXE driver\r
3\r
b4fdedc2 4 Copyright (c) 2011-2014, ARM Limited. All rights reserved.\r
1bfda055 5 \r
6 This program and the accompanying materials \r
7 are licensed and made available under the terms and conditions of the BSD License \r
8 which accompanies this distribution. The full text of the license may be found at \r
9 http://opensource.org/licenses/bsd-license.php \r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
13\r
14**/\r
15\r
16#ifndef __MMC_H\r
17#define __MMC_H\r
18\r
a1ab9143 19#include <Uefi.h>\r
20\r
1bfda055 21#include <Protocol/DiskIo.h>\r
22#include <Protocol/BlockIo.h>\r
23#include <Protocol/DevicePath.h>\r
24#include <Protocol/MmcHost.h>\r
25\r
26#include <Library/UefiLib.h>\r
4ca3c688 27#include <Library/DebugLib.h>\r
1bfda055 28\r
29#define MMC_TRACE(txt) DEBUG((EFI_D_BLKIO, "MMC: " txt "\n"))\r
30\r
31#define MMC_IOBLOCKS_READ 0\r
32#define MMC_IOBLOCKS_WRITE 1\r
33\r
34#define MMC_OCR_POWERUP 0x80000000\r
35\r
bb0f9e9b 36#define MMC_CSD_GET_CCC(Response) (Response[2] >> 20)\r
37#define MMC_CSD_GET_TRANSPEED(Response) (Response[3] & 0xFF)\r
38#define MMC_CSD_GET_READBLLEN(Response) ((Response[2] >> 16) & 0xF)\r
39#define MMC_CSD_GET_WRITEBLLEN(Response) ((Response[0] >> 22) & 0xF)\r
40#define MMC_CSD_GET_FILEFORMAT(Response) ((Response[0] >> 10) & 0x3)\r
41#define MMC_CSD_GET_FILEFORMATGRP(Response) ((Response[0] >> 15) & 0x1)\r
42#define MMC_CSD_GET_DEVICESIZE(csd) (((Response[1] >> 30) & 0x3) | ((Response[2] & 0x3FF) << 2))\r
36aa5611 43#define HC_MMC_CSD_GET_DEVICESIZE(Response) ((Response[1] >> 16) | ((Response[2] & 0x40) << 16));\r
bb0f9e9b 44#define MMC_CSD_GET_DEVICESIZEMULT(csd) ((Response[1] >> 15) & 0x7)\r
1bfda055 45\r
b9d5fe03 46#define MMC_R0_READY_FOR_DATA (1 << 8)\r
47\r
1bfda055 48#define MMC_R0_CURRENTSTATE(Response) ((Response[0] >> 9) & 0xF)\r
49\r
50#define MMC_R0_STATE_IDLE 0\r
51#define MMC_R0_STATE_READY 1\r
52#define MMC_R0_STATE_IDENT 2\r
53#define MMC_R0_STATE_STDBY 3\r
54#define MMC_R0_STATE_TRAN 4\r
55#define MMC_R0_STATE_DATA 5\r
56\r
57typedef enum {\r
58 UNKNOWN_CARD,\r
59 MMC_CARD, //MMC card\r
60 MMC_CARD_HIGH, //MMC Card with High capacity\r
b4fdedc2 61 EMMC_CARD, //eMMC 4.41 card\r
1bfda055 62 SD_CARD, //SD 1.1 card\r
63 SD_CARD_2, //SD 2.0 or above standard card\r
64 SD_CARD_2_HIGH //SD 2.0 or above high capacity card\r
65} CARD_TYPE;\r
66\r
67typedef struct {\r
68 UINT32 Reserved0: 7; // 0 \r
69 UINT32 V170_V195: 1; // 1.70V - 1.95V\r
70 UINT32 V200_V260: 7; // 2.00V - 2.60V\r
71 UINT32 V270_V360: 9; // 2.70V - 3.60V\r
72 UINT32 RESERVED_1: 5; // Reserved\r
73 UINT32 AccessMode: 2; // 00b (byte mode), 10b (sector mode) \r
492e34a5 74 UINT32 PowerUp: 1; // This bit is set to LOW if the card has not finished the power up routine\r
1bfda055 75} OCR;\r
76\r
77typedef struct {\r
78 UINT32 NOT_USED; // 1 [0:0]\r
79 UINT32 CRC; // CRC7 checksum [7:1]\r
80 UINT32 MDT; // Manufacturing date [19:8]\r
81 UINT32 RESERVED_1; // Reserved [23:20]\r
82 UINT32 PSN; // Product serial number [55:24]\r
83 UINT8 PRV; // Product revision [63:56]\r
84 UINT8 PNM[5]; // Product name [64:103]\r
85 UINT16 OID; // OEM/Application ID [119:104]\r
86 UINT8 MID; // Manufacturer ID [127:120]\r
87} CID;\r
88\r
89typedef struct {\r
90 UINT8 NOT_USED: 1; // Not used, always 1 [0:0]\r
91 UINT8 CRC: 7; // CRC [7:1]\r
92\r
93 UINT8 RESERVED_1: 2; // Reserved [9:8]\r
94 UINT8 FILE_FORMAT: 2; // File format [11:10]\r
95 UINT8 TMP_WRITE_PROTECT: 1; // Temporary write protection [12:12]\r
96 UINT8 PERM_WRITE_PROTECT: 1; // Permanent write protection [13:13]\r
97 UINT8 COPY: 1; // Copy flag (OTP) [14:14]\r
98 UINT8 FILE_FORMAT_GRP: 1; // File format group [15:15]\r
99 \r
100 UINT16 RESERVED_2: 5; // Reserved [20:16]\r
101 UINT16 WRITE_BL_PARTIAL: 1; // Partial blocks for write allowed [21:21]\r
102 UINT16 WRITE_BL_LEN: 4; // Max. write data block length [25:22]\r
103 UINT16 R2W_FACTOR: 3; // Write speed factor [28:26]\r
104 UINT16 RESERVED_3: 2; // Reserved [30:29]\r
105 UINT16 WP_GRP_ENABLE: 1; // Write protect group enable [31:31]\r
106 \r
107 UINT32 WP_GRP_SIZE: 7; // Write protect group size [38:32]\r
108 UINT32 SECTOR_SIZE: 7; // Erase sector size [45:39]\r
109 UINT32 ERASE_BLK_EN: 1; // Erase single block enable [46:46]\r
110 UINT32 C_SIZE_MULT: 3; // Device size multiplier [49:47]\r
111 UINT32 VDD_W_CURR_MAX: 3; // Max. write current @ VDD max [52:50]\r
112 UINT32 VDD_W_CURR_MIN: 3; // Max. write current @ VDD min [55:53]\r
113 UINT32 VDD_R_CURR_MAX: 3; // Max. read current @ VDD max [58:56]\r
114 UINT32 VDD_R_CURR_MIN: 3; // Max. read current @ VDD min [61:59]\r
115 UINT32 C_SIZELow2: 2; // Device size [63:62]\r
116 \r
117 UINT32 C_SIZEHigh10: 10;// Device size [73:64]\r
118 UINT32 RESERVED_4: 2; // Reserved [75:74]\r
119 UINT32 DSR_IMP: 1; // DSR implemented [76:76]\r
120 UINT32 READ_BLK_MISALIGN: 1; // Read block misalignment [77:77]\r
121 UINT32 WRITE_BLK_MISALIGN: 1; // Write block misalignment [78:78]\r
122 UINT32 READ_BL_PARTIAL: 1; // Partial blocks for read allowed [79:79]\r
123 UINT32 READ_BL_LEN: 4; // Max. read data block length [83:80]\r
124 UINT32 CCC: 12;// Card command classes [95:84]\r
125\r
126 UINT8 TRAN_SPEED ; // Max. bus clock frequency [103:96]\r
127 UINT8 NSAC ; // Data read access-time 2 in CLK cycles (NSAC*100) [111:104]\r
128 UINT8 TAAC ; // Data read access-time 1 [119:112]\r
129 \r
130 UINT8 RESERVED_5: 6; // Reserved [125:120]\r
131 UINT8 CSD_STRUCTURE: 2; // CSD structure [127:126]\r
132} CSD;\r
133\r
134typedef struct {\r
135 UINT16 RCA;\r
136 CARD_TYPE CardType;\r
137 OCR OCRData;\r
138 CID CIDData;\r
139 CSD CSDData;\r
140} CARD_INFO;\r
141\r
142typedef struct _MMC_HOST_INSTANCE {\r
143 UINTN Signature;\r
144 LIST_ENTRY Link;\r
145 EFI_HANDLE MmcHandle;\r
146 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
147\r
148 MMC_STATE State;\r
149 EFI_BLOCK_IO_PROTOCOL BlockIo;\r
150 CARD_INFO CardInfo;\r
151 EFI_MMC_HOST_PROTOCOL *MmcHost;\r
3de99375 152 \r
153 BOOLEAN Initialized;\r
1bfda055 154} MMC_HOST_INSTANCE;\r
155\r
156#define MMC_HOST_INSTANCE_SIGNATURE SIGNATURE_32('m', 'm', 'c', 'h')\r
157#define MMC_HOST_INSTANCE_FROM_BLOCK_IO_THIS(a) CR (a, MMC_HOST_INSTANCE, BlockIo, MMC_HOST_INSTANCE_SIGNATURE)\r
158#define MMC_HOST_INSTANCE_FROM_LINK(a) CR (a, MMC_HOST_INSTANCE, Link, MMC_HOST_INSTANCE_SIGNATURE)\r
159\r
160\r
161EFI_STATUS\r
162EFIAPI\r
163MmcGetDriverName (\r
164 IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
165 IN CHAR8 *Language,\r
166 OUT CHAR16 **DriverName\r
167 );\r
168\r
169EFI_STATUS\r
170EFIAPI\r
171MmcGetControllerName (\r
172 IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
173 IN EFI_HANDLE ControllerHandle,\r
174 IN EFI_HANDLE ChildHandle OPTIONAL,\r
175 IN CHAR8 *Language,\r
176 OUT CHAR16 **ControllerName\r
177 );\r
178\r
179extern EFI_COMPONENT_NAME_PROTOCOL gMmcComponentName;\r
180extern EFI_COMPONENT_NAME2_PROTOCOL gMmcComponentName2;\r
181\r
182extern EFI_DRIVER_DIAGNOSTICS2_PROTOCOL gMmcDriverDiagnostics2;\r
183\r
184extern LIST_ENTRY mMmcHostPool;\r
185\r
186/**\r
187 Reset the block device.\r
188\r
189 This function implements EFI_BLOCK_IO_PROTOCOL.Reset(). \r
190 It resets the block device hardware.\r
191 ExtendedVerification is ignored in this implementation.\r
192\r
193 @param This Indicates a pointer to the calling context.\r
194 @param ExtendedVerification Indicates that the driver may perform a more exhaustive\r
195 verification operation of the device during reset.\r
196\r
197 @retval EFI_SUCCESS The block device was reset.\r
198 @retval EFI_DEVICE_ERROR The block device is not functioning correctly and could not be reset.\r
199\r
200**/\r
201EFI_STATUS\r
202EFIAPI\r
203MmcReset (\r
204 IN EFI_BLOCK_IO_PROTOCOL *This,\r
205 IN BOOLEAN ExtendedVerification\r
206 );\r
207\r
208/**\r
209 Reads the requested number of blocks from the device.\r
210\r
211 This function implements EFI_BLOCK_IO_PROTOCOL.ReadBlocks(). \r
212 It reads the requested number of blocks from the device.\r
213 All the blocks are read, or an error is returned.\r
214\r
215 @param This Indicates a pointer to the calling context.\r
216 @param MediaId The media ID that the read request is for.\r
217 @param Lba The starting logical block address to read from on the device.\r
218 @param BufferSize The size of the Buffer in bytes.\r
219 This must be a multiple of the intrinsic block size of the device.\r
220 @param Buffer A pointer to the destination buffer for the data. The caller is\r
221 responsible for either having implicit or explicit ownership of the buffer.\r
222\r
223 @retval EFI_SUCCESS The data was read correctly from the device.\r
224 @retval EFI_DEVICE_ERROR The device reported an error while attempting to perform the read operation.\r
225 @retval EFI_NO_MEDIA There is no media in the device.\r
226 @retval EFI_MEDIA_CHANGED The MediaId is not for the current media.\r
227 @retval EFI_BAD_BUFFER_SIZE The BufferSize parameter is not a multiple of the intrinsic block size of the device.\r
228 @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid,\r
229 or the buffer is not on proper alignment.\r
230\r
231**/\r
232EFI_STATUS\r
233EFIAPI\r
234MmcReadBlocks (\r
235 IN EFI_BLOCK_IO_PROTOCOL *This,\r
236 IN UINT32 MediaId,\r
237 IN EFI_LBA Lba,\r
238 IN UINTN BufferSize,\r
239 OUT VOID *Buffer\r
240 );\r
241\r
242/**\r
243 Writes a specified number of blocks to the device.\r
244\r
245 This function implements EFI_BLOCK_IO_PROTOCOL.WriteBlocks(). \r
246 It writes a specified number of blocks to the device.\r
247 All blocks are written, or an error is returned.\r
248\r
249 @param This Indicates a pointer to the calling context.\r
250 @param MediaId The media ID that the write request is for.\r
251 @param Lba The starting logical block address to be written.\r
252 @param BufferSize The size of the Buffer in bytes.\r
253 This must be a multiple of the intrinsic block size of the device.\r
254 @param Buffer Pointer to the source buffer for the data.\r
255\r
256 @retval EFI_SUCCESS The data were written correctly to the device.\r
257 @retval EFI_WRITE_PROTECTED The device cannot be written to.\r
258 @retval EFI_NO_MEDIA There is no media in the device.\r
259 @retval EFI_MEDIA_CHANGED The MediaId is not for the current media.\r
260 @retval EFI_DEVICE_ERROR The device reported an error while attempting to perform the write operation.\r
261 @retval EFI_BAD_BUFFER_SIZE The BufferSize parameter is not a multiple of the intrinsic\r
262 block size of the device.\r
263 @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid,\r
264 or the buffer is not on proper alignment.\r
265\r
266**/\r
267EFI_STATUS\r
268EFIAPI\r
269MmcWriteBlocks (\r
270 IN EFI_BLOCK_IO_PROTOCOL *This,\r
271 IN UINT32 MediaId,\r
272 IN EFI_LBA Lba,\r
273 IN UINTN BufferSize,\r
274 IN VOID *Buffer\r
275 );\r
276\r
277/**\r
278 Flushes all modified data to a physical block device.\r
279\r
280 @param This Indicates a pointer to the calling context.\r
281\r
282 @retval EFI_SUCCESS All outstanding data were written correctly to the device.\r
283 @retval EFI_DEVICE_ERROR The device reported an error while attempting to write data.\r
284 @retval EFI_NO_MEDIA There is no media in the device.\r
285\r
286**/\r
287EFI_STATUS\r
288EFIAPI\r
289MmcFlushBlocks (\r
290 IN EFI_BLOCK_IO_PROTOCOL *This\r
291 );\r
292\r
b4fdedc2
OM
293EFI_STATUS\r
294MmcNotifyState (\r
295 IN MMC_HOST_INSTANCE *MmcHostInstance,\r
296 IN MMC_STATE State\r
297 );\r
298\r
299EFI_STATUS\r
300InitializeMmcDevice (\r
301 IN MMC_HOST_INSTANCE *MmcHost\r
40842a5e 302 );\r
303\r
304VOID\r
305EFIAPI\r
306CheckCardsCallback (\r
307 IN EFI_EVENT Event,\r
308 IN VOID *Context\r
309 );\r
310\r
4ca3c688
OM
311VOID\r
312PrintCSD (\r
313 IN UINT32* Csd\r
314 );\r
315\r
316VOID\r
317PrintRCA (\r
318 IN UINT32 Rca\r
319 );\r
320\r
321VOID\r
322PrintOCR (\r
323 IN UINT32 Ocr\r
324 );\r
325\r
326VOID\r
327PrintResponseR1 (\r
328 IN UINT32 Response\r
329 );\r
330\r
331VOID\r
332PrintCID (\r
333 IN UINT32* Cid\r
334 );\r
335\r
1bfda055 336#endif\r