3 * Copyright (c) 2011-2015, ARM Limited. All rights reserved.
5 * This program and the accompanying materials
6 * are licensed and made available under the terms and conditions of the BSD License
7 * which accompanies this distribution. The full text of the license may be found at
8 * http://opensource.org/licenses/bsd-license.php
10 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
22 #define MAX_RETRY_COUNT 1000
23 #define CMD_RETRY_COUNT 20
24 #define RCA_SHIFT_OFFSET 16
25 #define EMMC_CARD_SIZE 512
26 #define EMMC_ECSD_SIZE_OFFSET 53
28 UINT32 mEmmcRcaCount
= 0;
33 EmmcIdentificationMode (
34 IN MMC_HOST_INSTANCE
*MmcHostInstance
,
35 IN OCR_RESPONSE Response
38 EFI_MMC_HOST_PROTOCOL
*Host
;
39 EFI_BLOCK_IO_MEDIA
*Media
;
43 Host
= MmcHostInstance
->MmcHost
;
44 Media
= MmcHostInstance
->BlockIo
.Media
;
46 // Fetch card identity register
47 Status
= Host
->SendCommand (Host
, MMC_CMD2
, 0);
48 if (EFI_ERROR (Status
)) {
49 DEBUG ((EFI_D_ERROR
, "EmmcIdentificationMode(): Failed to send CMD2, Status=%r.\n", Status
));
53 Status
= Host
->ReceiveResponse (Host
, MMC_RESPONSE_TYPE_R2
, (UINT32
*)&(MmcHostInstance
->CardInfo
.CIDData
));
54 if (EFI_ERROR (Status
)) {
55 DEBUG ((EFI_D_ERROR
, "EmmcIdentificationMode(): CID retrieval error, Status=%r.\n", Status
));
59 // Assign a relative address value to the card
60 MmcHostInstance
->CardInfo
.RCA
= ++mEmmcRcaCount
; // TODO: might need a more sophisticated way of doing this
61 RCA
= MmcHostInstance
->CardInfo
.RCA
<< RCA_SHIFT_OFFSET
;
62 Status
= Host
->SendCommand (Host
, MMC_CMD3
, RCA
);
63 if (EFI_ERROR (Status
)) {
64 DEBUG ((EFI_D_ERROR
, "EmmcIdentificationMode(): RCA set error, Status=%r.\n", Status
));
68 // Fetch card specific data
69 Status
= Host
->SendCommand (Host
, MMC_CMD9
, RCA
);
70 if (EFI_ERROR (Status
)) {
71 DEBUG ((EFI_D_ERROR
, "EmmcIdentificationMode(): Failed to send CMD9, Status=%r.\n", Status
));
75 Status
= Host
->ReceiveResponse (Host
, MMC_RESPONSE_TYPE_R2
, (UINT32
*)&(MmcHostInstance
->CardInfo
.CSDData
));
76 if (EFI_ERROR (Status
)) {
77 DEBUG ((EFI_D_ERROR
, "EmmcIdentificationMode(): CSD retrieval error, Status=%r.\n", Status
));
82 Status
= Host
->SendCommand (Host
, MMC_CMD7
, RCA
);
83 if (EFI_ERROR (Status
)) {
84 DEBUG ((EFI_D_ERROR
, "EmmcIdentificationMode(): Card selection error, Status=%r.\n", Status
));
88 Status
= Host
->SendCommand (Host
, MMC_CMD8
, RCA
);
89 if (EFI_ERROR (Status
)) {
90 DEBUG ((EFI_D_ERROR
, "EmmcIdentificationMode(): ECSD fetch error, Status=%r.\n", Status
));
93 Status
= Host
->ReadBlockData (Host
, 0, 512, (UINT32
*)&(MmcHostInstance
->CardInfo
.ECSDData
));
94 if (EFI_ERROR (Status
)) {
95 DEBUG ((EFI_D_ERROR
, "EmmcIdentificationMode(): ECSD read error, Status=%r.\n", Status
));
100 Media
->BlockSize
= EMMC_CARD_SIZE
; // 512-byte support is mandatory for eMMC cards
101 Media
->MediaId
= MmcHostInstance
->CardInfo
.CIDData
.PSN
;
102 Media
->ReadOnly
= MmcHostInstance
->CardInfo
.CSDData
.PERM_WRITE_PROTECT
;
103 Media
->LogicalBlocksPerPhysicalBlock
= 1;
105 // Compute last block using bits [215:212] of the ECSD
106 Media
->LastBlock
= MmcHostInstance
->CardInfo
.ECSDData
.SECTOR_COUNT
- 1; // eMMC isn't supposed to report this for
107 // Cards <2GB in size, but the model does.
110 MmcHostInstance
->CardInfo
.CardType
= EMMC_CARD
;
116 InitializeSdMmcDevice (
117 IN MMC_HOST_INSTANCE
*MmcHostInstance
126 EFI_MMC_HOST_PROTOCOL
*MmcHost
;
128 MmcHost
= MmcHostInstance
->MmcHost
;
130 // Send a command to get Card specific data
131 CmdArg
= MmcHostInstance
->CardInfo
.RCA
<< 16;
132 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD9
, CmdArg
);
133 if (EFI_ERROR (Status
)) {
134 DEBUG((EFI_D_ERROR
, "InitializeSdMmcDevice(MMC_CMD9): Error, Status=%r\n", Status
));
139 Status
= MmcHost
->ReceiveResponse (MmcHost
, MMC_RESPONSE_TYPE_CSD
, Response
);
140 if (EFI_ERROR (Status
)) {
141 DEBUG((EFI_D_ERROR
, "InitializeSdMmcDevice(): Failed to receive CSD, Status=%r\n", Status
));
146 if (MmcHostInstance
->CardInfo
.CardType
== SD_CARD_2_HIGH
) {
147 CardSize
= HC_MMC_CSD_GET_DEVICESIZE (Response
);
148 NumBlocks
= ((CardSize
+ 1) * 1024);
149 BlockSize
= 1 << MMC_CSD_GET_READBLLEN (Response
);
151 CardSize
= MMC_CSD_GET_DEVICESIZE (Response
);
152 NumBlocks
= (CardSize
+ 1) * (1 << (MMC_CSD_GET_DEVICESIZEMULT (Response
) + 2));
153 BlockSize
= 1 << MMC_CSD_GET_READBLLEN (Response
);
156 // For >=2G card, BlockSize may be 1K, but the transfer size is 512 bytes.
157 if (BlockSize
> 512) {
158 NumBlocks
= MultU64x32 (NumBlocks
, BlockSize
/ 512);
162 MmcHostInstance
->BlockIo
.Media
->LastBlock
= (NumBlocks
- 1);
163 MmcHostInstance
->BlockIo
.Media
->BlockSize
= BlockSize
;
164 MmcHostInstance
->BlockIo
.Media
->ReadOnly
= MmcHost
->IsReadOnly (MmcHost
);
165 MmcHostInstance
->BlockIo
.Media
->MediaPresent
= TRUE
;
166 MmcHostInstance
->BlockIo
.Media
->MediaId
++;
168 CmdArg
= MmcHostInstance
->CardInfo
.RCA
<< 16;
169 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD7
, CmdArg
);
170 if (EFI_ERROR (Status
)) {
171 DEBUG((EFI_D_ERROR
, "InitializeSdMmcDevice(MMC_CMD7): Error and Status = %r\n", Status
));
181 MmcIdentificationMode (
182 IN MMC_HOST_INSTANCE
*MmcHostInstance
190 EFI_MMC_HOST_PROTOCOL
*MmcHost
;
191 OCR_RESPONSE OcrResponse
;
193 MmcHost
= MmcHostInstance
->MmcHost
;
197 if (MmcHost
== NULL
) {
198 return EFI_INVALID_PARAMETER
;
201 // We can get into this function if we restart the identification mode
202 if (MmcHostInstance
->State
== MmcHwInitializationState
) {
203 // Initialize the MMC Host HW
204 Status
= MmcNotifyState (MmcHostInstance
, MmcHwInitializationState
);
205 if (EFI_ERROR (Status
)) {
206 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode() : Error MmcHwInitializationState, Status=%r.\n", Status
));
211 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD0
, 0);
212 if (EFI_ERROR (Status
)) {
213 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode(MMC_CMD0): Error, Status=%r.\n", Status
));
216 Status
= MmcNotifyState (MmcHostInstance
, MmcIdleState
);
217 if (EFI_ERROR (Status
)) {
218 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode() : Error MmcIdleState, Status=%r.\n", Status
));
222 // Send CMD1 to get OCR (MMC)
223 // This command only valid for MMC and eMMC
224 Timeout
= MAX_RETRY_COUNT
;
226 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD1
, EMMC_CMD1_CAPACITY_GREATER_THAN_2GB
);
227 if (EFI_ERROR (Status
))
229 Status
= MmcHost
->ReceiveResponse (MmcHost
, MMC_RESPONSE_TYPE_OCR
, (UINT32
*)&OcrResponse
);
230 if (EFI_ERROR (Status
)) {
231 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status
));
235 } while (!OcrResponse
.Ocr
.PowerUp
&& (Timeout
> 0));
236 if (Status
== EFI_SUCCESS
) {
237 if (!OcrResponse
.Ocr
.PowerUp
) {
238 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode(MMC_CMD1): Card initialisation failure, Status=%r.\n", Status
));
239 return EFI_DEVICE_ERROR
;
241 OcrResponse
.Ocr
.PowerUp
= 0;
242 if (OcrResponse
.Raw
== EMMC_CMD1_CAPACITY_GREATER_THAN_2GB
) {
243 MmcHostInstance
->CardInfo
.OCRData
.AccessMode
= BIT1
;
246 MmcHostInstance
->CardInfo
.OCRData
.AccessMode
= 0x0;
248 // Check whether MMC or eMMC
249 if (OcrResponse
.Raw
== EMMC_CMD1_CAPACITY_GREATER_THAN_2GB
||
250 OcrResponse
.Raw
== EMMC_CMD1_CAPACITY_LESS_THAN_2GB
) {
251 return EmmcIdentificationMode (MmcHostInstance
, OcrResponse
);
255 // Are we using SDIO ?
256 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD5
, 0);
257 if (Status
== EFI_SUCCESS
) {
258 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode(MMC_CMD5): Error - SDIO not supported, Status=%r.\n", Status
));
259 return EFI_UNSUPPORTED
;
262 // Check which kind of card we are using. Ver2.00 or later SD Memory Card (PL180 is SD v1.1)
263 CmdArg
= (0x0UL
<< 12 | BIT8
| 0xCEUL
<< 0);
264 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD8
, CmdArg
);
265 if (Status
== EFI_SUCCESS
) {
266 DEBUG ((EFI_D_ERROR
, "Card is SD2.0 => Supports high capacity\n"));
268 Status
= MmcHost
->ReceiveResponse (MmcHost
, MMC_RESPONSE_TYPE_R7
, Response
);
269 if (EFI_ERROR (Status
)) {
270 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode() : Failed to receive response to CMD8, Status=%r.\n", Status
));
273 PrintResponseR1 (Response
[0]);
274 // Check if it is valid response
275 if (Response
[0] != CmdArg
) {
276 DEBUG ((EFI_D_ERROR
, "The Card is not usable\n"));
277 return EFI_UNSUPPORTED
;
280 DEBUG ((EFI_D_ERROR
, "Not a SD2.0 Card\n"));
283 // We need to wait for the MMC or SD card is ready => (gCardInfo.OCRData.PowerUp == 1)
284 Timeout
= MAX_RETRY_COUNT
;
285 while (Timeout
> 0) {
286 // SD Card or MMC Card ? CMD55 indicates to the card that the next command is an application specific command
287 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD55
, 0);
288 if (Status
== EFI_SUCCESS
) {
289 DEBUG ((EFI_D_INFO
, "Card should be SD\n"));
291 MmcHostInstance
->CardInfo
.CardType
= SD_CARD_2
;
293 MmcHostInstance
->CardInfo
.CardType
= SD_CARD
;
296 // Note: The first time CmdArg will be zero
297 CmdArg
= ((UINTN
*) &(MmcHostInstance
->CardInfo
.OCRData
))[0];
301 Status
= MmcHost
->SendCommand (MmcHost
, MMC_ACMD41
, CmdArg
);
302 if (!EFI_ERROR (Status
)) {
303 Status
= MmcHost
->ReceiveResponse (MmcHost
, MMC_RESPONSE_TYPE_OCR
, Response
);
304 if (EFI_ERROR (Status
)) {
305 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status
));
308 ((UINT32
*) &(MmcHostInstance
->CardInfo
.OCRData
))[0] = Response
[0];
311 DEBUG ((EFI_D_INFO
, "Card should be MMC\n"));
312 MmcHostInstance
->CardInfo
.CardType
= MMC_CARD
;
314 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD1
, 0x800000);
315 if (!EFI_ERROR (Status
)) {
316 Status
= MmcHost
->ReceiveResponse (MmcHost
, MMC_RESPONSE_TYPE_OCR
, Response
);
317 if (EFI_ERROR (Status
)) {
318 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode() : Failed to receive OCR, Status=%r.\n", Status
));
321 ((UINT32
*) &(MmcHostInstance
->CardInfo
.OCRData
))[0] = Response
[0];
325 if (!EFI_ERROR (Status
)) {
326 if (!MmcHostInstance
->CardInfo
.OCRData
.PowerUp
) {
330 if ((MmcHostInstance
->CardInfo
.CardType
== SD_CARD_2
) && (MmcHostInstance
->CardInfo
.OCRData
.AccessMode
& BIT1
)) {
331 MmcHostInstance
->CardInfo
.CardType
= SD_CARD_2_HIGH
;
332 DEBUG ((EFI_D_ERROR
, "High capacity card.\n"));
334 break; // The MMC/SD card is ready. Continue the Identification Mode
343 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode(): No Card\n"));
346 PrintOCR (Response
[0]);
349 Status
= MmcNotifyState (MmcHostInstance
, MmcReadyState
);
350 if (EFI_ERROR (Status
)) {
351 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode() : Error MmcReadyState\n"));
355 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD2
, 0);
356 if (EFI_ERROR (Status
)) {
357 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode(MMC_CMD2): Error\n"));
360 Status
= MmcHost
->ReceiveResponse (MmcHost
, MMC_RESPONSE_TYPE_CID
, Response
);
361 if (EFI_ERROR (Status
)) {
362 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode() : Failed to receive CID, Status=%r.\n", Status
));
368 Status
= MmcHost
->NotifyState (MmcHost
, MmcIdentificationState
);
369 if (EFI_ERROR (Status
)) {
370 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode() : Error MmcIdentificationState\n"));
375 // Note, SD specifications say that "if the command execution causes a state change, it
376 // will be visible to the host in the response to the next command"
377 // The status returned for this CMD3 will be 2 - identification
380 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD3
, CmdArg
);
381 if (EFI_ERROR (Status
)) {
382 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode(MMC_CMD3): Error\n"));
386 Status
= MmcHost
->ReceiveResponse (MmcHost
, MMC_RESPONSE_TYPE_RCA
, Response
);
387 if (EFI_ERROR (Status
)) {
388 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode() : Failed to receive RCA, Status=%r.\n", Status
));
391 PrintRCA (Response
[0]);
393 // For MMC card, RCA is assigned by CMD3 while CMD3 dumps the RCA for SD card
394 if (MmcHostInstance
->CardInfo
.CardType
!= MMC_CARD
) {
395 MmcHostInstance
->CardInfo
.RCA
= Response
[0] >> 16;
397 MmcHostInstance
->CardInfo
.RCA
= CmdArg
;
399 Status
= MmcNotifyState (MmcHostInstance
, MmcStandByState
);
400 if (EFI_ERROR (Status
)) {
401 DEBUG ((EFI_D_ERROR
, "MmcIdentificationMode() : Error MmcStandByState\n"));
409 InitializeMmcDevice (
410 IN MMC_HOST_INSTANCE
*MmcHostInstance
414 EFI_MMC_HOST_PROTOCOL
*MmcHost
;
418 MmcHost
= MmcHostInstance
->MmcHost
;
420 Status
= MmcIdentificationMode (MmcHostInstance
);
421 if (EFI_ERROR (Status
)) {
422 DEBUG((EFI_D_ERROR
, "InitializeMmcDevice(): Error in Identification Mode, Status=%r\n", Status
));
426 Status
= MmcNotifyState (MmcHostInstance
, MmcTransferState
);
427 if (EFI_ERROR (Status
)) {
428 DEBUG((EFI_D_ERROR
, "InitializeMmcDevice(): Error MmcTransferState, Status=%r\n", Status
));
432 if (MmcHostInstance
->CardInfo
.CardType
!= EMMC_CARD
) {
433 Status
= InitializeSdMmcDevice (MmcHostInstance
);
434 if (EFI_ERROR (Status
)) {
440 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD16
, MmcHostInstance
->BlockIo
.Media
->BlockSize
);
441 if (EFI_ERROR (Status
)) {
442 DEBUG((EFI_D_ERROR
, "InitializeMmcDevice(MMC_CMD16): Error MmcHostInstance->BlockIo.Media->BlockSize: %d and Error = %r\n",
443 MmcHostInstance
->BlockIo
.Media
->BlockSize
, Status
));
447 // Block Count (not used). Could return an error for SD card
448 if (MmcHostInstance
->CardInfo
.CardType
== MMC_CARD
) {
449 Status
= MmcHost
->SendCommand (MmcHost
, MMC_CMD23
, BlockCount
);
450 if (EFI_ERROR (Status
)) {
451 DEBUG((EFI_D_ERROR
, "InitializeMmcDevice(MMC_CMD23): Error, Status=%r\n", Status
));